mirror of
https://github.com/sakaljurgis/pvpn-transmission.git
synced 2026-07-08 20:47:41 +00:00
add daily check-in, kv storage
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
@@ -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
@@ -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}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user