add daily check-in, kv storage

This commit is contained in:
Jurgis Sakalauskas
2024-04-26 17:00:02 +03:00
parent 44c70607e0
commit 65763d4a33
3 changed files with 85 additions and 1 deletions
+26
View File
@@ -0,0 +1,26 @@
import { kvDataStorage } from './kv-data-storage';
import { notificationService } from './notification';
export async function dailyCheckIn() {
const lastCheckIn = kvDataStorage.get<number>('lastCheckIn');
if (lastCheckIn && Date.now() - lastCheckIn < 1000 * 60 * 60 * 23) {
return;
}
//get stats
const lastCheckInMessage = new Date(lastCheckIn || Date.now()).toLocaleString('lt-LT');
const numPortsChanged = kvDataStorage.get<number>('numPortsChanged') || 0;
const numRuns = kvDataStorage.get<number>('numRuns') || 0;
const isServiceRunning = kvDataStorage.get<boolean>('isServiceRunning') || false;
const lastRun = kvDataStorage.get<number>('lastRun');
let lastRunMessage = 'never';
if (lastRun) {
lastRunMessage = new Date(lastRun).toLocaleString('lt-LT');
}
//reset data
await kvDataStorage.set({ lastCheckIn: Date.now() , numPortsChanged: 0, numRuns: 0 });
const message = `Daily check-in. Last check-in: ${lastCheckInMessage}. Number of ports changed: ${numPortsChanged}. Number of checks: ${numRuns}. Service running: ${isServiceRunning}. Last run: ${lastRunMessage}`;
await notificationService.sendNotification(message);
}
+39
View File
@@ -0,0 +1,39 @@
import { writeFile } from 'fs/promises';
import { join } from 'path';
import { existsSync, readFileSync } from 'fs';
class KeyValueDataStorage {
private readonly data: Record<string, unknown> = {};
private readonly filePath: string;
constructor() {
this.filePath = join(__dirname, 'kv-data.json');
this.data = {};
if (existsSync(this.filePath)) {
try {
const rawData = readFileSync(this.filePath);
this.data = JSON.parse(rawData.toString());
} catch (e) {
this.data = {};
}
}
}
get<T>(key: string): T | null {
if (this.data[key]) {
return this.data[key] as T;
}
return null;
}
async set(data: Record<string, unknown>): Promise<void> {
Object.keys(data).forEach((key) => {
this.data[key] = data[key];
});
await writeFile(this.filePath, JSON.stringify(this.data, null, 2));
}
}
export const kvDataStorage = new KeyValueDataStorage();
+20 -1
View File
@@ -2,28 +2,44 @@ import { Transmission } from './transmission';
import { DockerContainer } from './docker'; import { DockerContainer } from './docker';
import { settings } from './settings'; import { settings } from './settings';
import { notificationService } from './notification'; import { notificationService } from './notification';
import { kvDataStorage } from './kv-data-storage';
import { dailyCheckIn } from './check-in';
async function downTransmission(transmissionContainer: DockerContainer, reason: string) { async function downTransmission(transmissionContainer: DockerContainer, reason: string) {
console.log(reason); console.log(reason);
await kvDataStorage.set({ isServiceRunning: false });
await notificationService.sendNotification(reason, true); await notificationService.sendNotification(reason, true);
return await transmissionContainer.down(); return await transmissionContainer.down();
} }
export async function setPortFlow() { export async function setPortFlow() {
console.log('Starting set port flow');
const transmissionClient = new Transmission(settings.transmission); const transmissionClient = new Transmission(settings.transmission);
const transmissionContainer = new DockerContainer( const transmissionContainer = new DockerContainer(
settings.dockerTransmission.service, settings.dockerTransmission.service,
settings.dockerTransmission.cwd, settings.dockerTransmission.cwd,
settings.dockerTransmission.serviceName settings.dockerTransmission.serviceName
); );
try {
await doSetPortFlow(transmissionClient, transmissionContainer);
} catch (e) {
console.error('Error in set port flow', e);
await downTransmission(transmissionContainer, `Shutting down: error in set port flow.`);
}
await dailyCheckIn();
}
async function doSetPortFlow(transmissionClient: Transmission, transmissionContainer: DockerContainer) {
console.log('Starting set port flow');
const containerState = await transmissionContainer.getState(); const containerState = await transmissionContainer.getState();
if (containerState?.state !== 'running') { if (containerState?.state !== 'running') {
console.log('Transmission service is not running'); console.log('Transmission service is not running');
await kvDataStorage.set({ isServiceRunning: false });
return; return;
} }
const numRuns = kvDataStorage.get<number>('numRuns') || 0;
await kvDataStorage.set({ isServiceRunning: true, numRuns: numRuns + 1, lastRun: Date.now() });
console.log(`Gathering info`); console.log(`Gathering info`);
const port = await transmissionClient.getPort(); const port = await transmissionClient.getPort();
@@ -88,6 +104,9 @@ export async function setPortFlow() {
console.log(`Setting port to ${newPort}`); console.log(`Setting port to ${newPort}`);
await transmissionClient.setPort(newPort); await transmissionClient.setPort(newPort);
const numPortsChanged = kvDataStorage.get<number>('numPortsChanged') || 0;
await kvDataStorage.set({ numPortsChanged: numPortsChanged + 1 });
console.log('Port set'); console.log('Port set');
const newPortOpen = await transmissionClient.testPortIfOpen(); const newPortOpen = await transmissionClient.testPortIfOpen();
console.log(`Port ${newPort} is open: ${newPortOpen}`); console.log(`Port ${newPort} is open: ${newPortOpen}`);