UNPKG

cloud-log-collector

Version:

Collect log from mutiple servers

197 lines (131 loc) 4.86 kB
#!/usr/bin/env node 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.'); }); });