Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
e9135c42af | |||
a850243c59 | |||
8dc75feb8d | |||
ac7160c3a3 | |||
1cdcd332d4 | |||
5e10df8e5a | |||
e67677d57d | |||
d5b5e8d612 | |||
bbee7923e4 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
|||||||
node_modules
|
node_modules
|
||||||
docs/
|
docs/
|
||||||
coverage/
|
coverage/
|
||||||
|
.nogit/
|
||||||
|
dist/assets/
|
@ -1,29 +1,26 @@
|
|||||||
image: hosttoday/ht-docker-node:npmts
|
image: hosttoday/ht-docker-node:npmts
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- test
|
- test1
|
||||||
|
- test2
|
||||||
- release
|
- release
|
||||||
|
|
||||||
testLEGACY:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci test legacy
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- lossless
|
|
||||||
|
|
||||||
testLTS:
|
testLTS:
|
||||||
stage: test
|
stage: test1
|
||||||
script:
|
script:
|
||||||
- npmci test lts
|
- npmci test lts
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- docker
|
||||||
- lossless
|
- lossless
|
||||||
|
|
||||||
testSTABLE:
|
testSTABLE:
|
||||||
stage: test
|
stage: test2
|
||||||
script:
|
script:
|
||||||
- npmci test stable
|
- npmci test stable
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- docker
|
||||||
- lossless
|
- lossless
|
||||||
|
19
README.md
19
README.md
@ -7,10 +7,23 @@ Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeS
|
|||||||
import {Cert} from "cert";
|
import {Cert} from "cert";
|
||||||
|
|
||||||
let myCert = new Cert({
|
let myCert = new Cert({
|
||||||
cfEmail = "some@cloudflare.email",
|
cfEmail: "some@cloudflare.email",
|
||||||
cfKey = "someCloudflareApiKey",
|
cfKey: "someCloudflareApiKey",
|
||||||
outputPath = "someOutputPath" // NOTE: if you already have certificates, make sure you put them in here, so cert only requires the missing ones
|
sslDir: "someOutputPath", // NOTE: if you already have certificates, make sure you put them in here, so cert only requires the missing ones
|
||||||
|
gitOriginRepo: "git@githhub.com/someuser/somereopo" // good for persistence in highly volatile environments like docker
|
||||||
});
|
});
|
||||||
|
|
||||||
myCert.getDomainCert("example.com");
|
myCert.getDomainCert("example.com");
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### sslDir
|
||||||
|
to use the certificates it is important to understand what the structure of the ssl directory looks like.
|
||||||
|
|
||||||
|
### using a git origin repo.
|
||||||
|
Often times you want to keep track of certificates in order to keep them
|
||||||
|
even if the point of initial certificate request is gone. Imagine you have a dockerenvironement
|
||||||
|
and you keep starting new container versions for the same domain. YOu ideally want to use a proxy
|
||||||
|
that handles SSL managemet for you. But even the proxy needs to be updated from time to time.
|
||||||
|
|
||||||
|
So you need some kind of persistence between versions. This is why you can sync up all certificates to a git repo over ssh
|
||||||
|
Just make sure your id_rsa is in place for the node user and is allowed for the origin repo.
|
1
dist/cert.hook.d.ts
vendored
1
dist/cert.hook.d.ts
vendored
@ -0,0 +1 @@
|
|||||||
|
import "typings-global";
|
||||||
|
50
dist/cert.hook.js
vendored
Normal file → Executable file
50
dist/cert.hook.js
vendored
Normal file → Executable file
@ -1,3 +1,51 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
"use strict";
|
"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==
|
||||||
|
5
dist/cert.paths.d.ts
vendored
5
dist/cert.paths.d.ts
vendored
@ -0,0 +1,5 @@
|
|||||||
|
import "typings-global";
|
||||||
|
export declare let certHook: string;
|
||||||
|
export declare let config: string;
|
||||||
|
export declare let letsencryptSh: string;
|
||||||
|
export declare let sslDir: string;
|
||||||
|
10
dist/cert.paths.js
vendored
10
dist/cert.paths.js
vendored
@ -1,3 +1,9 @@
|
|||||||
|
"use strict";
|
||||||
|
require("typings-global");
|
||||||
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGF0aHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQWdCLENBQUMsQ0FBQTtBQUN4QixJQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBRS9CLGdCQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3ZELGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUMzRCxxQkFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3JFLGNBQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsZUFBZSxDQUFDLENBQUMiLCJmaWxlIjoiY2VydC5wYXRocy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5pbXBvcnQgKiBhcyBwbHVnaW5zIGZyb20gXCIuL2NlcnQucGx1Z2luc1wiO1xuXG5leHBvcnQgbGV0IGNlcnRIb29rID0gcGx1Z2lucy5wYXRoLmpvaW4oX19kaXJuYW1lLFwiY2VydC5ob29rLmpzXCIpO1xuZXhwb3J0IGxldCBjb25maWcgPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvY29uZmlnLmpzb25cIik7XG5leHBvcnQgbGV0IGxldHNlbmNyeXB0U2ggPSBwbHVnaW5zLnBhdGguam9pbihfX2Rpcm5hbWUsXCJhc3NldHMvbGV0c2VuY3J5cHQuc2hcIik7XG5leHBvcnQgbGV0IHNzbERpciA9IHBsdWdpbnMucGF0aC5qb2luKF9fZGlybmFtZSxcIi9hc3NldHMvY2VydHNcIik7Il19
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJjZXJ0LnBhdGhzLmpzIiwic291cmNlc0NvbnRlbnQiOltdfQ==
|
|
||||||
|
10
dist/cert.plugins.d.ts
vendored
Normal file
10
dist/cert.plugins.d.ts
vendored
Normal file
@ -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");
|
13
dist/cert.plugins.js
vendored
Normal file
13
dist/cert.plugins.js
vendored
Normal file
@ -0,0 +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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNlcnQucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ1YsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxjQUFNLFdBQVcsUUFBUSxDQUFDLENBQUM7QUFDOUIsVUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QixZQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDMUIsU0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQixlQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzFCLGdCQUFRLFdBQVcsVUFBVSxDQUFDLENBQUM7QUFDL0IsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxtQkFBVyxXQUFXLGFBQWEsQ0FBQyxDQUFDIiwiZmlsZSI6ImNlcnQucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5leHBvcnQgaW1wb3J0IGJlYXV0eWxvZyA9IHJlcXVpcmUoXCJiZWF1dHlsb2dcIik7XG5leHBvcnQgaW1wb3J0IGNmbGFyZSA9IHJlcXVpcmUoXCJjZmxhcmVcIik7XG5leHBvcnQgbGV0IGZzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuZXhwb3J0IGltcG9ydCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5leHBvcnQgbGV0IHEgPSByZXF1aXJlKFwicVwiKTtcbmV4cG9ydCBsZXQgc2hlbGxqcyA9IHJlcXVpcmUoXCJzaGVsbGpzXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydGNsaSA9IHJlcXVpcmUoXCJzbWFydGNsaVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRmaWxlID0gcmVxdWlyZShcInNtYXJ0ZmlsZVwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRzdHJpbmcgPSByZXF1aXJlKFwic21hcnRzdHJpbmdcIik7XG5cbiJdfQ==
|
21
dist/index.d.ts
vendored
21
dist/index.d.ts
vendored
@ -0,0 +1,21 @@
|
|||||||
|
export declare class Cert {
|
||||||
|
cfEmail: string;
|
||||||
|
cfKey: string;
|
||||||
|
sslDir: string;
|
||||||
|
certificatesPresent: any;
|
||||||
|
certificatesValid: any;
|
||||||
|
gitOriginRepo: any;
|
||||||
|
constructor(optionsArg: {
|
||||||
|
cfEmail: string;
|
||||||
|
cfKey: string;
|
||||||
|
sslDir: string;
|
||||||
|
gitOriginRepo?: string;
|
||||||
|
});
|
||||||
|
getDomainCert(domainNameArg: string): any;
|
||||||
|
}
|
||||||
|
export declare class Certificate {
|
||||||
|
domainName: string;
|
||||||
|
creationDate: Date;
|
||||||
|
expiryDate: Date;
|
||||||
|
constructor();
|
||||||
|
}
|
||||||
|
37
dist/index.js
vendored
37
dist/index.js
vendored
@ -1,3 +1,36 @@
|
|||||||
|
"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 (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;
|
||||||
|
}());
|
||||||
|
exports.Cert = Cert;
|
||||||
|
var Certificate = (function () {
|
||||||
|
function Certificate() {
|
||||||
|
}
|
||||||
|
;
|
||||||
|
return Certificate;
|
||||||
|
}());
|
||||||
|
exports.Certificate = Certificate;
|
||||||
|
|
||||||
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxJQUFZLE9BQU8sV0FBTSxnQkFBZ0IsQ0FBQyxDQUFBO0FBQzFDLElBQVksS0FBSyxXQUFNLGNBQWMsQ0FBQyxDQUFBO0FBRXRDO0lBT0ksY0FBWSxVQUtYO1FBQ0csSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUM5QixJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDaEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzlDLElBQUksTUFBTSxHQUFHO1lBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztTQUNwQixDQUFBO1FBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUMsRUFBQyxRQUFRLEVBQUMsYUFBYSxFQUFDLFFBQVEsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ3ZJLENBQUM7O0lBQ0QsNEJBQWEsR0FBYixVQUFjLGFBQW9CO1FBQzlCLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxHQUFHLFNBQVMsR0FBRyxhQUFhLEdBQUcsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLFFBQVEsR0FBRyxNQUFNLEdBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN2SixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN4QixDQUFDOztJQUNMLFdBQUM7QUFBRCxDQTlCQSxBQThCQyxJQUFBO0FBOUJZLFlBQUksT0E4QmhCLENBQUE7QUFFRDtJQUlJO0lBRUEsQ0FBQzs7SUFDTCxrQkFBQztBQUFELENBUEEsQUFPQyxJQUFBO0FBUFksbUJBQVcsY0FPdkIsQ0FBQSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmV4cG9ydCBjbGFzcyBDZXJ0IHtcbiAgICBjZkVtYWlsOnN0cmluZztcbiAgICBjZktleTpzdHJpbmc7XG4gICAgc3NsRGlyOnN0cmluZztcbiAgICBjZXJ0aWZpY2F0ZXNQcmVzZW50O1xuICAgIGNlcnRpZmljYXRlc1ZhbGlkO1xuICAgIGdpdE9yaWdpblJlcG87XG4gICAgY29uc3RydWN0b3Iob3B0aW9uc0FyZzp7XG4gICAgICAgIGNmRW1haWw6c3RyaW5nLFxuICAgICAgICBjZktleTpzdHJpbmcsXG4gICAgICAgIHNzbERpcjpzdHJpbmcsXG4gICAgICAgIGdpdE9yaWdpblJlcG8/OnN0cmluZ1xuICAgIH0pe1xuICAgICAgICB0aGlzLmNmRW1haWwgPSBvcHRpb25zQXJnLmNmRW1haWw7XG4gICAgICAgIHRoaXMuY2ZLZXkgPSBvcHRpb25zQXJnLmNmS2V5O1xuICAgICAgICB0aGlzLnNzbERpciA9IG9wdGlvbnNBcmcuc3NsRGlyO1xuICAgICAgICB0aGlzLmdpdE9yaWdpblJlcG8gPSBvcHRpb25zQXJnLmdpdE9yaWdpblJlcG87XG4gICAgICAgIGxldCBjb25maWcgPSB7XG4gICAgICAgICAgICBjZkVtYWlsOiB0aGlzLmNmRW1haWwsXG4gICAgICAgICAgICBjZktleTogdGhpcy5jZktleVxuICAgICAgICB9XG4gICAgICAgIHBsdWdpbnMuc21hcnRmaWxlLm1lbW9yeS50b0ZzU3luYyhKU09OLnN0cmluZ2lmeShjb25maWcpLHtmaWxlTmFtZTpcImNvbmZpZy5qc29uXCIsZmlsZVBhdGg6cGx1Z2lucy5wYXRoLmpvaW4oX19kaXJuYW1lLFwiYXNzZXRzL1wiKX0pO1xuICAgIH07XG4gICAgZ2V0RG9tYWluQ2VydChkb21haW5OYW1lQXJnOnN0cmluZyl7XG4gICAgICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiY2htb2QgNzAwIFwiICsgcGF0aHMubGV0c2VuY3J5cHRTaCk7XG4gICAgICAgIHBsdWdpbnMuc2hlbGxqcy5leGVjKFwiY2htb2QgNzAwIFwiICsgcGF0aHMuY2VydEhvb2spO1xuICAgICAgICBwbHVnaW5zLnNoZWxsanMuZXhlYyhcImJhc2ggLWMgXFxcIlwiICsgcGF0aHMubGV0c2VuY3J5cHRTaCArIFwiIC1jIC1kIFwiICsgZG9tYWluTmFtZUFyZyArIFwiIC10IGRucy0wMSAtayBcIiArIHBhdGhzLmNlcnRIb29rICsgXCIgLW8gXCIrIHBhdGhzLnNzbERpciArIFwiXFxcIlwiKTtcbiAgICAgICAgcmV0dXJuIGRvbmUucHJvbWlzZTtcbiAgICB9O1xufVxuXG5leHBvcnQgY2xhc3MgQ2VydGlmaWNhdGUge1xuICAgIGRvbWFpbk5hbWU6c3RyaW5nO1xuICAgIGNyZWF0aW9uRGF0ZTpEYXRlO1xuICAgIGV4cGlyeURhdGU6RGF0ZTtcbiAgICBjb25zdHJ1Y3Rvcigpe1xuXG4gICAgfTtcbn0iXX0=
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbXX0=
|
|
||||||
|
1
dist/install.d.ts
vendored
1
dist/install.d.ts
vendored
@ -0,0 +1 @@
|
|||||||
|
export declare let startInstall: () => any;
|
||||||
|
26
dist/install.js
vendored
26
dist/install.js
vendored
@ -1,10 +1,20 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
var beautylog = require("beautylog");
|
var plugins = require("./cert.plugins");
|
||||||
var path = require("path");
|
var paths = require("./cert.paths");
|
||||||
var smartfile = require("smartfile");
|
exports.startInstall = function () {
|
||||||
beautylog.info("installing letsencrypt.sh locally...");
|
var done = plugins.q.defer();
|
||||||
smartfile.remote.toFs("https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh", path.join(__dirname, "assets/", "le.sh")).then(function () {
|
plugins.beautylog.info("installing letsencrypt.sh locally...");
|
||||||
beautylog.success("Done!");
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLElBQVksU0FBUyxXQUFNLFdBQVcsQ0FBQyxDQUFBO0FBQ3ZDLElBQVksSUFBSSxXQUFNLE1BQU0sQ0FBQyxDQUFBO0FBQzdCLElBQVksU0FBUyxXQUFNLFdBQVcsQ0FBQyxDQUFBO0FBQ3ZDLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUN2RCxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDakIsa0ZBQWtGLEVBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLFNBQVMsRUFBQyxPQUFPLENBQUMsQ0FDekMsQ0FBQyxJQUFJLENBQUM7SUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6Imluc3RhbGwuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiZWF1dHlsb2cgZnJvbSBcImJlYXV0eWxvZ1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgc21hcnRmaWxlIGZyb20gXCJzbWFydGZpbGVcIjtcbmJlYXV0eWxvZy5pbmZvKFwiaW5zdGFsbGluZyBsZXRzZW5jcnlwdC5zaCBsb2NhbGx5Li4uXCIpO1xuc21hcnRmaWxlLnJlbW90ZS50b0ZzKFxuICAgIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2x1a2FzMjUxMS9sZXRzZW5jcnlwdC5zaC9tYXN0ZXIvbGV0c2VuY3J5cHQuc2hcIixcbiAgICBwYXRoLmpvaW4oX19kaXJuYW1lLFwiYXNzZXRzL1wiLFwibGUuc2hcIilcbikudGhlbigoKSA9PiB7XG4gICAgYmVhdXR5bG9nLnN1Y2Nlc3MoXCJEb25lIVwiKTtcbn0pOyJdfQ==
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLElBQVksT0FBTyxXQUFNLGdCQUFnQixDQUFDLENBQUE7QUFDMUMsSUFBWSxLQUFLLFdBQU0sY0FBYyxDQUFDLENBQUE7QUFFM0Isb0JBQVksR0FBRztJQUN0QixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFL0QsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDOUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN6QixrRkFBa0YsRUFDbEYsS0FBSyxDQUFDLGFBQWEsQ0FDdEIsQ0FBQyxJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUN4QixDQUFDLENBQUM7QUFFRixJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0MsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUNoQixXQUFXLEVBQUMsU0FBUztDQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFZLENBQUMsQ0FBQztBQUN0QixRQUFRLENBQUMsVUFBVSxFQUFFLENBQUMiLCJmaWxlIjoiaW5zdGFsbC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vY2VydC5wbHVnaW5zXCI7XG5pbXBvcnQgKiBhcyBwYXRocyBmcm9tIFwiLi9jZXJ0LnBhdGhzXCI7XG5cbmV4cG9ydCBsZXQgc3RhcnRJbnN0YWxsID0gKCkgPT4ge1xuICAgIGxldCBkb25lID0gcGx1Z2lucy5xLmRlZmVyKCk7XG4gICAgcGx1Z2lucy5iZWF1dHlsb2cuaW5mbyhcImluc3RhbGxpbmcgbGV0c2VuY3J5cHQuc2ggbG9jYWxseS4uLlwiKTtcblxuICAgIHBsdWdpbnMuZnMuZW5zdXJlRGlyKHBsdWdpbnMucGF0aC5qb2luKF9fZGlybmFtZSwgXCJhc3NldHMvXCIpKTtcbiAgICBwbHVnaW5zLnNtYXJ0ZmlsZS5yZW1vdGUudG9GcyhcbiAgICAgICAgXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbHVrYXMyNTExL2xldHNlbmNyeXB0LnNoL21hc3Rlci9sZXRzZW5jcnlwdC5zaFwiLFxuICAgICAgICBwYXRocy5sZXRzZW5jcnlwdFNoXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgcGx1Z2lucy5iZWF1dHlsb2cuc3VjY2VzcyhcIkRvbmUhXCIpO1xuICAgICAgICBkb25lLnJlc29sdmUoKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xufTtcblxubGV0IHNtYXJ0Y2xpID0gbmV3IHBsdWdpbnMuc21hcnRjbGkuU21hcnRjbGkoKTtcbnNtYXJ0Y2xpLmFkZENvbW1hbmQoe1xuICAgIGNvbW1hbmROYW1lOlwiaW5zdGFsbFwiXG59KS50aGVuKHN0YXJ0SW5zdGFsbCk7XG5zbWFydGNsaS5zdGFydFBhcnNlKCk7Il19
|
||||||
|
22
package.json
22
package.json
@ -1,10 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "cert",
|
"name": "cert",
|
||||||
"version": "0.0.5",
|
"version": "0.0.9",
|
||||||
"description": "Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.",
|
"description": "Easily obain SSL certificates from LetsEncrypt. Supports DNS-01 challenge. TypeScript ready.",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npmts)"
|
"test": "(npmts)",
|
||||||
|
"install": "node dist/install.js install"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -24,12 +25,21 @@
|
|||||||
"homepage": "https://gitlab.com/pushrocks/cert#readme",
|
"homepage": "https://gitlab.com/pushrocks/cert#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"beautylog": "^5.0.12",
|
"beautylog": "^5.0.12",
|
||||||
"cflare": "0.0.2",
|
"cflare": "0.0.7",
|
||||||
|
"fs-extra": "^0.30.0",
|
||||||
"letsencrypt": "^1.4.4",
|
"letsencrypt": "^1.4.4",
|
||||||
"smartcli": "^1.0.2",
|
"q": "^1.4.1",
|
||||||
"smartfile": "^3.0.10"
|
"shelljs": "^0.7.0",
|
||||||
|
"smartcli": "^1.0.4",
|
||||||
|
"smartfile": "^3.0.10",
|
||||||
|
"smartgit": "0.0.10",
|
||||||
|
"smartstring": "^2.0.10",
|
||||||
|
"typings-global": "^1.0.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"npmts-g": "^5.2.6"
|
"npmts-g": "^5.2.6",
|
||||||
|
"qenv": "^1.0.8",
|
||||||
|
"should": "^9.0.2",
|
||||||
|
"typings-test": "^1.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
test/test.d.ts
vendored
Normal file
2
test/test.d.ts
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
import "typings-test";
|
||||||
|
import "should";
|
36
test/test.js
Normal file
36
test/test.js
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
"use strict";
|
||||||
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQixxQkFBbUIsTUFBTSxDQUFDLENBQUE7QUFFMUIsd0JBQTJCLGlCQUFpQixDQUFDLENBQUE7QUFDN0MsSUFBWSxJQUFJLFdBQU0sZUFBZSxDQUFDLENBQUE7QUFHdEMsSUFBSSxRQUFRLEdBQUcsSUFBSSxXQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUMsQ0FBQztBQUVsRSxJQUFJLFFBQWtCLENBQUM7QUFFdkIsUUFBUSxDQUFDLE1BQU0sRUFBQztJQUNaLFFBQVEsQ0FBQyxTQUFTLEVBQUM7UUFDZixFQUFFLENBQUMsZ0NBQWdDLEVBQUMsVUFBUyxJQUFJO1lBQzdDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsc0JBQVksRUFBRSxDQUFDLElBQUksQ0FBQztnQkFDaEIsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7SUFDRixRQUFRLENBQUMsTUFBTSxFQUFDO1FBQ1osRUFBRSxDQUFDLDBCQUEwQixFQUFDO1lBQzFCLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ3JCLE9BQU8sRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQzdCLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU07Z0JBQ3pCLE1BQU0sRUFBRSxFQUFFO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQTtRQUNGLEVBQUUsQ0FBQyxnQ0FBZ0MsRUFBQyxVQUFTLElBQUk7WUFDN0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNyQixRQUFRLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDeEMsSUFBSSxFQUFFLENBQUM7WUFDWCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUMsQ0FBQyIsImZpbGUiOiJ0ZXN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy10ZXN0XCI7XG5pbXBvcnQgXCJzaG91bGRcIjtcbmltcG9ydCB7UWVudn0gZnJvbSBcInFlbnZcIjtcblxuaW1wb3J0IHtzdGFydEluc3RhbGx9IGZyb20gXCIuLi9kaXN0L2luc3RhbGxcIjtcbmltcG9ydCAqIGFzIGNlcnQgZnJvbSBcIi4uL2Rpc3QvaW5kZXhcIjtcblxuXG5sZXQgdGVzdFFlbnYgPSBuZXcgUWVudihwcm9jZXNzLmN3ZCgpLCBwcm9jZXNzLmN3ZCgpICsgXCIvLm5vZ2l0XCIpO1xuXG5sZXQgdGVzdENlcnQ6Y2VydC5DZXJ0O1xuXG5kZXNjcmliZShcImNlcnRcIixmdW5jdGlvbigpe1xuICAgIGRlc2NyaWJlKFwiaW5zdGFsbFwiLGZ1bmN0aW9uKCl7XG4gICAgICAgIGl0KFwic2hvdWxkIGRvd25sb2FkIGxldHNlbmNyeXB0LnNoXCIsZnVuY3Rpb24oZG9uZSl7XG4gICAgICAgICAgICB0aGlzLnRpbWVvdXQoNTAwMCk7XG4gICAgICAgICAgICBzdGFydEluc3RhbGwoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBkb25lKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgZGVzY3JpYmUoXCJDZXJ0XCIsZnVuY3Rpb24oKXtcbiAgICAgICAgaXQoXCJzaG91bGQgY3JlYXRlIGEgbmV3IGNlcnRcIixmdW5jdGlvbigpe1xuICAgICAgICAgICAgdGVzdENlcnQgPSBuZXcgY2VydC5DZXJ0KHtcbiAgICAgICAgICAgICAgICBjZkVtYWlsOiBwcm9jZXNzLmVudi5DRl9FTUFJTCxcbiAgICAgICAgICAgICAgICBjZktleTogcHJvY2Vzcy5lbnYuQ0ZfS0VZLFxuICAgICAgICAgICAgICAgIHNzbERpcjogXCJcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5zaG91bGQuYmUuaW5zdGFuY2VvZihjZXJ0LkNlcnQpO1xuICAgICAgICB9KVxuICAgICAgICBpdChcInNob3VsZCBnZXQgYSB2YWxpZCBjZXJ0aWZpY2F0ZVwiLGZ1bmN0aW9uKGRvbmUpe1xuICAgICAgICAgICAgdGhpcy50aW1lb3V0KDEyMDAwMCk7XG4gICAgICAgICAgICB0ZXN0Q2VydC5nZXREb21haW5DZXJ0KFwic3ViMi5ibGV1LmRlXCIpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvbmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH0pXG59KTsiXX0=
|
38
test/test.ts
Normal file
38
test/test.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import "typings-test";
|
||||||
|
import "should";
|
||||||
|
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();
|
||||||
|
});
|
||||||
|
})
|
||||||
|
})
|
||||||
|
});
|
@ -1,2 +1,58 @@
|
|||||||
import * as smartcli from "smartcli";
|
#!/usr/bin/env node
|
||||||
import * as cflare from "cflare";
|
// 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();
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
import "typings-global";
|
||||||
|
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");
|
11
ts/cert.plugins.ts
Normal file
11
ts/cert.plugins.ts
Normal file
@ -0,0 +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");
|
||||||
|
|
44
ts/index.ts
44
ts/index.ts
@ -0,0 +1,44 @@
|
|||||||
|
import * as plugins from "./cert.plugins";
|
||||||
|
import * as paths from "./cert.paths";
|
||||||
|
|
||||||
|
export class Cert {
|
||||||
|
cfEmail:string;
|
||||||
|
cfKey:string;
|
||||||
|
sslDir:string;
|
||||||
|
certificatesPresent;
|
||||||
|
certificatesValid;
|
||||||
|
gitOriginRepo;
|
||||||
|
constructor(optionsArg:{
|
||||||
|
cfEmail:string,
|
||||||
|
cfKey:string,
|
||||||
|
sslDir:string,
|
||||||
|
gitOriginRepo?:string
|
||||||
|
}){
|
||||||
|
this.cfEmail = optionsArg.cfEmail;
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export class Certificate {
|
||||||
|
domainName:string;
|
||||||
|
creationDate:Date;
|
||||||
|
expiryDate:Date;
|
||||||
|
constructor(){
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
@ -1,10 +1,23 @@
|
|||||||
import * as beautylog from "beautylog";
|
import * as plugins from "./cert.plugins";
|
||||||
import * as path from "path";
|
import * as paths from "./cert.paths";
|
||||||
import * as smartfile from "smartfile";
|
|
||||||
beautylog.info("installing letsencrypt.sh locally...");
|
export let startInstall = () => {
|
||||||
smartfile.remote.toFs(
|
let done = plugins.q.defer();
|
||||||
"https://raw.githubusercontent.com/lukas2511/letsencrypt.sh/master/letsencrypt.sh",
|
plugins.beautylog.info("installing letsencrypt.sh locally...");
|
||||||
path.join(__dirname,"assets/","le.sh")
|
|
||||||
).then(() => {
|
plugins.fs.ensureDir(plugins.path.join(__dirname, "assets/"));
|
||||||
beautylog.success("Done!");
|
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();
|
Reference in New Issue
Block a user