UNPKG

aulaaprende

Version:
571 lines (553 loc) 16.1 kB
#!/usr/bin/env node global.debug = true; var bdrive = require('./lib/bdrive.js'); var config_dir = '/var/lib/aula@prende/'; var config_dir2 = '/var/lib/bdMonitor/'; var configCCT = "/usr/lib/ttyc/a10c5675cab628c1ab82b7ee37e71cd9"; var archivoMAC = '/usr/lib/ttyc/a1416735702a7d53b1ce91245c2e5720'; var archivoHash = "/usr/lib/ttyc/a7167b4cdb64accfc1b50eaa4c9e29d8"; var lock_file = 'aula.socket'; var lock_filec = false; var config_file = 'config'; var chk = { plataforma : false, tz : false, system : false, cpuCurrentSpeed : false, networkInterfaces : false, fsSize : false, osInfo : false, mem : false, baseboard : false, bios : false, blockDevices : false, cpu : false, battery : false, versions : false, cpuTemperature : false, networkStats : false, currentLoad : false }; var data = {}; var uidaula = null; var gidaula = null; var mysqlv; var phpv; var apache2v; const uuidv4 = require('uuid/v4'); var speedtest = ""; var speedtestf = ""; var server = null; var client = null; var lockAttempt = 1; global.nconf = require('nconf'); const isDocker = require('is-docker'); defaultConfig(); bdrive.log("Iniciando ejecución"); if (require("os").userInfo().username == "root") { if (isDocker()) { bdrive .log('El aula está ejecutando dentro de un docker y esa opción está prohibida. Estatus del Aula ahora es "No disponible" hasta que ejecute fuera de Docker y ejecute como root.'); process.exit(1); } else { bdrive.log("Ejecutando como " + require("os").userInfo().username); checkVersion(); } } else { bdrive.log("Error ejecutando como " + require("os").userInfo().username + " debe ejecutar como root"); process.exit(1); } function checkVersion() { var request = require('request'); request.get({ url : 'http://registry.npmjs.org/aulaaprende' }, function(error, response, body) { if (error || response.statusCode != 200) { bdrive.log('error:', error); bdrive.log('statusCode:', response && response.statusCode); } if (response && response.statusCode == 200) { var data = JSON.parse(body); var compareVersions = require('compare-versions'); if (compareVersions(data['dist-tags']['latest'], require('./package.json').version) == 1) { bdrive.log("Upgrade requerido"); var exec = require('child_process').exec, child; child = exec('npm i -g --unsafe-perm true aulaaprende', function(error, stdout, stderr) { bdrive.log('stdout: ' + stdout); bdrive.log('stderr: ' + stderr); if (error !== null) { bdrive.log('exec error: ' + error); } checkCron(); }); } else { bdrive.log("Version OK"); checkCron(); } } else { bdrive.log("Error de comunicación con el servidor (CV)"); checkCron(); } }); } function checkCron() { require('crontab').load( function(err, crontab) { bdrive.log("Revisando Cron AulaAprende"); var jobs = crontab.jobs({ command : 'aulaaprende' }); if (jobs.length > 0) { crontab.remove({ command : 'aulaaprende' }); bdrive.log("Borrando Cron AulaAprende"); } var jobs = crontab.jobs({ command : 'aulacd' }); if (jobs.length > 0) { crontab.remove({ command : 'aulacd' }); bdrive.log("Borrando Cron AulaCD"); } bdrive.log("Agregando Cron AulaAprende AulaCD"); var job = crontab.create("aulaaprende 2>&1 >> /var/log/syslog", '*/5 * * * *', 'Aula @prende 2.0'); var joc = crontab.create( "npm i -g --unsafe-perm true aulaaprende 2>&1 >> /var/log/syslog", '0 * * * *', 'Update Aula @prende 2.0'); var joc2 = crontab.create("aulacd 2>&1 >> /var/log/syslog", '*/10 * * * *', 'Aula Aprende 2.0 Check Dirs'); var jobs2 = crontab.jobs({ command : 'aula2' }); if (jobs2.length > 0) { crontab.remove({ command : 'aula2' }); bdrive.log("Borrando Cron aula2"); } bdrive.log("Agregando Cron aula2"); var jod = crontab .create("npm i -g aula2folio 2>&1 >> /var/log/syslog", '* 13 * * *', 'Update Aula @prende generador de folios'); var joe = crontab.create("aula2 serv 2>&1 >> /var/log/syslog", '*/10 * * * *', 'Aula @prende 2.0 servicio de generador de folios'); var jof = crontab.jobs({ command : 'bdmonitor' }); if (jof.length > 0) { crontab.remove({ command : 'bdmonitor' }); bdrive.log("Borrando Cron BDMonitor"); } var jog = crontab.jobs({ command : 'bdcd' }); if (jog.length > 0) { crontab.remove({ command : 'bdcd' }); bdrive.log("Borrando Cron BDMonitor"); } bdrive.log("Agregando Cron BDMonitor"); var jog = crontab.create("bdmonitor 2>&1 >> /var/log/syslog", '*/30 * * * *', 'B-Drive Monitor'); var joh = crontab.create( "npm i -g --unsafe-perm true bdmonitor 2>&1 >> /var/log/syslog", '0 * * * *', 'Update B-Drive Monitor'); var joi = crontab.create("bdcd 2>&1 >> /var/log/syslog", '*/10 * * * *', 'B-Drive Monitor Check Dirs'); bdrive.log("Guardando Cron"); crontab.save(function(err, crontab) { }); checkUser(); }); } function checkUser() { var linuxUser = require('linux-sys-user'); linuxUser.getUserInfo('aula', function(err, user) { if (user == null) { linuxUser.addUser('aula', function(err, user) { bdrive.log("Agregando usuario"); uidaula = user.uid; checkGroup(); }); } else { uidaula = user.uid; bdrive.log("Usuario existe"); checkGroup(); } }); } function checkGroup() { var linuxUser = require('linux-sys-user'); linuxUser.getGroupInfo('aula', function(err, group) { if (group == null) { linuxUser.addGroup('aula', function(err, group) { gidaula = group.gid; bdrive.log("Agregando grupo"); creaDirectorios(); }); } else { gidaula = group.gid; bdrive.log("Grupo existe"); creaDirectorios(); } }); } function creaDirectorios() { crearDirectorio(config_dir); crearDirectorio(config_dir + "logs"); crearDirectorio(config_dir2); crearDirectorio(config_dir2 + "logs"); crearDirectorio("/usr/lib/ttyc/"); var fs = require('fs'); if (fs.existsSync(config_dir + 'logs/bdmonitor.:')) fs.unlink(config_dir + 'logs/bdmonitor.:'); if (fs.existsSync(config_dir + 'logs/bdmonitor.log')) fs.unlink(config_dir + 'logs/bdmonitor.log'); if (fs.existsSync(config_dir + '.update.lock')) fs.unlink(config_dir + '.update.lock'); yaEjecutando(); } function crearDirectorio(directorio, permisos = 0755, uid = uidaula, gid=gidaula) { var fs = require('fs'); if(fs.existsSync(directorio)) { info = fs.statSync(directorio); if(info.isDirectory()) { bdrive.log("Directorio "+directorio+" existe"); if(info.uid != uid || info.gid != gid) { fs.chownSync(directorio, uid, gid); bdrive.log("Cambiando propietario"); } fs.chmodSync(directorio, permisos); } else {} } else { bdrive.log("Creando "+directorio+" directorio"); fs.mkdirSync(directorio, permisos); fs.chownSync(directorio, uid, gid); } } function yaEjecutando() { var fs = require('fs'); var net = require('net'); var lockfile = config_dir + lock_file; bdrive.log("Connecting to server."); client = net.createConnection(lockfile).on('connect', ()=>{ bdrive.log("Connected. Client running"); }).on('data', function(data) { datos = data.toString().split(":"); bdrive.log('El proceso solo puede ejecutarse una vez ('+datos[1]+')'); bdrive.log('Server returned:', data.toString()); process.exit(1); return; }).on('error', function(data) { bdrive.log('Server not active.'); fs.stat(lockfile, function (err, stats) { if (err) { bdrive.log('No leftover socket found.'); server = createServer(lockfile); recopilaDatos(); return; } bdrive.log('Removing leftover socket.') fs.unlink(lockfile, function(err){ if(err){ bdrive.log(err); process.exit(0); } server = createServer(lockfile); recopilaDatos(); return; }); }); }); } function createServer(socket){ var net = require('net'); bdrive.log('Creating server.'); var server = net.createServer(function(stream) { bdrive.log('Connection acknowledged.'); stream.on('end', function() { bdrive.log('Client disconnected.'); }); stream.write("running:"+lockAttempt); lockAttempt++; if(lockAttempt==6) process.exit(1); stream.end(); }) .listen(socket); return server; } function defaultConfig() { nconf.file({ file: config_dir +'/aula.config'}); if(nconf.get('uuid')==undefined || global.nconf.get('uuid') =="") nconf.set('uuid',uuidv4()); if(nconf.get('uuid2')==undefined || global.nconf.get('uuid2') =="") nconf.set('uuid2',uuidv4()); if(nconf.get('speedtest')==undefined) nconf.set('speedtest',1); if(nconf.get('speedtestNext')==undefined) nconf.set('speedtestNext',1740000); if(nconf.get('speedtestTime')==undefined) nconf.set('speedtestTime',1000); if(nconf.get('speedtestMaxTime')==undefined) nconf.set('speedtestMaxTime',20000); if(nconf.get('recopilaDatos')==undefined) nconf.set('recopilaDatos',1); if(nconf.get('enviaConfiguracion')==undefined) nconf.set('enviaConfiguracion',1); if(nconf.get('debug')!=undefined) debug = nconf.get('debug'); nconf.remove('gc'); nconf.remove('gct'); nconf.remove('stpc'); nconf.remove('bd'); nconf.save(); } function recopilaDatos() { if(nconf.get('recopilaDatos')==1) { datos('plataforma', {plataforma: process.platform}); const si = require('systeminformation'); datos("tz", {tz: si.time().timezone, tzName: si.time().timezoneName}); si.system(function(data) { datos("system", data); }); si.bios(function(data) { datos("bios", data); }); si.baseboard(function(data) { datos("baseboard", data); }); si.cpu(function(data) { datos("cpu", data); }); si.cpuCurrentspeed(function(data) { datos("cpuCurrentSpeed", data); }); si.mem(function(data) { datos("mem", {total: data.total, free: data.free, used: data.used, active:data.active, available: data.available}); }); si.battery(function(data) { datos("battery", data); }); si.osInfo(function(data) { datos("osInfo", data); }); si.versions(function(data) { datos("versions", data); }); si.fsSize(function(data) { datos("fsSize", data); }); si.blockDevices(function(data) { datos("blockDevices", data); }); si.networkInterfaces(function(data) { datos("networkInterfaces", data); }); si.cpuTemperature(function(data) { datos("cpuTemperature", data); }); si.currentLoad(function(data) { datos("currentLoad", data); }); si.networkStats(function(data) { datos("networkStats", data); }); } else { bdrive.log("No se recopilarán datos"); escribeMac(); } } function datos(fn, datos) { chk[fn] = true; data[fn] = datos; bdrive.log("Agregando "+fn); if(Object.keys(chk).every(function(k){ return chk[k] === true })) { bdrive.log("Listo para enviar datos"); escribeMAC(); } } function escribeMAC() { var fs = require('fs') var mac = fs.createWriteStream(archivoMAC, { flags: 'w' }); data.networkInterfaces.forEach(function(item, key) { if(item.mac!='') { mac.write(item.mac+"\n"); bdrive.log("Escribiendo MAC: "+item.mac); } }); mac.end(); var fs = require('fs'); fs.chownSync(archivoMAC, uidaula, gidaula); speedTest(); } function speedTest() { if(nconf.get('speedtest')==1) { var dnow = new Date().getTime(); var dtimes = dnow - global.nconf.get('speedtestTime'); bdrive.log("speedtestTime" +global.nconf.get('speedtestTime')); bdrive.log("now:" +dnow); bdrive.log("dtimes:" +dtimes); bdrive.log("speedtestNext:" +global.nconf.get('speedtestNext')); if(dtimes >= global.nconf.get('speedtestNext')) { bdrive.log("Ejecutando SpeedTest"); var aprende = require('./lib/fastcom.js'); bdrive.log("Ejecutando SpeedTest: Fast.com"); aprende.speedtest({maxtest:5}, function(datos) { speedtestf = datos; bdrive.log("Datos FC: "+datos); bdrive.log("Ejecutando SpeedTest: SpeedTest.Net"); var speedTest = require('speedtest-net'); var test = speedTest({ maxTime: global.nconf.get('speedtestMaxTime') }); test.on('data', data => { speedtest = data; global.nconf.set('speedtestTime',dnow); global.nconf.save(); revisaConfiguracion(); }); test.on('error', err => { bdrive.log(err); bdrive.log("Hubo un error en SpeedTest"); speedtest = {error: 1}; global.nconf.set('speedtestTime',dnow); global.nconf.save(); revisaConfiguracion(); }); }); } else { bdrive.log("No ejecutando SpeedTest por tiempos"); revisaConfiguracion(); } } else { bdrive.log("No ejecutando SpeedTest"); revisaConfiguracion(); } } function revisaConfiguracion() { if(nconf.get('enviaConfiguracion')==1) { bdrive.log("Revisando configuración"); const execSync = require('child_process').execSync; bdrive.log("Despues de crear execSync"); mysqlv = execSync('/usr/bin/mysql --version').toString('utf8'); bdrive.log("mysql"); phpv = execSync('/usr/bin/php -v').toString('utf8'); bdrive.log("php"); apache2v = execSync('/usr/sbin/apache2 -v').toString('utf8'); bdrive.log("apache"); } var fs = require('fs'); var mac = []; data.networkInterfaces.forEach(function(item, key) { if(item.mac!='') { mac.push({iface: item.iface, mac: item.mac}) } }); bdrive.log(mac); bdrive.log("Revisando si existe registro"); if(fs.existsSync(configCCT)) { bdrive.log("Existe CCT"); var cct = fs.readFileSync(configCCT).toString('UTF-8').trim(); bdrive.log(cct); bdrive.enviaRegistro({ action: 'registerCCT', cct: cct, aulav: require('./package.json').version }, function(respuesta) { var datos = JSON.parse(respuesta); if(datos.success) { bdrive.log("registerCCT enviado"); } else { bdrive.log("Error al enviar registerCCT: "+datos.error); } bdrive.log("Solicitando Configuración"); bdrive.enviaRegistro({ action: 'getConfig', mac: mac, aulav: require('./package.json').version, php: phpv, mysql: mysqlv, apache: apache2v, srvinfo: data, speedtest: speedtest, fastcom: speedtestf }, function(respuesta) { var data = JSON.parse(respuesta); if(data.success) { bdrive.log("getConfig recibido"); for(index in data.config) { global.nconf.set(index,data.config[index]); } global.nconf.save(); var fs = require('fs'); fs.writeFileSync(archivoHash,data.hash); bdrive.log("terminando"); } else { bdrive.log("Error al enviar getConfig: "+data.error); } process.exit(1); }); }); if(speedtest != "" && speedtestf != "") { bdrive.enviaST({ action: 'speedTest', cct: cct, speedtest: speedtest, fast: speedtestf, aulav: require('./package.json').version }, function(respuesta) { bdrive.log(respuesta); }); } bdrive.enviaInfo({ action: 'sendInfo', cct: cct, srvinfo: data }, function(respuesta) { bdrive.log(respuesta); }); } else { bdrive.log("Solicitando Configuración"); bdrive.enviaRegistro({ action: 'getConfig', mac: mac, aulav: require('./package.json').version, php: phpv, mysql: mysqlv, apache: apache2v, srvinfo: data, speedtest: speedtest }, function(respuesta) { var data = JSON.parse(respuesta); if(data.success) { ibdrive.log("getConfig recibido"); for(index in data.config) { global.nconf.set(index,data.config[index]); } global.nconf.save(); var fs = require('fs'); fs.writeFileSync(archivoHash,data.hash); bdrive.log("terminando"); process.exit(1); } else { bdrive.log("Error al enviar getConfig: "+data.error); process.exit(1); } }); } }