5 // --------------------------------------------------------------------------------------------------------------------
6 // get NETDATA environment variables
8 var NETDATA_PLUGINS_DIR = process.env.NETDATA_PLUGINS_DIR || __dirname;
9 var NETDATA_CONFIG_DIR = process.env.NETDATA_CONFIG_DIR || '/etc/netdata';
10 var NETDATA_UPDATE_EVERY = process.env.NETDATA_UPDATE_EVERY || 1;
11 var NODE_D_DIR = NETDATA_PLUGINS_DIR + '/../node.d';
12 NETDATA_UPDATE_EVERY = NETDATA_UPDATE_EVERY * 1000;
14 // make sure the modules are found
15 process.mainModule.paths.unshift(NODE_D_DIR + '/node_modules');
16 process.mainModule.paths.unshift(NODE_D_DIR);
19 // --------------------------------------------------------------------------------------------------------------------
20 // load required modules
22 var fs = require('fs');
23 var url = require('url');
24 var http = require('http');
25 var path = require('path');
26 var extend = require('extend');
27 var netdata = require('netdata');
30 // --------------------------------------------------------------------------------------------------------------------
33 function pluginConfig(filename) {
34 var f = path.basename(filename);
36 var m = f.match('.plugin' + '$');
37 if(m === null) m = f.match('.node.js' + '$');
39 return netdata.options.paths.config + '/' + f.substring(0, m.index) + '.conf';
41 return netdata.options.paths.config + '/' + f + '.conf';
45 extend(true, netdata.options, {
46 filename: path.basename(__filename),
48 update_every: NETDATA_UPDATE_EVERY,
50 exit_after_ms: 3600 * 4 * 1000,
53 plugins: NETDATA_PLUGINS_DIR,
54 config: NETDATA_CONFIG_DIR,
58 modules_enable_autodetect: true,
59 modules_enable_all: true,
62 netdata.options.config_filename = pluginConfig(__filename);
64 // load configuration file
66 netdata.options_loaded = JSON.parse(fs.readFileSync(netdata.options.config_filename, 'utf8'));
67 extend(true, netdata.options, netdata.options_loaded);
68 console.error('merged netdata object:');
69 console.error(netdata);
72 netdata.error('Cannot read configuration file ' + netdata.options.config_filename + ': ' + e.message + ', using internal defaults.');
73 netdata.options_loaded = undefined;
78 // apply module paths to node.js process
79 function applyModulePaths() {
80 var len = netdata.options.paths.modules.length;
82 process.mainModule.paths.unshift(netdata.options.paths.modules[len]);
87 // --------------------------------------------------------------------------------------------------------------------
90 function dumpError(err) {
91 if (typeof err === 'object') {
93 netdata.debug(err.stack);
98 // --------------------------------------------------------------------------------------------------------------------
99 // get command line arguments
101 var found_myself = false;
102 var found_number = false;
103 var found_modules = false;
104 process.argv.forEach(function (val, index, array) {
105 netdata.debug('PARAM: ' + val);
108 if(val === __filename)
114 netdata.options.DEBUG = true;
115 netdata.debug('DEBUG enabled');
119 if(found_number === true) {
120 if(found_modules === false) {
121 for(var i in netdata.options.modules)
122 netdata.options.modules[i].enabled = false;
125 if(typeof netdata.options.modules[val] === 'undefined')
126 netdata.options.modules[val] = {};
128 netdata.options.modules[val].enabled = true;
129 netdata.options.modules_enable_all = false;
130 netdata.debug('enabled module ' + val);
134 var x = parseInt(val);
136 netdata.options.update_every = x * 1000;
137 if(netdata.options.update_every < NETDATA_UPDATE_EVERY) {
138 netdata.options.update_every = NETDATA_UPDATE_EVERY;
139 netdata.debug('Update frequency ' + x + 's is too low');
143 netdata.debug('Update frequency set to ' + netdata.options.update_every + ' ms');
145 else netdata.error('Ignoring parameter: ' + val);
148 netdata.error('Cannot get value of parameter: ' + val);
158 if(netdata.options.update_every < 1000) {
159 netdata.debug('Adjusting update frequency to 1 second');
160 netdata.options.update_every = 1000;
163 // --------------------------------------------------------------------------------------------------------------------
166 function findModules() {
169 var files = fs.readdirSync(NODE_D_DIR);
170 var len = files.length;
172 var m = files[len].match('.node.js' + '$');
174 var n = files[len].substring(0, m.index);
176 if(typeof(netdata.options.modules[n]) === 'undefined')
177 netdata.options.modules[n] = { enabled: netdata.options.modules_enable_all };
179 if(netdata.options.modules[n].enabled === true) {
180 netdata.options.modules[n].name = n;
181 netdata.options.modules[n].filename = NODE_D_DIR + '/' + files[len];
182 netdata.options.modules[n].loaded = false;
184 if(typeof(netdata.options.modules[n].config_filename) !== 'string')
185 netdata.options.modules[n].config_filename = pluginConfig(files[len]);
189 netdata.debug('loading module ' + netdata.options.modules[n].filename);
190 netdata.options.modules[n].module = require(netdata.options.modules[n].filename);
191 netdata.options.modules[n].module.name = n;
192 netdata.debug('loaded module ' + netdata.options.modules[n].name + ' from ' + netdata.options.modules[n].filename);
195 netdata.options.modules[n].enabled = false;
196 netdata.error('Cannot load module: ' + netdata.options.modules[n].filename + ' exception: ' + e);
201 // load its configuration
203 enable_autodetect: netdata.options.modules_enable_autodetect,
204 update_every: Math.round(netdata.options.update_every / 1000)
207 netdata.debug('loading module\'s ' + netdata.options.modules[n].name + ' config ' + netdata.options.modules[n].config_filename);
208 var c2 = JSON.parse(fs.readFileSync(netdata.options.modules[n].config_filename, 'utf8'));
210 netdata.debug('loaded module\'s ' + netdata.options.modules[n].name + ' config ' + netdata.options.modules[n].config_filename);
213 netdata.error('Cannot load module\'s ' + netdata.options.modules[n].name + ' config from ' + netdata.options.modules[n].config_filename + ' exception: ' + e + ', using internal defaults.');
217 // call module auto-detection / configuration
219 netdata.modules_configuring++;
220 netdata.debug('Configuring module ' + netdata.options.modules[n].name);
221 var serv = netdata.configure(netdata.options.modules[n].module, c, function() {
222 netdata.debug('Configured module ' + netdata.options.modules[n].name);
223 netdata.modules_configuring--;
226 netdata.debug('Configuring module ' + netdata.options.modules[n].name + ' reports ' + serv + ' eligible services.');
229 netdata.modules_configuring--;
230 netdata.options.modules[n].enabled = false;
231 netdata.error('Failed module auto-detection: ' + netdata.options.modules[n].name + ' exception: ' + e + ', disabling module.');
236 netdata.options.modules[n].loaded = true;
245 if(findModules() === 0) {
246 netdata.error('Cannot load any .node.js module from: ' + NODE_D_DIR);
247 netdata.disableNodePlugin();
252 // --------------------------------------------------------------------------------------------------------------------
255 function start_when_configuring_ends() {
256 if(netdata.modules_configuring > 0) {
257 netdata.debug('Waiting modules configuration, still running ' + netdata.modules_configuring);
258 setTimeout(start_when_configuring_ends, 500);
262 netdata.modules_configuring = 0;
265 start_when_configuring_ends();
267 //netdata.debug('netdata object:')
268 //netdata.debug(netdata);