UNPKG

liveapicreator-admin-cli

Version:

The NodeJS command line utility for 'CA Live API Creator' DevOps Administration from CA Technologies

661 lines (626 loc) 20.2 kB
var Client = require('node-rest-client').Client; var colors = require('colors'); var _ = require('underscore'); var fs = require('fs'); var CLITable = require('cli-table'); var Table = require('easy-table'); 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 = { doLibrary: function(action, cmd) { if (action === 'list') { module.exports.list(cmd); } else if (action === 'create') { module.exports.create(cmd); } else if (action === 'delete') { module.exports.delete(cmd); } else if (action === 'import') { module.exports.import(cmd); } else if (action === 'export') { module.exports.export(cmd); } else if (action === 'exportJavascript') { module.exports.exportJavascript(cmd); } else if (action === 'importJavascript') { module.exports.importJavascript(cmd); } else { console.log('You must specify an action: list, create, delete, import, exportJavascript,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; var filter = ""; if (!projIdent) { projIdent = dotfile.getCurrentProject(); } if (projIdent) { filter = "&sysfilter=equal(project_ident:" + projIdent + ")"; } client.get(url + "/logic_libraries?pagesize=100&sysorder=(name:asc_uc,name:desc)"+filter, { headers: { Authorization: "CALiveAPICreator " + apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { if (data.errorMessage) { console.log(data.errorMessage.red); return; } printObject.printHeader('All Libraries'); var table = new Table(); var verboseDisplay = ""; _.each(data, function(p) { table.cell("Ident", p.ident); table.cell("Name", p.name); table.cell("Version", p.version); table.cell("Short Name", p.lib_name); //table.cell("UserLib",(p.system_only == true)); table.cell("Type", p.logic_type); var comments = p.description; if ( ! comments) { comments = ""; } else if (comments.length > 50){ comments = comments.substring(0, 47) + "..."; } table.cell("Comments", comments); table.newRow(); if(cmd.verbose && p.ident > 511) { verboseDisplay += "\n"; verboseDisplay += "lacadmin libraries export --name '"+p.name+"' --file 'LIBRARY_"+p.name + ".json'\n"; verboseDisplay += "#lacadmin libraries import --file 'LIBRARY_"+p.name + ".json'\n"; } }); table.sort(['Name']); console.log(table.toString()); printObject.printHeader("# libraries: " + data.length); if(cmd.verbose) { console.log(verboseDisplay); } }); }, delete: 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("No current project selected".red); return; } var filt = null; if (cmd.library_name) { filt = "equal(name:'" + cmd.library_name + "'"; } else if (cmd.ident) { filt = "equal(ident:" + cmd.ident; } if(filt === null) { console.log('Missing parameter: please specify library --name or --ident'.red); return; } filt += ",project_ident:"+ projIdent +")"; client.get(loginInfo.url + "/logic_libraries?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(("Library not found").red); return; } if (data.length > 1) { console.log(("Error: more than one libraries for the given condition: " + filt).red); return; } var library = data[0]; var startTime = new Date(); client['delete'](library['@metadata'].href + "?checksum=" + library['@metadata'].checksum, { headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1" } }, function(data2) { var endTime = new Date(); if (data2.errorMessage) { console.log(data2.errorMessage.red); return; } printObject.printHeader('Library was deleted, including the following objects:'); var delLibrary = _.find(data2.txsummary, function(p) { return p['@metadata'].resource === 'admin:logic_libraries'; }); if ( ! delLibrary) { console.log('ERROR: unable to find deleted library'.red); return; } if (cmd.verbose) { _.each(data2.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); } else { printObject.printObject(delLibrary, delLibrary['@metadata'].entity, 0, delLibrary['@metadata'].verb); console.log(('and ' + (data2.txsummary.length - 1) + ' other objects').grey); } 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); }); }); }, create: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; if ( ! cmd.library_name) { console.log('Missing parameter: library_name'.red); return; } if ( ! cmd.short_name) { console.log('Missing parameter: short_name'.red); return; } var ver = cmd.ver; if( ! cmd.ver ) { ver = "1.0"; } var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); } context.getContext(cmd, function() { var newLibrary = { name: cmd.library_name, group_name: cmd.short_name , lib_name: cmd.short_name , version: ver , description: cmd.comments || null, doc_url: cmd.docurl || null, ref_url: cmd.refurl || null, code: "", system_only: false, logic_type: "javascript" , project_ident: projIdent }; if( ! cmd.file){ cmd.file = '/dev/stdin'; } var fileContent = fs.readFileSync(cmd.file); var data = fileContent.toString('base64');//hex newLibrary.code = "b64:" + data;//"0x"+data; // var startTime = new Date(); newLibrary["@metadata"] = {action:"MERGE_INSERT", key: ["name","project_ident"]} ; client.put(loginInfo.url + "/admin:logic_libraries", { data: newLibrary, headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { var endTime = new Date(); if (data.errorMessage) { console.log(data.errorMessage.red); return; } if(data.statusCode == 200 && data.txsummary.length == 0){ console.log("Merge completed - no changes detected"); } else { printObject.printHeader('Library was created, including:'); var newLib = _.find(data.txsummary, function(p) { return p['@metadata'].resource === 'admin:logic_libraries'; }); if ( ! newLib) { console.log('Library Create error: unable to find newly created library'.red); return; } if (cmd.verbose) { _.each(data.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); } else { printObject.printObject(newLib, newLib['@metadata'].entity, 0, newLib['@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; } printObject.printHeader(trailer); } //console.log("project ident "+projIdent ); //console.log("logic_library_ident:" +data.txsummary[0].ident); //console.log("LinkProject "+ cmd.linkProject); //console.log("data.txsummary.length ="+data.txsummary.length); if(cmd.linkProject && projIdent && data.txsummary.length > 0){ var linkproject = { //@metadata: {action: 'INSERT'}, logic_library_ident: data.txsummary[0].ident , project_ident: projIdent }; linkproject["@metadata"] = {action:"MERGE_INSERT"} ; client.put(loginInfo.url + "/admin:project_libraries", { data: linkproject, headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { if (data.errorMessage) { console.log(("LinkProject Error: " + data.errorMessage).red); return; } if (data.length === 0) { console.log(("Error: no such project or library to link").red); return; } }); } }); }); }, importJavascript: 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("No current project selected".red); return; } var filt = null; if (cmd.library_name) { filt = "equal(name:'" + cmd.library_name + "'"; } else if (cmd.ident) { filt = "equal(ident:" + cmd.ident; } if(!cmd.file) { console.log('Missing parameter: please specify JavaScript file using --file'.red); return; } if(filt === null) { console.log('Missing parameter: please specify library --name or --ident'.red); return; } filt += ",project_ident:"+ projIdent +")"; client.get(loginInfo.url + "/logic_libraries?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(("Library not found").red); return; } if (data.length > 1) { console.log(("Error: more than one libraries for the given condition: " + filt).red); return; } var library = data[0]; var content = fs.readFileSync(cmd.file,'utf-8'); var fileContent = content; var libcodehex = fileContent.toString('base64');//hex library.code = "b64:" + libcodehex; var metadata = library["@metadata"]; metadata.action ="MERGE_INSERT"; //console.log(metadata); library["@metadata"] = metadata; //console.log(library); var startTime = new Date(); client.put(loginInfo.url + "/logic_libraries", { data: library, 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('Library was updated, including the following objects:'); var putlib = _.find(data2.txsummary, function(p) { return p['@metadata'].resource === 'admin:logic_libraries'; }); if ( ! putlib) { console.log('ERROR: unable to find updated library'.red); return; } if (cmd.verbose) { _.each(data2.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); } else { printObject.printObject(putlib, putlib['@metadata'].entity, 0, putlib['@metadata'].verb); console.log(('and ' + (data2.txsummary.length - 1) + ' other objects').grey); } 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); }); }); }, import: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; var url = loginInfo.url; var apiKey = loginInfo.apiKey; if ( ! cmd.file) { cmd.file = '/dev/stdin'; } var projIdent = cmd.project_ident; if ( ! projIdent) { projIdent = dotfile.getCurrentProject(); } console.log("project ident "+projIdent ); if (cmd.linkProject) { console.log("LinkProject "+ cmd.linkProject); } context.getContext(cmd, function() { var content = fs.readFileSync(cmd.file,'utf-8'); //console.log(content); var fileContent = JSON.parse(content); var account_ident = context.account.ident; for(var i = 0 ; i < fileContent.length ; i++ ){ delete fileContent[i].ident; fileContent[i].logic_type = "javascript"; fileContent[i].project_ident = projIdent; delete fileContent[i].ts; delete fileContent[i].account_ident; fileContent[i]["@metadata"] = {action:"MERGE_INSERT", key: ["name","project_ident"]} ; } var startTime = new Date(); client.put(loginInfo.url + "/logic_libraries", { data: fileContent, headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { var endTime = new Date(); if (data.errorMessage) { console.log(data.errorMessage.red); return; } printObject.printHeader('Logic Library was created, including:'); if(data.statusCode == 200 ){ console.log("Request took: " + (endTime - startTime) + "ms"); } var newLib = _.find(data.txsummary, function(p) { return p['@metadata'].resource === 'admin:logic_libraries'; }); if ( ! newLib) { console.log('ERROR: unable to find imported logic library'.red); return; } if (cmd.verbose) { _.each(data.txsummary, function(obj) { printObject.printObject(obj, obj['@metadata'].entity, 0, obj['@metadata'].verb); }); } else { printObject.printObject(newLib, newLib['@metadata'].entity, 0, newLib['@metadata'].verb); console.log(('and ' + (data.txsummary.length - 1) + ' other objects').grey); } console.log("logic_library_ident:" +data.txsummary[0].ident); 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; } printObject.printHeader(trailer); if(cmd.linkProject){ console.log("Link Project to "+projIdent); var linkproject = { //@metadata: {action: 'INSERT'}, logic_library_ident: data.txsummary[0].ident , project_ident: projIdent }; linkproject["@metadata"] = {action:"INSERT"} ; client.post(loginInfo.url + "/admin:project_libraries", { data: linkproject, headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(data) { if (data.errorMessage) { console.log(("Link error: " + data.errorMessage).red); return; } if (data.length === 0) { console.log(("Link error: no such project ident or library to link").red); return; } printObject.printHeader(trailer); }); } }) }); }, exportJavascript: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; var url = loginInfo.url; var apiKey = loginInfo.apiKey; var filter = null; filter = "sysfilter=greater(ident:999)&sysfilter=equal(logic_type:'javascript')"; if (!cmd.ident) { console.log("Missing parameter --ident - use lacadmin libraries list"); return; } var toStdout = false; if ( ! cmd.file) { toStdout = true; } filter = "/" + cmd.ident + "/code?" + filter; var dataUrl = loginInfo.url; dataUrl = dataUrl.replace("rest","data"); //console.log(dataUrl); client.get(dataUrl + "/admin:logic_libraries" + 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(("Error: no libraries found using filter "+filter).red); return; } var fileAsString = new Buffer(data).toString('utf8'); //console.log( "javascript code :" + fileAsString); if (toStdout) { console.log(JSON.stringify(fileAsString, null, 2)); } else { var exportFile = fs.openSync(cmd.file, 'w+', 0600); fs.writeSync(exportFile, fileAsString); console.log(('Logic Library as JSON has been exported to file: ' + cmd.file).green); } }); }, export: function(cmd) { var client = new Client(); var loginInfo = login.login(cmd); if ( ! loginInfo) return; var url = loginInfo.url; var apiKey = loginInfo.apiKey; var filter = null; filter = "&sysfilter=greater(ident:999)&sysfilter=equal(logic_type:'javascript')"; if (cmd.ident) { filter += "&sysfilter=equal(ident:" + cmd.ident + ")"; } else if (cmd.short_name) { filter += "&sysfilter=equal(short_name:'" + cmd.short_name + "')"; } else if (cmd.library_name) { filter += "&sysfilter=equal(name:'" + cmd.library_name + "')"; } var toStdout = false; if ( ! cmd.file) { toStdout = true; } client.get(loginInfo.url + "/admin:logic_libraries?nometa=true" + 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(("Error: no libraries found using filter "+filter).red); return; } var select_ident = null; for(var i = 0; i < data.length ; i++){ select_ident = data[i].ident; delete data[i].ident; delete data[i].account_ident; data[i].project_ident = null; } if (toStdout) { //console.log(JSON.stringify(data, null, 2)); if(cmd.ident) { select_ident = cmd.ident; } if (select_ident) { filter = "/" + select_ident + "/code"; var dataUrl = loginInfo.url; dataUrl = dataUrl.replace("rest","data"); client.get(dataUrl + "/admin:logic_libraries" + filter, { headers: { Authorization: "CALiveAPICreator " + loginInfo.apiKey + ":1", "Content-Type" : "application/json" } }, function(code) { if (code.errorMessage) { console.log(("Error: " + code.errorMessage).red); return; } if (code.length === 0) { console.log(("Library {JS} code not found").red); return; } var filename = data[0].name + ".js"; var fileAsString = new Buffer(code).toString('utf8'); //console.log(filename + ":" + fileAsString); var exportFile = fs.openSync(filename, 'w+', 0600); fs.writeSync(exportFile, JSON.stringify(fileAsString, null, 2)); console.log(('Logic Library as text has been exported to file: ' + filename ).green); }); } } else { var exportFile = fs.openSync(cmd.file, 'w+', 0600); fs.writeSync(exportFile, JSON.stringify(data, null, 2)); console.log(('Logic Library as JSON has been exported to file: ' + cmd.file).green); } }); } }