From a850243c59f062862b0902de923fdda18da98182 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Wed, 22 Jun 2016 13:22:09 +0200 Subject: [PATCH] now working --- .gitignore | 3 ++- .gitlab-ci.yml | 6 ++++- README.md | 2 -- dist/cert.hook.d.ts | 1 + dist/cert.hook.js | 50 ++++++++++++++++++++++++++++++++++- dist/cert.paths.d.ts | 5 +++- dist/cert.paths.js | 8 ++++-- dist/cert.plugins.d.ts | 10 +++++++ dist/cert.plugins.js | 14 ++++++++-- dist/index.d.ts | 2 +- dist/index.js | 17 ++++++++++-- dist/install.d.ts | 1 + dist/install.js | 28 +++++++++++++------- package.json | 11 ++++---- test/test.js | 31 +++++++++++++++++++++- test/test.ts | 33 ++++++++++++++++++++++- ts/cert.hook.ts | 59 ++++++++++++++++++++++++++++++++++++++++-- ts/cert.paths.ts | 6 ++++- ts/cert.plugins.ts | 5 ++++ ts/index.ts | 15 ++++++++++- ts/install.ts | 34 +++++++++++++++--------- 21 files changed, 295 insertions(+), 46 deletions(-) mode change 100644 => 100755 dist/cert.hook.js diff --git a/.gitignore b/.gitignore index 4141bc2..fea0d45 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ node_modules docs/ coverage/ -.nogit/ \ No newline at end of file +.nogit/ +dist/assets/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0f6389a..661c3ca 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -6,9 +6,11 @@ stages: - release testLTS: - stage: test + stage: test1 script: - npmci test lts + only: + - tags tags: - docker - lossless @@ -17,6 +19,8 @@ testSTABLE: stage: test2 script: - npmci test stable + only: + - tags tags: - docker - lossless diff --git a/README.md b/README.md index 14df2d0..7dfd7cb 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,6 @@ # Cert Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready. -> Note: this package is in pre-alpha stage and will be ready soon. - ## Usage ```typescript diff --git a/dist/cert.hook.d.ts b/dist/cert.hook.d.ts index e69de29..62d7805 100644 --- a/dist/cert.hook.d.ts +++ b/dist/cert.hook.d.ts @@ -0,0 +1 @@ +import "typings-global"; diff --git a/dist/cert.hook.js b/dist/cert.hook.js old mode 100644 new mode 100755 index 7614985..627407f --- a/dist/cert.hook.js +++ b/dist/cert.hook.js @@ -1,3 +1,51 @@ +#!/usr/bin/env node "use strict"; +require("typings-global"); +var plugins = require("./cert.plugins"); +var paths = require("./cert.paths"); +var smartcli = new plugins.smartcli.Smartcli(); +var config = plugins.smartfile.local.toObjectSync(paths.config); +var cflare = new plugins.cflare.CflareAccount(); +cflare.auth({ + email: config.cfEmail, + key: config.cfKey +}); +var setChallenge = function (domainNameArg, challengeArg) { + var done = plugins.q.defer(); + cflare.createRecord(prefixName(domainNameArg), "TXT", challengeArg).then(function () { + cooldown().then(function () { + done.resolve(); + }); + }); + return done.promise; +}; +var cleanChallenge = function (domainNameArg) { + var done = plugins.q.defer(); + cflare.removeRecord(prefixName(domainNameArg), "TXT"); + return done.promise; +}; +var cooldown = function () { + var done = plugins.q.defer(); + console.log("Cooling down!"); + setTimeout(function () { + done.resolve(); + }, 20000); + return done.promise; +}; +var prefixName = function (domainNameArg) { + return "_acme-challenge." + domainNameArg; +}; +smartcli.addCommand({ + commandName: "deploy_challenge" +}).then(function (argv) { + console.log(argv); + setChallenge(argv._[1], argv._[3]); +}); +smartcli.addCommand({ + commandName: "clean_challenge" +}).then(function (argv) { + cleanChallenge(argv._[1]); +}); +smartcli.startParse(); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJjZXJ0Lmhvb2suanMiLCJzb3VyY2VzQ29udGVudCI6W119 +//# sourceMappingURL=data:application/json;charset=utf8;base64,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cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuLy8gdGhlIHNoZWJhbmcgbGluZSBhYm92ZSBtYWtlcyBzdXJlIHRoaXMgc2NyaXB0IHdpbGwgZ2V0IGludGVycHJldGVkIGJ5IG5vZGVcblxuaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIjtcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmxldCBzbWFydGNsaSA9IG5ldyBwbHVnaW5zLnNtYXJ0Y2xpLlNtYXJ0Y2xpKCk7XG5cbmxldCBjb25maWcgPSBwbHVnaW5zLnNtYXJ0ZmlsZS5sb2NhbC50b09iamVjdFN5bmMocGF0aHMuY29uZmlnKTtcbmxldCBjZmxhcmUgPSBuZXcgcGx1Z2lucy5jZmxhcmUuQ2ZsYXJlQWNjb3VudCgpO1xuY2ZsYXJlLmF1dGgoe1xuICAgIGVtYWlsOiBjb25maWcuY2ZFbWFpbCxcbiAgICBrZXk6IGNvbmZpZy5jZktleVxufSk7XG5cbmxldCBzZXRDaGFsbGVuZ2UgPSAoZG9tYWluTmFtZUFyZzogc3RyaW5nLCBjaGFsbGVuZ2VBcmc6IHN0cmluZykgPT4ge1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgY2ZsYXJlLmNyZWF0ZVJlY29yZChwcmVmaXhOYW1lKGRvbWFpbk5hbWVBcmcpLCBcIlRYVFwiLCBjaGFsbGVuZ2VBcmcpLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb29sZG93bigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmxldCBjbGVhbkNoYWxsZW5nZSA9IChkb21haW5OYW1lQXJnKSA9PiB7XG4gICAgbGV0IGRvbmUgPSBwbHVnaW5zLnEuZGVmZXIoKTtcbiAgICBjZmxhcmUucmVtb3ZlUmVjb3JkKHByZWZpeE5hbWUoZG9tYWluTmFtZUFyZyksIFwiVFhUXCIpO1xuICAgIHJldHVybiBkb25lLnByb21pc2U7XG59XG5cbmxldCBjb29sZG93biA9ICgpID0+IHtcbiAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgIGNvbnNvbGUubG9nKFwiQ29vbGluZyBkb3duIVwiKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZG9uZS5yZXNvbHZlKCk7XG4gICAgfSwgMjAwMDApXG4gICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbn1cblxubGV0IHByZWZpeE5hbWUgPSAoZG9tYWluTmFtZUFyZzogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICByZXR1cm4gXCJfYWNtZS1jaGFsbGVuZ2UuXCIgKyBkb21haW5OYW1lQXJnO1xufVxuXG5zbWFydGNsaS5hZGRDb21tYW5kKHtcbiAgICBjb21tYW5kTmFtZTogXCJkZXBsb3lfY2hhbGxlbmdlXCJcbn0pLnRoZW4oKGFyZ3YpID0+IHtcbiAgICBjb25zb2xlLmxvZyhhcmd2KVxuICAgIHNldENoYWxsZW5nZShhcmd2Ll9bMV0sIGFyZ3YuX1szXSk7XG59KTtcblxuc21hcnRjbGkuYWRkQ29tbWFuZCh7XG4gICAgY29tbWFuZE5hbWU6IFwiY2xlYW5fY2hhbGxlbmdlXCJcbn0pLnRoZW4oKGFyZ3YpID0+IHtcbiAgICBjbGVhbkNoYWxsZW5nZShhcmd2Ll9bMV0pO1xufSk7XG5cbnNtYXJ0Y2xpLnN0YXJ0UGFyc2UoKTtcbiJdfQ== diff --git a/dist/cert.paths.d.ts b/dist/cert.paths.d.ts index ef561cc..74fab5a 100644 --- a/dist/cert.paths.d.ts +++ b/dist/cert.paths.d.ts @@ -1,2 +1,5 @@ import "typings-global"; -export import path = require("path"); +export declare let certHook: string; +export declare let config: string; +export declare let letsencryptSh: string; +export declare let sslDir: string; diff --git a/dist/cert.paths.js b/dist/cert.paths.js index 88e630c..f7f33ee 100644 --- a/dist/cert.paths.js +++ b/dist/cert.paths.js @@ -1,5 +1,9 @@ "use strict"; require("typings-global"); -exports.path = require("path"); +var plugins = require("./cert.plugins"); +exports.certHook = plugins.path.join(__dirname, "cert.hook.js"); +exports.config = plugins.path.join(__dirname, "assets/config.json"); +exports.letsencryptSh = plugins.path.join(__dirname, "assets/letsencrypt.sh"); +exports.sslDir = plugins.path.join(__dirname, "/assets/certs"); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUNWLFlBQUksV0FBVyxNQUFNLENBQUMsQ0FBQyIsImZpbGUiOiJjZXJ0LnBhdGhzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIjtcbmV4cG9ydCBpbXBvcnQgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xuXG4iXX0= +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUN4QixJQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBRS9CLGdCQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZELGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUMzRCxxQkFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3JFLGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsZUFBZSxDQUFDLENBQUMiLCJmaWxlIjoiY2VydC5wYXRocy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gXCIuL2NlcnQucGx1Z2luc1wiO1xuXG5leHBvcnQgbGV0IGNlcnRIb29rID0gcGx1Z2lucy5wYXRoLmpvaW4oX19kaXJuYW1lLFwiY2VydC5ob29rLmpzXCIpO1xuZXhwb3J0IGxldCBjb25maWcgPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvY29uZmlnLmpzb25cIik7XG5leHBvcnQgbGV0IGxldHNlbmNyeXB0U2ggPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvbGV0c2VuY3J5cHQuc2hcIik7XG5leHBvcnQgbGV0IHNzbERpciA9IHBsdWdpbnMucGF0aC5qb2luKF9fZGlybmFtZSxcIi9hc3NldHMvY2VydHNcIik7Il19 diff --git a/dist/cert.plugins.d.ts b/dist/cert.plugins.d.ts index e69de29..0281066 100644 --- a/dist/cert.plugins.d.ts +++ b/dist/cert.plugins.d.ts @@ -0,0 +1,10 @@ +import "typings-global"; +export import beautylog = require("beautylog"); +export import cflare = require("cflare"); +export declare let fs: any; +export import path = require("path"); +export declare let q: any; +export declare let shelljs: any; +export import smartcli = require("smartcli"); +export import smartfile = require("smartfile"); +export import smartstring = require("smartstring"); diff --git a/dist/cert.plugins.js b/dist/cert.plugins.js index 0de51f5..9134de3 100644 --- a/dist/cert.plugins.js +++ b/dist/cert.plugins.js @@ -1,3 +1,13 @@ +"use strict"; +require("typings-global"); +exports.beautylog = require("beautylog"); +exports.cflare = require("cflare"); +exports.fs = require("fs-extra"); +exports.path = require("path"); +exports.q = require("q"); +exports.shelljs = require("shelljs"); +exports.smartcli = require("smartcli"); +exports.smartfile = require("smartfile"); +exports.smartstring = require("smartstring"); - -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJjZXJ0LnBsdWdpbnMuanMiLCJzb3VyY2VzQ29udGVudCI6W119 +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ1YsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxjQUFNLFdBQVcsUUFBUSxDQUFDLENBQUM7QUFDOUIsVUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QixZQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDMUIsU0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixlQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFCLGdCQUFRLFdBQVcsVUFBVSxDQUFDLENBQUM7QUFDL0IsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxtQkFBVyxXQUFXLGFBQWEsQ0FBQyxDQUFDIiwiZmlsZSI6ImNlcnQucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5leHBvcnQgaW1wb3J0IGJlYXV0eWxvZyA9IHJlcXVpcmUoXCJiZWF1dHlsb2dcIik7XG5leHBvcnQgaW1wb3J0IGNmbGFyZSA9IHJlcXVpcmUoXCJjZmxhcmVcIik7XG5leHBvcnQgbGV0IGZzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuZXhwb3J0IGltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5leHBvcnQgbGV0IHEgPSByZXF1aXJlKFwicVwiKTtcbmV4cG9ydCBsZXQgc2hlbGxqcyA9IHJlcXVpcmUoXCJzaGVsbGpzXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydGNsaSA9IHJlcXVpcmUoXCJzbWFydGNsaVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRmaWxlID0gcmVxdWlyZShcInNtYXJ0ZmlsZVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRzdHJpbmcgPSByZXF1aXJlKFwic21hcnRzdHJpbmdcIik7XG5cbiJdfQ== diff --git a/dist/index.d.ts b/dist/index.d.ts index 7854aba..69de404 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -11,7 +11,7 @@ export declare class Cert { sslDir: string; gitOriginRepo?: string; }); - getDomainCert(): void; + getDomainCert(domainNameArg: string): any; } export declare class Certificate { domainName: string; diff --git a/dist/index.js b/dist/index.js index 92f2bf2..4fdba3b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,13 +1,26 @@ "use strict"; +var plugins = require("./cert.plugins"); +var paths = require("./cert.paths"); var Cert = (function () { function Cert(optionsArg) { this.cfEmail = optionsArg.cfEmail; this.cfKey = optionsArg.cfKey; this.sslDir = optionsArg.sslDir; this.gitOriginRepo = optionsArg.gitOriginRepo; + var config = { + cfEmail: this.cfEmail, + cfKey: this.cfKey + }; + plugins.smartfile.memory.toFsSync(JSON.stringify(config), { fileName: "config.json", filePath: plugins.path.join(__dirname, "assets/") }); } ; - Cert.prototype.getDomainCert = function () { }; + Cert.prototype.getDomainCert = function (domainNameArg) { + var done = plugins.q.defer(); + plugins.shelljs.exec("chmod 700 " + paths.letsencryptSh); + plugins.shelljs.exec("chmod 700 " + paths.certHook); + plugins.shelljs.exec("bash -c \"" + paths.letsencryptSh + " -c -d " + domainNameArg + " -t dns-01 -k " + paths.certHook + " -o " + paths.sslDir + "\""); + return done.promise; + }; ; return Cert; }()); @@ -20,4 +33,4 @@ var Certificate = (function () { }()); exports.Certificate = Certificate; -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFFQTtJQU9JLGNBQVksVUFLWDtRQUNHLElBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUNsQyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUNsRCxDQUFDOztJQUNELDRCQUFhLEdBQWIsY0FBZ0IsQ0FBQzs7SUFDckIsV0FBQztBQUFELENBbkJBLEFBbUJDLElBQUE7QUFuQlksWUFBSSxPQW1CaEIsQ0FBQTtBQUVEO0lBSUk7SUFFQSxDQUFDOztJQUNMLGtCQUFDO0FBQUQsQ0FQQSxBQU9DLElBQUE7QUFQWSxtQkFBVyxjQU92QixDQUFBIiwiZmlsZSI6ImluZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aHMgZnJvbSBcIi4vY2VydC5wYXRoc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2VydCB7XG4gICAgY2ZFbWFpbDpzdHJpbmc7XG4gICAgY2ZLZXk6c3RyaW5nO1xuICAgIHNzbERpcjpzdHJpbmc7XG4gICAgY2VydGlmaWNhdGVzUHJlc2VudDtcbiAgICBjZXJ0aWZpY2F0ZXNWYWxpZDtcbiAgICBnaXRPcmlnaW5SZXBvO1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnNBcmc6e1xuICAgICAgICBjZkVtYWlsOnN0cmluZyxcbiAgICAgICAgY2ZLZXk6c3RyaW5nLFxuICAgICAgICBzc2xEaXI6c3RyaW5nLFxuICAgICAgICBnaXRPcmlnaW5SZXBvPzpzdHJpbmdcbiAgICB9KXtcbiAgICAgICAgdGhpcy5jZkVtYWlsID0gb3B0aW9uc0FyZy5jZkVtYWlsO1xuICAgICAgICB0aGlzLmNmS2V5ID0gb3B0aW9uc0FyZy5jZktleTtcbiAgICAgICAgdGhpcy5zc2xEaXIgPSBvcHRpb25zQXJnLnNzbERpcjtcbiAgICAgICAgdGhpcy5naXRPcmlnaW5SZXBvID0gb3B0aW9uc0FyZy5naXRPcmlnaW5SZXBvO1xuICAgIH07XG4gICAgZ2V0RG9tYWluQ2VydCgpe307XG59XG5cbmV4cG9ydCBjbGFzcyBDZXJ0aWZpY2F0ZSB7XG4gICAgZG9tYWluTmFtZTpzdHJpbmc7XG4gICAgY3JlYXRpb25EYXRlOkRhdGU7XG4gICAgZXhwaXJ5RGF0ZTpEYXRlO1xuICAgIGNvbnN0cnVjdG9yKCl7XG5cbiAgICB9O1xufSJdfQ== +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzFDLElBQVksS0FBSyxXQUFNLGNBQWMsQ0FBQyxDQUFBO0FBRXRDO0lBT0ksY0FBWSxVQUtYO1FBQ0csSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHO1lBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNwQixDQUFBO1FBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUMsRUFBQyxRQUFRLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZJLENBQUM7O0lBQ0QsNEJBQWEsR0FBYixVQUFjLGFBQW9CO1FBQzlCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLEdBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2SixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOztJQUNMLFdBQUM7QUFBRCxDQTlCQSxBQThCQyxJQUFBO0FBOUJZLFlBQUksT0E4QmhCLENBQUE7QUFFRDtJQUlJO0lBRUEsQ0FBQzs7SUFDTCxrQkFBQztBQUFELENBUEEsQUFPQyxJQUFBO0FBUFksbUJBQVcsY0FPdkIsQ0FBQSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmV4cG9ydCBjbGFzcyBDZXJ0IHtcbiAgICBjZkVtYWlsOnN0cmluZztcbiAgICBjZktleTpzdHJpbmc7XG4gICAgc3NsRGlyOnN0cmluZztcbiAgICBjZXJ0aWZpY2F0ZXNQcmVzZW50O1xuICAgIGNlcnRpZmljYXRlc1ZhbGlkO1xuICAgIGdpdE9yaWdpblJlcG87XG4gICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZzp7XG4gICAgICAgIGNmRW1haWw6c3RyaW5nLFxuICAgICAgICBjZktleTpzdHJpbmcsXG4gICAgICAgIHNzbERpcjpzdHJpbmcsXG4gICAgICAgIGdpdE9yaWdpblJlcG8/OnN0cmluZ1xuICAgIH0pe1xuICAgICAgICB0aGlzLmNmRW1haWwgPSBvcHRpb25zQXJnLmNmRW1haWw7XG4gICAgICAgIHRoaXMuY2ZLZXkgPSBvcHRpb25zQXJnLmNmS2V5O1xuICAgICAgICB0aGlzLnNzbERpciA9IG9wdGlvbnNBcmcuc3NsRGlyO1xuICAgICAgICB0aGlzLmdpdE9yaWdpblJlcG8gPSBvcHRpb25zQXJnLmdpdE9yaWdpblJlcG87XG4gICAgICAgIGxldCBjb25maWcgPSB7XG4gICAgICAgICAgICBjZkVtYWlsOiB0aGlzLmNmRW1haWwsXG4gICAgICAgICAgICBjZktleTogdGhpcy5jZktleVxuICAgICAgICB9XG4gICAgICAgIHBsdWdpbnMuc21hcnRmaWxlLm1lbW9yeS50b0ZzU3luYyhKU09OLnN0cmluZ2lmeShjb25maWcpLHtmaWxlTmFtZTpcImNvbmZpZy5qc29uXCIsZmlsZVBhdGg6cGx1Z2lucy5wYXRoLmpvaW4oX19kaXJuYW1lLFwiYXNzZXRzL1wiKX0pO1xuICAgIH07XG4gICAgZ2V0RG9tYWluQ2VydChkb21haW5OYW1lQXJnOnN0cmluZyl7XG4gICAgICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiY2htb2QgNzAwIFwiICsgcGF0aHMubGV0c2VuY3J5cHRTaCk7XG4gICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiY2htb2QgNzAwIFwiICsgcGF0aHMuY2VydEhvb2spO1xuICAgICAgICBwbHVnaW5zLnNoZWxsanMuZXhlYyhcImJhc2ggLWMgXFxcIlwiICsgcGF0aHMubGV0c2VuY3J5cHRTaCArIFwiIC1jIC1kIFwiICsgZG9tYWluTmFtZUFyZyArIFwiIC10IGRucy0wMSAtayBcIiArIHBhdGhzLmNlcnRIb29rICsgXCIgLW8gXCIrIHBhdGhzLnNzbERpciArIFwiXFxcIlwiKTtcbiAgICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQ2VydGlmaWNhdGUge1xuICAgIGRvbWFpbk5hbWU6c3RyaW5nO1xuICAgIGNyZWF0aW9uRGF0ZTpEYXRlO1xuICAgIGV4cGlyeURhdGU6RGF0ZTtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuXG4gICAgfTtcbn0iXX0= diff --git a/dist/install.d.ts b/dist/install.d.ts index e69de29..1dbcc9f 100644 --- a/dist/install.d.ts +++ b/dist/install.d.ts @@ -0,0 +1 @@ +export declare let startInstall: () => any; diff --git a/dist/install.js b/dist/install.js index 60e4edb..132595a 100644 --- a/dist/install.js +++ b/dist/install.js @@ -1,12 +1,20 @@ "use strict"; -var beautylog = require("beautylog"); -var path = require("path"); -var smartfile = require("smartfile"); -var fs = require("fs-extra"); -beautylog.info("installing letsencrypt.sh locally..."); -fs.ensureDir(path.join(__dirname, "assets/")); -smartfile.remote.toFs("https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh", path.join(__dirname, "assets/", "le.sh")).then(function () { - beautylog.success("Done!"); -}); +var plugins = require("./cert.plugins"); +var paths = require("./cert.paths"); +exports.startInstall = function () { + var done = plugins.q.defer(); + plugins.beautylog.info("installing letsencrypt.sh locally..."); + plugins.fs.ensureDir(plugins.path.join(__dirname, "assets/")); + plugins.smartfile.remote.toFs("https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh", paths.letsencryptSh).then(function () { + plugins.beautylog.success("Done!"); + done.resolve(); + }); + return done.promise; +}; +var smartcli = new plugins.smartcli.Smartcli(); +smartcli.addCommand({ + commandName: "install" +}).then(exports.startInstall); +smartcli.startParse(); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLElBQVksU0FBUyxXQUFNLFdBQVcsQ0FBQyxDQUFBO0FBQ3ZDLElBQVksSUFBSSxXQUFNLE1BQU0sQ0FBQyxDQUFBO0FBQzdCLElBQVksU0FBUyxXQUFNLFdBQVcsQ0FBQyxDQUFBO0FBQ3ZDLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUM3QixTQUFTLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7QUFFdkQsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzdDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNqQixrRkFBa0YsRUFDbEYsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsU0FBUyxFQUFDLE9BQU8sQ0FBQyxDQUN6QyxDQUFDLElBQUksQ0FBQztJQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDLENBQUMiLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGJlYXV0eWxvZyBmcm9tIFwiYmVhdXR5bG9nXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBzbWFydGZpbGUgZnJvbSBcInNtYXJ0ZmlsZVwiO1xubGV0IGZzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuYmVhdXR5bG9nLmluZm8oXCJpbnN0YWxsaW5nIGxldHNlbmNyeXB0LnNoIGxvY2FsbHkuLi5cIik7XG5cbmZzLmVuc3VyZURpcihwYXRoLmpvaW4oX19kaXJuYW1lLFwiYXNzZXRzL1wiKSk7XG5zbWFydGZpbGUucmVtb3RlLnRvRnMoXG4gICAgXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbHVrYXMyNTExL2xldHNlbmNyeXB0LnNoL21hc3Rlci9sZXRzZW5jcnlwdC5zaFwiLFxuICAgIHBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvXCIsXCJsZS5zaFwiKVxuKS50aGVuKCgpID0+IHtcbiAgICBiZWF1dHlsb2cuc3VjY2VzcyhcIkRvbmUhXCIpO1xufSk7Il19 +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLElBQVksT0FBTyxXQUFNLGdCQUFnQixDQUFDLENBQUE7QUFDMUMsSUFBWSxLQUFLLFdBQU0sY0FBYyxDQUFDLENBQUE7QUFFM0Isb0JBQVksR0FBRztJQUN0QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFL0QsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixrRkFBa0YsRUFDbEYsS0FBSyxDQUFDLGFBQWEsQ0FDdEIsQ0FBQyxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUM7QUFFRixJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0MsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUMsU0FBUztDQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFZLENBQUMsQ0FBQztBQUN0QixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMiLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmV4cG9ydCBsZXQgc3RhcnRJbnN0YWxsID0gKCkgPT4ge1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgcGx1Z2lucy5iZWF1dHlsb2cuaW5mbyhcImluc3RhbGxpbmcgbGV0c2VuY3J5cHQuc2ggbG9jYWxseS4uLlwiKTtcblxuICAgIHBsdWdpbnMuZnMuZW5zdXJlRGlyKHBsdWdpbnMucGF0aC5qb2luKF9fZGlybmFtZSwgXCJhc3NldHMvXCIpKTtcbiAgICBwbHVnaW5zLnNtYXJ0ZmlsZS5yZW1vdGUudG9GcyhcbiAgICAgICAgXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbHVrYXMyNTExL2xldHNlbmNyeXB0LnNoL21hc3Rlci9sZXRzZW5jcnlwdC5zaFwiLFxuICAgICAgICBwYXRocy5sZXRzZW5jcnlwdFNoXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgcGx1Z2lucy5iZWF1dHlsb2cuc3VjY2VzcyhcIkRvbmUhXCIpO1xuICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxubGV0IHNtYXJ0Y2xpID0gbmV3IHBsdWdpbnMuc21hcnRjbGkuU21hcnRjbGkoKTtcbnNtYXJ0Y2xpLmFkZENvbW1hbmQoe1xuICAgIGNvbW1hbmROYW1lOlwiaW5zdGFsbFwiXG59KS50aGVuKHN0YXJ0SW5zdGFsbCk7XG5zbWFydGNsaS5zdGFydFBhcnNlKCk7Il19 diff --git a/package.json b/package.json index 541e4eb..5d1466d 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "name": "cert", - "version": "0.0.6", + "version": "0.0.8", "description": "Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.", "main": "dist/index.js", "scripts": { "test": "(npmts)", - "install": "node dist/install.js" + "install": "node dist/install.js install" }, "repository": { "type": "git", @@ -25,14 +25,15 @@ "homepage": "https://gitlab.com/pushrocks/cert#readme", "dependencies": { "beautylog": "^5.0.12", - "cflare": "0.0.6", + "cflare": "0.0.7", "fs-extra": "^0.30.0", "letsencrypt": "^1.4.4", "q": "^1.4.1", - "smartcli": "^1.0.2", + "shelljs": "^0.7.0", + "smartcli": "^1.0.4", "smartfile": "^3.0.10", "smartgit": "0.0.10", - "smartstring": "^2.0.9", + "smartstring": "^2.0.10", "typings-global": "^1.0.3" }, "devDependencies": { diff --git a/test/test.js b/test/test.js index e16d176..a1377ef 100644 --- a/test/test.js +++ b/test/test.js @@ -2,6 +2,35 @@ require("typings-test"); require("should"); var qenv_1 = require("qenv"); +var install_1 = require("../dist/install"); +var cert = require("../dist/index"); var testQenv = new qenv_1.Qenv(process.cwd(), process.cwd() + "/.nogit"); +var testCert; +describe("cert", function () { + describe("install", function () { + it("should download letsencrypt.sh", function (done) { + this.timeout(5000); + install_1.startInstall().then(function () { + done(); + }); + }); + }); + describe("Cert", function () { + it("should create a new cert", function () { + testCert = new cert.Cert({ + cfEmail: process.env.CF_EMAIL, + cfKey: process.env.CF_KEY, + sslDir: "" + }); + testCert.should.be.instanceof(cert.Cert); + }); + it("should get a valid certificate", function (done) { + this.timeout(120000); + testCert.getDomainCert("sub2.bleu.de").then(function () { + done(); + }); + }); + }); +}); -//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUVoQixxQkFBbUIsTUFBTSxDQUFDLENBQUE7QUFFMUIsSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy10ZXN0XCI7XG5pbXBvcnQgXCJzaG91bGRcIjtcbmltcG9ydCAqIGFzIGNlcnQgZnJvbSBcIi4uL2Rpc3QvaW5kZXhcIjtcbmltcG9ydCB7UWVudn0gZnJvbSBcInFlbnZcIjtcblxubGV0IHRlc3RRZW52ID0gbmV3IFFlbnYocHJvY2Vzcy5jd2QoKSwgcHJvY2Vzcy5jd2QoKSArIFwiLy5ub2dpdFwiKTsiXX0= +//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQixxQkFBbUIsTUFBTSxDQUFDLENBQUE7QUFFMUIsd0JBQTJCLGlCQUFpQixDQUFDLENBQUE7QUFDN0MsSUFBWSxJQUFJLFdBQU0sZUFBZSxDQUFDLENBQUE7QUFHdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUVsRSxJQUFJLFFBQWtCLENBQUM7QUFFdkIsUUFBUSxDQUFDLE1BQU0sRUFBQztJQUNaLFFBQVEsQ0FBQyxTQUFTLEVBQUM7UUFDZixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsc0JBQVksRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDBCQUEwQixFQUFDO1lBQzFCLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ3pCLE1BQU0sRUFBRSxFQUFFO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBQyxVQUFTLElBQUk7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDeEMsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy10ZXN0XCI7XG5pbXBvcnQgXCJzaG91bGRcIjtcbmltcG9ydCB7UWVudn0gZnJvbSBcInFlbnZcIjtcblxuaW1wb3J0IHtzdGFydEluc3RhbGx9IGZyb20gXCIuLi9kaXN0L2luc3RhbGxcIjtcbmltcG9ydCAqIGFzIGNlcnQgZnJvbSBcIi4uL2Rpc3QvaW5kZXhcIjtcblxuXG5sZXQgdGVzdFFlbnYgPSBuZXcgUWVudihwcm9jZXNzLmN3ZCgpLCBwcm9jZXNzLmN3ZCgpICsgXCIvLm5vZ2l0XCIpO1xuXG5sZXQgdGVzdENlcnQ6Y2VydC5DZXJ0O1xuXG5kZXNjcmliZShcImNlcnRcIixmdW5jdGlvbigpe1xuICAgIGRlc2NyaWJlKFwiaW5zdGFsbFwiLGZ1bmN0aW9uKCl7XG4gICAgICAgIGl0KFwic2hvdWxkIGRvd25sb2FkIGxldHNlbmNyeXB0LnNoXCIsZnVuY3Rpb24oZG9uZSl7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQoNTAwMCk7XG4gICAgICAgICAgICBzdGFydEluc3RhbGwoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgZGVzY3JpYmUoXCJDZXJ0XCIsZnVuY3Rpb24oKXtcbiAgICAgICAgaXQoXCJzaG91bGQgY3JlYXRlIGEgbmV3IGNlcnRcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGVzdENlcnQgPSBuZXcgY2VydC5DZXJ0KHtcbiAgICAgICAgICAgICAgICBjZkVtYWlsOiBwcm9jZXNzLmVudi5DRl9FTUFJTCxcbiAgICAgICAgICAgICAgICBjZktleTogcHJvY2Vzcy5lbnYuQ0ZfS0VZLFxuICAgICAgICAgICAgICAgIHNzbERpcjogXCJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5zaG91bGQuYmUuaW5zdGFuY2VvZihjZXJ0LkNlcnQpO1xuICAgICAgICB9KVxuICAgICAgICBpdChcInNob3VsZCBnZXQgYSB2YWxpZCBjZXJ0aWZpY2F0ZVwiLGZ1bmN0aW9uKGRvbmUpe1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0KDEyMDAwMCk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5nZXREb21haW5DZXJ0KFwic3ViMi5ibGV1LmRlXCIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH0pXG59KTsiXX0= diff --git a/test/test.ts b/test/test.ts index 8de9922..afc33ca 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1,7 +1,38 @@ import "typings-test"; import "should"; -import * as cert from "../dist/index"; import {Qenv} from "qenv"; +import {startInstall} from "../dist/install"; +import * as cert from "../dist/index"; + + let testQenv = new Qenv(process.cwd(), process.cwd() + "/.nogit"); +let testCert:cert.Cert; + +describe("cert",function(){ + describe("install",function(){ + it("should download letsencrypt.sh",function(done){ + this.timeout(5000); + startInstall().then(() => { + done(); + }) + }) + }) + describe("Cert",function(){ + it("should create a new cert",function(){ + testCert = new cert.Cert({ + cfEmail: process.env.CF_EMAIL, + cfKey: process.env.CF_KEY, + sslDir: "" + }); + testCert.should.be.instanceof(cert.Cert); + }) + it("should get a valid certificate",function(done){ + this.timeout(120000); + testCert.getDomainCert("sub2.bleu.de").then(() => { + done(); + }); + }) + }) +}); \ No newline at end of file diff --git a/ts/cert.hook.ts b/ts/cert.hook.ts index 333cdb9..d6b1056 100644 --- a/ts/cert.hook.ts +++ b/ts/cert.hook.ts @@ -1,3 +1,58 @@ -import * as smartcli from "smartcli"; -import * as cflare from "cflare"; +#!/usr/bin/env node +// the shebang line above makes sure this script will get interpreted by node +import "typings-global"; +import * as plugins from "./cert.plugins"; +import * as paths from "./cert.paths"; + +let smartcli = new plugins.smartcli.Smartcli(); + +let config = plugins.smartfile.local.toObjectSync(paths.config); +let cflare = new plugins.cflare.CflareAccount(); +cflare.auth({ + email: config.cfEmail, + key: config.cfKey +}); + +let setChallenge = (domainNameArg: string, challengeArg: string) => { + let done = plugins.q.defer(); + cflare.createRecord(prefixName(domainNameArg), "TXT", challengeArg).then(() => { + cooldown().then(() => { + done.resolve(); + }); + }); + return done.promise; +} + +let cleanChallenge = (domainNameArg) => { + let done = plugins.q.defer(); + cflare.removeRecord(prefixName(domainNameArg), "TXT"); + return done.promise; +} + +let cooldown = () => { + let done = plugins.q.defer(); + console.log("Cooling down!"); + setTimeout(() => { + done.resolve(); + }, 20000) + return done.promise; +} + +let prefixName = (domainNameArg: string): string => { + return "_acme-challenge." + domainNameArg; +} + +smartcli.addCommand({ + commandName: "deploy_challenge" +}).then((argv) => { + setChallenge(argv._[1], argv._[3]); +}); + +smartcli.addCommand({ + commandName: "clean_challenge" +}).then((argv) => { + cleanChallenge(argv._[1]); +}); + +smartcli.startParse(); diff --git a/ts/cert.paths.ts b/ts/cert.paths.ts index 68d0fa0..1f5ac2c 100644 --- a/ts/cert.paths.ts +++ b/ts/cert.paths.ts @@ -1,3 +1,7 @@ import "typings-global"; -export import path = require("path"); +import * as plugins from "./cert.plugins"; +export let certHook = plugins.path.join(__dirname,"cert.hook.js"); +export let config = plugins.path.join(__dirname,"assets/config.json"); +export let letsencryptSh = plugins.path.join(__dirname,"assets/letsencrypt.sh"); +export let sslDir = plugins.path.join(__dirname,"/assets/certs"); \ No newline at end of file diff --git a/ts/cert.plugins.ts b/ts/cert.plugins.ts index 253e3b3..03bbe3e 100644 --- a/ts/cert.plugins.ts +++ b/ts/cert.plugins.ts @@ -1,6 +1,11 @@ import "typings-global"; +export import beautylog = require("beautylog"); +export import cflare = require("cflare"); +export let fs = require("fs-extra"); export import path = require("path"); export let q = require("q"); +export let shelljs = require("shelljs"); +export import smartcli = require("smartcli"); export import smartfile = require("smartfile"); export import smartstring = require("smartstring"); diff --git a/ts/index.ts b/ts/index.ts index 0c9a7b1..d75b021 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -1,3 +1,4 @@ +import * as plugins from "./cert.plugins"; import * as paths from "./cert.paths"; export class Cert { @@ -17,8 +18,20 @@ export class Cert { this.cfKey = optionsArg.cfKey; this.sslDir = optionsArg.sslDir; this.gitOriginRepo = optionsArg.gitOriginRepo; + let config = { + cfEmail: this.cfEmail, + cfKey: this.cfKey + } + plugins.smartfile.memory.toFsSync(JSON.stringify(config),{fileName:"config.json",filePath:plugins.path.join(__dirname,"assets/")}); + }; + getDomainCert(domainNameArg:string){ + let done = plugins.q.defer(); + plugins.shelljs.exec("chmod 700 " + paths.letsencryptSh); + plugins.shelljs.exec("chmod 700 " + paths.certHook); + plugins.shelljs.exec("bash -c \"" + paths.letsencryptSh + " -c -d " + domainNameArg + " -t dns-01 -k " + paths.certHook + " -o "+ paths.sslDir + "\""); + done.resolve(); + return done.promise; }; - getDomainCert(){}; } export class Certificate { diff --git a/ts/install.ts b/ts/install.ts index 81a06a5..a06ca40 100644 --- a/ts/install.ts +++ b/ts/install.ts @@ -1,13 +1,23 @@ -import * as beautylog from "beautylog"; -import * as path from "path"; -import * as smartfile from "smartfile"; -let fs = require("fs-extra"); -beautylog.info("installing letsencrypt.sh locally..."); +import * as plugins from "./cert.plugins"; +import * as paths from "./cert.paths"; -fs.ensureDir(path.join(__dirname,"assets/")); -smartfile.remote.toFs( - "https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh", - path.join(__dirname,"assets/","le.sh") -).then(() => { - beautylog.success("Done!"); -}); \ No newline at end of file +export let startInstall = () => { + let done = plugins.q.defer(); + plugins.beautylog.info("installing letsencrypt.sh locally..."); + + plugins.fs.ensureDir(plugins.path.join(__dirname, "assets/")); + plugins.smartfile.remote.toFs( + "https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh", + paths.letsencryptSh + ).then(() => { + plugins.beautylog.success("Done!"); + done.resolve(); + }); + return done.promise; +}; + +let smartcli = new plugins.smartcli.Smartcli(); +smartcli.addCommand({ + commandName:"install" +}).then(startInstall); +smartcli.startParse(); \ No newline at end of file