Skip to main content

sysknife_daemon/actions/
deployment.rs

1use super::{command_mechanism, ActionSpec};
2use sysknife_types::RiskLevel;
3
4pub fn specs() -> Vec<ActionSpec> {
5    vec![
6        get_system_state(),
7        collect_diagnostics(),
8        get_deployment_history(),
9        list_deployments(),
10        update_system(),
11        pin_deployment(0),
12        unpin_deployment(0),
13        rebase_system("fedora/41/x86_64/silverblue"),
14        cleanup_deployments(),
15        reboot_system(),
16        rollback_deployment(),
17        get_kernel_arguments(),
18        set_kernel_arguments(&[], &[]),
19    ]
20}
21
22pub fn get_system_state() -> ActionSpec {
23    ActionSpec {
24        action_name: "GetSystemState",
25        mechanism: command_mechanism("rpm-ostree", ["status", "--json"]),
26        risk_level: RiskLevel::Low,
27        reboot_required: false,
28        rollback_available: false,
29    }
30}
31
32pub fn collect_diagnostics() -> ActionSpec {
33    ActionSpec {
34        action_name: "CollectDiagnostics",
35        mechanism: command_mechanism("journalctl", ["-b", "-n", "500", "--no-pager"]),
36        risk_level: RiskLevel::Low,
37        reboot_required: false,
38        rollback_available: false,
39    }
40}
41
42pub fn get_deployment_history() -> ActionSpec {
43    ActionSpec {
44        action_name: "GetDeploymentHistory",
45        mechanism: command_mechanism("rpm-ostree", ["status", "--json"]),
46        risk_level: RiskLevel::Low,
47        reboot_required: false,
48        rollback_available: false,
49    }
50}
51
52pub fn list_deployments() -> ActionSpec {
53    ActionSpec {
54        action_name: "ListDeployments",
55        mechanism: command_mechanism("rpm-ostree", ["status", "--json"]),
56        risk_level: RiskLevel::Low,
57        reboot_required: false,
58        rollback_available: false,
59    }
60}
61
62pub fn update_system() -> ActionSpec {
63    ActionSpec {
64        action_name: "UpdateSystem",
65        mechanism: command_mechanism("sudo", ["rpm-ostree", "upgrade"]),
66        risk_level: RiskLevel::High,
67        reboot_required: true,
68        rollback_available: true,
69    }
70}
71
72pub fn pin_deployment(index: u32) -> ActionSpec {
73    ActionSpec {
74        action_name: "PinDeployment",
75        mechanism: super::ActionMechanism::Command {
76            program: "sudo",
77            args: vec![
78                "ostree".to_string(),
79                "admin".to_string(),
80                "pin".to_string(),
81                index.to_string(),
82            ],
83        },
84        risk_level: RiskLevel::High,
85        reboot_required: false,
86        rollback_available: false,
87    }
88}
89
90pub fn unpin_deployment(index: u32) -> ActionSpec {
91    ActionSpec {
92        action_name: "UnpinDeployment",
93        mechanism: super::ActionMechanism::Command {
94            program: "sudo",
95            args: vec![
96                "ostree".to_string(),
97                "admin".to_string(),
98                "pin".to_string(),
99                "--unpin".to_string(),
100                index.to_string(),
101            ],
102        },
103        risk_level: RiskLevel::High,
104        reboot_required: false,
105        rollback_available: false,
106    }
107}
108
109pub fn rebase_system(target_ref: &str) -> ActionSpec {
110    ActionSpec {
111        action_name: "RebaseSystem",
112        mechanism: command_mechanism("sudo", ["rpm-ostree", "rebase", target_ref]),
113        risk_level: RiskLevel::High,
114        reboot_required: true,
115        rollback_available: true,
116    }
117}
118
119pub fn cleanup_deployments() -> ActionSpec {
120    ActionSpec {
121        action_name: "CleanupDeployments",
122        mechanism: command_mechanism("sudo", ["rpm-ostree", "cleanup", "--rollback", "--pending"]),
123        risk_level: RiskLevel::High,
124        reboot_required: false,
125        rollback_available: false,
126    }
127}
128
129pub fn reboot_system() -> ActionSpec {
130    ActionSpec {
131        action_name: "RebootSystem",
132        mechanism: command_mechanism("sudo", ["systemctl", "reboot"]),
133        risk_level: RiskLevel::High,
134        reboot_required: true,
135        rollback_available: false,
136    }
137}
138
139pub fn rollback_deployment() -> ActionSpec {
140    ActionSpec {
141        action_name: "RollbackDeployment",
142        mechanism: command_mechanism("sudo", ["rpm-ostree", "rollback"]),
143        risk_level: RiskLevel::High,
144        reboot_required: true,
145        rollback_available: false,
146    }
147}
148
149pub fn get_kernel_arguments() -> ActionSpec {
150    ActionSpec {
151        action_name: "GetKernelArguments",
152        mechanism: command_mechanism("rpm-ostree", ["kargs"]),
153        risk_level: RiskLevel::Low,
154        reboot_required: false,
155        rollback_available: false,
156    }
157}
158
159pub fn set_kernel_arguments(args_to_add: &[&str], args_to_remove: &[&str]) -> ActionSpec {
160    let args = std::iter::once("rpm-ostree".to_string())
161        .chain(std::iter::once("kargs".to_string()))
162        .chain(args_to_add.iter().map(|a| format!("--append={a}")))
163        .chain(args_to_remove.iter().map(|a| format!("--delete={a}")))
164        .collect();
165
166    ActionSpec {
167        action_name: "SetKernelArguments",
168        mechanism: super::ActionMechanism::Command {
169            program: "sudo",
170            args,
171        },
172        risk_level: RiskLevel::High,
173        reboot_required: true,
174        rollback_available: true,
175    }
176}