peach-workspace/peach-config/src/setup_networking.rs

148 lines
4.3 KiB
Rust

use log::info;
use std::path::Path;
use crate::error::PeachConfigError;
use crate::utils::{cmd, conf};
/// Idempotent script to configure a Debian installation to use
/// systemd-networkd for general networking. The script configures the eth0,
/// wlan0 and ap0 interfaces. This configuration allows switching between
/// wireless client mode (wlan0) and wireless access point mode (ap0)
pub fn configure_networking() -> Result<(), PeachConfigError> {
info!("[ INSTALLING SYSTEM REQUIREMENTS ]");
cmd(&["apt", "install", "-y", "libnss-resolve"])?;
info!("[ SETTING HOST ]");
cmd(&["cp", &conf("hostname"), "/etc/hostname"])?;
cmd(&["cp", &conf("hosts"), "/etc/hosts"])?;
info!("[ DEINSTALLING CLASSIC NETWORKING ]");
cmd(&[
"apt-get",
"autoremove",
"-y",
"ifupdown",
"dhcpcd5",
"isc-dhcp-client",
"isc-dhcp-common",
"rsyslog",
])?;
cmd(&[
"apt-mark",
"hold",
"ifupdown",
"dhcpcd5",
"isc-dhcp-client",
"isc-dhcp-common",
"rsyslog",
"openresolv",
])?;
cmd(&["rm", "-rf", "/etc/network", "/etc/dhcp"])?;
info!("[ SETTING UP SYSTEMD-RESOLVED & SYSTEMD-NETWORKD ]");
cmd(&["apt-get", "autoremove", "-y", "avahi-daemon"])?;
cmd(&["apt-mark", "hold", "avahi-daemon", "libnss-mdns"])?;
cmd(&[
"ln",
"-sf",
"/run/systemd/resolve/stub-resolv.conf",
"/etc/resolv.conf",
])?;
cmd(&[
"systemctl",
"enable",
"systemd-networkd.service",
"systemd-resolved.service",
])?;
info!("[ CREATING INTERFACE FILE FOR WIRED CONNECTION ]");
cmd(&[
"cp",
&conf("network/04-wired.network"),
"/etc/systemd/network/04-wired.network",
])?;
info!("[ SETTING UP WPA_SUPPLICANT AS WIFI CLIENT WITH WLAN0 ]");
// to avoid overwriting previous credentials, only copy file if it doesn't already exist
let wlan0 = "/etc/wpa_supplicant/wpa_supplicant-wlan0.conf";
if !Path::new(wlan0).exists() {
cmd(&["cp", &conf("network/wpa_supplicant-wlan0.conf"), wlan0])?;
cmd(&["chmod", "660", wlan0])?;
cmd(&["chown", "root:netdev", wlan0])?;
}
cmd(&["systemctl", "disable", "wpa_supplicant.service"])?;
cmd(&["systemctl", "enable", "wpa_supplicant@wlan0.service"])?;
info!("[ CREATING BOOT SCRIPT TO COPY NETWORK CONFIGS ]");
cmd(&[
"cp",
&conf("network/copy-wlan.sh"),
"/usr/local/bin/copy-wlan.sh",
])?;
cmd(&["chmod", "770", "/usr/local/bin/copy-wlan.sh"])?;
cmd(&[
"cp",
&conf("network/copy-wlan.service"),
"/etc/systemd/system/copy-wlan.service",
])?;
cmd(&["systemctl", "enable", "copy-wlan.service"])?;
info!("[ SETTING UP WPA_SUPPLICANT AS ACCESS POINT WITH AP0 ]");
cmd(&[
"cp",
&conf("network/wpa_supplicant-ap0.conf"),
"/etc/wpa_supplicant/wpa_supplicant-ap0.conf",
])?;
cmd(&[
"chmod",
"600",
"/etc/wpa_supplicant/wpa_supplicant-ap0.conf",
])?;
info!("[ CONFIGURING INTERFACES ]");
cmd(&[
"cp",
&conf("network/08-wlan0.network"),
"/etc/systemd/network/08-wlan0.network",
])?;
cmd(&[
"cp",
&conf("network/12-ap0.network"),
"/etc/systemd/network/12-ap0.network",
])?;
info!("[ MODIFYING SERVICE FOR ACCESS POINT TO USE AP0 ]");
cmd(&["systemctl", "disable", "wpa_supplicant@ap0.service"])?;
cmd(&[
"cp",
&conf("network/wpa_supplicant@ap0.service"),
"/etc/systemd/system/wpa_supplicant@ap0.service",
])?;
info!("[ SETTING WLAN0 TO RUN AS CLIENT ON STARTUP ]");
cmd(&["systemctl", "enable", "wpa_supplicant@wlan0.service"])?;
cmd(&["systemctl", "disable", "wpa_supplicant@ap0.service"])?;
info!("[ CREATING ACCESS POINT AUTO-DEPLOY SCRIPT ]");
cmd(&[
"cp",
&conf("ap_auto_deploy.sh"),
"/usr/local/bin/ap_auto_deploy",
])?;
info!("[ CONFIGURING ACCESS POINT AUTO-DEPLOY SERVICE ]");
cmd(&[
"cp",
&conf("network/ap-auto-deploy.service"),
"/etc/systemd/system/ap-auto-deploy.service",
])?;
cmd(&[
"cp",
&conf("network/ap-auto-deploy.timer"),
"/etc/systemd/system/ap-auto-deploy.timer",
])?;
info!("[ NETWORKING HAS BEEN CONFIGURED ]");
Ok(())
}