1 | var 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 |
|
11 | var SEALIGHTS_JSON_FILENAME = "./sealights.json";
|
12 | var 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 |
|
41 | var parsedArgs = parseCommandLineArguments();
|
42 | if (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 |
|
58 | function 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 |
|
89 | function 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 |
|
97 | function 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 |
|
107 | function 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 |
|
121 | function 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 |
|
153 | function 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 |
|
160 | function 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 |
|
171 | function 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 |
|
199 | function createLogger(){
|
200 | var log = bunyan.createLogger({
|
201 | name: "CIA-Config",
|
202 | });
|
203 |
|
204 | return log;
|
205 | } |
\ | No newline at end of file |