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