1use super::{command_mechanism, ActionSpec};
2use sysknife_types::RiskLevel;
3
4pub fn specs() -> Vec<ActionSpec> {
5 vec![
6 list_users(),
7 list_groups(),
8 create_user("alice", Some("/bin/bash"), Some("/home/alice")),
9 delete_user("alice"),
10 add_user_to_group("alice", "wheel"),
11 remove_user_from_group("alice", "wheel"),
12 create_group("developers", false),
13 delete_group("developers"),
14 lock_user_account("alice"),
15 unlock_user_account("alice"),
16 ]
17}
18
19pub fn list_users() -> ActionSpec {
20 ActionSpec {
21 action_name: "ListUsers",
22 mechanism: command_mechanism("getent", ["passwd"]),
23 risk_level: RiskLevel::Low,
24 reboot_required: false,
25 rollback_available: false,
26 }
27}
28
29pub fn list_groups() -> ActionSpec {
30 ActionSpec {
31 action_name: "ListGroups",
32 mechanism: command_mechanism("getent", ["group"]),
33 risk_level: RiskLevel::Low,
34 reboot_required: false,
35 rollback_available: false,
36 }
37}
38
39pub fn create_user(username: &str, shell: Option<&str>, home: Option<&str>) -> ActionSpec {
49 let mut args = vec![
50 "/usr/lib/sysknife/action-steps".to_string(),
51 "user-create".to_string(),
52 username.to_string(),
53 ];
54 if let Some(home) = home {
55 args.push("--home-dir".to_string());
56 args.push(home.to_string());
57 }
58 if let Some(shell) = shell {
59 args.push("--shell".to_string());
60 args.push(shell.to_string());
61 }
62
63 ActionSpec {
64 action_name: "CreateUser",
65 mechanism: super::ActionMechanism::Command {
66 program: "sudo",
67 args,
68 },
69 risk_level: RiskLevel::High,
70 reboot_required: false,
71 rollback_available: false,
72 }
73}
74
75pub fn delete_user(username: &str) -> ActionSpec {
76 ActionSpec {
77 action_name: "DeleteUser",
78 mechanism: command_mechanism(
81 "sudo",
82 ["/usr/lib/sysknife/action-steps", "user-delete", username],
83 ),
84 risk_level: RiskLevel::High,
87 reboot_required: false,
88 rollback_available: false,
89 }
90}
91
92pub fn add_user_to_group(username: &str, group: &str) -> ActionSpec {
93 ActionSpec {
99 action_name: "AddUserToGroup",
100 mechanism: command_mechanism(
101 "sudo",
102 [
103 "/usr/lib/sysknife/action-steps",
104 "group-add",
105 username,
106 group,
107 ],
108 ),
109 risk_level: RiskLevel::High,
113 reboot_required: false,
114 rollback_available: false,
115 }
116}
117
118pub fn remove_user_from_group(username: &str, group: &str) -> ActionSpec {
119 ActionSpec {
123 action_name: "RemoveUserFromGroup",
124 mechanism: command_mechanism(
125 "sudo",
126 [
127 "/usr/lib/sysknife/action-steps",
128 "group-remove",
129 username,
130 group,
131 ],
132 ),
133 risk_level: RiskLevel::High,
136 reboot_required: false,
137 rollback_available: false,
138 }
139}
140
141pub fn create_group(group: &str, system: bool) -> ActionSpec {
148 let mut args = vec![
149 "/usr/lib/sysknife/action-steps".to_string(),
150 "group-create".to_string(),
151 ];
152 if system {
153 args.push("--system".to_string());
154 }
155 args.push(group.to_string());
156 ActionSpec {
157 action_name: "CreateGroup",
158 mechanism: super::ActionMechanism::Command {
159 program: "sudo",
160 args,
161 },
162 risk_level: RiskLevel::Medium,
163 reboot_required: false,
164 rollback_available: false,
165 }
166}
167
168pub fn delete_group(group: &str) -> ActionSpec {
175 ActionSpec {
176 action_name: "DeleteGroup",
177 mechanism: command_mechanism(
178 "sudo",
179 ["/usr/lib/sysknife/action-steps", "group-delete", group],
180 ),
181 risk_level: RiskLevel::High,
182 reboot_required: false,
183 rollback_available: false,
184 }
185}
186
187pub fn lock_user_account(username: &str) -> ActionSpec {
193 ActionSpec {
194 action_name: "LockUserAccount",
195 mechanism: command_mechanism(
196 "sudo",
197 ["/usr/lib/sysknife/action-steps", "user-lock", username],
198 ),
199 risk_level: RiskLevel::High,
200 reboot_required: false,
201 rollback_available: false,
202 }
203}
204
205pub fn unlock_user_account(username: &str) -> ActionSpec {
210 ActionSpec {
211 action_name: "UnlockUserAccount",
212 mechanism: command_mechanism(
213 "sudo",
214 ["/usr/lib/sysknife/action-steps", "user-unlock", username],
215 ),
216 risk_level: RiskLevel::High,
217 reboot_required: false,
218 rollback_available: false,
219 }
220}