UNPKG

6.93 kBJavaScriptView Raw
1var nopt = require("nopt"),
2 noptUsage = require("nopt-usage"),
3 fs = require("fs"),
4 readJsonSync = require('read-json-sync'),
5 utils = require('./utils.js'),
6 globalErrorHandler = require('./global-error-handler'),
7 version = require("../package.json").version,
8 SlJsInfra = require('sl-js-infra').SlJsInfra,
9 bunyan = require('bunyan');
10
11var SEALIGHTS_JSON_FILENAME = "./sealights.json";
12var knownOpts = {
13 "token": String
14 , "customerid" : String
15 , "server": String
16 , "proxy" : String
17 , "appname" : String
18 , "branch" : String
19 , "nodejsexcludedpaths" : String
20 , "usebranchcoverage": Boolean
21 , "help": Boolean
22},
23 shortHands = {
24 "h": ["--help"]
25 },
26
27 description = {
28 "token": "Sealights Token Received Upon Registration",
29 "customerid": " Customer ID (mandatory, unless already exists in sealights.json)",
30 "server": " SeaLights Server URL",
31 "proxy": " Proxy server (optional, must be a valid URL)",
32 "help": " Show this help page",
33 "nodejsexcludedpaths": "NodeJS Only. Comma-separated list of excluded paths glob strings, in the form of 'public/**/*.js,files/**/*.js'. The default value is test/**/*.js. The node_modules folder is always excluded.",
34 "usebranchcoverage": "Optional. Include branches in scan"
35 },
36
37 defaults = {
38 "help": "",
39 };
40
41var parsedArgs = parseCommandLineArguments();
42if (parsedArgs.help) {
43 printUsage();
44 process.exit(1);
45} else {
46 getConfigFromServer(parsedArgs, function (err, serverConfig) {
47 if (err)
48 {
49 console.error("Failed to get configuration from the server. Continue with current config. Error: ", err);
50 }
51 updateOrCreateCfg(err, serverConfig);
52 })
53}
54
55
56
57
58function updateOrCreateCfg(err, serverConfig) {
59
60 var cfg = {
61 "interval": 10000,
62 "enabled": true
63 };
64 var forceRewrite = false;
65 var readExistingCfgFileResult = readExistingCfgFile(SEALIGHTS_JSON_FILENAME) || {};
66 if (readExistingCfgFileResult.error) {
67 console.error("ERROR: " + readExistingCfgFileResult.error);
68 process.exit(1);
69 }
70 else if (readExistingCfgFileResult.cfg) {
71 cfg = readExistingCfgFileResult.cfg;
72 } else {
73 forceRewrite = true;
74 }
75
76 if (updateCfgFromAgruments(cfg, parsedArgs, serverConfig) > 0) {
77 forceRewrite = true;
78 }
79
80 validateCfg(cfg);
81
82 if (forceRewrite) {
83 writeFile(cfg);
84 } else {
85 console.warn('No changes made to ' + SEALIGHTS_JSON_FILENAME);
86 }
87}
88
89function parseCommandLineArguments() {
90 var parsedArgs = nopt(knownOpts, shortHands, process.argv, 2);
91 if (parsedArgs.token) {
92 utils.parseToken(parsedArgs.token, parsedArgs)
93 }
94 return parsedArgs;
95}
96
97function printUsage() {
98 try {
99 var usage = noptUsage(knownOpts, shortHands, description, defaults);
100 console.info('Usage: sl-config-cia -customerid [customerid] -server [server] -proxy [proxy]');
101 console.info(usage);
102 } catch (e) {
103 globalErrorHandler.setLastError(e);
104 }
105}
106
107function readExistingCfgFile(filename) {
108 if (fs.existsSync(filename)) {
109 try {
110 var loadedCfg = readJsonSync(filename);
111 if (Object.prototype.toString.call(loadedCfg) !== "[object Object]")
112 throw "File content is not a valid JSON object";
113 return { cfg: loadedCfg };
114 } catch (e) {
115 globalErrorHandler.setLastError(e, "Cannot read cfg file");
116 return { error: filename + " cannot be read and is probably corrupted. Please delete it and re-run.", cfg: null };
117 }
118 }
119}
120
121function updateCfgFromAgruments(cfg, parsedArgs, serverConfig) {
122 function updateField(name, cfgProperty, argName) {
123 if (serverConfig[argName]) {
124 console.info("Updating " + name + " = " + serverConfig[argName] + " From Server");
125 cfg[cfgProperty] = serverConfig[argName];
126 return true;
127 }
128 else if (parsedArgs[argName]) {
129 console.info("Updating " + name + " = " + parsedArgs[argName]);
130 cfg[cfgProperty] = parsedArgs[argName];
131 return true;
132 }
133 return false;
134 }
135 var changedFields = 0;
136 if (updateField("Token", "token", "token")) changedFields++;
137 if (updateField("Valid Token", "isValidToken", "isValidToken")) changedFields++;
138 if (updateField("Customer Id", "customerId", "customerid")) changedFields++;
139 if (updateField("Server", "server", "server")) changedFields++;
140 if (updateField("App Name", "appName", "appname")) changedFields++;
141 if (updateField("Branch", "branch", "branch")) changedFields++;
142 if (updateField("Proxy", "proxy", "proxy")) changedFields++;
143 if (updateField("Node.js excluded paths", "nodeJsExcludedPaths", "nodejsexcludedpaths")) changedFields++;
144 if (updateField("Branch Coverage", "useBranchCoverage", "usebranchcoverage")) changedFields++;
145 if (updateField("Send Logs", "sendLogs", "sendLogs")) changedFields++;
146 if (updateField("Logs Buffer Length", "bufferLength", "bufferLength")) changedFields++;
147 if (updateField("Logs Buffer Timeout", "bufferTimeout", "bufferTimeout")) changedFields++;
148
149 return changedFields;
150
151}
152
153function validateCfg(cfg) {
154 if (!cfg.customerId)
155 console.warn("WARNING: Configuration file is missing the required 'customerId' field");
156 if (!cfg.server)
157 console.warn("WARNING: Configuration file is missing the required 'server' field");
158}
159
160function writeFile(cfg) {
161 try {
162 console.info('Writing file ' + SEALIGHTS_JSON_FILENAME);
163 var json = JSON.stringify(cfg, null, '\t');
164 fs.writeFileSync(SEALIGHTS_JSON_FILENAME, json);
165 console.info('Done.');
166 } catch (e) {
167 globalErrorHandler.setLastError(e, 'Error writing to file ' + SEALIGHTS_JSON_FILENAME + ": ");
168 }
169}
170
171function getConfigFromServer(cfg, callback) {
172 if (!cfg.customerid || !cfg.server) {
173 console.warn(
174 "[CONFIG FROM SERVER] customerid and server are required for server configuration. " +
175 "Config: " + JSON.stringify(cfg)
176 );
177 return callback(null, {});
178 }
179
180 var request = {
181 appName:cfg.appname,
182 branch:cfg.branch,
183 customerId:cfg.customerid,
184 testStage:"null",
185 component:"nodejs-build",
186 version:version
187 };
188
189 var backendProxy = new SlJsInfra.BackendProxy(cfg, createLogger());
190 backendProxy.getRemoteConfig (request,function (err, resp) {
191 if (!err) {
192 console.info("[CONFIG FROM SERVER] Got Configuration From Server Successfully. Config: " + JSON.stringify(resp));
193 }
194
195 return callback(err, resp);
196 });
197}
198
199function createLogger(){
200 var log = bunyan.createLogger({
201 name: "CIA-Config",
202 });
203
204 return log;
205}
\No newline at end of file