(command.CommandList children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Unary op_id:Id.BoolUnary_z child:{(DQ ($ Id.VSub_Number '$1'))}) ) terminator: (Token id:Id.Op_Semi val:';' span_id:35) ) ] action: [ (C {(echo)} {(DQ ('Usage : ') ($ Id.VSub_Number '$0') (" 'environment'"))}) (C {(echo)} {(DQ ('did nothing...'))}) (command.ControlFlow token:(Token id:Id.ControlFlow_Exit val:exit span_id:56)) ] spids: [24 37] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:ENVIRONMENT) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_Number '$1'))} spids: [60] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.LogicalNot child: (bool_expr.Unary op_id:Id.BoolUnary_f child:{(DQ (cluster.txt))}) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:78) ) ] action: [ (C {(echo)} { (DQ ( "I am a bear of very little brain so I couldn't find the cluster.txt file. No clusters were harmed in the making of this error message" ) ) } ) (command.ControlFlow token:(Token id:Id.ControlFlow_Exit val:exit span_id:90)) ] spids: [65 80] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.LogicalNot child: (bool_expr.Unary op_id: Id.BoolUnary_f child: {(DQ (environments/) (${ Id.VSub_Name ENVIRONMENT) (.json))} ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:111) ) ] action: [ (C {(echo)} { (DQ ( "You are scaring me now, I don't see the environment file you asked for. Not doing nothing" ) ) } ) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:123) ) ] spids: [94 113] ) ] ) (command.WhileUntil keyword: (Token id:Id.KW_While val:while span_id:127) cond: [ (command.Sentence child: (C {(read)} {(HOSTNAME)} {(MACADDR)} {(IPADDR)} {(ILOIPADDR)} {(DOMAIN)} {(ROLE)}) terminator: (Token id:Id.Op_Semi val:';' span_id:142) ) ] body: (command.DoGroup children: [ (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Binary op_id: Id.BoolBinary_GlobEqual left: {(DQ ($ Id.VSub_DollarName '$ROLE'))} right: {(DQ (bootstrap))} ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:162) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:BOOTSTRAP_NODE) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$HOSTNAME'))} spids: [167] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:BCPC_HYPERVISOR_DOMAIN) op: assign_op.Equal rhs: {(DQ ($ Id.VSub_DollarName '$DOMAIN'))} spids: [173] ) ] ) (C {(echo)} { (DQ ('Ignoring ') ($ Id.VSub_DollarName '$HOSTNAME') (' - bootstrap node to be retained') ) } ) ] spids: [147 164] ) (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.LogicalOr left: (bool_expr.Binary op_id: Id.BoolBinary_GlobEqual left: {(DQ ($ Id.VSub_DollarName '$ROLE'))} right: {(DQ (work))} ) right: (bool_expr.Binary op_id: Id.BoolBinary_GlobEqual left: {(DQ ($ Id.VSub_DollarName '$ROLE'))} right: {(DQ (head))} ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:215) ) ] action: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:CLUSTER_MEMBERS) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name CLUSTER_MEMBERS) (' ') (${ Id.VSub_Name HOSTNAME))} spids: [240] ) ] ) ] spids: [188 217] ) ] else_action: [ (C {(echo)} {(DQ ('Ignoring ') ($ Id.VSub_DollarName '$HOSTNAME') (' - unknown role'))}) ] ) ] ) redirects: [ (redir.Redir op: (Token id:Id.Redir_Less val:'<' span_id:268) fd: -1 arg_word: {(cluster.txt)} ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Unary op_id: Id.BoolUnary_z child: {(DQ ($ Id.VSub_DollarName '$BOOTSTRAP_NODE'))} ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:283) ) ] action: [ (C {(echo)} {(DQ ('No bootstrap node found, unsafe to continue. Are you nuts?'))}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:295) ) ] spids: [272 285] ) ] ) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:BOOT_FQDN) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name BOOTSTRAP_NODE) (.) (${ Id.VSub_Name BCPC_HYPERVISOR_DOMAIN))} spids: [309] ) ] ) (C {(echo)} {(DQ ('BOOT FQDN = ') (${ Id.VSub_Name BOOT_FQDN))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:MATCH) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:330) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(knife)} {(node)} {(list)}) (C {(grep)} {($ Id.VSub_DollarName '$BOOT_FQDN')}) ] negated: F ) ] ) ) } spids: [329] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.LogicalNot child: (bool_expr.Unary op_id: Id.BoolUnary_z child: {(DQ ($ Id.VSub_DollarName '$MATCH'))} ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:359) ) ] action: [ (C {(echo)} { (DQ ( 'Plausible level of consistency present : it looks to me like I should delete all nodes and clients except ' ) ($ Id.VSub_DollarName '$MATCH') (...) ) } ) ] spids: [346 361] ) ] else_action: [ (C {(echo)} { (DQ ($ Id.VSub_DollarName '$BOOT_FQDN') (" not found in data bag, unsafe to continue. Can't fool me that way!") ) } ) (command.ControlFlow token:(Token id:Id.ControlFlow_Exit val:exit span_id:383)) ] ) (C {(echo)} {(DQ ('Making safety copy of ') (${ Id.VSub_Name ENVIRONMENT) (' configs...'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:DATABAG_BACKUP) op: assign_op.Equal rhs: {(DQ ('~/') ($ Id.VSub_DollarName '$ENVIRONMENT') (.databag.) ($ Id.VSub_Dollar '$$'))} spids: [397] ) ] ) (command.Simple words: [{(knife)} {(data)} {(bag)} {(show)} {(configs)} {(DQ (${ Id.VSub_Name ENVIRONMENT))}] redirects: [ (redir.Redir op: (Token id:Id.Redir_DGreat val:'>>' span_id:421) fd: -1 arg_word: {(DQ (${ Id.VSub_Name DATABAG_BACKUP))} ) ] ) (C {(echo)} { (DQ ('Databag configs for ') (${ Id.VSub_Name ENVIRONMENT) (' dumped to ') (${ Id.VSub_Name DATABAG_BACKUP) ) } ) (C {(echo)} {(DQ ('Deleting data bag configs...'))}) (C {(knife)} {(data)} {(bag)} {(delete)} {(--yes)} {(configs)}) (C {(echo)} {(DQ ('Removing clients and nodes...'))}) (command.ForEach iter_name: CLIENT iter_words: [{($ Id.VSub_DollarName '$CLUSTER_MEMBERS')}] do_arg_iter: F body: (command.DoGroup children: [ (C {(knife)} {(client)} {(delete)} {(--yes)} {(DQ (${ Id.VSub_Name CLIENT) (.) (${ Id.VSub_Name BCPC_HYPERVISOR_DOMAIN))} ) (C {(knife)} {(node)} {(delete)} {(--yes)} {(DQ (${ Id.VSub_Name CLIENT) (.) (${ Id.VSub_Name BCPC_HYPERVISOR_DOMAIN))} ) ] ) ) (C {(echo)} {(DQ ('reload knife data...'))}) (C {(knife)} {(role)} {(from)} {(file)} {(roles/) (Id.Lit_Star '*') (.json)}) (C {(knife)} {(cookbook)} {(upload)} {(-a)} {(-o)} {(cookbooks)}) (C {(knife)} {(environment)} {(from)} {(file)} {(DQ (environments/) (${ Id.VSub_Name ENVIRONMENT) (.json))} ) (C {(echo)} {(DQ ('Removing cobbler systems...'))}) (command.ForEach iter_name: CLIENT iter_words: [{(DQ (${ Id.VSub_Name CLUSTER_MEMBERS))}] do_arg_iter: F body: (command.DoGroup children: [ (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:SOMETHING) op: assign_op.Equal rhs: {(DQ (${ Id.VSub_Name CLIENT))} spids: [589] ) ] ) (C {(sudo)} {(cobbler)} {(system)} {(remove)} {(--name) (Id.Lit_Equals '=') (${ Id.VSub_Name CLIENT)} ) ] ) ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.LogicalNot child: (bool_expr.Unary op_id: Id.BoolUnary_z child: {(DQ ($ Id.VSub_DollarName '$SOMETHING'))} ) ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:627) ) ] action: [(C {(echo)} {(DQ ('Sync cobbler...'))}) (C {(sudo)} {(cobbler)} {(sync)})] spids: [614 629] ) ] ) (C {(echo)} {(DQ ('Removing cobbler profile...'))}) (C {(sudo)} {(cobbler)} {(profile)} {(remove)} {(--name) (Id.Lit_Equals '=') (bcpc_host)}) (C {(sudo)} {(cobbler)} {(sync)}) (C {(echo)} {(DQ ('Hiding stale kickstart in case Chef goes all wibbly...'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:KICKSTART_FILE) op: assign_op.Equal rhs: {(DQ (/var/lib/cobbler/kickstarts/bcpc_ubuntu_host.preseed))} spids: [682] ) ] ) (C {(sudo)} {(mv)} {(DQ (${ Id.VSub_Name KICKSTART_FILE))} {(DQ (${ Id.VSub_Name KICKSTART_FILE) (.old.) ($ Id.VSub_Dollar '$$'))} ) (C {(echo)} {(DQ ('Rerunning Chef client ...'))}) (C {(sudo)} {(chef-client)}) (C {(sudo)} {(chef-client)}) (C {(sudo)} {(chef-client)}) (C {(echo)} {(DQ ('Checking results ...'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:CHECK) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:732) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(knife)} {(data)} {(bag)} {(show)} {(configs)} {(${ Id.VSub_Name ENVIRONMENT)} ) (C {(grep)} {(-i)} {(cobbler-root)}) ] negated: F ) ] ) ) } spids: [731] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Unary op_id: Id.BoolUnary_z child: {(DQ ($ Id.VSub_DollarName '$CHECK'))} ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:769) ) ] action: [ (C {(echo)} {(DQ ("Warning, no cobbler-root found. I'm so sorry."))}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:781) ) ] spids: [758 771] ) ] else_action: [(C {(echo)} {(DQ ('Cobbler-root found : ') (${ Id.VSub_Name CHECK))})] ) (C {(echo)} {(DQ ('Verifying kickstarts...'))}) (command.ShAssignment pairs: [ (assign_pair lhs: (sh_lhs_expr.Name name:CHECK) op: assign_op.Equal rhs: { (command_sub left_token: (Token id:Id.Left_Backtick val:'`' span_id:805) command_list: (command.CommandList children: [ (command.Pipeline children: [ (C {(sudo)} {(cobbler)} {(profile)} {(dumpvars)} {(--name) (Id.Lit_Equals '=') (bcpc_host)} ) (C {(grep)} {(kickstart)}) (C {(grep)} {(bcpc)}) ] negated: F ) ] ) ) } spids: [804] ) ] ) (command.If arms: [ (if_arm cond: [ (command.Sentence child: (command.DBracket expr: (bool_expr.Unary op_id: Id.BoolUnary_z child: {(DQ ($ Id.VSub_DollarName '$CHECK'))} ) ) terminator: (Token id:Id.Op_Semi val:';' span_id:844) ) ] action: [ (C {(echo)} {(DQ ('Warning, no BCPC kickstart data found. Duh!'))}) (command.ControlFlow token: (Token id:Id.ControlFlow_Exit val:exit span_id:856) ) ] spids: [833 846] ) ] else_action: [(C {(echo)} {(DQ ('Found BCPC kickstart : ') (${ Id.VSub_Name CHECK))})] ) (C {(echo)} {(DQ ("Succesfully took off and nuked the site from orbit. It's the only way to be sure."))} ) ] )