From 8d2be0ed7bb87283a1ec98609df6b82d83db706a Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Thu, 11 Jul 2019 17:23:24 +0200 Subject: WIP plugins: move plugin CLI in peertube script Install/uninstall/list plugins remotely --- server/tools/peertube-plugins.ts | 162 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 server/tools/peertube-plugins.ts (limited to 'server/tools/peertube-plugins.ts') diff --git a/server/tools/peertube-plugins.ts b/server/tools/peertube-plugins.ts new file mode 100644 index 000000000..d5e024383 --- /dev/null +++ b/server/tools/peertube-plugins.ts @@ -0,0 +1,162 @@ +import * as program from 'commander' +import { PluginType } from '../../shared/models/plugins/plugin.type' +import { getAccessToken } from '../../shared/extra-utils/users/login' +import { getMyUserInformation } from '../../shared/extra-utils/users/users' +import { installPlugin, listPlugins, uninstallPlugin } from '../../shared/extra-utils/server/plugins' +import { getServerCredentials } from './cli' +import { User, UserRole } from '../../shared/models/users' +import { PeerTubePlugin } from '../../shared/models/plugins/peertube-plugin.model' +import { isAbsolute } from 'path' + +const Table = require('cli-table') + +program + .name('plugins') + .usage('[command] [options]') + +program + .command('list') + .description('List installed plugins') + .option('-u, --url ', 'Server url') + .option('-U, --username ', 'Username') + .option('-p, --password ', 'Password') + .option('-t, --only-themes', 'List themes only') + .option('-P, --only-plugins', 'List plugins only') + .action(() => pluginsListCLI()) + +program + .command('install') + .description('Install a plugin or a theme') + .option('-u, --url ', 'Server url') + .option('-U, --username ', 'Username') + .option('-p, --password ', 'Password') + .option('-P --path ', 'Install from a path') + .option('-n, --npm-name ', 'Install from npm') + .action((options) => installPluginCLI(options)) + +program + .command('uninstall') + .description('Uninstall a plugin or a theme') + .option('-u, --url ', 'Server url') + .option('-U, --username ', 'Username') + .option('-p, --password ', 'Password') + .option('-n, --npm-name ', 'NPM plugin/theme name') + .action(options => uninstallPluginCLI(options)) + +if (!process.argv.slice(2).length) { + program.outputHelp() +} + +program.parse(process.argv) + +// ---------------------------------------------------------------------------- + +async function pluginsListCLI () { + const { url, username, password } = await getServerCredentials(program) + const accessToken = await getAdminTokenOrDie(url, username, password) + + let type: PluginType + if (program['onlyThemes']) type = PluginType.THEME + if (program['onlyPlugins']) type = PluginType.PLUGIN + + const res = await listPlugins({ + url, + accessToken, + start: 0, + count: 100, + sort: 'name', + type + }) + const plugins: PeerTubePlugin[] = res.body.data + + const table = new Table({ + head: ['name', 'version', 'homepage'], + colWidths: [ 50, 10, 50 ] + }) + + for (const plugin of plugins) { + const npmName = plugin.type === PluginType.PLUGIN + ? 'peertube-plugin-' + plugin.name + : 'peertube-theme-' + plugin.name + + table.push([ + npmName, + plugin.version, + plugin.homepage + ]) + } + + console.log(table.toString()) + process.exit(0) +} + +async function installPluginCLI (options: any) { + if (!options['path'] && !options['npmName']) { + console.error('You need to specify the npm name or the path of the plugin you want to install.\n') + program.outputHelp() + process.exit(-1) + } + + if (options['path'] && !isAbsolute(options['path'])) { + console.error('Path should be absolute.') + process.exit(-1) + } + + const { url, username, password } = await getServerCredentials(options) + const accessToken = await getAdminTokenOrDie(url, username, password) + + try { + await installPlugin({ + url, + accessToken, + npmName: options['npmName'], + path: options['path'] + }) + } catch (err) { + console.error('Cannot install plugin.', err) + process.exit(-1) + return + } + + console.log('Plugin installed.') + process.exit(0) +} + +async function uninstallPluginCLI (options: any) { + if (!options['npmName']) { + console.error('You need to specify the npm name of the plugin/theme you want to uninstall.\n') + program.outputHelp() + process.exit(-1) + } + + const { url, username, password } = await getServerCredentials(options) + const accessToken = await getAdminTokenOrDie(url, username, password) + + try { + await uninstallPlugin({ + url, + accessToken, + npmName: options[ 'npmName' ] + }) + } catch (err) { + console.error('Cannot uninstall plugin.', err) + process.exit(-1) + return + } + + console.log('Plugin uninstalled.') + process.exit(0) +} + +async function getAdminTokenOrDie (url: string, username: string, password: string) { + const accessToken = await getAccessToken(url, username, password) + const resMe = await getMyUserInformation(url, accessToken) + const me: User = resMe.body + + if (me.role !== UserRole.ADMINISTRATOR) { + console.error('Cannot list plugins if you are not administrator.') + process.exit(-1) + } + + return accessToken +} -- cgit v1.2.3