diff options
Diffstat (limited to 'server/initializers/installer.ts')
-rw-r--r-- | server/initializers/installer.ts | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/server/initializers/installer.ts b/server/initializers/installer.ts new file mode 100644 index 000000000..cd1404d48 --- /dev/null +++ b/server/initializers/installer.ts | |||
@@ -0,0 +1,128 @@ | |||
1 | import { join } from 'path' | ||
2 | import config = require('config') | ||
3 | import { each, series } from 'async' | ||
4 | import mkdirp = require('mkdirp') | ||
5 | import passwordGenerator = require('password-generator') | ||
6 | |||
7 | const db = require('./database') | ||
8 | import { USER_ROLES, CONFIG, LAST_MIGRATION_VERSION } from './constants' | ||
9 | import { clientsExist, usersExist } from './checker' | ||
10 | import { logger, createCertsIfNotExist } from '../helpers' | ||
11 | |||
12 | function installApplication (callback) { | ||
13 | series([ | ||
14 | function createDatabase (callbackAsync) { | ||
15 | db.sequelize.sync().asCallback(callbackAsync) | ||
16 | // db.sequelize.sync({ force: true }).asCallback(callbackAsync) | ||
17 | }, | ||
18 | |||
19 | function createDirectories (callbackAsync) { | ||
20 | createDirectoriesIfNotExist(callbackAsync) | ||
21 | }, | ||
22 | |||
23 | function createCertificates (callbackAsync) { | ||
24 | createCertsIfNotExist(callbackAsync) | ||
25 | }, | ||
26 | |||
27 | function createOAuthClient (callbackAsync) { | ||
28 | createOAuthClientIfNotExist(callbackAsync) | ||
29 | }, | ||
30 | |||
31 | function createOAuthUser (callbackAsync) { | ||
32 | createOAuthAdminIfNotExist(callbackAsync) | ||
33 | } | ||
34 | ], callback) | ||
35 | } | ||
36 | |||
37 | // --------------------------------------------------------------------------- | ||
38 | |||
39 | export { | ||
40 | installApplication | ||
41 | } | ||
42 | |||
43 | // --------------------------------------------------------------------------- | ||
44 | |||
45 | function createDirectoriesIfNotExist (callback) { | ||
46 | const storages = config.get('storage') | ||
47 | |||
48 | each(Object.keys(storages), function (key, callbackEach) { | ||
49 | const dir = storages[key] | ||
50 | mkdirp(join(__dirname, '..', '..', dir), callbackEach) | ||
51 | }, callback) | ||
52 | } | ||
53 | |||
54 | function createOAuthClientIfNotExist (callback) { | ||
55 | clientsExist(function (err, exist) { | ||
56 | if (err) return callback(err) | ||
57 | |||
58 | // Nothing to do, clients already exist | ||
59 | if (exist === true) return callback(null) | ||
60 | |||
61 | logger.info('Creating a default OAuth Client.') | ||
62 | |||
63 | const id = passwordGenerator(32, false, /[a-z0-9]/) | ||
64 | const secret = passwordGenerator(32, false, /[a-zA-Z0-9]/) | ||
65 | const client = db.OAuthClient.build({ | ||
66 | clientId: id, | ||
67 | clientSecret: secret, | ||
68 | grants: [ 'password', 'refresh_token' ] | ||
69 | }) | ||
70 | |||
71 | client.save().asCallback(function (err, createdClient) { | ||
72 | if (err) return callback(err) | ||
73 | |||
74 | logger.info('Client id: ' + createdClient.clientId) | ||
75 | logger.info('Client secret: ' + createdClient.clientSecret) | ||
76 | |||
77 | return callback(null) | ||
78 | }) | ||
79 | }) | ||
80 | } | ||
81 | |||
82 | function createOAuthAdminIfNotExist (callback) { | ||
83 | usersExist(function (err, exist) { | ||
84 | if (err) return callback(err) | ||
85 | |||
86 | // Nothing to do, users already exist | ||
87 | if (exist === true) return callback(null) | ||
88 | |||
89 | logger.info('Creating the administrator.') | ||
90 | |||
91 | const username = 'root' | ||
92 | const role = USER_ROLES.ADMIN | ||
93 | const email = CONFIG.ADMIN.EMAIL | ||
94 | const createOptions: { validate?: boolean } = {} | ||
95 | let password = '' | ||
96 | |||
97 | // Do not generate a random password for tests | ||
98 | if (process.env.NODE_ENV === 'test') { | ||
99 | password = 'test' | ||
100 | |||
101 | if (process.env.NODE_APP_INSTANCE) { | ||
102 | password += process.env.NODE_APP_INSTANCE | ||
103 | } | ||
104 | |||
105 | // Our password is weak so do not validate it | ||
106 | createOptions.validate = false | ||
107 | } else { | ||
108 | password = passwordGenerator(8, true) | ||
109 | } | ||
110 | |||
111 | const userData = { | ||
112 | username, | ||
113 | email, | ||
114 | password, | ||
115 | role | ||
116 | } | ||
117 | |||
118 | db.User.create(userData, createOptions).asCallback(function (err, createdUser) { | ||
119 | if (err) return callback(err) | ||
120 | |||
121 | logger.info('Username: ' + username) | ||
122 | logger.info('User password: ' + password) | ||
123 | |||
124 | logger.info('Creating Application table.') | ||
125 | db.Application.create({ migrationVersion: LAST_MIGRATION_VERSION }).asCallback(callback) | ||
126 | }) | ||
127 | }) | ||
128 | } | ||