Compare commits

..

No commits in common. "67b6f90fe0b1618195ace6eaddf73d6c94b25517" and "10edcd42826bca247f129c768507aaa1d5fe4c0a" have entirely different histories.

8 changed files with 141 additions and 197 deletions

View file

@ -1,36 +1,7 @@
use std::path::{Path as ActualPath, PathBuf}; use std::path::{Path as ActualPath, PathBuf};
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Path(PathBuf); pub struct Path(pub PathBuf);
// FIXME: This is a specialization since with Path: Into<PathBuf>
// it would overwrite impl<T> From <T> for T
//impl<T: Into<PathBuf>> From<T> for Path {
// fn from(v: T) -> Self {
// Path(v.into())
// }
//}
macro_rules! path_from {
( $t:ty ) => {
impl From<$t> for Path {
fn from(v: $t) -> Self {
Self(v.into())
}
}
};
}
path_from!(String);
path_from!(&str);
path_from!(PathBuf);
impl From<Path> for PathBuf {
fn from(v: Path) -> Self {
v.0
}
}
impl AsRef<ActualPath> for Path { impl AsRef<ActualPath> for Path {
fn as_ref(&self) -> &ActualPath { fn as_ref(&self) -> &ActualPath {
&self.0 &self.0

View file

@ -65,7 +65,7 @@ impl<D> SymbolBuilder<Key<D>> for DefaultBuilder {
target: &<Key<D> as Resource>::Artifact, target: &<Key<D> as Resource>::Artifact,
(): <Self::Prerequisites as ToArtifact>::Artifact, (): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
KeySymbol::new(StdCommandRunner, target.clone().into()) KeySymbol::new(StdCommandRunner, target.0.clone())
} }
} }
@ -84,8 +84,8 @@ impl<D: Clone> SymbolBuilder<Csr<D>> for DefaultBuilder {
CsrSymbol::new( CsrSymbol::new(
StdCommandRunner, StdCommandRunner,
resource.0.clone(), resource.0.clone(),
key.into(), key.0,
target.clone().into(), target.0.clone(),
) )
} }
} }
@ -124,11 +124,11 @@ impl<D: Clone> SymbolBuilder<Cert<D>> for DefaultBuilder {
CertSymbol::new( CertSymbol::new(
resource.0.clone(), resource.0.clone(),
SetuidCommandRunner::new(user_name.0, &StdCommandRunner), SetuidCommandRunner::new(user_name.0, &StdCommandRunner),
root_cert.into(), root_cert.0,
account_key.into(), account_key.0,
challenges_dir.into(), challenges_dir.0,
csr.into(), csr.0,
target.clone().into(), target.0.clone(),
) )
} }
} }
@ -145,7 +145,7 @@ impl<D: Clone> SymbolBuilder<CertChain<D>> for DefaultBuilder {
target: &<CertChain<D> as Resource>::Artifact, target: &<CertChain<D> as Resource>::Artifact,
(cert, root_cert): <Self::Prerequisites as ToArtifact>::Artifact, (cert, root_cert): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
ConcatSymbol::new([cert.into(), root_cert.into()], target.clone().into()) ConcatSymbol::new([cert.0, root_cert.0], target.0.clone())
} }
} }
@ -161,7 +161,7 @@ impl<D: Clone> SymbolBuilder<KeyAndCertBundle<D>> for DefaultBuilder {
target: &<KeyAndCertBundle<D> as Resource>::Artifact, target: &<KeyAndCertBundle<D> as Resource>::Artifact,
(cert_chain, key): <Self::Prerequisites as ToArtifact>::Artifact, (cert_chain, key): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
ConcatSymbol::new([key.into(), cert_chain.into()], target.clone().into()) ConcatSymbol::new([key.0, cert_chain.0], target.0.clone())
} }
} }
@ -210,7 +210,7 @@ impl SymbolBuilder<DefaultServer> for DefaultBuilder {
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
target.clone().into(), target.0.clone(),
nginx::default_server(challenges_snippet_path), nginx::default_server(challenges_snippet_path),
), ),
ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ReloadServiceSymbol::new(StdCommandRunner, "nginx"),
@ -239,8 +239,14 @@ impl<D: AsRef<str> + Clone + Display> SymbolBuilder<ServeCustom<D>> for DefaultB
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
target.clone().into(), target.0.clone(),
nginx::server_config(&resource.0, cert, key, &resource.1, challenges_snippet_path), nginx::server_config(
&resource.0,
cert.0,
key.0,
&resource.1,
challenges_snippet_path,
),
), ),
ReloadServiceSymbol::new(StdCommandRunner, "nginx"), ReloadServiceSymbol::new(StdCommandRunner, "nginx"),
) )
@ -274,11 +280,11 @@ impl<D: Clone + Display, P: AsRef<Path>> SymbolBuilder<ServePhp<D, P>> for Defau
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
target.clone().into(), target.0.clone(),
nginx::server_config( nginx::server_config(
&resource.0, &resource.0,
cert, cert.0,
key, key.0,
nginx::php_snippet(resource.2, &pool.0, &resource.1) + &resource.3, nginx::php_snippet(resource.2, &pool.0, &resource.1) + &resource.3,
challenges_snippet_path, challenges_snippet_path,
), ),
@ -323,11 +329,11 @@ impl<D: Clone + Display, P: Clone + AsRef<Path>> SymbolBuilder<ServeService<D, P
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
target.clone().into(), target.0.clone(),
nginx::server_config( nginx::server_config(
&resource.0, &resource.0,
cert, cert.0,
key, key.0,
nginx::proxy_snippet(&socket.0, &resource.3), nginx::proxy_snippet(&socket.0, &resource.3),
challenges_snippet_path, challenges_snippet_path,
), ),
@ -358,11 +364,11 @@ impl<D: AsRef<str> + Clone + Display> SymbolBuilder<ServeRedir<D>> for DefaultBu
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
target.clone().into(), target.0.clone(),
nginx::server_config( nginx::server_config(
&resource.0, &resource.0,
cert, cert.0,
key, key.0,
nginx::redir_snippet(resource.1.as_ref()), nginx::redir_snippet(resource.1.as_ref()),
challenges_snippet_path, challenges_snippet_path,
), ),
@ -395,11 +401,11 @@ impl<D: AsRef<str> + Clone + Display, P: AsRef<Path>> SymbolBuilder<ServeStatic<
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
target.clone().into(), target.0.clone(),
nginx::server_config( nginx::server_config(
&resource.0, &resource.0,
cert, cert.0,
key, key.0,
nginx::static_snippet(resource.1.as_ref()), nginx::static_snippet(resource.1.as_ref()),
challenges_snippet_path, challenges_snippet_path,
), ),
@ -424,8 +430,8 @@ impl<D: Clone> SymbolBuilder<PhpFpmPool<D>> for DefaultBuilder {
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
conf_path.clone().into(), conf_path.0.clone(),
php_fpm_pool_config(&user_name.0, &socket_path, resource.1), php_fpm_pool_config(&user_name.0, &socket_path.0, resource.1),
), ),
ReloadServiceSymbol::new(StdCommandRunner, service_name.0.clone()), ReloadServiceSymbol::new(StdCommandRunner, service_name.0.clone()),
) )
@ -448,7 +454,7 @@ impl<D, P: AsRef<Path>> SymbolBuilder<SystemdSocketService<D, P>> for DefaultBui
) -> Self::Symbol { ) -> Self::Symbol {
( (
FileSymbol::new( FileSymbol::new(
conf_path.clone().into(), conf_path.0.clone(),
if resource.4 { if resource.4 {
systemd_nodejs_service(&resource.2, socket_path, &resource.3) systemd_nodejs_service(&resource.2, socket_path, &resource.3)
} else { } else {
@ -462,7 +468,7 @@ impl<D, P: AsRef<Path>> SymbolBuilder<SystemdSocketService<D, P>> for DefaultBui
), ),
SystemdUserSessionSymbol::new(user_name.0.clone(), &StdCommandRunner), SystemdUserSessionSymbol::new(user_name.0.clone(), &StdCommandRunner),
UserServiceSymbol::new( UserServiceSymbol::new(
socket_path.clone().into(), socket_path.0.clone(),
user_name.0.clone(), user_name.0.clone(),
resource.1, resource.1,
&StdCommandRunner, &StdCommandRunner,
@ -511,7 +517,7 @@ impl<P: Clone + AsRef<Path>> SymbolBuilder<StoredDirectory<P>> for DefaultBuilde
) -> Self::Symbol { ) -> Self::Symbol {
SavedDirectorySymbol::new( SavedDirectorySymbol::new(
resource.1.clone(), resource.1.clone(),
SimpleStorage::new(target.clone().into()), SimpleStorage::new(target.0.clone()),
StorageDirection::Store, StorageDirection::Store,
StdCommandRunner, StdCommandRunner,
) )
@ -530,7 +536,7 @@ impl<P: Clone + AsRef<Path>> SymbolBuilder<LoadedDirectory<P>> for DefaultBuilde
) -> Self::Symbol { ) -> Self::Symbol {
SavedDirectorySymbol::new( SavedDirectorySymbol::new(
resource.1.clone(), resource.1.clone(),
SimpleStorage::new(target.clone().into()), SimpleStorage::new(target.0.clone()),
StorageDirection::Load, StorageDirection::Load,
StdCommandRunner, StdCommandRunner,
) )
@ -609,8 +615,8 @@ impl SymbolBuilder<AcmeChallengesDir> for DefaultBuilder {
user_name: <Self::Prerequisites as ToArtifact>::Artifact, user_name: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
( (
DirSymbol::new(target.clone().into()), DirSymbol::new(target.0.clone()),
OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner), OwnerSymbol::new(target.0.clone(), user_name.0, StdCommandRunner),
) )
} }
} }
@ -628,7 +634,7 @@ impl SymbolBuilder<AcmeChallengesNginxSnippet> for DefaultBuilder {
challenges_dir: <Self::Prerequisites as ToArtifact>::Artifact, challenges_dir: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
FileSymbol::new( FileSymbol::new(
target.clone().into(), target.0.clone(),
nginx::acme_challenges_snippet(challenges_dir), nginx::acme_challenges_snippet(challenges_dir),
) )
} }
@ -650,8 +656,8 @@ impl SymbolBuilder<AcmeAccountKey> for DefaultBuilder {
user_name: <Self::Prerequisites as ToArtifact>::Artifact, user_name: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
( (
KeySymbol::new(StdCommandRunner, target.clone().into()), KeySymbol::new(StdCommandRunner, target.0.clone()),
OwnerSymbol::new(target.clone().into(), user_name.0, StdCommandRunner), OwnerSymbol::new(target.0.clone(), user_name.0, StdCommandRunner),
) )
} }
} }
@ -666,7 +672,7 @@ impl SymbolBuilder<AcmeRootCert> for DefaultBuilder {
target: &<AcmeRootCert as Resource>::Artifact, target: &<AcmeRootCert as Resource>::Artifact,
(): <Self::Prerequisites as ToArtifact>::Artifact, (): <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
FileSymbol::new(target.clone().into(), LETS_ENCRYPT_X3_CROSS_SIGNED) FileSymbol::new(target.0.clone(), LETS_ENCRYPT_X3_CROSS_SIGNED)
} }
} }
@ -699,7 +705,7 @@ impl<D: Clone> SymbolBuilder<MariaDbDatabase<D>> for DefaultBuilder {
(db_name, _, data_path): &<MariaDbDatabase<D> as Resource>::Artifact, (db_name, _, data_path): &<MariaDbDatabase<D> as Resource>::Artifact,
_: <Self::Prerequisites as ToArtifact>::Artifact, _: <Self::Prerequisites as ToArtifact>::Artifact,
) -> Self::Symbol { ) -> Self::Symbol {
let db_dump = SimpleStorage::new(data_path.clone().into()); let db_dump = SimpleStorage::new(data_path.0.clone());
( (
MariaDbDatabaseSymbol::new(db_name.0.clone(), db_dump.clone(), &StdCommandRunner), MariaDbDatabaseSymbol::new(db_name.0.clone(), db_dump.clone(), &StdCommandRunner),
MariaDbDumpSymbol::new(db_name.0.clone(), db_dump, &StdCommandRunner), MariaDbDumpSymbol::new(db_name.0.clone(), db_dump, &StdCommandRunner),

View file

@ -54,7 +54,7 @@ impl<P, D: AsRef<str>> ResourceLocator<Key<D>> for DefaultLocator<P> {
type Prerequisites = Dir<PathBuf>; type Prerequisites = Dir<PathBuf>;
fn locate(resource: &Key<D>) -> (<Key<D> as Resource>::Artifact, Self::Prerequisites) { fn locate(resource: &Key<D>) -> (<Key<D> as Resource>::Artifact, Self::Prerequisites) {
( (
PathArtifact::from(format!("/etc/ssl/private/{}.key", resource.0.as_ref())), PathArtifact(format!("/etc/ssl/private/{}.key", resource.0.as_ref()).into()),
Dir("/etc/ssl/private".into()), Dir("/etc/ssl/private".into()),
) )
} }
@ -64,7 +64,7 @@ impl<P, D: AsRef<str>> ResourceLocator<Csr<D>> for DefaultLocator<P> {
type Prerequisites = Dir<PathBuf>; type Prerequisites = Dir<PathBuf>;
fn locate(resource: &Csr<D>) -> (<Csr<D> as Resource>::Artifact, Self::Prerequisites) { fn locate(resource: &Csr<D>) -> (<Csr<D> as Resource>::Artifact, Self::Prerequisites) {
( (
PathArtifact::from(format!("/etc/ssl/local_certs/{}.csr", resource.0.as_ref())), PathArtifact(format!("/etc/ssl/local_certs/{}.csr", resource.0.as_ref()).into()),
Dir("/etc/ssl/local_certs".into()), Dir("/etc/ssl/local_certs".into()),
) )
} }
@ -74,7 +74,7 @@ impl<P, D: AsRef<str>> ResourceLocator<Cert<D>> for DefaultLocator<P> {
type Prerequisites = Dir<PathBuf>; type Prerequisites = Dir<PathBuf>;
fn locate(resource: &Cert<D>) -> (<Cert<D> as Resource>::Artifact, Self::Prerequisites) { fn locate(resource: &Cert<D>) -> (<Cert<D> as Resource>::Artifact, Self::Prerequisites) {
( (
PathArtifact::from(format!("/etc/ssl/local_certs/{}.crt", resource.0.as_ref())), PathArtifact(format!("/etc/ssl/local_certs/{}.crt", resource.0.as_ref()).into()),
Dir("/etc/ssl/local_certs".into()), Dir("/etc/ssl/local_certs".into()),
) )
} }
@ -86,10 +86,7 @@ impl<P, D: AsRef<str>> ResourceLocator<CertChain<D>> for DefaultLocator<P> {
resource: &CertChain<D>, resource: &CertChain<D>,
) -> (<CertChain<D> as Resource>::Artifact, Self::Prerequisites) { ) -> (<CertChain<D> as Resource>::Artifact, Self::Prerequisites) {
( (
PathArtifact::from(format!( PathArtifact(format!("/etc/ssl/local_certs/{}.chained.crt", resource.0.as_ref()).into()),
"/etc/ssl/local_certs/{}.chained.crt",
resource.0.as_ref()
)),
Dir("/etc/ssl/local_certs".into()), Dir("/etc/ssl/local_certs".into()),
) )
} }
@ -104,10 +101,7 @@ impl<P, D: AsRef<str>> ResourceLocator<KeyAndCertBundle<D>> for DefaultLocator<P
Self::Prerequisites, Self::Prerequisites,
) { ) {
( (
PathArtifact::from(format!( PathArtifact(format!("/etc/ssl/private/{}.with_key.crt", resource.0.as_ref()).into()),
"/etc/ssl/private/{}.with_key.crt",
resource.0.as_ref()
)),
Dir("/etc/ssl/private".into()), Dir("/etc/ssl/private".into()),
) )
} }
@ -158,7 +152,7 @@ impl<POLICY: Policy, P: AsRef<Path>> ResourceLocator<StoredDirectory<P>>
<StoredDirectory<P> as Resource>::Artifact, <StoredDirectory<P> as Resource>::Artifact,
Self::Prerequisites, Self::Prerequisites,
) { ) {
(PathArtifact::from(POLICY::path_for_data(resource.0)), ()) (PathArtifact(POLICY::path_for_data(resource.0)), ())
} }
} }
@ -173,7 +167,7 @@ impl<POLICY: Policy, P: AsRef<Path>> ResourceLocator<LoadedDirectory<P>>
Self::Prerequisites, Self::Prerequisites,
) { ) {
( (
PathArtifact::from(POLICY::path_for_data(resource.0)), PathArtifact(POLICY::path_for_data(resource.0)),
Dir(resource.1.as_ref().parent().unwrap().into()), Dir(resource.1.as_ref().parent().unwrap().into()),
) )
} }
@ -186,7 +180,7 @@ impl<P: Policy> ResourceLocator<AcmeAccountKey> for DefaultLocator<P> {
) -> (<AcmeAccountKey as Resource>::Artifact, Self::Prerequisites) { ) -> (<AcmeAccountKey as Resource>::Artifact, Self::Prerequisites) {
let acme_user = P::acme_user(); let acme_user = P::acme_user();
let home = P::user_home(acme_user); let home = P::user_home(acme_user);
(PathArtifact::from(home.join("account.key")), Dir(home)) (PathArtifact(home.join("account.key")), Dir(home))
} }
} }
@ -208,7 +202,7 @@ impl<P: Policy> ResourceLocator<AcmeChallengesDir> for DefaultLocator<P> {
) { ) {
let acme_user = P::acme_user(); let acme_user = P::acme_user();
let home = P::user_home(acme_user); let home = P::user_home(acme_user);
(PathArtifact::from(home.join("challenges")), Dir(home)) (PathArtifact(home.join("challenges")), Dir(home))
} }
} }
@ -221,7 +215,7 @@ impl<P: Policy> ResourceLocator<AcmeChallengesNginxSnippet> for DefaultLocator<P
Self::Prerequisites, Self::Prerequisites,
) { ) {
( (
PathArtifact::from("/etc/nginx/snippets/acme-challenge.conf"), PathArtifact("/etc/nginx/snippets/acme-challenge.conf".into()),
(), (),
) )
} }
@ -235,7 +229,7 @@ impl<P: Policy> ResourceLocator<AcmeRootCert> for DefaultLocator<P> {
let acme_user = P::acme_user(); let acme_user = P::acme_user();
let home = P::user_home(acme_user); let home = P::user_home(acme_user);
( (
PathArtifact::from(home.join("lets_encrypt_x3_cross_signed.pem")), PathArtifact(home.join("lets_encrypt_x3_cross_signed.pem")),
Dir(home), Dir(home),
) )
} }
@ -251,7 +245,7 @@ impl<P: Policy, D: AsRef<str>> ResourceLocator<UserForDomain<D>> for DefaultLoca
) { ) {
let user_name = P::user_name_for_domain(resource.0.as_ref()); let user_name = P::user_name_for_domain(resource.0.as_ref());
let home = P::user_home(&user_name); let home = P::user_home(&user_name);
((UserNameArtifact(user_name), PathArtifact::from(home)), ()) ((UserNameArtifact(user_name), PathArtifact(home)), ())
} }
} }
@ -274,7 +268,7 @@ impl<P> ResourceLocator<DefaultServer> for DefaultLocator<P> {
fn locate( fn locate(
_resource: &DefaultServer, _resource: &DefaultServer,
) -> (<DefaultServer as Resource>::Artifact, Self::Prerequisites) { ) -> (<DefaultServer as Resource>::Artifact, Self::Prerequisites) {
(PathArtifact::from("/etc/nginx/sites-enabled/default"), ()) (PathArtifact("/etc/nginx/sites-enabled/default".into()), ())
} }
} }
@ -284,7 +278,7 @@ impl<D: AsRef<Path>, POLICY> ResourceLocator<ServeCustom<D>> for DefaultLocator<
resource: &ServeCustom<D>, resource: &ServeCustom<D>,
) -> (<ServeCustom<D> as Resource>::Artifact, Self::Prerequisites) { ) -> (<ServeCustom<D> as Resource>::Artifact, Self::Prerequisites) {
( (
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(), (),
) )
} }
@ -296,7 +290,7 @@ impl<D: AsRef<Path>, P, POLICY> ResourceLocator<ServePhp<D, P>> for DefaultLocat
resource: &ServePhp<D, P>, resource: &ServePhp<D, P>,
) -> (<ServePhp<D, P> as Resource>::Artifact, Self::Prerequisites) { ) -> (<ServePhp<D, P> as Resource>::Artifact, Self::Prerequisites) {
( (
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(), (),
) )
} }
@ -311,7 +305,7 @@ impl<D: AsRef<Path>, P, POLICY> ResourceLocator<ServeService<D, P>> for DefaultL
Self::Prerequisites, Self::Prerequisites,
) { ) {
( (
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(), (),
) )
} }
@ -323,7 +317,7 @@ impl<D: AsRef<Path>, POLICY> ResourceLocator<ServeRedir<D>> for DefaultLocator<P
resource: &ServeRedir<D>, resource: &ServeRedir<D>,
) -> (<ServeRedir<D> as Resource>::Artifact, Self::Prerequisites) { ) -> (<ServeRedir<D> as Resource>::Artifact, Self::Prerequisites) {
( (
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(), (),
) )
} }
@ -338,7 +332,7 @@ impl<D: AsRef<Path>, P, POLICY> ResourceLocator<ServeStatic<D, P>> for DefaultLo
Self::Prerequisites, Self::Prerequisites,
) { ) {
( (
PathArtifact::from(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)), PathArtifact(("/etc/nginx/sites-enabled/".as_ref() as &Path).join(&resource.0)),
(), (),
) )
} }
@ -353,11 +347,8 @@ impl<D: Clone + AsRef<str>, P: Policy> ResourceLocator<PhpFpmPool<D>> for Defaul
let php_version = P::php_version(); let php_version = P::php_version();
( (
( (
PathArtifact::from(format!("/run/php/{}.sock", user.0)), PathArtifact(format!("/run/php/{}.sock", user.0).into()),
PathArtifact::from(format!( PathArtifact(format!("/etc/php/{}/fpm/pool.d/{}.conf", php_version, user.0).into()),
"/etc/php/{}/fpm/pool.d/{}.conf",
php_version, user.0
)),
user, user,
ServiceNameArtifact(format!("php{}-fpm", php_version)), ServiceNameArtifact(format!("php{}-fpm", php_version)),
), ),
@ -377,12 +368,12 @@ impl<D: Clone + AsRef<str>, P, POLICY: Policy> ResourceLocator<SystemdSocketServ
Self::Prerequisites, Self::Prerequisites,
) { ) {
let ((user_name, home_path), ()) = Self::locate(&UserForDomain(&resource.0)); let ((user_name, home_path), ()) = Self::locate(&UserForDomain(&resource.0));
let config = home_path.as_ref().join(".config"); let config = home_path.0.join(".config");
let service_dir_path = config.join("systemd/user"); let service_dir_path = config.join("systemd/user");
( (
( (
PathArtifact::from(format!("/var/tmp/{}-{}.socket", user_name.0, resource.1)), PathArtifact(format!("/var/tmp/{}-{}.socket", user_name.0, resource.1).into()),
PathArtifact::from(service_dir_path.join(format!("{}.service", resource.1))), PathArtifact(service_dir_path.join(format!("{}.service", resource.1))),
user_name.clone(), user_name.clone(),
), ),
(Dir(service_dir_path), Owner(user_name.0, config)), (Dir(service_dir_path), Owner(user_name.0, config)),
@ -403,7 +394,7 @@ impl<D: AsRef<str>, P: Policy> ResourceLocator<MariaDbDatabase<D>> for DefaultLo
( (
DatabaseNameArtifact(user_name.0.clone()), DatabaseNameArtifact(user_name.0.clone()),
user_name.clone(), user_name.clone(),
PathArtifact::from(P::path_for_data(format!("{}.sql", user_name.0))), PathArtifact(P::path_for_data(format!("{}.sql", user_name.0))),
), ),
(), (),
) )

View file

@ -22,6 +22,12 @@ pub enum SymbolRunError {
} }
impl Error for SymbolRunError { impl Error for SymbolRunError {
fn description(&self) -> &str {
match self {
Self::Symbol(_) => "Symbol execution error",
Self::ExecuteDidNotReach(_) => "Target not reached after executing symbol",
}
}
fn cause(&self) -> Option<&dyn Error> { fn cause(&self) -> Option<&dyn Error> {
match self { match self {
Self::Symbol(ref e) => Some(&**e), Self::Symbol(ref e) => Some(&**e),
@ -34,7 +40,7 @@ impl fmt::Display for SymbolRunError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {
Self::Symbol(ref e) => write!(f, "{}", e), Self::Symbol(ref e) => write!(f, "{}", e),
Self::ExecuteDidNotReach(_) => write!(f, "Target not reached after executing symbol"), Self::ExecuteDidNotReach(_) => write!(f, "{}", self.description()),
} }
} }
} }
@ -149,6 +155,7 @@ where
} }
} }
/*
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use std::cell::RefCell; use std::cell::RefCell;
@ -165,7 +172,11 @@ mod test {
Error(()), Error(()),
} }
impl Error for DummySymbolError {} impl Error for DummySymbolError {
fn description(&self) -> &str {
return "Description";
}
}
impl fmt::Display for DummySymbolError { impl fmt::Display for DummySymbolError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
@ -174,39 +185,28 @@ mod test {
} }
#[derive(Debug)] #[derive(Debug)]
struct DummySymbol<T, E> { struct DummySymbol<'a> {
_target_reached: RefCell<T>, _execute: &'a dyn Fn() -> Result<(), Box<dyn Error>>,
_execute: RefCell<E>, _target_reached: &'a dyn Fn() -> Result<bool, Box<dyn Error>>,
} }
impl< impl<'b> Symbol for DummySymbol<'b> {
E: Iterator<Item = Result<(), Box<dyn Error>>>,
T: Iterator<Item = Result<bool, Box<dyn Error>>>,
> Symbol for DummySymbol<T, E>
{
fn target_reached(&self) -> Result<bool, Box<dyn Error>> { fn target_reached(&self) -> Result<bool, Box<dyn Error>> {
self._target_reached.borrow_mut().next().unwrap() (self._target_reached)()
} }
fn execute(&self) -> Result<(), Box<dyn Error>> { fn execute(&self) -> Result<(), Box<dyn Error>> {
self._execute.borrow_mut().next().unwrap() (self._execute)()
} }
} }
impl< impl<'a> DummySymbol<'a> {
E: Iterator<Item = Result<(), Box<dyn Error>>>, fn new(
T: Iterator<Item = Result<bool, Box<dyn Error>>>, target_reached: &'a dyn Fn() -> Result<bool, Box<dyn Error>>,
> DummySymbol<T, E> execute: &'a dyn Fn() -> Result<(), Box<dyn Error>>,
{ ) -> DummySymbol<'a> {
fn new< DummySymbol {
IE: IntoIterator<IntoIter = E, Item = Result<(), Box<dyn Error>>>, _target_reached: target_reached,
IT: IntoIterator<IntoIter = T, Item = Result<bool, Box<dyn Error>>>, _execute: execute,
>(
target_reached: IT,
execute: IE,
) -> Self {
Self {
_target_reached: RefCell::new(target_reached.into_iter()),
_execute: RefCell::new(execute.into_iter()),
} }
} }
} }
@ -223,37 +223,44 @@ mod test {
impl Logger for DummyLogger { impl Logger for DummyLogger {
fn write(&mut self, line: &str) { fn write(&mut self, line: &str) {
self.log.push(line.into()); self.log.push(From::from(line));
} }
fn debug(&mut self, line: &str) { fn debug(&mut self, line: &str) {
self.log.push(line.into()); self.log.push(From::from(line));
} }
} }
#[test] #[test]
fn nothing_needed_to_be_done() { fn nothing_needed_to_be_done() {
let result = InitializingSymbolRunner::new(DummyLogger::new()) let result = InitializingSymbolRunner::new(DummyLogger::new())
.run_symbol(&DummySymbol::new(vec![Ok(true)], vec![Ok(())]), false); .run_symbol(&DummySymbol::new(&|| Ok(true), &|| Ok(())));
assert!(result.is_ok()); assert!(result.is_ok());
} }
#[test] #[test]
fn everything_is_ok() { fn everything_is_ok() {
let result = InitializingSymbolRunner::new(DummyLogger::new()).run_symbol( let first = RefCell::new(true);
&DummySymbol::new(vec![Ok(true), Ok(false)], vec![Ok(())]), let result = InitializingSymbolRunner::new(DummyLogger::new()).run_symbol(&DummySymbol::new(
false, &|| {
); let mut _first = first.borrow_mut();
Ok(if *_first {
*_first = false;
true
} else {
false
})
},
&|| Ok(()),
));
assert!(result.is_ok()); assert!(result.is_ok());
} }
#[test] #[test]
fn executing_did_not_change_state() { fn executing_did_not_change_state() {
let result = InitializingSymbolRunner::new(DummyLogger::new()).run_symbol( let result = InitializingSymbolRunner::new(DummyLogger::new())
&DummySymbol::new(vec![Ok(false), Ok(false)], vec![Ok(())]), .run_symbol(&DummySymbol::new(&|| Ok(false), &|| Ok(())));
false,
);
assert_eq!( assert_eq!(
result.unwrap_err().to_string(), result.unwrap_err().description(),
"Target not reached after executing symbol" "Target not reached after executing symbol"
); );
} }
@ -261,14 +268,11 @@ mod test {
#[test] #[test]
fn executing_did_not_work() { fn executing_did_not_work() {
let err = InitializingSymbolRunner::new(DummyLogger::new()) let err = InitializingSymbolRunner::new(DummyLogger::new())
.run_symbol( .run_symbol(&DummySymbol::new(&|| Ok(false), &|| {
&DummySymbol::new( Err(Box::new(DummySymbolError::Error(())))
vec![Ok(false)], }))
vec![Err(Box::new(DummySymbolError::Error(())) as Box<dyn Error>)],
),
false,
)
.unwrap_err(); .unwrap_err();
assert_eq!(err.to_string(), "Dummy symbol error"); assert_eq!(err.description(), "Description");
} }
} }
*/

