desarrollosconsejeria/adtos-aula/1.7-0/serveradtosaula/demonio.pas @ 23a384b9
23a384b9 | Elisa | unit demonio ;
|
|
{$mode objfpc}{$H+}
|
|||
interface
|
|||
uses
|
|||
unix,clservidor,globales,Classes , SysUtils , FileUtil , LResources ,
|
|||
IdCmdTCPServer, IdCommandHandlers, IdContext,clejucutaasi,clpingCliente,clpingPortatil,
|
|||
IdSSLOpenSSL, IdComponent,IdSSL,clcomandosroot, HTTPDefs;// IdSSLOpenSSL
|
|||
type
|
|||
{ TDataModule1 }
|
|||
TDataModule1 = class (TDataModule )
|
|||
IdCmdTCPServer1 : TIdCmdTCPServer ;
|
|||
IdServerIOHandlerSSLOpenSSL1: TIdServerIOHandlerSSLOpenSSL;
|
|||
procedure apagarEncenderAlumnosAulaCommand(ASender: TIdCommand);
|
|||
procedure apagarEquipoAlumnoCommand(ASender: TIdCommand);
|
|||
procedure apagarEquipoCommand (ASender : TIdCommand );
|
|||
procedure archivoAulaAsiCommand(ASender: TIdCommand);
|
|||
procedure carpetaAulaAsiCommand(ASender: TIdCommand);
|
|||
procedure cierraServidorAlumnoCommand(ASender: TIdCommand);
|
|||
procedure DataModuleCreate(Sender: TObject);
|
|||
procedure DataModuleDestroy(Sender: TObject);
|
|||
procedure datosEquipoCommand(ASender: TIdCommand);
|
|||
procedure ejecutaScriptAsiCommand(ASender: TIdCommand);
|
|||
procedure hallaProcesosActivosAsiCommand(ASender: TIdCommand);
|
|||
procedure hallarProcesosActivosCommand(ASender: TIdCommand);
|
|||
procedure IdCmdTCPServer1AfterCommandHandler(ASender: TIdCmdTCPServer;
|
|||
AContext: TIdContext);
|
|||
procedure IdCmdTCPServer1Connect(AContext: TIdContext);
|
|||
procedure IdServerIOHandlerSSLOpenSSL1GetPassword(var Password: String);
|
|||
procedure instalaPaqueteDebianCommand(ASender: TIdCommand);
|
|||
private
|
|||
procedure apagarAula();
|
|||
procedure Ejecutar1 (comando : string );
|
|||
procedure encenderAula();
|
|||
procedure IniciarDemonio(iport: integer; ihost: string);
|
|||
procedure IniciarDemonio1(iport: integer; ihost: string);
|
|||
function validarComando(comando: string): Boolean;
|
|||
function validarProceso(proceso: string): Boolean;
|
|||
{ private declarations }
|
|||
public
|
|||
procedure IniciaRevisionAula();
|
|||
{ public declarations }
|
|||
end ;
|
|||
var
|
|||
DataModule1 : TDataModule1 ;
|
|||
implementation
|
|||
{ TDataModule1 }
|
|||
procedure TDataModule1.IniciarDemonio1(iport:integer;ihost:string);
|
|||
var
|
|||
aCommand:TIdCommandHandler;
|
|||
begin
|
|||
try
|
|||
IdCmdTCPServer1:=TIdCmdTCPServer.Create(nil);
|
|||
IdCmdTCPServer1.IOHandler:=IdServerIOHandlerSSLOpenSSL1;
|
|||
with IdCmdTCPServer1 do
|
|||
begin
|
|||
Bindings.Clear;
|
|||
Bindings.Add;
|
|||
Bindings.items[0].IP:=ihost;
|
|||
Bindings.Items[0].Port:=iport;
|
|||
DefaultPort:=iport;
|
|||
MaxConnections:=0;
|
|||
ListenQueue:=15;
|
|||
TerminateWaitTime:=5000;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'apagarEquipo';
|
|||
aCommand.OnCommand :=@apagarEquipoCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='302';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'datosEquipo';
|
|||
aCommand.OnCommand :=@datosEquipoCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='317';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'cierraServidorAlumno';
|
|||
aCommand.OnCommand :=@cierraServidorAlumnoCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='400';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'hallarProcesosActivos';
|
|||
aCommand.OnCommand :=@hallarProcesosActivosCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='305';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'hallaProcesosActivosAsi';
|
|||
aCommand.OnCommand :=@hallaProcesosActivosAsiCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='402';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'archivoAulaAsi';
|
|||
aCommand.OnCommand :=@archivoAulaAsiCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='403';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'ejecutaScriptAsi';
|
|||
aCommand.OnCommand :=@ejecutaScriptAsiCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='404';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'instalaPaqueteDebian';
|
|||
aCommand.OnCommand :=@instalaPaqueteDebianCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='405';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'carpetaAulaAsi';
|
|||
aCommand.OnCommand :=@carpetaAulaAsiCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='406';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'apagarEncenderAlumnosAula';
|
|||
aCommand.OnCommand :=@apagarEncenderAlumnosAulaCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='500';
|
|||
aCommand.Enabled:=true;
|
|||
aCommand:=CommandHandlers.Add;
|
|||
aCommand.Command := 'apagarEquipoAlumno';
|
|||
aCommand.OnCommand :=@apagarEquipoAlumnoCommand;
|
|||
aCommand.Disconnect:=true;
|
|||
aCommand.CmdDelimiter:=#32;
|
|||
aCommand.ParamDelimiter:=#32;
|
|||
aCommand.NormalReply.Code:='501';
|
|||
aCommand.Enabled:=true;
|
|||
OnConnect:=@IdCmdTCPServer1Connect;
|
|||
if active then active:=false;
|
|||
active:=true;
|
|||
end;
|
|||
except
|
|||
writeln('Error al iniciar servidor');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.IdCmdTCPServer1Connect(AContext: TIdContext);
|
|||
var
|
|||
ipOrden:string;
|
|||
begin
|
|||
if (AContext.Connection.IOHandler is TIdSSLIOHandlerSocketBase) then
|
|||
TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough:=false;
|
|||
ipOrden:=trim(AContext.Connection.Socket.Binding.PeerIP);
|
|||
if (ipOrden<>miservidor.IPAdministrador) and (ipOrden<>'localhost') and (ipOrden<>'127.0.0.1') then
|
|||
begin
|
|||
AContext.Connection.Disconnect;
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.IniciarDemonio(iport:integer;ihost:string);
|
|||
begin
|
|||
try
|
|||
IdServerIOHandlerSSLOpenSSL1:= TIdServerIOHandlerSSLOpenSSL.Create(nil);
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile:='/var/lib/adtos/privkey.key';
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile:= '/var/lib/adtos/cacert.crt';
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile:= '/var/lib/adtos/cacertroot.pem';
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Method := sslvSSLv3;
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.SSLVersions:=[sslvSSLv3];
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.Mode := sslmServer;
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyDepth := 0;
|
|||
IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyMode := [];
|
|||
IdServerIOHandlerSSLOpenSSL1.OnGetPassword:=@IdServerIOHandlerSSLOpenSSL1GetPassword;
|
|||
Ejecutar1('fuser -k -n tcp 37999');
|
|||
sleep(1000);
|
|||
IniciarDemonio1(iport,ihost);
|
|||
except
|
|||
Ejecutar1('fuser -k -n tcp 37999');
|
|||
sleep(1000);
|
|||
IniciarDemonio1(iport,ihost);;
|
|||
end;
|
|||
end;
|
|||
Procedure TDataModule1.IniciaRevisionAula();
|
|||
begin
|
|||
try
|
|||
if trim(miservidor.Ip)='' then
|
|||
begin
|
|||
g_datos_equipo_profesor:='';
|
|||
g_tsEquiposAlumnos.text:='';
|
|||
exit;
|
|||
end
|
|||
else
|
|||
begin
|
|||
g_datos_equipo_profesor:=miservidor.Host+'&'+miservidor.IP+'&'+miservidor.MAC+'&'+g_usuario+'&1';
|
|||
end;
|
|||
case g_tipo_aula of
|
|||
-1:begin
|
|||
g_tsEquiposAlumnos.text:=g_datos_equipo_profesor;
|
|||
end;
|
|||
0: with ThrPingPortatil.create(g_ips_alumnos,g_datos_equipo_profesor) do Resume;
|
|||
1: with ThrPingCliente.create(g_ips_alumnos,g_datos_equipo_profesor) do Resume;
|
|||
end;
|
|||
except
|
|||
g_tsEquiposAlumnos.text:=g_datos_equipo_profesor+'&'+g_usuario+'&1';
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.apagarEquipoCommand (ASender : TIdCommand );
|
|||
var
|
|||
passwd:String;
|
|||
begin
|
|||
try
|
|||
if (Asender.Params.Count=1) then
|
|||
begin
|
|||
passwd:= HTTPDECode(Asender.Params[0]);
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
if not compruebaPasswordRoot(passwd) then exit;
|
|||
miservidor.apagarEquipo;
|
|||
Asender.Reply.SetReply(302,'Apagando equipo');
|
|||
ASender.SendReply;
|
|||
if IdCmdTCPServer1.Active then IdCmdTCPServer1.Active:=false;
|
|||
Halt;
|
|||
end;
|
|||
except
|
|||
//writeln('Error al apagar equipo');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.apagarEncenderAlumnosAulaCommand(ASender: TIdCommand);
|
|||
var
|
|||
tipo,orden,passwd:String;
|
|||
begin
|
|||
try
|
|||
if (Asender.Params.Count=2) then
|
|||
begin
|
|||
if g_tipo_aula=-1 then exit;
|
|||
tipo:= HTTPDECode(Asender.Params[0]);
|
|||
passwd:= HTTPDECode(Asender.Params[1]);
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
if not compruebaPasswordRoot(passwd) then exit;
|
|||
if tipo='0' then
|
|||
ApagarAula()
|
|||
else
|
|||
encenderAula();
|
|||
end;
|
|||
except
|
|||
//writeln('Error al apagar/enceder el aula');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.apagarAula();
|
|||
var
|
|||
i:integer;
|
|||
orden:String;
|
|||
begin
|
|||
try
|
|||
for i:=0 to high(g_ips_alumnos) do
|
|||
begin
|
|||
if (trim(g_ips_alumnos[i].ip)='') or (trim(g_ips_alumnos[i].ip)=trim(miservidor.IP)) or (trim(g_ips_alumnos[i].ip)=trim(miservidor.IPAdministrador)) then continue;
|
|||
orden:='ApagarEquipo';
|
|||
with ThrComandosRoot.create(g_ips_alumnos[i].ip,302,orden,36999) do Resume;
|
|||
sleep(100);
|
|||
end;
|
|||
except
|
|||
//writeln('Error al apagar el aula');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.encenderAula();
|
|||
var
|
|||
i:integer;
|
|||
orden1,nmac,orden:String;
|
|||
begin
|
|||
try
|
|||
if g_tipo_aula =1 then
|
|||
orden:='wakeonlan -i 192.168.0.255 -p 2000 %s &'
|
|||
else if g_tipo_aula =0 then
|
|||
orden:='wakeonlan %s &'
|
|||
else
|
|||
exit;
|
|||
for i:=0 to high(g_ips_alumnos) do
|
|||
begin
|
|||
if (trim(g_ips_alumnos[i].mac)='') or (trim(g_ips_alumnos[i].mac)='00:00:00:00:00:00') then continue;
|
|||
nmac:=g_ips_alumnos[i].mac;
|
|||
orden1:=Format(orden,[nmac]);
|
|||
Ejecutar1(orden1);
|
|||
end;
|
|||
except
|
|||
//writeln('Error al iniciar el aula');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.apagarEquipoAlumnoCommand(ASender: TIdCommand);
|
|||
var
|
|||
tipo,orden,datoalumno,passwd:String;
|
|||
begin
|
|||
try
|
|||
if (Asender.Params.Count=3) then
|
|||
begin
|
|||
if g_tipo_aula=-1 then exit;
|
|||
passwd:= HTTPDECode(Asender.Params[2]);
|
|||
tipo:= HTTPDECode(Asender.Params[1]);
|
|||
datoalumno:=HTTPDECode(Asender.Params[0]);
|
|||
if trim(datoalumno)='' then exit;
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
if tipo='0' then
|
|||
begin
|
|||
orden:='ApagarEquipo';
|
|||
if trim(datoalumno)=trim(miservidor.IP) then exit;
|
|||
if not compruebaPasswordRoot(passwd) then exit;
|
|||
with ThrComandosRoot.create(datoalumno,302,orden,36999) do Resume;
|
|||
end
|
|||
else if tipo='1' then
|
|||
begin
|
|||
if g_tipo_aula=1 then
|
|||
orden:='wakeonlan -i 192.168.0.255 -p 2000 %s &'
|
|||
else if g_tipo_aula =0 then
|
|||
orden:='wakeonlan %s &';
|
|||
orden:=Format(orden,[datoalumno]);
|
|||
Ejecutar1(orden);
|
|||
end;
|
|||
end;
|
|||
except
|
|||
//writeln('Error al apagar equipo');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.archivoAulaAsiCommand(ASender: TIdCommand);
|
|||
var
|
|||
destino,archivo1:string;
|
|||
stream:TFileStream;
|
|||
passwd,archivo:string;
|
|||
idproceso:string;
|
|||
orden,proceso:String;
|
|||
minumero:String;
|
|||
begin
|
|||
try
|
|||
// writeln('archivoAulaAsiCommand ' + inttostr(Asender.Params.Count));
|
|||
if (Asender.Params.Count=5) then
|
|||
begin
|
|||
destino:=HTTPDECode(Asender.Params[1]);
|
|||
archivo1:=HTTPDECode(Asender.Params[0]);
|
|||
passwd:= HTTPDECode(Asender.Params[2]);
|
|||
idproceso:= HTTPDECode(Asender.Params[3]);
|
|||
minumero:=HTTPDECode(Asender.Params[4]);
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
if compruebaPasswordRoot(passwd) then
|
|||
begin
|
|||
if (SameText(destino,'/tmp')) or ( g_DestinosLibres) then
|
|||
begin
|
|||
archivo:=destino+PathDelim+archivo1;
|
|||
Asender.sendReply;
|
|||
try
|
|||
try
|
|||
stream:=TfileStream.create(archivo,fmcreate);
|
|||
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
|
|||
proceso:='echo "el archivo '+archivo1+' se ha copiado correctamente en el directorio '+destino+'"';
|
|||
except
|
|||
proceso:='echo "Error al copiar el archivo '+archivo1+' en el directorio '+destino+'. Inténtelo de nuevo"';
|
|||
end;
|
|||
finally
|
|||
freeandnil(stream)
|
|||
end;
|
|||
end
|
|||
else
|
|||
begin
|
|||
proceso:='echo "No tienes permisos para escribir en este directorio. Selecciona como /tmp"';
|
|||
end;
|
|||
end
|
|||
else
|
|||
begin
|
|||
proceso:='echo "Has introducido una contraseña incorrecta de administrador. Modifícala desde menú Configurar -> Contraseña de adtos"';
|
|||
end;
|
|||
try
|
|||
orden:='resultadoProceso ' +HTTPEncode(idproceso)+ ' '+HTTPEncode(miservidor.IP)+ ' '+HTTPEncode(miservidor.Host)+ ' '+HTTPEncode(minumero);
|
|||
with ThrEjucutarAsi.create(miservidor.IPAdministrador,201,orden,38002,proceso) do Resume;
|
|||
except
|
|||
//writeln('Error al enviar datos')
|
|||
end;
|
|||
end
|
|||
except
|
|||
//writeln('Error al enviar archivo');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.carpetaAulaAsiCommand(ASender: TIdCommand);
|
|||
const
|
|||
ORD_DESCOMPRIMIR:STRING= '(cp -f /tmp/adtos-carpeta.tar.gz %s/adtos-carpeta.tar.gz; cd %s; tar xzvf adtos-carpeta.tar.gz;rm -f adtos-carpeta.tar.gz)';
|
|||
ORD_DESCOMPRIMIR1:STRING='( cd %s; tar xzvf adtos-carpeta.tar.gz;rm -f adtos-carpeta.tar.gz) ';
|
|||
var
|
|||
passwd:string;
|
|||
orden,archivo:string;
|
|||
stream:TFileStream;
|
|||
destino:String;
|
|||
idproceso:String;
|
|||
proceso:string;
|
|||
minumero:string;
|
|||
begin
|
|||
try
|
|||
// writeln('carpetaAulaAsiCommand '+ inttostr(Asender.Params.Count));;
|
|||
if (Asender.Params.Count=4) then
|
|||
begin
|
|||
destino:= HTTPDECode(Asender.Params[0]);
|
|||
passwd:= HTTPDECode(Asender.Params[1]);
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
idproceso:=HTTPDECode(Asender.Params[2]);
|
|||
minumero:=HTTPDECode(Asender.Params[3]);
|
|||
if compruebaPasswordRoot(passwd) then
|
|||
begin;
|
|||
if (SameText(destino,'/tmp')) or ( g_DestinosLibres) then
|
|||
begin
|
|||
archivo:='/tmp/adtos-carpeta.tar.gz';
|
|||
Asender.sendReply;
|
|||
try
|
|||
try
|
|||
stream:=TfileStream.create(archivo,fmcreate);
|
|||
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
|
|||
if destino='/tmp' then
|
|||
proceso:=Format(ORD_DESCOMPRIMIR1,[destino])
|
|||
else
|
|||
proceso:=Format(ORD_DESCOMPRIMIR,[destino,destino]);
|
|||
except
|
|||
proceso:='echo "Error al copiar la carpear en el directorio '+destino+'. Inténtelo de nuevo"';
|
|||
end;
|
|||
finally
|
|||
freeandnil(stream)
|
|||
end;
|
|||
end
|
|||
else
|
|||
begin
|
|||
proceso:='echo "No tienes permisos para escribir en este directorio. Selecciona como /tmp"';
|
|||
end;
|
|||
end
|
|||
else
|
|||
begin
|
|||
proceso:='echo "Has introducido una contraseña incorrecta de administrador. Modifícala desde menú Configurar -> Contraseña de adtos"';
|
|||
end;
|
|||
try
|
|||
orden:='resultadoProceso ' +HTTPEncode(idproceso)+ ' '+HTTPEncode(miservidor.IP)+ ' '+HTTPEncode(miservidor.Host)+ ' '+HTTPEncode(minumero);
|
|||
with ThrEjucutarAsi.create(miservidor.IPAdministrador,201,orden,38002,proceso,0) do Resume;
|
|||
except
|
|||
//writeln('Error al enviar datos')
|
|||
end;
|
|||
end
|
|||
except
|
|||
//writeln('Error al recibir carpeta');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.cierraServidorAlumnoCommand(ASender: TIdCommand);
|
|||
const
|
|||
CERRARPUERTO:string='fuser -k -n tcp 38000 2>>/dev/null';
|
|||
begin
|
|||
try
|
|||
if Asender.Params.Count=1 then
|
|||
begin
|
|||
Ejecutar(CERRARPUERTO);
|
|||
end
|
|||
except
|
|||
//writeln('Error al desactivar usuario');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.DataModuleCreate(Sender: TObject);
|
|||
begin
|
|||
g_tsEquiposAlumnos:=TStringList.create;
|
|||
IniciarDemonio(37999,'0.0.0.0');
|
|||
end;
|
|||
procedure TDataModule1.DataModuleDestroy(Sender: TObject);
|
|||
begin
|
|||
g_tsEquiposAlumnos.free;
|
|||
end;
|
|||
procedure TDataModule1.datosEquipoCommand(ASender: TIdCommand);
|
|||
var
|
|||
smip,smmac,misdatos:string;
|
|||
begin
|
|||
try
|
|||
smip:= miservidor.ObtenerMiIp();
|
|||
smmac:=miservidor.ObtenerMiMAC();
|
|||
misdatos:=miservidor.Host+'&'+smip+'&'+smmac+'&'+g_usuario;
|
|||
//writeln('Mis datos: '+misdatos);
|
|||
Asender.Reply.SetReply(317,misdatos);
|
|||
ASender.SendReply;
|
|||
except
|
|||
writeln('Error al devolver datos');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.ejecutaScriptAsiCommand(ASender: TIdCommand);
|
|||
var
|
|||
destino,archivo1:string;
|
|||
stream:TFileStream;
|
|||
passwd,archivo:string;
|
|||
idproceso:string;
|
|||
minumero,orden,proceso:String;
|
|||
begin
|
|||
try
|
|||
//writeln('ejecutaScriptAsiCommand '+ inttostr(Asender.Params.Count));;
|
|||
if (Asender.Params.Count=5) then
|
|||
begin
|
|||
destino:=HTTPDECode(Asender.Params[1]);
|
|||
archivo1:=HTTPDECode(Asender.Params[0]);
|
|||
passwd:= HTTPDECode(Asender.Params[2]);
|
|||
idproceso:= HTTPDECode(Asender.Params[3]);
|
|||
minumero:=HTTPDECode(Asender.Params[4]);
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
if compruebaPasswordRoot(passwd) then
|
|||
begin;
|
|||
archivo:='/tmp/'+archivo1;
|
|||
//writeln('archivo ' + archivo );
|
|||
Asender.sendReply;
|
|||
try
|
|||
try
|
|||
if FileExists(archivo) then DeleteFile(archivo);
|
|||
stream:=TfileStream.create(archivo,fmcreate);
|
|||
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
|
|||
Ejecutar1('chmod 755 '+ archivo);
|
|||
if g_ComandosLibres then
|
|||
proceso:=archivo
|
|||
else
|
|||
proceso:='echo "No tiene permisos para ejecutar scripts. Para poder hacerlo debe cambiar a 1 el valor del parámetro Comandos Permitidos en el /var/lib/adtos/ordeneadtos.conf de este equipo"';
|
|||
except
|
|||
proceso:='echo "Error al copiar el script '+archivo1+' en el directorio '+destino+'. Inténtelo de nuevo"';
|
|||
end;
|
|||
finally
|
|||
freeandnil(stream)
|
|||
end;
|
|||
end
|
|||
else
|
|||
begin
|
|||
proceso:='echo "Has introducido una contraseña incorrecta de administrador. Modifícala desde menú Configurar -> Contraseña de adtos"';
|
|||
end;
|
|||
sleep(200);
|
|||
try
|
|||
orden:='resultadoProceso ' +HTTPEncode(idproceso)+ ' '+HTTPEncode(miservidor.IP)+ ' '+HTTPEncode(miservidor.Host)+ ' '+HTTPEncode(minumero);
|
|||
//writeln(' ejecutaScriptAsiCommand orden ' +orden +' proceso '+ proceso);
|
|||
with ThrEjucutarAsi.create(miservidor.IPAdministrador,201,orden,38002,proceso,2) do Resume;
|
|||
except
|
|||
writeln('Error al enviar datos')
|
|||
end;
|
|||
end;
|
|||
except
|
|||
writeln('Error al enviar archivo');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.hallaProcesosActivosAsiCommand(ASender: TIdCommand);
|
|||
var
|
|||
comando_permitido:Boolean;
|
|||
orden:string;
|
|||
minumero,passwd,idproceso,proceso:string;
|
|||
tipo:integer;
|
|||
begin
|
|||
try
|
|||
// writeln('hallaProcesosActivosAsiCommand '+ inttostr(Asender.Params.Count));;
|
|||
if Asender.Params.Count=5 then
|
|||
begin
|
|||
comando_permitido:=g_ComandosLibres;
|
|||
idproceso:= HTTPDECode(Asender.Params[0]);
|
|||
proceso:= HTTPDECode(Asender.Params[1]);
|
|||
passwd:= HTTPDECode(Asender.Params[2]);
|
|||
minumero:=HTTPDECode(Asender.Params[3]);
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
tipo:=StrToInt(HTTPDECode(Asender.Params[4]));
|
|||
//writeln ('Tipo de consulta/comando :' + HTTPDECode(Asender.Params[4]));
|
|||
ASender.SendReply;
|
|||
if compruebaPasswordRoot(passwd) then
|
|||
begin
|
|||
if not((comando_permitido) or (validarProceso(proceso)))then
|
|||
begin
|
|||
proceso:='echo "Comando o proceso no permitido"'
|
|||
end
|
|||
end
|
|||
else
|
|||
begin
|
|||
proceso:='echo "Has introducido una contraseña incorrecta de administrador. Modifícala desde menú Configurar -> Contraseña de adtos"';
|
|||
end;
|
|||
try
|
|||
orden:='resultadoProceso ' +HTTPEncode(idproceso)+ ' '+HTTPEncode(miservidor.IP)+ ' '+HTTPEncode(miservidor.Host)+ ' '+HTTPEncode(minumero);
|
|||
//writeln('orden: '+ orden + ' IPAdministrador '+miservidor.IPAdministrador);
|
|||
with ThrEjucutarAsi.create(miservidor.IPAdministrador,201,orden,38002,proceso,tipo) do Resume;
|
|||
except
|
|||
//writeln('Error al enviar datos')
|
|||
end;
|
|||
end
|
|||
except
|
|||
//writeln('comando NO permitido',comando_permitido);
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.hallarProcesosActivosCommand(ASender: TIdCommand);
|
|||
var
|
|||
misequipos,passwd,proceso:string;
|
|||
begin
|
|||
try
|
|||
if Asender.Params.Count>0 then
|
|||
begin
|
|||
proceso:= HTTPDECode(Asender.Params[0]);
|
|||
passwd:= HTTPDECode(Asender.Params[1]);
|
|||
misequipos:=g_tsEquiposAlumnos.text;
|
|||
//writeln( misequipos);
|
|||
if proceso='equipos_aula' then
|
|||
begin
|
|||
ASender.SendReply;
|
|||
asender.Context.Connection.IOHandler.WriteBufferOpen;
|
|||
asender.Context.Connection.IOHandler.Write(Integer(Length(misequipos)));
|
|||
asender.Context.Connection.IOHandler.Write(misequipos);
|
|||
asender.Context.Connection.IOHandler.WriteBufferClose;
|
|||
end;
|
|||
end
|
|||
except
|
|||
writeln('comando NO permitido');
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.IdCmdTCPServer1AfterCommandHandler(
|
|||
ASender: TIdCmdTCPServer; AContext: TIdContext);
|
|||
begin
|
|||
sleep(50);
|
|||
end;
|
|||
function TDataModule1.validarComando (comando:string):Boolean;
|
|||
var
|
|||
i:integer;
|
|||
cval:Boolean;
|
|||
begin;
|
|||
try
|
|||
cval:=false;
|
|||
for i:=0 to High(g_ordenes_root) do
|
|||
begin
|
|||
if trim(comando)=trim(g_ordenes_root[i]) then
|
|||
begin
|
|||
cval:= true;
|
|||
break;
|
|||
end;
|
|||
end;
|
|||
result:=cval;
|
|||
except
|
|||
result:=false;
|
|||
end;
|
|||
end;
|
|||
function TDataModule1.validarProceso(proceso:string):Boolean;
|
|||
var
|
|||
i:integer;
|
|||
pval:Boolean;
|
|||
begin;
|
|||
try
|
|||
pval:=false;
|
|||
for i:=0 to High(g_procesos_root) do
|
|||
begin
|
|||
if trim(proceso)=trim(g_procesos_root[i]) then
|
|||
begin
|
|||
pval:= true;
|
|||
break;
|
|||
end;
|
|||
end;
|
|||
result:=pval;
|
|||
except
|
|||
result:=false;
|
|||
end;
|
|||
end;
|
|||
procedure TDataModule1.Ejecutar1 (comando:string);
|
|||
begin;
|
|||
unix.fpSystem(comando);
|
|||
end;
|
|||
procedure TDataModule1.IdServerIOHandlerSSLOpenSSL1GetPassword(
|
|||
var Password: String);
|
|||
begin
|
|||
Password:='aaaa';
|
|||
end;
|
|||
procedure TDataModule1.instalaPaqueteDebianCommand(ASender: TIdCommand);
|
|||
var
|
|||
destino,archivo1:string;
|
|||
stream:TFileStream;
|
|||
passwd,archivo:string;
|
|||
idproceso:string;
|
|||
minumero,orden,proceso:String;
|
|||
begin
|
|||
try
|
|||
if (Asender.Params.Count=5) then
|
|||
begin
|
|||
destino:=HTTPDECode(Asender.Params[1]);
|
|||
archivo1:=HTTPDECode(Asender.Params[0]);
|
|||
passwd:= HTTPDECode(Asender.Params[2]);
|
|||
idproceso:= HTTPDECode(Asender.Params[3]);
|
|||
minumero:=HTTPDECode(Asender.Params[4]);
|
|||
passwd:= EncriptaXOR(passwd,g_clessl);
|
|||
if compruebaPasswordRoot(passwd) then
|
|||
begin
|
|||
Asender.sendReply;
|
|||
archivo:='/tmp/'+archivo1;
|
|||
try
|
|||
try
|
|||
stream:=TfileStream.create(archivo,fmcreate);
|
|||
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
|
|||
if g_ComandosLibres then
|
|||
proceso:='dpkg -i '+archivo
|
|||
else
|
|||
proceso:='echo "No tiene permisos para instalar paquetes debian. Para poder hacerlo debe cambiar a 1 el valor del parámetro Comandos Permitidos en el /var/lib/adtos/ordenesadtos1.conf de este equipo"';
|
|||
except
|
|||
proceso:='echo "Error al instalar el paquete debian '+archivo1+' en el directorio '+destino+'. Inténtelo de nuevo"';
|
|||
end;
|
|||
finally
|
|||
freeandnil(stream)
|
|||
end;
|
|||
end
|
|||
else
|
|||
begin
|
|||
proceso:='echo "Has introducido una contraseña incorrecta de administrador. Modifícala desde menú Configurar -> Contraseña de adtos"';
|
|||
end;
|
|||
try
|
|||
orden:='resultadoProceso ' +HTTPEncode(idproceso)+ ' '+HTTPEncode(miservidor.IP)+ ' '+HTTPEncode(miservidor.Host)+ ' '+HTTPEncode(minumero);
|
|||
with ThrEjucutarAsi.create(miservidor.IPAdministrador,201,orden,38002,proceso,3) do Resume;
|
|||
except
|
|||
//writeln('Error al instalar paquete')
|
|||
end;
|
|||
end
|
|||
except
|
|||
//writeln('Error al enviar archivo');
|
|||
end;
|
|||
end;
|
|||
initialization
|
|||
{$I demonio.lrs}
|
|||
miservidor:=Tservidor.create();
|
|||
DataModule1:=TDataModule1.create(nil);
|
|||
Finalization
|
|||
FreeAndNil(DataModule1);
|
|||
FreeAndNil(miservidor);
|
|||
end.
|