knowhow-server
Version:
A personal workflow engine that can manage and use any network connected host
405 lines (332 loc) • 10.1 kB
JavaScript
var logger=require('./log-control').logger;
var agentInstaller = require('./agent/agent-installer');
var agentUtils = require('./agent/agent-utils');
var fileControl = require('./file-control');
var moment = require('moment');
var server = require('../server');
var fs = require('fs');
var async = require('async');
var username = require('username');
/*
* Serve JSON to our AngularJS client
*/
var startTime = moment().format('MMMM Do YYYY, h:mm:ss a');
var listAgents = function(req, res) {
agentUtils.listAgents(this.serverInfo,function (err, agents) {
if (err) {
res.send(500, err.message);
} else {
res.json(agents);
}
});
};
var usernameVar = "unknown";
var getServerInfo = function(userName, server) {
var os = require("os");
var pjson = require('../package.json');
serverInfo = {
version: pjson.version,
nodeVersion: process.version,
copyright: moment().format('YYYY'),
name: os.hostname(),
started: startTime,
port: server.port,
workingDir: require('process').cwd(),
cryptoKey: 'd6F3Efea',
username: userName
};
return serverInfo;
};
var checkForUpdates = function (req, res) {
require('./upgrade-control')(this.server).getNewestVersions(function(err,versions) {
if (err) {
res.send(500, err.message);
} else {
this.serverInfo.newestVersions = versions;
res.json(versions);
}
});
};
var getServerInfoAPI = function (req, res) {
res.json(this.serverInfo);
};
exports.getServerInfoAPI = getServerInfoAPI;
var fileListForDir = function (req,res) {
var dir = req.query.dir;
fileControl.getDirTree(dir, function(err, tree) {
if (err) {
res.send(500, err.message);
} else {
logger.debug(tree);
res.json( {children : [tree]});
}
});
};
var fileContent = function (req,res) {
var filePath = req.query.file;
var repo = req.query.repo;
fileControl.fileContent(filePath,repo, function(err, headers, fileToRead) {
if(err) {
res.send(500, err.message);
return;
} else {
logger.debug(headers);
res.writeHead(200, headers);
var fileStream = fs.createReadStream(fileToRead);
fileStream.pipe(res);
}
});
};
var addFile = function(req,res) {
try {
var fileName = req.query.fileName;
var path = req.query.path;
var isDirectory = req.query.isDirectory;
var content = decodeURIComponent(req.query.content);
var isEncoded= req.query.isEncoded;
if (isEncoded == "true" && content != undefined) {
content = decodeURIComponent(content);
}
//logger.debug(content);
if (!content) {
content = {};
}
fileControl.addNewFile(path,fileName,content,isDirectory,function(err,newFile) {
if (err) {
res.send(500, err.message);
return;
}
logger.debug(newFile);
res.json(newFile);
});
} catch (err) {
logger.error(err.stack);
res.send(500, err.message);
}
};
var deleteFile = function(req,res) {
var fileName = req.query.fileName;
fileControl.deleteFile(fileName,function(err) {
if (err) {
res.send(500, err.message);
return;
}
res.json({ok:true});
});
};
var saveFile = function(req,res) {
try {
var fileName = req.query.fileName;
var isEncoded= req.query.isEncoded;
var data = req.query.data;
var check = (isEncoded == "true" && data != undefined);
if (isEncoded == "true" && data) {
data = decodeURIComponent(data);
}
fileControl.saveFile(fileName,data,res);
} catch (err) {
logger.error(err.stack);
res.send(500, err.message);
}
};
var addAgent = function (req, res) {
logger.info('add agent: '+req.body.host);
for (i in req.params) {
logger.debug(params[i]);
}
var agent = req.body;
try {
var agentInstaller = require('./agent/agent-installer');
agentInstaller.addAgent(agent, this.agentEventHandler, this.serverInfo, function(err, newAgent) {
if (err) {
logger.error("error adding agent "+err.message);
res.send(500, {"message": err.message});
return;
} else {
logger.info("added agent: "+newAgent.user+"@"+newAgent.host+":"+newAgent.port);
res.json(newAgent);
}
});
} catch (err) {
logger.error(err.message);
logger.error(err.stack);
}
};
var resetAgent = function (req, res) {
logger.info('reset agent: '+req.body.host);
for (i in req.params) {
logger.debug(params[i]);
}
var agent = req.body;
try {
var agentInstaller = require('./agent/agent-installer');
agentInstaller.resetAgent(agent, this.agentEventHandler, this.serverInfo, function(err, newAgent) {
if (err) {
res.send(500, {"message": err.message});
return;
} else {
res.json(newAgent);
}
});
} catch (err) {
logger.error(err.message);
logger.error(err.stack);
res.send(500, {"message": err.message});
}
};
var agentHeartbeat = function(req, res) {
var agent = req.body.agent;
var agentUtils = require('./agent/agent-utils');
agentUtils.heartbeat.bind({agent: agent})(agent, function(err) {
if (!err) {
res.send(200, {"alive": true});
} else {
res.send(500, {"message": err.message});
}
});
};
var waitForAgentStartup = function(req, res) {
var agent = req.body.agent;
var agentInstaller = require('./agent/agent-installer');
agentInstaller.waitForAgentStartup.call({agent: agent}, function(err) {
if (!err) {
res.send(200, {"alive": true});
} else {
res.send(500, {"message": err.message});
}
});
};
var agentEvent = function (req, res) {
logger.info('agent event: '+req.body.host);
for (i in req.params) {
logger.debug(params[i]);
}
var agent = req.body;
this.eventEmitter.emit('agent-update',agent);
res.json({ok:true});
};
var deleteAgent = function (req, res) {
logger.info('delete agent: '+req.body._id);
var agent = req.body;
var agentUtils = require('./agent/agent-utils');
agentUtils.deleteAgent(agent, function(err, numdeleted) {
if (err) {
res.send(500, err);
} else {
agentUtils.listAgents(this.serverInfo, function (err, agents) {
if (err) {
res.send(500, err);
} else {
res.json(agents);
}
});
}
});
//agentInstaller.listAgents(req,res);
};
/**
* returns agent Info based on user@host:port
*/
var getAgentInfo = function(req,res) {
var agent = req.body;
var agentUtils = require('./agent/agent-utils');
agentUtils.loadAgent(agent,function (err, loadedAgent) {
if (err) {
res.send(500, err.message);
} else {
res.json(loadedAgent);
}
});
}
var logs = function(req,res) {
numLogs=req.body.numLogs;
require('./log-control').getLastXLogs(numLogs,res);
};
var execute = function(req,res) {
var agent = req.body.khAgent;
var job = req.body.job;
logger.debug(require('util').inspect(job, {depth:null}));
var agentInstaller = require('./agent/agent-installer');
agentUtils.loadAgent(agent, function (agentError, loadedAgent) {
this.executionControl.executeJob(loadedAgent, job, function(err){
if (err) {
var jobName = "undefined id";
if (job) {
jobName = job.id;
}
logger.error(jobName+" failed to start.");
logger.error(err.message);
logger.error(err.stack);
res.json(500, {"message": err.message} );
return;
} else {
logger.info(job.id+" launched.");
res.json({ok:true});
}
});
}.bind({executionControl: this.executionControl}));
};
var cancelJobAPI = function(req,res) {
if (!req.body) {
res.send(500, new Error("invalid request"));
return;
}
var agent = req.body.khAgent;
var job = req.body.job;
var eventEmitter = this.agentEventHandler.eventEmitter;
var socket = this.agentEventHandler.agentSockets[agent._id].eventSocket;
this.jobControl.cancelJobOnAgent(agent, job, eventEmitter, socket, function(err){
if (err) {
logger.error(job.id+" could not be cancelled.");
logger.error(err);
res.send(500, err);
return;
}
logger.info(job.id+" cancelled.");
res.json({ok:true});
});
};
var repoList = function(req, res) {
res.json(fileControl.repos);
};
var runningJobList = function(req, res) {
this.jobControl.getRunningJobsList(function(runningJobList) {
logger.debug(runningJobList);
res.json(runningJobList);
});
};
var api = function(server, callback) {
this.server = server;
username(function (err, userName) {
this.serverInfo = getServerInfo(userName, server);
require('./upgrade-control')(this.server).getNewestVersions(function(err, versions) {
this.serverInfo.newestVersions = versions;
require('./upgrade-control')(this.server).getInstalledVersions(function(err, versions) {
this.serverInfo.installedVersions = versions;
this.listAgents = listAgents.bind({serverInfo: this.serverInfo});
this.getServerInfoAPI = getServerInfoAPI.bind({serverInfo: this.serverInfo});
this.fileListForDir = fileListForDir;
this.fileContent = fileContent;
this.addFile = addFile;
this.deleteFile = deleteFile;
this.saveFile = saveFile;
this.addAgent = addAgent.bind({serverInfo: this.serverInfo, agentEventHandler: server.agentEventHandler});
this.resetAgent = resetAgent.bind({serverInfo: this.serverInfo, agentEventHandler: server.agentEventHandler});
this.agentEvent = agentEvent;
this.deleteAgent = deleteAgent.bind({serverInfo: this.serverInfo});;
this.getAgentInfo = getAgentInfo;
this.agentHeartbeat = agentHeartbeat;
this.waitForAgentStartup = waitForAgentStartup;
this.logs = logs;
this.execute = execute.bind({agentInstaller: server.agentInstaller, executionControl: server.executionControl});
this.cancelJobAPI = cancelJobAPI.bind({jobControl: server.jobControl, agentEventHandler: server.agentEventHandler});
this.repoList = repoList;
this.runningJobList = runningJobList.bind({jobControl: server.jobControl});;
this.getServerInfoAPI = getServerInfoAPI.bind({serverInfo: this.serverInfo});
this.checkForUpdates = checkForUpdates.bind({serverInfo: this.serverInfo});
callback(undefined,this);
});
});
});
}
module.exports = api;