1 | 'use strict';
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 |
|
7 | var _child_process = require('child_process');
|
8 |
|
9 | var _path = require('path');
|
10 |
|
11 | var _inquirer = require('inquirer');
|
12 |
|
13 | var _config = require('../../config');
|
14 |
|
15 | var _config2 = _interopRequireDefault(_config);
|
16 |
|
17 | var _createSystemdService = require('./createSystemdService');
|
18 |
|
19 | var _createSystemdService2 = _interopRequireDefault(_createSystemdService);
|
20 |
|
21 | var _createConfigFile = require('./createConfigFile');
|
22 |
|
23 | var _createConfigFile2 = _interopRequireDefault(_createConfigFile);
|
24 |
|
25 | var _detectBoard = require('../../main-process/utils/detectBoard');
|
26 |
|
27 | var _detectBoard2 = _interopRequireDefault(_detectBoard);
|
28 |
|
29 | var _parseHostPort = require('../../main-process/utils/parseHostPort');
|
30 |
|
31 | var _parseHostPort2 = _interopRequireDefault(_parseHostPort);
|
32 |
|
33 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
34 |
|
35 | function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
|
36 |
|
37 |
|
38 | exports.default = (() => {
|
39 | var _ref = _asyncToGenerator(function* (options, pkg) {
|
40 | const board = (0, _detectBoard2.default)();
|
41 |
|
42 | if (process.env.USER !== 'root') {
|
43 | throw new Error('The install script must be run with root user. Use : sudo pooliot-client install');
|
44 | }
|
45 |
|
46 | options = {
|
47 | webPort: options.webPort || _config2.default.WEB_PORT || 80,
|
48 | address: options.address || _config2.default.ADDRESS,
|
49 | token: options.token || _config2.default.TOKEN,
|
50 | user: options.user !== 'root' && options.user || _config2.default.USER,
|
51 | interactive: options.interactive
|
52 | };
|
53 |
|
54 | const defaults = Object.assign({}, options, {
|
55 | user: options.user || board.user
|
56 | });
|
57 |
|
58 | const answers = yield (0, _inquirer.prompt)([{
|
59 | type: 'input',
|
60 | name: 'address',
|
61 | message: 'Address (https://host:port)',
|
62 | when: !options.address,
|
63 | default: defaults.address,
|
64 | validate: function (address) {
|
65 | if (!address) return 'address cannot be empty';
|
66 | const [host, port] = (0, _parseHostPort2.default)(address);
|
67 | if (!host) return 'host is invalid';
|
68 | if (!port || !Number.isInteger(Number(port))) return 'port must be an integer';
|
69 | return true;
|
70 | }
|
71 | }, {
|
72 | type: 'input',
|
73 | name: 'token',
|
74 | message: 'Token',
|
75 | when: !options.token,
|
76 | default: defaults.token
|
77 | }, {
|
78 | type: 'input',
|
79 | name: 'user',
|
80 | message: 'User',
|
81 | when: Boolean(options.interactive && !defaults.user),
|
82 | default: defaults.user,
|
83 | validate: function (user) {
|
84 | if (!user) return 'user must be provided';
|
85 | if (user === 'root') return 'root is not allowed';
|
86 | return true;
|
87 | }
|
88 | }, {
|
89 | type: 'confirm',
|
90 | name: 'useDisplay',
|
91 | message: 'Use your device for display ?',
|
92 | default: true,
|
93 | when: Boolean(options.interactive)
|
94 | }, {
|
95 | type: 'checkbox',
|
96 | name: 'displays',
|
97 | message: 'What displays do you want to install ?',
|
98 | choices: [{ value: 'chromium', name: 'chromium: a web browser', checked: true }, { value: 'firefox', name: 'firefox: a web browser' }, {
|
99 | value: 'livestreamer',
|
100 | name: 'livestreamer: video streams - http://docs.livestreamer.io/',
|
101 | checked: true
|
102 | }, board.os.id === 'raspbian' && {
|
103 | value: 'omxplayer',
|
104 | name: 'omxplayer: video player - https://github.com/popcornmix/omxplayer',
|
105 | checked: true
|
106 | }].filter(Boolean),
|
107 | when: function (answers) {
|
108 | return options.interactive && answers.useDisplay;
|
109 | }
|
110 | }]);
|
111 |
|
112 | const { address, token, user, useDisplay, displays } = Object.assign({}, defaults, answers);
|
113 |
|
114 | console.log(`Add user ${user} if missing`);
|
115 | try {
|
116 | (0, _child_process.execSync)(`useradd ${user} --create-home`, { stdio: 'inherit' });
|
117 | } catch (err) {}
|
118 |
|
119 | const clientDirectory = (0, _path.dirname)((0, _path.dirname)((0, _path.dirname)(__dirname)));
|
120 | const scriptsDirectory = `${clientDirectory}/scripts/install/`;
|
121 |
|
122 | const execScript = function (script) {
|
123 | return (0, _child_process.execSync)(`sh ${script}.sh`, {
|
124 | stdio: 'inherit',
|
125 | cwd: scriptsDirectory,
|
126 | env: Object.assign({}, process.env, { POOLIOT_USER: user })
|
127 | });
|
128 | };
|
129 |
|
130 | execScript('essentials');
|
131 |
|
132 | if (board.id === 'rpi' && board.os.id === 'raspbian') {
|
133 | execScript('raspbian/prepare');
|
134 | } else if (board.id === 'tkb') {
|
135 |
|
136 | execScript('tinker-os/prepare');
|
137 | }
|
138 |
|
139 | if (useDisplay) {
|
140 | execScript('display/essentials', {
|
141 | env: { BOARD_ID: board.id }
|
142 | });
|
143 |
|
144 | displays.forEach(function (display) {
|
145 | execScript(`display/${display}`);
|
146 | });
|
147 | }
|
148 |
|
149 | console.log(`Write /etc/systemd/system/${pkg.name}.service`);
|
150 | (0, _createSystemdService2.default)(clientDirectory, pkg);
|
151 | (0, _createConfigFile2.default)({ address, token, user, webPort: options.webPort });
|
152 |
|
153 | console.log('Enable and start systemctl service');
|
154 | (0, _child_process.execSync)(`systemctl enable ${pkg.name}`, { stdio: 'inherit' });
|
155 | (0, _child_process.execSync)(`systemctl start ${pkg.name}`, { stdio: 'inherit' });
|
156 |
|
157 | if (options.interactive) {
|
158 | const confirmReboot = yield (0, _inquirer.prompt)([{
|
159 | type: 'confirm',
|
160 | name: 'reboot',
|
161 | message: 'reboot ?'
|
162 | }]);
|
163 |
|
164 | if (confirmReboot.reboot) {
|
165 | (0, _child_process.execSync)('reboot');
|
166 | }
|
167 | }
|
168 | });
|
169 |
|
170 | return function () {
|
171 | return _ref.apply(this, arguments);
|
172 | };
|
173 | })();
|
174 |
|
\ | No newline at end of file |