desarrollosconsejeria/controlwifi/2.0-4/controlwifiserver/servidor.cpp @ 23a384b9
23a384b9 | Elisa | #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);
|
|||
}
|