(CommandList
  children: [
    (C {(set)} {(-e)})
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Number "$1"))}))
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (C {(echo)} {(DQ ("Usage : ") ($ VSub_Number "$0") (" environment (hostname)"))})
            (C {(exit)} {(1)})
          ]
          spids: [-1 68]
        )
      ]
      spids: [-1 84]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:ENVIRONMENT)
          op: Equal
          rhs: {($ VSub_Number "$1")}
          spids: [87]
        )
      ]
      spids: [87]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:EXACTHOST)
          op: Equal
          rhs: {($ VSub_Number "$2")}
          spids: [90]
        )
      ]
      spids: [90]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: 
                    (LogicalNot
                      child: 
                        (BoolUnary
                          op_id: BoolUnary_f
                          child: {(DQ (environments/) ($ VSub_Name "$ENVIRONMENT") (.json))}
                        )
                    )
                )
              terminator: <Op_Semi ";">
            )
          ]
          action: [
            (C {(echo)} 
              {
                (DQ ("Error: Couldn't find '") ($ VSub_Name "$ENVIRONMENT") 
                  (".json'. Did you forget to pass the environment as first param?")
                )
              }
            )
            (C {(exit)} {(1)})
          ]
          spids: [-1 111]
        )
      ]
      spids: [-1 127]
    )
    (Assignment
      keyword: Assign_Declare
      flags: ["'-A'"]
      pairs: [(assign_pair lhs:(LhsName name:FQDNS) op:Equal spids:[134])]
      spids: [130]
    )
    (While
      cond: [
        (Sentence
          child: (C {(read)} {(HOST)} {(MACADDR)} {(IPADDR)} {(ILOIPADDR)} {(DOMAIN)} {(ROLE)})
          terminator: <Op_Semi ";">
        )
      ]
      body: 
        (DoGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (LogicalOr
                              left: 
                                (BoolUnary
                                  op_id: BoolUnary_z
                                  child: {(DQ ($ VSub_Name "$EXACTHOST"))}
                                )
                              right: 
                                (LogicalOr
                                  left: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobEqual
                                      left: {(DQ ($ VSub_Name "$EXACTHOST"))}
                                      right: {(all)}
                                    )
                                  right: 
                                    (LogicalOr
                                      left: 
                                        (BoolBinary
                                          op_id: BoolBinary_GlobEqual
                                          left: {(DQ ($ VSub_Name "$EXACTHOST"))}
                                          right: {(DQ ($ VSub_Name "$HOST"))}
                                        )
                                      right: 
                                        (LogicalOr
                                          left: 
                                            (BoolBinary
                                              op_id: BoolBinary_GlobEqual
                                              left: {(DQ ($ VSub_Name "$EXACTHOST"))}
                                              right: {(DQ ($ VSub_Name "$IPADDR"))}
                                            )
                                          right: 
                                            (LogicalOr
                                              left: 
                                                (LogicalAnd
                                                  left: 
                                                    (BoolBinary
                                                      op_id: BoolBinary_GlobEqual
                                                      left: {(DQ ($ VSub_Name "$EXACTHOST"))}
                                                      right: {(DQ (heads))}
                                                    )
                                                  right: 
                                                    (BoolBinary
                                                      op_id: BoolBinary_GlobEqual
                                                      left: {(DQ ($ VSub_Name "$ROLE"))}
                                                      right: {(DQ (head))}
                                                    )
                                                )
                                              right: 
                                                (LogicalAnd
                                                  left: 
                                                    (BoolBinary
                                                      op_id: BoolBinary_GlobEqual
                                                      left: {(DQ ($ VSub_Name "$EXACTHOST"))}
                                                      right: {(DQ (workers))}
                                                    )
                                                  right: 
                                                    (BoolBinary
                                                      op_id: BoolBinary_GlobEqual
                                                      left: {(DQ ($ VSub_Name "$ROLE"))}
                                                      right: {(DQ (work))}
                                                    )
                                                )
                                            )
                                        )
                                    )
                                )
                            )
                        )
                      terminator: <Op_Semi ";">
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:IDX)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (Pipeline
                                        children: [
                                          (C {(echo)} {($ VSub_Name "$IPADDR")})
                                          (C {(tr)} {(SQ <.>)} {(SQ <->)})
                                        ]
                                        negated: False
                                      )
                                    ]
                                  )
                                left_token: <Left_Backtick "`">
                                spids: [256 272]
                              )
                            }
                          spids: [255]
                        )
                      ]
                      spids: [255]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobEqual
                                      left: {(DQ ($ VSub_Name "$ROLE"))}
                                      right: {(DQ (bootstrap))}
                                    )
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [(ControlFlow token:<ControlFlow_Continue continue>)]
                          spids: [-1 292]
                        )
                      ]
                      spids: [-1 298]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobEqual
                                      left: {(DQ ($ VSub_Name "$ROLE"))}
                                      right: {(head)}
                                    )
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:HEADS)
                                  op: Equal
                                  rhs: {(DQ ($ VSub_Name "$HEADS") (" ") ($ VSub_Name "$IPADDR"))}
                                  spids: [319]
                                )
                              ]
                              spids: [319]
                            )
                            (C 
                              {(FQDNS) (Lit_Other "[") (DQ ($ VSub_Name "$IDX")) (Lit_Other "]") 
                                (Lit_Other "=") (DQ (${ VSub_Name HOST) (.) (${ VSub_Name DOMAIN))
                              }
                            )
                          ]
                          spids: [-1 316]
                        )
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobEqual
                                      left: {(DQ ($ VSub_Name "$ROLE"))}
                                      right: {(work)}
                                    )
                                )
                              terminator: <Op_Semi ";">
                            )
                          ]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:WORKERS)
                                  op: Equal
                                  rhs: {(DQ ($ VSub_Name "$WORKERS") (" ") ($ VSub_Name "$IPADDR"))}
                                  spids: [363]
                                )
                              ]
                              spids: [363]
                            )
                            (C 
                              {(FQDNS) (Lit_Other "[") (DQ ($ VSub_Name "$IDX")) (Lit_Other "]") 
                                (Lit_Other "=") (DQ (${ VSub_Name HOST) (.) (${ VSub_Name DOMAIN))
                              }
                            )
                          ]
                          spids: [345 360]
                        )
                      ]
                      spids: [-1 389]
                    )
                  ]
                  spids: [-1 252]
                )
              ]
              spids: [-1 393]
            )
          ]
          spids: [154 395]
        )
      redirects: [(Redir op_id:Redir_Less fd:-1 arg_word:{(cluster.txt)} spids:[397])]
    )
    (C {(echo)} {(DQ ("heads : ") ($ VSub_Name "$HEADS"))})
    (C {(echo)} {(DQ ("workers : ") ($ VSub_Name "$WORKERS"))})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:PASSWD)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: 
                  (CommandList
                    children: [
                      (Pipeline
                        children: [
                          (C {(knife)} {(data)} {(bag)} {(show)} {(configs)} {($ VSub_Name "$ENVIRONMENT")})
                          (C {(grep)} {(DQ ("cobbler-root-password:"))})
                          (C {(awk)} {(SQ <" {print $2}">)})
                        ]
                        negated: False
                      )
                    ]
                  )
                left_token: <Left_Backtick "`">
                spids: [417 445]
              )
            }
          spids: [416]
        )
      ]
      spids: [416]
    )
    (ForEach
      iter_name: HEAD
      iter_words: [{($ VSub_Name "$HEADS")}]
      do_arg_iter: False
      body: 
        (DoGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:MATCH)
                  op: Equal
                  rhs: {($ VSub_Name "$HEAD")}
                  spids: [471]
                )
              ]
              spids: [471]
            )
            (C {(echo)} {(DQ ("About to bootstrap head node ") ($ VSub_Name "$HEAD") (...))})
            (C {(./chefit.sh)} {($ VSub_Name "$HEAD")} {($ VSub_Name "$ENVIRONMENT")})
            (Pipeline
              children: [
                (C {(echo)} {($ VSub_Name "$PASSWD")})
                (C {(sudo)} {(knife)} {(bootstrap)} {(-E)} {($ VSub_Name "$ENVIRONMENT")} 
                  {($ VSub_Name "$HEAD")} {(-x)} {(ubuntu)} {(-P)} {($ VSub_Name "$PASSWD")} {(--sudo)}
                )
              ]
              negated: False
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:IDX)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (Pipeline
                                children: [
                                  (C {(echo)} {($ VSub_Name "$HEAD")})
                                  (C {(tr)} {(SQ <.>)} {(SQ <->)})
                                ]
                                negated: False
                              )
                            ]
                          )
                        left_token: <Left_Backtick "`">
                        spids: [521 537]
                      )
                    }
                  spids: [520]
                )
              ]
              spids: [520]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:FQDN)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name FQDNS>
                        bracket_op: (ArrayIndex expr:(ArithWord w:{(DQ ($ VSub_Name "$IDX"))}))
                        spids: [541 548]
                      )
                    }
                  spids: [540]
                )
              ]
              spids: [540]
            )
            (C {(knife)} {(actor)} {(map)})
            (C {(knife)} {(group)} {(add)} {(actor)} {(admins)} {($ VSub_Name "$FQDN")})
            (C {(knife)} {(node)} {(run_list)} {(add)} {($ VSub_Name "$FQDN")} 
              {(SQ <"role[BCPC-Headnode]">)}
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:SSHCMD)
                  op: Equal
                  rhs: 
                    {(DQ ("./nodessh.sh ") ($ VSub_Name "$ENVIRONMENT") (" ") ($ VSub_Name "$HEAD"))}
                  spids: [586]
                )
              ]
              spids: [586]
            )
            (C {($ VSub_Name "$SSHCMD")} {(DQ (/home/ubuntu/finish-head.sh))} {(sudo)})
          ]
          spids: [468 604]
        )
      spids: [464 466]
    )
    (ForEach
      iter_name: WORKER
      iter_words: [{($ VSub_Name "$WORKERS")}]
      do_arg_iter: False
      body: 
        (DoGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:MATCH)
                  op: Equal
                  rhs: {($ VSub_Name "$WORKER")}
                  spids: [621]
                )
              ]
              spids: [621]
            )
            (C {(echo)} {(DQ ("About to bootstrap worker worker ") ($ VSub_Name "$WORKER") (...))})
            (C {(./chefit.sh)} {($ VSub_Name "$WORKER")} {($ VSub_Name "$ENVIRONMENT")})
            (Pipeline
              children: [
                (C {(echo)} {($ VSub_Name "$PASSWD")})
                (C {(sudo)} {(knife)} {(bootstrap)} {(-E)} {($ VSub_Name "$ENVIRONMENT")} 
                  {($ VSub_Name "$WORKER")} {(-x)} {(ubuntu)} {(-P)} {($ VSub_Name "$PASSWD")} {(--sudo)}
                )
              ]
              negated: False
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:IDX)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (Pipeline
                                children: [
                                  (C {(echo)} {($ VSub_Name "$WORKER")})
                                  (C {(tr)} {(SQ <.>)} {(SQ <->)})
                                ]
                                negated: False
                              )
                            ]
                          )
                        left_token: <Left_Backtick "`">
                        spids: [671 687]
                      )
                    }
                  spids: [670]
                )
              ]
              spids: [670]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:FQDN)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name FQDNS>
                        bracket_op: (ArrayIndex expr:(ArithWord w:{(DQ ($ VSub_Name "$IDX"))}))
                        spids: [691 698]
                      )
                    }
                  spids: [690]
                )
              ]
              spids: [690]
            )
            (C {(knife)} {(actor)} {(map)})
            (C {(knife)} {(group)} {(add)} {(actor)} {(admins)} {($ VSub_Name "$FQDN")})
            (C {(knife)} {(node)} {(run_list)} {(add)} {($ VSub_Name "$FQDN")} 
              {(SQ <"role[BCPC-Worknode]">)}
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:SSHCMD)
                  op: Equal
                  rhs: 
                    {
                      (DQ ("./nodessh.sh ") ($ VSub_Name "$ENVIRONMENT") (" ") ($ VSub_Name "$WORKER"))
                    }
                  spids: [736]
                )
              ]
              spids: [736]
            )
            (C {($ VSub_Name "$SSHCMD")} {(DQ (/home/ubuntu/finish-worker.sh))} {(sudo)})
          ]
          spids: [618 754]
        )
      spids: [614 616]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name "$MATCH"))}))
              terminator: <Op_Semi ";">
            )
          ]
          action: [(C {(echo)} {(DQ ("Warning: No nodes found"))})]
          spids: [-1 769]
        )
      ]
      spids: [-1 778]
    )
  ]
)