Proyecto

General

Perfil

Descargar (10,3 KB) Estadísticas
| Rama: | Revisión:
#include "servidor.h"
#include <QStringList>
#include <QProcess>
#include <globales.h>
#include <QFileInfo>
#include <QSettings>
#include <QTimer>
#include <QDebug>
#include <QThread>
#include <QLocalServer>
#include <QProcess>

Servidor::Servidor(QObject *parent) : QObject(parent)
{
cargaVariablesEntorno();
mServer = new QLocalServer(this);
connect(mServer, SIGNAL(newConnection()),this,SLOT(newConnection()));
mTimer=new QTimer(this);
QObject::connect(mTimer, SIGNAL(timeout()), this, SLOT(onTimeout()));
qDebug()<<"Iniciando servidor control wifi";
//QString orden="ifconfig ra0 up";
//cambiaClavePuntoAccesoSinReiniciar(orden);
int msec = 5000;
mTimer->setInterval(msec);
mTimer->start();

}

void Servidor::onTimeout()
{
if (g_control_wifi_activado == 1){
g_profesor_actual=hayProfesorActivo();
if (g_profesor_actual !=g_profesor_anterior){
g_profesor_anterior= g_profesor_actual;
if (g_profesor_actual ==""){
if (g_puntoAcceso_tarjeta ==0){
wifiPuntoAccesoFinSesion();
}else{
wifiTarjetaFinSesion();
}
}
else{
cambioEstadoWifi(g_wifi_inicio);
}
}
}
}
void Servidor::cambioEstadoWifi(int estado)
{
if (g_puntoAcceso_tarjeta==0){
switch (estado) {
case 0:
apagaPuntoAcceso();
break;
case 1:
enciendePuntoAcceso();
break;
}
}else{
switch (estado) {
case 0:
apagaTarjeta();
break;
case 1:
enciendeTarjeta();
break;
}
}
}

void Servidor::wifiTarjetaFinSesion()
{
if (g_actualizar_clave_wifi ==1){
g_clave_wifi=generaClave();
modificarClaveTarjeta(g_clave_wifi);
cambioEstadoWifi(g_wifi_fin);
}else{
cambioEstadoWifi(g_wifi_fin);
}
}

void Servidor::wifiPuntoAccesoFinSesion()
{
if (g_actualizar_clave_wifi ==1){
QString orden="";
if (g_wifi_fin ==0){
orden="ifconfig ra0 down";
}else if (g_wifi_fin ==1){
orden="ifconfig ra0 up";
}
cambiaClavePuntoAccesoSinReiniciar(orden);
}else{
cambioEstadoWifi(g_wifi_fin);
}
}

QString Servidor::generaClave()
{
QString letra;
letra.resize(1);
qsrand((unsigned)time(0));
QString pnumero=QString::number(99+qrand()%900);
letra[0] = QChar('a' + char(qrand() % ('z' - 'a')));
QString clave=letra+pnumero+letra+pnumero;
return clave;
}

QString Servidor::hayProfesorActivo()
{
QString comando_usuario="who| grep -v 'unknown'| grep -v 'pts'|grep '(:0)'| head -n 1| cut -f1 -d' '";
QString usuarioActivo=hallaDatos(comando_usuario);
return usuarioActivo;
}

Servidor::~Servidor()
{

}

void Servidor::cargaVariablesEntorno()
{

QString FicheroIni="/etc/controlwifi/controlwifi.conf";
QFileInfo exitePath(FicheroIni);
if (exitePath.exists() && exitePath.isFile()) {
QSettings configuracion (FicheroIni,QSettings::IniFormat);
g_puntoAcceso_tarjeta=configuracion.value("puntoAcceso_tarjetaWifi",0).toInt();
g_control_wifi_activado=configuracion.value("Activar control wifi",1).toInt();
g_wifi_inicio=configuracion.value("wifiInicio",2).toInt();
g_wifi_fin=configuracion.value("wifiFin",0).toInt();
g_actualizar_clave_wifi=configuracion.value("actualizarClaveWifi",1).toInt();
g_permitir_profesor_controlar_wifi=configuracion.value("permitirProfesorControlarWifi",1).toInt();
g_ipPuntoAcceso=configuracion.value("ipPuntoAcceso","192.168.0.1").toString();
g_ContraRootPuntoAcceso=configuracion.value("clavePuntoAcceso","v1+rina5").toString();
g_usuarioAdministradorWeb=configuracion.value("administradorWeb","root").toString();
if (g_ContraRootPuntoAcceso=="") g_ContraRootPuntoAcceso="v1+rina5";
}
}


