(command.CommandList
  children: [
    (C {(Id.KW_Set set)} {(-e)})
    (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:66)
            )
          ]
          action: [
            (C {(echo)} {(DQ ('Usage : ') ($ Id.VSub_Number '$0') (' environment (hostname)'))})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:80)
              arg_word: {(1)}
            )
          ]
          spids: [55 68]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ENVIRONMENT)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$1')}
          spids: [87]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:EXACTHOST)
          op: assign_op.Equal
          rhs: {($ Id.VSub_Number '$2')}
          spids: [90]
        )
      ]
    )
    (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_DollarName '$ENVIRONMENT') (.json))}
                        )
                    )
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:109)
            )
          ]
          action: [
            (C {(echo)} 
              {
                (DQ ("Error: Couldn't find '") ($ Id.VSub_DollarName '$ENVIRONMENT') 
                  (".json'. Did you forget to pass the environment as first param?")
                )
              }
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:123)
              arg_word: {(1)}
            )
          ]
          spids: [94 111]
        )
      ]
    )
    (C {(declare)} {(-A)} {(FQDNS)})
    (command.WhileUntil
      keyword: (Token id:Id.KW_While val:while span_id:137)
      cond: [
        (command.Sentence
          child: (C {(read)} {(HOST)} {(MACADDR)} {(IPADDR)} {(ILOIPADDR)} {(DOMAIN)} {(ROLE)})
          terminator: (Token id:Id.Op_Semi val:';' span_id:152)
        )
      ]
      body: 
        (command.DoGroup
          children: [
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.DBracket
                          expr: 
                            (bool_expr.LogicalOr
                              left: 
                                (bool_expr.Unary
                                  op_id: Id.BoolUnary_z
                                  child: {(DQ ($ Id.VSub_DollarName '$EXACTHOST'))}
                                )
                              right: 
                                (bool_expr.LogicalOr
                                  left: 
                                    (bool_expr.Binary
                                      op_id: Id.BoolBinary_GlobEqual
                                      left: {(DQ ($ Id.VSub_DollarName '$EXACTHOST'))}
                                      right: {(all)}
                                    )
                                  right: 
                                    (bool_expr.LogicalOr
                                      left: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_GlobEqual
                                          left: {(DQ ($ Id.VSub_DollarName '$EXACTHOST'))}
                                          right: {(DQ ($ Id.VSub_DollarName '$HOST'))}
                                        )
                                      right: 
                                        (bool_expr.LogicalOr
                                          left: 
                                            (bool_expr.Binary
                                              op_id: Id.BoolBinary_GlobEqual
                                              left: {(DQ ($ Id.VSub_DollarName '$EXACTHOST'))}
                                              right: {(DQ ($ Id.VSub_DollarName '$IPADDR'))}
                                            )
                                          right: 
                                            (bool_expr.LogicalOr
                                              left: 
                                                (bool_expr.LogicalAnd
                                                  left: 
                                                    (bool_expr.Binary
                                                      op_id: Id.BoolBinary_GlobEqual
                                                      left: {(DQ ($ Id.VSub_DollarName '$EXACTHOST'))}
                                                      right: {(DQ (heads))}
                                                    )
                                                  right: 
                                                    (bool_expr.Binary
                                                      op_id: Id.BoolBinary_GlobEqual
                                                      left: {(DQ ($ Id.VSub_DollarName '$ROLE'))}
                                                      right: {(DQ (head))}
                                                    )
                                                )
                                              right: 
                                                (bool_expr.LogicalAnd
                                                  left: 
                                                    (bool_expr.Binary
                                                      op_id: Id.BoolBinary_GlobEqual
                                                      left: {(DQ ($ Id.VSub_DollarName '$EXACTHOST'))}
                                                      right: {(DQ (workers))}
                                                    )
                                                  right: 
                                                    (bool_expr.Binary
                                                      op_id: Id.BoolBinary_GlobEqual
                                                      left: {(DQ ($ Id.VSub_DollarName '$ROLE'))}
                                                      right: {(DQ (work))}
                                                    )
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:250)
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:IDX)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: (Token id:Id.Left_Backtick val:'`' span_id:256)
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (C {(echo)} {($ Id.VSub_DollarName '$IPADDR')})
                                          (C {(tr)} {(SQ (Token id:Id.Lit_Chars val:. span_id:268))} 
                                            {(SQ (Token id:Id.Lit_Chars val:- span_id:272))}
                                          )
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                              )
                            }
                          spids: [255]
                        )
                      ]
                    )
                    (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:292)
                            )
                          ]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Continue val:continue span_id:297)
                            )
                          ]
                          spids: [277 294]
                        )
                      ]
                    )
                    (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: {(head)}
                                    )
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:316)
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:HEADS)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ ($ Id.VSub_DollarName '$HEADS') (' ') 
                                        ($ Id.VSub_DollarName '$IPADDR')
                                      )
                                    }
                                  spids: [321]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: 
                                    (sh_lhs_expr.IndexedName
                                      name: FQDNS
                                      index: 
                                        (arith_expr.ArithWord
                                          w: {(DQ ($ Id.VSub_DollarName '$IDX'))}
                                        )
                                    )
                                  op: assign_op.Equal
                                  rhs: {(DQ (${ Id.VSub_Name HOST) (.) (${ Id.VSub_Name DOMAIN))}
                                  spids: [329]
                                )
                              ]
                            )
                          ]
                          spids: [303 318]
                        )
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (command.DBracket
                                  expr: 
                                    (bool_expr.Binary
                                      op_id: Id.BoolBinary_GlobEqual
                                      left: {(DQ ($ Id.VSub_DollarName '$ROLE'))}
                                      right: {(work)}
                                    )
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:362)
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:WORKERS)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ ($ Id.VSub_DollarName '$WORKERS') (' ') 
                                        ($ Id.VSub_DollarName '$IPADDR')
                                      )
                                    }
                                  spids: [367]
                                )
                              ]
                            )
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: 
                                    (sh_lhs_expr.IndexedName
                                      name: FQDNS
                                      index: 
                                        (arith_expr.ArithWord
                                          w: {(DQ ($ Id.VSub_DollarName '$IDX'))}
                                        )
                                    )
                                  op: assign_op.Equal
                                  rhs: {(DQ (${ Id.VSub_Name HOST) (.) (${ Id.VSub_Name DOMAIN))}
                                  spids: [375]
                                )
                              ]
                            )
                          ]
                          spids: [349 364]
                        )
                      ]
                    )
                  ]
                  spids: [157 252]
                )
              ]
            )
          ]
        )
      redirects: [
        (redir.Redir
          op: (Token id:Id.Redir_Less val:'<' span_id:403)
          fd: -1
          arg_word: {(cluster.txt)}
        )
      ]
    )
    (C {(echo)} {(DQ ('heads : ') ($ Id.VSub_DollarName '$HEADS'))})
    (C {(echo)} {(DQ ('workers : ') ($ Id.VSub_DollarName '$WORKERS'))})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PASSWD)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: (Token id:Id.Left_Backtick val:'`' span_id:423)
                command_list: 
                  (command.CommandList
                    children: [
                      (command.Pipeline
                        children: [
                          (C {(knife)} {(data)} {(bag)} {(show)} {(configs)} 
                            {($ Id.VSub_DollarName '$ENVIRONMENT')}
                          )
                          (C {(grep)} {(DQ ('cobbler-root-password:'))})
                          (C {(awk)} {(SQ (Token id:Id.Lit_Chars val:' {print $2}' span_id:451))})
                        ]
                        negated: F
                      )
                    ]
                  )
              )
            }
          spids: [422]
        )
      ]
    )
    (command.ForEach
      iter_name: HEAD
      iter_words: [{($ Id.VSub_DollarName '$HEADS')}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:MATCH)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$HEAD')}
                  spids: [479]
                )
              ]
            )
            (C {(echo)} {(DQ ('About to bootstrap head node ') ($ Id.VSub_DollarName '$HEAD') (...))})
            (C {(./chefit.sh)} {($ Id.VSub_DollarName '$HEAD')} {($ Id.VSub_DollarName '$ENVIRONMENT')})
            (command.Pipeline
              children: [
                (C {(echo)} {($ Id.VSub_DollarName '$PASSWD')})
                (C {(sudo)} {(knife)} {(bootstrap)} {(-E)} {($ Id.VSub_DollarName '$ENVIRONMENT')} 
                  {($ Id.VSub_DollarName '$HEAD')} {(-x)} {(ubuntu)} {(-P)} {($ Id.VSub_DollarName '$PASSWD')} {(--sudo)}
                )
              ]
              negated: F
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:IDX)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: (Token id:Id.Left_Backtick val:'`' span_id:529)
                        command_list: 
                          (command.CommandList
                            children: [
                              (command.Pipeline
                                children: [
                                  (C {(echo)} {($ Id.VSub_DollarName '$HEAD')})
                                  (C {(tr)} {(SQ (Token id:Id.Lit_Chars val:. span_id:541))} 
                                    {(SQ (Token id:Id.Lit_Chars val:- span_id:545))}
                                  )
                                ]
                                negated: F
                              )
                            ]
                          )
                      )
                    }
                  spids: [528]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:FQDN)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:FQDNS span_id:552)
                        bracket_op: 
                          (bracket_op.ArrayIndex
                            expr: (arith_expr.ArithWord w:{(DQ ($ Id.VSub_DollarName '$IDX'))})
                          )
                      )
                    }
                  spids: [550]
                )
              ]
            )
            (C {(knife)} {(actor)} {(map)})
            (C {(knife)} {(group)} {(add)} {(actor)} {(admins)} {($ Id.VSub_DollarName '$FQDN')})
            (C {(knife)} {(node)} {(run_list)} {(add)} {($ Id.VSub_DollarName '$FQDN')} 
              {(SQ (Token id:Id.Lit_Chars val:'role[BCPC-Headnode]' span_id:592))}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:SSHCMD)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ('./nodessh.sh ') ($ Id.VSub_DollarName '$ENVIRONMENT') (' ') 
                        ($ Id.VSub_DollarName '$HEAD')
                      )
                    }
                  spids: [596]
                )
              ]
            )
            (C {($ Id.VSub_DollarName '$SSHCMD')} {(DQ (/home/ubuntu/finish-head.sh))} {(sudo)})
          ]
        )
    )
    (command.ForEach
      iter_name: WORKER
      iter_words: [{($ Id.VSub_DollarName '$WORKERS')}]
      do_arg_iter: F
      body: 
        (command.DoGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:MATCH)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName '$WORKER')}
                  spids: [631]
                )
              ]
            )
            (C {(echo)} 
              {(DQ ('About to bootstrap worker worker ') ($ Id.VSub_DollarName '$WORKER') (...))}
            )
            (C {(./chefit.sh)} {($ Id.VSub_DollarName '$WORKER')} 
              {($ Id.VSub_DollarName '$ENVIRONMENT')}
            )
            (command.Pipeline
              children: [
                (C {(echo)} {($ Id.VSub_DollarName '$PASSWD')})
                (C {(sudo)} {(knife)} {(bootstrap)} {(-E)} {($ Id.VSub_DollarName '$ENVIRONMENT')} 
                  {($ Id.VSub_DollarName '$WORKER')} {(-x)} {(ubuntu)} {(-P)} {($ Id.VSub_DollarName '$PASSWD')} {(--sudo)}
                )
              ]
              negated: F
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:IDX)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: (Token id:Id.Left_Backtick val:'`' span_id:681)
                        command_list: 
                          (command.CommandList
                            children: [
                              (command.Pipeline
                                children: [
                                  (C {(echo)} {($ Id.VSub_DollarName '$WORKER')})
                                  (C {(tr)} {(SQ (Token id:Id.Lit_Chars val:. span_id:693))} 
                                    {(SQ (Token id:Id.Lit_Chars val:- span_id:697))}
                                  )
                                ]
                                negated: F
                              )
                            ]
                          )
                      )
                    }
                  spids: [680]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:FQDN)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:FQDNS span_id:704)
                        bracket_op: 
                          (bracket_op.ArrayIndex
                            expr: (arith_expr.ArithWord w:{(DQ ($ Id.VSub_DollarName '$IDX'))})
                          )
                      )
                    }
                  spids: [702]
                )
              ]
            )
            (C {(knife)} {(actor)} {(map)})
            (C {(knife)} {(group)} {(add)} {(actor)} {(admins)} {($ Id.VSub_DollarName '$FQDN')})
            (C {(knife)} {(node)} {(run_list)} {(add)} {($ Id.VSub_DollarName '$FQDN')} 
              {(SQ (Token id:Id.Lit_Chars val:'role[BCPC-Worknode]' span_id:744))}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:SSHCMD)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ('./nodessh.sh ') ($ Id.VSub_DollarName '$ENVIRONMENT') (' ') 
                        ($ Id.VSub_DollarName '$WORKER')
                      )
                    }
                  spids: [748]
                )
              ]
            )
            (C {($ Id.VSub_DollarName '$SSHCMD')} {(DQ (/home/ubuntu/finish-worker.sh))} {(sudo)})
          ]
        )
    )
    (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 '$MATCH'))}
                    )
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:779)
            )
          ]
          action: [(C {(echo)} {(DQ ('Warning: No nodes found'))})]
          spids: [768 781]
        )
      ]
    )
  ]
)