diff --git a/src/builder.rs b/src/builder.rs index 7a89085..811c3f1 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -719,9 +719,7 @@ impl ImplementationBuilder> for DefaultBuilder { impl ImplementationBuilder> for DefaultBuilder { type Prerequisites = (); - fn prerequisites(resource: &PostgresqlDatabase) -> Self::Prerequisites { - () - } + fn prerequisites(_: &PostgresqlDatabase) -> Self::Prerequisites {} type Implementation = (PostgreSQLDatabaseSymbol<'static, String, String, StdCommandRunner>,); fn create( diff --git a/src/command_runner.rs b/src/command_runner.rs index 5d8fd2f..0a64621 100644 --- a/src/command_runner.rs +++ b/src/command_runner.rs @@ -72,6 +72,7 @@ impl CommandRunner for StdCommandRunner { .expect("Failed to write to stdin"); let res = child.wait_with_output().await; //println!("{:?}", res); + #[allow(clippy::let_and_return)] res } } @@ -125,8 +126,8 @@ impl, C: CommandRunner> CommandRunner for SetuidCommandRunner<'_, let uid = get_user_by_name(self.user_name.as_ref()) .expect("User does not exist") .uid(); - let _set_home = TempSetEnv::new("HOME", format!("/home/{}", self.user_name.as_ref())); - let _set_dbus = TempSetEnv::new("XDG_RUNTIME_DIR", format!("/run/user/{}", uid)); + let set_home = TempSetEnv::new("HOME", format!("/home/{}", self.user_name.as_ref())); + let set_dbus = TempSetEnv::new("XDG_RUNTIME_DIR", format!("/run/user/{}", uid)); //println!("{} {:?}", program, args); let mut child = Command::new(program) .args(args) @@ -143,6 +144,8 @@ impl, C: CommandRunner> CommandRunner for SetuidCommandRunner<'_, .await .expect("Failed to write to stdin"); let res = child.wait_with_output().await; + drop(set_home); + drop(set_dbus); //println!("{:?}", res); res } diff --git a/src/locator.rs b/src/locator.rs index bdf17a7..739c8c3 100644 --- a/src/locator.rs +++ b/src/locator.rs @@ -15,23 +15,29 @@ use std::marker::PhantomData; use std::path::{Path, PathBuf}; pub trait Policy { + #[must_use] fn acme_user() -> &'static str { "acme" } + + #[must_use] fn user_home(user_name: &str) -> PathBuf { - format!("/home/{}", user_name).into() + Path::new("/home").join(user_name) } + #[must_use] fn user_name_for_domain(domain_name: &'_ str) -> String { domain_name.split('.').rev().fold(String::new(), |result, part| if result.is_empty() { result } else { result + "_" } + part) } + #[must_use] fn php_version() -> &'static str { "7.0" } + #[must_use] fn path_for_data(name: impl Display) -> PathBuf { - ("/root/data".as_ref() as &Path).join(format!("_{}", name)) + Path::new("/root/data").join(format!("_{}", name)) } } @@ -286,7 +292,7 @@ impl, POLICY> ResourceLocator> for DefaultLocator< resource: &ServeCustom, ) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(Path::new("/etc/nginx/sites-enabled/").join(&resource.0)), (), ) } @@ -298,7 +304,7 @@ impl, P, POLICY> ResourceLocator> for DefaultLocat resource: &ServePhp, ) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(Path::new("/etc/nginx/sites-enabled/").join(&resource.0)), (), ) } @@ -313,7 +319,7 @@ impl, P, POLICY> ResourceLocator> for DefaultL Self::Prerequisites, ) { ( - PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(Path::new("/etc/nginx/sites-enabled/").join(&resource.0)), (), ) } @@ -325,7 +331,7 @@ impl, POLICY> ResourceLocator> for DefaultLocator

, ) -> ( as Resource>::Artifact, Self::Prerequisites) { ( - PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(Path::new("/etc/nginx/sites-enabled/").join(&resource.0)), (), ) } @@ -340,7 +346,7 @@ impl, P, POLICY> ResourceLocator> for DefaultLo Self::Prerequisites, ) { ( - PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), + PathArtifact::from(Path::new("/etc/nginx/sites-enabled/").join(&resource.0)), (), ) } diff --git a/src/loggers.rs b/src/loggers.rs index e5c8573..dcbd0e1 100644 --- a/src/loggers.rs +++ b/src/loggers.rs @@ -80,7 +80,7 @@ pub struct FilteringLogger<'a, L> { } impl<'a, L> FilteringLogger<'a, L> { - pub fn new(logger: &'a L, max_level: Level) -> Self { + pub const fn new(logger: &'a L, max_level: Level) -> Self { Self { logger, max_level } } } @@ -104,6 +104,7 @@ pub struct StoringLogger { } impl StoringLogger { + #[must_use] pub fn new() -> Self { Self::default() } diff --git a/src/setup/mod.rs b/src/setup/mod.rs index cca4db8..a187a88 100644 --- a/src/setup/mod.rs +++ b/src/setup/mod.rs @@ -7,5 +7,6 @@ pub use symbol_runner::{ SymbolRunner, }; mod runnable; +#[allow(clippy::module_inception)] mod setup; pub use setup::SetupFacade as Setup; diff --git a/src/setup/runnable.rs b/src/setup/runnable.rs index 5c3a1c3..4e3e087 100644 --- a/src/setup/runnable.rs +++ b/src/setup/runnable.rs @@ -16,6 +16,7 @@ pub trait Runnable { } #[async_trait(?Send)] +#[allow(clippy::use_self)] impl Runnable for S where Self: Symbol + Debug, @@ -32,6 +33,7 @@ where macro_rules! runnable_for_tuple { ( $($name:ident)* ) => ( + #[allow(clippy::let_unit_value)] #[async_trait(?Send)] #[allow(non_snake_case)] impl<$($name: Symbol + Debug,)*> Runnable for ($($name,)*) { @@ -117,7 +119,7 @@ mod test { async fn run_symbol( &self, symbol: &S, - logger: &L, + _logger: &L, force: bool, ) -> Result> { let run = force || !symbol.target_reached().await?; diff --git a/src/setup/setup.rs b/src/setup/setup.rs index 4efd0ab..472d52e 100644 --- a/src/setup/setup.rs +++ b/src/setup/setup.rs @@ -201,7 +201,7 @@ mod test { async fn run_symbol( &self, symbol: &S, - logger: &L, + _logger: &L, force: bool, ) -> Result> { let run = force || !symbol.target_reached().await?; @@ -239,10 +239,12 @@ mod test { #[derive(Clone)] struct Artifacts; impl FromArtifact> for Artifacts { - fn from_artifact(from: ()) -> Self { + fn from_artifact(_from: ()) -> Self { Self } + #[allow(clippy::unused_unit)] fn into_artifact(self) -> () { + #[allow(clippy::unused_unit)] () } } diff --git a/src/setup/symbol_runner.rs b/src/setup/symbol_runner.rs index 5448521..378cd90 100644 --- a/src/setup/symbol_runner.rs +++ b/src/setup/symbol_runner.rs @@ -17,27 +17,14 @@ pub trait SymbolRunner { ) -> Result>; } -#[derive(Debug)] -pub enum SymbolRunError { - Symbol(Box), - ExecuteDidNotReach(()), -} +#[derive(Debug, Default)] +pub struct ExecuteDidNotReachError; -impl Error for SymbolRunError { - fn cause(&self) -> Option<&dyn Error> { - match self { - Self::Symbol(ref e) => Some(&**e), - Self::ExecuteDidNotReach(_) => None, - } - } -} +impl Error for ExecuteDidNotReachError {} -impl fmt::Display for SymbolRunError { +impl fmt::Display for ExecuteDidNotReachError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Self::Symbol(ref e) => write!(f, "{}", e), - Self::ExecuteDidNotReach(_) => write!(f, "Target not reached after executing symbol"), - } + write!(f, "Target not reached after executing symbol") } } @@ -45,7 +32,8 @@ impl fmt::Display for SymbolRunError { pub struct InitializingSymbolRunner; impl InitializingSymbolRunner { - pub fn new() -> Self { + #[must_use] + pub const fn new() -> Self { Self } @@ -64,7 +52,7 @@ impl InitializingSymbolRunner { if target_reached { Ok(()) } else { - Err(Box::new(SymbolRunError::ExecuteDidNotReach(()))) + Err(Box::new(ExecuteDidNotReachError)) } } } @@ -102,7 +90,8 @@ impl SymbolRunner for InitializingSymbolRunner { pub struct DelayingSymbolRunner(R); impl DelayingSymbolRunner { - pub fn new(symbol_runner: R) -> Self { + #[must_use] + pub const fn new(symbol_runner: R) -> Self { Self(symbol_runner) } } @@ -137,7 +126,8 @@ where pub struct DrySymbolRunner; impl DrySymbolRunner { - pub fn new() -> Self { + #[must_use] + pub const fn new() -> Self { Self } } @@ -172,7 +162,8 @@ impl SymbolRunner for DrySymbolRunner { pub struct ReportingSymbolRunner(R); impl ReportingSymbolRunner { - pub fn new(symbol_runner: R) -> Self { + #[must_use] + pub const fn new(symbol_runner: R) -> Self { Self(symbol_runner) } } @@ -251,6 +242,7 @@ mod test { T: Iterator>>, > DummySymbol { + #[must_use] fn new< IE: IntoIterator>>, IT: IntoIterator>>, diff --git a/src/storage.rs b/src/storage.rs index a963414..aa4ce9d 100644 --- a/src/storage.rs +++ b/src/storage.rs @@ -14,6 +14,7 @@ pub trait Storage { pub struct SimpleStorage(PathBuf); impl SimpleStorage { + #[must_use] pub const fn new(base: PathBuf) -> Self { Self(base) } diff --git a/src/symbols/dir.rs b/src/symbols/dir.rs index f9fdacc..1a60af2 100644 --- a/src/symbols/dir.rs +++ b/src/symbols/dir.rs @@ -11,7 +11,7 @@ pub struct Dir

{ } impl

Dir

{ - pub fn new(path: P) -> Self { + pub const fn new(path: P) -> Self { Self { path } } } diff --git a/src/symbols/file.rs b/src/symbols/file.rs index edff275..a3763c1 100644 --- a/src/symbols/file.rs +++ b/src/symbols/file.rs @@ -12,7 +12,7 @@ pub struct File { } impl File { - pub fn new(path: D, content: C) -> Self { + pub const fn new(path: D, content: C) -> Self { Self { path, content } } } diff --git a/src/symbols/git/checkout.rs b/src/symbols/git/checkout.rs index e2ad4a5..14593ba 100644 --- a/src/symbols/git/checkout.rs +++ b/src/symbols/git/checkout.rs @@ -63,7 +63,12 @@ impl, P: AsRef, S: AsRef, B: AsRef Result<(), Box> { - if !self.target.as_ref().exists() { + if self.target.as_ref().exists() { + self + .run_git(&["fetch", self.source.as_ref(), self.branch.as_ref()]) + .await?; + self.run_git(&["merge", "FETCH_HEAD"]).await?; + } else { self .command_runner .borrow() @@ -80,11 +85,6 @@ impl, P: AsRef, S: AsRef, B: AsRef { } impl<'a, P, C> GitSubmodules<'a, P, C> { - pub fn new(target: P, command_runner: &'a C) -> Self { + pub const fn new(target: P, command_runner: &'a C) -> Self { Self { target, command_runner, diff --git a/src/symbols/mariadb/dump.rs b/src/symbols/mariadb/dump.rs index 8276532..1b503fa 100644 --- a/src/symbols/mariadb/dump.rs +++ b/src/symbols/mariadb/dump.rs @@ -34,8 +34,8 @@ impl<'a, N, C: CommandRunner, S> Dump<'a, N, C, S> { impl, C: CommandRunner, S: Storage> Symbol for Dump<'_, N, C, S> { async fn target_reached(&self) -> Result> { let dump_date = self.storage.recent_date()?; - let _modified_date = self.run_sql(&format!("select UNIX_TIMESTAMP(MAX(UPDATE_TIME)) from information_schema.tables WHERE table_schema = '{}'", self.db_name.as_ref())).await?; - let modified_date = _modified_date.trim_end(); + let output = self.run_sql(&format!("select UNIX_TIMESTAMP(MAX(UPDATE_TIME)) from information_schema.tables WHERE table_schema = '{}'", self.db_name.as_ref())).await?; + let modified_date = output.trim_end(); Ok(modified_date != "NULL" && u64::from_str(modified_date)? <= dump_date) } diff --git a/src/symbols/systemd/user_session.rs b/src/symbols/systemd/user_session.rs index 5de3342..1f41d46 100644 --- a/src/symbols/systemd/user_session.rs +++ b/src/symbols/systemd/user_session.rs @@ -11,7 +11,7 @@ pub struct UserSession<'a, U, C> { } impl<'a, U, C> UserSession<'a, U, C> { - pub fn new(user_name: U, command_runner: &'a C) -> Self { + pub const fn new(user_name: U, command_runner: &'a C) -> Self { Self { user_name, command_runner, diff --git a/src/symbols/tls/csr.rs b/src/symbols/tls/csr.rs index 3b35681..4af3683 100644 --- a/src/symbols/tls/csr.rs +++ b/src/symbols/tls/csr.rs @@ -14,7 +14,7 @@ pub struct Csr { } impl Csr { - pub fn new(command_runner: C, domain: D, key_path: K, csr_path: P) -> Self { + pub const fn new(command_runner: C, domain: D, key_path: K, csr_path: P) -> Self { Self { command_runner, domain, diff --git a/src/symbols/tls/key.rs b/src/symbols/tls/key.rs index c5287c0..720d7ab 100644 --- a/src/symbols/tls/key.rs +++ b/src/symbols/tls/key.rs @@ -8,19 +8,17 @@ use std::path::Path; pub struct Key { file_path: P, command_runner: C, + bytes: u32, } impl Key { - pub fn new(command_runner: C, file_path: P) -> Self { + pub const fn new(command_runner: C, file_path: P) -> Self { Self { file_path, command_runner, + bytes: 4096, } } - - fn get_bytes(&self) -> u32 { - 4096 - } } #[async_trait(?Send)] @@ -57,7 +55,7 @@ impl> Symbol for Key { "genrsa", "-out", self.file_path.as_ref(), - self.get_bytes().to_string(), + self.bytes.to_string(), ], ) .await diff --git a/src/symbols/user.rs b/src/symbols/user.rs index 5d54f3f..db784a7 100644 --- a/src/symbols/user.rs +++ b/src/symbols/user.rs @@ -15,7 +15,7 @@ pub struct User { } impl User { - pub fn new(user_name: U, command_runner: C) -> Self { + pub const fn new(user_name: U, command_runner: C) -> Self { Self { user_name, command_runner, @@ -41,7 +41,7 @@ impl, C: CommandRunner> Symbol for User { // adduser is not reentrant because finding the next uid // and creating the account is not an atomic operation let wait = WAIT.acquire().await; - self + let res = self .command_runner .run_successfully( "adduser", @@ -51,7 +51,9 @@ impl, C: CommandRunner> Symbol for User { self.user_name.as_ref(), ], ) - .await + .await; + drop(wait); + res } } diff --git a/src/templates/nginx/server.rs b/src/templates/nginx/server.rs index fe7aa60..9f04bbd 100644 --- a/src/templates/nginx/server.rs +++ b/src/templates/nginx/server.rs @@ -1,6 +1,7 @@ use std::fmt::Display; use std::path::Path; +#[must_use] pub fn default_server>(challenges_snippet_path: P) -> String { format!( "server {{ @@ -12,6 +13,7 @@ pub fn default_server>(challenges_snippet_path: P) -> String { ) } +#[must_use] pub fn server_config, K: AsRef, T: Display, S: AsRef>( domain: D, cert_path: C, @@ -53,6 +55,7 @@ server {{ ) } +#[must_use] pub fn php_snippet, STATIC: AsRef>( index: &'static str, socket_path: SOCKET, @@ -71,6 +74,7 @@ pub fn php_snippet, STATIC: AsRef>( ) } +#[must_use] pub fn redir_snippet(target: &str) -> String { format!( "location / {{ @@ -85,6 +89,7 @@ pub trait SocketSpec { } impl> SocketSpec for T { + #[must_use] fn to_nginx(&self) -> String { format!("unix:{}:", self.as_ref().to_str().unwrap()) } @@ -94,17 +99,20 @@ impl> SocketSpec for T { pub struct LocalTcpSocket(usize); impl LocalTcpSocket { + #[must_use] pub const fn new(x: usize) -> Self { Self(x) } } impl SocketSpec for LocalTcpSocket { + #[must_use] fn to_nginx(&self) -> String { format!("localhost:{}", self.0) } } +#[must_use] pub fn proxy_snippet>( socket_path: &S, static_path: STATIC, @@ -125,6 +133,7 @@ pub fn proxy_snippet>( ) } +#[must_use] pub fn static_snippet>(static_path: S) -> String { format!( "root {}; @@ -134,6 +143,7 @@ pub fn static_snippet>(static_path: S) -> String { ) } +#[must_use] pub fn dokuwiki_snippet() -> String { " location ~ /(data/|conf/|bin/|inc/|install.php) { deny all; } @@ -149,6 +159,7 @@ pub fn dokuwiki_snippet() -> String { }".into() } +#[must_use] pub fn nextcloud_snippet() -> String { " client_max_body_size 500M; diff --git a/src/to_artifact.rs b/src/to_artifact.rs index e158f07..e45cda9 100644 --- a/src/to_artifact.rs +++ b/src/to_artifact.rs @@ -17,6 +17,8 @@ macro_rules! to_artifact { for_each_tuple!(to_artifact); impl ToArtifact for Option { + // FIXME: https://github.com/rust-lang/rust-clippy/issues/2843 + #![allow(clippy::use_self)] type Artifact = Option; }