Browse Source

Don't return actions from SymbolFactory

master
Adrian Heine 5 years ago
parent
commit
8069164109
  1. 113
      src/symbols/factory.rs
  2. 20
      src/symbols/list.rs

113
src/symbols/factory.rs

@ -9,14 +9,14 @@ use symbols::cron::Cron;
use symbols::file::File; use symbols::file::File;
use symbols::git::checkout::GitCheckout; use symbols::git::checkout::GitCheckout;
use symbols::hook::Hook; use symbols::hook::Hook;
use symbols::list::ListAction;
use symbols::list::List;
use symbols::mariadb::{DatabaseDump, MariaDBDatabase, MariaDBUser}; use symbols::mariadb::{DatabaseDump, MariaDBDatabase, MariaDBUser};
use symbols::nginx::server::{php_server_config_snippet, server_config, NginxServer}; use symbols::nginx::server::{php_server_config_snippet, server_config, NginxServer};
use symbols::owner::Owner; use symbols::owner::Owner;
use symbols::stored_directory::{StorageDirection, StoredDirectory}; use symbols::stored_directory::{StorageDirection, StoredDirectory};
use symbols::systemd::reload::ReloadService; use symbols::systemd::reload::ReloadService;
use symbols::tls::SelfSignedTlsCert; use symbols::tls::SelfSignedTlsCert;
use symbols::{Action, Symbol, SymbolRunner};
use symbols::{Symbol, SymbolRunner};
pub trait Policy { pub trait Policy {
fn user_name_for_host(&self, host_name: &'static str) -> String; fn user_name_for_host(&self, host_name: &'static str) -> String;
@ -57,42 +57,37 @@ impl<'b, C: 'b + CommandRunner, R: 'b + SymbolRunner, P: 'b + Policy> SymbolFact
&'c self, &'c self,
host: &'static str, host: &'static str,
nginx_server_symbol: S, nginx_server_symbol: S,
) -> Box<dyn Action + 'a> {
Box::new(ListAction::new(vec![
Box::new(SelfSignedTlsCert::new(host.into(), self.command_runner))
.into_action(self.symbol_runner),
Box::new(Hook::new(
) -> impl Symbol + 'a {
List::from((
SelfSignedTlsCert::new(host.into(), self.command_runner),
Hook::new(
nginx_server_symbol, nginx_server_symbol,
ReloadService::new("nginx", self.command_runner), ReloadService::new("nginx", self.command_runner),
))
.into_action(self.symbol_runner),
Box::new(AcmeCert::new(host.into(), &self.acme_command_runner))
.into_action(self.symbol_runner),
Box::new(Hook::new(
),
AcmeCert::new(host.into(), &self.acme_command_runner),
Hook::new(
AcmeCertChain::new(host.into(), &self.acme_command_runner), AcmeCertChain::new(host.into(), &self.acme_command_runner),
ReloadService::new("nginx", self.command_runner), ReloadService::new("nginx", self.command_runner),
),
)) ))
.into_action(self.symbol_runner),
]))
} }
pub fn get_nginx_acme_challenge_config<'a>(&'a self) -> Box<dyn Action + 'a> {
Box::new(File::new(
pub fn get_nginx_acme_challenge_config<'a>(&'a self) -> impl Symbol + 'a {
File::new(
"/etc/nginx/snippets/acme-challenge.conf", "/etc/nginx/snippets/acme-challenge.conf",
"location ^~ /.well-known/acme-challenge/ { "location ^~ /.well-known/acme-challenge/ {
alias /home/acme/challenges/; alias /home/acme/challenges/;
try_files $uri =404; try_files $uri =404;
}", }",
))
.into_action(self.symbol_runner)
)
} }
fn get_php_fpm_pool_socket_path<'a>(&'a self, user_name: &str) -> String { fn get_php_fpm_pool_socket_path<'a>(&'a self, user_name: &str) -> String {
format!("/run/php/{}.sock", user_name) format!("/run/php/{}.sock", user_name)
} }
fn get_php_fpm_pool<'a>(&'a self, user_name: &str) -> Box<dyn Action + 'a> {
fn get_php_fpm_pool<'a>(&'a self, user_name: &str) -> impl Symbol + 'a {
let socket = self.get_php_fpm_pool_socket_path(user_name); let socket = self.get_php_fpm_pool_socket_path(user_name);
Box::new(Hook::new(
Hook::new(
File::new( File::new(
format!("/etc/php/7.0/fpm/pool.d/{}.conf", user_name), format!("/etc/php/7.0/fpm/pool.d/{}.conf", user_name),
format!( format!(
@ -111,8 +106,7 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
), ),
), ),
ReloadService::new("php7.0-fpm", self.command_runner), ReloadService::new("php7.0-fpm", self.command_runner),
))
.into_action(self.symbol_runner)
)
} }
pub fn serve_php<'a>( pub fn serve_php<'a>(
@ -120,10 +114,10 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
host_name: &'static str, host_name: &'static str,
root_dir: Cow<'a, str>, root_dir: Cow<'a, str>,
additional_config: &'a str, additional_config: &'a str,
) -> Box<dyn Action + 'a> {
) -> impl Symbol + 'a {
let user_name = self.policy.user_name_for_host(host_name); let user_name = self.policy.user_name_for_host(host_name);
let socket = self.get_php_fpm_pool_socket_path(&user_name); let socket = self.get_php_fpm_pool_socket_path(&user_name);
Box::new(ListAction::new(vec![
List::from((
self.get_php_fpm_pool(&user_name), self.get_php_fpm_pool(&user_name),
self.get_nginx_acme_server( self.get_nginx_acme_server(
host_name, host_name,
@ -135,14 +129,14 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
additional_config, additional_config,
), ),
), ),
]))
))
} }
pub fn serve_wordpress<'a>( pub fn serve_wordpress<'a>(
&'a self, &'a self,
host_name: &'static str, host_name: &'static str,
root_dir: Cow<'a, str>, root_dir: Cow<'a, str>,
) -> Box<dyn Action + 'a> {
) -> impl Symbol + 'a {
self.serve_php( self.serve_php(
host_name, host_name,
root_dir, root_dir,
@ -158,10 +152,10 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
&'a self, &'a self,
host_name: &'static str, host_name: &'static str,
root_dir: &'static str, root_dir: &'static str,
) -> Box<dyn Action + 'a> {
) -> impl Symbol + 'a {
let user_name = self.policy.user_name_for_host(host_name); let user_name = self.policy.user_name_for_host(host_name);
let socket = self.get_php_fpm_pool_socket_path(&user_name); let socket = self.get_php_fpm_pool_socket_path(&user_name);
Box::new(ListAction::new(vec![
List::from((
self.get_php_fpm_pool(&user_name), self.get_php_fpm_pool(&user_name),
self.get_nginx_acme_server(host_name, self.get_nginx_acme_server(host_name,
NginxServer::new( NginxServer::new(
@ -190,14 +184,14 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
socket)), socket)),
self.command_runner self.command_runner
)) ))
]))
))
} }
pub fn serve_nextcloud<'a>( pub fn serve_nextcloud<'a>(
&'a self, &'a self,
host_name: &'static str, host_name: &'static str,
root_dir: Cow<'a, str>, root_dir: Cow<'a, str>,
) -> Box<dyn Action + 'a> {
) -> impl Symbol + 'a {
self.serve_php( self.serve_php(
host_name, host_name,
root_dir, root_dir,
@ -257,14 +251,14 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
&'a self, &'a self,
host_name: &'static str, host_name: &'static str,
target: &'static str, target: &'static str,
) -> Box<dyn Action + 'a> {
) -> impl Symbol + 'a {
self.get_nginx_acme_server( self.get_nginx_acme_server(
host_name, host_name,
NginxServer::new_redir(host_name, target, self.command_runner), NginxServer::new_redir(host_name, target, self.command_runner),
) )
} }
pub fn serve_static<'a>(&'a self, host_name: &'static str, dir: &'a str) -> Box<dyn Action + 'a> {
pub fn serve_static<'a>(&'a self, host_name: &'static str, dir: &'a str) -> impl Symbol + 'a {
self.get_nginx_acme_server( self.get_nginx_acme_server(
host_name, host_name,
NginxServer::new_static(host_name, dir, self.command_runner), NginxServer::new_static(host_name, dir, self.command_runner),
@ -275,47 +269,42 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
&'a self, &'a self,
storage_name: &'static str, storage_name: &'static str,
target: T, target: T,
) -> (Box<dyn Action + 'a>, Box<dyn Action + 'a>) {
) -> (impl Symbol + 'a, impl Symbol + 'a) {
let data = SimpleStorage::new("/root/data".to_string(), storage_name.to_string()); let data = SimpleStorage::new("/root/data".to_string(), storage_name.to_string());
let string_target = target.into(); let string_target = target.into();
( (
Box::new(StoredDirectory::new(
StoredDirectory::new(
string_target.clone().into(), string_target.clone().into(),
data.clone(), data.clone(),
StorageDirection::Save, StorageDirection::Save,
self.command_runner, self.command_runner,
))
.into_action(self.symbol_runner),
Box::new(StoredDirectory::new(
),
StoredDirectory::new(
string_target.into(), string_target.into(),
data.clone(), data.clone(),
StorageDirection::Load, StorageDirection::Load,
self.command_runner, self.command_runner,
))
.into_action(self.symbol_runner),
),
) )
} }
pub fn get_mariadb_database<'a>(&'a self, name: &'static str) -> Box<dyn Action + 'a> {
pub fn get_mariadb_database<'a>(&'a self, name: &'static str) -> impl Symbol + 'a {
let db_dump = SimpleStorage::new("/root/data".to_string(), format!("{}.sql", name)); let db_dump = SimpleStorage::new("/root/data".to_string(), format!("{}.sql", name));
Box::new(ListAction::new(vec![
Box::new(MariaDBDatabase::new(
List::from((
MariaDBDatabase::new(
name.into(), name.into(),
db_dump db_dump
.read_filename() .read_filename()
.expect("Initial db dump missing") .expect("Initial db dump missing")
.into(), .into(),
self.command_runner, self.command_runner,
),
DatabaseDump::new(name, db_dump, self.command_runner),
)) ))
.into_action(self.symbol_runner),
Box::new(DatabaseDump::new(name, db_dump, self.command_runner))
.into_action(self.symbol_runner),
]))
} }
pub fn get_mariadb_user<'a>(&'a self, user_name: &'static str) -> Box<dyn Action + 'a> {
Box::new(MariaDBUser::new(user_name.into(), self.command_runner))
.into_action(self.symbol_runner)
pub fn get_mariadb_user<'a>(&'a self, user_name: &'static str) -> impl Symbol + 'a {
MariaDBUser::new(user_name.into(), self.command_runner)
} }
pub fn get_git_checkout<'a, T: 'a + AsRef<str>>( pub fn get_git_checkout<'a, T: 'a + AsRef<str>>(
@ -323,37 +312,27 @@ env[PATH] = /usr/local/bin:/usr/bin:/bin
target: T, target: T,
source: &'a str, source: &'a str,
branch: &'a str, branch: &'a str,
) -> Box<dyn Action + 'a> {
Box::new(GitCheckout::new(
target,
source,
branch,
self.command_runner,
))
.into_action(self.symbol_runner)
) -> impl Symbol + 'a {
GitCheckout::new(target, source, branch, self.command_runner)
} }
pub fn get_owner<'a, F: 'a + AsRef<str>>(
&'a self,
file: F,
user: &'a str,
) -> Box<dyn Action + 'a> {
Box::new(Owner::new(file, user.into(), self.command_runner)).into_action(self.symbol_runner)
pub fn get_owner<'a, F: 'a + AsRef<str>>(&'a self, file: F, user: &'a str) -> impl Symbol + 'a {
Owner::new(file, user.into(), self.command_runner)
} }
pub fn get_file<'a, F: 'a + Deref<Target = str>, Q: 'a + AsRef<Path>>( pub fn get_file<'a, F: 'a + Deref<Target = str>, Q: 'a + AsRef<Path>>(
&'a self, &'a self,
path: Q, path: Q,
content: F, content: F,
) -> Box<dyn Action + 'a> {
Box::new(File::new(path, content)).into_action(self.symbol_runner)
) -> impl Symbol + 'a {
File::new(path, content)
} }
pub fn get_cron<'a, T: 'a + Deref<Target = str>, U: 'a + Deref<Target = str>>( pub fn get_cron<'a, T: 'a + Deref<Target = str>, U: 'a + Deref<Target = str>>(
&'a self, &'a self,
user: U, user: U,
content: T, content: T,
) -> Box<dyn Action + 'a> {
Box::new(Cron::new(user, content, self.command_runner)).into_action(self.symbol_runner)
) -> impl Symbol + 'a {
Cron::new(user, content, self.command_runner)
} }
} }

