UNPKG

13.6 kBJavaScriptView Raw
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(err, 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);
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);