cloud-log-collector
Version:
Collect log from mutiple servers
197 lines (131 loc) • 4.86 kB
JavaScript
var WebSocketServer = require('websocket').server;
var https = require('https');
var fs = require('fs');
const path = require('path');
var crypto = require('crypto');
// Load config
var conf=JSON.parse(fs.readFileSync('/etc/clc/server.conf'));
// random function
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var secretkeyandfolderdestinationok={};
setTimeout(function() {
secretkeyandfolderdestinationok={};
}, getRandomInt(0, 60*60*1000));
// log
function logClient (data) {
try {
fs.appendFileSync('/var/clclog/server.log', (new Date()) + " - server - " + data + "\n");
} catch (err) {
console.log(err);
}
}
logClient('Server start');
var server = https.createServer({
key: fs.readFileSync(conf['server']['ssl']['key']),
cert: fs.readFileSync(conf['server']['ssl']['certificate'])
},function(request, response) {
logClient('Received request for ' + request.url);
response.writeHead(404);
response.end();
});
server.listen(conf['server']['port'], function() {
logClient('Server is listening on port '+conf['server']['port']);
});
wsServer = new WebSocketServer({
httpServer: server
});
wsServer.on('request', function(request) {
/*
if (!originIsAllowed(request.origin)) {
// Make sure we only accept requests from an allowed origin
request.reject();
logClient('Connection from origin ' + request.origin + ' rejected.');
return;
}
*/
var connection = request.accept('echo-protocol', request.origin);
logClient(''+connection.remoteAddress+' - Connection accepted');
connection.on('message', function(message) {
if (message.type === 'utf8') {
if (message.utf8Data=="ping") {
connection.sendUTF("pong");
return;
}
if (message.utf8Data=="pong")
return;
try{
var data=JSON.parse(message.utf8Data);
if ('magic_salt' in conf['server']['tokens'])
if ('magic_hash' in conf['server']['tokens'])
if ('magickey' in data)
if ('hostname' in data) {
if (!(/^[a-zA-Z0-9.\-_]+$/g.test(data['hostname']))) {
connection.sendUTF(JSON.stringify({'error':'bad char in hostname'}));
logClient(''+connection.remoteAddress+' - error magic token bad char in hostname');
return;
}
var hash = crypto.createHash('sha512');
data2 = hash.update(conf['server']['tokens']['magic_salt']+data['magickey'], 'utf-8');
gen_hash= data2.digest('hex');
if (conf['server']['tokens']['magic_hash']!=gen_hash) {
connection.sendUTF(JSON.stringify({'error':'bad magic token'}));
logClient(''+connection.remoteAddress+' - error magic token bad magic token');
return;
}
stopnow=false;
try{
var to = require('child_process').execSync('cloud-log-collector-client-key-new '+data['hostname']).toString();
} catch(err) {
logClient(''+connection.remoteAddress+' - error magic token cant create token');
connection.sendUTF(JSON.stringify({'error':'cant create token'}));
stopnow=true;
}
if (stopnow) return;
connection.sendUTF(JSON.stringify({'token':to}));
logClient(''+connection.remoteAddress+' - new token from magic token');
return;
}
if (!(data['file']+"?"+data['SecretClientKey'] in secretkeyandfolderdestinationok)) {
filename=data['file'];
filename=filename.replace('..', '');
filename=filename.replace('~', '');
filename=filename;
if (!(/^[a-zA-Z0-9\/.\-_]+$/g.test(filename))) {
connection.sendUTF(JSON.stringify({'error':'bad char in folder name'}));
logClient('error - '+connection.remoteAddress+' - bad char in folder name');
return;
}
var hash = crypto.createHash('sha512');
data2 = hash.update(data['SecretClientKey'], 'utf-8');
gen_hash= data2.digest('hex');
var current_hostname="";
stopnow=false;
if (fs.existsSync(conf['server']['tokens']['path']+"/"+gen_hash)) {
current_hostname=fs.readFileSync(conf['server']['tokens']['path']+"/"+gen_hash, 'utf8');
} else {
connection.sendUTF(JSON.stringify({'error':'bad token'}));
logClient('error - '+connection.remoteAddress+' - bad token');
connection.close();
return;
}
secretkeyandfolderdestinationok[data['file']+"?"+data['SecretClientKey']]=conf['server']['data']['path']+"/"+current_hostname+"/"+filename;
fs.mkdirSync(path.dirname(secretkeyandfolderdestinationok[data['file']+"?"+data['SecretClientKey']]), { recursive: true });
}
fs.appendFileSync(secretkeyandfolderdestinationok[data['file']+"?"+data['SecretClientKey']],data['data']+"\n");
} catch (err) {
console.log(err);
secretkeyandfolderdestinationok={};
logClient('Error whith input message : ' + JSON.stringify(err).toString());
}
// logClient('Received Message: ' + message.utf8Data);
}
});
connection.on('close', function(reasonCode, description) {
logClient('Peer ' + connection.remoteAddress + ' disconnected.');
});
});