From 1772b383de490cf406fe93ef3aa3a941f6db513c Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 21 Apr 2023 15:05:27 +0200 Subject: Add peertube runner cli --- packages/peertube-runner/shared/ipc/index.ts | 2 + packages/peertube-runner/shared/ipc/ipc-client.ts | 74 ++++++++++++++++++++++ packages/peertube-runner/shared/ipc/ipc-server.ts | 61 ++++++++++++++++++ .../peertube-runner/shared/ipc/shared/index.ts | 2 + .../shared/ipc/shared/ipc-request.model.ts | 15 +++++ .../shared/ipc/shared/ipc-response.model.ts | 15 +++++ 6 files changed, 169 insertions(+) create mode 100644 packages/peertube-runner/shared/ipc/index.ts create mode 100644 packages/peertube-runner/shared/ipc/ipc-client.ts create mode 100644 packages/peertube-runner/shared/ipc/ipc-server.ts create mode 100644 packages/peertube-runner/shared/ipc/shared/index.ts create mode 100644 packages/peertube-runner/shared/ipc/shared/ipc-request.model.ts create mode 100644 packages/peertube-runner/shared/ipc/shared/ipc-response.model.ts (limited to 'packages/peertube-runner/shared/ipc') diff --git a/packages/peertube-runner/shared/ipc/index.ts b/packages/peertube-runner/shared/ipc/index.ts new file mode 100644 index 000000000..ad4590281 --- /dev/null +++ b/packages/peertube-runner/shared/ipc/index.ts @@ -0,0 +1,2 @@ +export * from './ipc-client' +export * from './ipc-server' diff --git a/packages/peertube-runner/shared/ipc/ipc-client.ts b/packages/peertube-runner/shared/ipc/ipc-client.ts new file mode 100644 index 000000000..7f5951157 --- /dev/null +++ b/packages/peertube-runner/shared/ipc/ipc-client.ts @@ -0,0 +1,74 @@ +import CliTable3 from 'cli-table3' +import { ensureDir } from 'fs-extra' +import { Client as NetIPC } from 'net-ipc' +import { ConfigManager } from '../config-manager' +import { IPCReponse, IPCReponseData, IPCRequest } from './shared' + +export class IPCClient { + private netIPC: NetIPC + + async run () { + await ensureDir(ConfigManager.Instance.getSocketDirectory()) + + const socketPath = ConfigManager.Instance.getSocketPath() + this.netIPC = new NetIPC({ path: socketPath }) + await this.netIPC.connect() + } + + async askRegister (options: { + url: string + registrationToken: string + runnerName: string + runnerDescription?: string + }) { + const req: IPCRequest = { + type: 'register', + ...options + } + + const { success, error } = await this.netIPC.request(req) as IPCReponse + + if (success) console.log('PeerTube instance registered') + else console.error('Could not register PeerTube instance on runner server side', error) + } + + async askUnregister (options: { + url: string + }) { + const req: IPCRequest = { + type: 'unregister', + ...options + } + + const { success, error } = await this.netIPC.request(req) as IPCReponse + + if (success) console.log('PeerTube instance unregistered') + else console.error('Could not unregister PeerTube instance on runner server side', error) + } + + async askListRegistered () { + const req: IPCRequest = { + type: 'list-registered' + } + + const { success, error, data } = await this.netIPC.request(req) as IPCReponse + if (!success) { + console.error('Could not list registered PeerTube instances', error) + return + } + + const table = new CliTable3({ + head: [ 'instance', 'runner name', 'runner description' ] + }) + + for (const server of data.servers) { + table.push([ server.url, server.runnerName, server.runnerDescription ]) + } + + console.log(table.toString()) + } + + stop () { + this.netIPC.destroy() + } +} diff --git a/packages/peertube-runner/shared/ipc/ipc-server.ts b/packages/peertube-runner/shared/ipc/ipc-server.ts new file mode 100644 index 000000000..bc340198b --- /dev/null +++ b/packages/peertube-runner/shared/ipc/ipc-server.ts @@ -0,0 +1,61 @@ +import { ensureDir } from 'fs-extra' +import { Server as NetIPC } from 'net-ipc' +import { pick } from '@shared/core-utils' +import { RunnerServer } from '../../server' +import { ConfigManager } from '../config-manager' +import { logger } from '../logger' +import { IPCReponse, IPCReponseData, IPCRequest } from './shared' + +export class IPCServer { + private netIPC: NetIPC + private runnerServer: RunnerServer + + async run (runnerServer: RunnerServer) { + this.runnerServer = runnerServer + + await ensureDir(ConfigManager.Instance.getSocketDirectory()) + + const socketPath = ConfigManager.Instance.getSocketPath() + this.netIPC = new NetIPC({ path: socketPath }) + await this.netIPC.start() + + logger.info(`IPC socket created on ${socketPath}`) + + this.netIPC.on('request', async (req: IPCRequest, res) => { + try { + const data = await this.process(req) + + this.sendReponse(res, { success: true, data }) + } catch (err) { + console.error('Cannot execute RPC call', err) + this.sendReponse(res, { success: false, error: err.message }) + } + }) + } + + private async process (req: IPCRequest) { + switch (req.type) { + case 'register': + await this.runnerServer.registerRunner(pick(req, [ 'url', 'registrationToken', 'runnerName', 'runnerDescription' ])) + return undefined + + case 'unregister': + await this.runnerServer.unregisterRunner({ url: req.url }) + return undefined + + case 'list-registered': + return Promise.resolve(this.runnerServer.listRegistered()) + + default: + throw new Error('Unknown RPC call ' + (req as any).type) + } + } + + private sendReponse ( + response: (data: any) => Promise, + body: IPCReponse + ) { + response(body) + .catch(err => console.error('Cannot send response after IPC request', err)) + } +} diff --git a/packages/peertube-runner/shared/ipc/shared/index.ts b/packages/peertube-runner/shared/ipc/shared/index.ts new file mode 100644 index 000000000..deaaa152e --- /dev/null +++ b/packages/peertube-runner/shared/ipc/shared/index.ts @@ -0,0 +1,2 @@ +export * from './ipc-request.model' +export * from './ipc-response.model' diff --git a/packages/peertube-runner/shared/ipc/shared/ipc-request.model.ts b/packages/peertube-runner/shared/ipc/shared/ipc-request.model.ts new file mode 100644 index 000000000..0f733cdfe --- /dev/null +++ b/packages/peertube-runner/shared/ipc/shared/ipc-request.model.ts @@ -0,0 +1,15 @@ +export type IPCRequest = + IPCRequestRegister | + IPCRequestUnregister | + IPCRequestListRegistered + +export type IPCRequestRegister = { + type: 'register' + url: string + registrationToken: string + runnerName: string + runnerDescription?: string +} + +export type IPCRequestUnregister = { type: 'unregister', url: string } +export type IPCRequestListRegistered = { type: 'list-registered' } diff --git a/packages/peertube-runner/shared/ipc/shared/ipc-response.model.ts b/packages/peertube-runner/shared/ipc/shared/ipc-response.model.ts new file mode 100644 index 000000000..689d6e09a --- /dev/null +++ b/packages/peertube-runner/shared/ipc/shared/ipc-response.model.ts @@ -0,0 +1,15 @@ +export type IPCReponse = { + success: boolean + error?: string + data?: T +} + +export type IPCReponseData = + // list registered + { + servers: { + runnerName: string + runnerDescription: string + url: string + }[] + } -- cgit v1.2.3