aulaaprende
Version:
Aula @prende 2.0
571 lines (553 loc) • 16.1 kB
JavaScript
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);
}
});
}
}