diff options
Diffstat (limited to 'src/bin/main.rs')
-rw-r--r-- | src/bin/main.rs | 68 |
1 files changed, 56 insertions, 12 deletions
diff --git a/src/bin/main.rs b/src/bin/main.rs index 36d6c00..a4d489d 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -7,28 +7,72 @@ extern crate env_logger; #[macro_use] extern crate clap; extern crate sqlite; +extern crate rpassword; + +use rpassword::read_password; +use std::io::{self, Write}; +use systemhttp::auth; + +use clap::{App, AppSettings, Arg, SubCommand}; fn main() { - let matches = clap_app!( - systemhttpd => - (version: "0.1") - (author: "Kjetil Ørbekk") - (about: "A systemd web frontend") - (@arg PORT: -p --port +takes_value "Port to serve on") - (@arg DB_FILE: --db_file +required +takes_value - "Path to sqlite database")) + let matches = App::new("systemhttpd") + .version("0.1") + .author("Kjetil Ørbekk") + .about("Systemd web frontend") + .setting(AppSettings::SubcommandRequired) + .arg(Arg::with_name("port") + .short("p") + .long("port") + .takes_value(true) + .help("Port to serve on")) + .arg(Arg::with_name("db_file") + .long("db_file") + .takes_value(true) + .help("Path to sqlite database")) + .subcommand(SubCommand::with_name("serve") + .about("Start the systemhttpd server")) + .subcommand(SubCommand::with_name("create_admin_user") + .about("Add an admin user to the db")) .get_matches(); - let port = matches.value_of("PORT").unwrap_or("8080") + let port = matches.value_of("port").unwrap_or("8080") .parse::<u16>().expect("port number"); - let db_file = matches.value_of("DB_FILE").unwrap(); + let db_file = matches.value_of("db_file").unwrap(); env_logger::init().unwrap(); let mut conn = sqlite::Connection::open(db_file) .expect(format!("opening sqlite database at {}", db_file).as_str()); systemhttp::db::init(&mut conn); - let _server = systemhttp::server::serve(port).unwrap(); - println!("Serving on {}", port); + let mut serve = || { + let _server = systemhttp::server::serve(port).unwrap(); + println!("Serving on {}", port); + }; + + let create_admin_user = || { + println!("Create admin user"); + print!("Username: "); + io::stdout().flush(); + let mut user = String::new(); + io::stdin().read_line(&mut user).unwrap(); + let password = rpassword::prompt_password_stdout("Password: ").unwrap(); + let confirmation = + rpassword::prompt_password_stdout("Repeat password: ").unwrap(); + + if password != confirmation { + println!("\nPasswords don't match"); + return + } + println!("\nCreating user {} with password (hashed) {:?}", + user, auth::encode("test_salt", password.as_str())); + }; + + match matches.subcommand_name() { + Some("serve") => serve(), + Some("create_admin_user") => create_admin_user(), + x => panic!("Don't know about subcommand: {:?}", x) + } + } |