use super::{command_mechanism, ActionSpec};
use sysknife_types::RiskLevel;
pub fn specs() -> Vec<ActionSpec> {
vec![
list_users(),
list_groups(),
create_user("alice", Some("/bin/bash"), Some("/home/alice")),
delete_user("alice"),
add_user_to_group("alice", "wheel"),
remove_user_from_group("alice", "wheel"),
create_group("developers", false),
delete_group("developers"),
lock_user_account("alice"),
unlock_user_account("alice"),
]
}
pub fn list_users() -> ActionSpec {
ActionSpec {
action_name: "ListUsers",
mechanism: command_mechanism("getent", ["passwd"]),
risk_level: RiskLevel::Low,
reboot_required: false,
rollback_available: false,
}
}
pub fn list_groups() -> ActionSpec {
ActionSpec {
action_name: "ListGroups",
mechanism: command_mechanism("getent", ["group"]),
risk_level: RiskLevel::Low,
reboot_required: false,
rollback_available: false,
}
}
pub fn create_user(username: &str, shell: Option<&str>, home: Option<&str>) -> ActionSpec {
let mut args = vec![
"/usr/lib/sysknife/action-steps".to_string(),
"user-create".to_string(),
username.to_string(),
];
if let Some(home) = home {
args.push("--home-dir".to_string());
args.push(home.to_string());
}
if let Some(shell) = shell {
args.push("--shell".to_string());
args.push(shell.to_string());
}
ActionSpec {
action_name: "CreateUser",
mechanism: super::ActionMechanism::Command {
program: "sudo",
args,
},
risk_level: RiskLevel::High,
reboot_required: false,
rollback_available: false,
}
}
pub fn delete_user(username: &str) -> ActionSpec {
ActionSpec {
action_name: "DeleteUser",
mechanism: command_mechanism("sudo", ["userdel", username]),
risk_level: RiskLevel::High,
reboot_required: false,
rollback_available: false,
}
}
pub fn add_user_to_group(username: &str, group: &str) -> ActionSpec {
ActionSpec {
action_name: "AddUserToGroup",
mechanism: command_mechanism(
"sudo",
[
"/usr/lib/sysknife/action-steps",
"group-add",
username,
group,
],
),
risk_level: RiskLevel::High,
reboot_required: false,
rollback_available: false,
}
}
pub fn remove_user_from_group(username: &str, group: &str) -> ActionSpec {
ActionSpec {
action_name: "RemoveUserFromGroup",
mechanism: command_mechanism(
"sudo",
[
"/usr/lib/sysknife/action-steps",
"group-remove",
username,
group,
],
),
risk_level: RiskLevel::High,
reboot_required: false,
rollback_available: false,
}
}
pub fn create_group(group: &str, system: bool) -> ActionSpec {
let mut args = vec!["groupadd".to_string()];
if system {
args.push("--system".to_string());
}
args.push(group.to_string());
ActionSpec {
action_name: "CreateGroup",
mechanism: super::ActionMechanism::Command {
program: "sudo",
args,
},
risk_level: RiskLevel::Medium,
reboot_required: false,
rollback_available: false,
}
}
pub fn delete_group(group: &str) -> ActionSpec {
ActionSpec {
action_name: "DeleteGroup",
mechanism: command_mechanism("sudo", ["groupdel", group]),
risk_level: RiskLevel::High,
reboot_required: false,
rollback_available: false,
}
}
pub fn lock_user_account(username: &str) -> ActionSpec {
ActionSpec {
action_name: "LockUserAccount",
mechanism: command_mechanism(
"sudo",
["/usr/lib/sysknife/action-steps", "user-lock", username],
),
risk_level: RiskLevel::High,
reboot_required: false,
rollback_available: false,
}
}
pub fn unlock_user_account(username: &str) -> ActionSpec {
ActionSpec {
action_name: "UnlockUserAccount",
mechanism: command_mechanism(
"sudo",
["/usr/lib/sysknife/action-steps", "user-unlock", username],
),
risk_level: RiskLevel::High,
reboot_required: false,
rollback_available: false,
}
}