| 
						
						
							
								
							
						
						
					 | 
					@ -16,6 +16,7 @@ extern crate diesel; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					#[macro_use] | 
					 | 
					 | 
					#[macro_use] | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					extern crate diesel_migrations; | 
					 | 
					 | 
					extern crate diesel_migrations; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					use job_scheduler::{JobScheduler, Job}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					use std::{ | 
					 | 
					 | 
					use std::{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    fs::create_dir_all, | 
					 | 
					 | 
					    fs::create_dir_all, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    panic, | 
					 | 
					 | 
					    panic, | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					@ -23,6 +24,7 @@ use std::{ | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    process::{exit, Command}, | 
					 | 
					 | 
					    process::{exit, Command}, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    str::FromStr, | 
					 | 
					 | 
					    str::FromStr, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    thread, | 
					 | 
					 | 
					    thread, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    time::Duration, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					#[macro_use] | 
					 | 
					 | 
					#[macro_use] | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -56,7 +58,9 @@ fn main() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    create_icon_cache_folder(); | 
					 | 
					 | 
					    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 = "\ | 
					 | 
					 | 
					const HELP: &str = "\ | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -301,17 +305,17 @@ fn check_web_vault() { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					} | 
					 | 
					 | 
					} | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					fn launch_rocket(extra_debug: bool) { | 
					 | 
					 | 
					fn create_db_pool() -> db::DbPool { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    let pool = match util::retry_db(db::DbPool::from_config, CONFIG.db_connection_retries()) { | 
					 | 
					 | 
					    match util::retry_db(db::DbPool::from_config, CONFIG.db_connection_retries()) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					        Ok(p) => p, | 
					 | 
					 | 
					        Ok(p) => p, | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        Err(e) => { | 
					 | 
					 | 
					        Err(e) => { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            error!("Error creating database pool: {:?}", e); | 
					 | 
					 | 
					            error!("Error creating database pool: {:?}", e); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					            exit(1); | 
					 | 
					 | 
					            exit(1); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        } | 
					 | 
					 | 
					        } | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    }; | 
					 | 
					 | 
					    } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					} | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					    api::start_send_deletion_scheduler(pool.clone()); | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					fn launch_rocket(pool: db::DbPool, extra_debug: bool) { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    let basepath = &CONFIG.domain_path(); | 
					 | 
					 | 
					    let basepath = &CONFIG.domain_path(); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    // If adding more paths here, consider also adding them to
 | 
					 | 
					 | 
					    // 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
 | 
					 | 
					 | 
					    // The launch will restore the original logging level
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    error!("Launch error {:#?}", result); | 
					 | 
					 | 
					    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"); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					
  |