@webos-tools/cli 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc.js +52 -0
  3. package/APIs.js +79 -0
  4. package/CHANGELOG.md +110 -0
  5. package/LICENSE +201 -0
  6. package/README.md +218 -0
  7. package/bin/ares-config.js +199 -0
  8. package/bin/ares-device-info.js +30 -0
  9. package/bin/ares-device.js +219 -0
  10. package/bin/ares-generate.js +270 -0
  11. package/bin/ares-inspect.js +179 -0
  12. package/bin/ares-install.js +223 -0
  13. package/bin/ares-launch.js +318 -0
  14. package/bin/ares-log.js +255 -0
  15. package/bin/ares-novacom.js +223 -0
  16. package/bin/ares-package.js +336 -0
  17. package/bin/ares-pull.js +156 -0
  18. package/bin/ares-push.js +155 -0
  19. package/bin/ares-server.js +174 -0
  20. package/bin/ares-setup-device.js +520 -0
  21. package/bin/ares-shell.js +132 -0
  22. package/bin/ares.js +166 -0
  23. package/files/conf/ares.json +49 -0
  24. package/files/conf/command-service.json +73 -0
  25. package/files/conf/config.json +22 -0
  26. package/files/conf/ipk.json +30 -0
  27. package/files/conf/novacom-devices.json +35 -0
  28. package/files/conf/query/query-app.json +14 -0
  29. package/files/conf/query/query-hosted.json +18 -0
  30. package/files/conf/query/query-package.json +10 -0
  31. package/files/conf/query/query-service.json +6 -0
  32. package/files/conf/sdk.json +8 -0
  33. package/files/conf/template.json +57 -0
  34. package/files/conf/webos_emul +27 -0
  35. package/files/conf-base/env/sdk-ose.json +8 -0
  36. package/files/conf-base/env/sdk-tv.json +8 -0
  37. package/files/conf-base/profile/config-ose.json +21 -0
  38. package/files/conf-base/profile/config-tv.json +22 -0
  39. package/files/conf-base/query/query-app.json +14 -0
  40. package/files/conf-base/query/query-hosted.json +18 -0
  41. package/files/conf-base/query/query-package.json +10 -0
  42. package/files/conf-base/query/query-service.json +6 -0
  43. package/files/conf-base/template-conf/ose-templates.json +67 -0
  44. package/files/conf-base/template-conf/tv-sdk-templates.json +57 -0
  45. package/files/help/ares-config.help +43 -0
  46. package/files/help/ares-device.help +94 -0
  47. package/files/help/ares-generate.help +65 -0
  48. package/files/help/ares-inspect.help +70 -0
  49. package/files/help/ares-install.help +90 -0
  50. package/files/help/ares-launch.help +100 -0
  51. package/files/help/ares-log-pmlogd.help +84 -0
  52. package/files/help/ares-log.help +101 -0
  53. package/files/help/ares-novacom.help +68 -0
  54. package/files/help/ares-package.help +101 -0
  55. package/files/help/ares-pull.help +38 -0
  56. package/files/help/ares-push.help +38 -0
  57. package/files/help/ares-server.help +39 -0
  58. package/files/help/ares-setup-device.help +75 -0
  59. package/files/help/ares-shell.help +42 -0
  60. package/files/help/ares.help +47 -0
  61. package/files/help/readme.help +23 -0
  62. package/files/schema/ApplicationDescription.schema +319 -0
  63. package/files/schema/NovacomDevices.schema +61 -0
  64. package/files/templates/ose-sdk-templates/appinfo/appinfo.json +10 -0
  65. package/files/templates/ose-sdk-templates/bootplate-web/index.html +88 -0
  66. package/files/templates/ose-sdk-templates/hosted-webapp/index.html +14 -0
  67. package/files/templates/ose-sdk-templates/icon/icon.png +0 -0
  68. package/files/templates/ose-sdk-templates/js-service/helloclient.js +31 -0
  69. package/files/templates/ose-sdk-templates/js-service/helloworld_webos_service.js +188 -0
  70. package/files/templates/ose-sdk-templates/qml-app/main.qml +68 -0
  71. package/files/templates/ose-sdk-templates/qmlappinfo/appinfo.json +10 -0
  72. package/files/templates/ose-sdk-templates/serviceinfo/package.json +11 -0
  73. package/files/templates/ose-sdk-templates/serviceinfo/services.json +8 -0
  74. package/files/templates/tv-sdk-templates/appinfo/appinfo.json +10 -0
  75. package/files/templates/tv-sdk-templates/bootplate-web/index.html +58 -0
  76. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/LICENSE-2.0.txt +202 -0
  77. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/webOSTV-dev.js +1 -0
  78. package/files/templates/tv-sdk-templates/bootplate-web/webOSTVjs-1.2.4/webOSTV.js +1 -0
  79. package/files/templates/tv-sdk-templates/hosted-webapp/index.html +14 -0
  80. package/files/templates/tv-sdk-templates/js-service/helloworld_service.js +37 -0
  81. package/files/templates/tv-sdk-templates/packageinfo/packageinfo.json +4 -0
  82. package/files/templates/tv-sdk-templates/serviceinfo/package.json +11 -0
  83. package/files/templates/tv-sdk-templates/serviceinfo/services.json +8 -0
  84. package/files/templates/tv-sdk-templates/webicon/icon.png +0 -0
  85. package/files/templates/tv-sdk-templates/webicon/largeIcon.png +0 -0
  86. package/lib/base/ares.html +40 -0
  87. package/lib/base/cli-appdata.js +289 -0
  88. package/lib/base/cli-control.js +44 -0
  89. package/lib/base/common-tools.js +29 -0
  90. package/lib/base/error-handler.js +265 -0
  91. package/lib/base/file-watcher.js +155 -0
  92. package/lib/base/help-format.js +147 -0
  93. package/lib/base/luna.js +178 -0
  94. package/lib/base/novacom.js +1191 -0
  95. package/lib/base/sdkenv.js +59 -0
  96. package/lib/base/server.js +137 -0
  97. package/lib/base/setup-device.js +324 -0
  98. package/lib/base/version-tools.js +79 -0
  99. package/lib/com.sdk.ares.hostedapp.ipk +0 -0
  100. package/lib/device.js +1419 -0
  101. package/lib/generator.js +377 -0
  102. package/lib/inspect.js +494 -0
  103. package/lib/install.js +463 -0
  104. package/lib/launch.js +605 -0
  105. package/lib/log.js +584 -0
  106. package/lib/package.js +2129 -0
  107. package/lib/pull.js +231 -0
  108. package/lib/pusher.js +210 -0
  109. package/lib/session.js +74 -0
  110. package/lib/shell.js +193 -0
  111. package/lib/tar-filter-pack.js +62 -0
  112. package/lib/util/copy.js +31 -0
  113. package/lib/util/createFileName.js +40 -0
  114. package/lib/util/eof.js +30 -0
  115. package/lib/util/json.js +63 -0
  116. package/lib/util/merge.js +14 -0
  117. package/lib/util/objclone.js +40 -0
  118. package/lib/util/spinner.js +37 -0
  119. package/npm-shrinkwrap.json +85 -0
  120. package/package.json +98 -0
  121. package/spec/helpers/reporter.js +65 -0
  122. package/spec/jsSpecs/apiTest/generator.spec.js +372 -0
  123. package/spec/jsSpecs/apiTest/inspector.spec.js +89 -0
  124. package/spec/jsSpecs/apiTest/installer.spec.js +67 -0
  125. package/spec/jsSpecs/apiTest/launcher.spec.js +150 -0
  126. package/spec/jsSpecs/apiTest/packager.spec.js +194 -0
  127. package/spec/jsSpecs/apiTest/puller.spec.js +101 -0
  128. package/spec/jsSpecs/apiTest/pusher.spec.js +103 -0
  129. package/spec/jsSpecs/apiTest/server.spec.js +115 -0
  130. package/spec/jsSpecs/apiTest/setupDevice.spec.js +93 -0
  131. package/spec/jsSpecs/apiTest/shell.spec.js +49 -0
  132. package/spec/jsSpecs/ares-config.spec.js +78 -0
  133. package/spec/jsSpecs/ares-device.spec.js +443 -0
  134. package/spec/jsSpecs/ares-generate.spec.js +397 -0
  135. package/spec/jsSpecs/ares-inspect.spec.js +252 -0
  136. package/spec/jsSpecs/ares-install.spec.js +150 -0
  137. package/spec/jsSpecs/ares-launch.spec.js +301 -0
  138. package/spec/jsSpecs/ares-log.spec.js +824 -0
  139. package/spec/jsSpecs/ares-novacom.spec.js +149 -0
  140. package/spec/jsSpecs/ares-package.spec.js +1211 -0
  141. package/spec/jsSpecs/ares-pull.spec.js +157 -0
  142. package/spec/jsSpecs/ares-push.spec.js +146 -0
  143. package/spec/jsSpecs/ares-server.spec.js +160 -0
  144. package/spec/jsSpecs/ares-setup-device.spec.js +281 -0
  145. package/spec/jsSpecs/ares-shell.spec.js +220 -0
  146. package/spec/jsSpecs/ares.spec.js +83 -0
  147. package/spec/jsSpecs/common-spec.js +169 -0
  148. package/spec/support/jasmine.json +22 -0
  149. package/spec/tempFiles/com.jasmine.native.app_0.0.1_arm.ipk +0 -0
  150. package/spec/tempFiles/com.jasmine.native.app_0.0.1_x86.ipk +0 -0
  151. package/spec/tempFiles/com.jasmine.web.app_0.0.1_all.ipk +0 -0
  152. package/spec/tempFiles/com.logtest.web.app_1.0.0_all.ipk +0 -0
  153. package/spec/tempFiles/copyFiles/helloFile.txt +1 -0
  154. package/spec/tempFiles/copyFiles/testFile.txt +1 -0
  155. package/spec/tempFiles/ipks/com.sample.echo_0.0.1_all.ipk +0 -0
  156. package/spec/tempFiles/ipks/com.web.app_1.0.0_all.ipk +0 -0
  157. package/spec/tempFiles/nativeApp/auto/pkg_arm64/GLES2 +0 -0
  158. package/spec/tempFiles/nativeApp/auto/pkg_arm64/appinfo.json +9 -0
  159. package/spec/tempFiles/nativeApp/auto/pkg_arm64/icon.png +0 -0
  160. package/spec/tempFiles/nativeApp/auto/pkg_arm64/largeIcon.png +0 -0
  161. package/spec/tempFiles/nativeApp/ose/pkg_arm/Hello +0 -0
  162. package/spec/tempFiles/nativeApp/ose/pkg_arm/appinfo.json +9 -0
  163. package/spec/tempFiles/nativeApp/ose/pkg_arm/icon.png +0 -0
  164. package/spec/tempFiles/nativeApp/ose/pkg_arm/largeIcon.png +0 -0
  165. package/spec/tempFiles/nativeApp/ose/pkg_arm/package.properties +2 -0
  166. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/Hello +0 -0
  167. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/appinfo.json +9 -0
  168. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/icon.png +0 -0
  169. package/spec/tempFiles/nativeApp/oseEmul/pkg_x86/largeIcon.png +0 -0
  170. package/spec/tempFiles/nativeApp/rsi/pkg_x86/GLES2 +0 -0
  171. package/spec/tempFiles/nativeApp/rsi/pkg_x86/appinfo.json +9 -0
  172. package/spec/tempFiles/nativeApp/rsi/pkg_x86/icon.png +0 -0
  173. package/spec/tempFiles/nativeApp/rsi/pkg_x86/largeIcon.png +0 -0
  174. package/spec/tempFiles/sign/sign.crt +32 -0
  175. package/spec/tempFiles/sign/signPriv.key +52 -0
  176. package/spec/test_data/ares-generate.json +41 -0
  177. package/spec/test_data/ares.json +33 -0
