(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=[('BCPC_HYPERVISOR_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 BCPC_HYPERVISOR_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 --yes]} {[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]} {[LIT_CHARS --yes]} {[DQ [VarSub CLIENT][LIT_CHARS .][VarSub BCPC_HYPERVISOR_DOMAIN]]}) (Com {[LIT_CHARS knife]} {[LIT_CHARS node]} {[LIT_CHARS delete]} {[LIT_CHARS --yes]} {[DQ [VarSub CLIENT][LIT_CHARS .][VarSub BCPC_HYPERVISOR_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_OTHER "="] [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_OTHER "="] [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_OTHER "="] [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."]]}) )