(List (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub 1]]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Usage : "][VarSub 0][LIT_CHARS " 'environment'"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "did nothing..."]]} ) (Com {[LIT_CHARS exit]} ) ) ) (= scope= flags=0 words=[] bindings=[('ENVIRONMENT', {[DQ [VarSub 1]]})]) (If (DBracket {B! {B1 UNARY_FILE_f {[DQ [LIT_CHARS cluster.txt]]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "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"]]} ) (Com {[LIT_CHARS exit]} ) ) ) (If (DBracket {B! {B1 UNARY_FILE_f {[DQ [LIT_CHARS environments/][VarSub ENVIRONMENT][LIT_CHARS .json]]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "You are scaring me now, I don't see the environment file you asked for. Not doing nothing"]]} ) (Com {[LIT_CHARS exit]} ) ) ) (While (Com {[LIT_CHARS read]} {[LIT_CHARS HOSTNAME]} {[LIT_CHARS MACADDR]} {[LIT_CHARS IPADDR]} {[LIT_CHARS ILOIPADDR]} {[LIT_CHARS DOMAIN]} {[LIT_CHARS ROLE]} ) (If (DBracket {B2 BINARY_STRING_EQUAL {[DQ [VarSub ROLE]]} {[DQ [LIT_CHARS bootstrap]]}}) (List (= scope= flags=0 words=[] bindings=[('BOOTSTRAP_NODE', {[DQ [VarSub HOSTNAME]]})]) (= scope= flags=0 words=[] bindings=[('BOOTSTRAP_DOMAIN', {[DQ [VarSub DOMAIN]]})]) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Ignoring "][VarSub HOSTNAME][LIT_CHARS " - bootstrap node to be retained"]]} ) ) (DBracket {B? LOGICAL_BINARY_OR {B2 BINARY_STRING_EQUAL {[DQ [VarSub ROLE]]} {[DQ [LIT_CHARS work]]}} {B2 BINARY_STRING_EQUAL {[DQ [VarSub ROLE]]} {[DQ [LIT_CHARS head]]}}}) (= scope= flags=0 words=[] bindings=[('CLUSTER_MEMBERS', {[DQ [VarSub CLUSTER_MEMBERS][LIT_CHARS " "][VarSub HOSTNAME]]})]) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Ignoring "][VarSub HOSTNAME][LIT_CHARS " - unknown role"]]} ) ) ) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub BOOTSTRAP_NODE]]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "No bootstrap node found, unsafe to continue. Are you nuts?"]]} ) (Com {[LIT_CHARS exit]} ) ) ) (= scope= flags=0 words=[] bindings=[('BOOT_FQDN', {[DQ [VarSub BOOTSTRAP_NODE][LIT_CHARS .][VarSub BOOTSTRAP_DOMAIN]]})]) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "BOOT FQDN = "][VarSub BOOT_FQDN]]} ) (= scope= flags=0 words=[] bindings=[('MATCH', {[ComSub (Pipeline (Com {[LIT_CHARS knife]} {[LIT_CHARS node]} {[LIT_CHARS list]}) (Com {[LIT_CHARS grep]} {[VarSub BOOT_FQDN]}) )]})]) (If (DBracket {B! {B1 UNARY_STRING_z {[DQ [VarSub MATCH]]}}}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Plausible level of consistency present : it looks to me like I should delete all nodes and clients except "][VarSub MATCH][LIT_CHARS ...]]} ) (ElseTrue) (List (Com {[LIT_CHARS echo]} {[DQ [VarSub BOOT_FQDN][LIT_CHARS " not found in data bag, unsafe to continue. Can't fool me that way!"]]} ) (Com {[LIT_CHARS exit]} ) ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Making safety copy of "][VarSub ENVIRONMENT][LIT_CHARS " configs..."]]} ) (= scope= flags=0 words=[] bindings=[('DATABAG_BACKUP', {[DQ [LIT_CHARS "~/"][VarSub ENVIRONMENT][LIT_CHARS .databag.][VarSub $]]})]) (Com {[LIT_CHARS knife]} {[LIT_CHARS data]} {[LIT_CHARS bag]} {[LIT_CHARS show]} {[LIT_CHARS configs]} {[DQ [VarSub ENVIRONMENT]]} < (FilenameRedirectNode filename={[DQ [VarSub DATABAG_BACKUP]]} >"> 1), > ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Databag configs for "][VarSub ENVIRONMENT][LIT_CHARS " dumped to "][VarSub DATABAG_BACKUP]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Deleting data bag configs..."]]} ) (Com {[LIT_CHARS knife]} {[LIT_CHARS data]} {[LIT_CHARS bag]} {[LIT_CHARS delete]} {[LIT_CHARS configs]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Removing clients and nodes..."]]} ) (For CLIENT [{[VarSub CLUSTER_MEMBERS]}]) (List (Com {[LIT_CHARS knife]} {[LIT_CHARS client]} {[LIT_CHARS delete]} {[DQ [VarSub CLIENT][LIT_CHARS .][VarSub BOOTSTRAP_DOMAIN]]} ) (Com {[LIT_CHARS knife]} {[LIT_CHARS node]} {[LIT_CHARS delete]} {[DQ [VarSub CLIENT][LIT_CHARS .][VarSub BOOTSTRAP_DOMAIN]]} ) ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "reload knife data..."]]} ) (Com {[LIT_CHARS knife]} {[LIT_CHARS role]} {[LIT_CHARS from]} {[LIT_CHARS file]} {[LIT_CHARS roles/] [LIT_OTHER "*"] [LIT_CHARS .json]} ) (Com {[LIT_CHARS knife]} {[LIT_CHARS cookbook]} {[LIT_CHARS upload]} {[LIT_CHARS -a]} {[LIT_CHARS -o]} {[LIT_CHARS cookbooks]} ) (Com {[LIT_CHARS knife]} {[LIT_CHARS environment]} {[LIT_CHARS from]} {[LIT_CHARS file]} {[DQ [LIT_CHARS environments/][VarSub ENVIRONMENT][LIT_CHARS .json]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Removing cobbler systems..."]]} ) (For CLIENT [{[DQ [VarSub CLUSTER_MEMBERS]]}]) (List (= scope= flags=0 words=[] bindings=[('SOMETHING', {[DQ [VarSub CLIENT]]})]) (Com {[LIT_CHARS sudo]} {[LIT_CHARS cobbler]} {[LIT_CHARS system]} {[LIT_CHARS remove]} {[LIT_CHARS --name] [LIT_DBRACKET_LIKE "="] [VarSub CLIENT]} ) ) ) (If (DBracket {B! {B1 UNARY_STRING_z {[DQ [VarSub SOMETHING]]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Sync cobbler..."]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS cobbler]} {[LIT_CHARS sync]} ) ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Removing cobbler profile..."]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS cobbler]} {[LIT_CHARS profile]} {[LIT_CHARS remove]} {[LIT_CHARS --name] [LIT_DBRACKET_LIKE "="] [LIT_CHARS bcpc_host]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS cobbler]} {[LIT_CHARS sync]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Hiding stale kickstart in case Chef goes all wibbly..."]]} ) (= scope= flags=0 words=[] bindings=[('KICKSTART_FILE', {[DQ [LIT_CHARS /var/lib/cobbler/kickstarts/bcpc_ubuntu_host.preseed]]})]) (Com {[LIT_CHARS sudo]} {[LIT_CHARS mv]} {[DQ [VarSub KICKSTART_FILE]]} {[DQ [VarSub KICKSTART_FILE][LIT_CHARS .old.][VarSub $]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Rerunning Chef client ..."]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS chef-client]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS chef-client]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS chef-client]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Checking results ..."]]} ) (= scope= flags=0 words=[] bindings=[('CHECK', {[ComSub (Pipeline (Com {[LIT_CHARS knife]} {[LIT_CHARS data]} {[LIT_CHARS bag]} {[LIT_CHARS show]} {[LIT_CHARS configs]} {[VarSub ENVIRONMENT]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS -i]} {[LIT_CHARS cobbler-root]}) )]})]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub CHECK]]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Warning, no cobbler-root found. I'm so sorry."]]} ) (Com {[LIT_CHARS exit]} ) ) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Cobbler-root found : "][VarSub CHECK]]} ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Verifying kickstarts..."]]} ) (= scope= flags=0 words=[] bindings=[('CHECK', {[ComSub (Pipeline (Com {[LIT_CHARS sudo]} {[LIT_CHARS cobbler]} {[LIT_CHARS profile]} {[LIT_CHARS dumpvars]} {[LIT_CHARS --name] [LIT_DBRACKET_LIKE "="] [LIT_CHARS bcpc_host]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS kickstart]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS bcpc]}) )]})]) (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub CHECK]]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Warning, no BCPC kickstart data found. Duh!"]]} ) (Com {[LIT_CHARS exit]} ) ) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Found BCPC kickstart : "][VarSub CHECK]]} ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Succesfully took off and nuked the site from orbit. It's the only way to be sure."]]} ) )