Proyecto

General

Perfil

Descargar (34,5 KB) Estadísticas
| Rama: | Revisión:
unit demonio ;

{$mode objfpc}{$H+}

interface

uses
clservidor,globales,Classes , SysUtils , FileUtil , LResources , IdCmdTCPServer, IdCommandHandlers,IdContext, IdURI;

type

{ TDataModule1 }

TDataModule1 = class (TDataModule )
IdCmdTCPOrdenes:TIdCmdTCPServer;
procedure apagarSalvaCommand (ASender : TIdCommand );
procedure aplicacionCommand (ASender : TIdCommand );
procedure aplicacionNoCommand (ASender : TIdCommand );
procedure archivoCommand (ASender : TIdCommand );
procedure carpetaCommand (ASender : TIdCommand );
procedure cerrarAlumnoCommand(ASender: TIdCommand);
procedure desactivarTRCommand (ASender : TIdCommand );
procedure desactivarTRNoCommand (ASender : TIdCommand );
procedure devolverArchivosCommand (ASender : TIdCommand );
procedure hallarIPCommand (ASender : TIdCommand );
procedure hallarUsuarioCommand (ASender : TIdCommand );
procedure iniciarCuestionCommand (ASender : TIdCommand );
procedure iniciarExamenCommand (ASender : TIdCommand );
procedure limpiarCommand (ASender : TIdCommand );
procedure mensajeCommand (ASender : TIdCommand );
procedure mensajeNoCommand (ASender : TIdCommand );
procedure mostrarCommand (ASender : TIdCommand );
procedure mostrarNoCommand (ASender : TIdCommand );
procedure navegar1Command (ASender : TIdCommand );
procedure prepararRecogerCommand (ASender : TIdCommand );
procedure presentadorCommand (ASender : TIdCommand );
procedure ratonCommand (ASender : TIdCommand );
procedure ratonNoCommand (ASender : TIdCommand );
procedure recogerArchivosCommand (ASender : TIdCommand );
procedure verCommand (ASender : TIdCommand );
procedure verNoCommand (ASender : TIdCommand );
procedure videoCommand (ASender : TIdCommand );
procedure videoNoCommand (ASender : TIdCommand );
private
procedure CerrarServidor();
procedure iniciarClienteVNC();
procedure IniciarDemonio(iport: integer);

procedure IniciarDemonio1(mip: string; puerto: integer);
{ private declarations }
public
{ public declarations }
end ;

var
DataModule1 : TDataModule1 ;
miservidor:Tservidor;
CONST
ORD_NUMERO_INCORRECTA:string='Orden o número parámetros incorrectos';


implementation

{ TDataModule1 }

procedure TDataModule1.IniciarDemonio(iport:integer);
begin

try
IniciarDemonio1('localhost',iport);
except
try
miservidor.cierraPuerto();
sleep(10000);
IniciarDemonio1('localhost',iport);
except
writeln('Error al iniciar servidor');
halt;
end;


end;

end;
procedure TDataModule1.IniciarDemonio1(mip:string; puerto:integer);
var
aCommand:TIdCommandHandler;
begin
IdCmdTCPOrdenes:=TIdCmdTCPServer.Create(nil);
with IdCmdTCPOrdenes do
begin
Bindings.Clear;
Bindings.Add;
Bindings.items[0].IP:=mip;
Bindings.Items[0].Port:=puerto;



aCommand:=CommandHandlers.Add;
aCommand.Command := 'mensaje';
aCommand.OnCommand := @mensajeCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:='$';
aCommand.ParamDelimiter:='$';
aCommand.NormalReply.Code:='204';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'mensajeNo';
aCommand.OnCommand := @mensajeNoCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='205';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'aplicacion';
aCommand.OnCommand := @aplicacionCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='206';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'video';
aCommand.OnCommand := @videoCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='208';
aCommand.Enabled:=true;


aCommand:=CommandHandlers.Add;
aCommand.Command := 'videoNo';
aCommand.OnCommand := @videoNoCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='209';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'ver';
aCommand.OnCommand := @verCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='210';
aCommand.Enabled:=true;


aCommand:=CommandHandlers.Add;
aCommand.Command := 'verNo';
aCommand.OnCommand := @verNoCommand;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='211';
aCommand.Enabled:=true;
aCommand.Disconnect:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'mostrar';
aCommand.OnCommand := @mostrarCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='212';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'mostrarNo';
aCommand.OnCommand := @mostrarNoCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='213';
aCommand.Enabled:=true;


