(command.CommandList
  children: [
    (C {(Id.KW_Set set)} {(-o)} {(errexit)})
    (C {(Id.KW_Set set)} {(-o)} {(nounset)})
    (C {(Id.KW_Set set)} {(-o)} {(pipefail)})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:VERSION_FILE)
          op: assign_op.Equal
          rhs: {(DQ (version.txt))}
          spids: [136]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(-n)} 
                  {
                    (DQ 
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:VERSION_CONTENTS span_id:156)
                        suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:(word.Empty))
                      )
                    )
                  } {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:162)
            )
          ]
          action: [
            (command.Simple
              words: [{(echo)} {(DQ (${ Id.VSub_Name VERSION_CONTENTS))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:175)
                  fd: -1
                  arg_word: {(DQ (${ Id.VSub_Name VERSION_FILE))}
                )
              ]
            )
          ]
          spids: [148 164]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(Id.KW_Bang '!')} {(-f)} {(DQ (${ Id.VSub_Name VERSION_FILE))} 
                  {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:200)
            )
          ]
          action: [
            (command.Simple
              words: [{(echo)} {(DQ (2.2.1/etcd2))}]
              redirects: [
                (redir.Redir
                  op: (Token id:Id.Redir_Great val:'>' span_id:211)
                  fd: -1
                  arg_word: {(DQ (${ Id.VSub_Name VERSION_FILE))}
                )
              ]
            )
          ]
          spids: [185 202]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:VERSION_CONTENTS)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:223)
                  command_list: 
                    (command.CommandList
                      children: [(C {(cat)} {(${ Id.VSub_Name VERSION_FILE)})]
                    )
                )
              )
            }
          spids: [221]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ETCD_VERSION)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:234)
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.Pipeline
                          children: [
                            (C {(echo)} {($ Id.VSub_DollarName '$VERSION_CONTENTS')})
                            (C {(cut)} {(-d)} {(SQ (Token id:Id.Lit_Chars val:/ span_id:246))} {(-f)} 
                              {(1)}
                            )
                          ]
                          negated: F
                        )
                      ]
                    )
                )
              )
            }
          spids: [232]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:ETCD_API)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (command_sub
                  left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:257)
                  command_list: 
                    (command.CommandList
                      children: [
                        (command.Pipeline
                          children: [
                            (C {(echo)} {($ Id.VSub_DollarName '$VERSION_CONTENTS')})
                            (C {(cut)} {(-d)} {(SQ (Token id:Id.Lit_Chars val:/ span_id:269))} {(-f)} 
                              {(2)}
                            )
                          ]
                          negated: F
                        )
                      ]
                    )
                )
              )
            }
          spids: [255]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:NAME)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (braced_var_sub
                  token: (Token id:Id.VSub_Name val:NAME span_id:291)
                  suffix_op: 
                    (suffix_op.Unary
                      op_id: Id.VTest_ColonHyphen
                      arg_word: 
                        {(etcd-) 
                          (command_sub
                            left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:294)
                            command_list: (command.CommandList children:[(C {(hostname)})])
                          )
                        }
                    )
                )
              )
            }
          spids: [288]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:etcd_port)
          op: assign_op.Equal
          rhs: {(2379)}
          spids: [304]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:event_etcd_port)
          op: assign_op.Equal
          rhs: {(4002)}
          spids: [307]
        )
      ]
    )
    (command.ShFunction
      name: wait_for_etcd_up
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:port)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [321]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:health_ok)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ('{') 
                        (word_part.EscapedLiteral
                          token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:340)
                        ) (health) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\"' span_id:342)) (': ') 
                        (word_part.EscapedLiteral
                          token: (Token id:Id.Lit_EscapedChar val:'\\"' span_id:344)
                        ) (true) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\"' span_id:346)) ('}')
                      )
                    }
                  spids: [337]
                )
              ]
            )
            (command.ForEach
              iter_name: i
              iter_words: [
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:357)
                    command_list: (command.CommandList children:[(C {(seq)} {(120)})])
                  )
                }
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:health)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:372)
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (C {(curl)} {(--silent)} 
                                        {(http) (Id.Lit_Other ':') (//127.0.0.1) (Id.Lit_Other ':') 
                                          (${ Id.VSub_Name port) (/health)
                                        }
                                      )
                                    ]
                                  )
                              )
                            }
                          spids: [371]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(DQ (${ Id.VSub_Name health))} 
                                  {(Id.Lit_Equals '=') (Id.Lit_Equals '=')} {(DQ (${ Id.VSub_Name health_ok))} {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:408)
                            )
                          ]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Return val:return span_id:413)
                              arg_word: {(0)}
                            )
                          ]
                          spids: [388 410]
                        )
                      ]
                    )
                    (C {(sleep)} {(1)})
                  ]
                )
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Return val:return span_id:429)
              arg_word: {(1)}
            )
          ]
        )
    )
    (command.ShFunction
      name: wait_for_cluster_healthy
      body: 
        (command.BraceGroup
          children: [
            (command.ForEach
              iter_name: i
              iter_words: [
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:452)
                    command_list: (command.CommandList children:[(C {(seq)} {(120)})])
                  )
                }
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:cs_status)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:463)
                                    command_list: 
                                      (command.CommandList
                                        children: [
                                          (C {(kubectl)} {(get)} {(componentstatuses)} {(-o)} {(template)} 
                                            {(--template) (Id.Lit_Equals '=') 
                                              (SQ 
                                                (Token
                                                  id: Id.Lit_Chars
                                                  val: 
'{{range .items}}{{with index .conditions 0}}{{.type}}:{{.status}}{{end}}{{"\\n"}}{{end}}'
                                                  span_id: 477
                                                )
                                              )
                                            }
                                          )
                                        ]
                                      )
                                  )
                                }
                              spids: [462]
                            )
                          ]
                        )
                        (C {(true)})
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:componentstatuses)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:487)
                                    command_list: 
                                      (command.CommandList
                                        children: [
                                          (command.Pipeline
                                            children: [
                                              (C {(echo)} {(DQ (${ Id.VSub_Name cs_status))})
                                              (C {(grep)} {(-c)} 
                                                {
                                                  (SQ 
                                                    (Token
                                                      id: Id.Lit_Chars
                                                      val: 'Healthy:'
                                                      span_id: 503
                                                    )
                                                  )
                                                }
                                              )
                                            ]
                                            negated: F
                                          )
                                        ]
                                      )
                                  )
                                }
                              spids: [486]
                            )
                          ]
                        )
                        (C {(true)})
                      ]
                    )
                    (command.AndOr
                      ops: [Id.Op_DPipe]
                      children: [
                        (command.ShAssignment
                          pairs: [
                            (assign_pair
                              lhs: (sh_lhs_expr.Name name:healthy)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (command_sub
                                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:513)
                                    command_list: 
                                      (command.CommandList
                                        children: [
                                          (command.Pipeline
                                            children: [
                                              (C {(echo)} {(DQ (${ Id.VSub_Name cs_status))})
                                              (C {(grep)} {(-c)} 
                                                {
                                                  (SQ 
                                                    (Token
                                                      id: Id.Lit_Chars
                                                      val: 'Healthy:True'
                                                      span_id: 529
                                                    )
                                                  )
                                                }
                                              )
                                            ]
                                            negated: F
                                          )
                                        ]
                                      )
                                  )
                                }
                              spids: [512]
                            )
                          ]
                        )
                        (C {(true)})
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(DQ (${ Id.VSub_Name componentstatuses))} 
                                  {(-eq)} {(DQ (${ Id.VSub_Name healthy))} {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:557)
                            )
                          ]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Return val:return span_id:562)
                              arg_word: {(0)}
                            )
                          ]
                          spids: [538 559]
                        )
                      ]
                    )
                    (C {(sleep)} {(1)})
                  ]
                )
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Return val:return span_id:578)
              arg_word: {(1)}
            )
          ]
        )
    )
    (command.ShFunction
      name: wait_for_etcd_and_apiserver_down
      body: 
        (command.BraceGroup
          children: [
            (command.ForEach
              iter_name: i
              iter_words: [
                {
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:601)
                    command_list: (command.CommandList children:[(C {(seq)} {(120)})])
                  )
                }
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:etcd)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:612)
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (C {(docker)} {(ps)})
                                          (C {(grep)} {(etcd)})
                                          (C {(grep)} {(-v)} {(etcd-empty-dir)})
                                          (C {(grep)} {(-v)} {(etcd-monitor)})
                                          (C {(wc)} {(-l)})
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                              )
                            }
                          spids: [611]
                        )
                      ]
                    )
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:apiserver)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (command_sub
                                left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:648)
                                command_list: 
                                  (command.CommandList
                                    children: [
                                      (command.Pipeline
                                        children: [
                                          (C {(docker)} {(ps)})
                                          (C {(grep)} {(apiserver)})
                                          (C {(wc)} {(-l)})
                                        ]
                                        negated: F
                                      )
                                    ]
                                  )
                              )
                            }
                          spids: [647]
                        )
                      ]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: 
                                (C {(Id.Lit_LBracket '[')} {(DQ (${ Id.VSub_Name etcd))} {(-eq)} 
                                  {(DQ (0))} {(-a)} {(DQ (${ Id.VSub_Name apiserver))} {(-eq)} {(DQ (0))} {(Id.Lit_RBracket ']')}
                                )
                              terminator: (Token id:Id.Op_Semi val:';' span_id:710)
                            )
                          ]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Return val:return span_id:715)
                              arg_word: {(0)}
                            )
                          ]
                          spids: [679 712]
                        )
                      ]
                    )
                    (C {(sleep)} {(1)})
                  ]
                )
            )
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Return val:return span_id:731)
              arg_word: {(1)}
            )
          ]
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:MANIFEST_DIR)
          op: assign_op.Equal
          rhs: {(DQ (/etc/kubernetes/manifests))}
          spids: [744]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:MANIFEST_BACKUP_DIR)
          op: assign_op.Equal
          rhs: {(DQ (/etc/kubernetes/manifests-backups))}
          spids: [749]
        )
      ]
    )
    (C {(mkdir)} {(-p)} {(DQ (${ Id.VSub_Name MANIFEST_BACKUP_DIR))})
    (C {(echo)} 
      {(DQ ('Moving etcd(s) & apiserver manifest files to ') (${ Id.VSub_Name MANIFEST_BACKUP_DIR))}
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {(mv)} {(DQ (${ Id.VSub_Name MANIFEST_DIR) (/kube-apiserver.manifest))} 
          {(DQ (${ Id.VSub_Name MANIFEST_BACKUP_DIR))}
        )
        (C {(true)})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {(mv)} {(DQ (${ Id.VSub_Name MANIFEST_DIR) (/etcd.manifest))} 
          {(DQ (${ Id.VSub_Name MANIFEST_BACKUP_DIR))}
        )
        (C {(true)})
      ]
    )
    (command.AndOr
      ops: [Id.Op_DPipe]
      children: [
        (C {(mv)} {(DQ (${ Id.VSub_Name MANIFEST_DIR) (/etcd-events.manifest))} 
          {(DQ (${ Id.VSub_Name MANIFEST_BACKUP_DIR))}
        )
        (C {(true)})
      ]
    )
    (C {(echo)} {(DQ ('Waiting for etcd and kube-apiserver to be down'))})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.Pipeline children:[(C {(wait_for_etcd_and_apiserver_down)})] negated:T)
              terminator: (Token id:Id.Op_Semi val:';' span_id:851)
            )
          ]
          action: [
            (C {(echo)} {(DQ ('Downing etcd and apiserver failed'))})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:867)
              arg_word: {(1)}
            )
          ]
          spids: [846 853]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:BACKUP_DIR)
          op: assign_op.Equal
          rhs: {(DQ (/var/tmp/backup))}
          spids: [880]
        )
      ]
    )
    (C {(rm)} {(-rf)} {(DQ (${ Id.VSub_Name BACKUP_DIR))})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(DQ (${ Id.VSub_Name ETCD_API))} 
                  {(Id.Lit_Equals '=') (Id.Lit_Equals '=')} {(DQ (etcd2))} {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:913)
            )
          ]
          action: [
            (C {(echo)} {(DQ ('Preparing etcd backup data for restore'))})
            (C {(echo)} 
              {(DQ ('Copying data to ') (${ Id.VSub_Name BACKUP_DIR) (' and restoring there'))}
            )
            (C {(mkdir)} {(-p)} {(DQ (${ Id.VSub_Name BACKUP_DIR) (/member/snap))})
            (C {(mkdir)} {(-p)} {(DQ (${ Id.VSub_Name BACKUP_DIR) (/member/wal))})
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (C {(mv)} {(Id.Lit_Star '*') (.snap)} {(DQ (${ Id.VSub_Name BACKUP_DIR) (/member/snap/))})
                (C {(true)})
              ]
            )
            (C {(mv)} {(Id.Lit_Star '*') (.wal)} {(DQ (${ Id.VSub_Name BACKUP_DIR) (/member/wal/))})
            (C {(echo)} {(DQ ('Starting etcd ') (${ Id.VSub_Name ETCD_VERSION) (' to restore data'))})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:image)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1027)
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(docker)} {(run)} {(-d)} {(-v)} 
                                {(${ Id.VSub_Name BACKUP_DIR) (Id.Lit_Other ':') (/var/etcd/data)} {(--net) (Id.Lit_Equals '=') (host)} {(-p)} 
                                {(${ Id.VSub_Name etcd_port) (Id.Lit_Other ':') 
                                  (${ Id.VSub_Name etcd_port)
                                } {(DQ ('gcr.io/google_containers/etcd:') (${ Id.VSub_Name ETCD_VERSION))} {(/bin/sh)} {(-c)} 
                                {
                                  (DQ 
                                    (
'/usr/local/bin/etcd --data-dir /var/etcd/data --force-new-cluster'
                                    )
                                  )
                                }
                              )
                            ]
                          )
                      )
                    }
                  spids: [1026]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_QMark '$?'))} {(-ne)} {(DQ (0))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1094)
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ("Docker container didn't started correctly"))})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Exit val:exit span_id:1106)
                      arg_word: {(1)}
                    )
                  ]
                  spids: [1079 1096]
                )
              ]
            )
            (C {(echo)} 
              {
                (DQ ('Container ') (${ Id.VSub_Name image) 
                  (' created, waiting for etcd to report as healthy')
                )
              }
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (command.Pipeline
                          children: [(C {(wait_for_etcd_up)} {(DQ (${ Id.VSub_Name etcd_port))})]
                          negated: T
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1137)
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ("Etcd didn't come back correctly"))})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Exit val:exit span_id:1149)
                      arg_word: {(1)}
                    )
                  ]
                  spids: [1126 1139]
                )
              ]
            )
            (C {(echo)} {(DQ ('Etcd healthy - killing ') (${ Id.VSub_Name image) (' container'))})
            (C {(docker)} {(kill)} {(DQ (${ Id.VSub_Name image))})
          ]
          spids: [895 915]
        )
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} {(DQ (${ Id.VSub_Name ETCD_API))} 
                  {(Id.Lit_Equals '=') (Id.Lit_Equals '=')} {(DQ (etcd3))} {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:1201)
            )
          ]
          action: [
            (C {(echo)} {(DQ ('Preparing etcd snapshot for restore'))})
            (C {(mkdir)} {(-p)} {(DQ (${ Id.VSub_Name BACKUP_DIR))})
            (C {(echo)} 
              {(DQ ('Copying data to ') (${ Id.VSub_Name BACKUP_DIR) (' and restoring there'))}
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:number_files)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1236)
                        command_list: 
                          (command.CommandList
                            children: [
                              (command.Pipeline
                                children: [
                                  (C {(find)} {(.)} {(-maxdepth)} {(1)} {(-type)} {(f)} {(-name)} 
                                    {(DQ ('*.db'))}
                                  )
                                  (C {(wc)} {(-l)})
                                ]
                                negated: F
                              )
                            ]
                          )
                      )
                    }
                  spids: [1235]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(DQ (${ Id.VSub_Name number_files))} {(-ne)} 
                          {(DQ (1))} {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1280)
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ('Incorrect number of *.db files - expected 1'))})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Exit val:exit span_id:1292)
                      arg_word: {(1)}
                    )
                  ]
                  spids: [1263 1282]
                )
              ]
            )
            (C {(mv)} {(Id.Lit_Star '*') (.db)} {(DQ (${ Id.VSub_Name BACKUP_DIR) (/))})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:snapshot)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (command_sub
                          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1315)
                          command_list: 
                            (command.CommandList
                              children: [(C {(ls)} {(${ Id.VSub_Name BACKUP_DIR)})]
                            )
                        )
                      )
                    }
                  spids: [1313]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:image)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1339)
                        command_list: 
                          (command.CommandList
                            children: [
                              (C {(docker)} {(run)} {(-d)} {(-v)} 
                                {(${ Id.VSub_Name BACKUP_DIR) (Id.Lit_Other ':') (/var/tmp/backup)} {(--env)} {(Id.Lit_VarLike 'ETCDCTL_API=') (3)} 
                                {
                                  (DQ ('gcr.io/google_containers/etcd:') 
                                    (${ Id.VSub_Name ETCD_VERSION)
                                  )
                                } {(/bin/sh)} {(-c)} 
                                {
                                  (DQ ('/usr/local/bin/etcdctl snapshot restore ') 
                                    (${ Id.VSub_Name BACKUP_DIR) (/) (${ Id.VSub_Name snapshot) (' --name ') (${ Id.VSub_Name NAME) (' --initial-cluster ') 
                                    (${ Id.VSub_Name NAME) ('=http://localhost:2380; mv /') (${ Id.VSub_Name NAME) ('.etcd/member /var/tmp/backup/')
                                  )
                                }
                              )
                            ]
                          )
                      )
                    }
                  spids: [1338]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {(Id.Lit_LBracket '[')} {(DQ ($ Id.VSub_QMark '$?'))} {(-ne)} {(DQ (0))} 
                          {(Id.Lit_RBracket ']')}
                        )
                      terminator: (Token id:Id.Op_Semi val:';' span_id:1415)
                    )
                  ]
                  action: [
                    (C {(echo)} {(DQ ("Docker container didn't started correctly"))})
                    (command.ControlFlow
                      token: (Token id:Id.ControlFlow_Exit val:exit span_id:1427)
                      arg_word: {(1)}
                    )
                  ]
                  spids: [1400 1417]
                )
              ]
            )
            (C {(echo)} 
              {
                (DQ ('Prepare container exit code: ') 
                  (command_sub
                    left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1439)
                    command_list: 
                      (command.CommandList
                        children: [(C {(docker)} {(wait)} {(${ Id.VSub_Name image)})]
                      )
                  )
                )
              }
            )
            (C {(rm)} {(-f)} {(DQ (${ Id.VSub_Name BACKUP_DIR) (/) (${ Id.VSub_Name snapshot))})
          ]
          spids: [1183 1203]
        )
      ]
    )
    (C {(cp)} {(DQ (${ Id.VSub_Name VERSION_FILE))} {(DQ (${ Id.VSub_Name BACKUP_DIR))})
    (C {(export)} 
      {(Id.Lit_VarLike 'CVM=') 
        (command_sub
          left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:1492)
          command_list: 
            (command.CommandList
              children: [
                (command.Sentence
                  child: 
                    (command.Pipeline
                      children: [
                        (C {(curl)} {(DQ ('http://metadata/computeMetadata/v1/instance/attributes/'))} 
                          {(-H)} {(DQ ('Metadata-Flavor: Google'))}
                        )
                        (C {(grep)} {(-q)} {(gci)})
                      ]
                      negated: F
                      stderr_indices: [0]
                    )
                  terminator: (Token id:Id.Op_Semi val:';' span_id:1512)
                )
                (C {(echo)} {($ Id.VSub_QMark '$?')})
              ]
            )
        )
      }
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.DBracket
                  expr: 
                    (bool_expr.Binary
                      op_id: Id.BoolBinary_GlobDEqual
                      left: {(DQ ($ Id.VSub_DollarName '$CVM'))}
                      right: {(DQ (1))}
                    )
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:1534)
            )
          ]
          action: [(C {(export)} {(Id.Lit_VarLike 'MNT_DISK=') (DQ (/mnt/master-pd))})]
          spids: [1519 1536]
        )
      ]
      else_action: [(C {(export)} {(Id.Lit_VarLike 'MNT_DISK=') (DQ (/mnt/disks/master-pd))})]
    )
    (C {(rm)} {(-rf)} {(DQ (${ Id.VSub_Name MNT_DISK) (/var/etcd-corrupted))})
    (C {(mkdir)} {(-p)} {(DQ (${ Id.VSub_Name MNT_DISK) (/var/etcd-corrupted))})
    (C {(echo)} {(DQ ('Saving corrupted data to ') (${ Id.VSub_Name MNT_DISK) (/var/etcd-corrupted))})
    (C {(mv)} {(/var/etcd/data)} {(DQ (${ Id.VSub_Name MNT_DISK) (/var/etcd-corrupted))})
    (C {(echo)} {(DQ ('Copying restored data to /var/etcd/data'))})
    (C {(mv)} {(DQ (${ Id.VSub_Name BACKUP_DIR))} {(/var/etcd/data)})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (C {(Id.Lit_LBracket '[')} 
                  {
                    (DQ 
                      (braced_var_sub
                        token: (Token id:Id.VSub_Name val:RESET_EVENT_ETCD span_id:1632)
                        suffix_op: (suffix_op.Unary op_id:Id.VTest_ColonHyphen arg_word:(word.Empty))
                      )
                    )
                  } {(Id.Lit_Equals '=') (Id.Lit_Equals '=')} {(DQ (true))} {(Id.Lit_RBracket ']')}
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:1645)
            )
          ]
          action: [
            (C {(echo)} {(DQ ('Removing event-etcd corrupted data'))})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:EVENTS_CORRUPTED_DIR)
                  op: assign_op.Equal
                  rhs: {(DQ (${ Id.VSub_Name MNT_DISK) (/var/etcd-events-corrupted))}
                  spids: [1657]
                )
              ]
            )
            (C {(rm)} {(-rf)} {(DQ (${ Id.VSub_Name EVENTS_CORRUPTED_DIR))})
            (C {(mkdir)} {(-p)} {(DQ (${ Id.VSub_Name EVENTS_CORRUPTED_DIR))})
            (C {(mv)} {(/var/etcd/data-events)} {(DQ (${ Id.VSub_Name EVENTS_CORRUPTED_DIR))})
          ]
          spids: [1626 1647]
        )
      ]
    )
    (C {(echo)} {(DQ ('Restarting etcd and apiserver from restored snapshot'))})
    (C {(mv)} {(DQ (${ Id.VSub_Name MANIFEST_BACKUP_DIR)) (/) (Id.Lit_Star '*')} 
      {(DQ (${ Id.VSub_Name MANIFEST_DIR) (/))}
    )
    (C {(rm)} {(-rf)} {(DQ (${ Id.VSub_Name MANIFEST_BACKUP_DIR))})
    (C {(echo)} {(DQ ('Waiting for etcd to come back'))})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wait_for_etcd_up)} {(DQ (${ Id.VSub_Name etcd_port))})]
                  negated: T
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:1762)
            )
          ]
          action: [
            (C {(echo)} {(DQ ("Etcd didn't come back correctly"))})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:1774)
              arg_word: {(1)}
            )
          ]
          spids: [1751 1764]
        )
      ]
    )
    (C {(echo)} {(DQ ('Waiting for event etcd to come back'))})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: 
                (command.Pipeline
                  children: [(C {(wait_for_etcd_up)} {(DQ (${ Id.VSub_Name event_etcd_port))})]
                  negated: T
                )
              terminator: (Token id:Id.Op_Semi val:';' span_id:1801)
            )
          ]
          action: [
            (C {(echo)} {(DQ ("Event etcd didn't come back correctly"))})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:1813)
              arg_word: {(1)}
            )
          ]
          spids: [1790 1803]
        )
      ]
    )
    (C {(echo)} {(DQ ('Waiting for apiserver to come back'))})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (command.Pipeline children:[(C {(wait_for_cluster_healthy)})] negated:T)
              terminator: (Token id:Id.Op_Semi val:';' span_id:1834)
            )
          ]
          action: [
            (C {(echo)} {(DQ ("Apiserver didn't come back correctly"))})
            (command.ControlFlow
              token: (Token id:Id.ControlFlow_Exit val:exit span_id:1846)
              arg_word: {(1)}
            )
          ]
          spids: [1829 1836]
        )
      ]
    )
    (C {(echo)} {(DQ ('Cluster successfully restored!'))})
  ]
)