make all options configuable on runtime

* pull in argparse to parse cli arguments
* make ip and port configurable on runtime
* add plaintext mode for use behind reverse proxies
* make tls cert/key path configuable on runtime
This commit is contained in:
Jeff Becker 2021-03-21 09:04:00 -04:00
parent 02916a7bc4
commit 717734b7ae
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05
3 changed files with 57 additions and 10 deletions

7
Cargo.lock generated
View File

@ -60,6 +60,12 @@ version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e"
[[package]]
name = "argparse"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f8ebf5827e4ac4fd5946560e6a99776ea73b596d80898f357007317a7141e47"
[[package]]
name = "arrayvec"
version = "0.5.2"
@ -1235,6 +1241,7 @@ name = "session-open-group-server"
version = "1.0.0"
dependencies = [
"aes-gcm",
"argparse",
"base64",
"chrono",
"curve25519-parser",

View File

@ -26,6 +26,7 @@ tokio = { version = "1.3", features = ["full"] }
uuid = { version = "0.8", features = ["v4"] }
warp = { version = "0.3", features = ["tls"] }
x25519-dalek = "1.1"
argparse = "0.2.2"
[dev-dependencies]
tokio-test = "*"
tokio-test = "*"

View File

@ -12,11 +12,45 @@ mod onion_requests;
mod routes;
mod rpc;
mod storage;
use argparse::{ArgumentParser, StoreTrue, Store};
use std::net::{IpAddr, Ipv4Addr, SocketAddr};
#[cfg(test)]
mod tests;
#[tokio::main]
async fn main() {
// arguments default values
let mut plaintext = false;
let mut tls_certfile = "tls_certificate.pem".to_string();
let mut tls_keyfile = "tls_private_key.pem".to_string();
let mut port : u16 = 443;
let mut bind_ip : Ipv4Addr = Ipv4Addr::new(0,0,0,0);
// parse arguments
{
let mut ap = ArgumentParser::new();
ap.set_description("session open group server");
ap.refer(&mut plaintext)
.add_option(&["--plaintext"], StoreTrue,
"run in plaintext mode for use behind a reverse proxy");
ap.refer(&mut tls_certfile)
.add_option(&["--tls-cert"], Store,
"path to tls certificate");
ap.refer(&mut tls_keyfile)
.add_option(&["--tls-key"], Store,
"path to tls private key");
ap.refer(&mut port)
.add_option(&["-P", "--port"], Store,
"Set the port to bind on");
ap.refer(&mut bind_ip)
.add_option(&["-H", "--host"], Store,
"set ip to bind on");
ap.parse_args_or_exit();
}
// create socket address
let addr = SocketAddr::new(IpAddr::V4(bind_ip), port);
// Print the server public key
let public_key = hex::encode(crypto::PUBLIC_KEY.as_bytes());
println!("The public key of this server is: {}", public_key);
@ -27,18 +61,23 @@ async fn main() {
fs::create_dir_all("./files").unwrap();
// Create the main room
let main_room = "main";
storage::create_database_if_needed(main_room);
storage::create_database_if_needed(main_room);
// Set up pruning jobs
let prune_pending_tokens_future = storage::prune_pending_tokens_periodically();
let prune_tokens_future = storage::prune_tokens_periodically();
let prune_files_future = storage::prune_files_periodically();
// Serve routes
let routes = routes::root().or(routes::lsrpc());
let serve_routes_future = warp::serve(routes)
.tls()
.cert_path("tls_certificate.pem")
.key_path("tls_private_key.pem")
.run(([0, 0, 0, 0], 443));
// Keep futures alive
join!(prune_pending_tokens_future, prune_tokens_future, prune_files_future, serve_routes_future);
let routes = warp::serve(routes::root().or(routes::lsrpc()));
if plaintext {
println!("!!! running in plaintext mode on {}", addr);
let serve_routes_future = routes.run(addr);
join!(prune_pending_tokens_future, prune_tokens_future, prune_files_future, serve_routes_future);
} else {
println!("running on {} with tls", addr);
let serve_routes_future = routes.tls()
.cert_path(tls_certfile)
.key_path(tls_keyfile)
.run(addr);
join!(prune_pending_tokens_future, prune_tokens_future, prune_files_future, serve_routes_future);
}
}