add worker and notification service

This commit is contained in:
Jurgis Sakalauskas
2024-04-26 14:41:12 +03:00
parent 340a12b85b
commit 44c70607e0
5 changed files with 149 additions and 86 deletions
+18 -86
View File
@@ -1,90 +1,22 @@
import { Transmission } from './transmission';
import { DockerContainer } from './docker';
import { setPortFlow } from './set-port-flow';
import { settings } from './settings';
main().then(() => console.log('All done')).catch(console.error);
const isWorker = process.argv[2] === 'worker';
async function main() {
console.log('Starting');
const transmissionClient = new Transmission(settings.transmission);
const transmissionContainer = new DockerContainer(
settings.dockerTransmission.service,
settings.dockerTransmission.cwd,
settings.dockerTransmission.serviceName
);
const containerState = await transmissionContainer.getState();
if (containerState?.state !== 'running') {
console.log('Transmission service is not running');
return;
}
console.log(`Gathering info`);
const port = await transmissionClient.getPort();
console.log(`Port: ${port}`);
const portOpen = await transmissionClient.testPortIfOpen();
console.log(`Port is open: ${portOpen}`);
const defaultInterface = await transmissionContainer.getDefaultInterface();
console.log(`Default interface: ${defaultInterface?.interface} Internal ip: ${defaultInterface?.ip}`);
const ipInfo = await transmissionContainer.getIpInfo();
console.log(`External ip: ${ipInfo?.ip} Country: ${ipInfo?.country}`);
if (!defaultInterface || !ipInfo) {
console.log('Could not get default interface or ip info. Shutting down transmission service');
await transmissionContainer.down();
return;
}
const countryOK = !settings.disallowedCountries.some((country) => ipInfo.country.includes(country));
const internalIpOK = !settings.disallowedIntIps.some((ip) => defaultInterface.ip.includes(ip));
const externalIpOK = !settings.disallowedExtIps.some((ip) => ipInfo.ip.includes(ip));
const interfaceOK = settings.allowedInterfaces.some((inter) => defaultInterface.interface.includes(inter));
console.log(`Country OK: ${countryOK} Internal IP OK: ${internalIpOK} External IP OK: ${externalIpOK} Interface OK: ${interfaceOK}`);
if (!countryOK || !internalIpOK || !externalIpOK || !interfaceOK) {
console.log('Shutting down transmission service');
await transmissionContainer.down();
return;
}
if (portOpen) {
console.log(`Port ${port} is open`);
return;
}
console.log(`Port ${port} is not open. Fetching new port.`);
//fetch new port
const request = await fetch(`https://connect.pvdatanet.com/v3/Api/port?ip[]=${defaultInterface.ip}`)
const data = await request.json() as {status: string, supported: boolean}
console.log(`Data received: ${JSON.stringify(data)}`);
if (!data.status || !data.supported) {
console.log('Could not fetch new port. Shutting down transmission service');
await transmissionContainer.down();
return;
}
const newPort= Number(data.status.split(" ")[1]);
if (!newPort) {
console.log('Could not parse new port Shutting down transmission service');
await transmissionContainer.down();
return;
}
console.log(`Setting port to ${newPort}`);
await transmissionClient.setPort(newPort);
console.log('Port set');
const newPortOpen = await transmissionClient.testPortIfOpen();
console.log(`Port ${newPort} is open: ${newPortOpen}`);
if (!newPortOpen) {
console.log('Port is not open, Shutting down transmission service');
await transmissionContainer.down();
return;
}
if (isWorker) {
//initial timeout is in case of a crash to not flood everything
console.log(`Starting worker, first check in ${settings.updateIntervalMs/1000}s`);
setTimeout(worker, settings.updateIntervalMs);
} else {
setPortFlow()
.then(() => console.log('All done'))
.catch(console.error);
}
//todo - store some state in a file (in case of crash/restart)?
function worker() {
setPortFlow()
.then(() => console.log('All done'))
.catch(console.error)
.finally(() => setTimeout(worker, settings.updateIntervalMs));
}