Proyecto

General

Perfil

Descargar (31,6 KB) Estadísticas
| Rama: | Revisión:
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.