adding test files
[henge/kiak.git] / opts.js
1 /**
2 * @file Establishes runtime options from args and config files
3 * @author Ken Grimes
4 * @version 0.0.1
5 * @license AGPL-3.0
6 * @copyright jk software 2017
7 */
8 const fs = require('fs')
9 const path = require('path')
10
11 /**
12 * @summary Parse arguments with minimist
13 */
14 exports = require('minimist')(process.argv.slice(2), {
15 string: [ 'config', 'client-js', 'host-js', 'ca-cert', 'ca-key',
16 'port', 'bind', 'electron', 'file-dir', 'dedicated'
17 ],
18 boolean: [ 'no-tls', 'legacy-socket' ],
19 alias: { c: 'config',
20 j: 'client-js',
21 J: 'host-js',
22 C: 'ca-cert',
23 K: 'ca-key',
24 p: 'port',
25 b: 'bind',
26 e: 'electron',
27 d: 'file-dir',
28 D: 'dedicated'
29 },
30 stopEarly: true,
31 unknown: (opt) => {
32 console.log('Unknown operator: ' + opt)
33 console.log(process.argv.join(' '))
34 console.log(fs.readFileSync('./usage', { encoding: 'utf8' }))
35 process.exit()
36 }
37 })
38
39 /**
40 * @summary Defaults
41 */
42 exports['defaults'] = {
43 config: '/etc/strapp.conf:~/.strapp/strapp.conf:./strapp.conf',
44 'client-js': './client.js',
45 'host-js': './host.js',
46 tls: true,
47 'ca-cert': '../certs/cert.pem',
48 'ca-key': '../certs/key.pem',
49 port: 2443,
50 bind: 'www:./www',
51 electron: undefined,
52 'file-dir': undefined,
53 dedicated: undefined,
54 'legacy-socket': false
55 }
56
57 exports = Object.assign({}, exports['defaults'], exports)
58
59 /**
60 * @summary Parse config files
61 */
62 exports['conf'] = {}
63 exports['config'].split(':').forEach((fileName) => {
64 let filePath = path.resolve(fileName)
65 if (fs.existsSync(filePath)){
66 let lineNo = 0;
67 String(fs.readFileSync(path.resolve(fileName))).split('\n').forEach((line) => {
68 lineNo++
69 /* Skip comments */
70 if (!line.match(/[\s]*#/)) {
71 let kv = line.replace(/#.*/g,'').replace(/\s/g,'').split('=')
72 if (kv.length == 2 && kv[0] in exports['defaults']) {
73 /* Multiple "bind=..." lines in are additive */
74 if (kv[0] === 'bind' && 'bind' in exports['conf']) {
75 kv[1] = exports['conf']['bind'] + ',' + kv[1]
76 }
77 exports['conf'][kv[0]] = kv[1]
78 }
79 else
80 console.log(`WARN: Bad option ${line} in ${fileName}:${lineNo}`)
81 }
82 })
83 }
84 else if (exports['config'] !== exports['defaults']['config'])
85 console.log(`WARN: opt '-c${exports['config']}', ${fileName} inaccessible`)
86 })
87
88 exports = Object.assign({}, exports['defaults'], exports['conf'], exports)
89
90 /**
91 * @summary Parse bindings
92 */
93 exports['bindings'] = {}
94 exports['bind'].replace(/\s/g,'').split(',').forEach((kvp) => {
95 let kv = kvp.split(':')
96 kv[1] = path.resolve(kv[1])
97 if (fs.existsSync(kv[1])) {
98 if (kv.length == 2 && /^[-_.A-Za-z0-9]/g.test(kv[0]))
99 exports['bindings'][kv[0]] = path.normalize(kv[1])
100 else
101 console.log(`WARN: Invalid binding: ${kvp}`)
102 }
103 else
104 console.log(`WARN: Binding not made, directory ${kvp} inaccessible`)
105 })
106
107 module.exports = exports