mirror of https://github.com/dswd/vpncloud.git
65 lines
3.1 KiB
Rust
65 lines
3.1 KiB
Rust
use crate::{error::Error, util::run_cmd};
|
|
use std::{
|
|
env,
|
|
fs::{self, File},
|
|
io::Write,
|
|
os::unix::fs::PermissionsExt,
|
|
process::Command,
|
|
};
|
|
|
|
const MANPAGE: &[u8] = include_bytes!("../target/vpncloud.1.gz");
|
|
const SERVICE_FILE: &[u8] = include_bytes!("../assets/vpncloud@.service");
|
|
const TARGET_FILE: &[u8] = include_bytes!("../assets/vpncloud.target");
|
|
const WS_PROXY_SERVICE_FILE: &[u8] = include_bytes!("../assets/vpncloud-wsproxy.service");
|
|
const EXAMPLE_CONFIG: &[u8] = include_bytes!("../assets/example.net.disabled");
|
|
|
|
fn systemctl_daemon_reload() {
|
|
let mut cmd = Command::new("systemctl");
|
|
cmd.arg("daemon-reload");
|
|
run_cmd(cmd);
|
|
}
|
|
|
|
pub fn install() -> Result<(), Error> {
|
|
env::current_exe()
|
|
.and_then(|p| fs::copy(p, "/usr/bin/vpncloud"))
|
|
.map_err(|e| Error::FileIo("Failed to copy binary", e))?;
|
|
fs::set_permissions("/usr/bin/vpncloud", fs::Permissions::from_mode(0o755))
|
|
.map_err(|e| Error::FileIo("Failed to set permissions for binary", e))?;
|
|
fs::create_dir_all("/etc/vpncloud").map_err(|e| Error::FileIo("Failed to create config folder", e))?;
|
|
fs::set_permissions("/etc/vpncloud", fs::Permissions::from_mode(0o700))
|
|
.map_err(|e| Error::FileIo("Failed to set permissions for config folder", e))?;
|
|
File::create("/etc/vpncloud/example.net.disabled")
|
|
.and_then(|mut f| f.write_all(EXAMPLE_CONFIG))
|
|
.map_err(|e| Error::FileIo("Failed to create example config", e))?;
|
|
File::create("/usr/share/man/man1/vpncloud.1.gz")
|
|
.and_then(|mut f| f.write_all(MANPAGE))
|
|
.map_err(|e| Error::FileIo("Failed to create manpage", e))?;
|
|
File::create("/lib/systemd/system/vpncloud@.service")
|
|
.and_then(|mut f| f.write_all(SERVICE_FILE))
|
|
.map_err(|e| Error::FileIo("Failed to create service file", e))?;
|
|
File::create("/lib/systemd/system/vpncloud.target")
|
|
.and_then(|mut f| f.write_all(TARGET_FILE))
|
|
.map_err(|e| Error::FileIo("Failed to create service target file", e))?;
|
|
File::create("/lib/systemd/system/vpncloud-wsproxy.service")
|
|
.and_then(|mut f| f.write_all(WS_PROXY_SERVICE_FILE))
|
|
.map_err(|e| Error::FileIo("Failed to create wsporxy service file", e))?;
|
|
systemctl_daemon_reload();
|
|
info!("Install successful");
|
|
Ok(())
|
|
}
|
|
|
|
pub fn uninstall() -> Result<(), Error> {
|
|
fs::remove_file("/etc/vpncloud/example.net.disabled").map_err(|e| Error::FileIo("Failed to remove binary", e))?;
|
|
fs::remove_file("/usr/share/man/man1/vpncloud.1.gz").map_err(|e| Error::FileIo("Failed to remove manpage", e))?;
|
|
fs::remove_file("/lib/systemd/system/vpncloud@.service")
|
|
.map_err(|e| Error::FileIo("Failed to remove service file", e))?;
|
|
fs::remove_file("/lib/systemd/system/vpncloud.target")
|
|
.map_err(|e| Error::FileIo("Failed to remove service target file", e))?;
|
|
fs::remove_file("/lib/systemd/system/vpncloud-wsproxy.service")
|
|
.map_err(|e| Error::FileIo("Failed to remove wsproxy service file", e))?;
|
|
fs::remove_file("/usr/bin/vpncloud").map_err(|e| Error::FileIo("Failed to remove binary", e))?;
|
|
systemctl_daemon_reload();
|
|
info!("Uninstall successful");
|
|
Ok(())
|
|
}
|