From 42690f1d5090c3cb31d89c59577d7ca3e3d04a0f Mon Sep 17 00:00:00 2001 From: Adrian Heine Date: Thu, 3 Sep 2020 11:31:09 +0200 Subject: [PATCH] Some small fixes --- Cargo.toml | 3 ++- src/loggers.rs | 23 +++++++++++++++-------- src/setup/core.rs | 9 +++++---- src/setup/setup.rs | 12 ++++++------ src/symbols/npm.rs | 13 +++++++++---- src/symbols/user.rs | 8 ++++++++ src/templates/systemd.rs | 2 +- 7 files changed, 46 insertions(+), 24 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0ebcb92..4c82032 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,7 +10,8 @@ users = "0.10.0" regex = "1.0.1" futures = "0.3" async-trait = "0.1" -tokio = { version = "0.2", features = ["process", "io-util", "rt-core", "macros"] } +tokio = { version = "0.2", features = ["process", "io-util", "rt-core", "macros", "sync"] } +once_cell = "1.4" [dev-dependencies] tempdir = "0.3" diff --git a/src/loggers.rs b/src/loggers.rs index 8c42e1c..3758a81 100644 --- a/src/loggers.rs +++ b/src/loggers.rs @@ -100,7 +100,7 @@ impl<'a, L: Logger> Logger for FilteringLogger<'a, L> { #[derive(Debug, Default)] pub struct StoringLogger { - log: RefCell>>, + log: RefCell<(bool, Vec>)>, } impl StoringLogger { @@ -109,21 +109,28 @@ impl StoringLogger { } pub fn release(self) -> Vec> { - self.log.into_inner() + self.log.into_inner().1 } } impl Logger for StoringLogger { fn write + Into>(&self, level: Level, line: S) { let mut log = self.log.borrow_mut(); - let entry = log - .pop() - .map(|e| Entry(min(e.0, level), e.1 + line.as_ref())) - .unwrap_or_else(|| Entry(level, line.into())); - log.push(entry); + let entry = if log.0 { + log + .1 + .pop() + .map(|e| Entry(min(e.0, level), e.1 + line.as_ref())) + } else { + None + } + .unwrap_or_else(|| Entry(level, line.into())); + log.1.push(entry); } fn writeln + Into>(&self, level: Level, line: S) { - self.log.borrow_mut().push(Entry(level, line.into())); + let mut log = self.log.borrow_mut(); + log.0 = false; + log.1.push(Entry(level, line.into())); } } diff --git a/src/setup/core.rs b/src/setup/core.rs index e330091..5a6852c 100644 --- a/src/setup/core.rs +++ b/src/setup/core.rs @@ -137,7 +137,7 @@ where let resource = resource.as_ref(); let logger = StoringLogger::new(); logger.write(4, format!("Adding {:?} ... ", resource)); - let result = { + let result = async { logger.trace(format!(" (force_run is {})", force_run)); let (location, location_prereqs) = L::locate(resource); logger.trace(format!("Adding location prereqs for {:?}", resource)); @@ -162,7 +162,8 @@ where ) .await?; Ok((location, did_run)) - }; + } + .await; logger.write(4, "done."); let max_level = if result.is_err() { 5 } else { 3 }; if parent_logger.put(logger.release().into_iter().filter(|e| e.0 <= max_level)) == 0 { @@ -181,9 +182,9 @@ impl SymbolRunner for RegularSetupCore { force: bool, ) -> Result> { let logger = StoringLogger::new(); - logger.debug(format!("Directly running {:?} ...", symbol)); + logger.write(4, format!("Directly running {:?} ...", symbol)); let result = self.symbol_runner.run_symbol(symbol, &logger, force).await; - logger.debug("done."); + logger.write(4, "done."); let max_level = if result.is_err() { 5 } else { 3 }; parent_logger.put(logger.release().into_iter().filter(|e| e.0 <= max_level)); result diff --git a/src/setup/setup.rs b/src/setup/setup.rs index 13afa25..748f427 100644 --- a/src/setup/setup.rs +++ b/src/setup/setup.rs @@ -64,11 +64,7 @@ impl< self.0.resources.borrow_mut() } - pub async fn add_force( - &self, - resource: R, - force_run: bool, - ) -> AddResult + pub async fn add_force(&self, resource: R, force_run: bool) -> AddResult where Rs: FromResource, As: FromArtifact + Clone, @@ -126,7 +122,11 @@ impl< self.add_force(resource, false).await } - pub async fn run_symbol(&self, symbol: S, force: bool) -> Result> + pub async fn run_symbol( + &self, + symbol: S, + force: bool, + ) -> Result> where RegularSetupCore: SymbolRunner, { diff --git a/src/symbols/npm.rs b/src/symbols/npm.rs index 5536c96..f6596b9 100644 --- a/src/symbols/npm.rs +++ b/src/symbols/npm.rs @@ -13,7 +13,7 @@ pub struct Install<'a, T: AsRef, C: CommandRunner> { impl<'a, T: AsRef, C: CommandRunner> Install<'a, T, C> { pub fn new(target: T, command_runner: &'a C) -> Self { - Install { + Self { target, command_runner, } @@ -36,9 +36,9 @@ impl, C: CommandRunner> Symbol for Install<'_, T, C> { if !self.target.as_ref().exists() { return Ok(false); } - let output = self + let result = self .command_runner - .get_output( + .run_with_args( "sh", args![ "-c", @@ -46,7 +46,12 @@ impl, C: CommandRunner> Symbol for Install<'_, T, C> { ], ) .await?; - Ok(!String::from_utf8(output).unwrap().contains("(empty)")) + Ok( + result.status.success() + && !String::from_utf8(result.stdout) + .unwrap() + .contains("(empty)"), + ) } async fn execute(&self) -> Result<(), Box> { diff --git a/src/symbols/user.rs b/src/symbols/user.rs index 16dd1b6..5d54f3f 100644 --- a/src/symbols/user.rs +++ b/src/symbols/user.rs @@ -1,7 +1,12 @@ use crate::command_runner::CommandRunner; use crate::symbols::Symbol; use async_trait::async_trait; +use once_cell::sync::Lazy; use std::error::Error; +use tokio::sync::Semaphore; + +pub type Wait = Lazy; +static WAIT: Wait = Lazy::new(|| Semaphore::new(1)); #[derive(Debug)] pub struct User { @@ -33,6 +38,9 @@ impl, C: CommandRunner> Symbol for User { } async fn execute(&self) -> Result<(), Box> { + // adduser is not reentrant because finding the next uid + // and creating the account is not an atomic operation + let wait = WAIT.acquire().await; self .command_runner .run_successfully( diff --git a/src/templates/systemd.rs b/src/templates/systemd.rs index 2369489..58f84da 100644 --- a/src/templates/systemd.rs +++ b/src/templates/systemd.rs @@ -36,7 +36,7 @@ pub fn nodejs_service, S: AsRef>( &format!( "Environment=NODE_ENV=production Environment=PORT={0} -ExecStartPost=/bin/sh -c 'sleep 1 && chmod 666 {0}' +ExecStartPost=/bin/sh -c 'for i in 1 2 3 4 5 6 7 8 9 10; do sleep 0.5; chmod 666 {0} && break; done' #RuntimeDirectory=service #RuntimeDirectoryMode=766", socket_path.as_ref().to_str().unwrap()