Skip to content

Commit e223650

Browse files
committed
chore: add proper logging
1 parent 21d68f9 commit e223650

File tree

3 files changed

+73
-46
lines changed

3 files changed

+73
-46
lines changed

Cargo.lock

+27
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ serde_json = "1.0.107"
2121
serde = { version = "1.0", features = ["derive"] }
2222
dirs = "5.0.1"
2323
libz-sys = { version = "1.1.12", default-features = false, features = ["libc"] }
24+
log = "0.4"
25+
env_logger = "0.9"
2426

2527
[target.'cfg(all(target_os = "linux", target_env = "musl"))'.dependencies]
2628
openssl = { version = "0.10", features = ["vendored"] }

src/main.rs

+44-46
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ extern crate ssh2;
77

88
use bzip2::read::BzDecoder;
99
use clap::{Arg, Command as App};
10+
use env_logger::Env;
11+
use log::{error, warn, info, debug};
1012
use regex::Regex;
1113
use serde::{Deserialize, Serialize};
1214
use ssh2::Session;
1315
use std::collections::HashMap;
1416
use std::error::Error;
1517
use std::fs::{self, File};
16-
use std::io::{copy, BufReader, BufWriter, Read};
18+
use std::io::{copy, BufReader, BufWriter, Read, Write};
1719
use std::net::TcpStream;
1820
use std::path::Path;
1921
use std::process;
@@ -44,13 +46,12 @@ impl Config {
4446
let ssh_host = cap
4547
.get(2)
4648
.unwrap_or_else(|| {
47-
eprintln!("Failed to parse ssh host");
49+
error!("Failed to parse ssh host");
4850
process::exit(1);
4951
})
5052
.as_str();
5153

5254
let mut config: Config = match config_file.exists() {
53-
// let config_path = ;
5455
true => Config::parse(config_file.to_str().unwrap(), ssh_host),
5556
false => Config {
5657
ssh_host: ssh_host.to_string(),
@@ -62,7 +63,7 @@ impl Config {
6263
match cap.get(1) {
6364
Some(val) => config.ssh_user = val.as_str().to_string(),
6465
None => {
65-
eprintln!("SSH username cannot be empty");
66+
error!("SSH username cannot be empty");
6667
process::exit(1);
6768
}
6869
}
@@ -78,7 +79,7 @@ impl Config {
7879
match Config::parse_config_file(path, host) {
7980
Ok(config) => config,
8081
Err(err) => {
81-
eprintln!("Failed to parse config file - {}", err);
82+
error!("Failed to parse config file - {}", err);
8283
Config {
8384
ssh_host: host.to_string(),
8485
..Default::default()
@@ -100,6 +101,13 @@ impl Config {
100101
}
101102

102103
fn main() -> Result<(), Box<dyn Error>> {
104+
// Initialize the logger with the default environment variable "RUST_LOG"
105+
env_logger::Builder::from_env(Env::default().default_filter_or("info"))
106+
.format(|buf, record| {
107+
writeln!(buf, "[{}] {}", record.level(), record.args())
108+
})
109+
.init();
110+
103111
let matches = App::new("Database Importer")
104112
.about("Import database from remote server")
105113
.arg(
@@ -156,7 +164,7 @@ fn main() -> Result<(), Box<dyn Error>> {
156164
let host = match matches.value_of("host") {
157165
Some(n) => n,
158166
None => {
159-
eprintln!("Target host cannot be empty");
167+
error!("Target host cannot be empty");
160168
process::exit(1);
161169
}
162170
};
@@ -166,7 +174,7 @@ fn main() -> Result<(), Box<dyn Error>> {
166174
let tables = match matches.values_of("table") {
167175
Some(n) => n,
168176
None => {
169-
eprintln!("Target tables cannot be empty");
177+
error!("Target tables cannot be empty");
170178
process::exit(1);
171179
}
172180
};
@@ -182,7 +190,7 @@ fn main() -> Result<(), Box<dyn Error>> {
182190
None => {
183191
// User option was not specified.
184192
// Use ssh username, if available
185-
eprintln!("Using SSH username as database username");
193+
info!("Using SSH username as database username");
186194
config.ssh_user.to_owned()
187195
}
188196
},
@@ -195,18 +203,18 @@ fn main() -> Result<(), Box<dyn Error>> {
195203
None => {
196204
// User option was not specified.
197205
// Use ssh username, if available
198-
eprintln!("Inferring database name as {}_db", db_user);
206+
info!("Inferring database name as {}_db", db_user);
199207
format!("{}_db", db_user)
200208
}
201209
},
202210
};
203211

204-
let db_pass = match matches.value_of("db_pass") {
212+
let db_pass = match matches.value_of("dbpass") {
205213
Some(val) => val.to_owned(),
206214
None => match config.db_pass {
207215
Some(val) => val,
208216
None => {
209-
eprintln!("Database password cannot be empty");
217+
error!("Database password cannot be empty");
210218
process::exit(2);
211219
}
212220
},
@@ -217,7 +225,7 @@ fn main() -> Result<(), Box<dyn Error>> {
217225
// Connect to the remote server
218226
let ssh_host_port = format!("{}:{}", config.ssh_host, config.ssh_port);
219227
let tcp = TcpStream::connect(&ssh_host_port).unwrap_or_else(|err| {
220-
eprintln!("{}", err);
228+
error!("{}", err);
221229
process::exit(1);
222230
});
223231

@@ -226,24 +234,21 @@ fn main() -> Result<(), Box<dyn Error>> {
226234
sess.handshake().expect("SSH handshake failed");
227235

228236
// Try to authenticate with the first identity in the agent.
229-
eprint!("Attept to authenticate with ssh-agent...");
237+
info!("Attempt to authenticate with ssh-agent...");
230238
let _ = sess.userauth_agent(&config.ssh_user);
231239

232240
// Make sure we succeeded
233241
if !sess.authenticated() {
234-
eprintln!("FAILED");
235-
236-
eprintln!("Falling back to password login");
237-
eprint!("Enter password: ");
238-
242+
warn!("SSH-agent authentication failed. Falling back to password login.");
243+
info!("Enter password: ");
239244
let ssh_pass = rpassword::read_password().unwrap();
240245
sess.userauth_password(&config.ssh_user, &ssh_pass)
241246
.unwrap_or_else(|_| {
242-
eprintln!("Failed to authenticate to remote server");
247+
error!("Failed to authenticate to remote server");
243248
process::exit(1);
244249
});
245250
} else {
246-
eprintln!("OK");
251+
info!("SSH-agent authentication succeeded.");
247252
}
248253

249254
let mut remote_temp_file = String::new();
@@ -254,13 +259,6 @@ fn main() -> Result<(), Box<dyn Error>> {
254259
channel.read_to_string(&mut remote_temp_file).unwrap();
255260
let remote_temp_file = remote_temp_file.trim();
256261

257-
// ctrlc::set_handler(move || {
258-
// // Handle early termination
259-
// let status = sess.sftp().and_then(|sftp| {
260-
// sftp.unlink(Path::new(remote_temp_file))
261-
// });
262-
// }).expect("Error setting Ctrl-C handler");
263-
264262
let pass_arg = format!("-p{}", &db_pass);
265263
let mut v = vec!["mysqldump", "-u", &db_user, &pass_arg, &db_name];
266264

@@ -279,33 +277,29 @@ fn main() -> Result<(), Box<dyn Error>> {
279277
remote_temp_file
280278
);
281279

282-
eprint!("Exporting database on target server...");
280+
info!("Exporting database on target server...");
283281
let mut channel = sess.channel_session().ok().unwrap();
284282
let exit_status = channel
285283
.exec(&arg)
286284
.and_then(|_| channel.close())
287-
// .and_then(|_| channel.wait_close())
288285
.and_then(|_| channel.exit_status());
289286

290287
match exit_status {
291-
Ok(0) => (),
288+
Ok(0) => info!("Database export succeeded."),
292289
_ => {
293-
eprintln!("ERR");
294-
eprintln!("Failed to export database");
290+
error!("Failed to export database");
295291
process::exit(4);
296292
}
297293
}
298294

299-
eprintln!("OK");
300-
301295
let (remote_file, stat) = sess
302296
.scp_recv(Path::new(&remote_temp_file))
303297
.unwrap_or_else(|err| {
304-
eprintln!("Failed to download file - {}", err);
298+
error!("Failed to download file - {}", err);
305299
process::exit(2);
306300
});
307301

308-
eprintln!("Exported file size: {}", stat.size());
302+
info!("Exported file size: {}", stat.size());
309303

310304
let temp_file = Builder::new()
311305
.suffix(".sql.bz2")
@@ -325,13 +319,13 @@ fn main() -> Result<(), Box<dyn Error>> {
325319
match copy(&mut remote_file, &mut target) {
326320
Ok(_) => (),
327321
Err(err) => {
328-
eprintln!("Failed to download exported database dump - {}", err);
322+
error!("Failed to download exported database dump - {}", err);
329323
process::exit(3);
330324
}
331325
}
326+
debug!("Database dump downloaded to {:?}", path);
332327

333328
progressbar.finish_and_clear();
334-
println!("Downloading database dump...OK");
335329

336330
let mut channel = sess.channel_session().ok().unwrap();
337331
let arg = format!("rm -f {}", remote_temp_file);
@@ -341,8 +335,8 @@ fn main() -> Result<(), Box<dyn Error>> {
341335
.and_then(|_| channel.exit_status());
342336

343337
match exit_status {
344-
Ok(0) => eprintln!("Removed temporary file from remote filesystem...OK"),
345-
_ => eprintln!("Failed to delete temporary file from remote filesystem"),
338+
Ok(0) => info!("Removed temporary file from remote filesystem."),
339+
_ => warn!("Failed to delete temporary file from remote filesystem."),
346340
}
347341

348342
// TODO: Delete temporary file from remote filesystem
@@ -356,36 +350,40 @@ fn main() -> Result<(), Box<dyn Error>> {
356350
.spawn()
357351
.expect("Failed to spawn mysql client");
358352

353+
debug!("Spawning mysql client");
359354
if let Some(stdin) = &mut cmd.stdin {
360355
let mut writer = BufWriter::new(stdin);
361356

357+
debug!("Copying uncompressed dump to mysql client stdin");
362358
// Decompress and import to local mysql database
363359
match copy(&mut Box::new(BzDecoder::new(f)), &mut writer) {
364-
Ok(_) => {
365-
eprintln!("Import completed successfully")
366-
}
360+
Ok(_) => info!("Database import completed successfully."),
367361
Err(err) => {
368-
eprintln!("Failed to import database dump - {}", err);
362+
error!("Failed to import database dump - {}", err);
369363
process::exit(5);
370364
}
371365
};
372366
}
373367

368+
debug!("Waiting for import to complete");
369+
374370
let result = match cmd.try_wait() {
375371
Ok(Some(status)) => status.code(),
376372
Ok(None) => cmd.wait().unwrap().code(),
377373
Err(e) => {
378-
eprintln!("error attempting to wait: {}", e);
374+
error!("Error attempting to wait: {}", e);
379375
process::exit(5);
380376
}
381377
};
382378

379+
debug!("Removing temporary file {:?}", path);
383380
fs::remove_file(path)?;
384381

385382
match result {
386383
Some(0) => (),
387-
n => eprintln!("Import failed with exit code {:?}", n),
384+
n => error!("Import failed with exit code {:?}", n),
388385
};
389386

390387
Ok(())
391388
}
389+

0 commit comments

Comments
 (0)