From 72c1e3c8132a8269833396ab955586185e7b0e58 Mon Sep 17 00:00:00 2001 From: Jan Wolff Date: Sun, 17 May 2020 15:18:50 +0000 Subject: config file support --- src/main.rs | 97 +++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 52 insertions(+), 45 deletions(-) (limited to 'src/main.rs') diff --git a/src/main.rs b/src/main.rs index 7f64e33..5639158 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,9 @@ mod mime; mod server; use std::env; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::path::Path; fn help() { let version = match option_env!("CARGO_PKG_VERSION") { @@ -9,69 +12,73 @@ fn help() { }; println!("usage: sheldond {}", version); - println!(" -h, --help\t\tdisplay this message"); - println!(" -l, --listen\t\tadd a listening address (you can define multiple)"); - println!(" -d, --default-host\tdefault hostname to listen for"); - println!(" -g, --gem-root\tpath to the gemini root, aka the folder to serve files from"); - println!(" --user\tuser to drop to after opening TLS socket"); - println!(" --group\tgroup to drop to after opening TLS socket"); + println!(" -c, --config\t\tpath to the configuration file"); } -fn parse_args() -> Option { - let mut has_addr = false; - let mut has_host = false; - let mut has_root = false; - let mut has_user = false; - let mut has_group = false; - - let mut config = server::ServerConfig::new(); +fn parse_args() -> Option { let mut args = env::args(); loop { match args.next() { Some(arg) => { - if arg == "-h" || arg == "--help" { - return None; - } - if arg == "-l" || arg == "--listen" { - let addr = args.next().unwrap(); - config.add_addr(addr); - has_addr = true; - } - if arg == "-d" || arg == "--default-host" { - let host = args.next().unwrap(); - config.set_default_host(host); - has_host = true; - } - if arg == "-g" || arg == "--gem-root" { - let gem_root = args.next().unwrap(); - config.set_gem_root(gem_root); - has_root = true; - } - if arg == "--user" { - let user = args.next().unwrap(); - config.set_user(user); - has_user = true; - } - if arg == "--group" { - let group = args.next().unwrap(); - config.set_group(group); - has_group = true; + if arg == "-c" || arg == "--config" { + let config_fname = args.next().unwrap(); + return Some(config_fname); } } None => break, } } - if !has_addr || !has_host || !has_root || !has_user || !has_group { - return None; + None +} + +fn parse_config(fname: String) -> server::ServerConfig { + let path = Path::new(&fname); + let mut config = server::ServerConfig::new(); + + let file = match File::open(path) { + Ok(file) => BufReader::new(file), + Err(e) => { + panic!(e); + } + }; + + for rline in file.lines() { + let line = rline.unwrap(); + if line == "" || line.starts_with("#") { + continue; + } + + let mut parts = line.split_whitespace(); + + let key = parts.next().unwrap(); + + if parts.next().unwrap() != "=" { + panic!("malformatted line in config: {}", line); + } + + let val = parts.next().unwrap().to_string(); + + match key { + "default_host" => config.set_default_host(val), + "gem_root" => config.set_gem_root(val), + "listen" => config.add_addr(val), + "user" => config.set_user(val), + "group" => config.set_group(val), + "cert_key" => config.set_cert_key(val), + "cert_chain" => config.set_cert_chain(val), + _ => { + panic!("unknown key in config: {}", key); + } + } } - Some(config) + return config; } fn main() { let config = match parse_args() { - Some(config) => config, + Some(config_fname) => parse_config(config_fname), None => { help(); return; -- cgit v1.2.3