(command.CommandList children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ATJOBDIR) op: assign_op.Equal rhs: {(DQ <'/var/at/jobs'>)} spids: [85] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:CRONJOBDIR) op: assign_op.Equal rhs: {(DQ <'/var/cron/tabs'>)} spids: [90] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:MAILSPOOL) op: assign_op.Equal rhs: {(DQ <'/var/mail'>)} spids: [95] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:SIGKILL) op: assign_op.Equal rhs: {(DQ <-KILL>)} spids: [100] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:TEMPDIRS) op: assign_op.Equal rhs: {(DQ <'/tmp /var/tmp'>)} spids: [105] ) ] ) (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: [110] ) ] ) (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: [119] ) ] ) (command.ShFunction name: err body: (BraceGroup children: [ (command.Simple words: [{<echo>} {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>} {($ Id.VSub_Star '$*')}] redirects: [(redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})] do_fork: T ) ] ) ) (command.ShFunction name: verbose body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$vflag'))} {<Id.Lit_RBracket ']'>} ) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<0>} ) (command.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<1>} ) ] ) ] ) ) (command.ShFunction name: rm_files body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:login) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [239] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:totalcount) op: assign_op.Equal rhs: {<0>} spids: [248] ) ] ) (command.ForEach iter_name: _dir iter_words: [{(${ Id.VSub_Name TEMPDIRS)}] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:filecount) op: assign_op.Equal rhs: {<0>} spids: [267] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {<-d>} {($ Id.VSub_DollarName '$_dir')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} {(DQ ($ Id.VSub_DollarName '$_dir') <' is not a valid directory.'>)} ) (command.ControlFlow token: <Id.ControlFlow_Continue continue> ) ] spids: [271 284] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {<-n>} { (DQ <'Removing files owned by ('> ($ Id.VSub_DollarName '$login') <') in '> ($ Id.VSub_DollarName '$_dir') <':'> ) } ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:filecount) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple words: [ {<find>} {(DQ ($ Id.VSub_DollarName '$_dir'))} {<-user>} {(DQ ($ Id.VSub_DollarName '$login'))} {<-delete>} {<-print>} ] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) (C {<wc>} {<-l>}) (C {<sed>} {(SQ <'s/ *//'>)}) ] negated: F ) ) } spids: [318] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {(DQ <' '> ($ Id.VSub_DollarName '$filecount') <' removed.'>)}) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:totalcount) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName '$totalcount')} right: {($ Id.VSub_DollarName '$filecount')} ) ) } spids: [372] ) ] ) ] ) ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (command.Pipeline children:[(C {<verbose>})] negated:T) (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$totalcount')} {<-ne>} {<0>} {<Id.Lit_RBracket ']'>} ) (C {<echo>} {<-n>} {(DQ <' files('> ($ Id.VSub_DollarName '$totalcount') <')'>)}) ] ) ] ) ) (command.ShFunction name: rm_mail body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:login) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [450] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {<-n>} {(DQ <'Removing mail spool(s) for ('> ($ Id.VSub_DollarName '$login') <'):'>)} ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name MAILSPOOL) <'/'> ($ Id.VSub_DollarName '$login')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<verbose>}) (C {<echo>} {<-n>} { (DQ <' '> (${ Id.VSub_Name MAILSPOOL) <'/'> ($ Id.VSub_DollarName '$login')) } ) (C {<echo>} {<-n>} {(DQ <' mailspool'>)}) ] ) (C {<rm>} {(${ Id.VSub_Name MAILSPOOL) <'/'> ($ Id.VSub_DollarName '$login')}) ] spids: [474 489] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name MAILSPOOL) <'/.'> (${ Id.VSub_Name login) <.pop>} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<verbose>}) (C {<echo>} {<-n>} { (DQ <' '> (${ Id.VSub_Name MAILSPOOL) <'/.'> (${ Id.VSub_Name login) <.pop>) } ) (C {<echo>} {<-n>} {(DQ <' pop3'>)}) ] ) (C {<rm>} {(${ Id.VSub_Name MAILSPOOL) <'/.'> (${ Id.VSub_Name login) <.pop>}) ] spids: [533 551] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [(C {<verbose>}) (C {<echo>} {(SQ <.>)})] ) ] ) ) (command.ShFunction name: kill_procs body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:login) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [644] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {<-n>} { (DQ <'Terminating all processes owned by ('> ($ Id.VSub_DollarName '$login') <'):'>) } ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:killcount) op: assign_op.Equal rhs: {<0>} spids: [668] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:proclist) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (command.Simple words: [{<ps>} {<-U>} {($ Id.VSub_DollarName '$login')}] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) (C {<grep>} {<-v>} {(SQ <'^\\ *PID'>)}) (C {<awk>} {(SQ <'{print $1}'>)}) ] negated: F ) ) } spids: [672] ) ] ) (command.ForEach iter_name: _pid iter_words: [{($ Id.VSub_DollarName '$proclist')}] do_arg_iter: F body: (command.DoGroup children: [ (command.Simple words: [{<kill>} {(${ Id.VSub_Name SIGKILL)} {($ Id.VSub_DollarName '$_pid')}] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:killcount) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName '$killcount')} right: {<Id.Lit_Digits 1>} ) ) } spids: [732] ) ] ) ] ) ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} { (DQ <' '> (${ Id.VSub_Name SIGKILL) <' signal sent to '> ($ Id.VSub_DollarName '$killcount') <' processes.'> ) } ) ] ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (command.Pipeline children:[(C {<verbose>})] negated:T) (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$killcount')} {<-ne>} {<0>} {<Id.Lit_RBracket ']'>} ) (C {<echo>} {<-n>} {(DQ <' processes('> (${ Id.VSub_Name killcount) <')'>)}) ] ) ] ) ) (command.ShFunction name: rm_at_jobs body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:login) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [826] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:atjoblist) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Simple words: [ {<find>} {(${ Id.VSub_Name ATJOBDIR)} {<-maxdepth>} {<1>} {<-user>} {($ Id.VSub_DollarName '$login')} {<-print>} ] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) ) } spids: [835] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:jobcount) op: assign_op.Equal rhs: {<0>} spids: [860] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {<-n>} {(DQ <'Removing at(1) jobs owned by ('> ($ Id.VSub_DollarName '$login') <'):'>)} ) ] ) (command.ForEach iter_name: _atjob iter_words: [{($ Id.VSub_DollarName '$atjoblist')}] do_arg_iter: F body: (command.DoGroup children: [ (C {<rm>} {<-f>} {($ Id.VSub_DollarName '$_atjob')}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:jobcount) op: assign_op.Equal rhs: { (word_part.ArithSub anode: (arith_expr.Binary op_id: Id.Arith_Plus left: {($ Id.VSub_DollarName '$jobcount')} right: {<Id.Lit_Digits 1>} ) ) } spids: [899] ) ] ) ] ) ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {(DQ <' '> ($ Id.VSub_DollarName '$jobcount') <' removed.'>)}) ] ) (command.AndOr ops: [Id.Op_DAmp Id.Op_DAmp] children: [ (command.Pipeline children:[(C {<verbose>})] negated:T) (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$jobcount')} {<-ne>} {<0>} {<Id.Lit_RBracket ']'>} ) (C {<echo>} {<-n>} {(DQ <' at('> ($ Id.VSub_DollarName '$jobcount') <')'>)}) ] ) ] ) ) (command.ShFunction name: rm_crontab body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:login) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [987] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {<-n>} {(DQ <'Removing crontab for ('> ($ Id.VSub_DollarName '$login') <'):'>)} ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-f>} {(${ Id.VSub_Name CRONJOBDIR) <'/'> ($ Id.VSub_DollarName '$login')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<verbose>}) (C {<echo>} {<-n>} { (DQ <' '> (${ Id.VSub_Name CRONJOBDIR) <'/'> ($ Id.VSub_DollarName '$login')) } ) (C {<echo>} {<-n>} {(DQ <' crontab'>)}) ] ) (C {<rm>} {<-f>} {(${ Id.VSub_Name CRONJOBDIR) <'/'> ($ Id.VSub_DollarName '$login')} ) ] spids: [1011 1026] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [(C {<verbose>}) (C {<echo>} {(SQ <.>)})] ) ] ) ) (command.ShFunction name: rm_ipc body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp] children: [(C {<verbose>}) (C {<echo>} {<-n>} {(DQ <'Removing IPC mechanisms'>)})] ) (command.ForEach iter_name: i iter_words: [{<s>} {<m>} {<q>}] do_arg_iter: F body: (command.DoGroup children: [ (command.Pipeline children: [ (C {<ipcs>} {<-> ($ Id.VSub_DollarName '$i')}) (C {<awk>} {<-v>} {<Id.Lit_VarLike 'i='> ($ Id.VSub_DollarName '$i')} {<-v>} {<Id.Lit_VarLike 'login='> ($ Id.VSub_Number '$1')} {(SQ <'$1 == i && $5 == login { print $2 }'>)} ) (C {<xargs>} {<-n>} {<1>} {<ipcrm>} {<-> ($ Id.VSub_DollarName '$i')}) ] negated: F ) ] ) ) (command.AndOr ops: [Id.Op_DAmp] children: [(C {<verbose>}) (C {<echo>} {(SQ <.>)})] ) ] ) ) (command.ShFunction name: rm_user body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:login) op: assign_op.Equal rhs: {($ Id.VSub_Number '$1')} spids: [1232] ) ] ) (command.ControlFlow token:<Id.ControlFlow_Return return>) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {<-n>} {(DQ <'Removing user ('> ($ Id.VSub_DollarName '$login') <')'>)}) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$pw_rswitch'))} {<Id.Lit_RBracket ']'>} ) (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp] children: [ (C {<verbose>}) (C {<echo>} {<-n>} {(DQ <' (including home directory)'>)}) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.Pipeline children: [(C {<verbose>})] negated: T ) (C {<echo>} {<-n>} {(DQ <' home'>)}) ] ) ] ) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.Pipeline children:[(C {<verbose>})] negated:T) (C {<echo>} {<-n>} {(DQ <' passwd'>)}) ] ) (command.AndOr ops: [Id.Op_DAmp] children: [(C {<verbose>}) (C {<echo>} {<-n>} {(DQ <' from the system:'>)})] ) (C {(${ Id.VSub_Name PWCMD)} {<userdel>} {<-n>} {($ Id.VSub_DollarName '$login')} {($ Id.VSub_DollarName '$pw_rswitch')} ) (command.AndOr ops: [Id.Op_DAmp] children: [(C {<verbose>}) (C {<echo>} {(SQ <' Done.'>)})] ) ] ) ) (command.ShFunction name: prompt_yesno body: (BraceGroup children: [ (command.AndOr ops: [Id.Op_DAmp Id.Op_DPipe] children: [ (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_Number '$1'))} {<Id.Lit_RBracket ']'>}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:msg) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [1394] ) ] ) (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: [ (C {<echo>} {<-n>} {(DQ ($ Id.VSub_DollarName '$msg'))}) (C {<read>} {<_ans>}) (command.Case to_match: {($ Id.VSub_DollarName '$_ans')} 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: [1435 1445 1453 -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.ControlFlow token: <Id.ControlFlow_Return return> arg_word: {<0>} ) ] spids: [1456 1476 1484 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] spids: [1487 1488 1491 -1] ) ] ) ] ) ) ] ) ) (command.ShFunction name: show_usage body: (BraceGroup children: [ (C {<echo>} {(DQ <'usage: '> (${ Id.VSub_Name THISCMD) <' [-yv] [-f file] [user ...]'>)}) (C {<echo>} {(DQ <' if the -y switch is used, either the -f switch or'>)}) (C {<echo>} {(DQ <' one or more user names must be given'>)}) ] ) ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ffile) op: assign_op.Equal rhs: (word.Empty) spids: [1552] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:fflag) op: assign_op.Equal rhs: (word.Empty) spids: [1554] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:procowner) op: assign_op.Equal rhs: (word.Empty) spids: [1556] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:pw_rswitch) op: assign_op.Equal rhs: (word.Empty) spids: [1558] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:userlist) op: assign_op.Equal rhs: (word.Empty) spids: [1560] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:yflag) op: assign_op.Equal rhs: (word.Empty) spids: [1562] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:vflag) op: assign_op.Equal rhs: (word.Empty) spids: [1564] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:procowner) op: assign_op.Equal rhs: {(command_sub left_token:<Id.Left_Backtick '`'> child:(C {<'/usr/bin/id'>} {<-u>}))} spids: [1567] ) ] ) (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 root (0) to use this utility.'>)}) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [1576 1594] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:args) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Simple words: [{<getopt>} {<yvf> <Id.Lit_Colon ':'>} {($ Id.VSub_Star '$*')}] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) ) } spids: [1611] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_QMark '$?'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<show_usage>}) (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [1626 1644] ) ] ) (C {<set>} {<-->} {($ Id.VSub_DollarName '$args')}) (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: [{<-y>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:yflag) op: assign_op.Equal rhs: {<1>} spids: [1682] ) ] ) (C {<shift>}) ] spids: [1678 1679 1689 -1] ) (case_arm pat_list: [{<-v>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:vflag) op: assign_op.Equal rhs: {<1>} spids: [1696] ) ] ) (C {<shift>}) ] spids: [1692 1693 1703 -1] ) (case_arm pat_list: [{<-f>}] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:fflag) op: assign_op.Equal rhs: {<1>} spids: [1710] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ffile) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$2'))} spids: [1714] ) ] ) (command.Sentence child: (C {<shift>}) terminator: <Id.Op_Semi _> ) (C {<shift>}) ] spids: [1706 1707 1726 -1] ) (case_arm pat_list: [{<-->}] action: [(C {<shift>}) (command.ControlFlow token:<Id.ControlFlow_Break break>)] spids: [1729 1730 1739 -1] ) ] ) ] ) ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$fflag')} {<Id.Lit_RBracket ']'>}) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_insecure) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (C {<find>} {($ Id.VSub_DollarName '$ffile')} {<Id.KW_Bang '!'>} {<-user>} {<0>} {<-or>} {<-perm>} {<Id.Lit_Other '+'> <0022>} ) ) } spids: [1771] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-n>} {(DQ ($ Id.VSub_DollarName '$_insecure'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} { (DQ <'file ('> ($ Id.VSub_DollarName '$ffile') <') must be owned by and writeable only by root.'> ) } ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1794 1807] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-r>} {(DQ ($ Id.VSub_DollarName '$ffile'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:userlist) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<cat>} {($ Id.VSub_DollarName '$ffile')}) (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<read>} {<_user>} {<_junk>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.Case to_match: {($ Id.VSub_DollarName '$_user')} arms: [ (case_arm pat_list: [ { (word_part.EscapedLiteral token: <Id.Lit_EscapedChar '\\#'> ) <Id.Lit_Star '*'> } {(SQ )} ] spids: [1883 1888 1891 -1] ) (case_arm pat_list: [{<Id.Lit_Star '*'>}] action: [ (C {<echo>} {<-n>} { (DQ ($ Id.VSub_DollarName '$userlist') <' '> ($ Id.VSub_DollarName '$_user') ) } ) ] spids: [1894 1895 1909 -1] ) ] ) ] ) ) ] negated: F ) ) } spids: [1843] ) ] ) ] spids: [1827 1840] ) ] ) ] spids: [1759 1768] ) ] else_action: [ (command.WhileUntil keyword: <Id.KW_While while> cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Number '$1')} {<Id.Lit_RBracket ']'>}) terminator: <Id.Op_Semi _> ) ] ) body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:userlist) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$userlist') <' '> ($ Id.VSub_Number '$1'))} spids: [1937] ) ] ) (C {<shift>}) ] ) ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} {(DQ ($ Id.VSub_DollarName '$userlist'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$fflag')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} { (DQ <'('> ($ Id.VSub_DollarName '$ffile') <') does not exist or does not contain any user names.'> ) } ) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [1981 1990] ) (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$yflag')} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<show_usage>}) (command.ControlFlow token: <Id.ControlFlow_Exit exit> arg_word: {<1>} ) ] spids: [2007 2016] ) ] else_action: [ (C {<echo>} {<-n>} {(DQ <'Please enter one or more usernames: '>)}) (C {<read>} {<userlist>}) ] ) ] spids: [1965 1978] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_user) op: assign_op.Equal rhs: (word.Empty) spids: [2049] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_uid) op: assign_op.Equal rhs: (word.Empty) spids: [2051] ) ] ) (command.ForEach iter_name: _user iter_words: [{($ Id.VSub_DollarName '$userlist')}] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:userrec) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Simple words: [{<pw>} {<usershow>} {<-n>} {($ Id.VSub_DollarName '$_user')}] redirects: [ (redir op: <Id.Redir_Great '2>'> loc: (redir_loc.Fd fd:2) arg: {<'/dev/null'>} ) ] do_fork: T ) ) } spids: [2078] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_QMark '$?'))} {<Id.KW_Bang '!'> <Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} { (DQ <'user ('> ($ Id.VSub_DollarName '$_user') <') does not exist in the password database.'> ) } ) (command.ControlFlow token:<Id.ControlFlow_Continue continue>) ] spids: [2095 2113] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_uid) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {($ Id.VSub_DollarName '$userrec')}) (C {<awk>} {<-F> <Id.Lit_Colon ':'>} {(SQ <'{print $3}'>)}) ] negated: F ) ) } spids: [2131] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName '$_uid'))} {<Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<err>} { (DQ <'user ('> ($ Id.VSub_DollarName '$_user') <') has uid 0. You may not remove this user.'> ) } ) (command.ControlFlow token:<Id.ControlFlow_Continue continue>) ] spids: [2152 2169] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<Id.Lit_LBracket '['>} {<-z>} {(DQ ($ Id.VSub_DollarName '$yflag'))} {<Id.Lit_RBracket ']'>} ) terminator: <Id.Op_Semi _> ) ] ) action: [ (C {<echo>} {(DQ <'Matching password entry:'>)}) (C {<echo>}) (C {<echo>} {($ Id.VSub_DollarName '$userrec')}) (C {<echo>}) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (command.Pipeline children: [ (C {<prompt_yesno>} {(DQ <'Is this the entry you wish to remove? '>)} ) ] negated: T ) terminator: <Id.Op_Semi _> ) ] ) action: [(command.ControlFlow token:<Id.ControlFlow_Continue continue>)] spids: [2234 2246] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_homedir) op: assign_op.Equal rhs: { (command_sub left_token: <Id.Left_Backtick '`'> child: (command.Pipeline children: [ (C {<echo>} {($ Id.VSub_DollarName '$userrec')}) (C {<awk>} {<-F> <Id.Lit_Colon ':'>} {(SQ <'{print $9}'>)}) ] negated: F ) ) } spids: [2255] ) ] ) (command.If arms: [ (if_arm cond: (condition.Shell commands: [ (command.Sentence child: (C {<prompt_yesno>} { (DQ <'Remove user\'s home directory ('> ($ Id.VSub_DollarName '$_homedir') <')? '> ) } ) terminator: <Id.Op_Semi _> ) ] ) action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:pw_rswitch) op: assign_op.Equal rhs: {(DQ <-r>)} spids: [2290] ) ] ) ] spids: [2276 2287] ) ] ) ] spids: [2200 2213] ) ] else_action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:pw_rswitch) op: assign_op.Equal rhs: {(DQ <-r>)} spids: [2302] ) ] ) ] ) (command.Simple words: [{(${ Id.VSub_Name PWCMD)} {<lock>} {($ Id.VSub_DollarName '$_user')}] redirects: [(redir op:<Id.Redir_Great '2>'> loc:(redir_loc.Fd fd:2) arg:{<'/dev/null'>})] do_fork: T ) (command.AndOr ops: [Id.Op_DAmp] children: [ (command.Pipeline children:[(C {<verbose>})] negated:T) (C {<echo>} {<-n>} {(DQ <'Removing user ('> ($ Id.VSub_DollarName '$_user') <'):'>)}) ] ) (C {<rm_crontab>} {($ Id.VSub_DollarName '$_user')}) (C {<rm_at_jobs>} {($ Id.VSub_DollarName '$_user')}) (C {<rm_ipc>} {($ Id.VSub_DollarName '$_user')}) (C {<kill_procs>} {($ Id.VSub_DollarName '$_user')}) (C {<rm_files>} {($ Id.VSub_DollarName '$_user')}) (C {<rm_mail>} {($ Id.VSub_DollarName '$_user')}) (C {<rm_user>} {($ Id.VSub_DollarName '$_user')}) (command.AndOr ops: [Id.Op_DAmp] children: [(command.Pipeline children:[(C {<verbose>})] negated:T) (C {<echo>} {(DQ <.>)})] ) ] ) ) ] )