lib/machine.js   A
last analyzed

Complexity

Total Complexity 27
Complexity/F 1.42

Size

Lines of Code 112
Function Count 19

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 27
eloc 68
mnd 8
bc 8
fnc 19
dl 0
loc 112
rs 10
bpm 0.421
cpm 1.421
noi 0
c 0
b 0
f 0
1
var ping = require('ping');
2
var si = require('systeminformation');
3
4
var args = require('./args.js');
5
var log = require('./logger.js').get();
6
var file = require('./file.js');
7
8
var last_read = null;
9
var cached_machines = [];
10
11
var localize = function(host) {
12
	return host.replace(/\d+\.\d+\.\d+\.\d+/, '0.0.0.0');
13
};
14
15
var readfile = function(filename, hostname) {
16
	return new Promise(function(resolve) {
17
		file.get(args.folder + filename, function(err, data) {
18
			log.debug('file:' + args.folder);
19
			log.debug('filename:' + filename);
20
			
21
			var obj = {'filename': filename};
22
			data = JSON.parse(data);
23
			obj[data.load] = data;
24
			if (obj[data.load].host && obj[data.load].host.startsWith(hostname)) {
25
				obj[data.load].host = localize(obj[data.load].host);
26
			}
27
			resolve(obj);
28
		});
29
	});
30
};
31
32
var get_all = function(IP) {
33
	return new Promise(function(resolve) {
34
		if (last_read && Date.now() < last_read + args.cache_interval) {
35
			return resolve(cached_machines);
36
		}
37
		
38
		return file.list(args.folder, function(err, files) {
39
			if (err) {
40
				log.error(err);
41
				return resolve({});
42
			}
43
			
44
			var promises = [];
45
			var hostname = IP.split(':')[0];
46
			for (var i = 0; i < files.length; ++i) {
47
				promises.push(readfile(files[i], hostname));
48
			}
49
			
50
			return Promise.all(promises).then(function(objects) {
51
				var ret = {};
52
				for (var i = 0; i < objects.length; ++i) {
53
					ret = Object.assign(ret, objects[i]);
54
				}
55
				
56
				last_read = Date.now();
57
				cached_machines = ret;
58
				return resolve(ret);
59
			});
60
		});
61
	});
62
};
63
64
var get_valid_host = function(ips, IP) {
65
	return new Promise(function(resolve) {
66
		if (!ips || !ips.length) {
67
			return resolve(localize(IP));
68
		}
69
		
70
		var ip = ips.pop();
71
		
72
		return ping.sys.probe(ip.host.replace(/(^https?:\/\/)|(:\d+$)/g, ''), function(is_alive){
73
			if (is_alive) {
74
				return resolve(ip.host);
75
			}
76
			file.del(args.folder + ip.filename, function(err) {
77
				if (err) {
78
					log.error('Probably someone else just removed it:' + err);
79
				}
80
			});
81
			
82
			return get_valid_host(ips, IP).then(resolve);
83
		});
84
	});
85
};
86
87
88
module.exports = {
89
	'all': get_all,
90
	'next': function (IP) {
91
		return new Promise(function(resolve) {
92
			return get_all(IP).then(function(ips) {
93
				return get_valid_host(Object.keys(ips).sort().reduce(function(m, k) {
94
					m[k] = ips[k];
95
					return m;
96
				}, {}), IP).then(resolve);
97
			});
98
		});
99
	},
100
	'cpu': function(IP) {
101
		return si.mem(function(mem_data) {
102
			return si.currentLoad(function(cpu_data) {
103
				// (used_cpu / total_cpu) * (used_mem / total_mem) = load
104
				var load = cpu_data.currentload / 100 * mem_data.used / mem_data.total;
105
				return file.set(args.folder + 'ds-' + IP.replace(/[^0-9]/g, '') + '.json', JSON.stringify({
106
					'host': IP,
107
					'load': load
108
				}), log.debug);
109
			});
110
		});
111
	}
112
};