summaryrefslogtreecommitdiff
path: root/src/bin/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/main.rs')
-rw-r--r--src/bin/main.rs68
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)
+ }
+
}