use super::Installer;
use std::path::PathBuf;
use std::process::ExitCode;
use anyhow::{ensure, Result};
use clap::Parser;
const LAUNCH_PATH: &str = "/etc/systemd/system/malwaredb.service";
#[derive(Parser, Debug, Clone, PartialEq)]
pub struct Install {
#[arg(value_hint = clap::ValueHint::FilePath)]
pub config: Option<PathBuf>,
#[arg(short, long, default_value = "mdbd")]
pub user: String,
#[arg(short, long, default_value = "mdbd")]
pub group: String,
}
impl Install {
fn gen_config(&self) -> Result<String> {
let exec = std::env::current_exe()?;
let exec = exec.to_str().unwrap();
let exec = if let Some(config) = &self.config {
ensure!(
config.starts_with("/"),
"Must use an absolute path for the config file"
);
format!("{exec} run load {}", config.display())
} else {
format!("{exec} run")
};
Ok(format!(
"[Unit]
Description=MalwareDB
Wants=network-online.target
After=network-online.target nss-lookup.target
[Service]
User={}
Group={}
Type=exec
Restart=always
RuntimeMaxSec=1d
StandardOutput=journal
ExecStart={exec}
[Install]
WantedBy=multi-user.target
",
self.user, self.group
))
}
}
impl Installer for Install {
fn do_install(&self) -> Result<ExitCode> {
let config = self.gen_config()?;
std::fs::write(LAUNCH_PATH, config)?;
Ok(ExitCode::SUCCESS)
}
}