|
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.
|
|
|