anthtrigger
Version:
Trigger events via http service
195 lines (165 loc) • 4.64 kB
JavaScript
require('coffee-script/register');
var prompt = require('prompt'),
optimist = require('optimist');
var mongoose = require('mongoose');
var pm2 = require('pm2');
var os = require('os');
var fs = require('fs');
var path = require('path');
var Package = require('./package.json');
var config = {
listen: 5678,
serverName: os.hostname(),
shell: 'sh',
mongodb: "mongodb://127.0.0.1:27017/anthTrigger"
};
// Read defaults from exist config file
var configFile = path.join(process.env.HOME, './.anthTrigger.config.json');
if(fs.existsSync(configFile)) {
config = require(configFile);
}
var schema = {
properties: {
'listen': {
description: 'Enter the listening port',
type: 'number',
pattern: /^\d+$/,
message: 'Port must be numbers',
hidden: false,
default: config.listen,
required: true
},
'serverName': {
description: 'Enter the server name',
type: 'string',
message: 'Server name must be letters',
hidden: false,
default: config.serverName,
required: true
},
'mongodb': {
description: 'Enter the mongodb url',
type: 'string',
pattern: /^mongodb:\/\//,
message: 'Mongodb url like: mongodb://127.0.0.1:27017/anthTrigger',
hidden: false,
default: config.mongodb,
required: true
},
'shell': {
description: 'Which shell to run the script',
type: 'string',
hidden: false,
default: config.shell,
required: true
},
'adminPass': {
description: 'Enter the password for admin',
type: 'string',
hidden: true,
required: false
}
}
};
function updateAdmin(dburl, pass, cb) {
// Update administrator user password
var con = mongoose.connect(dburl);
con.connection.once('open', function() {
var userModel = require('./lib/users/UserModel');
userModel.update({
name: 'admin'
}, {
$set: {
password: pass,
role: 'admin'
}
}, { upsert: true }, function(err, aff) {
if(err) {
cb('Update administrator password fail!');
}
cb(null);
con.disconnect();
});
});
}
function callScript(dburl, shell, sid, args) {
var con = mongoose.connect(dburl);
con.connection.once('open', function() {
scriptCtrl = require('./lib/script/controller');
scriptCtrl
.callScript(sid, args, {
cwd: process.cwd(),
env: process.env,
shell: shell,
stdio: 'inherit'
})
.then(function(cont, exc) {
exc.on('close', function(code) {
cont(null);
})
})
.fail(function(cont, err) {
console.error(err);
cont(err)
})
.fin(function() {
con.disconnect();
});
});
}
var _argv = prompt.override = optimist.argv
switch(_argv._.shift()) {
case 'setup':
prompt.start();
prompt.get(schema, function(err, result) {
if(err) {
console.error('\n', err);
return
}
var password = result.adminPass;
console.log('Update Configs:');
console.log( JSON.stringify(result, null, '\t') );
delete result.adminPass;
// Update config.json
var configJson = JSON.stringify(result, null, '\t');
fs.writeFileSync(configFile, configJson);
if(password) {
updateAdmin(result.mongodb, password, function(err) {
console.log('Done! Please restart anthTrigger!');
});
}
});
break;
case 'start':
pm2.connect(function(err) {
var appEntryFile = path.join(__dirname, './index.js');
pm2.start(appEntryFile, { name: 'anthTrigger' }, function(err, proc) {
if(err) {
console.error(err);
throw new Error(err);
}
// Get all processes running
pm2.list(function(err, process_list) {
console.log(process_list);
// Disconnect to PM2
pm2.disconnect(function() { process.exit(0) });
});
});
})
break;
case 'version':
console.log('anthTrigger (c) 网研(NAD)cLauncher');
console.log('Current version: ' + Package.version);
break;
case 'run':
var scriptId = _argv._.shift();
var runArgs = _argv._;
//Todo: call script by id
callScript(config.mongodb, config.shell, scriptId, runArgs);
break;
default:
console.log('Syntax: ');
console.log('\t anthtrigger <setup|start>');
break;
}