1*03746da3SJomo use std::collections::HashMap; 2*03746da3SJomo 3*03746da3SJomo /// 命令类型 4*03746da3SJomo pub enum CmdType { 5*03746da3SJomo User, 6*03746da3SJomo Passwd, 7*03746da3SJomo Group, 8*03746da3SJomo } 9*03746da3SJomo 10*03746da3SJomo #[derive(Debug, PartialEq, Eq, Hash, Clone)] 11*03746da3SJomo pub enum CmdOption { 12*03746da3SJomo /// 用户描述 13*03746da3SJomo Comment, 14*03746da3SJomo /// 用户主目录 15*03746da3SJomo Dir, 16*03746da3SJomo /// 组名 17*03746da3SJomo Group, 18*03746da3SJomo /// 组id 19*03746da3SJomo Gid, 20*03746da3SJomo /// 终端程序 21*03746da3SJomo Shell, 22*03746da3SJomo /// 用户id 23*03746da3SJomo Uid, 24*03746da3SJomo /// 删除用户的home目录 25*03746da3SJomo Remove, 26*03746da3SJomo /// 添加到其它用户组中 27*03746da3SJomo Append, 28*03746da3SJomo /// 修改用户名 29*03746da3SJomo Login, 30*03746da3SJomo /// 设置组密码 31*03746da3SJomo Passwd, 32*03746da3SJomo /// 修改组名 33*03746da3SJomo NewGroupName, 34*03746da3SJomo /// 无效选项 35*03746da3SJomo Invalid, 36*03746da3SJomo } 37*03746da3SJomo 38*03746da3SJomo impl From<String> for CmdOption { from(s: String) -> Self39*03746da3SJomo fn from(s: String) -> Self { 40*03746da3SJomo match s.as_str() { 41*03746da3SJomo "-c" => CmdOption::Comment, 42*03746da3SJomo "-d" => CmdOption::Dir, 43*03746da3SJomo "-G" => CmdOption::Group, 44*03746da3SJomo "-g" => CmdOption::Gid, 45*03746da3SJomo "-s" => CmdOption::Shell, 46*03746da3SJomo "-u" => CmdOption::Uid, 47*03746da3SJomo "-r" => CmdOption::Remove, 48*03746da3SJomo "-a" => CmdOption::Append, 49*03746da3SJomo "-l" => CmdOption::Login, 50*03746da3SJomo "-p" => CmdOption::Passwd, 51*03746da3SJomo "-n" => CmdOption::NewGroupName, 52*03746da3SJomo _ => CmdOption::Invalid, 53*03746da3SJomo } 54*03746da3SJomo } 55*03746da3SJomo } 56*03746da3SJomo 57*03746da3SJomo impl From<CmdOption> for &str { from(option: CmdOption) -> Self58*03746da3SJomo fn from(option: CmdOption) -> Self { 59*03746da3SJomo match option { 60*03746da3SJomo CmdOption::Comment => "-c", 61*03746da3SJomo CmdOption::Dir => "-d", 62*03746da3SJomo CmdOption::Group => "-G", 63*03746da3SJomo CmdOption::Shell => "-s", 64*03746da3SJomo CmdOption::Uid => "-u", 65*03746da3SJomo CmdOption::Login => "-l", 66*03746da3SJomo CmdOption::Append => "-a", 67*03746da3SJomo CmdOption::Gid => "-g", 68*03746da3SJomo CmdOption::NewGroupName => "-n", 69*03746da3SJomo CmdOption::Passwd => "-p", 70*03746da3SJomo CmdOption::Remove => "-r", 71*03746da3SJomo CmdOption::Invalid => "Invalid option", 72*03746da3SJomo } 73*03746da3SJomo } 74*03746da3SJomo } 75*03746da3SJomo 76*03746da3SJomo /// useradd/userdel/usermod命令 77*03746da3SJomo #[derive(Debug)] 78*03746da3SJomo pub struct UserCommand { 79*03746da3SJomo /// 用户名 80*03746da3SJomo pub username: String, 81*03746da3SJomo /// 选项 82*03746da3SJomo pub options: HashMap<CmdOption, String>, 83*03746da3SJomo } 84*03746da3SJomo 85*03746da3SJomo /// passwd命令 86*03746da3SJomo #[derive(Debug)] 87*03746da3SJomo pub struct PasswdCommand { 88*03746da3SJomo pub username: Option<String>, 89*03746da3SJomo } 90*03746da3SJomo 91*03746da3SJomo /// groupadd/groupdel/groupmod命令 92*03746da3SJomo #[derive(Debug)] 93*03746da3SJomo pub struct GroupCommand { 94*03746da3SJomo pub groupname: String, 95*03746da3SJomo pub options: HashMap<CmdOption, String>, 96*03746da3SJomo } 97