sysknife_daemon/actions/
network.rs1use super::{command_mechanism, ActionSpec};
2use sysknife_types::RiskLevel;
3
4pub fn specs() -> Vec<ActionSpec> {
5 vec![
6 configure_wifi("CafeHotspot", None),
7 set_dns_servers("wlp1s0", &["1.1.1.1", "8.8.8.8"]),
8 configure_firewall("public", "ssh", true),
9 get_firewall_state(),
10 get_network_status(),
11 get_listening_ports(),
12 ]
13}
14
15pub fn configure_wifi(ssid: &str, password: Option<&str>) -> ActionSpec {
16 let mut args = vec![
19 "nmcli".to_string(),
20 "device".to_string(),
21 "wifi".to_string(),
22 "connect".to_string(),
23 ssid.to_string(),
24 ];
25 if let Some(pw) = password {
26 args.push("password".to_string());
27 args.push(pw.to_string());
28 }
29 ActionSpec {
30 action_name: "ConfigureWifi",
31 mechanism: super::ActionMechanism::Command {
32 program: "sudo",
33 args,
34 },
35 risk_level: RiskLevel::High,
36 reboot_required: false,
37 rollback_available: false,
38 }
39}
40
41pub fn set_dns_servers(interface: &str, servers: &[&str]) -> ActionSpec {
42 let args = std::iter::once("resolvectl")
43 .chain(std::iter::once("dns"))
44 .chain(std::iter::once(interface))
45 .chain(servers.iter().copied());
46
47 ActionSpec {
48 action_name: "SetDnsServers",
49 mechanism: command_mechanism("sudo", args),
50 risk_level: RiskLevel::High,
51 reboot_required: false,
52 rollback_available: false,
53 }
54}
55
56pub fn configure_firewall(zone: &str, service: &str, enabled: bool) -> ActionSpec {
73 let verb = if enabled {
74 "add-service"
75 } else {
76 "remove-service"
77 };
78 let script = format!(
79 "firewall-cmd --permanent --zone='{}' --{}='{}' && firewall-cmd --reload",
80 zone, verb, service
81 );
82
83 ActionSpec {
84 action_name: "ConfigureFirewall",
85 mechanism: super::ActionMechanism::Command {
86 program: "sudo",
87 args: vec!["sh".to_string(), "-c".to_string(), script],
88 },
89 risk_level: RiskLevel::High,
90 reboot_required: false,
91 rollback_available: false,
92 }
93}
94
95pub fn get_firewall_state() -> ActionSpec {
96 ActionSpec {
100 action_name: "GetFirewallState",
101 mechanism: command_mechanism("firewall-cmd", ["--list-all"]),
102 risk_level: RiskLevel::Low,
103 reboot_required: false,
104 rollback_available: false,
105 }
106}
107
108pub fn get_network_status() -> ActionSpec {
109 ActionSpec {
110 action_name: "GetNetworkStatus",
111 mechanism: command_mechanism("ip", ["-brief", "addr"]),
112 risk_level: RiskLevel::Low,
113 reboot_required: false,
114 rollback_available: false,
115 }
116}
117
118pub fn get_listening_ports() -> ActionSpec {
123 ActionSpec {
124 action_name: "GetListeningPorts",
125 mechanism: command_mechanism("ss", ["-tulpnH"]),
128 risk_level: RiskLevel::Low,
129 reboot_required: false,
130 rollback_available: false,
131 }
132}