diff --git a/.gitignore b/.gitignore index cc18941..59e3ab0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ /target/ **/*.rs.bk + +*.log diff --git a/Cargo.lock b/Cargo.lock index bfb8cae..f4c6cb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,6 +77,16 @@ name = "cfg-if" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chrono" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "core-foundation" version = "0.2.3" @@ -115,6 +125,14 @@ dependencies = [ "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fern" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "flate2" version = "1.0.1" @@ -292,8 +310,11 @@ dependencies = [ name = "liftinstall" version = "0.1.0" dependencies = [ + "chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "fern 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.11.27 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess 1.8.6 (registry+https://github.com/rust-lang/crates.io-index)", "nfd 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "number_prefix 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -470,11 +491,24 @@ dependencies = [ "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "num-integer" +version = "0.1.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-traits" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "num_cpus" version = "1.8.0" @@ -1072,11 +1106,13 @@ dependencies = [ "checksum bzip2-sys 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2c5162604199bbb17690ede847eaa6120a3f33d5ab4dcc8e7c25b16d849ae79b" "checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" "checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e48d85528df61dc964aa43c5f6ca681a19cfa74939b2348d204bd08a981f2fb0" "checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" "checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" "checksum crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5d02c0aac6bd68393ed69e00bbc2457f3e89075c6349db7189618dc4ddc1d7" "checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" "checksum encoding_rs 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98fd0f24d1fb71a4a6b9330c8ca04cbd4e7cc5d846b54ca74ff376bc7c9f798d" +"checksum fern 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "57915fe00a83af935983eb2d00b0ecc62419c4741b28c207ecbf98fd4a1b94c8" "checksum flate2 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9fac2277e84e5e858483756647a9d0aa8d9a2b7cba517fd84325a0aaa69a0909" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" @@ -1115,7 +1151,9 @@ dependencies = [ "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" "checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" "checksum nfd 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e752e3c216bc8a491c5b59fa46da10f1379ae450b19ac688e07f4bb55042e98" +"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9936036cc70fe4a8b2d338ab665900323290efb03983c86cbe235ae800ad8017" +"checksum num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" "checksum number_prefix 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "59a14be9c211cb9c602bad35ac99f41e9a84b44d71b8cbd3040e3bd02a214902" "checksum openssl 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)" = "169a4b9160baf9b9b1ab975418c673686638995ba921683a7f1e01470dcb8854" diff --git a/Cargo.toml b/Cargo.toml index 7a1af9b..549c662 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,6 +33,10 @@ regex = "0.2" zip = "0.2.8" +log = "0.4" +fern = "0.5" +chrono = "0.4.5" + [target.'cfg(windows)'.dependencies] # NFD is needed on Windows, as web-view doesn't work correctly here nfd = "0.0.4" diff --git a/src/installer.rs b/src/installer.rs index 24e2060..56c5d6d 100644 --- a/src/installer.rs +++ b/src/installer.rs @@ -86,7 +86,7 @@ impl InstallerFramework { fresh_install: bool, ) -> Result<(), String> { // TODO: Uninstall packages that aren't selected - println!( + info!( "Framework: Installing {:?} to {:?}", items, self.install_path @@ -103,7 +103,7 @@ impl InstallerFramework { } } - println!( + info!( "Framework: Uninstalling {:?} additionally.", uninstall_items ); @@ -117,12 +117,12 @@ impl InstallerFramework { let mut tree = DependencyTree::build(task); - println!("Dependency tree:\n{}", tree); + info!("Dependency tree:\n{}", tree); tree.execute(self, &|msg: &str, progress: f32| match messages .send(InstallMessage::Status(msg.to_string(), progress as _)) { - Err(v) => eprintln!("Failed to submit queue message: {:?}", v), + Err(v) => error!("Failed to submit queue message: {:?}", v), _ => {} }).map(|_x| ()) } @@ -137,12 +137,12 @@ impl InstallerFramework { let mut tree = DependencyTree::build(task); - println!("Dependency tree:\n{}", tree); + info!("Dependency tree:\n{}", tree); tree.execute(self, &|msg: &str, progress: f32| match messages .send(InstallMessage::Status(msg.to_string(), progress as _)) { - Err(v) => eprintln!("Failed to submit queue message: {:?}", v), + Err(v) => error!("Failed to submit queue message: {:?}", v), _ => {} }).map(|_x| ()) } diff --git a/src/logging.rs b/src/logging.rs new file mode 100644 index 0000000..3f6fc89 --- /dev/null +++ b/src/logging.rs @@ -0,0 +1,25 @@ +//! Contains functions to help with logging. + +use fern; +use chrono; +use log; + +use std::io; + +pub fn setup_logger() -> Result<(), fern::InitError> { + fern::Dispatch::new() + .format(|out, message, record| { + out.finish(format_args!( + "{}[{}][{}] {}", + chrono::Local::now().format("[%H:%M:%S]"), + record.target(), + record.level(), + message + )) + }) + .level(log::LevelFilter::Info) + .chain(io::stdout()) + .chain(fern::log_file("installer.log")?) + .apply()?; + Ok(()) +} diff --git a/src/main.rs b/src/main.rs index d6f0fc7..f5798d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -28,6 +28,12 @@ extern crate semver; extern crate zip; +extern crate fern; +#[macro_use] +extern crate log; + +extern crate chrono; + mod assets; mod config; mod http; @@ -35,6 +41,7 @@ mod installer; mod rest; mod sources; mod tasks; +mod logging; use web_view::*; @@ -62,20 +69,22 @@ enum CallbackType { } fn main() { + logging::setup_logger().expect("Unable to setup logging!"); + let config = Config::from_toml_str(RAW_CONFIG).unwrap(); let app_name = config.general.name.clone(); - println!("{} installer", app_name); + info!("{} installer", app_name); let current_exe = std::env::current_exe().unwrap(); let current_path = current_exe.parent().unwrap(); let metadata_file = current_path.join("metadata.json"); let framework = if metadata_file.exists() { - println!("Using pre-existing metadata file: {:?}", metadata_file); + info!("Using pre-existing metadata file: {:?}", metadata_file); InstallerFramework::new_with_db(config, current_path).unwrap() } else { - println!("Starting fresh install"); + info!("Starting fresh install"); InstallerFramework::new(config) }; @@ -106,7 +115,7 @@ fn main() { let server = WebServer::with_addr(framework.clone(), address).unwrap(); let addr = server.get_addr(); - println!("Server: {:?}", addr); + debug!("Server: {:?}", addr); http_address = Some(addr); @@ -136,7 +145,7 @@ fn main() { let command: CallbackType = serde_json::from_str(msg).expect(&format!("Unable to parse string: {:?}", msg)); - println!("Incoming payload: {:?}", command); + debug!("Incoming payload: {:?}", command); match command { CallbackType::SelectInstallDir { callback_name } => { @@ -155,7 +164,7 @@ fn main() { let result = serde_json::to_string(&result).expect("Unable to serialize response"); let command = format!("{}({});", callback_name, result); - println!("Injecting response: {}", command); + debug!("Injecting response: {}", command); wv.eval(&command); } } diff --git a/src/rest.rs b/src/rest.rs index 13a4b03..1ffadec 100644 --- a/src/rest.rs +++ b/src/rest.rs @@ -165,7 +165,7 @@ impl Service for WebService { match framework.uninstall(&sender) { Err(v) => { - eprintln!("Uninstall error occurred: {:?}", v); + error!("Uninstall error occurred: {:?}", v); sender.send(InstallMessage::Error(v)).unwrap(); }, _ => {} @@ -238,7 +238,7 @@ impl Service for WebService { match framework.install(to_install, &sender, new_install) { Err(v) => { - eprintln!("Install error occurred: {:?}", v); + error!("Install error occurred: {:?}", v); sender.send(InstallMessage::Error(v)).unwrap(); }, _ => {} diff --git a/src/tasks/download_pkg.rs b/src/tasks/download_pkg.rs index 5c4f740..247ef25 100644 --- a/src/tasks/download_pkg.rs +++ b/src/tasks/download_pkg.rs @@ -34,7 +34,7 @@ impl Task for DownloadPackageTask { for element in &context.database { if element.name == self.name { if element.version == version { - println!("{:?} is already up to date.", self.name); + info!("{:?} is already up to date.", self.name); return Ok(TaskParamType::Break); } break; diff --git a/src/tasks/install_pkg.rs b/src/tasks/install_pkg.rs index 16aa987..f552302 100644 --- a/src/tasks/install_pkg.rs +++ b/src/tasks/install_pkg.rs @@ -109,7 +109,7 @@ impl Task for InstallPackageTask { continue; } - println!("Creating file: {:?}", target_path); + info!("Creating file: {:?}", target_path); installed_files.push(filename.to_string()); diff --git a/src/tasks/resolver.rs b/src/tasks/resolver.rs index e22087f..9d3e865 100644 --- a/src/tasks/resolver.rs +++ b/src/tasks/resolver.rs @@ -78,7 +78,7 @@ impl Task for ResolvePackageTask { .next() .unwrap(); - println!("Selected file: {:?}", latest_file); + info!("Selected file: {:?}", latest_file); Ok(TaskParamType::File(latest_version, latest_file)) } diff --git a/src/tasks/uninstall_pkg.rs b/src/tasks/uninstall_pkg.rs index 98b57cd..20b2882 100644 --- a/src/tasks/uninstall_pkg.rs +++ b/src/tasks/uninstall_pkg.rs @@ -61,7 +61,7 @@ impl Task for UninstallPackageTask { for file in package.files { let name = file.clone(); let file = path.join(file); - println!("Deleting {:?}", file); + info!("Deleting {:?}", file); messenger( &format!("Deleting {} ({} of {})", name, i + 1, max), @@ -75,7 +75,7 @@ impl Task for UninstallPackageTask { }; match result { - Err(v) => eprintln!("Failed to delete file: {:?}", v), + Err(v) => error!("Failed to delete file: {:?}", v), _ => {} }