aCommand:=CommandHandlers.Add;
aCommand.Command := 'raton';
aCommand.OnCommand := @ratonCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='214';
aCommand.Enabled:=true;


aCommand:=CommandHandlers.Add;
aCommand.Command := 'ratonNo';
aCommand.OnCommand := @ratonNoCommand;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='215';
aCommand.Enabled:=true;
aCommand.Disconnect:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'presentador';
aCommand.OnCommand := @presentadorCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='217';
aCommand.Enabled:=true;



aCommand:=CommandHandlers.Add;
aCommand.Command := 'desactivarTR';
aCommand.OnCommand := @desactivarTRCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='219';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'desactivarTRNo';
aCommand.OnCommand := @desactivarTRNoCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='220';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'limpiar';
aCommand.OnCommand := @limpiarCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='225';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'apagarSalva';
aCommand.OnCommand := @apagarSalvaCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='226';
aCommand.Enabled:=true;



aCommand:=CommandHandlers.Add;
aCommand.Command := 'iniciarCuestion';
aCommand.OnCommand := @iniciarCuestionCommand;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='250';
aCommand.Enabled:=true;
aCommand.Disconnect:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'iniciarExamen';
aCommand.OnCommand := @iniciarExamenCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='251';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'carpeta';
aCommand.OnCommand := @carpetaCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='253';
aCommand.Enabled:=true;


aCommand:=CommandHandlers.Add;
aCommand.Command := 'archivo';
aCommand.OnCommand := @archivoCommand;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='252';
aCommand.Enabled:=true;
aCommand.Disconnect:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'recogerArchivos';
aCommand.OnCommand := @recogerArchivosCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='254';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'devolverArchivos';
aCommand.OnCommand := @devolverArchivosCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='255';
aCommand.Enabled:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'hallarUsuario';
aCommand.OnCommand := @hallarUsuarioCommand;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='256';
aCommand.Enabled:=true;
aCommand.Disconnect:=true;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'cerrarAlumno';
aCommand.OnCommand := @cerrarAlumnoCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='257';
aCommand.Enabled:=true;

aCommand.Command := 'navegar';
aCommand.OnCommand := @navegar1Command;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='202';
aCommand.Enabled:=true;

//OnConnect:=@IdCmdTCPOrdenesConnect;
DefaultPort:=puerto;
MaxConnections:=0;
ListenQueue:=15;
TerminateWaitTime:=5000;
active:=true;

end;
end;

procedure TDataModule1.CerrarServidor();
var
lista:Tlist;
i:integer;
begin
lista:=IdCmdTCPOrdenes.Contexts.LockList;
try
for i:=(lista.Count -1) downto 0 do
TIdContext(lista.items[i]).Connection.Disconnect();
finally
IdCmdTCPOrdenes.Contexts.UnlockList;
end;
sleep(IdCmdTCPOrdenes.TerminateWaitTime);
Ejecutar1('killall x11vnc >/dev/null 2&>1');
Ejecutar1('killall serveralumnolinex-ltsp >/dev/null 2&>1');
sleep(500);
IdCmdTCPOrdenes.active:=false;
IdCmdTCPOrdenes.Bindings.Clear;
end;

procedure TDataModule1.hallarIPCommand (ASender : TIdCommand );
begin
Asender.Reply.SetReply(301,miservidor.IP);
ASender.SendReply;
end;

procedure TDataModule1.apagarSalvaCommand (ASender : TIdCommand );
const
ORD_APAGAR_SALVA:string='gnome-screensaver-command --exit &';
begin
if fapagando then exit;
Ejecutar1(ORD_APAGAR_SALVA);
end;

procedure TDataModule1.aplicacionCommand (ASender : TIdCommand );
var
orden:String;
begin
try
if ASender.Params.Count=1 then
begin
orden:=Asender.Params[0];
orden:= orden +' & 2 >> /dev/null';
ejecutar1(orden);
end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('orden o número de parámetros incorrectos');
end;
end;

procedure TDataModule1.aplicacionNoCommand (ASender : TIdCommand );
begin
//
end;

