a special treat
This commit is contained in:
parent
cefaf35d7b
commit
bac1dd50af
44
index.js
44
index.js
|
@ -16,6 +16,11 @@ LE.workDir = leCore.workDir;
|
|||
LE.acmeChallengPrefix = leCore.acmeChallengPrefix;
|
||||
LE.knownEndpoints = leCore.knownEndpoints;
|
||||
|
||||
LE.privkeyPath = ':config/live/:hostname/privkey.pem';
|
||||
LE.fullchainPath = ':config/live/:hostname/fullchain.pem';
|
||||
LE.certPath = ':config/live/:hostname/cert.pem';
|
||||
LE.chainPath = ':config/live/:hostname/chain.pem';
|
||||
|
||||
// backwards compat
|
||||
LE.stagingServer = leCore.stagingServerUrl;
|
||||
LE.liveServer = leCore.productionServerUrl;
|
||||
|
@ -118,6 +123,20 @@ LE.create = function (defaults, handlers, backend) {
|
|||
|
||||
le = {
|
||||
backend: backend
|
||||
, pyToJson: function (pyobj) {
|
||||
if (!pyobj) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var jsobj = {};
|
||||
Object.keys(pyobj).forEach(function (key) {
|
||||
jsobj[key] = pyobj[key];
|
||||
});
|
||||
jsobj.__lines = undefined;
|
||||
jsobj.__keys = undefined;
|
||||
|
||||
return jsobj;
|
||||
}
|
||||
, validate: function (hostnames, cb) {
|
||||
// TODO check dns, etc
|
||||
if ((!hostnames.length && hostnames.every(le.isValidDomain))) {
|
||||
|
@ -200,6 +219,31 @@ LE.create = function (defaults, handlers, backend) {
|
|||
args.duplicate = false;
|
||||
le.register(args, cb);
|
||||
}
|
||||
, getConfig: function (args, cb) {
|
||||
backend.getConfigAsync(args).then(function (pyobj) {
|
||||
cb(null, le.pyToJson(pyobj));
|
||||
}, function (err) {
|
||||
console.error(err.stack);
|
||||
return cb(null, []);
|
||||
});
|
||||
}
|
||||
, getConfigs: function (args, cb) {
|
||||
backend.getConfigsAsync(args).then(function (configs) {
|
||||
cb(null, configs.map(le.pyToJson));
|
||||
}, function (err) {
|
||||
if ('ENOENT' === err.code) {
|
||||
cb(null, []);
|
||||
} else {
|
||||
console.error(err.stack);
|
||||
cb(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
, setConfig: function (args, cb) {
|
||||
backend.configureAsync(args).then(function (pyobj) {
|
||||
cb(null, le.pyToJson(pyobj));
|
||||
});
|
||||
}
|
||||
, register: function (args, cb) {
|
||||
if (!Array.isArray(args.domains)) {
|
||||
cb(new Error('args.domains should be an array of domains'));
|
||||
|
|
|
@ -59,6 +59,10 @@ module.exports.tplCopy = function merge(copy) {
|
|||
Object.keys(tpls).sort(function (a, b) {
|
||||
return b.length - a.length;
|
||||
}).forEach(function (tplname) {
|
||||
if (!tpls[tplname]) {
|
||||
// what can't be templated now may be templatable later
|
||||
return;
|
||||
}
|
||||
copy[key] = copy[key].replace(':' + tplname, tpls[tplname]);
|
||||
copy[key] = copy[key].replace(homeRe, homedir + path.sep);
|
||||
});
|
||||
|
|
65
lib/core.js
65
lib/core.js
|
@ -3,6 +3,7 @@
|
|||
var PromiseA = require('bluebird');
|
||||
var mkdirpAsync = PromiseA.promisify(require('mkdirp'));
|
||||
var path = require('path');
|
||||
var fs = PromiseA.promisifyAll(require('fs'));
|
||||
var sfs = require('safe-replace');
|
||||
var LE = require('../');
|
||||
var LeCore = PromiseA.promisifyAll(require('letiny-core'));
|
||||
|
@ -229,13 +230,21 @@ function writeCertificateAsync(args, defaults, handlers) {
|
|||
|
||||
function getCertificateAsync(args, defaults, handlers) {
|
||||
var account = args.account;
|
||||
var promise;
|
||||
|
||||
return leCrypto.generateRsaKeypairAsync(args.rsaKeySize, 65537).then(function (domainKey) {
|
||||
if (args.domainKeyPath) {
|
||||
// TODO use existing pre-generated key if avaibale
|
||||
promise = leCrypto.generateRsaKeypairAsync(args.rsaKeySize, 65537);
|
||||
} else {
|
||||
promise = leCrypto.generateRsaKeypairAsync(args.rsaKeySize, 65537);
|
||||
}
|
||||
|
||||
promise.then(function (domainKey) {
|
||||
if (args.debug) {
|
||||
console.log("get certificate");
|
||||
}
|
||||
|
||||
args.domainPrivateKeyPem = domainKey.privateKeyPem;
|
||||
args.domainPrivateKeyPem = args.domainPrivateKeyPem || domainKey.privateKeyPem;
|
||||
//args.registration = domainKey;
|
||||
|
||||
return LeCore.getCertificateAsync({
|
||||
|
@ -422,6 +431,58 @@ module.exports.create = function (defaults, handlers) {
|
|||
}
|
||||
return fetchFromConfigLiveDir(copy, defaults);
|
||||
}
|
||||
, configureAsync: function (hargs) {
|
||||
hargs.renewalPath = hargs.renewalPath || ':config/renewal/:hostname.conf';
|
||||
hargs.domains = [];
|
||||
|
||||
var copy = merge(hargs, defaults);
|
||||
tplCopy(copy);
|
||||
|
||||
return getOrCreateRenewal(copy);
|
||||
}
|
||||
, getConfigAsync: function (hargs) {
|
||||
hargs.renewalPath = hargs.renewalPath || ':config/renewal/:hostname.conf';
|
||||
hargs.domains = [];
|
||||
|
||||
var copy = merge(hargs, defaults);
|
||||
tplCopy(copy);
|
||||
|
||||
if (copy.debug) {
|
||||
console.log('[LE DEBUG] get configs', copy);
|
||||
}
|
||||
|
||||
return readRenewalConfig(copy).then(function (pyobj) {
|
||||
var exists = pyobj.checkpoints >= 0;
|
||||
if (!exists) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return pyobj;
|
||||
});
|
||||
}
|
||||
, getConfigsAsync: function (hargs) {
|
||||
hargs.renewalDir = hargs.renewalDir || ':config/renewal/';
|
||||
hargs.renewalPath = hargs.renewalPath || ':config/renewal/:hostname.conf';
|
||||
hargs.domains = [];
|
||||
|
||||
var copy = merge(hargs, defaults);
|
||||
tplCopy(copy);
|
||||
|
||||
if (copy.debug) {
|
||||
console.log('[LE DEBUG] get configs', copy);
|
||||
}
|
||||
|
||||
return fs.readdirAsync(copy.renewalDir).then(function (nodes) {
|
||||
nodes = nodes.filter(function (node) {
|
||||
return /^[a-z0-9]+.*\.conf$/.test(node);
|
||||
});
|
||||
|
||||
return PromiseA.all(nodes.map(function (node) {
|
||||
copy.domains = [node.replace(/\.conf$/, '')];
|
||||
return wrapped.getConfigAsync(copy);
|
||||
}));
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return wrapped;
|
||||
|
|
Loading…
Reference in New Issue