UNPKG

knowhow-server

Version:

A personal workflow engine that can manage and use any network connected host

360 lines (311 loc) 10 kB
var fileControl = require('../routes/file-control'); var KnowhowShellPath = ''; //var KnowhowShellPath = '../../'; var KnowhowShell = require(KnowhowShellPath+'knowhow-shell'); var KHShell = new KnowhowShell(eventEmitter); var async = require('async'); var EventEmitter = require('events').EventEmitter; var eventEmitter = new EventEmitter(); var logger=require('./log-control').logger; var agentUtils = require('./agent/agent-utils'); var getPackageVersion = function(packageName, callback) { var versionJob = { "id": "get package version", "working_dir": "/tmp/KHAgent", "options": { "timeoutms": 60000, "noEcho": true }, "files": [], "script": { "env": { "PATH": '/opt/local/bin:/opt/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', "PACKAGE_NAME": packageName }, "commands": [ { "command": "npm show ${PACKAGE_NAME} version" } ] } } var knowhowShell = new KnowhowShell(); knowhowShell.executeJobAsSubProcess(versionJob, function(err, jobRuntime) { if(err) { logger.error("unable to get version for package: "+packageName+" "+err.message); callback(err); } else { //console.log(jobRuntime); callback(undefined, jobRuntime.scriptRuntime.completedCommands[0].output.split(/[ \r\n]/)[0]); } }); }; var getGlobalInstallVersion = function(packageName, callback) { var knowhowShell = new KnowhowShell(); knowhowShell.executeSingleCommand("npm -g view "+packageName+" version", function(err, runTime) { if (err || !runTime || !runTime.output) { callback(err); } else if (!runTime || !runTime.output) { callback(new Error("unable to get version for: "+packageName)); } else { var version = runTime.output.split(/[ \r\n]/)[0]; callback(undefined, version); } }); } var getInstalledVersions = function(callback) { var knowhowServer = require('../package.json'); var knowhowShell = require(KnowhowShellPath+'knowhow-shell/package.json'); //var knowhowApi = require('knowhow-api/package.json'); //var knowhowServer = require('knowhow-server/package.json'); //var knowhowAgent = require('knowhow-agent/package.json'); var versions = { //'knowhow': knowhow.version, 'knowhow-shell': knowhowShell.version, //'knowhow-api': knowhowApi.version, 'knowhow-server': knowhowServer.version //'knowhow-agent': knowhowAgent.version }; var packages = ['knowhow', 'knowhow-shell', 'knowhow-api', 'knowhow-agent']; async.each(packages, function(package, cb) { getGlobalInstallVersion(package, function(err, version) { if (err) { cb(err); } else { versions[package] = version; cb(); } }); }, function(err) { if (err && callback) { callback(err); } else if(callback){ callback(undefined, versions); } } ); } var getNewestVersions = function(callback) { var packages = ['knowhow', 'knowhow-shell', 'knowhow-api', 'knowhow-server', 'knowhow-agent']; var versions = {}; async.each(packages, function(package, cb) { getPackageVersion(package, function(err, version) { if (err) { //cb(err); } else { versions[package] = version; cb(); } }); }, function(err) { if (err) { callback(err); } else { //console.log(versions); callback(undefined, versions); } }); } exports.getNewestVersions = getNewestVersions; exports.getInstalledVersions = getInstalledVersions; var upgradeServer = function(sudoPwd, callback) { fileControl.load("InternalRepo:///jobs/knowhow/upgradeKnowhow.json", function(err,content) { var job = JSON.parse(content); job.script.env['PASSWORD'] = sudoPwd; KHShell.executeJobAsSubProcess(job, function(err, runtime){ if (err) { if (runtime && runtime.output) { callback(new Error(runtime.output)); } else { callback(err); } } else { callback(); process.exit(0); } }); }); } var upgradeAgent = function(agent, server, callback) { fileControl.load("InternalRepo:///jobs/knowhow/upgradeKnowhow.json", function(err,content) { var job = JSON.parse(content); agentUtils.loadAgent(agent, function (agentError, loadedAgent) { if (agentError) { callback(agentError); } else { server.executionControl.executeJob(loadedAgent, job, function(err, finishedJob) { logger.info("submitted upgrade request"); if(err) { logger.error(err.message); logger.error(err.stack); callback(err); } else { agent.progress=1; agent.status='INSTALLING' agent.message='Upgrading...'; server.agentEventHandler.eventEmitter.emit('agent-update', agent); callback(undefined, finishedJob); } }, function(err, finishedJob) { logger.debug("upgrade callback"); if(err) { //logger.error(err.message); logger.error(finishedJob); loadedAgent.message = 'Upgrade failed. '+finishedJob.message; loadedAgent.status = 'READY'; delete loadedAgent.shellUpgradeAvailable; delete loadedAgent.agentUpgradeAvailable; agentUtils.updateAgent(loadedAgent, function() {}); server.agentEventHandler.eventEmitter.emit('agent-update', loadedAgent); } else { server.agentInstaller.resetAgent(loadedAgent, server.agentEventHandler, server.serverInfo, function(err) { if(err) { //agent.progress=1; //agent.status='ERROR' //agent.message='Upgrade Failed'; //server.agentControl.eventEmitter.emit('agent-update', agent); } else { loadedAgent.message = 'Upgrade complete. Restarting'; loadedAgent.status = 'READY'; agentUtils.updateAgent(loadedAgent, function() {}); server.agentEventHandler.eventEmitter.emit('agent-update', loadedAgent); agentUtils.updateAgent(loadedAgent, function() {}); } }); } } ); } }); }); } var upgradeAgentViaTarBall = function(agent, server, callback) { fileControl.load("InternalRepo:///jobs/knowhow/upgradeKnowhow.json", function(err,content) { var job = JSON.parse(content); agentUtils.loadAgent(agent, function (agentError, loadedAgent) { if (agentError) { callback(agentError); } else { server.executionControl.executeJob(loadedAgent, job, function(err, finishedJob) { logger.info("submitted upgrade request"); if(err) { logger.error(err.message); logger.error(err.stack); callback(err); } else { agent.progress=1; agent.status='INSTALLING' agent.message='Upgrading...'; server.agentEventHandler.eventEmitter.emit('agent-update', agent); callback(undefined, finishedJob); } }, function(err, finishedJob) { logger.debug("upgrade callback"); if(err) { //logger.error(err.message); logger.error(finishedJob); loadedAgent.message = 'Upgrade failed. '+finishedJob.message; loadedAgent.status = 'READY'; delete loadedAgent.shellUpgradeAvailable; delete loadedAgent.agentUpgradeAvailable; agentUtils.updateAgent(loadedAgent, function() {}); server.agentEventHandler.eventEmitter.emit('agent-update', loadedAgent); } else { server.agentInstaller.resetAgent(loadedAgent, server.agentEventHandler, server.serverInfo, function(err) { if(err) { //agent.progress=1; //agent.status='ERROR' //agent.message='Upgrade Failed'; //server.agentControl.eventEmitter.emit('agent-update', agent); } else { loadedAgent.message = 'Upgrade complete. Restarting'; loadedAgent.status = 'READY'; agentUtils.updateAgent(loadedAgent, function() {}); server.agentEventHandler.eventEmitter.emit('agent-update', loadedAgent); agentUtils.updateAgent(loadedAgent, function() {}); } }); } } ); } }); }); } /** * Upgrades all agents */ var upgradeAllAgents = function(server, callback) { agentUtils.listAgents(server.serverInfo, function (err, agents) { if (err) { callback(err); } else { async.each(agents, function(agent, cb) { if (agent.status=="READY" &&(agent.agentUpgradeAvailable || agent.shellUpgradeAvailable)) { upgradeAgent(agent,server,cb); } else { cb(); } }, function(err) { callback(err); }); } }); } /** * Exposed API call to upgrade this server to the latest version in npm */ var upgradeServerAPI = function(req, res) { var sudoPwd = req.body.sudoPwd; upgradeServer(sudoPwd, function(err) { if (err) { res.status(500).send({message: err.message, stack: err.stack}) } else { res.json({"message": "upgrade complete - restarting server"}); } }); } /** * API call to upgrade an agent */ var upgradeAgentAPI = function(req, res) { upgradeAgent(req.body.agent, this.server, function (err) { if(err) { res.send(500, err); } else { res.json({"message": "processing upgrade"}); } }); } /** * API call to upgrade all agents on a knowhow server */ var upgradeAllAgentsAPI = function(req, res) { upgradeAllAgents(this.server, function(err) { if(err) { res.send(500, err); } else { res.json({"message": "all agents upgraded"}); } }); } var UpgradeControl = function(server) { var self = this; self.server = server; self.upgradeServerAPI=upgradeServerAPI.bind({server: self.server}); self.upgradeAgentAPI=upgradeAgentAPI.bind({server: self.server}); self.upgradeAllAgentsAPI = upgradeAllAgentsAPI.bind({server: self.server}); self.getInstalledVersions = getInstalledVersions; self.getNewestVersions = getNewestVersions; self.upgradeServer = upgradeServer; self.upgradeAgent = upgradeAgent; self.upgradeAllAgents = upgradeAllAgents; return self; } module.exports = UpgradeControl;