(command.CommandList children: [ (command.ShFunction name: err body: (BraceGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$quietflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.Simple words: [ {<echo>} {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>} {<ERROR> <Id.Lit_Colon ':'>} {($ Id.VSub_Star '$*')} ] redirects: [ (redir op: <Id.Redir_GreatAnd '1>&'> loc: (redir_loc.Fd fd:1) arg: {<2>} ) ] do_fork: T ) ] spids: [101 114] ) ] ) ] ) ) (command.ShFunction name: info body: (BraceGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$quietflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>} {<INFO> <Id.Lit_Colon ':'>} {($ Id.VSub_Star '$*')} ) ] spids: [154 167] ) ] ) ] ) ) (command.ShFunction name: get_nextuid body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_uid) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [214] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_nextuid) op: assign_op.Equal rhs: (word.Empty) spids: [218] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_uid'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_nextuid) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {(${ Id.VSub_Name PWCMD)} {<usernext>}) (C {<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [238] ) ] ) ] spids: [222 235] ) ] else_action: [ (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_Colon ':'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Simple words: [ {(${ Id.VSub_Name PWCMD)} {<usershow>} {($ Id.VSub_DollarName '$_uid')} ] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {(DQ ($ Id.VSub_QMark '$?'))} {<-eq>} {<0>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_nextuid) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$_uid')} spids: [309] ) ] ) (command.ControlFlow token: <Id.ControlFlow_Break break> ) ] spids: [289 306] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_uid) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName '$_uid')} right: {<Id.Lit_Digits 1>} ) ) } spids: [319] ) ] ) ] ) ) ] ) (C {<echo>} {($ Id.VSub_DollarName '$_nextuid')}) ] ) ) (command.ShFunction name: show_usage body: (BraceGroup children: [ (C {<echo>} {(DQ <'usage: '> (${ Id.VSub_Name THISCMD) <' [options]'>)}) (C {<echo>} {(DQ <' options may include:'>)}) (C {<echo>} {(DQ <' -C\t\tsave to the configuration file only'>)}) (C {<echo>} {(DQ <' -D\t\tdo not attempt to create the home directory'>)}) (C {<echo>} {(DQ <' -E\t\tdisable this account after creation'>)}) (C {<echo>} {(DQ <' -G\t\tadditional groups to add accounts to'>)}) (C {<echo>} {(DQ <' -L\t\tlogin class of the user'>)}) (C {<echo>} {(DQ <' -M\t\tfile permission for home directory'>)}) (C {<echo>} {(DQ <' -N\t\tdo not read configuration file'>)}) (C {<echo>} {(DQ <' -S\t\ta nonexistent shell is not an error'>)}) (C {<echo>} {(DQ <' -d\t\thome directory'>)}) (C {<echo>} {(DQ <' -f\t\tfile from which input will be received'>)}) (C {<echo>} {(DQ <' -g\t\tdefault login group'>)}) (C {<echo>} {(DQ <' -h\t\tdisplay this usage message'>)}) (C {<echo>} {(DQ <' -k\t\tpath to skeleton home directory'>)}) (C {<echo>} {(DQ <' -m\t\tuser welcome message file'>)}) (C {<echo>} {(DQ <' -q\t\tabsolute minimal user feedback'>)}) (C {<echo>} {(DQ <' -s\t\tshell'>)}) (C {<echo>} {(DQ <' -u\t\tuid to start at'>)}) (C {<echo>} {(DQ <' -w\t\tpassword type: no, none, yes or random'>)}) ] ) ) (command.ShFunction name: valid_shells body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prefix) op: assign_op.Equal rhs: (word.Empty) spids: [524] ) ] ) (command.Pipeline children: [ (C {<cat>} {(${ Id.VSub_Name ETCSHELLS)}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<read>} {<_path>} {<_junk>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Case to_match: {($ Id.VSub_DollarName '$_path')} arms: [ (case_arm pat_list: [ {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'>) <Id.Lit_Star '*'> } {(SQ )} ] spids: [556 561 564 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (C {<echo>} {<-n>} { (DQ (${ Id.VSub_Name _prefix) (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<basename>} {($ Id.VSub_DollarName '$_path')}) ) ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prefix) op: assign_op.Equal rhs: {(SQ <' '>)} spids: [589] ) ] ) ] spids: [567 568 595 -1] ) ] ) ] ) ) ] negated: F ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-x>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<Id.Lit_RBracket ']'>} ) (C {<echo>} {<-n>} {(DQ <' '> (${ Id.VSub_Name NOLOGIN))}) ] ) ] ) ) (command.ShFunction name: fullpath_from_shell body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_shell) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [659] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN))} {<-o>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {(${ Id.VSub_Name NOLOGIN_PATH)}) (command.Sentence child: (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>}) terminator: <Id.Op_Semi _> ) ] spids: [701 736] ) ] ) (command.Pipeline children: [ (C {<cat>} {(${ Id.VSub_Name ETCSHELLS)}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<read>} {<_path>} {<_junk>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Case to_match: {(DQ ($ Id.VSub_DollarName '$_path'))} arms: [ (case_arm pat_list: [ {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'>) <Id.Lit_Star '*'> } {(SQ )} ] spids: [787 792 795 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_path'))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<-o>} { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<basename>} {($ Id.VSub_DollarName '$_path')} ) ) ) } {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$_shell'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {($ Id.VSub_DollarName '$_path')}) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<0>} ) ] spids: [802 839] ) ] ) ] spids: [798 799 855 -1] ) ] ) ] ) ) ] negated: F ) (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<1>}) ] ) ) (command.ShFunction name: shell_exists body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_sh) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [900] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_shellchk) op: assign_op.Equal rhs: { (DQ (${ Id.VSub_Name GREPCMD) <' \'^'> ($ Id.VSub_DollarName '$_sh') <Id.Lit_Dollar '$'> <'\' '> (${ Id.VSub_Name ETCSHELLS) <' > /dev/null 2>&1'> ) } spids: [906] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [(C {<eval>} {($ Id.VSub_DollarName '$_shellchk')})] negated: T ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_sh'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ (${ Id.VSub_Name NOLOGIN_PATH))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} { (DQ <'Invalid shell ('> ($ Id.VSub_DollarName '$_sh') <') for user '> ($ Id.VSub_DollarName '$username') <.> ) } ) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] spids: [939 959] ) ] ) ] spids: [923 932] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.Pipeline children: [ (C {<Id.Lit_LBracket '['>} {<-x>} {(DQ ($ Id.VSub_DollarName '$_sh'))} {<Id.Lit_RBracket ']'>} ) ] negated: T ) (C {<info>} { (DQ <'The shell ('> ($ Id.VSub_DollarName '$_sh') <') does not exist or is not executable.'> ) } ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>}) ] ) ) (command.ShFunction name: save_config body: (BraceGroup children: [ (command.Simple words: [{<echo>} {(DQ <'# Configuration file for adduser(8).'>)}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'# NOTE: only *some* variables are saved.'>)}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [ {<echo>} { (DQ <'# Last Modified on '> (command_sub left_token: <Id.Left_Backtick '`'> child: (C {(${ Id.VSub_Name DATECMD)}) ) <.> ) } ] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(SQ )}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'defaultHomePerm='> ($ Id.VSub_DollarName '$uhomeperm'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'defaultLgroup='> ($ Id.VSub_DollarName '$ulogingroup'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'defaultclass='> ($ Id.VSub_DollarName '$uclass'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'defaultgroups='> ($ Id.VSub_DollarName '$ugroups'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'passwdtype='> ($ Id.VSub_DollarName '$passwdtype'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'homeprefix='> ($ Id.VSub_DollarName '$homeprefix'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'defaultshell='> ($ Id.VSub_DollarName '$ushell'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'udotdir='> ($ Id.VSub_DollarName '$udotdir'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'msgfile='> ($ Id.VSub_DollarName '$msgfile'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'disableflag='> ($ Id.VSub_DollarName '$disableflag'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) (command.Simple words: [{<echo>} {(DQ <'uidstart='> ($ Id.VSub_DollarName '$uidstart'))}] redirects: [ (redir op: <Id.Redir_DGreat '>>'> loc: (redir_loc.Fd fd:1) arg: {(${ Id.VSub_Name ADDUSERCONF)} ) ] do_fork: T ) ] ) ) (command.ShFunction name: add_user body: (BraceGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<save_config>}) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] spids: [1281 1294] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_uid) op: assign_op.Equal rhs: (word.Empty) spids: [1307] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_name) op: assign_op.Equal rhs: (word.Empty) spids: [1310] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_comment) op: assign_op.Equal rhs: (word.Empty) spids: [1313] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_gecos) op: assign_op.Equal rhs: (word.Empty) spids: [1316] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_home) op: assign_op.Equal rhs: (word.Empty) spids: [1319] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_group) op: assign_op.Equal rhs: (word.Empty) spids: [1322] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_grouplist) op: assign_op.Equal rhs: (word.Empty) spids: [1325] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_shell) op: assign_op.Equal rhs: (word.Empty) spids: [1328] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_class) op: assign_op.Equal rhs: (word.Empty) spids: [1331] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_dotdir) op: assign_op.Equal rhs: (word.Empty) spids: [1334] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_expire) op: assign_op.Equal rhs: (word.Empty) spids: [1337] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pwexpire) op: assign_op.Equal rhs: (word.Empty) spids: [1340] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwd) op: assign_op.Equal rhs: (word.Empty) spids: [1343] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_upasswd) op: assign_op.Equal rhs: (word.Empty) spids: [1346] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwdmethod) op: assign_op.Equal rhs: (word.Empty) spids: [1349] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_name) op: assign_op.Equal rhs: {(DQ <'-n \''> ($ Id.VSub_DollarName '$username') <'\''>)} spids: [1353] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uuid'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_uid) op: assign_op.Equal rhs: {(SQ <'-u "$uuid"'>)} spids: [1373] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ulogingroup'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_group) op: assign_op.Equal rhs: {(SQ <'-g "$ulogingroup"'>)} spids: [1391] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ugroups'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_grouplist) op: assign_op.Equal rhs: {(SQ <'-G "$ugroups"'>)} spids: [1409] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ushell'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_shell) op: assign_op.Equal rhs: {(SQ <'-s "$ushell"'>)} spids: [1427] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uclass'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_class) op: assign_op.Equal rhs: {(SQ <'-L "$uclass"'>)} spids: [1445] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ugecos'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_comment) op: assign_op.Equal rhs: {(SQ <'-c "$ugecos"'>)} spids: [1463] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$udotdir'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_dotdir) op: assign_op.Equal rhs: {(SQ <'-k "$udotdir"'>)} spids: [1481] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uexpire'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_expire) op: assign_op.Equal rhs: {(SQ <'-e "$uexpire"'>)} spids: [1499] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$upwexpire'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pwexpire) op: assign_op.Equal rhs: {(SQ <'-p "$upwexpire"'>)} spids: [1517] ) ] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$Dflag'))} {<-a>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uhome'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$uhome'))} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$NOHOME'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_home) op: assign_op.Equal rhs: {(SQ <'-d "$uhome"'>)} spids: [1575] ) ] ) ] spids: [1555 1572] ) ] else_action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uhomeperm'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_home) op: assign_op.Equal rhs: {(SQ <'-m -d "$uhome" -M "$uhomeperm"'>)} spids: [1604] ) ] ) ] spids: [1588 1601] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_home) op: assign_op.Equal rhs: {(SQ <'-m -d "$uhome"'>)} spids: [1613] ) ] ) ] ) ] ) ] spids: [1523 1544] ) (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$Dflag'))} {<-a>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uhome'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_home) op: assign_op.Equal rhs: {(SQ <'-d "$uhome"'>)} spids: [1649] ) ] ) ] spids: [1625 1646] ) ] ) (command.Case to_match: {($ Id.VSub_DollarName '$passwdtype')} arms: [ (case_arm pat_list: [{<no>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwdmethod) op: assign_op.Equal rhs: {(DQ <'-w no'>)} spids: [1669] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwd) op: assign_op.Equal rhs: {(DQ <'-h -'>)} spids: [1675] ) ] ) ] spids: [1665 1666 1681 -1] ) (case_arm pat_list: [{<yes>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwdmethod) op: assign_op.Equal rhs: {(DQ <'-w yes'>)} spids: [1712] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwd) op: assign_op.Equal rhs: {(DQ <'-h 0'>)} spids: [1718] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_upasswd) op: assign_op.Equal rhs: {(SQ <'echo "$upass" |'>)} spids: [1724] ) ] ) ] spids: [1684 1685 1730 -1] ) (case_arm pat_list: [{<none>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwdmethod) op: assign_op.Equal rhs: {(DQ <'-w none'>)} spids: [1737] ) ] ) ] spids: [1733 1734 1743 -1] ) (case_arm pat_list: [{<random>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passwdmethod) op: assign_op.Equal rhs: {(DQ <'-w random'>)} spids: [1750] ) ] ) ] spids: [1746 1747 1756 -1] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pwcmd) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$_upasswd') <' '> (${ Id.VSub_Name PWCMD) <' useradd '> ($ Id.VSub_DollarName '$_uid') <' '> ($ Id.VSub_DollarName '$_name') <' '> ($ Id.VSub_DollarName '$_group') <' '> ($ Id.VSub_DollarName '$_grouplist') <' '> ($ Id.VSub_DollarName '$_comment') ) } spids: [1763] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pwcmd) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$_pwcmd') <' '> ($ Id.VSub_DollarName '$_shell') <' '> ($ Id.VSub_DollarName '$_class') <' '> ($ Id.VSub_DollarName '$_home') <' '> ($ Id.VSub_DollarName '$_dotdir') <' '> ($ Id.VSub_DollarName '$_passwdmethod') <' '> ($ Id.VSub_DollarName '$_passwd') ) } spids: [1783] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pwcmd) op: assign_op.Equal rhs: { (DQ ($ Id.VSub_DollarName '$_pwcmd') <' '> ($ Id.VSub_DollarName '$_expire') <' '> ($ Id.VSub_DollarName '$_pwexpire') ) } spids: [1801] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_output) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<eval>} {($ Id.VSub_DollarName '$_pwcmd')}) ) } spids: [1816] ) ] ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} { (DQ <'There was an error adding user ('> ($ Id.VSub_DollarName '$username') <').'> ) } ) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] spids: [1812 1827] ) ] else_action: [ (C {<info>} { (DQ <'Successfully added ('> ($ Id.VSub_DollarName '$username') <') to the user database.'> ) } ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ <random>)} {<Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$passwdtype'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:randompass) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_output'))} spids: [1876] ) ] ) (C {<info>} { (DQ <'Password for ('> ($ Id.VSub_DollarName '$username') <') is: '> ($ Id.VSub_DollarName '$randompass') ) } ) ] spids: [1856 1873] ) ] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$disableflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {(${ Id.VSub_Name PWCMD)} {<lock>} {($ Id.VSub_DollarName '$username')} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<info>} {(DQ <'Account ('> ($ Id.VSub_DollarName '$username') <') is locked.'>)} ) ] spids: [1915 1927] ) ] else_action: [ (C {<info>} { (DQ <'Account ('> ($ Id.VSub_DollarName '$username') <') could NOT be locked.'> ) } ) ] ) ] spids: [1899 1912] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_line) op: assign_op.Equal rhs: (word.Empty) spids: [1958] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_owner) op: assign_op.Equal rhs: (word.Empty) spids: [1961] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_perms) op: assign_op.Equal rhs: (word.Empty) spids: [1964] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$msgflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-r>} {(DQ ($ Id.VSub_DollarName '$msgfile'))} {<Id.Lit_RBracket ']'>} ) (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_dir) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<dirname>} {($ Id.VSub_DollarName '$msgfile')}) ) ) } spids: [2018] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_file) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<basename>} {($ Id.VSub_DollarName '$msgfile')}) ) ) } spids: [2030] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_perms) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<'/usr/bin/find'>} {($ Id.VSub_DollarName '$_dir')} {<-name>} {($ Id.VSub_DollarName '$_file')} {<-perm>} {<Id.Lit_Other '+'> <07022>} {<-prune>} ) ) } spids: [2042] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_owner) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<'/usr/bin/find'>} {($ Id.VSub_DollarName '$_dir')} {<-name>} {($ Id.VSub_DollarName '$_file')} {<-user>} {<0>} {<-prune>} ) ) } spids: [2063] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_owner'))} {<-o>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_perms'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} { (DQ <'The message file ('> ($ Id.VSub_DollarName '$msgfile') <') may be writeable only by root.'> ) } ) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] spids: [2083 2104] ) ] ) (command.Pipeline children: [ (C {<cat>} {(DQ ($ Id.VSub_DollarName '$msgfile'))}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<read>} {<_line>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<eval>} {<echo>} {(DQ ($ Id.VSub_DollarName '$_line'))}) ] ) ) (C {(${ Id.VSub_Name MAILCMD)} {<-s> (DQ <Welcome>)} {(${ Id.VSub_Name username)} ) ] negated: F ) (C {<info>} { (DQ <'Sent welcome message to ('> ($ Id.VSub_DollarName '$username') <').'> ) } ) ] ) ] ) ] spids: [1967 1980] ) ] ) ] ) ) (command.ShFunction name: get_user body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [2216] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_Colon ':'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<echo>} {<-n>} {(DQ <'Username: '>)}) (C {<read>} {<_input>})] spids: [2249 2262] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [2282] ) ] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} {(DQ <'You must enter a username!'>)}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] ) ] spids: [2325 2338] ) ] ) (command.Simple words: [{(${ Id.VSub_Name PWCMD)} {<usershow>} {($ Id.VSub_DollarName '$_input')}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_QMark '$?'))} {<-eq>} {<0>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} {(DQ <'User exists!'>)}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] ) ] spids: [2382 2397] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Break break>) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:username) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [2431] ) ] ) ] ) ) (command.ShFunction name: get_gecos body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [2458] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<echo>} {<-n>} {(DQ <'Full name: '>)}) (C {<read>} {<_input>})] spids: [2482 2495] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f7>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [2515] ) ] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ugecos) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [2541] ) ] ) ] ) ) (command.ShFunction name: get_shell body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [2571] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_fullpath) op: assign_op.Equal rhs: (word.Empty) spids: [2574] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$defaultshell'))} spids: [2577] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$Sflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [ (C {<shell_exists>} {($ Id.VSub_DollarName '$ushell')}) ] negated: T ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<info>} {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$defaultshell'))} spids: [2628] ) ] ) ] spids: [2604 2614] ) ] ) ] spids: [2588 2601] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {<-n>} { (DQ <'Shell ('> ($ Id.VSub_DollarName '$shells') <') ['> (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<basename>} {($ Id.VSub_DollarName '$ushell')}) ) <']: '> ) } ) (C {<read>} {<_input>}) ] spids: [2641 2654] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f9>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [2684] ) ] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$Sflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [2742] ) ] ) ] spids: [2726 2739] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_fullpath) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<fullpath_from_shell>} {($ Id.VSub_DollarName '$_input')}) ) } spids: [2751] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_fullpath'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_fullpath'))} spids: [2777] ) ] ) ] spids: [2761 2774] ) ] else_action: [ (C {<err>} { (DQ <'Invalid shell ('> ($ Id.VSub_DollarName '$_input') <') for user '> ($ Id.VSub_DollarName '$username') <.> ) } ) (C {<info>} {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ushell) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$defaultshell'))} spids: [2808] ) ] ) ] ) ] ) ] spids: [2710 2723] ) ] ) ] ) ) (command.ShFunction name: get_homedir body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [2844] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {<-n>} { (DQ <'Home directory ['> (${ Id.VSub_Name homeprefix) <'/'> (${ Id.VSub_Name username) <']: '> ) } ) (C {<read>} {<_input>}) ] spids: [2847 2860] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f8>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [2888] ) ] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uhome) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [2931] ) ] ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:homeprefix) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<dirname>} {($ Id.VSub_DollarName '$uhome')}) ) ) } spids: [2965] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:homeprefix) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$uhome'))} spids: [2978] ) ] ) ] ) ] spids: [2915 2928] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uhome) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name homeprefix) <'/'> (${ Id.VSub_Name username))} spids: [2987] ) ] ) ] ) ] ) ) (command.ShFunction name: get_homeperm body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uhomeperm) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$defaultHomePerm')} spids: [3020] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [3024] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prompt) op: assign_op.Equal rhs: (word.Empty) spids: [3027] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uhomeperm'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prompt) op: assign_op.Equal rhs: { (DQ <'Home directory permissions ['> (${ Id.VSub_Name uhomeperm) <']: '>) } spids: [3047] ) ] ) ] spids: [3031 3044] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prompt) op: assign_op.Equal rhs: {(DQ <'Home directory permissions (Leave empty for default): '>)} spids: [3060] ) ] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_prompt'))}) (C {<read>} {<_input>}) ] spids: [3069 3082] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uhomeperm) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [3119] ) ] ) ] spids: [3103 3116] ) ] ) ] ) ) (command.ShFunction name: get_uid body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uuid) op: assign_op.Equal rhs: {(${ Id.VSub_Name uidstart)} spids: [3149] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [3155] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prompt) op: assign_op.Equal rhs: (word.Empty) spids: [3158] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$uuid'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uuid) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<get_nextuid>} {($ Id.VSub_DollarName '$uuid')}) ) } spids: [3178] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prompt) op: assign_op.Equal rhs: {(DQ <'Uid ['> ($ Id.VSub_DollarName '$uuid') <']: '>)} spids: [3188] ) ] ) ] spids: [3162 3175] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_prompt) op: assign_op.Equal rhs: {(DQ <'Uid (Leave empty for default): '>)} spids: [3199] ) ] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_prompt'))}) (C {<read>} {<_input>}) ] spids: [3208 3221] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f2>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [3241] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uuid) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$_input')} spids: [3280] ) ] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uuid) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<get_nextuid>} {($ Id.VSub_DollarName '$uuid')}) ) } spids: [3284] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uidstart) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$uuid')} spids: [3294] ) ] ) ] ) ) (command.ShFunction name: get_class body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uclass) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$defaultclass'))} spids: [3316] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [3322] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_class) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name uclass> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {(DQ <default>)} ) ) } spids: [3325] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {<-n>} {(DQ <'Login class ['> ($ Id.VSub_DollarName '$_class') <']: '>)}) (C {<read>} {<_input>}) ] spids: [3336 3349] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f4>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [3371] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uclass) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [3410] ) ] ) ] ) ] ) ) (command.ShFunction name: get_logingroup body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ulogingroup) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$defaultLgroup'))} spids: [3446] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [3452] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {<-n>} { (DQ <'Login group ['> (braced_var_sub token: <Id.VSub_Name ulogingroup> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {($ Id.VSub_DollarName '$username')} ) ) <']: '> ) } ) (C {<read>} {<_input>}) ] spids: [3456 3469] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f3>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [3495] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ulogingroup) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [3538] ) ] ) ] ) ] ) ) (command.ShFunction name: get_groups body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ugroups) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$defaultgroups'))} spids: [3565] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: (word.Empty) spids: [3571] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_group) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name ulogingroup> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {(DQ (${ Id.VSub_Name username))} ) ) } spids: [3574] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) (C {<echo>} {<-n>} { (DQ <'Login group is '> ($ Id.VSub_DollarName '$_group') <'. Invite '> ($ Id.VSub_DollarName '$username') ) } ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) (C {<echo>} {<-n>} {(DQ <' into other groups? ['> ($ Id.VSub_DollarName '$ugroups') <']: '>)} ) ] ) ] spids: [3587 3600] ) ] else_action: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) (C {<echo>} {<-n>} {(DQ <'Enter additional groups ['> ($ Id.VSub_DollarName '$ugroups') <']: '>)} ) ] ) ] ) (C {<read>} {<_input>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ugroups) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [3697] ) ] ) ] ) ] ) ) (command.ShFunction name: get_expire_dates body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:upwexpire) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f5>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [3724] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uexpire) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {(DQ ($ Id.VSub_DollarName '$fileline'))}) (C {<cut>} {<-f6>} {<-d> <Id.Lit_Colon ':'>}) ] negated: F ) ) ) } spids: [3747] ) ] ) ] ) ) (command.ShFunction name: get_password body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$savedpwtype'))} {<Id.Lit_RBracket ']'>} ) (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$savedpwtype')} spids: [3830] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:savedpwtype) op: assign_op.Equal rhs: (word.Empty) spids: [3834] ) ] ) ] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:upass) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name fileline> suffix_op: (suffix_op.Unary tok: <Id.VOp1_Pound '#'> arg_word: {<Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> } ) ) } spids: [3845] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$upass'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.Case to_match: {($ Id.VSub_DollarName '$passwdtype')} arms: [ (case_arm pat_list: [{<yes>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {<none>} spids: [3902] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:savedpwtype) op: assign_op.Equal rhs: {<yes>} spids: [3906] ) ] ) ] spids: [3894 3895 3910 -1] ) ] ) ] spids: [3871 3884] ) ] else_action: [ (command.Case to_match: {($ Id.VSub_DollarName '$passwdtype')} arms: [ (case_arm pat_list: [{<random>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {<yes>} spids: [3930] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:savedpwtype) op: assign_op.Equal rhs: {<random>} spids: [3934] ) ] ) ] spids: [3926 3927 3938 -1] ) ] ) ] ) ] ) ) (command.ShFunction name: input_from_file body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_field) op: assign_op.Equal rhs: (word.Empty) spids: [3968] ) ] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<read>} {<-r>} {<fileline>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Case to_match: {(DQ ($ Id.VSub_DollarName '$fileline'))} arms: [ (case_arm pat_list: [ {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'>) <Id.Lit_Star '*'> } {(SQ )} ] spids: [3994 3999 4002 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (command.AndOr ops: [Id.Op_DPipe] children: [ (C {<get_user>}) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] ) (C {<get_gecos>}) (C {<get_uid>}) (C {<get_logingroup>}) (C {<get_class>}) (C {<get_shell>}) (C {<get_homedir>}) (C {<get_homeperm>}) (C {<get_password>}) (C {<get_expire_dates>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ugroups) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$defaultgroups'))} spids: [4043] ) ] ) (C {<add_user>}) ] spids: [4005 4006 4053 -1] ) ] ) ] ) ) ] ) ) (command.ShFunction name: input_interactive body: (BraceGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_disable) op: assign_op.Equal rhs: (word.Empty) spids: [4083] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pass) op: assign_op.Equal rhs: (word.Empty) spids: [4086] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_passconfirm) op: assign_op.Equal rhs: (word.Empty) spids: [4089] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_random) op: assign_op.Equal rhs: {(DQ <no>)} spids: [4092] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_emptypass) op: assign_op.Equal rhs: {(DQ <no>)} spids: [4098] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_usepass) op: assign_op.Equal rhs: {(DQ <yes>)} spids: [4104] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_logingroup_ok) op: assign_op.Equal rhs: {(DQ <no>)} spids: [4110] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_groups_ok) op: assign_op.Equal rhs: {(DQ <no>)} spids: [4116] ) ] ) (command.Case to_match: {($ Id.VSub_DollarName '$passwdtype')} arms: [ (case_arm pat_list: [{<none>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_emptypass) op: assign_op.Equal rhs: {(DQ <yes>)} spids: [4133] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_usepass) op: assign_op.Equal rhs: {(DQ <yes>)} spids: [4139] ) ] ) ] spids: [4129 4130 4145 -1] ) (case_arm pat_list: [{<no>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_usepass) op: assign_op.Equal rhs: {(DQ <no>)} spids: [4152] ) ] ) ] spids: [4148 4149 4158 -1] ) (case_arm pat_list: [{<random>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_random) op: assign_op.Equal rhs: {(DQ <yes>)} spids: [4165] ) ] ) ] spids: [4161 4162 4171 -1] ) ] ) (C {<get_user>}) (C {<get_gecos>}) (C {<get_uid>}) (command.WhileUntil keyword: <Id.KW_Until until> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_logingroup_ok'))} {<Id.Lit_Equals '='>} {<yes>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<get_logingroup>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_logingroup_ok) op: assign_op.Equal rhs: {<yes>} spids: [4217] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$ulogingroup'))} {<-a>} {(DQ ($ Id.VSub_DollarName '$username'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$ulogingroup'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [ (command.Simple words: [ {(${ Id.VSub_Name PWCMD)} {<show>} {<group>} {($ Id.VSub_DollarName '$ulogingroup')} ] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} { (DQ <'Group '> ($ Id.VSub_DollarName '$ulogingroup') <' does not exist!'> ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_logingroup_ok) op: assign_op.Equal rhs: {<no>} spids: [4284] ) ] ) ] spids: [4250 4272] ) ] ) ] spids: [4221 4247] ) ] ) ] ) ) (command.WhileUntil keyword: <Id.KW_Until until> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_groups_ok'))} {<Id.Lit_Equals '='>} {<yes>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<get_groups>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_groups_ok) op: assign_op.Equal rhs: {<yes>} spids: [4318] ) ] ) (command.ForEach iter_name: i iter_words: [{($ Id.VSub_DollarName '$ugroups')}] do_arg_iter: F body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$username'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$i'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [ (command.Simple words: [ {(${ Id.VSub_Name PWCMD)} {<show>} {<group>} {($ Id.VSub_DollarName '$i')} ] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} { (DQ <'Group '> ($ Id.VSub_DollarName '$i') <' does not exist!'> ) } ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_groups_ok) op: assign_op.Equal rhs: {<no>} spids: [4389] ) ] ) ] spids: [4355 4377] ) ] ) ] spids: [4334 4352] ) ] ) ] ) ) ] ) ) (C {<get_class>}) (C {<get_shell>}) (C {<get_homedir>}) (C {<get_homeperm>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_Colon ':'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<echo>} {<-n>} { (DQ <'Use password-based authentication? ['> ($ Id.VSub_DollarName '$_usepass') <']: '> ) } ) (C {<read>} {<_input>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$_usepass')} spids: [4456] ) ] ) ] ) (command.Case to_match: {($ Id.VSub_DollarName '$_input')} arms: [ (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {(DQ <no>)} spids: [4480] ) ] ) ] spids: [4467 4477 4486 -1] ) (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] action: [ (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_Colon ':'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<echo>} {<-n>} { (DQ <'Use an empty password? (yes/no) ['> ($ Id.VSub_DollarName '$_emptypass') <']: '> ) } ) (C {<read>} {<_input>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_emptypass) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$_input')} spids: [4549] ) ] ) ] ) (command.Case to_match: {($ Id.VSub_DollarName '$_emptypass')} arms: [ (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] action: [ (C {<echo>} {<-n>} { (DQ <'Use a random password? (yes/no) ['> ($ Id.VSub_DollarName '$_random') <']: '> ) } ) (C {<read>} {<_input>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_random) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$_input'))} spids: [4601] ) ] ) ] ) (command.Case to_match: {($ Id.VSub_DollarName '$_random')} arms: [ (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {(DQ <random>)} spids: [4637] ) ] ) (command.ControlFlow token: <Id.ControlFlow_Break break> ) ] spids: [4614 4634 4646 -1] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {(DQ <yes>)} spids: [4652] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token: <Id.ControlFlow_Break break> ) ] ) (C {<trap>} {(SQ <'stty echo; exit'>)} {<0>} {<1>} {<2>} {<3>} {<15>} ) (C {<stty>} {<-echo>}) (C {<echo>} {<-n>} {(DQ <'Enter password: '>)}) (C {<read>} {<-r>} {<upass>}) (C {<echo> (SQ )}) (C {<echo>} {<-n>} {(DQ <'Enter password again: '>)}) (C {<read>} {<-r>} {<_passconfirm>}) (C {<echo>} {(SQ )}) (C {<stty>} {<echo>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$upass'))} {<-a>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_passconfirm'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] ) ] spids: [4560 4570 4776 -1] ) (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {(DQ <none>)} spids: [4802] ) ] ) (command.Sentence child: (command.ControlFlow token: <Id.ControlFlow_Break break> ) terminator: <Id.Op_Semi _> ) ] spids: [4779 4799 4812 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] spids: [4815 4816 4826 -1] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$upass'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ ($ Id.VSub_DollarName '$_passconfirm'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {(DQ <'Passwords did not match!'>)}) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] spids: [4832 4850] ) ] ) (command.ControlFlow token: <Id.ControlFlow_Break break> ) ] ) ) ] spids: [4489 4509 4872 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)] spids: [4875 4876 4886 -1] ) ] ) (command.Sentence child: (command.ControlFlow token:<Id.ControlFlow_Break break>) terminator: <Id.Op_Semi _> ) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_disable) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name disableflag> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {(DQ <no>)} ) ) } spids: [4899] ) ] ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_Colon ':'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<echo>} {<-n>} { (DQ <'Lock out the account after creation? ['> ($ Id.VSub_DollarName '$_disable') <']: '> ) } ) (C {<read>} {<_input>}) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$_input'))} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_input) op: assign_op.Equal rhs: {($ Id.VSub_DollarName '$_disable')} spids: [4946] ) ] ) ] ) (command.Case to_match: {($ Id.VSub_DollarName '$_input')} arms: [ (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:disableflag) op: assign_op.Equal rhs: (word.Empty) spids: [4970] ) ] ) ] spids: [4957 4967 4973 -1] ) (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:disableflag) op: assign_op.Equal rhs: {<yes>} spids: [4999] ) ] ) ] spids: [4976 4996 5003 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)] spids: [5006 5007 5017 -1] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Break break>) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_disable) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name disableflag> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {(DQ <no>)} ) ) } spids: [5043] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {<Username>} {($ Id.VSub_DollarName '$username')} ) ] ) (command.Case to_match: {($ Id.VSub_DollarName '$passwdtype')} arms: [ (case_arm pat_list: [{<yes>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pass) op: assign_op.Equal rhs: {(SQ <'*****'>)} spids: [5089] ) ] ) ] spids: [5085 5086 5095 -1] ) (case_arm pat_list: [{<no>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pass) op: assign_op.Equal rhs: {(SQ <'<disabled>'>)} spids: [5102] ) ] ) ] spids: [5098 5099 5108 -1] ) (case_arm pat_list: [{<none>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pass) op: assign_op.Equal rhs: {(SQ <'<blank>'>)} spids: [5115] ) ] ) ] spids: [5111 5112 5121 -1] ) (case_arm pat_list: [{<random>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_pass) op: assign_op.Equal rhs: {(SQ <'<random>'>)} spids: [5128] ) ] ) ] spids: [5124 5125 5134 -1] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Password>)} {(DQ ($ Id.VSub_DollarName '$_pass'))} ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Pass Type'>)} {(DQ ($ Id.VSub_DollarName '$passwdtype'))} ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Full Name'>)} {(DQ ($ Id.VSub_DollarName '$ugecos'))} ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Uid>)} {(DQ ($ Id.VSub_DollarName '$uuid'))} ) ] ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Class>)} {(DQ ($ Id.VSub_DollarName '$uclass'))} ) (C {<printf>} {(DQ <'%-10s : %s %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Groups>)} { (DQ (braced_var_sub token: <Id.VSub_Name ulogingroup> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {($ Id.VSub_DollarName '$username')} ) ) ) } {(DQ ($ Id.VSub_DollarName '$ugroups'))} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Home>)} {(DQ ($ Id.VSub_DollarName '$uhome'))} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <'Home Mode'>)} {(DQ ($ Id.VSub_DollarName '$uhomeperm'))} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Shell>)} {(DQ ($ Id.VSub_DollarName '$ushell'))} ) (C {<printf>} {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)} {(DQ <Locked>)} {(DQ ($ Id.VSub_DollarName '$_disable'))} ) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_Colon ':'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (C {<echo>} {<-n>} {(DQ <'OK? (yes/no): '>)}) (C {<read>} {<_input>}) (command.Case to_match: {($ Id.VSub_DollarName '$_input')} arms: [ (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] action: [ (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] spids: [5396 5406 5414 -1] ) (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] action: [(C {<add_user>})] spids: [5417 5437 5443 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)] spids: [5446 5447 5453 -1] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Break break>) ] ) ) (command.ControlFlow token:<Id.ControlFlow_Return return> arg_word:{<0>}) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:THISCMD) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<'/usr/bin/basename'>} {($ Id.VSub_Number '$0')}) ) } spids: [5476] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:DEFAULTSHELL) op: assign_op.Equal rhs: {<'/bin/sh'>} spids: [5485] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ADDUSERCONF) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name ADDUSERCONF> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <adduser.conf>} ) ) ) } spids: [5488] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:PWCMD) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name PWCMD> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {<Id.Lit_Slash '/'> <usr> <Id.Lit_Slash '/'> <sbin> <Id.Lit_Slash '/'> <pw>} ) ) ) } spids: [5500] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:MAILCMD) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name MAILCMD> suffix_op: (suffix_op.Unary tok:<Id.VTest_ColonHyphen ':-'> arg_word:{<mail>}) ) ) } spids: [5514] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ETCSHELLS) op: assign_op.Equal rhs: { (DQ (braced_var_sub token: <Id.VSub_Name ETCSHELLS> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <shells>} ) ) ) } spids: [5523] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:NOHOME) op: assign_op.Equal rhs: {(DQ <'/nonexistent'>)} spids: [5535] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:NOLOGIN) op: assign_op.Equal rhs: {(DQ <nologin>)} spids: [5540] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:NOLOGIN_PATH) op: assign_op.Equal rhs: {(DQ <'/usr/sbin/nologin'>)} spids: [5545] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:GREPCMD) op: assign_op.Equal rhs: {(DQ <'/usr/bin/grep'>)} spids: [5550] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:DATECMD) op: assign_op.Equal rhs: {(DQ <'/bin/date'>)} spids: [5555] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:username) op: assign_op.Equal rhs: (word.Empty) spids: [5567] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uuid) op: assign_op.Equal rhs: (word.Empty) spids: [5569] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uidstart) op: assign_op.Equal rhs: (word.Empty) spids: [5571] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ugecos) op: assign_op.Equal rhs: (word.Empty) spids: [5573] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ulogingroup) op: assign_op.Equal rhs: (word.Empty) spids: [5575] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uclass) op: assign_op.Equal rhs: (word.Empty) spids: [5577] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uhome) op: assign_op.Equal rhs: (word.Empty) spids: [5579] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uhomeperm) op: assign_op.Equal rhs: (word.Empty) spids: [5581] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:upass) op: assign_op.Equal rhs: (word.Empty) spids: [5583] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ushell) op: assign_op.Equal rhs: (word.Empty) spids: [5585] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:udotdir) op: assign_op.Equal rhs: {<'/usr/share/skel'>} spids: [5587] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ugroups) op: assign_op.Equal rhs: (word.Empty) spids: [5590] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uexpire) op: assign_op.Equal rhs: (word.Empty) spids: [5592] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:upwexpire) op: assign_op.Equal rhs: (word.Empty) spids: [5594] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:shells) op: assign_op.Equal rhs: {(DQ (command_sub left_token:<Id.Left_Backtick '`'> child:(C {<valid_shells>})))} spids: [5596] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {(DQ <yes>)} spids: [5605] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:msgfile) op: assign_op.Equal rhs: {<'/etc/adduser.msg'>} spids: [5610] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:msgflag) op: assign_op.Equal rhs: (word.Empty) spids: [5613] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:quietflag) op: assign_op.Equal rhs: (word.Empty) spids: [5615] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:configflag) op: assign_op.Equal rhs: (word.Empty) spids: [5617] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:fflag) op: assign_op.Equal rhs: (word.Empty) spids: [5619] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:infile) op: assign_op.Equal rhs: (word.Empty) spids: [5621] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:disableflag) op: assign_op.Equal rhs: (word.Empty) spids: [5623] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Dflag) op: assign_op.Equal rhs: (word.Empty) spids: [5625] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Sflag) op: assign_op.Equal rhs: (word.Empty) spids: [5627] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:readconfig) op: assign_op.Equal rhs: {(DQ <yes>)} spids: [5629] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:homeprefix) op: assign_op.Equal rhs: {(DQ <'/home'>)} spids: [5634] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:randompass) op: assign_op.Equal rhs: (word.Empty) spids: [5639] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:fileline) op: assign_op.Equal rhs: (word.Empty) spids: [5641] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:savedpwtype) op: assign_op.Equal rhs: (word.Empty) spids: [5643] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultclass) op: assign_op.Equal rhs: (word.Empty) spids: [5645] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultLgroup) op: assign_op.Equal rhs: (word.Empty) spids: [5647] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultgroups) op: assign_op.Equal rhs: (word.Empty) spids: [5649] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultshell) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name DEFAULTSHELL))} spids: [5651] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultHomePerm) op: assign_op.Equal rhs: (word.Empty) spids: [5658] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:procowner) op: assign_op.Equal rhs: { (braced_var_sub token: <Id.VSub_Name procowner> suffix_op: (suffix_op.Unary tok: <Id.VTest_ColonHyphen ':-'> arg_word: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<'/usr/bin/id'>} {<-u>}) ) } ) ) } spids: [5673] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$procowner'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} {(SQ <'you must be the super-user (uid 0) to use this utility.'>)}) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [5686 5704] ) ] ) (command.ForEach iter_name: _i iter_words: [{($ Id.VSub_Star '$*')}] do_arg_iter: F body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_i'))} {<Id.Lit_Equals '='>} {(DQ <-N>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:readconfig) op: assign_op.Equal rhs: (word.Empty) spids: [5772] ) ] ) (command.Sentence child: (command.ControlFlow token:<Id.ControlFlow_Break break>) terminator: <Id.Op_Semi _> ) ] spids: [5752 5769] ) ] ) ] ) ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$readconfig'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Subshell child: (command.Simple words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-r>} {(${ Id.VSub_Name ADDUSERCONF)} {<Id.Lit_RBracket ']'>} ) (command.Simple words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}] redirects: [ (redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'/dev/null'>} ) (redir op: <Id.Redir_GreatAnd '2>&'> loc: (redir_loc.Fd fd:2) arg: {<1>} ) ] do_fork: T ) ] ) ] spids: [5807 5827] ) ] ) ] spids: [5783 5796] ) ] ) (command.ForEach iter_name: _switch do_arg_iter: T body: (command.DoGroup children: [ (command.Case to_match: {($ Id.VSub_DollarName '$_switch')} arms: [ (case_arm pat_list: [{<-L>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultclass) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [5888] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [5884 5885 5900 -1] ) (case_arm pat_list: [{<-C>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:configflag) op: assign_op.Equal rhs: {<yes>} spids: [5907] ) ] ) (C {<shift>}) ] spids: [5903 5904 5914 -1] ) (case_arm pat_list: [{<-D>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Dflag) op: assign_op.Equal rhs: {<yes>} spids: [5921] ) ] ) (C {<shift>}) ] spids: [5917 5918 5928 -1] ) (case_arm pat_list: [{<-E>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:disableflag) op: assign_op.Equal rhs: {<yes>} spids: [5935] ) ] ) (C {<shift>}) ] spids: [5931 5932 5942 -1] ) (case_arm pat_list: [{<-k>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:udotdir) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [5949] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [5945 5946 5961 -1] ) (case_arm pat_list: [{<-f>}] action: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number '$2'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <->)} {<Id.Lit_RBracket ']'>} ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:infile) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [5985] ) ] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:fflag) op: assign_op.Equal rhs: {<yes>} spids: [5991] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [5964 5965 6001 -1] ) (case_arm pat_list: [{<-g>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultLgroup) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [6008] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6004 6005 6020 -1] ) (case_arm pat_list: [{<-G>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultgroups) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [6027] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6023 6024 6039 -1] ) (case_arm pat_list: [{<-h>}] action: [ (C {<show_usage>}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<0>} ) ] spids: [6042 6043 6054 -1] ) (case_arm pat_list: [{<-d>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:homeprefix) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [6061] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6057 6058 6073 -1] ) (case_arm pat_list: [{<-m>}] action: [ (command.Case to_match: {(DQ ($ Id.VSub_Number '$2'))} arms: [ (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:msgflag) op: assign_op.Equal rhs: (word.Empty) spids: [6098] ) ] ) ] spids: [6089 6095 6101 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:msgflag) op: assign_op.Equal rhs: {<yes>} spids: [6108] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:msgfile) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [6112] ) ] ) ] spids: [6104 6105 6118 -1] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6076 6077 6130 -1] ) (case_arm pat_list: [{<-M>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultHomePerm) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [6137] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6133 6134 6147 -1] ) (case_arm pat_list: [{<-N>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:readconfig) op: assign_op.Equal rhs: (word.Empty) spids: [6154] ) ] ) (C {<shift>}) ] spids: [6150 6151 6160 -1] ) (case_arm pat_list: [{<-w>}] action: [ (command.Case to_match: {(DQ ($ Id.VSub_Number '$2'))} arms: [ (case_arm pat_list: [{<no>} {<none>} {<random>} {<yes>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:passwdtype) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [6186] ) ] ) ] spids: [6176 6183 6190 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (C {<show_usage>}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [6193 6194 6205 -1] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6163 6164 6217 -1] ) (case_arm pat_list: [{<-q>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:quietflag) op: assign_op.Equal rhs: {<yes>} spids: [6224] ) ] ) (C {<shift>}) ] spids: [6220 6221 6231 -1] ) (case_arm pat_list: [{<-s>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:defaultshell) op: assign_op.Equal rhs: { (DQ (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<fullpath_from_shell>} {($ Id.VSub_Number '$2')}) ) ) } spids: [6238] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6234 6235 6256 -1] ) (case_arm pat_list: [{<-S>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:Sflag) op: assign_op.Equal rhs: {<yes>} spids: [6263] ) ] ) (C {<shift>}) ] spids: [6259 6260 6270 -1] ) (case_arm pat_list: [{<-u>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uidstart) op: assign_op.Equal rhs: {($ Id.VSub_Number '$2')} spids: [6277] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [6273 6274 6287 -1] ) ] ) ] ) ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$fflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$infile'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<input_from_file>})] spids: [6320 6333] ) (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$infile'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-r>} {(DQ ($ Id.VSub_DollarName '$infile'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.Simple words: [{<input_from_file>}] redirects: [ (redir op: <Id.Redir_Less '<'> loc: (redir_loc.Fd fd:0) arg: {($ Id.VSub_DollarName '$infile')} ) ] do_fork: T ) ] spids: [6355 6368] ) ] else_action: [ (C {<err>} { (DQ <'File ('> ($ Id.VSub_DollarName '$infile') <') is unreadable or does not exist.'> ) } ) ] ) ] spids: [6339 6352] ) ] ) ] spids: [6304 6317] ) ] else_action: [ (C {<input_interactive>}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [(command.Sentence child:(C {<Id.Lit_Colon ':'>}) terminator:<Id.Op_Semi _>)] ) body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$configflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [(C {<echo>} {<-n>} {(DQ <'Add another user? (yes/no): '>)})] spids: [6410 6423] ) ] else_action: [ (C {<echo>} {<-n>} {(DQ <'Re-edit the default configuration? (yes/no): '>)}) ] ) (C {<read>} {<_input>}) (command.Case to_match: {($ Id.VSub_DollarName '$_input')} arms: [ (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>} ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:uidstart) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<get_nextuid>} {($ Id.VSub_DollarName '$uidstart')}) ) } spids: [6485] ) ] ) (C {<input_interactive>}) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] spids: [6462 6482 6501 -1] ) (case_arm pat_list: [ {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'> } {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>} ] action: [(C {<echo>} {(DQ <'Goodbye!'>)})] spids: [6504 6514 6524 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)] spids: [6527 6528 6534 -1] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Break break>) ] ) ) ] ) ] )