#[macro_use] extern crate diesel; #[macro_use] extern crate diesel_migrations; use actix::prelude::*; use actix_web::{middleware, App, HttpServer}; use clap::{App as ClapApp, Arg}; use log::info; use std::env; use std::fs; use std::path::PathBuf; mod database; mod dataops; mod models; mod routes; mod schema; const VERSION: &str = env!("CARGO_PKG_VERSION"); fn main() -> std::io::Result<()> { let env = env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"); env_logger::init_from_env(env); let app = ClapApp::new("upend") .version(VERSION) .author("Tomáš Mládek ") .arg(Arg::with_name("DIRECTORY").required(true).index(1)) .arg( Arg::with_name("BIND") .long("bind") .default_value("127.0.0.1:8093") .help("address and port to bind the Web interface on") .required(true), ); let matches = app.get_matches(); info!("Starting UpEnd {}...", VERSION); let dirname = matches.value_of("DIRECTORY").unwrap(); let path = PathBuf::from(dirname); let _ = fs::remove_file(format!("{}/upend.sqlite3", dirname)); // TODO REMOVE!!! let db_pool = database::open_upend(&dirname).expect("failed to open database!"); let sys = actix::System::new("upend"); // let connection = db_pool.get().expect("Could not get SQL connection."); let db_addr = SyncArbiter::start(3, move || database::DbExecutor(db_pool.clone())); let hash_addr = SyncArbiter::start(4, move || dataops::HasherWorker); let bind = matches.value_of("BIND").unwrap(); info!("Starting server at: {}", &bind); // Start HTTP server HttpServer::new(move || { App::new() .data(routes::State { directory: path.clone(), db: db_addr.clone(), hasher: hash_addr.clone(), }) .wrap(middleware::Logger::default()) .service(routes::get_raw) .service(routes::get_lookup) .service(routes::api_refresh) }) .bind(&bind)? .run(); sys.run() }