handle env vars, no warnings, no panic

This commit is contained in:
Konstantin Stepanov 2015-03-30 21:20:57 +03:00
parent 195218ade7
commit ffd703f08d

View File

@ -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();
}