1 | (function() {
|
2 | var _, async, createConfig, defaultConfig, fs, guid, maxTenantIndex, mkdirp, parseToml, path, pkg, readData, readQbData, tenantsType, toml, tweak, version, writeQbData;
|
3 |
|
4 | _ = require('lodash');
|
5 |
|
6 | async = require('async');
|
7 |
|
8 | fs = require('fs');
|
9 |
|
10 | path = require('path');
|
11 |
|
12 | mkdirp = require('mkdirp');
|
13 |
|
14 | toml = require('toml');
|
15 |
|
16 | pkg = require('../package.json');
|
17 |
|
18 | exports.version = version = function() {
|
19 | var ref;
|
20 | return {
|
21 | name: 'Ground2Cloud',
|
22 | version: pkg.version,
|
23 | display: (ref = pkg.displayVersion) != null ? ref : pkg.version
|
24 | };
|
25 | };
|
26 |
|
27 | defaultConfig = "[server]\nproxyPort = 8090\nsecureProxyPort = 8453\nbackPort = 3014\nlistenPort = 3016\nregistryfile = \"./registry\"\nregistryUrl = \"redis://localhost:6379\"\nstatsUrl = \"elastic://localhost:9200\"\napiPort = 8101\n\n[server.vitae]\nenvironment = \"local\"\n# environment = \"staging\"\nendpoint = \"http://REGID.localhost:8090\"\n# endpoint = \"https://REGID.g2c-staging.cloud-elements.com\"\n\n[client]\nhost = \"localhost\"\nport = 22\nbackPort = 3014\nusername = \"username\"\nlistenPort = 3015\nbindAddr = \"0.0.0.0\"\napiPort = 8100\n\n[client.vitae]\nbrand = \"ce\"\n\n[client.local]\nhost = \"localhost\"\nport = 8088\n";
|
28 |
|
29 | exports.readConfig = function(configPath, cb) {
|
30 | return createConfig(configPath, function(err, made, configPath) {
|
31 | if (err != null) {
|
32 | return cb(err, configPath);
|
33 | }
|
34 | return readData(configPath, cb);
|
35 | });
|
36 | };
|
37 |
|
38 | exports.pickConfig = function(configPath) {
|
39 | var configDirPath, home;
|
40 | if (configPath != null) {
|
41 | return configPath;
|
42 | }
|
43 | home = process.env.HOME || process.env.USERPROFILE;
|
44 | configDirPath = path.join(home, '.petit');
|
45 | return path.join(configDirPath, 'config.toml');
|
46 | };
|
47 |
|
48 | exports.createConfig = createConfig = function(configPath, cb) {
|
49 | var configDirPath, home;
|
50 | if (configPath == null) {
|
51 | home = process.env.HOME || process.env.USERPROFILE;
|
52 | configDirPath = path.join(home, '.petit');
|
53 | configPath = path.join(configDirPath, 'config.toml');
|
54 | } else {
|
55 | configDirPath = path.dirname(configPath);
|
56 | }
|
57 | return mkdirp(configDirPath, function(err) {
|
58 | if (err != null) {
|
59 | return cb(err, false, configPath);
|
60 | }
|
61 | return fs.exists(configPath, function(exists) {
|
62 | if (!exists) {
|
63 | return fs.writeFile(configPath, defaultConfig, {
|
64 | encoding: 'utf8'
|
65 | }, function(err) {
|
66 | return cb(err, true, configPath);
|
67 | });
|
68 | } else {
|
69 | return cb(null, false, configPath);
|
70 | }
|
71 | });
|
72 | });
|
73 | };
|
74 |
|
75 | exports.readRegistration = function(configPath, configData, cb) {
|
76 | var regs, tenPath;
|
77 | tenPath = path.join(path.dirname(configPath), 'tenants');
|
78 | regs = [];
|
79 | return mkdirp(tenPath, function(err) {
|
80 | if (err != null) {
|
81 | return cb(err);
|
82 | }
|
83 | return fs.readdir(tenPath, function(err, dirs) {
|
84 | if (err != null) {
|
85 | return cb(err);
|
86 | }
|
87 | return async.each(dirs, function(dir, cb) {
|
88 | var regfile, tendir;
|
89 | tendir = path.join(tenPath, dir);
|
90 | regfile = path.join(tendir, 'registration');
|
91 | return fs.exists(regfile, function(exists) {
|
92 | if (exists) {
|
93 | return fs.readFile(regfile, {
|
94 | encoding: 'utf8'
|
95 | }, function(err, fdata) {
|
96 | var e, obj;
|
97 | if (err != null) {
|
98 | return cb(err);
|
99 | }
|
100 | try {
|
101 | obj = JSON.parse(fdata);
|
102 | obj.dir = tendir;
|
103 | regs.push(obj);
|
104 | } catch (error) {
|
105 | e = error;
|
106 | return cb(e);
|
107 | }
|
108 | return cb(null);
|
109 | });
|
110 | } else {
|
111 | return cb(null);
|
112 | }
|
113 | });
|
114 | }, function(err) {
|
115 | return cb(err, regs);
|
116 | });
|
117 | });
|
118 | });
|
119 | };
|
120 |
|
121 | exports.readKey = function(configPath, configData, cb) {
|
122 | var keyPath;
|
123 | keyPath = path.join(path.dirname(configPath), 'key');
|
124 | return fs.exists(keyPath, function(exists) {
|
125 | if (exists) {
|
126 | return fs.readFile(keyPath, {
|
127 | encoding: 'utf8'
|
128 | }, cb);
|
129 | } else {
|
130 | return cb(null);
|
131 | }
|
132 | });
|
133 | };
|
134 |
|
135 | readData = function(configPath, cb) {
|
136 | return fs.readFile(configPath, {
|
137 | encoding: 'utf8'
|
138 | }, function(err, data) {
|
139 | if (err != null) {
|
140 | return cb(err, configPath);
|
141 | }
|
142 | return parseToml(configPath, data, function(err, configPath, parsed) {
|
143 | var runtimePath;
|
144 | runtimePath = path.join(path.dirname(configPath), 'runtime.json');
|
145 | return fs.exists(runtimePath, function(exists) {
|
146 | if (!exists) {
|
147 | return cb(err, configPath, parsed);
|
148 | }
|
149 | return fs.readFile(runtimePath, {
|
150 | encoding: 'utf8'
|
151 | }, function(err, data) {
|
152 | if (err != null) {
|
153 | return cb(err, configPath);
|
154 | }
|
155 | try {
|
156 | parsed.runtime = JSON.parse(data);
|
157 | } catch (error) {
|
158 | err = error;
|
159 | return cb(err, configPath);
|
160 | }
|
161 | return readQbData(configPath, parsed, cb);
|
162 | });
|
163 | });
|
164 | });
|
165 | });
|
166 | };
|
167 |
|
168 | readQbData = function(configPath, parsed, cb) {
|
169 | var qbPath;
|
170 | qbPath = path.join(path.dirname(configPath), 'qb.json');
|
171 | return fs.exists(qbPath, function(exists) {
|
172 | if (!exists) {
|
173 | return cb(null, configPath, parsed);
|
174 | }
|
175 | return fs.readFile(qbPath, {
|
176 | encoding: 'utf8'
|
177 | }, function(err, data) {
|
178 | if (err != null) {
|
179 | return cb(err, configPath);
|
180 | }
|
181 | try {
|
182 | if (parsed.client == null) {
|
183 | parsed.client = {};
|
184 | }
|
185 | parsed.client.qbmonitor = JSON.parse(data);
|
186 | } catch (error) {
|
187 | err = error;
|
188 | return cb(err, configPath, parsed);
|
189 | }
|
190 | return cb(null, configPath, parsed);
|
191 | });
|
192 | });
|
193 | };
|
194 |
|
195 | exports.writeQbData = writeQbData = function(clconfigData, cb) {
|
196 | var qbPath, qbdata;
|
197 | qbPath = path.join(path.dirname(clconfigData.configPath), 'qb.json');
|
198 | qbdata = JSON.stringify(clconfigData.qbmonitor, null, 2);
|
199 | return fs.writeFile(qbPath, qbdata, {
|
200 | encoding: 'utf8'
|
201 | }, cb);
|
202 | };
|
203 |
|
204 | parseToml = function(configPath, data, cb) {
|
205 | var e, parsed, ref, ref1;
|
206 | try {
|
207 | parsed = tweak(configPath, toml.parse(data));
|
208 | parsed.configPath = configPath;
|
209 | if ((ref = parsed.server) != null) {
|
210 | ref.configPath = configPath;
|
211 | }
|
212 | if ((ref1 = parsed.client) != null) {
|
213 | ref1.configPath = configPath;
|
214 | }
|
215 | } catch (error) {
|
216 | e = error;
|
217 | return cb(e, configPath);
|
218 | }
|
219 | return cb(null, configPath, parsed);
|
220 | };
|
221 |
|
222 | tweak = function(configPath, data) {
|
223 | var dirname;
|
224 | dirname = path.dirname(configPath);
|
225 | if (_.isString(data)) {
|
226 | if (_.startsWith(data, './')) {
|
227 | return path.join(dirname, data.substr(2));
|
228 | } else if (_.startsWith(data, '../')) {
|
229 | return path.join(path.dirname(dirname), data.substr(3));
|
230 | } else {
|
231 | return data;
|
232 | }
|
233 | } else if (_.isObject(data)) {
|
234 | return _.forOwn(data, function(v, k) {
|
235 | return data[k] = tweak(configPath, v);
|
236 | });
|
237 | } else {
|
238 | return data;
|
239 | }
|
240 | };
|
241 |
|
242 | tenantsType = function(cfgData, reg, cb) {
|
243 | var tenPath;
|
244 | tenPath = path.join(path.dirname(cfgData.configPath), 'tenants');
|
245 | return mkdirp(tenPath, function(err) {
|
246 | if (err != null) {
|
247 | return cb(err);
|
248 | }
|
249 | return fs.readdir(tenPath, function(err, dirs) {
|
250 | if (err != null) {
|
251 | return cb(err);
|
252 | }
|
253 | return async.filter(dirs, function(dir, cb) {
|
254 | return fs.readdir(path.join(tenPath, dir), function(err, files) {
|
255 | if (err != null) {
|
256 | return cb(err);
|
257 | }
|
258 | return cb(null, (files.indexOf('registration') === -1) === reg);
|
259 | });
|
260 | }, function(err, dirs) {
|
261 | return cb(err, tenPath, dirs);
|
262 | });
|
263 | });
|
264 | });
|
265 | };
|
266 |
|
267 | exports.unregisteredTenants = function(cfgData, cb) {
|
268 | return tenantsType(cfgData, true, cb);
|
269 | };
|
270 |
|
271 | exports.registeredTenants = function(cfgData, cb) {
|
272 | return tenantsType(cfgData, false, cb);
|
273 | };
|
274 |
|
275 | exports.allTenants = function(cfgData, cb) {
|
276 | var tenPath;
|
277 | tenPath = path.join(path.dirname(cfgData.configPath), 'tenants');
|
278 | return mkdirp(tenPath, function(err) {
|
279 | if (err != null) {
|
280 | return cb(err);
|
281 | }
|
282 | return fs.readdir(tenPath, function(err, dirs) {
|
283 | if (err != null) {
|
284 | return cb(err);
|
285 | }
|
286 | return async.map(dirs, function(dir, cb) {
|
287 | var regFile, tendir;
|
288 | tendir = path.join(tenPath, dir);
|
289 | regFile = path.join(tendir, 'registration');
|
290 | return fs.exists(regFile, function(exists) {
|
291 | if (exists) {
|
292 | return fs.readFile(regFile, {
|
293 | encoding: 'utf8'
|
294 | }, function(err, data) {
|
295 | var e, obj;
|
296 | if (err != null) {
|
297 | return cb(err);
|
298 | }
|
299 | try {
|
300 | obj = JSON.parse(data);
|
301 | } catch (error) {
|
302 | e = error;
|
303 | return cb(e);
|
304 | }
|
305 | return cb(null, {
|
306 | dir: tendir,
|
307 | name: dir,
|
308 | registered: true,
|
309 | registeredId: obj.id,
|
310 | registeredPort: obj.port
|
311 | });
|
312 | });
|
313 | } else {
|
314 | return cb(null, {
|
315 | dir: tendir,
|
316 | name: dir,
|
317 | registered: false
|
318 | });
|
319 | }
|
320 | });
|
321 | }, function(err, tens) {
|
322 | return cb(err, tenPath, tens);
|
323 | });
|
324 | });
|
325 | });
|
326 | };
|
327 |
|
328 | exports.tenantConfig = function(tname, cfgData, cb) {
|
329 | var tenPath;
|
330 | tenPath = path.join(path.dirname(cfgData.configPath), 'tenants');
|
331 | return mkdirp(tenPath, function(err) {
|
332 | var tCfgPath, tendir;
|
333 | if (err != null) {
|
334 | return cb(err);
|
335 | }
|
336 | tendir = path.join(tenPath, tname);
|
337 | tCfgPath = path.join(tendir, 'config.toml');
|
338 | return fs.exists(tendir, function(exists) {
|
339 | if (exists) {
|
340 | return fs.exists(tCfgPath, function(exists) {
|
341 | if (exists) {
|
342 | return fs.readFile(tCfgPath, {
|
343 | encoding: 'utf8'
|
344 | }, function(err, data) {
|
345 | var e, obj;
|
346 | try {
|
347 | obj = toml.parse(data);
|
348 | } catch (error) {
|
349 | e = error;
|
350 | return cb(e);
|
351 | }
|
352 | return cb(null, tCfgPath, obj);
|
353 | });
|
354 | } else {
|
355 | return cb(null, tCfgPath, {});
|
356 | }
|
357 | });
|
358 | } else {
|
359 | return cb("No such tenant " + tname);
|
360 | }
|
361 | });
|
362 | });
|
363 | };
|
364 |
|
365 | maxTenantIndex = function(cfgData, cb) {
|
366 | var max, tenPath;
|
367 | tenPath = path.join(path.dirname(cfgData.configPath), 'tenants');
|
368 | max = 0;
|
369 | return mkdirp(tenPath, function(err) {
|
370 | if (err != null) {
|
371 | return cb(err);
|
372 | }
|
373 | return fs.readdir(tenPath, function(err, dirs) {
|
374 | if (err != null) {
|
375 | return cb(err);
|
376 | }
|
377 | return async.each(dirs, function(dir, cb) {
|
378 | var cfgFile, tendir;
|
379 | tendir = path.join(tenPath, dir);
|
380 | cfgFile = path.join(tendir, 'config.toml');
|
381 | return fs.exists(cfgFile, function(exists) {
|
382 | if (exists) {
|
383 | return fs.readFile(cfgFile, {
|
384 | encoding: 'utf8'
|
385 | }, function(err, data) {
|
386 | var e, obj;
|
387 | if (err != null) {
|
388 | return cb(err);
|
389 | }
|
390 | try {
|
391 | obj = toml.parse(data);
|
392 | } catch (error) {
|
393 | e = error;
|
394 | return cb(e);
|
395 | }
|
396 | if (_.isNumber(obj.index)) {
|
397 | max = Math.max(max, obj.index);
|
398 | }
|
399 | return cb(null);
|
400 | });
|
401 | } else {
|
402 | return cb(null);
|
403 | }
|
404 | });
|
405 | }, function(err) {
|
406 | return cb(err, max);
|
407 | });
|
408 | });
|
409 | });
|
410 | };
|
411 |
|
412 | exports.lease = function(cfgData, cb) {
|
413 | var newten, tenPath;
|
414 | tenPath = path.join(path.dirname(cfgData.configPath), 'tenants');
|
415 | newten = path.join(tenPath, guid());
|
416 | return mkdirp(newten, function(err) {
|
417 | if (err != null) {
|
418 | return cb(err);
|
419 | }
|
420 | return maxTenantIndex(cfgData, function(err, max) {
|
421 | var cfg, cfgFile, ref, ref1, ref2, ref3;
|
422 | if (err != null) {
|
423 | return cb(err);
|
424 | }
|
425 | cfgFile = path.join(newten, 'config.toml');
|
426 | cfg = "name = \"lease\"\nindex = " + (max + 1) + "\n\n[local]\nhost = \"" + ((ref = (ref1 = cfgData.local) != null ? ref1.host : void 0) != null ? ref : 'localhost') + "\"\nport = " + ((ref2 = (ref3 = cfgData.local) != null ? ref3.port : void 0) != null ? ref2 : 8080) + "\n";
|
427 | return fs.writeFile(cfgFile, cfg, {
|
428 | encoding: 'utf8'
|
429 | }, function(err) {
|
430 | return cb(err, newten);
|
431 | });
|
432 | });
|
433 | });
|
434 | };
|
435 |
|
436 | exports.guid = guid = function() {
|
437 | var s4;
|
438 | s4 = function() {
|
439 | return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
|
440 | };
|
441 | return s4() + s4() + s4() + s4();
|
442 | };
|
443 |
|
444 | }).call(this);
|