Proyecto

General

Perfil

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

(5-5/10)