void Servidor::listen(QString &name)
{
mServer->removeServer(name);
mServer->listen(name);
QString FicheroDaemon="/tmp/com.junta.controlwifiserver";
QFileInfo exitePath(FicheroDaemon);
if (exitePath.exists()) {
hallaDatos("chmod 777 " + FicheroDaemon);
}
}

void Servidor::newConnection()
{
mSocket = mServer->nextPendingConnection();
connect(mSocket,SIGNAL(readyRead()),this,SLOT(readyRead()));
}

void Servidor::readyRead()
{
QString orden=mSocket->readAll();
procesaOrden(orden);
}

void Servidor::cambiaClavePuntoAccesoSinReiniciar(const QString &accion)
{

mTimer->stop();
g_clave_wifi=generaClave();
QString ordenssh="sshpass -p %1 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@%2 ";
ordenssh = ordenssh.arg(g_ContraRootPuntoAcceso).arg(g_ipPuntoAcceso);
QString comandCurl("ifconfig ra0 down; curl -X POST --user \"%1:%2\" -d \"submit_button=WL_WPATable&action=ApplyTake&change_action=gozila_cgi&submit_type=save&security_varname=&security_mode_last=&wl_wep_last=&filter_mac_value=&wl0_security_mode=psk2&wl0_crypto=tkip%5aes&wl0_wpa_psk=%3&wl0_wl_unmask=0&wl0_wpa_gtk_rekey=3600\" -H \"Referer: https://%4/WL_WPATable.asp\" -k https://%4/apply.cgi;"
"curl -X POST --user \"%1:%2\" -d \"submit_button=WL_WPATable&action=ApplyTake&change_action=gozila_cgi&submit_type=save&security_varname=&security_mode_last=&wl_wep_last=&filter_mac_value=&wl0_security_mode=psk2&wl0_crypto=tkip%5aes&wl0_wpa_psk=%3&wl0_wl_unmask=0&wl0_wpa_gtk_rekey=3600\" -H \"Referer: http://%4/WL_WPATable.asp\" -k http://%4/apply.cgi; sleep 40;"
);
comandCurl = comandCurl.arg(g_usuarioAdministradorWeb, g_ContraRootPuntoAcceso, g_clave_wifi, "127.0.0.1", "%2B");
QString comando =ordenssh.append("'").append(comandCurl).append(accion).append("'");
hallaDatos(comando);
mTimer->setInterval(5000);
mTimer->start();

}

void Servidor::enciendePuntoAcceso()
{
QString orden="sshpass -p %1 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@%2 'RED=`nvram get wl0_ifname`;ifconfig $RED up>/dev/null 2>&1 &'";
orden= orden.arg(g_ContraRootPuntoAcceso).arg(g_ipPuntoAcceso);
hallaDatos(orden);
}

void Servidor::apagaPuntoAcceso()
{
QString orden="sshpass -p %1 ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@%2 'RED=`nvram get wl0_ifname`;ifconfig $RED down >/dev/null 2>&1 &'";
orden= orden.arg(g_ContraRootPuntoAcceso).arg(g_ipPuntoAcceso);
hallaDatos(orden);
}

void Servidor::enciendeTarjeta()
{
QString ORDEN_TARJETA="(service hostapd restart;service isc-dhcp-server restart)";
hallaDatos(ORDEN_TARJETA);
}

void Servidor::cambiaClaveTarjeta(const QString &clave)
{
modificarClaveTarjeta(clave);
enciendeTarjeta();
}

void Servidor::apagaTarjeta()
{
QString ORDEN_TARJETA="service hostapd stop";
hallaDatos(ORDEN_TARJETA);
}

