(CommandList
  children: [
    (C {(hash)} {(-r)})
    (FuncDef
      name: wait_for_ssh
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:hostname)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [17]
                )
              ]
              spids: [15]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:min)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Number 2>
                        suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(1)})
                        spids: [26 30]
                      )
                    }
                  spids: [25]
                )
                (assign_pair
                  lhs: (LhsName name:max)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Number 3>
                        suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(10)})
                        spids: [33 37]
                      )
                    }
                  spids: [32]
                )
              ]
              spids: [23]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(-z)} {(DQ (${ VSub_Name hostname))} {(Lit_Other ']')})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Sentence
                      child: (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  spids: [16777215 57]
                )
              ]
              spids: [16777215 65]
            )
            (SimpleCommand
              words: [{(exec)}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:3 arg_word:{(2)} spids:[70])]
            )
            (SimpleCommand
              words: [{(exec)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[76])]
            )
            (While
              cond: [(Sentence child:(C {(true)}) terminator:<Op_Semi ';'>)]
              body: 
                (DoGroup
                  children: [
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (SimpleCommand
                                  words: [{(echo)}]
                                  redirects: [
                                    (Redir
                                      op_id: Redir_Great
                                      fd: 16777215
                                      arg_word: {(/dev/tcp/) (${ VSub_Name hostname) (/22)}
                                      spids: [93]
                                    )
                                  ]
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [(ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})]
                          spids: [16777215 103]
                        )
                      ]
                      spids: [16777215 111]
                    )
                    (C {(sleep)} 
                      {
                        (ArithSubPart
                          anode: 
                            (ArithBinary
                              op_id: Arith_Plus
                              left: 
                                (ArithBinary
                                  op_id: Arith_Percent
                                  left: (ArithWord w:{($ VSub_Name '$RANDOM')})
                                  right: (ArithWord w:{($ VSub_Name '$max')})
                                )
                              right: (ArithWord w:{($ VSub_Name '$min')})
                            )
                          spids: [116 129]
                        )
                      }
                    )
                  ]
                  spids: [86 132]
                )
            )
            (SimpleCommand
              words: [{(exec)}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:2 arg_word:{(3)} spids:[137])]
            )
            (SimpleCommand
              words: [{(exec)}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:3 arg_word:{(-)} spids:[143])]
            )
          ]
          spids: [12]
        )
      spids: [9 12]
    )
    (FuncDef
      name: setup_headnodes
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (C {(bootstrap_head)} {(bcpc-vm1.bcpc.example.com)} {(10.0.100.11)})
                (C {(true)})
              ]
              op_id: Op_DPipe
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:keyfile)
                  op: Equal
                  rhs: {(TildeSubPart prefix:'') (/.ssh/id_rsa.root)}
                  spids: [172]
                )
              ]
              spids: [170]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(KW_Bang '!')} {(-r)} {(DQ (${ VSub_Name keyfile))} 
                          {(Lit_Other ']')}
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (AndOr
                      children: [
                        (C {(./install_root_key)})
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:keyfile)
                              op: Equal
                              rhs: {(TildeSubPart prefix:'') (/.ssh/id_rsa.bcpc)}
                              spids: [202]
                            )
                          ]
                          spids: [202]
                        )
                      ]
                      op_id: Op_DPipe
                    )
                  ]
                  spids: [16777215 195]
                )
              ]
              spids: [16777215 207]
            )
            (C {(echo)} {(DQ ('Proceeding with second chef-client run'))})
            (C {(ssh)} {(-i)} {(DQ (${ VSub_Name keyfile))} {(-lroot)} {(10.0.100.11)} {(chef-client)})
          ]
          spids: [152]
        )
      spids: [149 152]
    )
    (FuncDef
      name: bootstrap_head
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:nodename)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [244]
                )
              ]
              spids: [242]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:ip)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$2'))}
                  spids: [252]
                )
              ]
              spids: [250]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(-z)} {(DQ (${ VSub_Name ip))} {(-o)} {(-z)} 
                          {(DQ (${ VSub_Name nodename))} {(Lit_Other ']')}
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Sentence
                      child: (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  spids: [16777215 284]
                )
              ]
              spids: [16777215 292]
            )
            (TimeBlock pipeline:(C {(-p)} {(wait_for_ssh)} {(DQ (${ VSub_Name ip))}))
            (C {(echo)} 
              {(DQ ('Configuring temporary hosts entry for chef server on ') (${ VSub_Name ip))}
            )
            (C {(add_hosts_entries)} {(DQ (${ VSub_Name ip))} {(DQ (${ VSub_Name hosts_entries))})
            (C {(knife)} {(bootstrap)} {(--bootstrap-no-proxy)} {(DQ (${ VSub_Name chef_server_host))} 
              {(${ VSub_Name bootstrap_proxy_args)} {(-i)} {(DQ (${ VSub_Name keyfile))} {(-x)} {(root)} {(--node-ssl-verify-mode) (Lit_Other '=') (none)} 
              {(--bootstrap-wget-options)} {(DQ (--no-check-certificate))} {(-r)} {(SQ <'role[BCPC-Headnode]'>)} {(-E)} {(Test-Laptop)} 
              {(DQ (${ VSub_Name ip))} {(-N)} {(DQ (${ VSub_Name nodename))}
            )
            (SimpleCommand
              words: [{(knife)} {(actor)} {(map)}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[408])]
            )
            (SimpleCommand
              words: [{(knife)} {(group)} {(add)} {(actor)} {(admins)} {(DQ (${ VSub_Name nodename))}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[428])]
            )
          ]
          spids: [239]
        )
      spids: [236 239]
    )
    (FuncDef
      name: bootstrap_worker
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:nodename)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [442]
                )
              ]
              spids: [440]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:ip)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$2'))}
                  spids: [450]
                )
              ]
              spids: [448]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(-z)} {(DQ (${ VSub_Name ip))} {(-o)} {(-z)} 
                          {(DQ (${ VSub_Name nodename))} {(Lit_Other ']')}
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Sentence
                      child: (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  spids: [16777215 482]
                )
              ]
              spids: [16777215 490]
            )
            (TimeBlock pipeline:(C {(-p)} {(wait_for_ssh)} {(DQ (${ VSub_Name ip))}))
            (C {(echo)} 
              {(DQ ('Configuring temporary hosts entry for chef server on ') (${ VSub_Name ip))}
            )
            (C {(add_hosts_entries)} {(DQ (${ VSub_Name ip))} {(DQ (${ VSub_Name hosts_entries))})
            (C {(knife)} {(bootstrap)} {(--bootstrap-no-proxy)} {(DQ (${ VSub_Name chef_server_host))} 
              {(${ VSub_Name bootstrap_proxy_args)} {(-i)} {(DQ (${ VSub_Name keyfile))} {(-x)} {(root)} {(--bootstrap-wget-options)} 
              {(DQ (--no-check-certificate))} {(-r)} {(SQ <'role[BCPC-Worknode]'>)} {(-E)} {(Test-Laptop)} {(DQ ($ VSub_Name '$ip'))} {(-N)} 
              {(DQ (${ VSub_Name nodename))}
            )
          ]
          spids: [437]
        )
      spids: [434 437]
    )
    (FuncDef
      name: add_hosts_entries
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:ip)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [610]
                )
                (assign_pair
                  lhs: (LhsName name:entries)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$2'))}
                  spids: [615]
                )
              ]
              spids: [608]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(-z)} {(DQ (${ VSub_Name ip))} {(-o)} {(-z)} 
                          {(DQ (${ VSub_Name entries))} {(Lit_Other ']')}
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Sentence
                      child: (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  spids: [16777215 647]
                )
              ]
              spids: [16777215 655]
            )
            (C {(echo)} {($ VSub_Name '$entries')})
            (SimpleCommand
              words: [
                {(ssh)}
                {(-ostricthostkeychecking) (Lit_Other '=') (no)}
                {(-i)}
                {(DQ (${ VSub_Name keyfile))}
                {(-lroot)}
                {(DQ (${ VSub_Name ip))}
              ]
              redirects: [
                (HereDoc
                  op_id: Redir_DLess
                  fd: 16777215
                  body: 
                    {
                      (DQ ('  if ! getent ahosts bcpc-bootstrap &> /dev/null ; then\n') 
                        ('  cat <<EoS >> /etc/hosts\n') ('# Added by ') 
                        (BracedVarSub
                          token: <VSub_Number 0>
                          suffix_op: (StringUnary op_id:VOp1_DPound arg_word:{('*') (Lit_Slash /)})
                          spids: [691 696]
                        ) ('\n') ($ VSub_Name '$entries') ('\n') ('EoS\n') ('  fi\n') ('  getent hosts bcpc-bootstrap\n')
                      )
                    }
                  do_expansion: True
                  here_end: EoF
                  was_filled: True
                  spids: [685]
                )
              ]
            )
          ]
          spids: [605]
        )
      spids: [602 605]
    )
    (FuncDef
      name: configure_proxy
      body: 
        (BraceGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: (DBracket expr:(BoolUnary op_id:BoolUnary_f child:{(./proxy_setup.sh)}))
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(.)} {(./proxy_setup.sh)})
                    (C {(export)} {(-n)} 
                      (BracedWordTree
                        parts: [(http) (BracedAltPart words:[{} {(s)}]) (_proxy)]
                      )
                    )
                  ]
                  spids: [16777215 724]
                )
              ]
              spids: [16777215 747]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: (BoolUnary op_id:BoolUnary_n child:{(DQ (${ VSub_Name https_proxy))})
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:bootstrap_proxy_args)
                          op: Equal
                          rhs: {(DQ ('--bootstrap-proxy ') (${ VSub_Name https_proxy))}
                          spids: [769]
                        )
                      ]
                      spids: [769]
                    )
                  ]
                  spids: [16777215 766]
                )
              ]
              else_action: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:bootstrap_proxy_args)
                      op: Equal
                      rhs: {(DQ )}
                      spids: [781]
                    )
                  ]
                  spids: [781]
                )
              ]
              spids: [778 786]
            )
          ]
          spids: [710]
        )
      spids: [707 710]
    )
    (FuncDef
      name: ip_to_name
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:ip)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [802]
                )
              ]
              spids: [800]
            )
            (SimpleCommand
              words: [{(read)} {(_)} {(_)} {(_)} {(nodenum)}]
              redirects: [
                (HereDoc
                  op_id: Redir_DLess
                  fd: 16777215
                  body: {(DQ ($ VSub_Name '$ip') ('\n'))}
                  do_expansion: True
                  here_end: EoF
                  was_filled: True
                  spids: [827]
                )
              ]
              more_env: [(env_pair name:IFS val:{(SQ <.>)} spids:[812])]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (C {(Lit_Other '[')} {(-z)} {(DQ (${ VSub_Name ip))} {(-o)} {(-z)} 
                          {(DQ (${ VSub_Name nodenum))} {(Lit_Other ']')}
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Sentence
                      child: (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  spids: [16777215 860]
                )
              ]
              spids: [16777215 868]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:suffix)
                  op: Equal
                  rhs: 
                    {
                      (ArithSubPart
                        anode: 
                          (ArithBinary
                            op_id: Arith_Minus
                            left: (ArithVarRef name:nodenum)
                            right: (ArithWord w:{(Lit_Digits 10)})
                          )
                        spids: [874 881]
                      )
                    }
                  spids: [873]
                )
              ]
              spids: [871]
            )
            (C {(echo)} {(bcpc-vm) (${ VSub_Name suffix) (.) (${ VSub_Name domainname)})
          ]
          spids: [797]
        )
      spids: [794 797]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:domainname)
          op: Equal
          rhs: {(bcpc.example.com)}
          spids: [898]
        )
      ]
      spids: [898]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:chef_server_host)
          op: Equal
          rhs: {(bcpc-bootstrap)}
          spids: [901]
        )
      ]
      spids: [901]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:keyfile)
          op: Equal
          rhs: {(TildeSubPart prefix:'') (/.ssh/id_rsa.bcpc)}
          spids: [904]
        )
      ]
      spids: [904]
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:hosts_entries)
          op: Equal
          rhs: {(DQ ('10.0.100.3 ') (${ VSub_Name chef_server_host) ('\n'))}
          spids: [908]
        )
      ]
      spids: [908]
    )
    (C {(set)} {(-e)})
    (C {(configure_proxy)})
    (C {(setup_headnodes)})
    (C {(echo)} {(DQ ('Waiting to bootstrap workers'))})
    (C {(set)} {(-x)})
    (ForEach
      iter_name: ip
      iter_words: [{(10.0.100.) (Lit_LBrace '{') (12..13) (Lit_RBrace '}')}]
      do_arg_iter: False
      body: 
        (DoGroup
          children: [
            (Sentence
              child: 
                (C {(eval)} 
                  {(DQ ('bootstrap_worker ')) 
                    (CommandSubPart
                      command_list: (CommandList children:[(C {(ip_to_name)} {(${ VSub_Name ip)})])
                      left_token: <Left_CommandSub '$('>
                      spids: [958 964]
                    ) (DQ (' ') (${ VSub_Name ip) (' &'))
                  }
                )
              terminator: <Op_Semi ';'>
            )
          ]
          spids: [951 975]
        )
      spids: [943 949]
    )
    (C {(wait)})
  ]
)