procedure TDataModule1.archivoCommand (ASender : TIdCommand );
var
orden,titulo,mensaje,archivo1:string;
stream:TFileStream;
begin
if fapagando then exit;
try
if (Asender.Params.Count=3) then
begin
archivo1:=fdirpersonal+'/recibidos_profesor/'+TIdURI.URLDecode(Asender.Params[0]);
mensaje:=Asender.Params[1];
titulo:=Asender.Params[2];
Asender.sendReply;
stream:=TfileStream.create(archivo1,fmcreate);
try
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
if CrearArchivoMensaje('1',titulo,mensaje,'1') then
begin
orden:='/usr/bin/alumnolinex-ltsp &';
ejecutar1(orden);
end;
finally
freeandnil(stream)
end;
end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('Error al enviar archivo');
end;
end;

procedure TDataModule1.carpetaCommand (ASender : TIdCommand );
const
ORD_DESCOMPRIMIR:STRING= '(cd %s; tar xzvf aulalinex-carpeta.tar.gz;rm -f %s) &';
var
titulo:string;
mensaje:string;
orden,archivo:string;
stream:TFileStream;
begin
if fapagando then exit;
try
if (Asender.Params.Count=2) then
begin
archivo:=fdirpersonal+'/recibidos_profesor/aulalinex-carpeta.tar.gz';
mensaje:=Asender.Params[0];
titulo:=Asender.Params[1];
Asender.sendReply;
stream:=TfileStream.create(archivo,fmcreate);
try
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
finally
freeandnil(stream);
sleep(2000);
orden:=Format(ORD_DESCOMPRIMIR,[fdirrecibidos,archivo]);
ejecutar1(orden);
if CrearArchivoMensaje('1',titulo,mensaje,'1') then
begin
orden:='/usr/bin/alumnolinex-ltsp &';
ejecutar1(orden);
end;
end;
end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('Error al recibir carpeta');
end;
end;

procedure TDataModule1.cerrarAlumnoCommand(ASender: TIdCommand);
begin
CerrarServidor;
end;

procedure TDataModule1.desactivarTRCommand (ASender : TIdCommand );
begin
miservidor.InactivarTecladoRaton();;
end;

procedure TDataModule1.desactivarTRNoCommand (ASender : TIdCommand );
begin
miservidor.ActivarTecladoRaton();
end;

procedure TDataModule1.devolverArchivosCommand (ASender : TIdCommand );
const
ORD_DESCOMPRIMIR:STRING= '(cd %s; tar -xvzf aulalinex-devueltos.tar.gz) &';
var
titulo,mensaje,carpasig,asignatura:string;
orden,archivo:string;
stream:TFileStream;
begin
if fapagando then exit;
try
if (Asender.Params.Count=3) then
begin
asignatura:=Asender.Params[0];
mensaje:=Asender.Params[1];
titulo:=Asender.Params[2];
carpasig:=fdirrecibidos+'/'+asignatura;
if not DirectoryExists(carpasig) then
createdir(carpasig);
archivo:=carpasig+'/aulalinex-devueltos.tar.gz';
stream:=TfileStream.create(archivo,fmcreate);
try
Asender.sendReply;
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
finally
freeandnil(stream);
orden:=Format(ORD_DESCOMPRIMIR,[carpasig]);
ejecutar1(orden);
if CrearArchivoMensaje('1',titulo,mensaje,'1') then
begin
orden:='/usr/bin/alumnolinex-ltsp &';
ejecutar1(orden);
end;
if FileExists(archivo) then
DeleteFile(archivo);
end
end
else
begin
writeln('ORD_NUMERO_INCORRECTA');
end;
except
writeln('No se han podido delvolver los archivos');
end;
end;


procedure TDataModule1.hallarUsuarioCommand (ASender : TIdCommand );
var
miusuario:string;
begin
try
miusuario:=miservidor.ObtenerNombreUsuario();
Asender.Reply.SetReply(306,miusuario);
ASender.SendReply;
writeln(miusuario);
except
writeln('Error al detectar el usuario ' + miusuario);
end;
end;

procedure TDataModule1.iniciarCuestionCommand (ASender : TIdCommand );
const
ORD_ALUMNO_CUESTION:string='aulalinexcuestion-ltsp &';
var
archivo1:string;
stream:TFileStream;
begin
if fapagando then exit;
try
archivo1:=fdirpersonal+'/recibidos_profesor/.cuestion.ini';
asender.sendReply;
stream:=TfileStream.create(archivo1,fmcreate);
try
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
ejecutar1(ORD_ALUMNO_CUESTION);
finally
freeandnil(stream)
end;
except
writeln(ORD_NUMERO_INCORRECTA);
end;
end;


