handle env vars, no warnings, no panic
This commit is contained in:
parent
195218ade7
commit
ffd703f08d
36
src/main.rs
36
src/main.rs
@ -8,15 +8,15 @@ extern crate cronparse;
|
||||
|
||||
use std::convert::AsRef;
|
||||
use std::fs::{walk_dir, PathExt};
|
||||
use std::path::Path;
|
||||
use std::io;
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::thread::spawn;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use cronparse::{CrontabFile, CrontabFileError, CrontabFileErrorKind};
|
||||
use cronparse::crontab::{UserCrontabEntry, SystemCrontabEntry, AnacrontabEntry, EnvVarEntry, CrontabEntry, ToCrontabEntry};
|
||||
|
||||
fn generate_systemd_units(path: &Path, entry: CrontabEntry) {
|
||||
println!("{} => {:?}", path.display(), entry);
|
||||
fn generate_systemd_units(path: &Path, entry: CrontabEntry, env: &BTreeMap<String, String>) {
|
||||
println!("{} => {:?}, {:?}", path.display(), entry, env);
|
||||
}
|
||||
|
||||
static USERS_CRONTAB_DIR: &'static str = "/var/spool/cron"; // UserCrontabEntry
|
||||
@ -24,24 +24,28 @@ static SYSTEM_CRONTAB_DIR: &'static str = "/etc/cron.d"; // SystemCrontabEntry
|
||||
static ANACRONTAB_FILE: &'static str = "/etc/anacrontab"; // AnacrontabEntry
|
||||
|
||||
fn process_crontab_file<T: ToCrontabEntry, P: AsRef<Path>>(path: P) {
|
||||
let crontab: CrontabFile<T> = CrontabFile::new(path.as_ref()).unwrap();
|
||||
let _ = CrontabFile::<T>::new(path.as_ref()).map(|crontab| {
|
||||
let mut env = BTreeMap::new();
|
||||
for entry in crontab {
|
||||
match entry {
|
||||
Ok(data) => generate_systemd_units(path.as_ref(), data),
|
||||
Err(err @ CrontabFileError { kind: CrontabFileErrorKind::Io(_), .. }) => panic!("error parsing file {}: {}", path.as_ref().display(), err),
|
||||
Ok(CrontabEntry::EnvVar(EnvVarEntry(name, value))) => { env.insert(name, value); },
|
||||
Ok(data) => generate_systemd_units(path.as_ref(), data, &env),
|
||||
Err(err @ CrontabFileError { kind: CrontabFileErrorKind::Io(_), .. }) => println!("error accessing file {}: {}", path.as_ref().display(), err),
|
||||
Err(err @ CrontabFileError { kind: CrontabFileErrorKind::Parse(_), .. }) => println!("skipping file {} due to parsing error: {}", path.as_ref().display(), err),
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
fn process_crontab_dir<T: ToCrontabEntry>(dir: &str) {
|
||||
for fres in walk_dir(dir).unwrap() {
|
||||
let path = fres.unwrap().path();
|
||||
if !path.is_file() {
|
||||
continue;
|
||||
let files = walk_dir(dir).and_then(|fs| fs.map(|r| r.map(|p| p.path()))
|
||||
.filter(|r| r.as_ref().map(|p| p.is_file()).unwrap_or(true))
|
||||
.collect::<Result<Vec<PathBuf>, _>>());
|
||||
match files {
|
||||
Err(err) => println!("Error processing directory {}: {}", dir, err),
|
||||
Ok(files) => for file in files {
|
||||
process_crontab_file::<T, _>(file);
|
||||
}
|
||||
|
||||
process_crontab_file::<T, _>(path);
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,7 +54,7 @@ fn main() {
|
||||
let system_thread = spawn(|| process_crontab_dir::<SystemCrontabEntry>(SYSTEM_CRONTAB_DIR));
|
||||
let anacron_thread = spawn(|| process_crontab_file::<AnacrontabEntry, _>(ANACRONTAB_FILE));
|
||||
|
||||
user_thread.join();
|
||||
system_thread.join();
|
||||
anacron_thread.join();
|
||||
let _ = user_thread.join();
|
||||
let _ = system_thread.join();
|
||||
let _ = anacron_thread.join();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user