cna-monitor
Version:
监控域名/IP地址是否可达,并记录可访问性
126 lines (124 loc) • 5.83 kB
JavaScript
(async function () {
const log = require('../log');
try {
require('../proto/string');
require('../proto/date');
require('../proto/array');
const _comm = require('../comm');
const path = require('path');
const fs = require('fs');
const netping = require('net-ping');
const netpingsession = netping.createSession({
packetSize: 16,
timeout: 3000,
});
const ping = _comm.promisify(netpingsession.pingHost, netpingsession);
const configFile = path.join(__dirname, '../../config/config');
const keysFile = path.join(__dirname, '../../config/keys');
const timeFile = path.join(__dirname, '../../config/time');
// const keys = JSON.parse(fs.readFileSync(keysFile).toString().decrypt());
const outFile = path.join(__dirname, '../../out/result');
let emailHelp;
const emailFile = path.join(__dirname, '../../config/email');
if (fs.existsSync(emailFile)) {
const emailConfig = JSON.parse(fs.readFileSync(emailFile).toString().decrypt());
const emailComm = require('../email');
emailHelp = new emailComm(emailConfig);
}
const defaultConfig = require('../../default/config');
let config;
if (fs.existsSync(configFile)) {
config = JSON.parse(fs.readFileSync(configFile).toString().decrypt());
} else {
config = defaultConfig;
}
let keys = [];
if (fs.existsSync(keysFile)) {
keys = JSON.parse(fs.readFileSync(keysFile).toString().decrypt());
}
if (keys && keys.length) {
while (true) {
let out = [];
if (fs.existsSync(outFile)) {
const stats = fs.statSync(outFile);
if (stats.size >= (config.m || 1) * 1024 * 1024) {
fs.unlinkSync(outFile);
} else {
// out = JSON.parse(fs.readFileSync(outFile).toString().decrypt());
const text = fs.readFileSync(outFile).toString().split('\r\n');
text.forEach(item => {
if (item) {
out.push(JSON.parse(item.decrypt()));
}
});
}
}
for (const k of keys) {
let result = {};
try {
await ping(k.target);
result = {
time: new Date().format(),
target: k.target,
alias: k.alias || "",
status: '上线'
};
k.time = new Date().format();
k.status = '在线';
} catch (e) {
result = {
time: new Date().format(),
target: k.target,
alias: k.alias || "",
status: '下线',
message: e.message
};
k.time = new Date().format();
k.status = '离线';
}
console.info("ping:", result);
let exists = out.find(item => item.target == k.target);
if (!exists) {
fs.writeFileSync(keysFile, JSON.stringify(keys).encrypt());
out.insert(result);
if (emailHelp && config.n) {
try {
let ip = _comm.getLocalIp();
await emailHelp.send(config.n, `监听到目标变化(来自:${ip || "未知地址"})`, `时间:${result.time}<br>目标:${result.target}${result.alias ? `(${result.alias})` : ""}<br>状态:${result.status}<br>消息:${result.message || ""}`);
} catch (e) {
log.error('邮件发送失败', e);
}
}
}
else if (exists.status != result.status) {
fs.writeFileSync(keysFile, JSON.stringify(keys).encrypt());
out.insert(result);
if (emailHelp && config.n) {
try {
let ip = _comm.getLocalIp();
await emailHelp.send(config.n, `监听到目标变化(来自:${ip || "未知地址"})`, `时间:${result.time}<br>目标:${result.target}${result.alias ? `(${result.alias})` : ""}<br>状态:${result.status}<br>消息:${result.message || ""}`);
} catch (e) {
log.error('邮件发送失败', e);
}
}
}
}
// fs.writeFileSync(outFile, JSON.stringify(out).encrypt());
const r = [];
out.forEach(item => {
r.push(JSON.stringify(item).encrypt())
});
fs.writeFileSync(outFile, r.join('\r\n'));
fs.writeFileSync(timeFile, new Date().valueOf().toString().encrypt());
await _comm.sleep(config.t ? parseInt(config.t) * 60 * 1000 : 1 * 60 * 1000);
}
} else {
if (fs.existsSync(timeFile)) {
fs.unlinkSync(timeFile);
}
}
} catch (e) {
log.error("运行失败", e);
throw e;
}
})();