guvnor
Version:
A node process manager that isn't spanners all the way down
217 lines (171 loc) • 4.97 kB
JavaScript
require('colors')
require('../common/HelpfulError.js')
var commander = require('commander')
var pkg = require('../../package.json')
var path = require('path')
var prompt = require('prompt')
var bcrypt = require('bcrypt')
var pem = require('pem')
var fs = require('fs')
var ini = require('ini')
var mkdirp = require('mkdirp')
function loadUserConfig (file) {
function load (path) {
try {
if (fs.existsSync(path)) {
return ini.parse(fs.readFileSync(path, 'utf-8'))
}
} catch (error) {
if (error.code !== 'EACCES') {
throw error
}
}
}
return load('/etc/guvnor/' + file) ||
load(process.env.HOME + '/.config/guvnor/' + file) ||
{}
}
function saveUserConfig (file, contents) {
return writeFileToConfigDirectory(file, ini.stringify(contents))
}
function writeFileToConfigDirectory (file, contents) {
function write (file) {
var dir = path.dirname(file)
try {
mkdirp.sync(dir, {
mode: parseInt('0700', 8)
})
fs.writeFileSync(file, contents, {
mode: parseInt('0600', 8)
})
} catch (error) {
if (error.code !== 'EACCES') {
throw error
}
return false
}
return file
}
return write('/etc/guvnor/' + file) || write(process.env.HOME + '/.config/guvnor/' + file) || false
}
var CLI = function () {}
CLI.prototype.addUser = function (userName) {
var users = loadUserConfig('guvnor-web-users')
if (users[userName]) {
return console.log('A user with the name'.red, userName, 'already exists'.red)
}
this._getUserPassword(function (error, password) {
if (error) {
throw error
}
users[userName] = {
password: password
}
saveUserConfig('guvnor-web-users', users)
})
}
CLI.prototype.removeUser = function (userName) {
var users = loadUserConfig('guvnor-web-users')
delete users[userName]
if (!saveUserConfig('guvnor-web-users', users)) {
console.log('Could not remove user'.red, userName)
}
}
CLI.prototype.changeUserPassword = function (userName) {
var users = loadUserConfig('guvnor-web-users')
if (!users[userName]) {
return console.log('No user with the name'.red, userName, 'exists'.red)
}
this._getUserPassword(function (error, password) {
if (error) {
throw error
}
users[userName].password = password
saveUserConfig('guvnor-web-users', users)
})
}
CLI.prototype.listUsers = function () {
var users = loadUserConfig('guvnor-web-users')
var userNames = Object.keys(users)
if (userNames.length === 0) {
console.info('No users')
} else {
userNames.forEach(function (userName) {
console.log(userName)
})
}
}
CLI.prototype.generateSSLCertificate = function (days) {
days = days || 365
pem.createCertificate({
days: days,
selfSigned: true
}, function (error, keys) {
if (error) {
throw error
}
var config = loadUserConfig('guvnor-web')
config.https = config.https || {}
config.https.enabled = true
config.https.key = writeFileToConfigDirectory('ssh.key', keys.serviceKey)
config.https.certificate = writeFileToConfigDirectory('ssh.cert', keys.certificate)
config.https.enabled = true
delete config.https.passphrase
saveUserConfig('guvnor-web', config)
})
}
CLI.prototype._getUserPassword = function (callback) {
prompt.message = ''
prompt.start()
prompt.get([{
name: 'Enter a password (no characters will appear)',
required: true,
hidden: true
}, {
name: 'Repeat the password',
required: true,
hidden: true,
message: 'Passwords must match',
conform: function (value) {
return value === prompt.history('Enter a password (no characters will appear)').value
}
}], function (error, result) {
var password
if (!error) {
password = result['Enter a password (no characters will appear)']
password = bcrypt.hashSync(password, 10)
}
callback(error, password)
})
}
var cli = new CLI()
commander
.version(pkg.version)
commander
.command('useradd <username>')
.alias('adduser')
.description('Adds a web user')
.action(cli.addUser.bind(cli))
commander
.command('rmuser <username>')
.description('Removes a web user')
.action(cli.removeUser.bind(cli))
commander
.command('passwd <username>')
.description('Sets the password for a web user')
.action(cli.changeUserPassword.bind(cli))
commander
.command('lsusers')
.description('Prints out a list of users')
.action(cli.listUsers.bind(cli))
commander
.command('genssl [days]')
.description('Generates self-signed SSL certificates for guvnor-web that will expire in the passed number of days (defaults to 365)')
.action(cli.generateSSLCertificate.bind(cli))
var program = commander.parse(process.argv)
// No command, start the webserver
if (program.args.length === 0) {
var GuvnorWeb = require('./GuvnorWeb')
var web = new GuvnorWeb()
web.start()
}