@@ -0,0 +1,318 @@
1
+ #!/usr/bin/env node
2
+
3
+ /*
4
+ * Copyright (c) 2020-2024 LG Electronics Inc.
5
+ *
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+
9
+ const async = require('async'),
10
+ fs = require('fs'),
11
+ nopt = require('nopt'),
12
+ log = require('npmlog'),
13
+ path = require('path'),
14
+ launchLib = require('./../lib/launch'),
15
+ commonTools = require('./../lib/base/common-tools');
16
+
17
+ const version = commonTools.version,
18
+ cliControl = commonTools.cliControl,
19
+ help = commonTools.help,
20
+ setupDevice = commonTools.setupDevice,
21
+ appdata = commonTools.appdata,
22
+ errHndl = commonTools.errMsg;
23
+
24
+ const processName = path.basename(process.argv[1]).replace(/.js/, '');
25
+
26
+ process.on('uncaughtException', function(err) {
27
+ log.error('uncaughtException', err.toString());
28
+ log.verbose('uncaughtException', err.stack);
29
+ cliControl.end(-1);
30
+ });
31
+
32
+ if (process.argv.length === 2) {
33
+ process.argv.splice(2, 0, '--help');
34
+ }
35
+
36
+ const knownOpts = {
37
+ "running": Boolean,
38
+ "close": Boolean,
39
+ "hosted": Boolean,
40
+ "host-ip": [String, null],
41
+ "display": [String, null],
42
+ "params": [String, Array],
43
+ "inspect": Boolean,
44
+ "open": Boolean,
45
+ "simulator": [String, null],
46
+ "simulator-path": [String, null],
47
+ "device": [String, null],
48
+ "device-list": Boolean,
49
+ "version": Boolean,
50
+ "help": Boolean,
51
+ "hidden-help": Boolean,
52
+ "level": ['silly', 'verbose', 'info', 'http', 'warn', 'error']
53
+ };
54
+
55
+ const shortHands = {
56
+ "r": ["--running"],
57
+ "c": ["--close"],
58
+ "H": ["--hosted"],
59
+ "I": ["--host-ip"],
60
+ "dp": ["--display"],
61
+ "p": ["--params"],
62
+ "i": ["--inspect"],
63
+ "o": ["--open"],
64
+ "s": ["--simulator"],
65
+ "sp": ["--simulator-path"],
66
+ "d": ["--device"],
67
+ "D": ["--device-list"],
68
+ "V": ["--version"],
69
+ "h": ["--help"],
70
+ "hh": ["--hidden-help"],
71
+ "v": ["--level", "verbose"],
72
+ };
73
+
74
+ const argv = nopt(knownOpts, shortHands, process.argv, 2 /* drop 'node' & 'ares-*.js' */);
75
+
76
+ log.heading = processName;
77
+ log.level = argv.level || 'warn';
78
+ launchLib.log.level = log.level;
79
+ log.verbose("argv", argv);
80
+
81
+ /**
82
+ * For consistent of "$command -v", argv is used.
83
+ * By nopt, argv is parsed and set key-value in argv object.
84
+ * If -v or --level option is input with command, it is set key-value in argv.
85
+ * After it is deleted, If remained key is only one in argv object
86
+ * (If any other are remained, it's mean another options is input)
87
+ * and there is no remaining after parsing the input command by nopt
88
+ * (If any other are remained, it's mean another parameters ares input),
89
+ * each command of webOS CLI print help message with log message.
90
+ */
91
+ if (argv.level) {
92
+ delete argv.level;
93
+ if (argv.argv.remain.length === 0 && (Object.keys(argv)).length === 1) {
94
+ argv.help = true;
95
+ }
96
+ }
97
+
98
+ const options = {
99
+ device: argv.device,
100
+ inspect: argv.open || argv.inspect,
101
+ open: argv.open,
102
+ installMode: "Installed",
103
+ display: argv.display,
104
+ hostIp: argv["host-ip"],
105
+ simulator: argv.simulator,
106
+ simulatorPath: argv["simulator-path"]
107
+ },
108
+ appId = argv.argv.remain[0];
109
+
110
+ if (argv.argv.remain.length > 1) {
111
+ finish("Please check arguments");
112
+ }
113
+
114
+ let op,
115
+ params = {};
116
+ if (argv.help || argv['hidden-help']) {
117
+ showUsage(argv['hidden-help']);
118
+ cliControl.end();
119
+ } else if (argv.close) {
120
+ op = close;
121
+ } else if (argv.running) {
122
+ op = running;
123
+ } else if (argv['device-list']) {
124
+ op = deviceList;
125
+ } else if (argv.version) {
126
+ version.showVersionAndExit();
127
+ } else if (argv.hosted) {
128
+ options.installMode = "Hosted";
129
+ op = launchHostedApp;
130
+ } else if (argv.simulator) {
131
+ op = launchSimulator;
132
+ } else if (argv['simulator-path']) {
133
+ if (!argv.simulator) {
134
+ finish(errHndl.getErrMsg("USE_WITH_OPTIONS", "simulator, simulator-path"));
135
+ }
136
+ } else {
137
+ op = launch;
138
+ }
139
+
140
+ if (op) {
141
+ version.checkNodeVersion(function() {
142
+ async.series([
143
+ op.bind(this)
144
+ ], finish);
145
+ });
146
+ }
147
+
148
+ function showUsage(hiddenFlag) {
149
+ if (hiddenFlag) {
150
+ help.display(processName, appdata.getConfig(true).profile, hiddenFlag);
151
+ } else {
152
+ help.display(processName, appdata.getConfig(true).profile);
153
+ }
154
+ }
155
+
156
+ function deviceList() {
157
+ setupDevice.showDeviceList(finish);
158
+ }
159
+
160
+ function launch() {
161
+ const pkgId = appId;
162
+ params = getParams();
163
+ log.info("launch()", "pkgId:", pkgId);
164
+ if (!pkgId) {
165
+ showUsage();
166
+ cliControl.end(-1);
167
+ } else {
168
+ launchLib.launch(options, pkgId, params, finish, outputTxt);
169
+ }
170
+ }
171
+
172
+ function launchHostedApp() {
173
+ const pkgId = "com.sdk.ares.hostedapp";
174
+ log.info("launchHostedApp():", "pkgId:", pkgId, ", appDir:", appId);
175
+
176
+ if (!appId) {
177
+ return finish(errHndl.getErrMsg("EMPTY_VALUE", "APP_DIR"));
178
+ }
179
+ if (!fs.existsSync(path.normalize(appId))) {
180
+ return finish(errHndl.getErrMsg("NOT_EXIST_PATH", appId));
181
+ }
182
+ if (options.hostIp) {
183
+ if (options.hostIp === "true") {
184
+ return finish(errHndl.getErrMsg("EMPTY_VALUE", "HOST_IP"));
185
+ } else {
186
+ const ipFormat = /^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/mg;
187
+ if (!ipFormat.exec(options.hostIp)) {
188
+ return finish(errHndl.getErrMsg("INVALID_IP", options.hostIp));
189
+ }
190
+ }
191
+ }
192
+
193
+ options.hostedurl = fs.realpathSync(appId);
194
+ params = getParams();
195
+ launchLib.launch(options, pkgId, params, finish, outputTxt);
196
+ }
197
+
198
+ function getParams() {
199
+ const inputParams = argv.params || [];
200
+ params = {};
201
+ if (inputParams.length === 1 && inputParams[0].indexOf('{') !== -1 && inputParams[0].indexOf('}') !== -1 &&
202
+ ((inputParams[0].split("'").length - 1) % 2) === 0) {
203
+ // eslint-disable-next-line no-useless-escape
204
+ inputParams[0] = inputParams[0].replace(/\'/g,'"');
205
+ }
206
+ inputParams.forEach(function(strParam) {
207
+ try {
208
+ const data = JSON.parse(strParam);
209
+ for (const k in data) {
210
+ params[k] = data[k];
211
+ }
212
+ } catch (err) {
213
+ const tokens = strParam.split('=');
214
+ if (tokens.length === 2) {
215
+ params[tokens[0]] = tokens[1];
216
+ } else {
217
+ log.warn('Ignoring invalid arguments:', strParam);
218
+ }
219
+ }
220
+ });
221
+
222
+ if (argv.display !== undefined && isNaN(Number(argv.display))) {
223
+ return finish(errHndl.getErrMsg("INVALID_DISPLAY"));
224
+ }
225
+
226
+ log.info("getParams()", "params:", JSON.stringify(params));
227
+ return params;
228
+ }
229
+
230
+ function close() {
231
+ const pkgId = appId;
232
+ params = getParams();
233
+ log.info("close()", "pkgId:", pkgId);
234
+ if (!pkgId) {
235
+ showUsage();
236
+ cliControl.end(-1);
237
+ }
238
+ launchLib.close(options, pkgId, params, finish);
239
+ }
240
+
241
+ function running() {
242
+ launchLib.listRunningApp(options, function(err, runningApps) {
243
+ let strRunApps = "";
244
+ let cnt = 0;
245
+
246
+ if (err) {
247
+ return finish(err);
248
+ }
249
+ if (runningApps instanceof Array) runningApps.forEach(function(runApp) {
250
+ if (cnt++ !== 0) {
251
+ strRunApps = strRunApps.concat('\n');
252
+ }
253
+ strRunApps = strRunApps.concat(runApp.id);
254
+ if (runApp.displayId !== undefined) {
255
+ strRunApps += " - display " + runApp.displayId;
256
+ }
257
+ });
258
+ finish(null, {msg: strRunApps});
259
+ });
260
+ }
261
+
262
+ function launchSimulator() {
263
+ log.info("launchSimulator():", "simulator:", options.simulator, "/ simulatorPath:", options.simulator, "/ appDir:", appId);
264
+
265
+ const curConfigData = appdata.getConfig();
266
+ if (curConfigData.profile !== "tv") {
267
+ return finish(errHndl.getErrMsg("NOT_SUPPORT_OPTION", curConfigData.profile));
268
+ }
269
+ if (options.simulator === 'true') {
270
+ return finish(errHndl.getErrMsg("EMPTY_VALUE", "WEBOS_TV_VERSION"));
271
+ }
272
+ if (options.simulatorPath === 'true') {
273
+ return finish(errHndl.getErrMsg("EMPTY_VALUE", "simlator-path"));
274
+ }
275
+
276
+ if (!appId) {
277
+ return finish(errHndl.getErrMsg("EMPTY_VALUE", "APP_DIR"));
278
+ } else {
279
+ const appDir = path.resolve(appId);
280
+ if (!fs.existsSync(appDir)) {
281
+ return finish(errHndl.getErrMsg("NOT_EXIST_PATH", appId));
282
+ } else if (!fs.statSync(appDir).isDirectory()) {
283
+ return finish(errHndl.getErrMsg("NOT_DIRTYPE_PATH", appId));
284
+ }
285
+
286
+ params = getParams();
287
+ launchLib.launchSimulator(options, appDir, params, finish, outputTxt);
288
+ }
289
+ }
290
+
291
+ function outputTxt(value) {
292
+ log.info("outputTxt()", "value:", value);
293
+ console.log(value);
294
+ }
295
+
296
+ function finish(err, value) {
297
+ log.info("finish()");
298
+ if (err) {
299
+ // handle err from getErrMsg()
300
+ if (Array.isArray(err) && err.length > 0) {
301
+ for (const index in err) {
302
+ log.error(err[index].heading, err[index].message);
303
+ }
304
+ log.verbose(err[0].stack);
305
+ } else {
306
+ // handle general err (string & object)
307
+ log.error(err.toString());
308
+ log.verbose(err.stack);
309
+ }
310
+ cliControl.end(-1);
311
+ } else {
312
+ log.verbose("finish()", "value:", value);
313
+ if (value && value.msg) {
314
+ console.log(value.msg);
315
+ }
316
+ cliControl.end();
317
+ }
318
+ }
@@ -0,0 +1,255 @@
1
+ #!/usr/bin/env node
2
+
3
+ /*
4
+ * Copyright (c) 2021-2024 LG Electronics Inc.
5
+ *
6
+ * SPDX-License-Identifier: Apache-2.0
7
+ */
8
+
9
+ const async = require('async'),
10
+ nopt = require('nopt'),
11
+ log = require('npmlog'),
12
+ path = require('path'),
13
+ logLib = require('./../lib/log'),
14
+ commonTools = require('./../lib/base/common-tools');
15
+
16
+ const version = commonTools.version,
17
+ cliControl = commonTools.cliControl,
18
+ help = commonTools.help,
19
+ appdata = commonTools.appdata,
20
+ setupDevice = commonTools.setupDevice,
21
+ errHndl = commonTools.errMsg;
22
+
23
+ let processName = path.basename(process.argv[1]).replace(/.js/, '');
24
+
25
+ process.on('uncaughtException', function(err) {
26
+ log.error('uncaughtException', err.toString());
27
+ log.verbose('uncaughtException', err.stack);
28
+ cliControl.end(-1);
29
+ });
30
+
31
+ const knownOpts = {
32
+ "help": Boolean,
33
+ "version": Boolean,
34
+ "level": ['silly', 'verbose', 'info', 'http', 'warn', 'error'],
35
+ "device": [String, null],
36
+ "device-list": Boolean,
37
+ // command options
38
+ "switch-daemon": String,
39
+ "current-daemon": Boolean,
40
+ // show options
41
+ "lines": Number,
42
+ "reverse": Boolean,
43
+ "follow": Boolean,
44
+ // filter options
45
+ "since": String,
46
+ "until": String,
47
+ "priority": String,
48
+ "kernel": Boolean,
49
+ "boot": Boolean,
50
+ "pid": Number,
51
+ // output option
52
+ "output": Boolean,
53
+ // save option
54
+ "save": Boolean,
55
+ // read options
56
+ "file": String,
57
+ "file-list": Boolean,
58
+ // unit options
59
+ "unit": String,
60
+ "unit-list": Boolean,
61
+ "display": [String, null],
62
+ // context options
63
+ "context-list": Boolean,
64
+ "set-level": String,
65
+ "id-filter": String
66
+ };
67
+
68
+ const shortHands = {
69
+ // generic aliases
70
+ "h": ["--help"],
71
+ "V": ["--version"],
72
+ "v": ["--level", "verbose"],
73
+ "d": ["--device"],
74
+ "D": ["--device-list"],
75
+ "sd": ["--switch-daemon"],
76
+ "cd": ["--current-daemon"],
77
+ "n": ["--lines"],
78
+ "r": ["--reverse"],
79
+ "f": ["--follow"],
80
+ "S": ["--since"],
81
+ "U": ["--until"],
82
+ "p": ["--priority"],
83
+ "k": ["--dmesg"],
84
+ "b": ["--boot"],
85
+ "pid": ["--pid"],
86
+ "o": ["--output"],
87
+ "s": ["--save"],
88
+ "file": ["--file"],
89
+ "fl": ["--file-list"],
90
+ "u": ["--unit"],
91
+ "ul": ["--unit-list"],
92
+ "dp": ["--display"],
93
+ "cl": ["--context-list"],
94
+ "sl": ["--set-level"],
95
+ "id": ["--id-filter"]
96
+ };
97
+
98
+ const argv = nopt(knownOpts, shortHands, process.argv, 2 /* drop 'node' & 'ares-*.js'*/);
99
+
100
+ log.heading = processName;
101
+ log.level = argv.level || 'warn';
102
+ log.verbose("argv", argv);
103
+
104
+ const curConfigData = appdata.getConfig(true);
105
+ if (curConfigData.profile !== "ose") {
106
+ return finish(errHndl.getErrMsg("NOT_SUPPORT_COMMOND", curConfigData.profile));
107
+ }
108
+
109
+ const options = {
110
+ device: argv.device,
111
+ display: argv.display,
112
+ argv: argv
113
+ };
114
+
115
+ const pmLogOptions = ["follow", "lines", "context-list", "set-level", "id-filter", "save", "level", "device"],
116
+ journalLogOptions = ["follow", "reverse", "lines", "since", "until", "pid", "dmesg", "boot", "output", "file",
117
+ "priority", "save", "display", "level", "device", "file", "file-list", "unit", "unit-list"];
118
+
119
+ let op;
120
+ if (argv['device-list']) {
121
+ op = deviceList;
122
+ } else if (argv.version) {
123
+ version.showVersionAndExit();
124
+ } else if (argv.help) {
125
+ const currentDaemon = appdata.getConfig().logDaemon;
126
+ if (currentDaemon === "pmlogd") {
127
+ processName += "-pmlogd";
128
+ }
129
+ help.display(processName, appdata.getConfig().profile);
130
+ cliControl.end();
131
+ } else if (argv['current-daemon']) {
132
+ op = checkCurrentDaemon;
133
+ } else if (argv['switch-daemon']) {
134
+ op = switchDaemon;
135
+ } else if (argv['unit-list']) {
136
+ op = showUnitList;
137
+ } else if (argv['file-list'] || argv.file) {
138
+ op = readMode;
139
+ } else if (argv['context-list'] || argv['set-level']) {
140
+ op = contextMode;
141
+ } else {
142
+ op = showLog;
143
+ }
144
+
145
+ if (op) {
146
+ version.checkNodeVersion(function(err) {
147
+ if (err)
148
+ return finish(err);
149
+ async.series([
150
+ op.bind(this)
151
+ ],finish);
152
+ });
153
+ }
154
+
155
+ function deviceList() {
156
+ setupDevice.showDeviceList(finish);
157
+ }
158
+
159
+ function showLog() {
160
+ log.info("showLog()");
161
+
162
+ checkOption();
163
+ logLib.show(options, finish);
164
+ }
165
+
166
+ function readMode() {
167
+ log.info("readMode()");
168
+
169
+ checkOption();
170
+ logLib.readMode(options, finish);
171
+ }
172
+
173
+ function showUnitList() {
174
+ log.info("showUnitList()");
175
+
176
+ checkOption();
177
+ logLib.printUnitList(options, finish);
178
+ }
179
+
180
+ function contextMode() {
181
+ log.info("contextMode()");
182
+
183
+ checkOption();
184
+ logLib.contextMode(options, finish);
185
+ }
186
+
187
+ function checkCurrentDaemon() {
188
+ log.info("checkCurrentDaemon()");
189
+
190
+ options.currentDaemon = appdata.getConfig().logDaemon;
191
+ logLib.checkLogDaemon(options, finish);
192
+ }
193
+
194
+ function switchDaemon() {
195
+ log.info("switchDaemon()");
196
+
197
+ if (argv['switch-daemon'] !== "journald" && argv['switch-daemon'] !== "pmlogd") {
198
+ return finish(errHndl.getErrMsg("NOT_EXIST_LOGDAEMON"));
199
+ }
200
+
201
+ const configData = appdata.getConfig();
202
+ configData.logDaemon = argv['switch-daemon'];
203
+ appdata.setConfig(configData);
204
+ options.currentDaemon = configData.logDaemon;
205
+
206
+ logLib.checkLogDaemon(options, finish);
207
+ }
208
+
209
+ function checkOption() {
210
+ options.currentDaemon = appdata.getConfig(true).logDaemon;
211
+ options.currentOption = Object.keys(argv);
212
+ options.currentOption.splice(-1, 1);
213
+
214
+ if (options.currentDaemon === "journald") {
215
+ log.info("checkOption()", "journald options");
216
+
217
+ options.currentOption.forEach(function(item) {
218
+ if (!journalLogOptions.includes(item)) {
219
+ return finish(errHndl.getErrMsg("NOT_SUPPORT_JOURNALD", item));
220
+ }
221
+ });
222
+ } else if (options.currentDaemon === "pmlogd") {
223
+ log.info("checkOption()", "pmlogd options");
224
+
225
+ options.currentOption.forEach(function(item) {
226
+ if (!pmLogOptions.includes(item)) {
227
+ return finish(errHndl.getErrMsg("NOT_SUPPORT_PMLOGD", item));
228
+ }
229
+ });
230
+ }
231
+ }
232
+
233
+ function finish(err, value) {
234
+ log.info("finish()");
235
+ if (err) {
236
+ // handle err from getErrMsg()
237
+ if (Array.isArray(err) && err.length > 0) {
238
+ for (const index in err) {
239
+ log.error(err[index].heading, err[index].message);
240
+ }
241
+ log.verbose(err[0].stack);
242
+ } else {
243
+ // handle general err (string & object)
244
+ log.error(err.toString());
245
+ log.verbose(err.stack);
246
+ }
247
+ cliControl.end(-1);
248
+ } else {
249
+ log.verbose("finish()", "value:", value);
250
+ if (value && value.msg) {
251
+ console.log(value.msg);
252
+ }
253
+ cliControl.end();
254
+ }
255
+ }