procedure TDataModule1.iniciarExamenCommand (ASender : TIdCommand );
const
ORD_ALUMNO_EXAMEN:string='aulalinexexamen-ltsp &';
var
archivo1:string;
stream:TFileStream;
begin
if fapagando then exit;
try
archivo1:=fdirpersonal+'/recibidos_profesor/.examen.ini';
asender.sendReply;
stream:=TfileStream.create(archivo1,fmcreate);
try
asender.Context.Connection.IOHandler.ReadStream(stream,-1,false);
ejecutar1(ORD_ALUMNO_EXAMEN);
finally
freeandnil(stream)
end;
except
writeln(ORD_NUMERO_INCORRECTA);
end;
end;

procedure TDataModule1.limpiarCommand (ASender : TIdCommand );
const
ORD_LIM_RECIBIDOS:string='rm -rf %s/recibidos_profesor/*';
ORD_LIM_ENVIADOS:string='rm -rf %s/enviar_profesor/*';
var
orden1,orden2:string;
tipo:integer;
begin
try
if Assigned (ASender.Params) then
begin
tipo:=strtoint(Asender.Params[0]);
orden1:=Format(ORD_LIM_RECIBIDOS,[fdirpersonal]);
orden2:=Format(ORD_LIM_ENVIADOS,[fdirpersonal]);
case tipo of
0: Ejecutar1(orden1);
1: Ejecutar1(orden2);
2:
begin
Ejecutar1(orden1);
Ejecutar1(orden2);
end;
end;
end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('orden o número de parámetros incorrecto');
end;
end;

procedure TDataModule1.mensajeCommand (ASender : TIdCommand );
var
orden,tipo,asunto, mensaje:String;
begin
try
if ASender.Params.Count =3 then
begin
tipo:=Asender.Params[0];
asunto:= Asender.Params[1];
mensaje:=Asender.Params[2];
if CrearArchivoMensaje(tipo,asunto,mensaje,'0') then
begin
orden:='/usr/bin/alumnolinex-ltsp &';
ejecutar1(orden);
end;
end
else
begin
writeln(ORD_NUMERO_INCORRECTA)
end;
except
writeln('Error al enviar el mensaje')
end;
end;


procedure TDataModule1.mensajeNoCommand (ASender : TIdCommand );
begin
try
MatarAplicacion('alumnolinex-ltsp');
except
writeln('Error al cerrar mensaje');
end;
end;

procedure TDataModule1.mostrarCommand (ASender : TIdCommand );
const
ORDEN_CREAR_CONTRA:STRING='aulaconlinext %s %s/.seral456512';
ORDEN_MOSTRAR:string='xvnc4viewer -ViewOnly -UseLocalCursor=0 -LowColourLevel=1 -MenuKey F15 -Shared -Fullscreen -passwd %s localhost:5899 &';
var
archivocontra,orden,contra:string;
begin
try
if ASender.Params.count=1 then
begin
contra:=Asender.Params[0];
orden:=Format(ORDEN_CREAR_CONTRA,[contra,fdirpersonal]);
//writeln(orden);
ejecutar1(orden);
sleep(100);
archivocontra:=fdirpersonal+'/.seral456512';
orden:=Format(ORDEN_MOSTRAR,[archivocontra]);
ejecutar1(orden);
if miservidor.UsuarioCanon then
miservidor.InactivarTecladoRaton();
end
else
begin
writeln('numero de parametros incorrecto');
end;
except
writeln('Error al mostrar el profesor');
end;
end;

procedure TDataModule1.mostrarNoCommand (ASender : TIdCommand );
begin
try
if fapagando then exit;
MatarAplicacion('xvnc4viewer');
except
writeln('Error al detener mostrar alumno');
end;
end;

procedure TDataModule1.navegar1Command (ASender : TIdCommand );
const
//ICEWEASEL_LOCAL:string='xprop -root -f LTSP_COMMAND 8s -set LTSP_COMMAND "iceweasel %s" &';
ICEWEASEL_LOCAL1:string='google-chrome-stable %s &';
//FIREFOX_LOCAL2:string='export GTK_IM_MODULE_FILE=/etc/gtk-2.0/gdk.immodules.32;linux32 /opt/ltsp/i386/usr/lib/iceweasel/iceweasel2 "%s" &';*)
var
orden, pagina:string;
begin
try
if Assigned (ASender.Params) then
begin
// if FileExists('/usr/local/bin/firefox.local') then navegador:=FIREFOX_LOCAL else
//navegador:='/usr/bin/firefox';
pagina:=Asender.Params[0];
//orden:=navegador+' %s &';
orden:= Format(ICEWEASEL_LOCAL1,[pagina]);
writeln(orden);
ejecutar1(orden);
end
else
begin
writeln('orden no admitinda');
end;
except
writeln('Error al ejecutar la orden');
end;
end;

