liveapicreator-admin-cli
Version:
The NodeJS command line utility for 'CA Live API Creator' DevOps Administration from CA Technologies
465 lines (454 loc) • 14.3 kB
JavaScript
var Client = require('node-rest-client').Client;
var colors = require('colors');
var _ = require('underscore');
var Table = require('easy-table');
var fs = require('fs');
var context = require('./context.js');
var login = require('../util/login.js');
var printObject = require('../util/printObject.js');
var dotfile = require('../util/dotfile.js');
module.exports = {
doListener: function (action, cmd) {
if (action === 'list') {
module.exports.list(cmd);
}
else if (action === 'delete') {
module.exports.del(cmd);
}
else if (action === 'export') {
module.exports.export(cmd);
}
else if (action === 'import') {
module.exports.import(cmd);
}
else {
console.log('You must specify an action: list, delete, import, or export');
//program.help();
}
},
list: function (cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if (!loginInfo)
return;
var url = loginInfo.url;
var apiKey = loginInfo.apiKey;
var projIdent = cmd.project_ident;
if (!projIdent) {
projIdent = dotfile.getCurrentProject();
if (!projIdent) {
console.log('There is no current project.'.yellow);
return;
}
}
client.get(url + "/admin:listeners?sysfilter=equal(project_ident:" + projIdent + ")&pagesize=100&&sysorder=(name:asc_uc,name:desc)", {
headers: {
Authorization: "CALiveAPICreator " + apiKey + ":1",
"Content-Type": "application/json"
}
}, function (data) {
if (data.errorMessage) {
console.log(data.errorMessage.red);
return;
}
printObject.printHeader('Listeners');
var table = new Table();
var type = "";
var verboseDisplay = "";
_.each(data, function (p) {
switch (p.provider_ident) {
case 1:
type = "Shutdown";
break;
case 2:
type = "Shutdown";
break;
case 3:
type = "MQTT";
break;
case 4:
type = "KafkaConsumer";
break;
case 5:
type = "KafkaProducer";
break;
case 6:
type = "RabbitMQConsumer";
break;
case 7:
type = "RabbitMQProducer";
break;
case 8:
type = "JMSConsumer";
break;
case 9:
type = "JMSCProducer";
break;
default:
type = 'other';
break;
}
table.cell("Ident", p.ident);
table.cell("Name", p.name);
table.cell("Type", type);
table.cell("Logging Level", p.logging_level);
table.cell("Active", p.is_active == true);
var comments = p.code;
if (!comments) {
comments = "";
}
else if (comments.length > 50) {
comments = comments.replace("\n", " ");
comments = comments.substring(0, 47) + "...";
}
table.cell("Code", comments);
comments = p.description;
if (!comments) {
comments = "";
}
else if (comments.length > 50) {
comments = comments.substring(0, 47) + "...";
}
comments = comments.replace("\n", " ");
table.cell("Description", comments);
table.newRow();
if (cmd.verbose) {
verboseDisplay += "\n";
verboseDisplay += "lacadmin listener export --listener_name '" + p.name + "' --file LISTENERS_" + p.name + ".json\n";
verboseDisplay += "#lacadmin listener import --file LISTENERS_" + p.name + ".json\n";
}
});
table.sort(['Name']);
console.log(table.toString());
printObject.printTrailer("# listeners: " + data.length);
if (cmd.verbose) {
console.log(verboseDisplay);
}
});
},
del: function (cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if (!loginInfo) {
console.log('You are not currently logged into a CA Live API Creator server.'.red);
return;
}
var projIdent = cmd.project_ident;
if (!projIdent) {
projIdent = dotfile.getCurrentProject();
if (!projIdent) {
console.log('There is no current project.'.yellow);
return;
}
}
var filt = "equal(project_ident:" + projIdent;
if (cmd.ident) {
filt += ",ident:" + cmd.ident + ")";
} else if (cmd.listener_name) {
filt += ",name:'" + cmd.listener_name + "')";
} else {
if (cmd.listener_name) {
filt += ",name:'" + cmd.listener_name + "')";
} else {
console.log('Missing parameter: please specify listener_name or ident'.red);
return;
}
}
client.get(loginInfo.url + "/admin:listeners?sysfilter=" + filt, {
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type": "application/json"
}
}, function (data) {
//console.log('get result: ' + JSON.stringify(data, null, 2));
if (data.errorMessage) {
console.log(("Error: " + data.errorMessage).red);
return;
}
if (data.length === 0) {
console.log(("Error: no such listener ident").red);
return;
}
if (data.length > 1) {
console.log(("Error: more than one listener for the given condition: " + filter).red);
return;
}
var db = data[0];
var startTime = new Date();
client['delete'](db['@metadata'].href + "?checksum=" + db['@metadata'].checksum, {
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type": "application/json"
}
}, function (data2) {
var endTime = new Date();
if (data2.errorMessage) {
console.log(data2.errorMessage.red);
return;
}
printObject.printHeader('Listener was deleted, including the following objects:');
_.each(data2.txsummary, function (obj) {
printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb);
});
var trailer = "Request took: " + (endTime - startTime) + "ms";
trailer += " - # objects touched: ";
if (data2.txsummary.length == 0) {
console.log('No data returned'.yellow);
}
else {
trailer += data2.txsummary.length;
}
printObject.printHeader(trailer);
});
});
},
export: function (cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if (!loginInfo)
return;
var url = loginInfo.url;
var apiKey = loginInfo.apiKey;
var projIdent = cmd.project_ident;
if (!projIdent) {
projIdent = dotfile.getCurrentProject();
}
var sep = "";
var filter = "";
if (cmd.ident) {
filter += sep + "sysfilter=equal(ident:" + cmd.ident + ")";
sep = "&";
} else if (cmd.listener_name) {
filter += sep + "sysfilter=equal(name:'" + cmd.listener_name + "')";
sep = "&";
}
if (projIdent) {
filter += sep + "sysfilter=equal(project_ident:" + projIdent + ")";
}
var toStdout = false;
if (!cmd.file) {
toStdout = true;
}
client.get(loginInfo.url + "/ListenerExport?pagesize=1000&" + filter, {
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type": "application/json"
}
}, function (data) {
//console.log('get result: ' + JSON.stringify(data, null, 2));
if (data.errorMessage) {
console.log(("Error: " + data.errorMessage).red);
return;
}
if (data.length === 0) {
console.log(("No listener(s) found").red);
return;
}
for (var idx = 0; idx < data.length; idx++) {
delete data[idx].ident;
delete data[idx].ts;
delete data[idx].project_ident;
delete data[idx].connection_ident;
delete data[idx]['@metadata']
data[idx]["@metadata"] = {action: "MERGE_INSERT", key: ["project_ident", "name"]};
for (var j = 0; j < data[idx].ListenerParameters.length; j++) {
delete data[idx].ListenerParameters[j].ident;
delete data[idx].ListenerParameters[j].ts;
delete data[idx].ListenerParameters[j].listener_ident;
}
}
if (toStdout) {
console.log(JSON.stringify(data, null, 2));
}
else {
var exportFile = fs.openSync(cmd.file, 'w+', 0600);
fs.writeSync(exportFile, JSON.stringify(data, null, 2));
console.log(('Listeners have been exported to file: ' + cmd.file).green);
}
});
},
import: function (cmd) {
var client = new Client();
var loginInfo = login.login(cmd);
if (!loginInfo) {
return;
}
var projIdent = cmd.project_ident;
if (!projIdent) {
projIdent = dotfile.getCurrentProject();
if (!projIdent) {
console.log('There is no current project.'.yellow);
return;
}
}
if (!cmd.file) {
cmd.file = '/dev/stdin';
}
var fileContent = null;
var json = null;
fs.readFile(cmd.file, function read(err, data) {
if (err) {
console.log("Unable to read file");
return;
}
json = data;
//console.log("before: "+json);
fileContent = JSON.parse(json);
if (Array.isArray(fileContent) && fileContent.length > 0) {
for (var i = 0; i < fileContent.length; i++) {
fileContent[i].project_ident = projIdent;
delete fileContent[i].ts;
delete fileContent[i].connection_ident;
delete fileContent[i].ident;
fileContent[i]["@metadata"] = {action: "MERGE_INSERT", key: ["project_ident", "name"]};
if (fileContent[i].connection !== null) {
fileContent[i].connection["project_ident"] = projIdent;
fileContent[i].connection["@metadata"] = {action: "LOOKUP", key: ["project_ident", "name"]};
}
for (var j = 0; j < fileContent[i].ListenerParameters.length; j++) {
delete fileContent[i].ListenerParameters[j].ident;
delete fileContent[i].ListenerParameters[j].ts;
delete fileContent[i].ListenerParameters[j].listener_ident;
delete fileContent[i].ListenerParameters[j]["@metadata"];
}
}
} else {
fileContent.project_ident = projIdent;
delete fileContent.ts;
fileContent["@metadata"] = {action: "MERGE_INSERT", key: ["project_ident", "name"]};
if (fileContent.connection !== null) {
fileContent.connection["@metadata"] = {action: "LOOKUP", key: ["project_ident", "name"]};
}
if (fileContent.connection !== null) {
fileContent.connection["project_ident"] = projIdent;
fileContent.connection["@metadata"] = {action: "LOOKUP", key: ["project_ident", "name"]};
}
for (var j = 0; j < fileContent.ListenerParameters.length; j++) {
delete fileContent.ListenerParameters[j].ident;
delete fileContent.ListenerParameters[j].ts;
delete fileContent.ListenerParameters[j].listener_ident;
delete fileContent.ListenerParameters[j]["@metadata"];
}
}
var startTime = new Date();
//console.log("after:"+JSON.stringify(fileContent,null,2));
client.put(loginInfo.url + "/ListenerExport", {
data: fileContent,
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type": "application/json"
}
}, function (data) {
//console.log(data);
var endTime = new Date();
if (data.errorMessage) {
console.log(data.errorMessage.red);
return;
}
printObject.printHeader('Listener(s) created, including:');
if (data.statusCode == 200) {
console.log("Request took: " + (endTime - startTime) + "ms");
//return;
}
var newHandler = _.find(data.txsummary, function (p) {
return p['@metadata'].resource === 'ListenerExport';
});
if (!newHandler) {
console.log('No transaction summary. Unable to overwrite existing listener(s)'.red);
return;
}
if (cmd.verbose) {
_.each(data.txsummary, function (obj) {
printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb);
});
}
else {
printObject.printObject(newHandler, newHandler['@metadata'].entity, 0, newHandler['@metadata'].verb);
console.log(('and ' + (data.txsummary.length - 1) + ' other objects').grey);
}
var trailer = "Request took: " + (endTime - startTime) + "ms";
trailer += " - # objects touched: ";
if (data.txsummary.length === 0) {
console.log('No data returned'.yellow);
}
else {
trailer += data.txsummary.length;
}
//ok - lets try to restart each conneciton
//fileContent = origFileContent;
//console.log(">>> " + JSON.stringify(fileContent));
var payload = [];
var listener = {};
if (Array.isArray(fileContent) && fileContent.length > 0) {
for (var i = 0; i < fileContent.length; i++) {
listener = {};
listener.project_ident = projIdent;
if (fileContent[i].is_active && fileContent[i].connection) {
console.log("Listener "+fileContent[i].name + " needs restart");
listener.name = fileContent[i].name;
listener.is_active = true;
listener.restart = true;
listener.showRestartAlert = false;
_.each(data.txsummary, function (obj) {
if(obj.name == fileContent[i].name) {
listener.ident = obj.ident;
listener.provider_ident = obj.provider_ident;
var metadata = {};
metadata.verb = "UPDATE";
metadata.checksum = obj["@metadata"].checksum;
listener["@metadata"] = metadata;
}
});
payload.push(listener);
}
}
} else {
if (fileContent.is_active && fileContent.connection) {
console.log("Listener "+fileContent.name + " needs restart");
listener = {};
listener.name = fileContent.name;
listener.is_active = true;
listener.restart = true;
listener.showRestartAlert = false;
_.each(data.txsummary, function (obj) {
if(obj.name == fileContent.name) {
listener.ident = obj.ident;
listener.provider_ident = obj.provider_ident;
var metadata = {};
metadata.verb = "UPDATE";
metadata.checksum = obj["@metadata"].checksum;
listener["@metadata"] = metadata;
}
});
payload.push(listener);
}
}
//do we have anything left to process
if (payload.length > 0) {
_.each(payload, function (content) {
console.log("Listener "+JSON.stringify(content));
client.put(loginInfo.url + "/admin:listeners/" + content.ident, {
data: content,
headers: {
Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1",
"Content-Type": "application/json"
}
}, function (data2) {
//console.log(data2);
if (data2.errorMessage) {
console.log(data2.errorMessage.red);
return;
}
if (data2.statusCode == 200) {
_.each(data2.txsummary, function (obj) {
console.log("Listener "+ obj.name + " restarted");
});
}
});
});
}
printObject.printTrailer(trailer);
});
});
}
};