// Generated by IcedCoffeeScript 1.7.1-f
(function() {
  var FileBundle, SoftwareUpgrade, constants, createHash, fs, iced, log, make_esc, npm, path, __iced_k, __iced_k_noop;

  iced = require('iced-runtime');
  __iced_k = __iced_k_noop = function() {};

  make_esc = require('iced-error').make_esc;

  npm = require('./npm').npm;

  path = require('path');

  fs = require('fs');

  log = require('./log');

  constants = require('./constants').constants;

  createHash = require('crypto').createHash;

  FileBundle = (function() {
    function FileBundle(uri, body) {
      this.uri = uri;
      this.body = body;
    }

    FileBundle.prototype.filename = function() {
      return path.basename(this.uri.path);
    };

    FileBundle.prototype.fullpath = function() {
      return this._fullpath;
    };

    FileBundle.prototype.version = function() {
      var parts;
      parts = this.filename().split(/-/);
      parts = parts[1].split(/\./).slice(0, -1);
      return parts.join(".");
    };

    FileBundle.prototype.hash = function() {
      return createHash('SHA512').update(this.body).digest('hex');
    };

    FileBundle.prototype.write = function(dir, encoding, cb) {
      var err, mode, p, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      p = this._fullpath = path.join(dir, this.filename());
      mode = process.platform === 'win32' ? 0x180 : 0x100;
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "FileBundle.write"
          });
          fs.writeFile(p, _this.body, {
            mode: mode,
            encoding: encoding
          }, __iced_deferrals.defer({
            assign_fn: (function() {
              return function() {
                return err = arguments[0];
              };
            })(),
            lineno: 33
          }));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          return cb(err);
        };
      })(this));
    };

    return FileBundle;

  })();

  exports.SoftwareUpgrade = SoftwareUpgrade = (function() {
    function SoftwareUpgrade(config) {
      this.config = config;
    }

    SoftwareUpgrade.prototype.fetch = function(file, cb) {
      var body, err, req, ret, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "SoftwareUpgrade.fetch"
          });
          _this.config.request(file, __iced_deferrals.defer({
            assign_fn: (function() {
              return function() {
                err = arguments[0];
                req = arguments[1];
                return body = arguments[2];
              };
            })(),
            lineno: 47
          }));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          if (typeof err === "undefined" || err === null) {
            ret = new FileBundle(req.request.uri, body);
          }
          return cb(err, ret);
        };
      })(this));
    };

    SoftwareUpgrade.prototype.fetch_package = function(cb) {
      var err, file, ___iced_passed_deferral, __iced_deferrals, __iced_k, _ref;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      file = ["pkg", ((_ref = this.config.argv.get()) != null ? _ref[0] : void 0) || constants.links.stable].join('/');
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "SoftwareUpgrade.fetch_package"
          });
          _this.fetch(file, __iced_deferrals.defer({
            assign_fn: (function(__slot_1) {
              return function() {
                err = arguments[0];
                return __slot_1["package"] = arguments[1];
              };
            })(_this),
            lineno: 55
          }));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          return cb(err);
        };
      })(this));
    };

    SoftwareUpgrade.prototype.fetch_signature = function(cb) {
      var err, file, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      file = "/sig/files/" + (this.config.key_version()) + "/" + (this["package"].filename()) + ".asc";
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "SoftwareUpgrade.fetch_signature"
          });
          _this.fetch(file, __iced_deferrals.defer({
            assign_fn: (function(__slot_1) {
              return function() {
                err = arguments[0];
                return __slot_1.signature = arguments[1];
              };
            })(_this),
            lineno: 62
          }));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          return cb(err);
        };
      })(this));
    };

    SoftwareUpgrade.prototype.write_files = function(cb) {
      var esc, tmpdir, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      esc = make_esc(cb, "SoftwareUpgrade::write_files");
      log.debug("+ SoftwareUpgrade::write_files");
      tmpdir = this.config.get_tmpdir();
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "SoftwareUpgrade.write_files"
          });
          _this["package"].write(tmpdir, 'binary', esc(__iced_deferrals.defer({
            lineno: 71
          })));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          (function(__iced_k) {
            __iced_deferrals = new iced.Deferrals(__iced_k, {
              parent: ___iced_passed_deferral,
              filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
              funcname: "SoftwareUpgrade.write_files"
            });
            _this.signature.write(tmpdir, 'utf8', esc(__iced_deferrals.defer({
              lineno: 72
            })));
            __iced_deferrals._fulfill();
          })(function() {
            log.debug("- SoftwareUpgrade::write_files");
            return cb(null);
          });
        };
      })(this));
    };

    SoftwareUpgrade.prototype.verify_signature = function(cb) {
      var args, err, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      log.debug("+ SoftwareUpgrade::verify_signature");
      args = {
        which: 'code',
        sig: this.signature.fullpath(),
        file: this["package"].fullpath()
      };
      log.debug("| Verify signature w/ " + (JSON.stringify(args)));
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "SoftwareUpgrade.verify_signature"
          });
          _this.config.oneshot_verify(args, __iced_deferrals.defer({
            assign_fn: (function() {
              return function() {
                return err = arguments[0];
              };
            })(),
            lineno: 85
          }));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          log.info("verified signature of " + (_this["package"].filename()) + " against " + (_this.signature.filename()));
          log.debug("- SoftwareUpgrade::verify_signature");
          return cb(err);
        };
      })(this));
    };

    SoftwareUpgrade.prototype.verify_hash = function(cb) {
      var err, h1, h2, v;
      h1 = this["package"].hash();
      h2 = this.config.index_lookup_hash((v = this["package"].version()));
      log.debug("| Verify hash on version " + v + ": " + h1 + " v " + h2);
      err = null;
      if (h1 !== h2) {
        err = new Error("Hash mismatch on " + (this["package"].filename()) + ": " + h1 + " != " + h2);
      }
      return cb(err);
    };

    SoftwareUpgrade.prototype.install_package = function(cb) {
      var args, err, p, x, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      log.debug("+ SoftwareUpgrade::install_package");
      p = this["package"].fullpath();
      log.debug("| Full name for install: " + p);
      log.info("Running npm install " + (this["package"].filename()) + ": this may take a minute, please be patient");
      if ((x = this.config.install_prefix()) != null) {
        log.warn("(Using non-standard install prefix: " + x + ")");
      }
      args = ["install", "-g", p];
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "SoftwareUpgrade.install_package"
          });
          npm({
            args: args
          }, __iced_deferrals.defer({
            assign_fn: (function() {
              return function() {
                return err = arguments[0];
              };
            })(),
            lineno: 110
          }));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          log.debug("- SoftwareUpgrade::install_package");
          return cb(err);
        };
      })(this));
    };

    SoftwareUpgrade.prototype.run = function(cb) {
      var esc, ___iced_passed_deferral, __iced_deferrals, __iced_k;
      __iced_k = __iced_k_noop;
      ___iced_passed_deferral = iced.findDeferral(arguments);
      esc = make_esc(cb, "SoftwareUpgrade::run");
      log.debug("+ SoftwareUpgrade::run");
      (function(_this) {
        return (function(__iced_k) {
          __iced_deferrals = new iced.Deferrals(__iced_k, {
            parent: ___iced_passed_deferral,
            filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
            funcname: "SoftwareUpgrade.run"
          });
          _this.fetch_package(esc(__iced_deferrals.defer({
            lineno: 119
          })));
          __iced_deferrals._fulfill();
        });
      })(this)((function(_this) {
        return function() {
          (function(__iced_k) {
            __iced_deferrals = new iced.Deferrals(__iced_k, {
              parent: ___iced_passed_deferral,
              filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
              funcname: "SoftwareUpgrade.run"
            });
            _this.fetch_signature(esc(__iced_deferrals.defer({
              lineno: 120
            })));
            __iced_deferrals._fulfill();
          })(function() {
            (function(__iced_k) {
              __iced_deferrals = new iced.Deferrals(__iced_k, {
                parent: ___iced_passed_deferral,
                filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
                funcname: "SoftwareUpgrade.run"
              });
              _this.write_files(esc(__iced_deferrals.defer({
                lineno: 121
              })));
              __iced_deferrals._fulfill();
            })(function() {
              (function(__iced_k) {
                __iced_deferrals = new iced.Deferrals(__iced_k, {
                  parent: ___iced_passed_deferral,
                  filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
                  funcname: "SoftwareUpgrade.run"
                });
                _this.verify_hash(esc(__iced_deferrals.defer({
                  lineno: 122
                })));
                __iced_deferrals._fulfill();
              })(function() {
                (function(__iced_k) {
                  __iced_deferrals = new iced.Deferrals(__iced_k, {
                    parent: ___iced_passed_deferral,
                    filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
                    funcname: "SoftwareUpgrade.run"
                  });
                  _this.verify_signature(esc(__iced_deferrals.defer({
                    lineno: 123
                  })));
                  __iced_deferrals._fulfill();
                })(function() {
                  (function(__iced_k) {
                    __iced_deferrals = new iced.Deferrals(__iced_k, {
                      parent: ___iced_passed_deferral,
                      filename: "/home/max/src/keybase/node-installer/src/software_upgrade.iced",
                      funcname: "SoftwareUpgrade.run"
                    });
                    _this.install_package(esc(__iced_deferrals.defer({
                      lineno: 124
                    })));
                    __iced_deferrals._fulfill();
                  })(function() {
                    log.debug("- SoftwareUpgrade::run");
                    return cb(null);
                  });
                });
              });
            });
          });
        };
      })(this));
    };

    return SoftwareUpgrade;

  })();

}).call(this);