(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."))}
    )
  ]
)