UNPKG

stalker-server

Version:

A static server with realtime log parser

104 lines (92 loc) 2.87 kB
var URL = require('url'); var fs = require('fs'); var overviewMap = {}; var curDateTime; var curHour = new Date().getHours(); var stream; //用于统计overview信息 exports.task = function(data, options) { options = options || {}; var query = data.query; var overview = overviewMap[query.type] = overviewMap[query.type] || {}; var pid = query.id; if (pid) { overview[pid] = overview[pid] || { count: 0 }; overview[pid].count++; var isp = data.isp; var province = data.province; if (isp) { overview[pid].isp = overview[pid].isp || {}; overview[pid].isp[isp] = overview[pid].isp[isp] || 0; overview[pid].isp[isp]++; } if (province > 0) { overview[pid].province = overview[pid].province || {}; overview[pid].province[province] = overview[pid].province[province] || 0; overview[pid].province[province]++; } var now = new Date(); var dateTime = '.' + now.getFullYear() + (now.getMonth() + 1); if (curDateTime !== dateTime) { //每月一个文件 var access_log = (options.filePath || './logs/hijack') + '.overview' + dateTime; stream && stream.end(); //新开一个steam stream = fs.createWriteStream(access_log, { flags: 'a', encoding: 'utf8' }); curDateTime = dateTime; } if (curHour !== now.getHours() && stream) { dateTime = dateTime.slice(1); var result = dateTime + now.getDate() + now.getHours() + '='; result += JSON.stringify(overviewMap) + '\n'; stream.write(result); overviewMap[query.type] = {}; curHour = now.getHours(); } } if (query.type == 0) { return; } //处理劫持url的host if (query.files) { try { var content = decodeURIComponent(query.files); } catch (e) { content = query.files; } data.content = content; content = content.split(','); var unique = {}; var hostArr = content.map(function(v) { v = v.trim(); if (!v) { return ''; } try { var a = URL.parse(v); } catch (e) { return ''; } var host = a.hostname; if (unique[host]) { return ''; } else { unique[host] = 1; return host; } }).filter(function(v) { return v; }); data.host1 = hostArr[0]; data.host2 = hostArr[1]; } else { data.host1 = ''; data.host2 = ''; } return data; }