const schedule = require('node-schedule') const { clientPort } = require('../config') const { readHostList, sendEmailToConfList, getNotifySwByType, formatTimestamp, isProd } = require('../utils') const testConnectAsync = require('../utils/test-connect') let sendNotifyRecord = new Map() const offlineJob = () => { let sw = getNotifySwByType('host_offline') if(!sw) return consola.info('=====开始检测服务器状态=====', new Date()) for (const item of readHostList()) { const { host, name } = item // consola.info('start inpect:', host, name ) testConnectAsync({ port: clientPort , host: `http://${ host }`, timeout: 3000, retryTimes: 20 // 尝试重连次数 }) .then(() => { // consola.success('测试连接成功:', host, name) }) .catch((error) => { consola.error('测试连接失败: ', host, name) // 当前小时是否发送过通知 let curHourIsSend = sendNotifyRecord.has(host) && (sendNotifyRecord.get(host).sendTime === formatTimestamp(Date.now(), 'hour')) if(curHourIsSend) return consola.info('当前小时已发送过通知: ', sendNotifyRecord.get(host).sendTime) sendEmailToConfList('服务器离线提醒', `别名: ${ name }
IP: ${ host }
错误信息:${ error.message }`) .then(() => { sendNotifyRecord.set(host, { 'sendTime': formatTimestamp(Date.now(), 'hour') }) }) }) } } module.exports = () => { if(!isProd()) return consola.info('本地开发不检测服务器离线状态') schedule.scheduleJob('0 0/5 12 1/1 * ?', offlineJob) }