|
unit demonio;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
clservidor,globales,Classes, SysUtils, IdCmdTCPServer, IdCommandHandlers, IdContext;
|
|
|
|
type
|
|
|
|
{ TDataModule1 }
|
|
|
|
TDataModule1 = class(TDataModule)
|
|
IdCmdTCPServer1: TIdCmdTCPServer;
|
|
procedure actualizarDatosEquipoCommand(ASender: TIdCommand);
|
|
procedure DataModuleCreate(Sender: TObject);
|
|
procedure IdCmdTCPServer1Connect(AContext: TIdContext);
|
|
private
|
|
procedure IniciarDemonio(iport: integer; ihost: string);
|
|
procedure IniciarDemonio1(iport: integer; ihost: string);
|
|
{ private declarations }
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
|
|
DataModule1: TDataModule1;
|
|
|
|
|
|
implementation
|
|
|
|
{$R *.lfm}
|
|
|
|
procedure TDataModule1.actualizarDatosEquipoCommand(ASender: TIdCommand);
|
|
var
|
|
datos_equipo,ip_equipo, mac_equipo,nombre_equipo,dominio_equipo:string;
|
|
sdatos:TstringList;
|
|
equipos:Array of TEquipos_Alumnos;
|
|
i:integer;
|
|
equipoExiste:Boolean;
|
|
posicionLibre:Boolean;
|
|
begin
|
|
try
|
|
if Asender.Params.Count=1 then
|
|
begin
|
|
g_equipo_actualizado:=true;
|
|
equipos:= g_ips_servidores_aula;
|
|
datos_equipo:= trim(Asender.Params[0]);
|
|
sdatos:=TStringList.create;
|
|
sdatos.Delimiter:='&';
|
|
sdatos.DelimitedText:=datos_equipo;
|
|
nombre_equipo:=Trim(sdatos[0]);
|
|
ip_equipo:=Trim(sdatos[1]);
|
|
mac_equipo:=Trim(sdatos[2]);
|
|
dominio_equipo:=Trim(sdatos[3]);
|
|
sdatos.free;
|
|
equipoExiste:=false;
|
|
//writeln(datos_equipo);
|
|
for i:=0 to g_equipos_lista -1 do
|
|
begin
|
|
if (equipos[i].nombre= nombre_equipo) then
|
|
begin
|
|
if ((equipos[i].dominio=dominio_equipo) or (equipos[i].dominio='')) then
|
|
begin
|
|
equipoExiste:=true;
|
|
if (equipos[i].ip<>ip_equipo) or (equipos[i].dominio <> dominio_equipo) then
|
|
begin
|
|
equipos[i].ip:=ip_equipo;
|
|
equipos[i].mac:=mac_equipo;
|
|
equipos[i].dominio:=dominio_equipo;
|
|
end;
|
|
break;
|
|
end;
|
|
end;
|
|
end;
|
|
for i:=0 to g_equipos_lista -1 do
|
|
begin
|
|
if (equipos[i].ip= ip_equipo) then
|
|
begin
|
|
if (equipos[i].nombre<>nombre_equipo) then
|
|
begin
|
|
equipos[i].ip:='';
|
|
end;
|
|
end
|
|
end;
|
|
if equipoExiste=false then
|
|
begin
|
|
posicionLibre:=false;
|
|
for i:=0 to g_equipos_lista -1 do
|
|
begin
|
|
if (Trim(equipos[i].nombre)='') then
|
|
begin
|
|
posicionLibre:=true;
|
|
equipos[i].nombre:=nombre_equipo;
|
|
equipos[i].ip:=ip_equipo;
|
|
equipos[i].mac:=mac_equipo;
|
|
equipos[i].dominio:=dominio_equipo;
|
|
break;
|
|
end
|
|
end;
|
|
if not posicionLibre then
|
|
begin
|
|
SetLength(equipos,g_equipos_lista+1);
|
|
equipos[g_equipos_lista].nombre:=nombre_equipo;
|
|
equipos[g_equipos_lista].ip:=ip_equipo;
|
|
equipos[g_equipos_lista].mac:=mac_equipo;
|
|
equipos[g_equipos_lista].dominio:=dominio_equipo;
|
|
inc(g_equipos_lista);
|
|
end
|
|
end;
|
|
g_ips_servidores_aula:= equipos;
|
|
Asender.Reply.SetReply(311,'Equipo '+ nombre_equipo +','+ ip_equipo +','+ mac_equipo+','+ dominio_equipo+', actualizado');
|
|
ASender.SendReply;
|
|
|
|
end
|
|
else
|
|
begin
|
|
writeln('Actualizar datos: Orden o número parametros incorrectos');
|
|
end;
|
|
except
|
|
writeln('Error al actualizard datos');
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TDataModule1.DataModuleCreate(Sender: TObject);
|
|
begin
|
|
IniciarDemonio(38001,'0.0.0.0');
|
|
end;
|
|
|
|
procedure TDataModule1.IdCmdTCPServer1Connect(AContext: TIdContext);
|
|
begin
|
|
try
|
|
g_ip_conexion:=AContext.Connection.Socket.Binding.IP;
|
|
except
|
|
writeln('Error en la conexión');
|
|
end;
|
|
end;
|
|
|
|
procedure TDataModule1.IniciarDemonio(iport:integer;ihost:string);
|
|
const
|
|
LIBERA_PUERTO:STRING='fuser -k -n tcp 38001';
|
|
begin
|
|
try
|
|
Ejecutar1(LIBERA_PUERTO);
|
|
sleep(1000);
|
|
IniciarDemonio1(iport,ihost);
|
|
except
|
|
|
|
|
|
Ejecutar1(LIBERA_PUERTO);
|
|
sleep(1000);
|
|
IniciarDemonio1(iport,ihost);
|
|
end;
|
|
end;
|
|
|
|
procedure TDataModule1.IniciarDemonio1(iport:integer;ihost:string);
|
|
var
|
|
aCommand:TIdCommandHandler;
|
|
begin
|
|
try
|
|
IdCmdTCPServer1:=TIdCmdTCPServer.Create(nil);
|
|
with IdCmdTCPServer1 do
|
|
begin
|
|
Bindings.Clear;
|
|
Bindings.Add;
|
|
Bindings.items[0].IP:=ihost;
|
|
Bindings.Items[0].Port:=38001;
|
|
DefaultPort:=iport;
|
|
MaxConnections:=0;
|
|
ListenQueue:=15;
|
|
TerminateWaitTime:=5000;
|
|
|
|
aCommand:=CommandHandlers.Add;
|
|
aCommand.Command := 'actualizarDatosEquipo';
|
|
aCommand.OnCommand :=@actualizarDatosEquipoCommand;
|
|
aCommand.Disconnect:=true;
|
|
aCommand.CmdDelimiter:=#32;
|
|
aCommand.ParamDelimiter:=#32;
|
|
aCommand.NormalReply.Code:='311';
|
|
aCommand.Enabled:=true;
|
|
|
|
OnConnect:=@IdCmdTCPServer1Connect;
|
|
if active then active:=false;
|
|
active:=true;
|
|
|
|
end;
|
|
|
|
except
|
|
writeln('Error al iniciar servidor');
|
|
end;
|
|
end;
|
|
initialization
|
|
miservidor:=Tservidor.create();
|
|
DataModule1:=TDataModule1.create(nil);
|
|
Finalization
|
|
FreeAndNil(DataModule1);
|
|
FreeAndNil(miservidor);
|
|
end.
|
|
|