procedure TDataModule1.prepararRecogerCommand (ASender : TIdCommand );
// const
//ORDEN_COMPRIMIR:string='(cd %s; tar czvf recogidos_alumno.tar.gz %s) &';
// var
//orden:string;
begin
try
if fapagando then exit;
//orden:= Format(ORDEN_COMPRIMIR,[fenviar,'*']);
//ejecutar1(orden);
except
writeln('Error al preparar el envío ');
end;
end;

procedure TDataModule1.presentadorCommand (ASender : TIdCommand );
begin
try
if ASender.Params.count=2 then
begin
ejecutar1('killall xvnc4viewer');
iniciarClienteVNC();
end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('Error al iniciar presentación');
end;
end;

procedure TDataModule1.ratonCommand (ASender : TIdCommand );
const
ORDEN_CREAR_CONTRA:STRING='aulaconlinext %s %s/.seral456512';
ORDEN_MOSTRAR:string='xvnc4viewer -UseLocalCursor=0 -LowColourLevel=1 -MenuKey F15 -Shared -Fullscreen -passwd %s localhost:5899 &';
ORDEN_MATAR_VNC='killall xvnc4viewer >/dev/null 2&>1';
var
archivocontra, orden,contra:string;
begin
try
if ASender.Params.count=1 then
begin
ejecutar1(ORDEN_MATAR_VNC);
contra:=Asender.Params[0];
orden:=Format(ORDEN_CREAR_CONTRA,[contra,fdirpersonal]);
ejecutar1(orden);
sleep(100);
archivocontra:=fdirpersonal+'/.seral456512';
orden:=Format(ORDEN_MOSTRAR,[archivocontra]);
ejecutar1(orden);
end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('Error al ceder el ratón');
end;
end;

procedure TDataModule1.ratonNoCommand (ASender : TIdCommand );
const
ORDEN_CREAR_CONTRA:STRING='aulaconlinext %s %s/.seral456512';
ORDEN_MOSTRAR:string='xvnc4viewer -UseLocalCursor=0 -LowColourLevel=1 -ViewOnly -MenuKey F15 -Shared -Fullscreen -passwd %s localhost:5899 &';
ORDEN_MATAR_VNC='killall xvnc4viewer >/dev/null 2&>1';
var
archivocontra,orden,contra:string;
begin
try
if ASender.Params.count=1 then
begin
ejecutar1(ORDEN_MATAR_VNC);
contra:=Asender.Params[0];
orden:=Format(ORDEN_CREAR_CONTRA,[contra,fdirpersonal]);
ejecutar1(orden);
sleep(100);
archivocontra:=fdirpersonal+'/.seral456512';
orden:=Format(ORDEN_MOSTRAR,[archivocontra]);
ejecutar1(orden);

end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('orden o número de parámetros incorrecto');
end;
end;

procedure TDataModule1.recogerArchivosCommand (ASender : TIdCommand );
const
ORDEN_COMPRIMIR:string='(cd %s; tar czvf recogidos_alumno.tar.gz %s;touch %s;chmod 777 %s -R )';
var
orden,asunto, mensaje,archivo:string;
stream:TfileStream;
crcontador:integer=0;
comprimidos:Boolean=false;
arch_recogidos:String;
begin
if fapagando then exit;
try
arch_recogidos:=fdirpersonal+'/ficheros_recogidos.txt';
if fileExists(arch_recogidos) then Deletefile(arch_recogidos);
archivo:=fenviar+'/recogidos_alumno.tar.gz';
if fileExists(archivo) then Deletefile(archivo);
orden:= Format(ORDEN_COMPRIMIR,[fenviar,'*',arch_recogidos,fenviar]);
ejecutar1(orden);
while ((comprimidos=false) and (crcontador <500)) do
begin
comprimidos:=fileExists(arch_recogidos);
inc(crcontador);
Sleep(100);
end;
Sleep(1000);
if fileExists(archivo) then
begin
stream:=TfileStream.create(archivo, fmOpenRead+ fmShareDenyNone);
try
asunto:=Asender.Params[2];
mensaje:=Asender.Params[1];
ASender.SendReply;
asender.Context.Connection.IOHandler.WriteBufferOpen;
asender.Context.Connection.IOHandler.Write(stream,0,true);
asender.Context.Connection.IOHandler.WriteBufferClose;
if CrearArchivoMensaje('1',asunto,mensaje,'0') then
begin
orden:='/usr/bin/alumnolinex-ltsp &';
ejecutar1(orden);
end;
finally
begin
stream.free;
if fileExists(archivo) then
Deletefile(archivo);
end;
end;
end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('orden o número de parámetros incorrecto');
end;
end;

