(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: (Token id:Id.Left_Backtick val:'`' span_id:111) command_list: (command.CommandList children: [(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: (Token id:Id.VSub_Name val:PWCMD span_id:122) suffix_op: (suffix_op.Unary op_id: Id.VTest_ColonHyphen arg_word: {(Id.Lit_Slash /) (usr) (Id.Lit_Slash /) (sbin) (Id.Lit_Slash /) (pw)} ) ) ) } spids: [119] ) ] ) (command.ShFunction name: err body: (command.BraceGroup children: [ (command.Simple words: [{(echo)} {(${ Id.VSub_Name THISCMD) (Id.Lit_Other ':')} {($ Id.VSub_Star '$*')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_GreatAnd val:'1>&' span_id:152) fd: 1 arg_word: {(2)} ) ] ) ] ) ) (command.ShFunction name: verbose body: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:193) arg_word: {(0)} ) (command.ControlFlow token: (Token id:Id.ControlFlow_Return val:return span_id:199) arg_word: {(1)} ) ] ) ] ) ) (command.ShFunction name: rm_files body: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:244) ) ] ) (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: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-d)} {($ Id.VSub_DollarName '$_dir')} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:282) ) ] action: [ (C {(err)} {(DQ ($ Id.VSub_DollarName '$_dir') (' is not a valid directory.'))} ) (command.ControlFlow token: (Token id:Id.ControlFlow_Continue val:continue span_id:295) ) ] 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: (Token id:Id.Left_Backtick val:'`' span_id:319) command_list: (command.CommandList children: [ (command.Pipeline children: [ (command.Simple words: [ {(find)} {(DQ ($ Id.VSub_DollarName '$_dir'))} {(-user)} {(DQ ($ Id.VSub_DollarName '$login'))} {(-delete)} {(-print)} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:325) fd: 2 arg_word: {(/dev/null)} ) ] ) (C {(wc)} {(-l)}) (C {(sed)} {(SQ (Token id:Id.Lit_Chars val:'s/ *//' span_id:354))} ) ] 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: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$totalcount')} ) right: (arith_expr.ArithWord w: {($ 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: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:455) ) ] ) (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: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(-f)} {(${ Id.VSub_Name MAILSPOOL) (/) ($ Id.VSub_DollarName '$login')} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:487) ) ] 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: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(-f)} {(${ Id.VSub_Name MAILSPOOL) (/.) (${ Id.VSub_Name login) (.pop)} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:549) ) ] 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 (Token id:Id.Lit_Chars val:. span_id:608))})] ) ] ) ) (command.ShFunction name: kill_procs body: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:649) ) ] ) (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: (Token id:Id.Left_Backtick val:'`' span_id:673) command_list: (command.CommandList children: [ (command.Pipeline children: [ (command.Simple words: [{(ps)} {(-U)} {($ Id.VSub_DollarName '$login')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:680) fd: 2 arg_word: {(/dev/null)} ) ] ) (C {(grep)} {(-v)} {(SQ (Token id:Id.Lit_Chars val:'^\\ *PID' span_id:694))} ) (C {(awk)} {(SQ (Token id:Id.Lit_Chars val:'{print $1}' span_id:702))}) ] 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.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:722) fd: 2 arg_word: {(/dev/null)} ) ] ) (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: (arith_expr.ArithWord w: {($ Id.VSub_DollarName '$killcount')} ) right: (arith_expr.ArithWord w:{(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: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:831) ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:atjoblist) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:836) command_list: (command.CommandList children: [ (command.Simple words: [ {(find)} {(${ Id.VSub_Name ATJOBDIR)} {(-maxdepth)} {(1)} {(-user)} {($ Id.VSub_DollarName '$login')} {(-print)} ] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:841) fd: 2 arg_word: {(/dev/null)} ) ] ) ] ) ) } 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: (arith_expr.ArithWord w:{($ Id.VSub_DollarName '$jobcount')}) right: (arith_expr.ArithWord w:{(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: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:992) ) ] ) (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: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(-f)} {(${ Id.VSub_Name CRONJOBDIR) (/) ($ Id.VSub_DollarName '$login')} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1024) ) ] 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 (Token id:Id.Lit_Chars val:. span_id:1078))})] ) ] ) ) (command.ShFunction name: rm_ipc body: (command.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 (Token id:Id.Lit_Chars val:'$1 == i && $5 == login { print $2 }' span_id:1150))} ) (C {(xargs)} {(-n)} {(1)} {(ipcrm)} {(-) ($ Id.VSub_DollarName '$i')}) ] negated: F ) ] ) ) (command.AndOr ops: [Id.Op_DAmp] children: [(C {(verbose)}) (C {(echo)} {(SQ (Token id:Id.Lit_Chars val:. span_id:1178))})] ) ] ) ) (command.ShFunction name: rm_user body: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:1237) ) ] ) (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 ']')} ) (command.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 (Token id:Id.Lit_Chars val:' Done.' span_id:1350))}) ] ) ] ) ) (command.ShFunction name: prompt_yesno body: (command.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: (Token id:Id.ControlFlow_Return val:return span_id:1401) ) ] ) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:1405) cond: [ (command.Sentence child: (C {(Id.Lit_Other ':')}) terminator: (Token id:Id.Op_Semi val:';' span_id:1409) ) ] 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: (Token id:Id.ControlFlow_Return val:return span_id:1448) 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: (Token id:Id.ControlFlow_Return val:return span_id:1479) 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: (command.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: (Token id:Id.Left_Backtick val:'`' span_id:1568) command_list: (command.CommandList children:[(C {(/usr/bin/id)} {(-u)})]) ) } spids: [1567] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$procowner'))} {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(DQ (0))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1592) ) ] action: [ (C {(err)} { (SQ (Token id: Id.Lit_Chars val: 'you must be root (0) to use this utility.' span_id: 1600 ) ) } ) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:1604) 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: (Token id:Id.Left_Backtick val:'`' span_id:1612) command_list: (command.CommandList children: [ (command.Simple words: [{(getopt)} {(yvf) (Id.Lit_Other ':')} {($ Id.VSub_Star '$*')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:1617) fd: 2 arg_word: {(/dev/null)} ) ] ) ] ) ) } spids: [1611] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_QMark '$?'))} {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(DQ (0))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1642) ) ] action: [ (C {(show_usage)}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:1650) arg_word: {(1)} ) ] spids: [1626 1644] ) ] ) (C {(Id.KW_Set 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: (Token id:Id.Op_Semi val:';' span_id:1721) ) (C {(shift)}) ] spids: [1706 1707 1726 -1] ) (case_arm pat_list: [{(--)}] action: [ (C {(shift)}) (command.ControlFlow token: (Token id:Id.ControlFlow_Break val:break span_id:1736) ) ] spids: [1729 1730 1739 -1] ) ] ) ] ) ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {($ Id.VSub_DollarName '$fflag')} {(Id.Lit_RBracket ']')}) terminator: (Token id:Id.Op_Semi val:';' span_id:1766) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_insecure) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1772) command_list: (command.CommandList children: [ (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: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(-n)} {(DQ ($ Id.VSub_DollarName '$_insecure'))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1805) ) ] action: [ (C {(err)} { (DQ ('file (') ($ Id.VSub_DollarName '$ffile') (') must be owned by and writeable only by root.') ) } ) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:1819) arg_word: {(1)} ) ] spids: [1794 1807] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(-r)} {(DQ ($ Id.VSub_DollarName '$ffile'))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1838) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:userlist) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:1844) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(cat)} {($ Id.VSub_DollarName '$ffile')}) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:1863) cond: [ (command.Sentence child: (C {(read)} {(_user)} {(_junk)}) terminator: (Token id: Id.Op_Semi val: ';' span_id: 1871 ) ) ] body: (command.DoGroup children: [ (command.Case to_match: {($ Id.VSub_DollarName '$_user')} arms: [ (case_arm pat_list: [ { (word_part.EscapedLiteral token: (Token id: Id.Lit_EscapedChar val: '\\#' span_id: 1883 ) ) (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: (Token id:Id.KW_While val:while span_id:1924) cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {($ Id.VSub_Number '$1')} {(Id.Lit_RBracket ']')}) terminator: (Token id:Id.Op_Semi val:';' span_id:1932) ) ] 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: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(DQ ($ Id.VSub_DollarName '$userlist'))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1976) ) ] action: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {($ Id.VSub_DollarName '$fflag')} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:1988) ) ] action: [ (C {(err)} { (DQ ('(') ($ Id.VSub_DollarName '$ffile') (') does not exist or does not contain any user names.') ) } ) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:2002) arg_word: {(1)} ) ] spids: [1981 1990] ) (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {($ Id.VSub_DollarName '$yflag')} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:2014) ) ] action: [ (C {(show_usage)}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:2022) 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: (Token id:Id.Left_Backtick val:'`' span_id:2079) command_list: (command.CommandList children: [ (command.Simple words: [{(pw)} {(usershow)} {(-n)} {($ Id.VSub_DollarName '$_user')}] redirects: [ (redir.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:2084) fd: 2 arg_word: {(/dev/null)} ) ] ) ] ) ) } spids: [2078] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_QMark '$?'))} {(Id.KW_Bang '!') (Id.Lit_Equals '=')} {(DQ (0))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:2111) ) ] action: [ (C {(err)} { (DQ ('user (') ($ Id.VSub_DollarName '$_user') (') does not exist in the password database.') ) } ) (command.ControlFlow token: (Token id:Id.ControlFlow_Continue val:continue span_id:2125) ) ] spids: [2095 2113] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_uid) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:2132) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo)} {($ Id.VSub_DollarName '$userrec')}) (C {(awk)} {(-F) (Id.Lit_Other ':')} {(SQ (Token id:Id.Lit_Chars val:'{print $3}' span_id:2147))} ) ] negated: F ) ] ) ) } spids: [2131] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_DollarName '$_uid'))} {(Id.Lit_Equals '=')} {(DQ (0))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:2167) ) ] action: [ (C {(err)} { (DQ ('user (') ($ Id.VSub_DollarName '$_user') (') has uid 0. You may not remove this user.') ) } ) (command.ControlFlow token: (Token id:Id.ControlFlow_Continue val:continue span_id:2181) ) ] spids: [2152 2169] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(Id.Lit_LBracket '[')} {(-z)} {(DQ ($ Id.VSub_DollarName '$yflag'))} {(Id.Lit_RBracket ']')} ) terminator: (Token id:Id.Op_Semi val:';' span_id:2211) ) ] action: [ (C {(echo)} {(DQ ('Matching password entry:'))}) (C {(echo)}) (C {(echo)} {($ Id.VSub_DollarName '$userrec')}) (C {(echo)}) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.Pipeline children: [ (C {(prompt_yesno)} {(DQ ('Is this the entry you wish to remove? '))} ) ] negated: T ) terminator: (Token id:Id.Op_Semi val:';' span_id:2244) ) ] action: [ (command.ControlFlow token: (Token id:Id.ControlFlow_Continue val:continue span_id:2249) ) ] spids: [2234 2246] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:_homedir) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:2256) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(echo)} {($ Id.VSub_DollarName '$userrec')}) (C {(awk)} {(-F) (Id.Lit_Other ':')} { (SQ (Token id: Id.Lit_Chars val: '{print $9}' span_id: 2271 ) ) } ) ] negated: F ) ] ) ) } spids: [2255] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (C {(prompt_yesno)} { (DQ ("Remove user's home directory (") ($ Id.VSub_DollarName '$_homedir') (')? ') ) } ) terminator: (Token id:Id.Op_Semi val:';' span_id:2285) ) ] 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.Redir op: (Token id:Id.Redir_Great val:'2>' span_id:2320) fd: 2 arg_word: {(/dev/null)} ) ] ) (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 (.))})] ) ] ) ) ] )