(CommandList
  children: [
    (C {(source)} {(./virtualbox_env.sh)})
    (C {(source)} {(./vmware/vmware_env.sh)})
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: 
                    (LogicalOr
                      left: 
                        (BoolBinary
                          op_id: BoolBinary_GlobDEqual
                          left: {($ VSub_Name '$OSTYPE')}
                          right: {(msys)}
                        )
                      right: 
                        (BoolBinary
                          op_id: BoolBinary_GlobDEqual
                          left: {($ VSub_Name '$OSTYPE')}
                          right: {(cygwin)}
                        )
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:RSYNCEXTRA)
                  op: Equal
                  rhs: {(DQ ('--perms --chmod=a=rwx,Da+x'))}
                  spids: [54]
                )
              ]
              spids: [54]
            )
          ]
          spids: [16777215 47]
        )
      ]
      spids: [16777215 59]
    )
    (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)})]
          spids: [16777215 73]
        )
      ]
      spids: [16777215 80]
    )
    (C {(set)} {(-e)})
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:DIR)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: (CommandList children:[(C {(dirname)} {($ VSub_Number '$0')})])
                left_token: <Left_Backtick '`'>
                spids: [89 93]
              )
            }
          spids: [88]
        )
      ]
      spids: [88]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: (BoolBinary op_id:BoolBinary_gt left:{($ VSub_Pound '$#')} right:{(1)})
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:KEYFILE)
                  op: Equal
                  rhs: {(DQ (bootstrap_chef.id_rsa))}
                  spids: [112]
                )
              ]
              spids: [112]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:IP)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$2'))}
                  spids: [118]
                )
              ]
              spids: [118]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:BCPC_DIR)
                  op: Equal
                  rhs: {(DQ (chef-bcpc))}
                  spids: [124]
                )
              ]
              spids: [124]
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:VAGRANT) op:Equal rhs:{(DQ )} spids:[130])]
              spids: [130]
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:VMWARE) op:Equal rhs:{(DQ )} spids:[135])]
              spids: [135]
            )
            (Assignment
              keyword: Assign_None
              pairs: [(assign_pair lhs:(LhsName name:VBOX) op:Equal rhs:{(DQ )} spids:[140])]
              spids: [140]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {($ VSub_Number '$1')}
                              right: {(DQ (--vagrant-local))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ('Running on the local Vagrant VM'))})
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VAGRANT)
                          op: Equal
                          rhs: {(DQ (true))}
                          spids: [174]
                        )
                      ]
                      spids: [174]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VBOX)
                          op: Equal
                          rhs: {(DQ (true))}
                          spids: [180]
                        )
                      ]
                      spids: [180]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:BCPC_DIR)
                          op: Equal
                          rhs: {(DQ ('~vagrant/chef-bcpc'))}
                          spids: [186]
                        )
                      ]
                      spids: [186]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:SSH_USER)
                          op: Equal
                          rhs: {(DQ ($ VSub_Name '$USER'))}
                          spids: [192]
                        )
                      ]
                      spids: [192]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:SSH_CMD)
                          op: Equal
                          rhs: {(DQ ('bash -c'))}
                          spids: [198]
                        )
                      ]
                      spids: [198]
                    )
                  ]
                  spids: [16777215 164]
                )
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {($ VSub_Number '$1')}
                              right: {(DQ (--vagrant-remote))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ('SSHing to the Vagrant VM'))})
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VAGRANT)
                          op: Equal
                          rhs: {(DQ (true))}
                          spids: [229]
                        )
                      ]
                      spids: [229]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VBOX)
                          op: Equal
                          rhs: {(DQ (true))}
                          spids: [235]
                        )
                      ]
                      spids: [235]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:BCPC_DIR)
                          op: Equal
                          rhs: {(DQ ('~vagrant/chef-bcpc'))}
                          spids: [241]
                        )
                      ]
                      spids: [241]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:SSH_USER)
                          op: Equal
                          rhs: {(DQ (vagrant))}
                          spids: [247]
                        )
                      ]
                      spids: [247]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:SSH_CMD)
                          op: Equal
                          rhs: {(DQ ('vagrant ssh -c'))}
                          spids: [253]
                        )
                      ]
                      spids: [253]
                    )
                  ]
                  spids: [204 219]
                )
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {($ VSub_Number '$1')}
                              right: {(DQ (--vagrant-vmware))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ('SSHing to the Vagrant VM (on VMware)'))})
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VAGRANT)
                          op: Equal
                          rhs: {(DQ (true))}
                          spids: [284]
                        )
                      ]
                      spids: [284]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:VMWARE)
                          op: Equal
                          rhs: {(DQ (true))}
                          spids: [290]
                        )
                      ]
                      spids: [290]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:BCPC_DIR)
                          op: Equal
                          rhs: {(DQ ('~vagrant/chef-bcpc'))}
                          spids: [296]
                        )
                      ]
                      spids: [296]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:SSH_USER)
                          op: Equal
                          rhs: {(DQ (vagrant))}
                          spids: [302]
                        )
                      ]
                      spids: [302]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:SSH_CMD)
                          op: Equal
                          rhs: {(DQ ('vagrant ssh -c'))}
                          spids: [308]
                        )
                      ]
                      spids: [308]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:DIR)
                          op: Equal
                          rhs: {($ VSub_Name '$DIR') (/vmware)}
                          spids: [314]
                        )
                      ]
                      spids: [314]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolUnary
                                      op_id: BoolUnary_z
                                      child: {(DQ ($ VSub_Name '$VMRUN'))}
                                    )
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (SimpleCommand
                              words: [{(echo)} {(DQ ('vmrun not found!'))}]
                              redirects: [
                                (Redir
                                  op_id: Redir_GreatAnd
                                  fd: 16777215
                                  arg_word: {(2)}
                                  spids: [341]
                                )
                              ]
                            )
                            (SimpleCommand
                              words: [
                                {(echo)}
                                {
                                  (DQ 
                                    (
'  Please ensure VMWare is installed and vmrun is accessible.'
                                    )
                                  )
                                }
                              ]
                              redirects: [
                                (Redir
                                  op_id: Redir_GreatAnd
                                  fd: 16777215
                                  arg_word: {(2)}
                                  spids: [351]
                                )
                              ]
                            )
                            (C {(exit)} {(1)})
                          ]
                          spids: [16777215 332]
                        )
                      ]
                      spids: [16777215 360]
                    )
                  ]
                  spids: [259 274]
                )
              ]
              else_action: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:SSH_USER)
                      op: Equal
                      rhs: {(DQ ($ VSub_Number '$1'))}
                      spids: [366]
                    )
                  ]
                  spids: [366]
                )
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:SSH_CMD)
                      op: Equal
                      rhs: 
                        {
                          (DQ ('ssh -t -i ') ($ VSub_Name '$KEYFILE') (' ') (${ VSub_Name SSH_USER) ('@') 
                            (${ VSub_Name IP)
                          )
                        }
                      spids: [372]
                    )
                  ]
                  spids: [372]
                )
                (C {(echo)} 
                  {
                    (DQ ('SSHing to the non-Vagrant machine ') (${ VSub_Name IP) (' as ') 
                      (${ VSub_Name SSH_USER)
                    )
                  }
                )
              ]
              spids: [363 402]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: (BoolBinary op_id:BoolBinary_ge left:{($ VSub_Pound '$#')} right:{(3)})
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:CHEF_ENVIRONMENT)
                          op: Equal
                          rhs: {(DQ ($ VSub_Number '$3'))}
                          spids: [421]
                        )
                      ]
                      spids: [421]
                    )
                  ]
                  spids: [16777215 418]
                )
              ]
              else_action: [
                (Assignment
                  keyword: Assign_None
                  pairs: [
                    (assign_pair
                      lhs: (LhsName name:CHEF_ENVIRONMENT)
                      op: Equal
                      rhs: {(DQ (Test-Laptop))}
                      spids: [430]
                    )
                  ]
                  spids: [430]
                )
              ]
              spids: [427 436]
            )
            (C {(echo)} {(DQ ('Chef environment: ') (${ VSub_Name CHEF_ENVIRONMENT))})
          ]
          spids: [16777215 109]
        )
      ]
      else_action: [
        (SimpleCommand
          words: [
            {(echo)}
            {
              (DQ ('Usage: ') 
                (CommandSubPart
                  command_list: (CommandList children:[(C {(basename)} {($ VSub_Number '$0')})])
                  left_token: <Left_Backtick '`'>
                  spids: [455 459]
                ) (' --vagrant-local|--vagrant-remote|--vagrant-vmware|<user name> IP-Address [chef environment]')
              )
            }
          ]
          redirects: [(Redir op_id:Redir_DGreat fd:16777215 arg_word:{(/dev/stderr)} spids:[463])]
        )
        (C {(exit)})
      ]
      spids: [448 470]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: 
                    (LogicalNot
                      child: 
                        (BoolUnary
                          op_id: BoolUnary_f
                          child: {(DQ (environments/) (${ VSub_Name CHEF_ENVIRONMENT) (.json))}
                        )
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {(echo)} 
              {(DQ ('Error: environment file ') (${ VSub_Name CHEF_ENVIRONMENT) ('.json not found'))}
            )
            (C {(exit)})
          ]
          spids: [16777215 495]
        )
      ]
      spids: [16777215 511]
    )
    (C {(pushd)} {($ VSub_Name '$DIR')})
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (DBracket expr:(BoolUnary op_id:BoolUnary_z child:{($ VSub_Name '$VAGRANT')}))
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:ISO)
                  op: Equal
                  rhs: {(ubuntu-14.04-mini.iso)}
                  spids: [533]
                )
              ]
              spids: [533]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (LogicalNot
                              child: (BoolUnary op_id:BoolUnary_f child:{($ VSub_Name '$KEYFILE')})
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(ssh-keygen)} {(-N)} {(DQ )} {(-f)} {($ VSub_Name '$KEYFILE')})]
                  spids: [16777215 550]
                )
              ]
              spids: [16777215 565]
            )
            (C {(echo)} {(DQ ('Running rsync of non-Vagrant install'))})
            (C {(rsync)} {($ VSub_Name '$RSYNCEXTRA')} {(-avP)} {(-e)} 
              {(DQ ('ssh -i ') ($ VSub_Name '$KEYFILE'))} {(--exclude)} {(vbox)} {(--exclude)} {(vmware)} {(--exclude)} {($ VSub_Name '$KEYFILE')} {(--exclude)} 
              {(.chef)} {(.)} {(${ VSub_Name SSH_USER) (Lit_Other '@') ($ VSub_Name '$IP') (Lit_Other ':') (chef-bcpc)}
            )
            (C {(rsync)} {($ VSub_Name '$RSYNCEXTRA')} {(-avP)} {(-e)} 
              {(DQ ('ssh -i ') ($ VSub_Name '$KEYFILE'))} {(vbox/) ($ VSub_Name '$ISO')} 
              {(${ VSub_Name SSH_USER) (Lit_Other '@') ($ VSub_Name '$IP') (Lit_Other ':') 
                (chef-bcpc/cookbooks/bcpc/files/default/bins)
              }
            )
            (C {($ VSub_Name '$SSH_CMD')} 
              {
                (DQ ('cd ') ($ VSub_Name '$BCPC_DIR') (' && ./setup_ssh_keys.sh ') 
                  (${ VSub_Name KEYFILE) (.pub)
                )
              }
            )
          ]
          spids: [16777215 530]
        )
      ]
      else_action: [
        (C {(echo)} {(DQ ('Running rsync of Vagrant install'))})
        (C {($ VSub_Name '$SSH_CMD')} 
          {
            (DQ ('rsync ') ($ VSub_Name '$RSYNCEXTRA') 
              (
' -avP --exclude vbox --exclude vmware --exclude .chef /chef-bcpc-host/ /home/vagrant/chef-bcpc/'
              )
            )
          }
        )
        (C {(echo)} {(DQ ('Rsync over the hypervisor mini ISO to avoid redownloading'))})
        (C {($ VSub_Name '$SSH_CMD')} 
          {
            (DQ ('rsync ') ($ VSub_Name '$RSYNCEXTRA') (' -avP /chef-bcpc-host/vbox/') 
              ($ VSub_Name '$ISO') ('  /home/vagrant/chef-bcpc/cookbooks/bcpc/files/default/bins')
            )
          }
        )
      ]
      spids: [653 689]
    )
    (C {(echo)} {(DQ ('Updating server'))})
    (C {($ VSub_Name '$SSH_CMD')} 
      {
        (DQ ('cd ') ($ VSub_Name '$BCPC_DIR') 
          (' && sudo apt-get -y update && sudo apt-get -y dist-upgrade')
        )
      }
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: 
                (DBracket
                  expr: 
                    (LogicalAnd
                      left: (BoolUnary op_id:BoolUnary_n child:{(DQ ($ VSub_Name '$VBOX'))})
                      right: 
                        (BoolUnary
                          op_id: BoolUnary_z
                          child: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (Pipeline
                                        children: [
                                          (C {($ VSub_Name '$VBM')} {(snapshot)} {(bcpc-bootstrap)} 
                                            {(list)}
                                          )
                                          (C {(grep)} {(dist-upgrade)})
                                        ]
                                        negated: False
                                      )
                                    ]
                                  )
                                left_token: <Left_Backtick '`'>
                                spids: [720 734]
                              )
                            }
                        )
                    )
                )
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (C {(echo)} {(DQ ('Taking snapshot (VirtualBox)'))})
            (C {($ VSub_Name '$VBM')} {(snapshot)} {(bcpc-bootstrap)} {(take)} {(dist-upgrade-complete)})
          ]
          spids: [16777215 739]
        )
      ]
      spids: [16777215 759]
    )
    (If
      arms: [
        (if_arm
          cond: [
            (Sentence
              child: (C {(Lit_Other '[')} {(-n)} {(DQ ($ VSub_Name '$VMWARE'))} {(Lit_Other ']')})
              terminator: <Op_Semi ';'>
            )
          ]
          action: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:VM_PATH)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (C {(ls)} {(-d)} 
                                {(.vagrant/machines/bootstrap/vmware_fusion/) (Lit_Other '*') (/)}
                              )
                            ]
                          )
                        left_token: <Left_Backtick '`'>
                        spids: [778 786]
                      )
                    }
                  spids: [777]
                )
              ]
              spids: [777]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:VMX_FILE)
                  op: Equal
                  rhs: {($ VSub_Name '$VM_PATH') (/precise64.vmx)}
                  spids: [789]
                )
              ]
              spids: [789]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolUnary
                              op_id: BoolUnary_z
                              child: 
                                {
                                  (CommandSubPart
                                    command_list: 
                                      (CommandList
                                        children: [
                                          (Pipeline
                                            children: [
                                              (C {(DQ ($ VSub_Name '$VMRUN'))} {(listSnapshots)} 
                                                {($ VSub_Name '$VMX_FILE')}
                                              )
                                              (C {(grep)} {(dist-upgrade)})
                                            ]
                                            negated: False
                                          )
                                        ]
                                      )
                                    left_token: <Left_Backtick '`'>
                                    spids: [800 814]
                                  )
                                }
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ('Taking snapshot (VMware)'))})
                    (C {(DQ ($ VSub_Name '$VMRUN'))} {(snapshot)} {($ VSub_Name '$VMX_FILE')} 
                      {(dist-upgrade-complete)}
                    )
                  ]
                  spids: [16777215 819]
                )
              ]
              spids: [16777215 840]
            )
          ]
          spids: [16777215 774]
        )
      ]
      spids: [16777215 842]
    )
    (C {(echo)} {(DQ ('Building binaries'))})
    (C {($ VSub_Name '$SSH_CMD')} 
      {
        (DQ ('cd ') ($ VSub_Name '$BCPC_DIR') (' && sudo ./cookbooks/bcpc/files/default/build_bins.sh'))
      }
    )
    (C {(echo)} {(DQ ('Setting up chef server'))})
    (C {($ VSub_Name '$SSH_CMD')} 
      {(DQ ('cd ') ($ VSub_Name '$BCPC_DIR') (' && sudo ./setup_chef_server.sh ') (${ VSub_Name IP))}
    )
    (C {(echo)} {(DQ ('Setting up chef cookbooks'))})
    (C {($ VSub_Name '$SSH_CMD')} 
      {
        (DQ ('cd ') ($ VSub_Name '$BCPC_DIR') (' && ./setup_chef_cookbooks.sh ') (${ VSub_Name IP) (' ') 
          (${ VSub_Name SSH_USER)
        )
      }
    )
    (C {(echo)} {(DQ ('Setting up chef environment, roles, and uploading cookbooks'))})
    (C {($ VSub_Name '$SSH_CMD')} 
      {
        (DQ ('cd ') ($ VSub_Name '$BCPC_DIR') (' && knife environment from file environments/') 
          (${ VSub_Name CHEF_ENVIRONMENT) ('.json && knife role from file roles/*.json && knife cookbook upload -a -o cookbooks')
        )
      }
    )
    (C {(echo)} {(DQ ('Enrolling local bootstrap node into chef'))})
    (C {($ VSub_Name '$SSH_CMD')} 
      {
        (DQ ('cd ') ($ VSub_Name '$BCPC_DIR') (' && ./setup_chef_bootstrap_node.sh ') (${ VSub_Name IP) 
          (' ') (${ VSub_Name CHEF_ENVIRONMENT)
        )
      }
    )
    (C {(echo)} {(DQ ('Configuring SSH access keys for bootstrap procedure'))})
    (C {($ VSub_Name '$SSH_CMD')} 
      {(DQ ('cd ') ($ VSub_Name '$BCPC_DIR') (' && sudo ./install_bootstrap_ssh_key.sh'))}
    )
    (C {(popd)})
    (C {(echo)} {(DQ ('Finished bootstrap of Chef server!'))})
  ]
)