5 files changed
+257
-2
.gitignore
+1
@@ -1 +1,2 @@
1
/target
2
+*.log
\ No newline at end of file
Cargo.lock
+198
@@ -2,6 +2,18 @@
2
# It is not intended for manual editing.
3
version = 3
4
5
+[[package]]
6
+name = "ahash"
7
+version = "0.8.3"
8
+source = "registry+https://github.com/rust-lang/crates.io-index"
9
+checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f"
10
+dependencies = [
11
+ "cfg-if",
12
+ "getrandom",
13
+ "once_cell",
14
+ "version_check",
15
+]
16
+
17
[[package]]
18
name = "anyhow"
19
version = "1.0.69"
@@ -230,6 +242,27 @@ dependencies = [
242
"pin-utils",
243
]
244
245
+[[package]]
246
+name = "gethostname"
247
+version = "0.2.3"
248
+source = "registry+https://github.com/rust-lang/crates.io-index"
249
+checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e"
250
+dependencies = [
251
+ "libc",
252
+ "winapi",
253
+]
254
+
255
+[[package]]
256
+name = "getrandom"
257
+version = "0.2.8"
258
+source = "registry+https://github.com/rust-lang/crates.io-index"
259
+checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
260
+dependencies = [
261
+ "cfg-if",
262
+ "libc",
263
+ "wasi",
264
+]
265
+
266
[[package]]
267
name = "h2"
268
version = "0.3.15"
@@ -456,6 +489,15 @@ dependencies = [
489
"cfg-if",
490
]
491
492
+[[package]]
493
+name = "matchers"
494
+version = "0.1.0"
495
+source = "registry+https://github.com/rust-lang/crates.io-index"
496
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
497
+dependencies = [
498
+ "regex-automata",
499
+]
500
+
501
[[package]]
502
name = "memchr"
503
version = "2.5.0"
@@ -498,6 +540,16 @@ dependencies = [
540
"tempfile",
541
]
542
543
+[[package]]
544
+name = "nu-ansi-term"
545
+version = "0.46.0"
546
+source = "registry+https://github.com/rust-lang/crates.io-index"
547
+checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
548
+dependencies = [
549
+ "overload",
550
+ "winapi",
551
+]
552
+
553
[[package]]
554
name = "num_cpus"
555
version = "1.15.0"
@@ -565,6 +617,12 @@ version = "6.4.1"
617
source = "registry+https://github.com/rust-lang/crates.io-index"
618
checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
619
620
+[[package]]
621
+name = "overload"
622
+version = "0.1.1"
623
+source = "registry+https://github.com/rust-lang/crates.io-index"
624
+checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
625
+
626
[[package]]
627
name = "parking_lot"
628
version = "0.12.1"
@@ -663,6 +721,30 @@ dependencies = [
721
"bitflags",
722
]
723
724
+[[package]]
725
+name = "regex"
726
+version = "1.7.1"
727
+source = "registry+https://github.com/rust-lang/crates.io-index"
728
+checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
729
+dependencies = [
730
+ "regex-syntax",
731
+]
732
+
733
+[[package]]
734
+name = "regex-automata"
735
+version = "0.1.10"
736
+source = "registry+https://github.com/rust-lang/crates.io-index"
737
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
738
+dependencies = [
739
+ "regex-syntax",
740
+]
741
+
742
+[[package]]
743
+name = "regex-syntax"
744
+version = "0.6.28"
745
+source = "registry+https://github.com/rust-lang/crates.io-index"
746
+checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
747
+
748
[[package]]
749
name = "remove_dir_all"
750
version = "0.5.3"
@@ -810,6 +892,15 @@ dependencies = [
892
"serde",
893
]
894
895
+[[package]]
896
+name = "sharded-slab"
897
+version = "0.1.4"
898
+source = "registry+https://github.com/rust-lang/crates.io-index"
899
+checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31"
900
+dependencies = [
901
+ "lazy_static",
902
+]
903
+
904
[[package]]
905
name = "signal-hook-registry"
906
version = "1.4.1"
@@ -844,6 +935,9 @@ dependencies = [
935
"reqwest",
936
"serde",
937
"tokio",
938
+ "tracing",
939
+ "tracing-bunyan-formatter",
940
+ "tracing-subscriber",
941
]
942
943
[[package]]
@@ -896,6 +990,43 @@ dependencies = [
990
"winapi-util",
991
]
992
993
+[[package]]
994
+name = "thread_local"
995
+version = "1.1.7"
996
+source = "registry+https://github.com/rust-lang/crates.io-index"
997
+checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
998
+dependencies = [
999
+ "cfg-if",
1000
+ "once_cell",
1001
+]
1002
+
1003
+[[package]]
1004
+name = "time"
1005
+version = "0.3.19"
1006
+source = "registry+https://github.com/rust-lang/crates.io-index"
1007
+checksum = "53250a3b3fed8ff8fd988587d8925d26a83ac3845d9e03b220b37f34c2b8d6c2"
1008
+dependencies = [
1009
+ "itoa",
1010
+ "serde",
1011
+ "time-core",
1012
+ "time-macros",
1013
+]
1014
+
1015
+[[package]]
1016
+name = "time-core"
1017
+version = "0.1.0"
1018
+source = "registry+https://github.com/rust-lang/crates.io-index"
1019
+checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd"
1020
+
1021
+[[package]]
1022
+name = "time-macros"
1023
+version = "0.2.7"
1024
+source = "registry+https://github.com/rust-lang/crates.io-index"
1025
+checksum = "a460aeb8de6dcb0f381e1ee05f1cd56fcf5a5f6eb8187ff3d8f0b11078d38b7c"
1026
+dependencies = [
1027
+ "time-core",
1028
+]
1029
+
1030
[[package]]
1031
name = "tinyvec"
1032
version = "1.6.0"
@@ -979,8 +1110,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1110
checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
1111
dependencies = [
1112
"cfg-if",
1113
+ "log",
1114
"pin-project-lite",
1115
+ "tracing-attributes",
1116
+ "tracing-core",
1117
+]
1118
+
1119
+[[package]]
1120
+name = "tracing-attributes"
1121
+version = "0.1.23"
1122
+source = "registry+https://github.com/rust-lang/crates.io-index"
1123
+checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
1124
+dependencies = [
1125
+ "proc-macro2",
1126
+ "quote",
1127
+ "syn",
1128
+]
1129
+
1130
+[[package]]
1131
+name = "tracing-bunyan-formatter"
1132
+version = "0.3.6"
1133
+source = "registry+https://github.com/rust-lang/crates.io-index"
1134
+checksum = "78fa7c4b548e5c79a0300396f36f175da001e9933dfb5960b326db25fddbaee7"
1135
+dependencies = [
1136
+ "ahash",
1137
+ "gethostname",
1138
+ "log",
1139
+ "serde",
1140
+ "serde_json",
1141
+ "time",
1142
+ "tracing",
1143
"tracing-core",
1144
+ "tracing-log",
1145
+ "tracing-subscriber",
1146
]
1147
1148
[[package]]
@@ -990,6 +1152,36 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
1152
checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
1153
dependencies = [
1154
"once_cell",
1155
+ "valuable",
1156
+]
1157
+
1158
+[[package]]
1159
+name = "tracing-log"
1160
+version = "0.1.3"
1161
+source = "registry+https://github.com/rust-lang/crates.io-index"
1162
+checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
1163
+dependencies = [
1164
+ "lazy_static",
1165
+ "log",
1166
+ "tracing-core",
1167
+]
1168
+
1169
+[[package]]
1170
+name = "tracing-subscriber"
1171
+version = "0.3.16"
1172
+source = "registry+https://github.com/rust-lang/crates.io-index"
1173
+checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
1174
+dependencies = [
1175
+ "matchers",
1176
+ "nu-ansi-term",
1177
+ "once_cell",
1178
+ "regex",
1179
+ "sharded-slab",
1180
+ "smallvec",
1181
+ "thread_local",
1182
+ "tracing",
1183
+ "tracing-core",
1184
+ "tracing-log",
1185
]
1186
1187
[[package]]
@@ -1036,6 +1228,12 @@ dependencies = [
1228
"percent-encoding",
1229
]
1230
1231
+[[package]]
1232
+name = "valuable"
1233
+version = "0.1.0"
1234
+source = "registry+https://github.com/rust-lang/crates.io-index"
1235
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
1236
+
1237
[[package]]
1238
name = "vcpkg"
1239
version = "0.2.15"
Cargo.toml
+4
-1
@@ -19,4 +19,7 @@ clap = { version = "4.1.6", features = ["derive"] }
19
console = "0.15.0"
20
reqwest = { version = "0.11", features = ["json"] }
21
serde = { version = "1", features = ["derive"] }
22
-tokio = { version = "1.14.1", features = ["full"] }
\ No newline at end of file
22
+tokio = { version = "1.14.1", features = ["full"] }
23
+tracing = { version = "0.1.35", features = ["log"] }
24
+tracing-bunyan-formatter = "0.3.3"
25
+tracing-subscriber = { version = "0.3.14", features = ["registry", "env-filter"] }
\ No newline at end of file
src/cli/mod.rs
+4
@@ -3,6 +3,10 @@ use clap::{Parser, Subcommand};
3
#[derive(Parser)]
4
#[clap(author, version, about)]
5
pub struct Cli {
6
+ /// Log level: trace, debug, info, warn, error, off
7
+ #[clap(short, long, global = true)]
8
+ pub log_level: Option<String>,
9
+
10
#[clap(subcommand)]
11
pub command: Commands,
12
}
src/main.rs
+50
-1
@@ -1,9 +1,42 @@
1
-use anyhow::Result;
1
+use std::{fs::OpenOptions, path::PathBuf, str::FromStr};
2
+
3
+use anyhow::{anyhow, Result};
4
use clap::Parser;
5
use smbpndk_cli::{
6
cli::{Cli, Commands},
7
login::{process_login, LoginArgs},
8
};
9
+use tracing::subscriber::set_global_default;
10
+use tracing_bunyan_formatter::{BunyanFormattingLayer, JsonStorageLayer};
11
+use tracing_subscriber::{filter::LevelFilter, prelude::*, EnvFilter};
12
+
13
+fn setup_logging(level: Option<EnvFilter>) -> Result<()> {
14
+ // Log in the current directory
15
+ let log_path = PathBuf::from("smbpndk-cli.log");
16
+
17
+ let file = OpenOptions::new()
18
+ .create(true)
19
+ .write(true)
20
+ .open(log_path)
21
+ .unwrap();
22
+
23
+ let env_filter = if let Some(filter) = level {
24
+ filter
25
+ } else {
26
+ EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("trace"))
27
+ };
28
+
29
+ let formatting_layer = BunyanFormattingLayer::new("smb".into(), file);
30
+ let level_filter = LevelFilter::from_str(&env_filter.to_string())?;
31
+
32
+ let subscriber = tracing_subscriber::registry()
33
+ .with(formatting_layer.with_filter(level_filter))
34
+ .with(JsonStorageLayer);
35
+
36
+ set_global_default(subscriber).expect("Failed to set global default subscriber");
37
+
38
+ Ok(())
39
+}
40
41
#[tokio::main]
42
async fn main() {
@@ -20,6 +53,22 @@ async fn main() {
53
54
async fn run() -> Result<()> {
55
let cli = Cli::parse();
56
+
57
+ let log_level_error: Result<()> = Err(anyhow!(
58
+ "Invalid log level: {:?}.\n Valid levels are: trace, debug, info, warn, and error.",
59
+ cli.log_level
60
+ ));
61
+
62
+ if let Some(user_filter) = cli.log_level {
63
+ let filter = match EnvFilter::from_str(&user_filter) {
64
+ Ok(filter) => filter,
65
+ Err(_) => return log_level_error,
66
+ };
67
+ setup_logging(Some(filter))?;
68
+ } else {
69
+ setup_logging(None)?;
70
+ }
71
+
72
match cli.command {
73
Commands::Login { username, password } => {
74
println!("Login: {}, {}", username, password);