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

188 lines
6.2 KiB
TypeScript
Raw Normal View History

2021-04-12 18:52:21 +00:00
import * as fs from 'fs'
2021-04-13 15:13:41 +00:00
import * as path from 'path'
import { pluginName, getBaseRouterRoute } from '../helpers'
import { ProsodyFilePaths } from './config/paths'
import { ProsodyConfigContent } from './config/content'
import { getProsodyDomain } from './config/domain'
2021-05-05 15:06:19 +00:00
import { getAPIKey } from '../apikey'
import type { ProsodyLogLevel } from './config/content'
2021-04-12 18:52:21 +00:00
async function _getTemporaryWorkingDir ({ peertubeHelpers, storageManager }: RegisterServerOptions): Promise<string> {
2021-04-12 18:52:21 +00:00
const tmpBaseDir = '/tmp/'
let value: string = await storageManager.getData('tempDirId')
2021-04-13 15:13:41 +00:00
function getPath (value: string): string {
return path.resolve(tmpBaseDir, pluginName + '-' + value)
}
2021-04-12 18:52:21 +00:00
while (!value) {
peertubeHelpers.logger.info('Generating an id for temp dir')
value = Math.random().toString(36).slice(2, 12)
2021-04-13 15:13:41 +00:00
const name = getPath(value)
2021-04-12 18:52:21 +00:00
if (fs.existsSync(name)) {
peertubeHelpers.logger.info('The folder ' + name + ' already exists, generating another name...')
value = ''
continue
}
await storageManager.storeData('tempDirId', value)
}
2021-04-14 15:10:22 +00:00
const dir = getPath(value)
return dir
}
async function getWorkingDir (options: RegisterServerOptions): Promise<{
dir: string
permanent: boolean
}> {
const peertubeHelpers = options.peertubeHelpers
const logger = peertubeHelpers.logger
logger.debug('Calling getWorkingDir')
if (peertubeHelpers.plugin?.getDataDirectoryPath) {
const dir = path.resolve(peertubeHelpers.plugin.getDataDirectoryPath(), 'prosody')
logger.debug('getWorkingDir will return the permanent dir ' + dir)
return {
dir: dir,
permanent: true
}
}
const dir = await _getTemporaryWorkingDir(options)
logger.debug('getWorkingDir will return the temporary dir ' + dir)
return {
dir: dir,
permanent: false
}
}
2021-04-14 15:10:22 +00:00
/**
* Creates the working dir if needed, and returns it.
* NB: for now, I try to create a directory in /tmp/.
* To ensure that there is no conflict with another peertube instance,
* I used a randomly generated id that will be stored in database.
*/
async function ensureWorkingDir (options: RegisterServerOptions): Promise<string> {
const logger = options.peertubeHelpers.logger
logger.debug('Calling ensureworkingDir')
2021-04-16 12:26:21 +00:00
const paths = await getProsodyFilePaths(options)
const dir = paths.dir
2021-04-14 15:10:22 +00:00
if (!fs.existsSync(dir)) {
logger.info(`The working dir ${dir} does not exists, trying to create it`)
await fs.promises.mkdir(dir)
logger.debug(`Working dir ${dir} was created`)
2021-04-12 18:52:21 +00:00
}
2021-04-14 15:10:22 +00:00
logger.debug(`Testing write access on ${dir}`)
await fs.promises.access(dir, fs.constants.W_OK) // will throw an error if no access
logger.debug(`Write access ok on ${dir}`)
2021-04-16 12:26:21 +00:00
if (!fs.existsSync(paths.data)) {
logger.info(`The data dir ${paths.data} does not exists, trying to create it`)
await fs.promises.mkdir(paths.data)
logger.debug(`Working dir ${paths.data} was created`)
}
2021-04-14 15:10:22 +00:00
return dir
2021-04-12 18:52:21 +00:00
}
2021-04-13 15:13:41 +00:00
async function getProsodyFilePaths (options: RegisterServerOptions): Promise<ProsodyFilePaths> {
2021-04-14 15:10:22 +00:00
const logger = options.peertubeHelpers.logger
logger.debug('Calling getProsodyFilePaths')
const workingDir = await getWorkingDir(options)
const dir = workingDir.dir
2021-04-13 15:13:41 +00:00
return {
2021-04-14 13:26:00 +00:00
dir: dir,
permanent: workingDir.permanent,
2021-04-13 15:13:41 +00:00
pid: path.resolve(dir, 'prosody.pid'),
error: path.resolve(dir, 'prosody.err'),
log: path.resolve(dir, 'prosody.log'),
2021-04-16 12:26:21 +00:00
config: path.resolve(dir, 'prosody.cfg.lua'),
data: path.resolve(dir, 'data'),
modules: path.resolve(__dirname, '../../prosody-modules')
2021-04-13 15:13:41 +00:00
}
}
interface ProsodyConfig {
content: string
paths: ProsodyFilePaths
port: string
}
async function getProsodyConfig (options: RegisterServerOptions): Promise<ProsodyConfig> {
2021-04-14 15:10:22 +00:00
const logger = options.peertubeHelpers.logger
logger.debug('Calling getProsodyConfig')
2021-04-14 15:10:22 +00:00
2021-04-16 13:13:46 +00:00
const port = (await options.settingsManager.getSetting('prosody-port') as string) || '52800'
if (!/^\d+$/.test(port)) {
throw new Error('Invalid port')
}
const prosodyDomain = await getProsodyDomain(options)
2021-04-13 15:13:41 +00:00
const paths = await getProsodyFilePaths(options)
2021-04-12 18:52:21 +00:00
2021-05-05 15:06:19 +00:00
const apikey = await getAPIKey(options)
2021-05-03 18:37:23 +00:00
const baseApiUrl = options.peertubeHelpers.config.getWebserverUrl() +
getBaseRouterRoute(options) +
2021-05-03 18:37:23 +00:00
'api/'
2021-05-05 15:06:19 +00:00
const authApiUrl = baseApiUrl + 'user' // FIXME: should be protected by apikey, but mod_auth_http cant handle params
const roomApiUrl = baseApiUrl + 'room?apikey=' + apikey + '&jid={room.jid|jid_node}'
2021-04-12 18:52:21 +00:00
const config = new ProsodyConfigContent(paths, prosodyDomain)
2021-05-03 18:37:23 +00:00
config.useHttpAuthentication(authApiUrl)
config.usePeertubeBosh(prosodyDomain, port)
config.useMucHttpDefault(roomApiUrl)
if (paths.permanent) {
// TODO: add a settings so that admin can choose? (on/off and duration)
config.useMam('1w') // Remove archived messages after 1 week
// TODO: add a settings to choose?
config.useDefaultPersistent()
}
let logLevel: ProsodyLogLevel | undefined
if (logger.level && (typeof logger.level === 'string')) {
if (logger.level === 'error' || logger.level === 'info' || logger.level === 'debug') {
logLevel = logger.level
} else if (logger.level === 'warn' || logger.level === 'warning') {
// Should be 'warn', but just in case... (this value was buggy with peertube <= 3.2.0-rc1)
logLevel = 'warn'
}
}
if (logLevel === undefined) {
logger.info('No log level found in Peertube, will use default "info" for Prosody')
logLevel = 'info'
}
config.setLog(logLevel)
const content = config.write()
return {
content,
paths,
port
}
2021-04-12 18:52:21 +00:00
}
async function writeProsodyConfig (options: RegisterServerOptions): Promise<ProsodyConfig> {
2021-04-13 15:13:41 +00:00
const logger = options.peertubeHelpers.logger
2021-04-14 15:10:22 +00:00
logger.debug('Calling writeProsodyConfig')
logger.debug('Ensuring that the working dir exists')
await ensureWorkingDir(options)
logger.debug('Computing the Prosody config content')
const config = await getProsodyConfig(options)
const content = config.content
const fileName = config.paths.config
2021-04-14 15:10:22 +00:00
2021-04-13 15:13:41 +00:00
logger.info(`Writing prosody configuration file to ${fileName}`)
await fs.promises.writeFile(fileName, content)
2021-04-14 15:10:22 +00:00
logger.debug('Prosody configuration file writen')
return config
2021-04-13 15:13:41 +00:00
}
2021-04-12 18:52:21 +00:00
export {
getProsodyConfig,
2021-04-13 15:13:41 +00:00
getWorkingDir,
2021-04-14 15:10:22 +00:00
ensureWorkingDir,
2021-04-13 15:13:41 +00:00
getProsodyFilePaths,
writeProsodyConfig
2021-04-12 18:52:21 +00:00
}