From 44ef95b440cac25cc86c38b8c91dc209d18ae6be Mon Sep 17 00:00:00 2001 From: Gregory Ballantine Date: Thu, 1 Sep 2022 22:15:46 -0400 Subject: [PATCH] Added a basic check to make sure we don't try to transcode a partially written file --- src/main.rs | 6 +++--- src/transcoder/mod.rs | 2 ++ src/{ => transcoder}/repository.rs | 0 src/{ => transcoder}/transcoder.rs | 9 ++++++++- src/util/io.rs | 16 ++++++++++++++++ src/util/mod.rs | 1 + 6 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 src/transcoder/mod.rs rename src/{ => transcoder}/repository.rs (100%) rename src/{ => transcoder}/transcoder.rs (87%) create mode 100644 src/util/io.rs create mode 100644 src/util/mod.rs diff --git a/src/main.rs b/src/main.rs index d738de0..ab5f2d2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,11 @@ use log4rs; use config::Config; -use repository::Repository; -use transcoder::Transcoder; +use transcoder::repository::Repository; +use transcoder::transcoder::Transcoder; mod config; -mod repository; mod transcoder; +mod util; fn main() { // initialize the log4rs logger diff --git a/src/transcoder/mod.rs b/src/transcoder/mod.rs new file mode 100644 index 0000000..5886b2e --- /dev/null +++ b/src/transcoder/mod.rs @@ -0,0 +1,2 @@ +pub mod repository; +pub mod transcoder; \ No newline at end of file diff --git a/src/repository.rs b/src/transcoder/repository.rs similarity index 100% rename from src/repository.rs rename to src/transcoder/repository.rs diff --git a/src/transcoder.rs b/src/transcoder/transcoder.rs similarity index 87% rename from src/transcoder.rs rename to src/transcoder/transcoder.rs index 7baeaee..2a2fbbc 100644 --- a/src/transcoder.rs +++ b/src/transcoder/transcoder.rs @@ -4,7 +4,8 @@ use std::{thread, time}; use log::{info}; use crate::config::Config; -use crate::repository::Repository; +use crate::util::io; +use super::repository::Repository; pub struct Transcoder { config: Config, @@ -31,6 +32,12 @@ impl Transcoder { info!("There were no files found in ingest to transcode; skipping run."); } else { for i in ingest_files { + let ingest_path = Path::new(&self.repository.ingest_dir).join(&i); + if io::is_file_locked(&ingest_path.to_str().unwrap()) { + info!("{} is currently open in another program; skipping it for this run.", &i); + continue; + } + // copy the file to the archive self.repository.archive_file(&i); diff --git a/src/util/io.rs b/src/util/io.rs new file mode 100644 index 0000000..ee6bd66 --- /dev/null +++ b/src/util/io.rs @@ -0,0 +1,16 @@ +use std::process; + +// checks whether a file is currently open in another program (e.g. still being written) +pub fn is_file_locked(filepath: &str) -> bool { + let cmd = process::Command::new("/usr/bin/lsof") + .arg(filepath) + .output() + .expect("Failed to execute command"); + + let results = &String::from_utf8_lossy(&cmd.stdout); + if results.contains(filepath) { + return true; + } + + return false; +} diff --git a/src/util/mod.rs b/src/util/mod.rs new file mode 100644 index 0000000..678b90e --- /dev/null +++ b/src/util/mod.rs @@ -0,0 +1 @@ +pub mod io; \ No newline at end of file