View file

@ -348,49 +348,24 @@ mod test {
#[test] #[test]
fn correctly_handles_symbol_tuples() { fn correctly_handles_symbol_tuples() {
let (count, setup) = get_setup(); let (count, setup) = get_setup();
setup setup.run_symbol((TestSymbol { reached: false }, TestSymbol { reached: false }), false).unwrap();
.run_symbol(
(TestSymbol { reached: false }, TestSymbol { reached: false }),
false,
)
.unwrap();
assert_eq!(*count.borrow(), 2); assert_eq!(*count.borrow(), 2);
let (count, setup) = get_setup(); let (count, setup) = get_setup();
setup setup.run_symbol((TestSymbol { reached: true }, TestSymbol { reached: false }), false).unwrap();
.run_symbol(
(TestSymbol { reached: true }, TestSymbol { reached: false }),
false,
)
.unwrap();
assert_eq!(*count.borrow(), 1); assert_eq!(*count.borrow(), 1);
// An unreached symbol forces all further symbols // An unreached symbol forces all further symbols
let (count, setup) = get_setup(); let (count, setup) = get_setup();
setup setup.run_symbol((TestSymbol { reached: false }, TestSymbol { reached: true }), false).unwrap();
.run_symbol(
(TestSymbol { reached: false }, TestSymbol { reached: true }),
false,
)
.unwrap();
assert_eq!(*count.borrow(), 2); assert_eq!(*count.borrow(), 2);
let (count, setup) = get_setup(); let (count, setup) = get_setup();
setup setup.run_symbol((TestSymbol { reached: true }, TestSymbol { reached: true }), false).unwrap();
.run_symbol(
(TestSymbol { reached: true }, TestSymbol { reached: true }),
false,
)
.unwrap();
assert_eq!(*count.borrow(), 0); assert_eq!(*count.borrow(), 0);
let (count, setup) = get_setup(); let (count, setup) = get_setup();
setup setup.run_symbol((TestSymbol { reached: true }, TestSymbol { reached: true }), true).unwrap();
.run_symbol(
(TestSymbol { reached: true }, TestSymbol { reached: true }),
true,
)
.unwrap();
assert_eq!(*count.borrow(), 2); assert_eq!(*count.borrow(), 2);
} }
} }

