You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
2.1 KiB

// reeeper/cron/expire-crashed-hosts.js
// Copyright (C) 2022 DTP Technologies, LLC
// License: Apache-2.0
'use strict';
const path = require('path');
const mongoose = require('mongoose');
const NetHost = mongoose.model('NetHost');
const { CronJob } = require('cron');
const { SiteWorkerProcess } = require(path.join(__dirname, '..', '..', '..', '..', 'lib', 'site-lib'));
/**
* Hosts on the DTP network register themselves and periodically report various
* metrics. They clean up after themselves when exiting gracefully. But, hosts
* lose power or get un-plugged or get caught in a sharknado or whatever.
*
* When that happens, the Reeeper ensures those hosts don't become Night of the
* Living Dead.
*
* That is the formal technical explanation of what's going on in here. We're
* preventing DTP host processes from becoming The Night of the Living Dead.
*/
class CrashedHostsCron extends SiteWorkerProcess {
static get COMPONENT ( ) {
return {
logId: 'wrk:reeeper:crashed-hosts:cron',
index: 'crashedHostsCron',
className: 'CrashedHostsCron',
};
}
constructor (worker) {
super(worker, CrashedHostsCron.COMPONENT);
}
async start ( ) {
await super.start();
await this.expireCrashedHosts(); // first-run the expirations
this.job = new CronJob(
'*/5 * * * * *',
this.expireCrashedHosts.bind(this),
null,
true,
process.env.DTP_CRON_TIMEZONE || 'America/New_York',
);
}
async stop ( ) {
if (this.job) {
this.log.info('stopping host expire job');
this.job.stop();
delete this.job;
}
await super.stop();
}
async expireCrashedHosts ( ) {
try {
await NetHost
.find({ status: 'crashed' })
.select('_id hostname')
.lean()
.cursor()
.eachAsync(async (host) => {
this.log.info('deactivating crashed host', { hostname: host.hostname });
await NetHost.updateOne({ _id: host._id }, { $set: { status: 'inactive' } });
});
} catch (error) {
this.log.error('failed to expire crashed hosts', { error });
}
}
}
module.exports = CrashedHostsCron;