20
src/symbols/list.rs

@ -75,6 +75,26 @@ impl<'a> Symbol for List<'a> {
} }
} }
impl<'a, A: 'a + Symbol, B: 'a + Symbol> From<(A, B)> for List<'a> {
fn from((a, b): (A, B)) -> Self {
Self::new(vec![Box::new(a), Box::new(b)])
}
}
impl<'a, A: 'a + Symbol, B: 'a + Symbol, C: 'a + Symbol> From<(A, B, C)> for List<'a> {
fn from((a, b, c): (A, B, C)) -> Self {
Self::new(vec![Box::new(a), Box::new(b), Box::new(c)])
}
}
impl<'a, A: 'a + Symbol, B: 'a + Symbol, C: 'a + Symbol, D: 'a + Symbol> From<(A, B, C, D)>
for List<'a>
{
fn from((a, b, c, d): (A, B, C, D)) -> Self {
Self::new(vec![Box::new(a), Box::new(b), Box::new(c), Box::new(d)])
}
}
struct SymbolListAction<'a> { struct SymbolListAction<'a> {
runner: &'a dyn SymbolRunner, runner: &'a dyn SymbolRunner,
symbols: &'a [Box<dyn Symbol + 'a>], symbols: &'a [Box<dyn Symbol + 'a>],

Loading…
Cancel
Save