void Servidor::procesaOrden(const QString &orden)
{
if (g_permitir_profesor_controlar_wifi ==0){
return;
}
if (orden=="enciendeWifi"){
if (g_puntoAcceso_tarjeta ==0)
enciendePuntoAcceso();
else
enciendeTarjeta();

} else if (orden=="apagaWifi"){
if (g_puntoAcceso_tarjeta ==0)
apagaPuntoAcceso();
else
apagaTarjeta();
}else if (orden=="obtieneDatosWifi"){
if (g_puntoAcceso_tarjeta ==0)
enviaDatosPuntoAcceso();
else
enviaDatosTarjeta();
}
}

void Servidor::enviaDatosPuntoAcceso()
{
QString datos=verEstadoPuntoAcceso();
if (mSocket){
QTextStream T(mSocket);
T <<datos;
mSocket->flush();
}
}

void Servidor::enviaDatosTarjeta()
{
QString datos=verEstadoTarjeta();
if (mSocket){
QTextStream T(mSocket);
T <<datos;
mSocket->flush();
}
}

QString Servidor::verEstadoPuntoAcceso()
{

QString SSH_COMANDO="sshpass -p %1 ssh -o ConnectTimeout=9 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null root@%2 'RED=`nvram get wl0_ifname`;ESTADO=`ifconfig | grep -c ^$RED`;CLAVE=`nvram get wl0_wpa_psk`;SSID=`nvram get wl0_ssid`;echo $ESTADO:$CLAVE:$SSID'";
QString orden=SSH_COMANDO.arg(g_ContraRootPuntoAcceso).arg(g_ipPuntoAcceso);
QString estado=hallaDatos(orden);
orden= "echo \""+estado+"\" | grep -v DD-WRT | grep -v Release | grep -v 'known hosts'";
QString consola=hallaDatos(orden);
QString ordenrouter ="echo \""+estado+"\" | grep -v 'known hosts' | grep -c "+g_ipPuntoAcceso;
QString router= hallaDatos(ordenrouter);
if (router=="0"){
QStringList datos=consola.split(":");
if (datos.length()==3){
g_estado_wifi=datos[0];
g_clave_wifi=datos[1];
g_nombreRedWifi=datos[2];
}else{
g_estado_wifi="SIN_RED";
g_clave_wifi="SIN_RED";
g_nombreRedWifi="SIN_RED";
}
}
QString respuesta="datosPuntosAcceso:"+g_estado_wifi+":"+g_nombreRedWifi+":"+g_clave_wifi;
return respuesta;
}

QString Servidor::verEstadoTarjeta()
{
QString ESTADO_HOSTAPD="service hostapd status | grep -v 'not' | grep -v -c 'grep'";
QString PASSWORD_WIFI="cat /etc/hostapd/hostapd.conf | grep wpa_passphrase | cut -f2 -d'='";
QString NOMBRE_WIFI="cat /etc/hostapd/hostapd.conf | grep ssid | grep -v grep | grep -v '_ssid'| cut -f2 -d'='";
g_estado_wifi= hallaDatos(ESTADO_HOSTAPD);
g_clave_wifi= hallaDatos(PASSWORD_WIFI);
g_nombreRedWifi= hallaDatos(NOMBRE_WIFI);
QString respuesta="datosPuntosAcceso:"+g_estado_wifi+":"+g_nombreRedWifi+":"+g_clave_wifi;
return respuesta;
}

QString Servidor::hallaDatos(const QString &orden){
QString salida ="";
QProcess EjecutaProceso;
EjecutaProceso.start("bash", QStringList() << "-c" << orden);
EjecutaProceso.waitForReadyRead();
EjecutaProceso.waitForFinished(60000);
salida = EjecutaProceso.readAllStandardOutput();
salida=salida.trimmed();
return salida;
}

void Servidor:: modificarClaveTarjeta(const QString &clave)
{
QString OR_HALLA_CLAVE="cat /etc/hostapd/hostapd.conf | grep wpa_passphrase";
QString OR_CAMBIAR_CLAVE="sed -i s/%1/%2/g /etc/hostapd/hostapd.conf";
QString viejaClave=hallaDatos(OR_HALLA_CLAVE);
QString claveNueva="wpa_passphrase="+clave;
QString ordenCambiar=OR_CAMBIAR_CLAVE.arg(viejaClave).arg(claveNueva);
if (viejaClave!="") hallaDatos(ordenCambiar);
}

(13-13/14)