Don't return actions from SymbolFactory
This commit is contained in:
parent
c954272947
commit
8069164109
2 changed files with 72 additions and 73 deletions
|
|
@ -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> {
|
) -> impl Symbol + 'a {
|
||||||
Box::new(ListAction::new(vec![
|
List::from((
|
||||||
Box::new(SelfSignedTlsCert::new(host.into(), self.command_runner))
|
SelfSignedTlsCert::new(host.into(), self.command_runner),
|
||||||
.into_action(self.symbol_runner),
|
Hook::new(
|
||||||
Box::new(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),
|
AcmeCert::new(host.into(), &self.acme_command_runner),
|
||||||
Box::new(AcmeCert::new(host.into(), &self.acme_command_runner))
|
Hook::new(
|
||||||
.into_action(self.symbol_runner),
|
|
||||||
Box::new(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> {
|
pub fn get_nginx_acme_challenge_config<'a>(&'a self) -> impl Symbol + 'a {
|
||||||
Box::new(File::new(
|
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,22 +129,22 @@ 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,
|
||||||
"
|
"
|
||||||
location / {{
|
location / {{
|
||||||
try_files $uri $uri/ /index.php?$args;
|
try_files $uri $uri/ /index.php?$args;
|
||||||
}}
|
}}
|
||||||
",
|
",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -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),
|
StoredDirectory::new(
|
||||||
Box::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![
|
List::from((
|
||||||
Box::new(MariaDBDatabase::new(
|
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,
|
||||||
))
|
),
|
||||||
.into_action(self.symbol_runner),
|
DatabaseDump::new(name, db_dump, self.command_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> {
|
pub fn get_mariadb_user<'a>(&'a self, user_name: &'static str) -> impl Symbol + 'a {
|
||||||
Box::new(MariaDBUser::new(user_name.into(), self.command_runner))
|
MariaDBUser::new(user_name.into(), self.command_runner)
|
||||||
.into_action(self.symbol_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> {
|
) -> impl Symbol + 'a {
|
||||||
Box::new(GitCheckout::new(
|
GitCheckout::new(target, source, branch, self.command_runner)
|
||||||
target,
|
|
||||||
source,
|
|
||||||
branch,
|
|
||||||
self.command_runner,
|
|
||||||
))
|
|
||||||
.into_action(self.symbol_runner)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_owner<'a, F: 'a + AsRef<str>>(
|
pub fn get_owner<'a, F: 'a + AsRef<str>>(&'a self, file: F, user: &'a str) -> impl Symbol + 'a {
|
||||||
&'a self,
|
Owner::new(file, user.into(), self.command_runner)
|
||||||
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_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> {
|
) -> impl Symbol + 'a {
|
||||||
Box::new(File::new(path, content)).into_action(self.symbol_runner)
|
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> {
|
) -> impl Symbol + 'a {
|
||||||
Box::new(Cron::new(user, content, self.command_runner)).into_action(self.symbol_runner)
|
Cron::new(user, content, self.command_runner)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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…
Add table
Add a link
Reference in a new issue