use crate::brew::Brew;
use crate::config::Config;
use crate::daemon::ServiceSpec;
use crate::state::{Backend, Server, State, Vhost};
use anyhow::Result;
mod apache;
mod caddy;
mod nginx;
mod ols;
pub trait WebServerBackend {
#[allow(dead_code)]
fn id(&self) -> Backend;
fn formula(&self) -> &'static str;
fn ensure_installed(&self, brew: &Brew) -> Result<()>;
fn render(
&self,
server: &Server,
vhosts: &[&Vhost],
state: &State,
cfg: &Config,
brew: &Brew,
) -> Result<()>;
fn validate(&self, server: &Server, brew: &Brew) -> Result<()>;
#[allow(dead_code)]
fn reload(&self, server: &Server, brew: &Brew) -> Result<()>;
fn service_spec(&self, server: &Server, brew: &Brew) -> Result<ServiceSpec>;
}
pub fn server_service_id(server: &Server) -> String {
format!("server-{}", server.name)
}
pub const DEFAULT_SITE_HOST: &str = "localhost";
pub fn default_php_socket(state: &State, cfg: &Config) -> Option<String> {
let ver = cfg
.default_php
.clone()
.or_else(|| state.php_versions.first().map(|p| p.version.clone()))?;
state.get_php(&ver).map(|p| p.fpm_socket.clone())
}
pub struct SettingDef {
pub key: &'static str,
pub label: &'static str,
pub default: &'static str,
pub help: &'static str,
}
pub fn settings_defs(backend: Backend) -> &'static [SettingDef] {
match backend {
Backend::Caddy => &[SettingDef {
key: "max_body",
label: "Max request body",
default: "100MB",
help: "e.g. 100MB, 1GB",
}],
Backend::Apache => &[
SettingDef {
key: "limit_request_body",
label: "Max upload bytes",
default: "0",
help: "0 = unlimited",
},
SettingDef {
key: "timeout",
label: "Timeout (s)",
default: "300",
help: "request timeout",
},
],
Backend::Nginx => &[
SettingDef {
key: "client_max_body_size",
label: "Max upload size",
default: "64m",
help: "e.g. 64m, 1g",
},
SettingDef {
key: "worker_connections",
label: "Worker connections",
default: "256",
help: "per worker",
},
],
Backend::Ols => &[],
}
}
pub fn backend_for(backend: Backend) -> Box<dyn WebServerBackend> {
match backend {
Backend::Caddy => Box::new(caddy::Caddy),
Backend::Apache => Box::new(apache::Apache),
Backend::Nginx => Box::new(nginx::Nginx),
Backend::Ols => Box::new(ols::Ols),
}
}