2020-02-14 12:20:17 +01:00
|
|
|
#[macro_use]
|
|
|
|
extern crate slog;
|
|
|
|
|
2020-02-16 16:02:03 +01:00
|
|
|
#[macro_use]
|
|
|
|
extern crate capnp_rpc;
|
|
|
|
|
|
|
|
mod auth;
|
2020-02-14 12:20:17 +01:00
|
|
|
mod access;
|
|
|
|
mod modules;
|
|
|
|
mod log;
|
|
|
|
mod api;
|
|
|
|
mod config;
|
|
|
|
mod error;
|
2020-02-16 16:02:03 +01:00
|
|
|
mod machine;
|
|
|
|
|
2020-02-17 03:44:02 +01:00
|
|
|
use api::api as api_capnp;
|
2020-02-14 12:20:17 +01:00
|
|
|
|
|
|
|
use futures::prelude::*;
|
|
|
|
use futures_signals::signal::Mutable;
|
|
|
|
use futures::task::LocalSpawn;
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let log = log::init();
|
|
|
|
info!(log, "Starting");
|
|
|
|
|
|
|
|
let config = config::read().unwrap();
|
|
|
|
|
|
|
|
modules::init(log.new(o!()));
|
|
|
|
api::init();
|
|
|
|
|
2020-02-16 16:02:03 +01:00
|
|
|
let m = machine::init(&config).unwrap();
|
|
|
|
let m = Mutable::new(m);
|
|
|
|
let m2 = m.clone();
|
|
|
|
let c2 = config.clone();
|
|
|
|
|
|
|
|
|
2020-02-14 12:20:17 +01:00
|
|
|
let mut exec = futures::executor::LocalPool::new();
|
|
|
|
|
|
|
|
let enf = exec.run_until(async {
|
|
|
|
let e = access::init(&config).await.unwrap();
|
|
|
|
Mutable::new(e)
|
|
|
|
});
|
|
|
|
|
2020-02-16 16:02:03 +01:00
|
|
|
let p = auth::open_passdb(&config.passdb).unwrap();
|
|
|
|
let p = Mutable::new(p);
|
2020-02-17 14:56:43 +01:00
|
|
|
let authp = auth::AuthenticationProvider::new(p, enf.clone());
|
|
|
|
let authp = Mutable::new(authp);
|
2020-02-14 12:20:17 +01:00
|
|
|
|
|
|
|
use std::net::ToSocketAddrs;
|
|
|
|
let args: Vec<String> = ::std::env::args().collect();
|
|
|
|
if args.len() != 2 {
|
|
|
|
println!("usage: {} ADDRESS[:PORT]", args[0]);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
let addr = args[1].to_socket_addrs().unwrap().next().expect("could not parse address");
|
|
|
|
|
2020-02-17 15:07:55 +01:00
|
|
|
let permlog = log.new(o!());
|
|
|
|
let machlog = log.new(o!());
|
2020-02-14 12:20:17 +01:00
|
|
|
|
2020-02-17 21:07:50 +01:00
|
|
|
machine::save(&c2, &m2.lock_ref()).expect("MachineDB save");
|
|
|
|
|
2020-02-14 12:20:17 +01:00
|
|
|
let spawner = exec.spawner();
|
|
|
|
let result: Result<(), Box<dyn std::error::Error>> = exec.run_until(async move {
|
|
|
|
let listener = async_std::net::TcpListener::bind(&addr).await?;
|
|
|
|
let mut incoming = listener.incoming();
|
|
|
|
while let Some(socket) = incoming.next().await {
|
|
|
|
let socket = socket?;
|
2020-02-17 21:07:50 +01:00
|
|
|
trace!(log, "New connection from {:?}", socket.peer_addr());
|
2020-02-17 14:56:43 +01:00
|
|
|
// TODO: Prettify session handling
|
|
|
|
let auth = auth::Authentication::new(authp.clone());
|
2020-02-17 21:07:50 +01:00
|
|
|
trace!(log, "Init auth");
|
2020-02-17 15:07:55 +01:00
|
|
|
let perm = access::Permissions::new(permlog.clone(), enf.clone(), auth.clone());
|
2020-02-17 21:07:50 +01:00
|
|
|
trace!(log, "Init perm");
|
2020-02-17 15:07:55 +01:00
|
|
|
let mach = machine::Machines::new(machlog.clone(), m.clone(), perm.clone());
|
2020-02-17 21:07:50 +01:00
|
|
|
trace!(log, "Init mach");
|
2020-02-17 14:56:43 +01:00
|
|
|
|
|
|
|
let rpc_system = api::process_socket(auth, perm, mach, socket);
|
2020-02-14 12:20:17 +01:00
|
|
|
spawner.spawn_local_obj(
|
|
|
|
Box::pin(rpc_system.map_err(|e| println!("error: {:?}", e)).map(|_|())).into()).expect("spawn")
|
|
|
|
}
|
|
|
|
Ok(())
|
|
|
|
});
|
|
|
|
result.expect("main");
|
2020-02-16 16:02:03 +01:00
|
|
|
|
2020-02-14 12:20:17 +01:00
|
|
|
}
|