View file

@ -40,7 +40,7 @@ impl<C: CommandRunner, P: AsRef<Path>> Symbol for Key<C, P> {
], ],
)?; )?;
// FIXME check bytes // FIXME check bytes
Ok(stdout.ends_with(b"RSA key ok\n")) Ok(stdout.ends_with("RSA key ok\n".as_bytes()))
} }
fn execute(&self) -> Result<(), Box<dyn Error>> { fn execute(&self) -> Result<(), Box<dyn Error>> {

View file

@ -30,17 +30,11 @@ fn runs_only_once() {
}; };
let mut setup = Setup::new(runner); let mut setup = Setup::new(runner);
assert_eq!( assert_eq!(
(setup.add(Csr("somehost")).unwrap().0) (setup.add(Csr("somehost")).unwrap().0).0.to_str().unwrap(),
.as_ref()
.to_str()
.unwrap(),
"/etc/ssl/local_certs/somehost.csr", "/etc/ssl/local_certs/somehost.csr",
); );
assert_eq!( assert_eq!(
(setup.add(Csr("somehost")).unwrap().0) (setup.add(Csr("somehost")).unwrap().0).0.to_str().unwrap(),
.as_ref()
.to_str()
.unwrap(),
"/etc/ssl/local_certs/somehost.csr", "/etc/ssl/local_certs/somehost.csr",
); );
assert_eq!(*count.borrow(), 2 + 5); // Key and CSR + 5 dirs assert_eq!(*count.borrow(), 2 + 5); // Key and CSR + 5 dirs
@ -54,10 +48,7 @@ fn can_create_an_acme_cert() {
}; };
let mut setup = Setup::new(runner); let mut setup = Setup::new(runner);
assert_eq!( assert_eq!(
(setup.add(Cert("somehost")).unwrap().0) (setup.add(Cert("somehost")).unwrap().0).0.to_str().unwrap(),
.as_ref()
.to_str()
.unwrap(),
"/etc/ssl/local_certs/somehost.crt", "/etc/ssl/local_certs/somehost.crt",
); );
assert_eq!(*count.borrow(), 15); assert_eq!(*count.borrow(), 15);

