{"version":3,"sources":["jsdelivr-header.js","/npm/gluez@0.3.2/gluez.js"],"names":[],"mappings":"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","file":"/npm/gluez@0.3.2/gluez.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/gluez@0.3.2/gluez.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","if(typeof(window) === \"undefined\")\n  var _ = require(\"underscore\")._;\n\nvar Gluez = {};\n\n(function(){\n\n  // --------------------------\n  // Shell\n  // --------------------------\n\n  var Shell = function(fun, username){\n    this.entries = [];\n    this.username = username||\"root\";\n    this.homeDir = this.username == \"root\" ? \"/root\" : \"/home/\"+this.username;\n    fun.apply(this);\n  };\n  Shell.prototype.recipes = {};\n\n  Shell.prototype.recipe = function(recipeName, opts){\n    opts = opts||{};\n    return this.recipes[recipeName].apply(this, [opts]);\n  };\n\n  Shell.prototype.su = function(fun, username){\n    var sh = new Shell(fun, username);\n    var self = this;\n    sh._w = function(str){\n      self._w(str);\n    };\n    this.entries.push(sh);\n    return sh;\n  };\n\n\n  Shell.prototype.w = function(str, numIndent){\n    numIndent = arguments.length > 0 ? numIndent : 0;\n    var indent = \"\";\n\n    for(var i=0; i < numIndent; i++)\n      indent += \"  \";\n\n    this._w(indent+str);\n  };\n\n  Shell.prototype._w = function(str){\n    console.info(str);\n  };\n\n  Shell.prototype.writeFunctions = function(dry){\n    _.each(this.entries, function(r){\n      if(r instanceof Shell)  r.writeFunctions(dry);\n      else{\n        this.w(\"function \"+r.functionName+\" {\");\n        \n        r.writeFunctionInfo(1);\n        r.writeTransferStart(0);\n        r.writeFunctionBody(1, dry);\n        r.writeTransferEnd(1);\n\n        this.w(\"}\");\n      }\n    }, this);\n  };\n\n  Shell.prototype.writeFunctionCalls = function(dry){\n    _.each(this.entries, function(r){\n      if(r.noop) return;\n\n      if(r instanceof Shell)    r.writeFunctionCalls(dry);\n      else                      this.w(r.functionName + \" # \" + this.username + \" \" + r.label);\n    }, this);  \n  };\n\n  Shell.prototype.generate = function(dry){\n    this.w(\"#!/bin/bash\");\n    this.writeFunctions(dry);\n    this.writeFunctionCalls(dry);\n  };\n\n  Shell.registerRecipe = function(recipeName, fun){\n    Shell.prototype.recipes[recipeName] = function(opts){\n      opts = opts || {};\n      fun.apply(this, [opts, function(file){\n        return \"./recipes/\"+recipeName+\"/\"+file;\n      }]);\n    };\n  };\n\n  Shell.registerResource = function(resourceName, fun){\n    Shell.prototype[resourceName] = function(name, opts){\n      opts = opts || {};\n      \n      var r = new Resource(this, resourceName+\":\"+name, opts.noop == true);\n      fun.apply(r, [name, opts]);\n\n      this.entries.push(r);\n\n      return r;\n    };\n  };\n\n  // --------------------------\n  // Step\n  // --------------------------\n\n  var Step = function(code){\n    this.code = code;\n    this.checks = [];\n  };\n\n  Step.prototype.checkCmd = function(cmd){\n    this.checks.push(cmd);\n  };\n\n  Step.prototype.check = function(){\n    switch(arguments.length){\n      case 1:\n        this.checks.push(\"test \" + arguments[0]);\n        break;\n      case 3:\n        this.checks.push('test \\\\\"\\\\$('+arguments[0]+')\\\\\"'+' '+arguments[1]+' \\\\\"'+arguments[2]+'\\\\\"');\n        break;\n      default:\n        throw \"invalid argument\";\n    }\n    return this;\n  };\n\n  _.each([\"eq\", \"lt\", \"le\", \"gt\", \"ge\"], function(op){\n    Step.prototype[op] = function(){\n      this.check.apply(this, [arguments[0], \"-\"+op, arguments[1]]);\n      return this;\n    };\n  });\n\n  // --------------------------\n  // Resource\n  // --------------------------\n\n  var Resource = function(shell, label, noop){\n    this.shell = shell;\n    this.id = Resource.id++;\n    this.label = label;\n    this.functionName = \"fun\"+this.id;\n    this.noop = noop;\n\n    this.steps = [];\n    this.notifyEntries = [];\n    this.ensureEntries = [];\n    this.data = null;\n  };\n  Resource.id = 1;\n\n  Resource.prototype.ensures = function(resource){\n    this.ensureEntries.push(resource);\n    return this;\n  };\n\n  Resource.prototype.notifies = function(resource){\n    this.notifyEntries.push(resource);\n    return this;\n  };\n\n  Resource.prototype.subscribes = function(resource){\n    resource.notifies(this);\n    return this;\n  };\n\n  Resource.prototype.transfer = function(data){\n    var encode64 = function(str){\n      if(typeof(window) === \"undefined\")    return new Buffer(str).toString(\"base64\");\n      else                                  return window.btoa(unescape(encodeURIComponent(str)));\n    };\n\n    this.data = encode64(data);\n    return this;\n  };\n\n  Resource.prototype.step = function(code){\n    var s = new Step(code);\n    this.steps.push(s);\n    return s;\n  };\n\n  Resource.prototype.wrapCode = function(code){\n    return \"su -l \"+this.shell.username+\" -c \\\"\"+code+\"\\\"\";\n  };\n\n  Resource.prototype.writeUp2date = function(indent){\n    this.shell.w(\"echo \\\"up2date [\"+this.shell.username+\"] \"+this.label+\"\\\"\", indent);\n  };\n\n  Resource.prototype.writeNotUp2date = function(indent){\n    this.shell.w(\"echo \\\"not up2date [\"+this.shell.username+\"] \"+this.label+\"\\\"\", indent);\n  };\n\n  Resource.prototype.writeExitCodeCheck = function(success, failure, indent){\n    this.shell.w('if [[ \"$?\" -eq \"0\" ]]; then', indent);\n\n    if(success)\n      success.apply(this, [indent+1]);\n\n    if(failure){\n      this.shell.w(\"else\", indent);\n      failure.apply(this, [indent+1]);\n    }\n\n    this.shell.w(\"fi\", indent);\n  };\n\n  Resource.prototype.writeFunctionInfo = function(indent){\n    this.shell.w(\"# \"+this.shell.username+\" \"+this.label, indent);\n  };\n\n  Resource.prototype.writeTransferStart = function(indent){\n    if(this.data != null){\n      this.shell.w(\"[[ -f \"+this.shell.homeDir+\"/.__transfer__ ]] && rm \"+this.shell.homeDir+\"/.__transfer__\", indent+1);\n      this.shell.w(\"\\ncat >\"+this.shell.homeDir+\"/.__transfer__ <<\\\\EOF\\n\"+this.data+\"\\nEOF\\n\", indent);\n    }\n  };\n\n  Resource.prototype.writeTransferEnd = function(indent){\n    if(this.data != null){\n      this.shell.w(\"rm \"+this.shell.homeDir+\"/.__transfer__\", indent);\n    }\n  };\n\n  Resource.prototype.writeFunctionBody = function(indent, dry){\n    if(this.steps.length == 1 && this.steps[0].checks.length == 0){\n      this.writeFunctionEnsures(indent); \n      if(dry){\n        this.writeNotUp2date(indent);\n        this.writeFunctionNotifies(indent); \n      }else{\n        this.shell.w(this.wrapCode(this.steps[0].code), indent);\n        this.writeExitCodeCheck(\n          // success\n          function(indent){ \n            this.writeUp2date(indent);\n            this.writeFunctionNotifies(indent); \n          }, \n          // failure\n          function(indent){\n            this.writeNotUp2date(indent);\n            this.shell.w(\"exit 1\", indent);\n          },\n          indent\n        );\n      }\n    }else{\n      this.writeFunctionEnsures(indent);\n      this.shell.w(_.map(this.steps, function(s){ return this.wrapCode(s.checks.join(\" && \")); }, this).join(\" && \"), indent);\n      this.writeExitCodeCheck(\n        // success\n        function(indent){\n          this.writeUp2date(indent);\n        },\n        // failure\n        function(indent){\n          this.writeNotUp2date(indent);\n          if(!dry){\n            for(var i=0; i < this.steps.length; i++){\n              this.shell.w(this.wrapCode(this.steps[i].checks.join(\" && \")) + \" || \" + this.wrapCode(this.steps[i].code), indent);\n              this.shell.w(_.map(this.steps.slice(0, i+1), function(s){ return this.wrapCode(s.checks.join(\" && \")); }, this).join(\" && \"), indent);\n              this.writeExitCodeCheck(\n                // success\n                function(indent){\n                  this.shell.w(\"echo \\\"updating [\"+this.shell.username+\"] (\"+(i+1)+\"/\"+this.steps.length+\") \"+this.label+\"\\\"\", indent);\n                },\n                // failure\n                function(indent){\n                  this.shell.w(\"echo \\\"not up2date [\"+this.shell.username+\"] (\"+(i+1)+\"/\"+this.steps.length+\") \"+this.label+\"\\\"\", indent);\n                  this.shell.w(\"exit 1\", indent);\n                },\n                indent\n              );\n            }\n            this.writeUp2date(indent);\n          }\n          this.writeFunctionNotifies(indent); \n        },\n        indent\n      );\n    }\n  };\n\n  Resource.prototype.writeFunctionEnsures = function(indent){\n    _.each(this.ensureEntries, function(n){\n      this.shell.w(\"echo \\\"ensure [\"+n.label+\"] for [\"+this.label+\"]\\\"\", indent);\n      this.shell.w(n.functionName + \" # ensure \" + n.label, indent);\n    }, this);      \n  };\n\n  Resource.prototype.writeFunctionNotifies = function(indent){\n    _.each(this.notifyEntries, function(n){\n      this.shell.w(n.functionName + \" # notify \" + n.label, indent);\n    }, this);\n  };\n\n  // --------------------------\n  // Resources\n  // --------------------------\n\n  Shell.registerResource(\"edit\", function(name, opts){\n    this.add = function(line){\n      this.step(\"cp \"+name+\" \"+name+\".bak\"+(new Date().getTime())+\" && echo '\"+line+\"' >> \"+name)\n        .check(\"cat \"+name+\" | grep '\"+line+\"' | wc -l\", \"-eq\", 1);\n      return this;\n    };\n    this.remove = function(line){\n      this.step(\"cp \"+name+\" \"+name+\".bak\"+(new Date().getTime())+\" && cat \"+name+\" | grep -v '\"+line+\"' > \"+name+\".tmp && mv \"+name+\".tmp \"+name)\n        .check(\"cat \"+name+\" | grep '\"+line+\"' | wc -l\", \"-eq\", 0);\n      return this;\n    };\n    this.substitute = function(pattern, replacement){\n      this.step(\"cp \"+name+\" \"+name+\".bak\"+(new Date().getTime())+\" && sed 's/\"+pattern+\"/\"+replacement+\"/g' -i \"+name)\n        .check(\"cat \"+name+\" | md5sum - | cut -f 1 -d ' '\", \"==\", \"\\\\$(cat \"+name+\" | sed 's/\"+pattern+\"/\"+replacement+\"/g' | md5sum - | cut -f 1 -d ' ')\");\n      return this;\n    };\n  });\n\n  Shell.registerResource(\"install\", function(name, opts){\n    this.step(\"apt-get install \"+name+\" --yes\")\n      .eq(\"apt-cache policy \"+name+\" | grep Installed | wc -l\", 1)\n      .eq(\"apt-cache policy \"+name+\" | grep Installed | grep '(none)' | wc -l\", 0);\n  });\n\n  Shell.registerResource(\"compile\", function(name, opts){\n    this.step(\"mkdir ~/tmp\").check(\"-d ~/tmp\");\n\n    var filename = name.split(\"/\")[name.split(\"/\").length-1];\n    this.step(\"wget --no-check-certificate -O ~/tmp/\"+filename+\" \"+name+\" && cd ~/tmp && rm -rf ./\"+opts.folder+\" && \"+opts.extract+\" && cd \"+opts.folder+\" && \"+opts.compile)\n      .check(\"-x \"+opts.executable);\n  });\n\n  Shell.registerResource(\"copy\", function(name, opts){\n    this.step(\"cp \"+opts.source+\" \"+name).checkCmd(\"cmp \" + opts.source+\" \"+name+\" > /dev/null 2>&1\");\n  });\n\n  Shell.registerResource(\"disable\", function(name, opts){\n    this.step(\"/usr/sbin/update-rc.d -f \"+name+\" remove\")\n      .eq(\"update-rc.d -n -f \"+name+\" remove | grep '/etc/rc' | wc -l\", 0);\n  });\n\n  Shell.registerResource(\"enable\", function(name, opts){\n    this.step(\"/usr/sbin/update-rc.d \"+name+\" defaults\")\n      .ge(\"update-rc.d -n -f \"+name+\" remove | grep '/etc/rc' | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"gem_install\", function(name, opts){\n    this.step(\"gem install \"+name+\" --version \"+opts.version+\" --user-install --no-rdoc --no-ri\")\n      .eq(\"gem list \"+name+\" --installed --version \"+opts.version+\" | grep 'true' | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"group\", function(name, opts){\n    this.step(\"groupadd --gid \"+opts.gid+\" \"+name)\n      .eq(\"cat /etc/group | grep -E '^\"+name+\":' | wc -l\", 1)\n      .eq(\"cat /etc/group | grep -E '^\"+name+\":' | cut -f 3 -d ':' | grep '\"+opts.gid+\"' | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"link\", function(name, opts){\n    this.step(\"ln -f -s \"+opts.target+\" \"+name).check(\"-L \"+name);\n  });\n\n  Shell.registerResource(\"postgresql_database\", function(name, opts){\n    this.step(\"echo 'create database \"+name+\" with owner = \"+name+\"' | psql\").eq(\"echo '\\\\l' | psql -t | cut -f 1 -d '|' | grep \"+name+\" | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"postgresql_role\", function(name, opts){\n    this.step(\"echo \\\\\\\"create role \"+name+\" with login password '\"+opts.password+\"'\\\\\\\" | psql\")\n      .eq(\"echo '\\\\du' | psql -A --field-separator ' ' | cut -f 1 -d ' ' | grep \"+name+\" | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"shell\", function(name, opts){\n    this.step(name);\n    this.noop = true;\n  });\n\n  Shell.registerResource(\"start\", function(name, opts){\n    opts.sleep = opts.sleep || 1;\n    var s = this.step(\"service \"+name+\" start && sleep \"+opts.sleep);\n\n    if(opts.status)   s.eq(\"service \"+name+\" status 2>&1 | \"+opts.status[0], opts.status[1]);\n    else              s.eq(\"service \"+name+\" status 2>&1 | grep -E 'Running|is running|start/running' | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"stop\", function(name, opts){\n    opts.sleep = opts.sleep || 1;\n    var s = this.step(\"service \"+name+\" stop && sleep \"+opts.sleep);\n\n    if(opts.status)     s.eq(\"service \"+name+\" status 2>&1 | \"+opts.status[0], opts.status[1]);\n    else                s.eq(\"service \"+name+\" status 2>&1 | grep 'not running' | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"transfer\", function(name, opts){\n    opts.chmod = opts.chmod || \"644\";\n    opts.vars = opts.vars || {};\n\n    this.step(\"touch \" + name).check(\"-f \" + name);\n    this.step(\"chmod \"+opts.chmod+\" \"+name).check(\"stat -L --format=%a \"+name, \"==\", opts.chmod);\n\n    this.transfer(_.size(opts.vars) > 0 ? _.template(opts.source.toString())(opts.vars) : opts.source);\n\n    this.step(\"chmod u+w \"+name+\" && cat ~/.__transfer__ | base64 -i -d - > \"+name+\" && chmod \"+opts.chmod+\" \"+name)\n      .check(\"cat ~/.__transfer__ | base64 -i -d - | md5sum - | cut -f 1 -d ' '\", \"==\", \"\\\\$(md5sum \"+name+\" | cut -f 1 -d ' ')\");\n  });\n\n  Shell.registerResource(\"user\", function(name, opts){\n    var cmd = \"useradd --create-home --uid \"+opts.uid+\" --gid \"+opts.gid+\" --shell /bin/bash\";\n    if(opts.groups)\n      cmd += \" -G \"+opts.groups.join(\",\");\n\n    cmd += \" \"+name;\n\n    this.step(cmd)\n      .eq(\"cat /etc/passwd | grep -E '^\"+name+\":' | wc -l\", 1)\n      .eq(\"cat /etc/passwd | cut -f 3 -d ':' | grep '\"+opts.uid+\"' | wc -l\", 1)\n      .eq(\"cat /etc/passwd | cut -f 4 -d ':' | grep '\"+opts.gid+\"' | wc -l\", 1);\n  });\n\n  Shell.registerResource(\"dir\", function(name, opts){\n    this.step(\"mkdir \" + name).check(\"-d \"+name);\n\n    if(opts.chmod)\n      this.step(\"chmod \" + opts.chmod + \" \"+name).check(\"stat -L --format=%a \"+name, \"==\", opts.chmod);\n  });\n\n  Shell.registerResource(\"file\", function(name, opts){\n    this.step(\"touch \" + name).check(\"-f \"+name);\n\n    if(opts.chmod)\n      this.step(\"chmod \" + opts.chmod + \" \"+name).check(\"stat -L --format=%a \"+name, \"==\", opts.chmod);\n  });\n\n  Gluez.Shell = Shell;\n  \n})();\n\n\nif(typeof(window) === \"undefined\"){\n  module.exports = Gluez;\n}"]}