X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Finitializers%2Finstaller.ts;h=2b22e16fe5f9d50c4986cf6c0ee5f4e372e4db3f;hb=88108880bbdba473cfe36ecbebc1c3c4f972e102;hp=2f9b589916b9bc6e28c0f50b945639f70cd31656;hpb=4d4e5cd4dca78480ec7f40e747f424cd107376a4;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/initializers/installer.ts b/server/initializers/installer.ts index 2f9b58991..2b22e16fe 100644 --- a/server/initializers/installer.ts +++ b/server/initializers/installer.ts @@ -1,37 +1,36 @@ -import { join } from 'path' -import * as config from 'config' -import { each, series } from 'async' -import * as mkdirp from 'mkdirp' import * as passwordGenerator from 'password-generator' - -import { database as db } from './database' -import { USER_ROLES, CONFIG, LAST_MIGRATION_VERSION } from './constants' -import { clientsExist, usersExist } from './checker' -import { logger, createCertsIfNotExist, root } from '../helpers' - -function installApplication (callback) { - series([ - function createDatabase (callbackAsync) { - db.sequelize.sync().asCallback(callbackAsync) - // db.sequelize.sync({ force: true }).asCallback(callbackAsync) - }, - - function createDirectories (callbackAsync) { - createDirectoriesIfNotExist(callbackAsync) - }, - - function createCertificates (callbackAsync) { - createCertsIfNotExist(callbackAsync) - }, - - function createOAuthClient (callbackAsync) { - createOAuthClientIfNotExist(callbackAsync) - }, - - function createOAuthUser (callbackAsync) { - createOAuthAdminIfNotExist(callbackAsync) - } - ], callback) +import { UserRole } from '../../shared' +import { logger } from '../helpers/logger' +import { createApplicationActor, createUserAccountAndChannel } from '../lib/user' +import { UserModel } from '../models/account/user' +import { ApplicationModel } from '../models/application/application' +import { OAuthClientModel } from '../models/oauth/oauth-client' +import { applicationExist, clientsExist, usersExist } from './checker-after-init' +import { CACHE, CONFIG, HLS_PLAYLIST_DIRECTORY, LAST_MIGRATION_VERSION } from './constants' +import { sequelizeTypescript } from './database' +import { remove, ensureDir } from 'fs-extra' + +async function installApplication () { + try { + await Promise.all([ + // Database related + sequelizeTypescript.sync() + .then(() => { + return Promise.all([ + createApplicationIfNotExist(), + createOAuthClientIfNotExist(), + createOAuthAdminIfNotExist() + ]) + }), + + // Directories + removeCacheDirectories() + .then(() => createDirectoriesIfNotExist()) + ]) + } catch (err) { + logger.error('Cannot install application.', { err }) + process.exit(-1) + } } // --------------------------------------------------------------------------- @@ -42,88 +41,121 @@ export { // --------------------------------------------------------------------------- -function createDirectoriesIfNotExist (callback) { - const storages = config.get('storage') +function removeCacheDirectories () { + const cacheDirectories = Object.keys(CACHE) + .map(k => CACHE[k].DIRECTORY) + + const tasks: Promise[] = [] - each(Object.keys(storages), function (key, callbackEach) { - const dir = storages[key] - mkdirp(join(root(), dir), callbackEach) - }, callback) + // Cache directories + for (const key of Object.keys(cacheDirectories)) { + const dir = cacheDirectories[key] + tasks.push(remove(dir)) + } + + return Promise.all(tasks) } -function createOAuthClientIfNotExist (callback) { - clientsExist(function (err, exist) { - if (err) return callback(err) +function createDirectoriesIfNotExist () { + const storage = CONFIG.STORAGE + const cacheDirectories = Object.keys(CACHE) + .map(k => CACHE[k].DIRECTORY) + + const tasks: Promise[] = [] + for (const key of Object.keys(storage)) { + const dir = storage[key] + tasks.push(ensureDir(dir)) + } - // Nothing to do, clients already exist - if (exist === true) return callback(null) + // Cache directories + for (const key of Object.keys(cacheDirectories)) { + const dir = cacheDirectories[key] + tasks.push(ensureDir(dir)) + } - logger.info('Creating a default OAuth Client.') + // Playlist directories + tasks.push(ensureDir(HLS_PLAYLIST_DIRECTORY)) - const id = passwordGenerator(32, false, /[a-z0-9]/) - const secret = passwordGenerator(32, false, /[a-zA-Z0-9]/) - const client = db.OAuthClient.build({ - clientId: id, - clientSecret: secret, - grants: [ 'password', 'refresh_token' ], - redirectUris: null - }) + return Promise.all(tasks) +} - client.save().asCallback(function (err, createdClient) { - if (err) return callback(err) +async function createOAuthClientIfNotExist () { + const exist = await clientsExist() + // Nothing to do, clients already exist + if (exist === true) return undefined - logger.info('Client id: ' + createdClient.clientId) - logger.info('Client secret: ' + createdClient.clientSecret) + logger.info('Creating a default OAuth Client.') - return callback(null) - }) + const id = passwordGenerator(32, false, /[a-z0-9]/) + const secret = passwordGenerator(32, false, /[a-zA-Z0-9]/) + const client = new OAuthClientModel({ + clientId: id, + clientSecret: secret, + grants: [ 'password', 'refresh_token' ], + redirectUris: null }) -} -function createOAuthAdminIfNotExist (callback) { - usersExist(function (err, exist) { - if (err) return callback(err) + const createdClient = await client.save() + logger.info('Client id: ' + createdClient.clientId) + logger.info('Client secret: ' + createdClient.clientSecret) - // Nothing to do, users already exist - if (exist === true) return callback(null) + return undefined +} - logger.info('Creating the administrator.') +async function createOAuthAdminIfNotExist () { + const exist = await usersExist() + // Nothing to do, users already exist + if (exist === true) return undefined - const username = 'root' - const role = USER_ROLES.ADMIN - const email = CONFIG.ADMIN.EMAIL - const createOptions: { validate?: boolean } = {} - let password = '' + logger.info('Creating the administrator.') - // Do not generate a random password for tests - if (process.env.NODE_ENV === 'test') { - password = 'test' + const username = 'root' + const role = UserRole.ADMINISTRATOR + const email = CONFIG.ADMIN.EMAIL + let validatePassword = true + let password = '' - if (process.env.NODE_APP_INSTANCE) { - password += process.env.NODE_APP_INSTANCE - } + // Do not generate a random password for tests + if (process.env.NODE_ENV === 'test') { + password = 'test' - // Our password is weak so do not validate it - createOptions.validate = false - } else { - password = passwordGenerator(8, true) + if (process.env.NODE_APP_INSTANCE) { + password += process.env.NODE_APP_INSTANCE } - const userData = { - username, - email, - password, - role - } + // Our password is weak so do not validate it + validatePassword = false + } else { + password = passwordGenerator(16, true) + } + + const userData = { + username, + email, + password, + role, + verified: true, + nsfwPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY, + videoQuota: -1, + videoQuotaDaily: -1 + } + const user = new UserModel(userData) + + await createUserAccountAndChannel(user, validatePassword) + logger.info('Username: ' + username) + logger.info('User password: ' + password) +} - db.User.create(userData, createOptions).asCallback(function (err, createdUser) { - if (err) return callback(err) +async function createApplicationIfNotExist () { + const exist = await applicationExist() + // Nothing to do, application already exist + if (exist === true) return undefined - logger.info('Username: ' + username) - logger.info('User password: ' + password) + logger.info('Creating application account.') - logger.info('Creating Application table.') - db.Application.create({ migrationVersion: LAST_MIGRATION_VERSION }).asCallback(callback) - }) + const application = await ApplicationModel.create({ + migrationVersion: LAST_MIGRATION_VERSION }) + + return createApplicationActor(application.id) }