Procedure TDataModule1.iniciarClienteVNC ( );
const
HALLARX11VNC:string='ps aux | grep %d | grep -v grep | grep -c x11vnc';
ORDEN_INICIAR_VNC:STRING='x11vnc -localhost -bg -shared -forever -ncache 10 -noshm -rfbport %d -passwd 02101067';
var
orden:string;
numvnc,vncactivo:string;
begin
vncactivo:=Format(HALLARX11VNC,[miservidor.PuertoVNC]);
numvnc:=miservidor.HallarDato(vncactivo);
if (numvnc= '0') then
begin
orden:=Format(ORDEN_INICIAR_VNC,[miservidor.PuertoVNC]);
ejecutar1(orden);
end;
end;

procedure TDataModule1.verCommand (ASender : TIdCommand );
begin
try
if ASender.Params.count=2 then
iniciarClienteVNC()
else
writeln(ORD_NUMERO_INCORRECTA);
except
writeln('Error al mostrar imagen');
end;
end;

procedure TDataModule1.verNoCommand (ASender : TIdCommand );
begin
try
if fapagando then exit;
Ejecutar1('killall x11vnc >/dev/null 2&>1');
except
writeln('Error al ocultar al alumno')
end
end;

procedure TDataModule1.videoCommand (ASender : TIdCommand );
const
//ORDEN_MIRAR_VIDEO:STRING='(route add -net %s/24 gw %s;vlc udp:@%s) &';
ORDEN_MIRAR_VIDEO1:STRING='xprop -root -f LTSP_COMMAND 8s -set LTSP_COMMAND "vlc -I dummy --quiet --video-on-top --skip-frames --sout-display-delay=1100 --sub-track=0 --no-overlay -f rtp://@%s:%s" &';
var
orden,ipvlc, puerto:string;
begin
try
if fapagando then exit;
if Assigned (ASender.Params) then
begin
ipvlc:=Asender.Params[0];
puerto:=Asender.Params[1];
orden:=Format(ORDEN_MIRAR_VIDEO1,[ipvlc,puerto]);
writeln(orden);
ejecutar1(orden);

end
else
begin
writeln(ORD_NUMERO_INCORRECTA);
end;
except
writeln('Error al iniciar al alumno');
end;
end;

procedure TDataModule1.videoNoCommand (ASender : TIdCommand );
begin
try
if fapagando then exit;
MatarAplicacion('vlc');
except
writeln('Error al detener el vídeo');
end;
end;
initialization
{$I demonio.lrs}
g_maquina_profe:=(trim(HallarDatos('echo $LTSP_CLIENT')) ='');
if g_maquina_profe then
begin
try
g_finalizar:=true;
exit;
except
writeln('Apagando serveralumnolinex');
end;
end
else
begin
DataModule1:=TDataModule1.create(nil);
miservidor:=Tservidor.create;
fusuario:=miservidor.UsuarioAlumno;
fmipuerto:=miservidor.Puerto;
DataModule1.IniciarDemonio(fmipuerto);
fdirpersonal:=miservidor.HomeUsuario;
fdirrecibidos:=miservidor.DirRecibidos;
fenviar:=miservidor.DirEnviar;
if not directoryexists(fdirrecibidos) then
createdir(fdirrecibidos);
Ejecutar1('chmod 755 ' +fdirrecibidos +' &');
if not directoryexists(fenviar) then
createdir(fenviar);
Ejecutar1('chmod 755 ' +fenviar +' &');
writeln('inciando el servidor');
g_dirmensaje:=fdirrecibidos+'/.mensaje.ini';
if miservidor.UsuarioCanon then
miservidor.InactivarTecladoRaton;
end;

Finalization
if not g_maquina_profe then
begin
FreeAndNil(DataModule1);
FreeAndNil(miservidor);
end;

end .

(6-6/10)