diff options
Diffstat (limited to 'shared/extra-utils/server')
-rw-r--r-- | shared/extra-utils/server/config-command.ts | 72 | ||||
-rw-r--r-- | shared/extra-utils/server/index.ts | 1 | ||||
-rw-r--r-- | shared/extra-utils/server/jobs-command.ts | 10 | ||||
-rw-r--r-- | shared/extra-utils/server/jobs.ts | 6 | ||||
-rw-r--r-- | shared/extra-utils/server/object-storage-command.ts | 77 | ||||
-rw-r--r-- | shared/extra-utils/server/server.ts | 18 | ||||
-rw-r--r-- | shared/extra-utils/server/servers.ts | 4 |
7 files changed, 183 insertions, 5 deletions
diff --git a/shared/extra-utils/server/config-command.ts b/shared/extra-utils/server/config-command.ts index 11148aa46..51d04fa63 100644 --- a/shared/extra-utils/server/config-command.ts +++ b/shared/extra-utils/server/config-command.ts | |||
@@ -18,6 +18,70 @@ export class ConfigCommand extends AbstractCommand { | |||
18 | } | 18 | } |
19 | } | 19 | } |
20 | 20 | ||
21 | enableImports () { | ||
22 | return this.updateExistingSubConfig({ | ||
23 | newConfig: { | ||
24 | import: { | ||
25 | videos: { | ||
26 | http: { | ||
27 | enabled: true | ||
28 | }, | ||
29 | |||
30 | torrent: { | ||
31 | enabled: true | ||
32 | } | ||
33 | } | ||
34 | } | ||
35 | } | ||
36 | }) | ||
37 | } | ||
38 | |||
39 | enableLive (options: { | ||
40 | allowReplay?: boolean | ||
41 | transcoding?: boolean | ||
42 | } = {}) { | ||
43 | return this.updateExistingSubConfig({ | ||
44 | newConfig: { | ||
45 | live: { | ||
46 | enabled: true, | ||
47 | allowReplay: options.allowReplay ?? true, | ||
48 | transcoding: { | ||
49 | enabled: options.transcoding ?? true, | ||
50 | resolutions: ConfigCommand.getCustomConfigResolutions(true) | ||
51 | } | ||
52 | } | ||
53 | } | ||
54 | }) | ||
55 | } | ||
56 | |||
57 | disableTranscoding () { | ||
58 | return this.updateExistingSubConfig({ | ||
59 | newConfig: { | ||
60 | transcoding: { | ||
61 | enabled: false | ||
62 | } | ||
63 | } | ||
64 | }) | ||
65 | } | ||
66 | |||
67 | enableTranscoding (webtorrent = true, hls = true) { | ||
68 | return this.updateExistingSubConfig({ | ||
69 | newConfig: { | ||
70 | transcoding: { | ||
71 | enabled: true, | ||
72 | resolutions: ConfigCommand.getCustomConfigResolutions(true), | ||
73 | |||
74 | webtorrent: { | ||
75 | enabled: webtorrent | ||
76 | }, | ||
77 | hls: { | ||
78 | enabled: hls | ||
79 | } | ||
80 | } | ||
81 | } | ||
82 | }) | ||
83 | } | ||
84 | |||
21 | getConfig (options: OverrideCommandOptions = {}) { | 85 | getConfig (options: OverrideCommandOptions = {}) { |
22 | const path = '/api/v1/config' | 86 | const path = '/api/v1/config' |
23 | 87 | ||
@@ -81,6 +145,14 @@ export class ConfigCommand extends AbstractCommand { | |||
81 | }) | 145 | }) |
82 | } | 146 | } |
83 | 147 | ||
148 | async updateExistingSubConfig (options: OverrideCommandOptions & { | ||
149 | newConfig: DeepPartial<CustomConfig> | ||
150 | }) { | ||
151 | const existing = await this.getCustomConfig(options) | ||
152 | |||
153 | return this.updateCustomConfig({ ...options, newCustomConfig: merge({}, existing, options.newConfig) }) | ||
154 | } | ||
155 | |||
84 | updateCustomSubConfig (options: OverrideCommandOptions & { | 156 | updateCustomSubConfig (options: OverrideCommandOptions & { |
85 | newConfig: DeepPartial<CustomConfig> | 157 | newConfig: DeepPartial<CustomConfig> |
86 | }) { | 158 | }) { |
diff --git a/shared/extra-utils/server/index.ts b/shared/extra-utils/server/index.ts index 9055dfc57..92ff7a0f9 100644 --- a/shared/extra-utils/server/index.ts +++ b/shared/extra-utils/server/index.ts | |||
@@ -6,6 +6,7 @@ export * from './follows-command' | |||
6 | export * from './follows' | 6 | export * from './follows' |
7 | export * from './jobs' | 7 | export * from './jobs' |
8 | export * from './jobs-command' | 8 | export * from './jobs-command' |
9 | export * from './object-storage-command' | ||
9 | export * from './plugins-command' | 10 | export * from './plugins-command' |
10 | export * from './plugins' | 11 | export * from './plugins' |
11 | export * from './redundancy-command' | 12 | export * from './redundancy-command' |
diff --git a/shared/extra-utils/server/jobs-command.ts b/shared/extra-utils/server/jobs-command.ts index c4eb12dc2..91771c176 100644 --- a/shared/extra-utils/server/jobs-command.ts +++ b/shared/extra-utils/server/jobs-command.ts | |||
@@ -5,6 +5,16 @@ import { AbstractCommand, OverrideCommandOptions } from '../shared' | |||
5 | 5 | ||
6 | export class JobsCommand extends AbstractCommand { | 6 | export class JobsCommand extends AbstractCommand { |
7 | 7 | ||
8 | async getLatest (options: OverrideCommandOptions & { | ||
9 | jobType: JobType | ||
10 | }) { | ||
11 | const { data } = await this.getJobsList({ ...options, start: 0, count: 1, sort: '-createdAt' }) | ||
12 | |||
13 | if (data.length === 0) return undefined | ||
14 | |||
15 | return data[0] | ||
16 | } | ||
17 | |||
8 | getJobsList (options: OverrideCommandOptions & { | 18 | getJobsList (options: OverrideCommandOptions & { |
9 | state?: JobState | 19 | state?: JobState |
10 | jobType?: JobType | 20 | jobType?: JobType |
diff --git a/shared/extra-utils/server/jobs.ts b/shared/extra-utils/server/jobs.ts index 64a0353eb..27104bfdf 100644 --- a/shared/extra-utils/server/jobs.ts +++ b/shared/extra-utils/server/jobs.ts | |||
@@ -3,7 +3,7 @@ import { JobState } from '../../models' | |||
3 | import { wait } from '../miscs' | 3 | import { wait } from '../miscs' |
4 | import { PeerTubeServer } from './server' | 4 | import { PeerTubeServer } from './server' |
5 | 5 | ||
6 | async function waitJobs (serversArg: PeerTubeServer[] | PeerTubeServer) { | 6 | async function waitJobs (serversArg: PeerTubeServer[] | PeerTubeServer, skipDelayed = false) { |
7 | const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT | 7 | const pendingJobWait = process.env.NODE_PENDING_JOB_WAIT |
8 | ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10) | 8 | ? parseInt(process.env.NODE_PENDING_JOB_WAIT, 10) |
9 | : 250 | 9 | : 250 |
@@ -13,7 +13,9 @@ async function waitJobs (serversArg: PeerTubeServer[] | PeerTubeServer) { | |||
13 | if (Array.isArray(serversArg) === false) servers = [ serversArg as PeerTubeServer ] | 13 | if (Array.isArray(serversArg) === false) servers = [ serversArg as PeerTubeServer ] |
14 | else servers = serversArg as PeerTubeServer[] | 14 | else servers = serversArg as PeerTubeServer[] |
15 | 15 | ||
16 | const states: JobState[] = [ 'waiting', 'active', 'delayed' ] | 16 | const states: JobState[] = [ 'waiting', 'active' ] |
17 | if (!skipDelayed) states.push('delayed') | ||
18 | |||
17 | const repeatableJobs = [ 'videos-views', 'activitypub-cleaner' ] | 19 | const repeatableJobs = [ 'videos-views', 'activitypub-cleaner' ] |
18 | let pendingRequests: boolean | 20 | let pendingRequests: boolean |
19 | 21 | ||
diff --git a/shared/extra-utils/server/object-storage-command.ts b/shared/extra-utils/server/object-storage-command.ts new file mode 100644 index 000000000..b4de8f4cb --- /dev/null +++ b/shared/extra-utils/server/object-storage-command.ts | |||
@@ -0,0 +1,77 @@ | |||
1 | |||
2 | import { HttpStatusCode } from '@shared/models' | ||
3 | import { makePostBodyRequest } from '../requests' | ||
4 | import { AbstractCommand } from '../shared' | ||
5 | |||
6 | export class ObjectStorageCommand extends AbstractCommand { | ||
7 | static readonly DEFAULT_PLAYLIST_BUCKET = 'streaming-playlists' | ||
8 | static readonly DEFAULT_WEBTORRENT_BUCKET = 'videos' | ||
9 | |||
10 | static getDefaultConfig () { | ||
11 | return { | ||
12 | object_storage: { | ||
13 | enabled: true, | ||
14 | endpoint: 'http://' + this.getEndpointHost(), | ||
15 | region: this.getRegion(), | ||
16 | |||
17 | credentials: this.getCredentialsConfig(), | ||
18 | |||
19 | streaming_playlists: { | ||
20 | bucket_name: this.DEFAULT_PLAYLIST_BUCKET | ||
21 | }, | ||
22 | |||
23 | videos: { | ||
24 | bucket_name: this.DEFAULT_WEBTORRENT_BUCKET | ||
25 | } | ||
26 | } | ||
27 | } | ||
28 | } | ||
29 | |||
30 | static getCredentialsConfig () { | ||
31 | return { | ||
32 | access_key_id: 'AKIAIOSFODNN7EXAMPLE', | ||
33 | secret_access_key: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY' | ||
34 | } | ||
35 | } | ||
36 | |||
37 | static getEndpointHost () { | ||
38 | return 'localhost:9444' | ||
39 | } | ||
40 | |||
41 | static getRegion () { | ||
42 | return 'us-east-1' | ||
43 | } | ||
44 | |||
45 | static getWebTorrentBaseUrl () { | ||
46 | return `http://${this.DEFAULT_WEBTORRENT_BUCKET}.${this.getEndpointHost()}/` | ||
47 | } | ||
48 | |||
49 | static getPlaylistBaseUrl () { | ||
50 | return `http://${this.DEFAULT_PLAYLIST_BUCKET}.${this.getEndpointHost()}/` | ||
51 | } | ||
52 | |||
53 | static async prepareDefaultBuckets () { | ||
54 | await this.createBucket(this.DEFAULT_PLAYLIST_BUCKET) | ||
55 | await this.createBucket(this.DEFAULT_WEBTORRENT_BUCKET) | ||
56 | } | ||
57 | |||
58 | static async createBucket (name: string) { | ||
59 | await makePostBodyRequest({ | ||
60 | url: this.getEndpointHost(), | ||
61 | path: '/ui/' + name + '?delete', | ||
62 | expectedStatus: HttpStatusCode.TEMPORARY_REDIRECT_307 | ||
63 | }) | ||
64 | |||
65 | await makePostBodyRequest({ | ||
66 | url: this.getEndpointHost(), | ||
67 | path: '/ui/' + name + '?create', | ||
68 | expectedStatus: HttpStatusCode.TEMPORARY_REDIRECT_307 | ||
69 | }) | ||
70 | |||
71 | await makePostBodyRequest({ | ||
72 | url: this.getEndpointHost(), | ||
73 | path: '/ui/' + name + '?make-public', | ||
74 | expectedStatus: HttpStatusCode.TEMPORARY_REDIRECT_307 | ||
75 | }) | ||
76 | } | ||
77 | } | ||
diff --git a/shared/extra-utils/server/server.ts b/shared/extra-utils/server/server.ts index 3c335b8e4..bc5e1cd5f 100644 --- a/shared/extra-utils/server/server.ts +++ b/shared/extra-utils/server/server.ts | |||
@@ -38,11 +38,13 @@ import { PluginsCommand } from './plugins-command' | |||
38 | import { RedundancyCommand } from './redundancy-command' | 38 | import { RedundancyCommand } from './redundancy-command' |
39 | import { ServersCommand } from './servers-command' | 39 | import { ServersCommand } from './servers-command' |
40 | import { StatsCommand } from './stats-command' | 40 | import { StatsCommand } from './stats-command' |
41 | import { ObjectStorageCommand } from './object-storage-command' | ||
41 | 42 | ||
42 | export type RunServerOptions = { | 43 | export type RunServerOptions = { |
43 | hideLogs?: boolean | 44 | hideLogs?: boolean |
44 | nodeArgs?: string[] | 45 | nodeArgs?: string[] |
45 | peertubeArgs?: string[] | 46 | peertubeArgs?: string[] |
47 | env?: { [ id: string ]: string } | ||
46 | } | 48 | } |
47 | 49 | ||
48 | export class PeerTubeServer { | 50 | export class PeerTubeServer { |
@@ -121,6 +123,7 @@ export class PeerTubeServer { | |||
121 | servers?: ServersCommand | 123 | servers?: ServersCommand |
122 | login?: LoginCommand | 124 | login?: LoginCommand |
123 | users?: UsersCommand | 125 | users?: UsersCommand |
126 | objectStorage?: ObjectStorageCommand | ||
124 | videos?: VideosCommand | 127 | videos?: VideosCommand |
125 | 128 | ||
126 | constructor (options: { serverNumber: number } | { url: string }) { | 129 | constructor (options: { serverNumber: number } | { url: string }) { |
@@ -202,6 +205,10 @@ export class PeerTubeServer { | |||
202 | env['NODE_APP_INSTANCE'] = this.internalServerNumber.toString() | 205 | env['NODE_APP_INSTANCE'] = this.internalServerNumber.toString() |
203 | env['NODE_CONFIG'] = JSON.stringify(configOverride) | 206 | env['NODE_CONFIG'] = JSON.stringify(configOverride) |
204 | 207 | ||
208 | if (options.env) { | ||
209 | Object.assign(env, options.env) | ||
210 | } | ||
211 | |||
205 | const forkOptions = { | 212 | const forkOptions = { |
206 | silent: true, | 213 | silent: true, |
207 | env, | 214 | env, |
@@ -209,10 +216,17 @@ export class PeerTubeServer { | |||
209 | execArgv: options.nodeArgs || [] | 216 | execArgv: options.nodeArgs || [] |
210 | } | 217 | } |
211 | 218 | ||
212 | return new Promise<void>(res => { | 219 | return new Promise<void>((res, rej) => { |
213 | const self = this | 220 | const self = this |
214 | 221 | ||
215 | this.app = fork(join(root(), 'dist', 'server.js'), options.peertubeArgs || [], forkOptions) | 222 | this.app = fork(join(root(), 'dist', 'server.js'), options.peertubeArgs || [], forkOptions) |
223 | |||
224 | const onExit = function () { | ||
225 | return rej(new Error('Process exited')) | ||
226 | } | ||
227 | |||
228 | this.app.on('exit', onExit) | ||
229 | |||
216 | this.app.stdout.on('data', function onStdout (data) { | 230 | this.app.stdout.on('data', function onStdout (data) { |
217 | let dontContinue = false | 231 | let dontContinue = false |
218 | 232 | ||
@@ -241,6 +255,7 @@ export class PeerTubeServer { | |||
241 | console.log(data.toString()) | 255 | console.log(data.toString()) |
242 | } else { | 256 | } else { |
243 | self.app.stdout.removeListener('data', onStdout) | 257 | self.app.stdout.removeListener('data', onStdout) |
258 | self.app.removeListener('exit', onExit) | ||
244 | } | 259 | } |
245 | 260 | ||
246 | process.on('exit', () => { | 261 | process.on('exit', () => { |
@@ -365,5 +380,6 @@ export class PeerTubeServer { | |||
365 | this.login = new LoginCommand(this) | 380 | this.login = new LoginCommand(this) |
366 | this.users = new UsersCommand(this) | 381 | this.users = new UsersCommand(this) |
367 | this.videos = new VideosCommand(this) | 382 | this.videos = new VideosCommand(this) |
383 | this.objectStorage = new ObjectStorageCommand(this) | ||
368 | } | 384 | } |
369 | } | 385 | } |
diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts index f0622feb0..21ab9405b 100644 --- a/shared/extra-utils/server/servers.ts +++ b/shared/extra-utils/server/servers.ts | |||
@@ -10,11 +10,11 @@ async function createSingleServer (serverNumber: number, configOverride?: Object | |||
10 | return server | 10 | return server |
11 | } | 11 | } |
12 | 12 | ||
13 | function createMultipleServers (totalServers: number, configOverride?: Object) { | 13 | function createMultipleServers (totalServers: number, configOverride?: Object, options: RunServerOptions = {}) { |
14 | const serverPromises: Promise<PeerTubeServer>[] = [] | 14 | const serverPromises: Promise<PeerTubeServer>[] = [] |
15 | 15 | ||
16 | for (let i = 1; i <= totalServers; i++) { | 16 | for (let i = 1; i <= totalServers; i++) { |
17 | serverPromises.push(createSingleServer(i, configOverride)) | 17 | serverPromises.push(createSingleServer(i, configOverride, options)) |
18 | } | 18 | } |
19 | 19 | ||
20 | return Promise.all(serverPromises) | 20 | return Promise.all(serverPromises) |