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}