114 lines
3.0 KiB
JavaScript
114 lines
3.0 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
// TODO how to handle path differences when run from npx vs when required by greenlock?
|
||
|
|
||
|
var promisify = require('util').promisify;
|
||
|
var fs = require('fs');
|
||
|
var readFile = promisify(fs.readFile);
|
||
|
var writeFile = promisify(fs.writeFile);
|
||
|
var chmodFile = promisify(fs.chmod);
|
||
|
var path = require('path');
|
||
|
|
||
|
function saveFile(rcpath, data, enc) {
|
||
|
// because this may have a database url or some such
|
||
|
return writeFile(rcpath, data, enc).then(function() {
|
||
|
return chmodFile(rcpath, parseInt('0600', 8));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
module.exports = async function(pkgpath, manager, rc) {
|
||
|
// TODO when run from package
|
||
|
// Run from the package root (assumed) or exit
|
||
|
var pkgdir = path.dirname(pkgpath);
|
||
|
var rcpath = path.join(pkgdir, '.greenlockrc');
|
||
|
var created = false;
|
||
|
|
||
|
try {
|
||
|
require(pkgpath);
|
||
|
} catch (e) {
|
||
|
console.error(
|
||
|
'npx greenlock must be run from the package root (where package.json is)'
|
||
|
);
|
||
|
process.exit(1);
|
||
|
}
|
||
|
|
||
|
if (manager) {
|
||
|
if ('.' === manager[0]) {
|
||
|
manager = path.resolve(pkgdir, manager);
|
||
|
}
|
||
|
try {
|
||
|
require(manager);
|
||
|
} catch (e) {
|
||
|
console.error('npx greenlock must be run from the package root');
|
||
|
process.exit(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var _data = await readFile(rcpath, 'utf8').catch(function(err) {
|
||
|
if ('ENOENT' !== err.code) {
|
||
|
throw err;
|
||
|
}
|
||
|
console.info('Creating ' + rcpath);
|
||
|
created = true;
|
||
|
var data = '{}';
|
||
|
return saveFile(rcpath, data, 'utf8').then(function() {
|
||
|
return data;
|
||
|
});
|
||
|
});
|
||
|
|
||
|
var changed;
|
||
|
var _rc;
|
||
|
try {
|
||
|
_rc = JSON.parse(_data);
|
||
|
} catch (e) {
|
||
|
console.error("couldn't parse " + rcpath, _data);
|
||
|
console.error('(perhaps you should just delete it and try again?)');
|
||
|
process.exit(1);
|
||
|
}
|
||
|
|
||
|
if (manager) {
|
||
|
if (!_rc.manager) {
|
||
|
_rc.manager = manager;
|
||
|
}
|
||
|
if (_rc.manager !== manager) {
|
||
|
console.info('Switching manager:');
|
||
|
var older = _rc.manager;
|
||
|
var newer = manager;
|
||
|
if ('/' === older[0]) {
|
||
|
older = path.relative(pkgdir, older);
|
||
|
}
|
||
|
if ('/' === newer[0]) {
|
||
|
newer = path.relative(pkgdir, newer);
|
||
|
}
|
||
|
console.info('\told: ' + older);
|
||
|
console.info('\tnew: ' + newer);
|
||
|
changed = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (rc) {
|
||
|
changed = true;
|
||
|
Object.keys(rc).forEach(function(k) {
|
||
|
_rc[k] = rc;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (!_rc.manager) {
|
||
|
changed = true;
|
||
|
_rc.manager = 'greenlock-manager-fs';
|
||
|
console.info('Using default manager ' + _rc.manager);
|
||
|
}
|
||
|
|
||
|
if (!changed) {
|
||
|
return _rc;
|
||
|
}
|
||
|
|
||
|
var data = JSON.stringify(_rc, null, 2);
|
||
|
if (created) {
|
||
|
console.info('Wrote ' + rcpath);
|
||
|
}
|
||
|
return saveFile(rcpath, data, 'utf8').then(function() {
|
||
|
return _rc;
|
||
|
});
|
||
|
};
|