View file

@ -103,12 +103,12 @@ fn empty_storage() {
); );
assert!(storage.read_filename().is_err()); assert!(storage.read_filename().is_err());
assert_eq!( assert_eq!(
storage.read_filename().unwrap_err().to_string(), storage.read_filename().unwrap_err().description(),
"entity not found" "entity not found"
); );
assert!(storage.recent_date().is_err()); assert!(storage.recent_date().is_err());
assert_eq!( assert_eq!(
storage.recent_date().unwrap_err().to_string(), storage.recent_date().unwrap_err().description(),
"entity not found" "entity not found"
); );
} }
@ -125,11 +125,14 @@ fn empty_storage_for_filename() {
); );
assert!(storage.read_filename().is_err()); assert!(storage.read_filename().is_err());
assert_eq!( assert_eq!(
storage.read_filename().unwrap_err().to_string(), storage.read_filename().unwrap_err().description(),
"Not found" "Not found"
); );
assert!(storage.recent_date().is_err()); assert!(storage.recent_date().is_err());
assert_eq!(storage.recent_date().unwrap_err().to_string(), "Not found"); assert_eq!(
storage.recent_date().unwrap_err().description(),
"Not found"
);
} }
#[test] #[test]
@ -144,9 +147,12 @@ fn bad_file() {
); );
assert!(storage.read_filename().is_err()); assert!(storage.read_filename().is_err());
assert_eq!( assert_eq!(
storage.read_filename().unwrap_err().to_string(), storage.read_filename().unwrap_err().description(),
"Not found" "Not found"
); );
assert!(storage.recent_date().is_err()); assert!(storage.recent_date().is_err());
assert_eq!(storage.recent_date().unwrap_err().to_string(), "Not found"); assert_eq!(
storage.recent_date().unwrap_err().description(),
"Not found"
);
} }