|
|
@ -16,6 +16,7 @@ extern crate diesel; |
|
|
|
#[macro_use] |
|
|
|
extern crate diesel_migrations; |
|
|
|
|
|
|
|
use job_scheduler::{JobScheduler, Job}; |
|
|
|
use std::{ |
|
|
|
fs::create_dir_all, |
|
|
|
panic, |
|
|
@ -23,6 +24,7 @@ use std::{ |
|
|
|
process::{exit, Command}, |
|
|
|
str::FromStr, |
|
|
|
thread, |
|
|
|
time::Duration, |
|
|
|
}; |
|
|
|
|
|
|
|
#[macro_use] |
|
|
@ -56,7 +58,9 @@ fn main() { |
|
|
|
|
|
|
|
create_icon_cache_folder(); |
|
|
|
|
|
|
|
launch_rocket(extra_debug); |
|
|
|
let pool = create_db_pool(); |
|
|
|
schedule_jobs(pool.clone()); |
|
|
|
launch_rocket(pool, extra_debug); // Blocks until program termination.
|
|
|
|
} |
|
|
|
|
|
|
|
const HELP: &str = "\ |
|
|
@ -301,17 +305,17 @@ fn check_web_vault() { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fn launch_rocket(extra_debug: bool) { |
|
|
|
let pool = match util::retry_db(db::DbPool::from_config, CONFIG.db_connection_retries()) { |
|
|
|
fn create_db_pool() -> db::DbPool { |
|
|
|
match util::retry_db(db::DbPool::from_config, CONFIG.db_connection_retries()) { |
|
|
|
Ok(p) => p, |
|
|
|
Err(e) => { |
|
|
|
error!("Error creating database pool: {:?}", e); |
|
|
|
exit(1); |
|
|
|
} |
|
|
|
}; |
|
|
|
|
|
|
|
api::start_send_deletion_scheduler(pool.clone()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
fn launch_rocket(pool: db::DbPool, extra_debug: bool) { |
|
|
|
let basepath = &CONFIG.domain_path(); |
|
|
|
|
|
|
|
// If adding more paths here, consider also adding them to
|
|
|
@ -334,3 +338,30 @@ fn launch_rocket(extra_debug: bool) { |
|
|
|
// The launch will restore the original logging level
|
|
|
|
error!("Launch error {:#?}", result); |
|
|
|
} |
|
|
|
|
|
|
|
fn schedule_jobs(pool: db::DbPool) { |
|
|
|
if CONFIG.job_poll_interval_ms() == 0 { |
|
|
|
info!("Job scheduler disabled."); |
|
|
|
return; |
|
|
|
} |
|
|
|
thread::Builder::new().name("job-scheduler".to_string()).spawn(move || { |
|
|
|
let mut sched = JobScheduler::new(); |
|
|
|
|
|
|
|
// Purge sends that are past their deletion date.
|
|
|
|
if !CONFIG.send_purge_schedule().is_empty() { |
|
|
|
sched.add(Job::new(CONFIG.send_purge_schedule().parse().unwrap(), || { |
|
|
|
api::purge_sends(pool.clone()); |
|
|
|
})); |
|
|
|
} |
|
|
|
|
|
|
|
// Periodically check for jobs to run. We probably won't need any
|
|
|
|
// jobs that run more often than once a minute, so a default poll
|
|
|
|
// interval of 30 seconds should be sufficient. Users who want to
|
|
|
|
// schedule jobs to run more frequently for some reason can reduce
|
|
|
|
// the poll interval accordingly.
|
|
|
|
loop { |
|
|
|
sched.tick(); |
|
|
|
thread::sleep(Duration::from_millis(CONFIG.job_poll_interval_ms())); |
|
|
|
} |
|
|
|
}).expect("Error spawning job scheduler thread"); |
|
|
|
} |
|
|
|