Verify that the output and job directories exist and are writable
This commit is contained in:
		
							parent
							
								
									053910c03f
								
							
						
					
					
						commit
						222d4c6c18
					
				
							
								
								
									
										69
									
								
								src/main.rs
								
								
								
								
							
							
						
						
									
										69
									
								
								src/main.rs
								
								
								
								
							|  | @ -43,6 +43,25 @@ impl ThreadJob<'_> { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| fn verify_directory(dir: &String) -> bool { | ||||
|     let md = match std::fs::metadata(&dir) { | ||||
|         Err(why) => { | ||||
|             println!("Cannot stat directory '{}': {}", dir, why); | ||||
|             return false; | ||||
|         }, | ||||
|         Ok(val) => val, | ||||
|     }; | ||||
|     if !md.is_dir() { | ||||
|         println!("Output directory '{}' is not a directory", dir); | ||||
|         return false; | ||||
|     } | ||||
|     if md.permissions().readonly() { | ||||
|         println!("Output directory '{}' is read-only", dir); | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| fn main() { | ||||
|     let mut conf = Conf::get_default_conf(); | ||||
|     conf.update_from_file("/etc/haunter/haunter.conf"); | ||||
|  | @ -57,6 +76,15 @@ fn main() { | |||
|         } | ||||
|     } | ||||
| 
 | ||||
|     if !verify_directory(&conf.output_dir) { | ||||
|         println!("Output directory unusable, aborting"); | ||||
|         std::process::exit(1); | ||||
|     } | ||||
|     if !verify_directory(&conf.job_dir) { | ||||
|         println!("Output job unusable, aborting"); | ||||
|         std::process::exit(1); | ||||
|     } | ||||
| 
 | ||||
|     let mut jobs = Vec::new(); | ||||
|     let some_job = Job { | ||||
|         url: "https://www.rust-lang.org", | ||||
|  | @ -156,3 +184,44 @@ fn get_source(driver: &str, url: &str) -> Result<String, &'static str> { | |||
|     driver.quit().expect("failed to close session"); | ||||
|     return Ok(source); | ||||
| } | ||||
| 
 | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
| 
 | ||||
|     use std::str::FromStr; | ||||
| 
 | ||||
|     use tempfile; | ||||
| 
 | ||||
|     #[test] | ||||
|     fn verify_directory_exists_but_is_file() { | ||||
|         let mut tf = tempfile::NamedTempFile::new().unwrap(); | ||||
|         let dir = String::from_str(tf.path().to_str().unwrap()).unwrap(); | ||||
|         assert!(!verify_directory(&dir)); | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn verify_directory_does_not_exist() { | ||||
|         assert!(!verify_directory(&String::from_str("/fake/path/that/does/not/exist").unwrap())); | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn verify_directory_exists() { | ||||
|         let mut tf = tempfile::tempdir().unwrap(); | ||||
|         assert!(verify_directory(&String::from_str(tf.path().to_str().unwrap()).unwrap())); | ||||
|     } | ||||
| 
 | ||||
|     #[test] | ||||
|     fn verify_directory_exists_but_is_not_writable() { | ||||
|         let mut tf = tempfile::tempdir().unwrap(); | ||||
|         let md = std::fs::metadata(&tf.path()).unwrap(); | ||||
|         let mut perms = md.permissions(); | ||||
|         perms.set_readonly(true); | ||||
|         std::fs::set_permissions(&tf.path(), perms); | ||||
|         let result = verify_directory(&String::from_str(tf.path().to_str().unwrap()).unwrap()); | ||||
|         perms = md.permissions(); | ||||
|         perms.set_readonly(false); | ||||
|         std::fs::set_permissions(&tf.path(), perms); | ||||
|         assert!(!result); | ||||
|     } | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue