peertube-plugin-livechat/server/lib/prosody/ctl.ts

141 lines
3.9 KiB
TypeScript
Raw Normal View History

2021-04-14 13:26:00 +00:00
import { getProsodyFilePaths, writeProsodyConfig } from './config'
import * as fs from 'fs'
import * as util from 'util'
2021-04-14 14:14:56 +00:00
import * as child_process from 'child_process'
2021-04-13 15:13:41 +00:00
2021-04-14 14:14:56 +00:00
const exec = util.promisify(child_process.exec)
2021-04-14 13:26:00 +00:00
interface ProsodyRunning {
2021-04-13 16:00:45 +00:00
ok: boolean
messages: string[]
}
2021-04-14 14:14:56 +00:00
async function prosodyCtl (options: RegisterServerOptions, command: string): Promise<string> {
const filePaths = await getProsodyFilePaths(options)
if (!/^\w+$/.test(command)) {
throw new Error(`Invalid prosodyctl command '${command}'`)
}
return new Promise((resolve, reject) => {
let d: string = ''
let e: string = ''
const spawned = child_process.spawn('prosodyctl', [
'--config',
filePaths.config,
command
], {
cwd: filePaths.dir,
env: {
...process.env,
PROSODY_CONFIG: filePaths.config
}
})
spawned.stdout.on('data', (data) => {
d += data as string
})
spawned.stderr.on('data', (data) => {
options.peertubeHelpers.logger.error(`Spawned command ${command} has errors: ${data as string}`)
e += data as string
})
spawned.on('close', (code) => {
if (code !== 0) {
reject(e)
} else {
resolve(d)
}
})
})
}
async function getProsodyAbout (options: RegisterServerOptions): Promise<string> {
return prosodyCtl(options, 'about')
}
2021-04-14 13:26:00 +00:00
async function testProsodyRunning (options: RegisterServerOptions): Promise<ProsodyRunning> {
2021-04-13 15:13:41 +00:00
const { peertubeHelpers } = options
2021-04-14 13:26:00 +00:00
peertubeHelpers.logger.info('Checking if Prosody is running')
const result: ProsodyRunning = {
2021-04-13 16:00:45 +00:00
ok: false,
messages: []
}
2021-04-14 13:26:00 +00:00
const filePaths = await getProsodyFilePaths(options)
try {
await fs.promises.access(filePaths.pid, fs.constants.R_OK)
2021-04-14 14:14:56 +00:00
result.messages.push(`Pid file ${filePaths.pid} found`)
2021-04-14 13:26:00 +00:00
} catch (error) {
result.messages.push(`Pid file ${filePaths.pid} not found`)
return result
}
result.ok = true
return result
}
async function testProsodyCorrectlyRunning (options: RegisterServerOptions): Promise<ProsodyRunning> {
const { peertubeHelpers } = options
peertubeHelpers.logger.info('Checking if Prosody is correctly running')
const result = await testProsodyRunning(options)
if (!result.ok) { return result }
result.ok = false // more tests to come
2021-04-13 15:13:41 +00:00
// TODO
peertubeHelpers.logger.error('testProsodyCorrectlyRunning not implemented yet.')
2021-04-13 16:00:45 +00:00
return result
2021-04-13 15:13:41 +00:00
}
async function ensureProsodyRunning (options: RegisterServerOptions): Promise<void> {
const { peertubeHelpers, settingsManager } = options
const logger = peertubeHelpers.logger
const setting = await settingsManager.getSetting('chat-use-prosody')
if (!setting) {
logger.info('Prosody is not activated, we wont launch it')
return
}
const r = await testProsodyCorrectlyRunning(options)
2021-04-13 16:00:45 +00:00
if (r.ok) {
2021-04-14 13:26:00 +00:00
r.messages.forEach(m => logger.debug(m))
2021-04-13 15:13:41 +00:00
logger.info('Prosody is already running correctly')
return
}
2021-04-14 13:26:00 +00:00
logger.info('Prosody is not running correctly: ')
r.messages.forEach(m => logger.info(m))
2021-04-13 15:13:41 +00:00
// Shutting down...
await ensureProsodyNotRunning(options)
// writing the configuration file
await writeProsodyConfig(options)
2021-04-14 13:26:00 +00:00
const filePaths = await getProsodyFilePaths(options)
// launch prosody
logger.info('Going to launch prosody...')
await exec('prosody', {
cwd: filePaths.dir,
env: {
...process.env,
PROSODY_CONFIG: filePaths.config
}
})
2021-04-13 15:13:41 +00:00
// TODO: listen for kill signal and kill prosody?
}
async function ensureProsodyNotRunning (options: RegisterServerOptions): Promise<void> {
const { peertubeHelpers } = options
peertubeHelpers.logger.info('Checking if Prosody is running, and shutting it down if so')
// TODO: implement this.
peertubeHelpers.logger.error('ensureProsodyNotRunning not implemented yet.')
}
export {
2021-04-14 14:14:56 +00:00
getProsodyAbout,
2021-04-14 13:26:00 +00:00
testProsodyRunning,
2021-04-13 15:13:41 +00:00
testProsodyCorrectlyRunning,
ensureProsodyRunning,
ensureProsodyNotRunning
}