Proyecto

General

Perfil

Descargar (120 KB) Estadísticas
| Rama: | Revisión:
23a384b9 Elisa
{
Adtos 1.0 Software de gestión de Aulas Tecnológicas

Programación: Manuel Narváez Martínez <mnarvaez007@gmail.com>
Diseño gráfico: Ana María Zamora Moreno
Desarrollado con Lazarus 0.9.26

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
}
unit inicio;

{$mode objfpc}{$H+}

interface
uses
LCLType, IniFiles, textomensajes, globales, globales1, Classes, SysUtils,
LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls, Menus, StdCtrls,
Buttons, EditBtn, ComCtrls, RTTICtrls, ColorProgress, IdCmdTCPServer,
IdCommandHandlers, IdSync, IdCustomTCPServer, IdTCPClient, HTTPDefs;

type
THallarResultadoProcesoSync = class(TIdSync)
protected
fhost,fcodigo,fip,frespuesta:string;
fnumEquipo:integer;
procedure DoSynchronize; override;
public
constructor Create(codigo,ip, host, respuesta: string;numEquipo:integer);
class procedure add(codigo,ip, host, respuesta: string;numEquipo:integer);
end;

{ TfrmMain }

TfrmMain = class(TForm)
btnAceptar: TButton;
btnAndar: TButton;
btnGuardar: TButton;
btnCerrar: TButton;
btnParar: TButton;
btnBuscar: TButton;
btnTodos: TButton;
btnReintentarTodos: TButton;
cboIntervaloP6: TComboBox;
cboIntervaloP7: TComboBox;
deCarpetas: TDirectoryEdit;
deCarpetasRoot: TDirectoryEdit;
edAsuMen: TEdit;
edCarpetaDestino: TEdit;
edComando: TEdit;
edPassword: TEdit;
dlBuscar: TFindDialog;
fnArchivo: TFileNameEdit;
fnArchivoRoot: TFileNameEdit;
fnScript: TFileNameEdit;

Image1: TImage;
Image2: TImage;
imgFondoPrincipal: TImage;
imlIcoAct1: TImageList;
imgIco: TImage;
imldisabled: TImageList;
imlEncender: TImageList;
imlLogos: TImageList;
imlIcoIna: TImageList;
imlmenu: TImageList;
imlIcoDis: TImageList;
imgPresentacion: TImage;
Label1: TLabel;
Label71: TLabel;
lblInfoProScrip: TLabel;
lblProScript: TLabel;
lblRevInicio: TLabel;
Label70: TLabel;
lblGrupo: TLabel;
lblTiempoProceso1: TLabel;
lblAccionEjecutada: TLabel;
lblTiempoProceso: TLabel;
lblInfoEnviar: TLabel;
lblEnviar: TLabel;
Label69: TLabel;
lblHost: TLabel;
Label22: TLabel;
Label3: TLabel;
Label32: TLabel;
Label4: TLabel;
Label57: TLabel;
Label58: TLabel;
Label59: TLabel;
Label66: TLabel;
Label67: TLabel;
Label7: TLabel;
Label82: TLabel;
Label83: TLabel;
lblInfo: TLabel;
lblIP: TLabel;
lblMAC: TLabel;
lstComandos: TListBox;
lstProcesos: TListBox;
MenuItem6: TMenuItem;
meProceso1: TMemo;
meScript: TMemo;
mnuRepetir: TMenuItem;
mnuConfigurarImpresora: TMenuItem;
mnuResultados: TMenuItem;
mnuConfigurarGrupos: TMenuItem;
mnuRestaurar: TMenuItem;
MenuItem12: TMenuItem;
mnuGrups: TMenuItem;
mnuGrupos1: TMenuItem;
MenuItem9: TMenuItem;
MenuItem1: TMenuItem;
MenuItem2: TMenuItem;
MenuItem3: TMenuItem;
mnuCursos: TMenuItem;
MenuItem4: TMenuItem;
MenuItem5: TMenuItem;
mnuSalir1: TMenuItem;
mnuMapa: TMenuItem;
mnuCentro: TMenuItem;
mnuAula: TMenuItem;
mnuContra: TMenuItem;
mnuTerminal: TMenuItem;
mnuArchivoRoot: TMenuItem;
mnuComandoRoot: TMenuItem;
mnuConsulta: TMenuItem;
menuAula: TMainMenu;
Calculadora1: TMenuItem;
meTexArc: TMemo;
meCarpertas: TMemo;
Administrador1: TMenuItem;
meTexMen: TMemo;
mnuAcercade: TMenuItem;
mnuNot: TMenuItem;
OpenDialog1: TOpenDialog;
OpenDialog3: TOpenDialog;
Panel1: TPanel;
pnArcRoot: TPanel;
pnComandos: TPanel;
pnPrioridad: TPanel;
pnEnc: TPanel;
pnMen: TPanel;
pnRec: TPanel;
pnArc: TPanel;
pnCar: TPanel;
pnFondo: TPanel;
pnTodos: TPanel;
poRepetir: TPopupMenu;
poAula: TPopupMenu;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
rbComando: TRadioButton;
rbConsulta: TRadioButton;
rbCopias: TRadioButton;
RadioButton4: TRadioButton;
rbCopiasCarpeta: TRadioButton;
rbDebian: TRadioButton;
rbScript: TRadioButton;
SaveDialog1: TSaveDialog;
SelectDirectoryDialog1: TSelectDirectoryDialog;
spArcRoot: TSpeedButton;
spEA: TSpeedButton;
spCue: TSpeedButton;
spEnc: TSpeedButton;
spCom: TSpeedButton;
spMen: TSpeedButton;
spArc: TSpeedButton;
spCar: TSpeedButton;
tmrRecogidaProcesos: TTimer;
tmrBarrasE: TTimer;
mnuEnvCar: TMenuItem;
mnuEnviarArchivo: TMenuItem;
mnuMensaje: TMenuItem;
mnuAyuda: TMenuItem;
mnuConfigurar: TMenuItem;
mnuUtilidades: TMenuItem;
mnuUsuarios: TMenuItem;
mnuRefrescar: TMenuItem;
mnuEncender: TMenuItem;
mnuAulas: TMenuItem;
pnPresenta: TPanel;
tmrPingEstadoCentro: TTimer;
tmrRecogidaProcesos1: TTimer;
IdCmdTCPServer1: TIdCmdTCPServer;
procedure Administrador1Click(Sender: TObject);
procedure btnAceptarClick(Sender: TObject);
procedure btnAndarClick(Sender: TObject);
procedure btnBuscarClick(Sender: TObject);
procedure btnCerrarClick(Sender: TObject);
procedure btnEleMenClick(Sender: TObject);
procedure btnGuardarClick(Sender: TObject);
procedure btnPararClick(Sender: TObject);
procedure btnProcesoMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btnReintentarTodosClick(Sender: TObject);
procedure btnTodosClick(Sender: TObject);
procedure Calculadora1Click(Sender: TObject);
procedure cboIntervaloP6KeyPress(Sender: TObject; var Key: char);
procedure deCarpetasChange(Sender: TObject);
procedure deCarpetasRootChange(Sender: TObject);
procedure deCarpetasRootKeyPress(Sender: TObject; var Key: char);
procedure dlBuscarFind(Sender: TObject);
procedure edPasswordKeyPress(Sender: TObject; var Key: char);
procedure fnArchivoRootChange(Sender: TObject);
procedure fnArchivoRootKeyPress(Sender: TObject; var Key: char);
procedure fnScriptChange(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure fnArchivoChange(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure IdCmdTCPServer1ListenException(AThread: TIdListenerThread;
AException: Exception);
procedure imgPresentacionClick(Sender: TObject);
procedure lstComandosClick(Sender: TObject);
procedure lstProcesosClick(Sender: TObject);
procedure mnuAulaClick(Sender: TObject);
procedure mnuConfigurarGruposClick(Sender: TObject);
procedure mnuConfigurarImpresoraClick(Sender: TObject);
procedure mnuContraClick(Sender: TObject);
procedure mnuAcercadeClick(Sender: TObject);
procedure mnuArchivoRootClick(Sender: TObject);
procedure mnuComandoRootClick(Sender: TObject);
procedure mnuConsultaClick(Sender: TObject);
procedure mnuCursosClick(Sender: TObject);
procedure mnuEncenderClick(Sender: TObject);
procedure mnuEnvCarClick(Sender: TObject);
procedure mnuEnviarArchivoClick(Sender: TObject);
procedure mnuIniEvaClick(Sender: TObject);
procedure mnuMapaClick(Sender: TObject);
procedure mnuMensajeClick(Sender: TObject);
procedure mnuNotClick(Sender: TObject);
procedure mnuRepetirClick(Sender: TObject);
procedure mnuRestaurarClick(Sender: TObject);
procedure mnuResultadosClick(Sender: TObject);
procedure mnuSalir1Click(Sender: TObject);
procedure mnuTerminalClick(Sender: TObject);

procedure rbComandoChange(Sender: TObject);
procedure rbCopiasChange(Sender: TObject);
procedure resultadoProcesoCommand(ASender: TIdCommand);
procedure spBloClick(Sender: TObject);
procedure tmrBarrasETimer(Sender: TObject);
procedure tmrPingEstadoCentroTimer(Sender: TObject);
procedure tmrRecogidaProcesos1Timer(Sender: TObject);
procedure tmrRecogidaProcesosTimer(Sender: TObject);
private
Ordenata:Array of TImage;
lblOrdenata:Array of Tlabel;
lblMesa:array of Tlabel;
btnProceso:array of TSpeedButton;
pgOrdenata:array of TColorProgress;
mnuGrupo:Array of TMenuItem;
procedure btnProcesoClick(sender: TObject);
procedure CargarConfiguracionGrupo(grupo: integer);
procedure cargasEquiposAula(aula: integer; equipos: ansiString);
function CompruebaProcesosActivos(): Boolean;
function ConvierteValorCombo(texto: String): integer;
procedure destruirComponentes();
procedure EquipoAulaEncender(ord_num: integer);
procedure EquipoAulaEncenderNo(ord_num: integer);
procedure EquipoAulaComando(ord_num: integer);
procedure EquipoAulaComandoNo(ord_num:integer);
procedure EquipoAulaArchivoRoot(ord_num: integer);
procedure EquipoAulaArchivoRootNo(ord_num: integer);
procedure IniciarDemonio1();
procedure iniciaRevisionCentro();
procedure mnuGrupoclick(sender: Tobject);
procedure muestraResultadosConsulta();
function PausaEquipo(tipo:integer;estado:Boolean; actividad:TEstadoActividadEquipo): integer;
procedure RepetirProceso(numEqui: integer);
function ValidarProcesoArchivoRoot(): Boolean;
function ValidarProcesoAsi(): Boolean;
procedure IniciarTCPCMD();

procedure ProfeAulaMensaje(ord_num: integer);
procedure ProfeAulaMensajeNo(ord_num: integer);
procedure ProfeAulaArchivo(ord_num: integer);
procedure ProfeAulaArchivoNo(ord_num:integer);
procedure ProfeAulaCarpeta(ord_num: integer);
procedure ProfeAulaCarpetaNo(ord_num:integer);
procedure CambiarIconoActivo(ord_num: integer);
procedure CambiarIconoInactivo(ord_num: integer);
procedure CargarConfiguracionCentro(archivoaula: string);
procedure CargarOrdenesRoot();
procedure ColocarPaneles();
procedure ComprobarEstadoOrdenadores(numero_pantalla: integer);
procedure CrearColocarComponentes();
procedure DesmarcarMenus();
procedure despulsarMonitores(numero_pant: integer);
procedure DetenerActividad(numero_pantalla: integer; ord_num: integer);
procedure EjecutarOrdenesFin(tipo:integer;estado:boolean;EnviarMensaje:boolean=false;asunto:string='Aviso';texto:string='Mensaje del Administrador');
function HallaSleep(tipo: integer; estado: Boolean; actividad:TEstadoActividadEquipo): integer;
procedure EntrarPrograma();
procedure IniciarActividad(numero_pantalla: integer; ord_num: integer);
procedure IniciarPrograma();
procedure IniciarVariables;
procedure MensajeEnviado(ord_num:integer; asunto,texto:string);
procedure MenusClick(MenuPulsado: Tmenuitem; PantallaNumero: integer;
GbParametros: TPanel; BotonHerramientas: Tspeedbutton);
procedure MostrarMenus;
procedure MostrarPanel(gb: TPanel);
procedure MostrarServidoresAulas();
procedure ObtenerInicioFin(ord_num:integer;var inicio:integer; var fin:integer);
procedure OcultarMenus;
procedure OrdenataClick(sender: TObject);
procedure OrdenataDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure OrdenataDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure OrdenataMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure OrdenataMouseEnter(Sender: TObject);
procedure OrdenEjecutarTodos(numero_pantalla: integer);
procedure OrdenRestablecerTodos(numero_pantalla: integer);
function NombreUsuarioOrdenador(numord:integer):string;
procedure pintarlogos(numero_pantalla: integer);
procedure PintarMonPant0(numEquipo:integer);
procedure PintarMonPantOtros(numEquipo: integer);
function PrioridadMensaje: string;
procedure pulsarMonitores(numero_pant: integer);
procedure recolocaComponetesMovido(numOrd: integer);
function TodosApagados(): boolean;
function ValidarContenido(PantallaActual: integer): boolean;
{ private declarations }
public
Procedure RefrescarEquipoAulaNuevo(numero:integer);
procedure RefrescarDatosCentro(datoscentro:array of ansistring);
procedure anadirResultadoConsulta(idactividad, ip, host, salidaconsola: string;numEquipo:integer);
procedure cargaGruposEquipos();
end;

var
frmMain: TfrmMain;

implementation

{ TfrmMain }
uses gruposservidores,mapa,contraservidores,clequiposervidoraula,configuraraplicacion,evaluar,acerca,aulas,clequipoadministrador,clestadocentro;
const
FILTRO_TXT:string='Archivos de texto (*.txt)|*.txt|Todos los archivos (*.*)|*.*';
ORD_EJECUTAR_EN_ADMINISTRADOR:string='%s & 2>> /dev/null';
W_ORDENADOR:integer=66;H_ORDENADOR:integer=61;
L_GROUPBOX:integer=7;T_GROUPBOX:integer=147;W_GROUPBOX:integer=435;H_GROUPBOX:integer=439;
TIEMPO_REVISION_CENTRO:integer=60;
TIEMPO_PROCESOS:integer=24;
var
f_equipoEjecutandoProceso:integer;
f_NumeroPantallas:integer=14;
f_PantallaActiva:integer=0;
fcontadorbarra:array [0..69] of integer;
PuntoO:TPoint;
numOrdO,numOrdD:integer;
f_contador_centro:integer=0;
f_contador_ping:integer=0;
f_contador_procesos:integer=36;
f_contador_procesos_ver:integer=180;
f_tipo_envio:integer=-1;
f_ordentodos:integer=-1;
posicionSelecFinal: integer=0;
f_equipoAulaBotonDerecho:integer=0;

Procedure TfrmMain.destruirComponentes();
var
i:integer;
begin
for i:=0 to g_num_ord_pantalla-1 do
begin
if Ordenata[i]<>nil then FreeAndNil(Ordenata[i]);
if pgOrdenata[i]<>nil then FreeAndNil(pgOrdenata[i]);
if lblOrdenata[i]<>nil then FreeAndNil(lblOrdenata[i]);
if lblmesa[i]<>nil then FreeAndNil(lblmesa[i]);
if btnProceso[i]<>nil then FreeAndNil(btnProceso[i]);
end;
end;
procedure TfrmMain.CargarConfiguracionGrupo(grupo:integer);
var
i:integer;
dominio,curso,mhost,mip,mmac:string;
mestado:boolean;
servidores:integer;
begin
try
servidores:= g_GruposEquipos[grupo].NumeroEquipos;
if servidores<1 then
begin
mensaje('Este grupo no contiene ningún equipo. Si lo deseas, puedes añadírselos desde el menú Grupos -> Configurar',Aceptar);
exit;
end;
destruirComponentes();
g_num_servidores_aula:=g_GruposEquipos[grupo].NumeroEquipos;
lblGrupo.Caption:='Grupo: '+g_GruposEquipos[grupo].Nombre;
lblGrupo.Visible:=true;
g_num_ord_pantalla:=NumeroOrdenadorePantalla(g_TipoAula,g_num_servidores_aula);
setlength(equipoServidorAula,g_num_servidores_aula);
SetLength(g_EstadoAulasCentro,g_num_servidores_aula);
SetLength(g_equiposAulas,g_num_servidores_aula);
for i:=0 to g_num_ord_pantalla-1 do
begin
if i < g_num_servidores_aula then
begin
mestado :=true;
mhost:=g_GruposEquipos[grupo].Host[i];
mip:=g_GruposEquipos[grupo].IP[i];
mmac:=g_GruposEquipos[grupo].MAC[i];
curso:=g_GruposEquipos[grupo].curso[i];
dominio:=g_GruposEquipos[grupo].Dominio[i];
equipoServidorAula[i]:=TEquipo.create(i,mhost,mip,mmac,mestado,curso,dominio);
end
end;
IniciarVariables();
CrearColocarComponentes();
mnuEncenderClick(mnuEncender);
//iniciaRevisionAula();
iniciaRevisionCentro();
except
begin
Mensaje(MEN_ERROR_AULA,aceptar);
application.Terminate
end
end;
end;
procedure TfrmMain.mnuGrupoclick(sender: Tobject);
var
grupo:integer;
begin
try
grupo:=(sender as TMenuItem).tag;
CargarConfiguracionGrupo(grupo);
except
//mensaje(MEN_ERROR_GRUPOS, aceptar);
end
end;
procedure TfrmMain.cargaGruposEquipos();
var
icogrupo,i:integer;
begin
try
mnuGrupos1.Clear;
setlength(mnuGrupo,g_NumGrupos);
for i:=0 to g_NumGrupos -1 do
begin
icogrupo:=i mod 3;
icogrupo:=icogrupo+47;
mnuGrupo[i]:=Tmenuitem.create(self);
with mnuGrupo[i] do
begin
Caption:=g_GruposEquipos[i].Nombre;
Hint:=g_GruposEquipos[i].nombre;
ImageIndex:=icogrupo;
OnClick:=@mnuGrupoclick;
tag:=i;
end;
mnuGrupos1.Add(mnuGrupo[i]);
end;
except
mensaje('Error al cargar grupos', aceptar);
end;
end;
constructor THallarResultadoProcesoSync.Create(codigo,ip, host, respuesta: string;numEquipo:integer);
begin
inherited Create;
try
fnumEquipo:=numEquipo;
fip:= ip;
fcodigo:=codigo;
fhost:=host;
frespuesta:=respuesta;
except
frespuesta:='La respuesta no ha sido recogida'
end;
end;

procedure THallarResultadoProcesoSync.DoSynchronize;
begin
frmMain.anadirResultadoConsulta(fcodigo,fip,fhost,frespuesta,fnumEquipo);

end;

class procedure THallarResultadoProcesoSync.add(codigo,ip,host,respuesta: string;numEquipo:integer);
begin
with Create(codigo,ip,host,respuesta,numEquipo) do
try
Synchronize;
finally
Free;
end;
end;
Function TfrmMain.CompruebaProcesosActivos():Boolean;
var
respuesta:Boolean;
begin
respuesta:=true;
if equipoAdministrador.RealizandoProcesos then
begin
case g_tipo_comando of
-1: if trim(edComando.Text)<> HTTPDecode(equipoAdministrador.Procesos) then
if mensaje('Existe un proceso diferente que aún no ha devuelto sus resultados. Si ejecuta un nuevo proceso, el anterior se continuará ejecutando pero no obtendrá los resultados de su consola. ¿Deseas continuar?',SiNo)=2 then
respuesta:=false;
0: if trim(fnArchivoRoot.filename)<> HTTPDecode(equipoAdministrador.Procesos) then
if mensaje('Se está copiando un archivo en los servidores de aula y el proceso aún no ha devuelto sus resultados. Si ejecuta un nuevo proceso, el anterior se continuará ejecutando pero no obtendrá los resultados de su consola. ¿Deseas continuar?',SiNo)=2 then
respuesta:=false;
1: if trim(fnArchivoRoot.filename)<> HTTPDecode(equipoAdministrador.Procesos) then
if mensaje('Se está instalando un paquete debian en los servidores de aula y el proceso aún no ha devuelto sus resultados. Si ejecuta un nuevo proceso, el anterior se continuará ejecutando pero no obtendrá los resultados de su consola. ¿Deseas continuar?',SiNo)=2 then
respuesta:=false;
2: if trim(fnScript.FileName)<> HTTPDecode(equipoAdministrador.Procesos) then
if mensaje('Se está ejecuantando un script en los servidores de aula y el proceso aún no ha devuelto sus resultados. Si ejecuta un nuevo proceso, el anterior se continuará ejecutando pero no obtendrá los resultados de su consola. ¿Deseas continuar?',SiNo)=2 then
respuesta:=false;
3: if trim(deCarpetasRoot.Directory)<> HTTPDecode(equipoAdministrador.Procesos) then
if mensaje('Se está copiando una carpeta en los servidores de aula y el proceso aún no ha devuelto sus resultados. Si ejecuta un nuevo proceso, el anterior se continuará ejecutando pero no obtendrá los resultados de su consola. ¿Deseas continuar?',SiNo)=2 then
respuesta:=false;
end;
end;
result:=respuesta;
end;
Function TfrmMain.ValidarProcesoAsi():Boolean;
var
comand,procesoAnterior:String;
i:integer;
respuesta:Boolean;
begin
respuesta:=true;
case f_tipo_envio of
-1:
begin
comand:=trim(edComando.Text);
if trim(edComando.Text)='' then
begin
mensaje('Escribe el proceso que deseas ejecutar',Aceptar);
result:=false;
exit;
end
else if (pos('apt-get',comand) >0) and (pos('install',comand) >0) then
begin
if (pos('-fy',comand) =0) and (pos('-yf',comand) =0) and (pos('-y',comand) =0) then
begin
mensaje('Para instalar un paquete remotamente debes usar apt-get -fy install nombre_paquete', aceptar);
result:=false;
exit;
end
end;
end;
2:
begin
if (not fileexists(fnScript.FileName)) and (Length(meScript.text)<3) then
begin
mensaje('Selecciona el script que deseas ejecutar o escribe su contenido en el cuadro "Script"',aceptar);
result:=false;
exit;
end;
end;
end;
case f_tipo_envio of
-1:
begin
if mensaje('¿Desea ejecutar el proceso ' + edComando.Text +'?' ,SiNo)=2 then
begin
result:=false;
exit;
end;
end;
2:
begin
if mensaje('¿Desea ejecutar el script ' + fnScript.FileName +' en los equipos elegidos?' ,SiNo)=2 then
begin
result:=false;
exit;
end;
end;
end;

respuesta:=CompruebaProcesosActivos();
if respuesta then
begin
Randomize;
equipoAdministrador.RealizandoProcesos:=false;
tmrRecogidaProcesos.Enabled:=false;
tmrRecogidaProcesos1.Enabled:=false;
f_contador_procesos_ver:=TIEMPO_PROCESOS*5;
f_contador_procesos:=TIEMPO_PROCESOS;
g_tipo_comando:=f_tipo_envio;
procesoAnterior:=equipoAdministrador.Procesos;
case g_tipo_comando of
-1:
begin

if equipoAdministrador.Procesos<> Trim(HTTPEncode(edComando.Text)) then
begin
equipoAdministrador.Procesos:=Trim(HTTPEncode(edComando.Text));
equipoAdministrador.IdProcesos:='P-'+IntToStr(Random(100000000));
//writeln ('Creando un nuevo proceso');
end;
end;
2:
begin
// writeln('equipoAdministrador.Procesos '+ equipoAdministrador.Procesos + ' Trim(HTTPEncode(fnScript.FileName)) '+ Trim(HTTPEncode(fnScript.FileName)));
if ((equipoAdministrador.Procesos ='') or (equipoAdministrador.Procesos<>Trim(HTTPEncode(fnScript.FileName)))) then
begin
equipoAdministrador.IdProcesos:='S-'+IntToStr(Random(100000000));
if Trim(fnScript.FileName)='' then
begin
fnScript.FileName:='/tmp/'+equipoAdministrador.IdProcesos+'.sh';
end;
equipoAdministrador.Procesos:=Trim(HTTPEncode(fnScript.FileName));
//writeln(meScript.Lines.);
g_archivo_nombre_root:=ExtractFilename(fnScript.filename);
end;
try
//writeln ('Archivo de script: '+ fnScript.FileName);
meScript.Lines.SaveToFile(fnScript.FileName);

except
mensaje('No existe el script indicado. Comprueba su ruta', aceptar);
result:=false;
exit;
end;
end;
end;

if equipoAdministrador.Procesos<> procesoAnterior then
begin
//writeln(procesoanterior, ' ', equipoAdministrador.Procesos);
if f_PantallaActiva=6 then EquipoAulaComandoNo(-1);
for i:=0 to High(equipoServidorAula) do
begin
btnProceso[i].Enabled:=false;
btnProceso[i].Font.Color:=clBlack;
end;

end;
if f_ordentodos = -1 then
begin
for i:=0 to High(equipoServidorAula) do
begin
if equipoServidorAula[i].EstadoActivadEquipo in [eEncendido,eEncendiendo,eUsuario,eApagando] then
begin
equipoServidorAula[i].ProcesoHace:=true;
equipoServidorAula[i].ProcesoTerminado:=false;
equipoServidorAula[i].ProcesoId:=equipoAdministrador.IdProcesos;
end
else
begin
equipoServidorAula[i].ProcesoHace:=false;
equipoServidorAula[i].ProcesoTerminado:=true;
equipoServidorAula[i].ProcesoId:='S';
end
end;
end
else
begin
equipoServidorAula[f_ordentodos].ProcesoHace:=true;
equipoServidorAula[f_ordentodos].ProcesoTerminado:=false;
equipoServidorAula[f_ordentodos].ProcesoId:=equipoAdministrador.IdProcesos;
end;
equipoAdministrador.RealizandoProcesos:=true;
tmrRecogidaProcesos.Enabled:=true;
tmrRecogidaProcesos1.Enabled:=true;
lblTiempoProceso.Caption:='';
lblTiempoProceso.Visible:=true;
lblTiempoProceso.BringToFront;
Application.ProcessMessages;
g_pantalla_proceso:=6;
//writeln('validar proceso asi ',equipoAdministrador.Procesos,' ',equipoAdministrador.IdProcesos);
end;
result:=respuesta;
end;
procedure TfrmMain.anadirResultadoConsulta(idactividad,ip,host, salidaconsola:string;numEquipo:integer);
begin

if (Trim(idactividad)='') or (Trim(ip)='') or (Trim(host)='') or (numEquipo > High(equipoServidorAula)) then exit;
if idactividad=equipoAdministrador.IdProcesos then
begin
if (equipoServidorAula[numEquipo].IP=ip) and (equipoServidorAula[numEquipo].mihost=host) then
begin
if equipoServidorAula[numEquipo].ProcesoHace then
if not equipoServidorAula[numEquipo].ProcesoTerminado then
begin
equipoServidorAula[numEquipo].ProcesoTerminado:=true;
equipoServidorAula[numEquipo].ProcesoResultado:=salidaconsola;
btnProceso[numEquipo].enabled:=true;
btnProceso[numEquipo].font.Color:=clGreen;
g_proceso_realizado:=true;
if (f_equipoEjecutandoProceso <> -1) and (f_equipoEjecutandoProceso < g_num_servidores_aula)then
muestraResultadosConsulta();
end;
end;
end;
end;

procedure TfrmMain.IniciarTCPCMD();
const
LIBERAR_PUERTO:string='fuser -k -n tcp 38002';
PUERTO_PROCESOS:integer=38002;
begin
try
IniciarDemonio1();
except
Ejecutar(LIBERAR_PUERTO);
Sleep(100);
try
IniciarDemonio1()
except
////writeln('Error inicia servidor');
end;
end;
end;
procedure TfrmMain.IniciarDemonio1();
const
PUERTO_PROCESOS:integer=38002;
var
aCommand:TIdCommandHandler;
begin
try
IdCmdTCPServer1:=TIdCmdTCPServer.Create(nil);
with IdCmdTCPServer1 do
begin
Bindings.Clear;
Bindings.Add;
Bindings.items[0].IP:='0.0.0.0';
Bindings.Items[0].Port:=PUERTO_PROCESOS;
DefaultPort:=PUERTO_PROCESOS;
MaxConnections:=0;
ListenQueue:=15;
TerminateWaitTime:=5000;

aCommand:=CommandHandlers.Add;
aCommand.Command := 'resultadoProceso';
aCommand.OnCommand :=@resultadoProcesoCommand;
aCommand.Disconnect:=true;
aCommand.CmdDelimiter:=#32;
aCommand.ParamDelimiter:=#32;
aCommand.NormalReply.Code:='201';
aCommand.Enabled:=true;

OnListenException:=@IdCmdTCPServer1ListenException;
if active then active:=false;
active:=true;

end;

except
writeln('Error al iniciar servidor');
end;
end;
procedure TfrmMain.RefrescarDatosCentro(datoscentro:array of ansistring);
var
i,j:integer;
begin
try
try
for i:=0 to g_num_servidores_aula -1 do
begin

for j:=0 to 35 do
begin
g_equiposAulas[i][j].curso:=g_equiposAulas[i][0].curso;
g_equiposAulas[i][j].miHost:='';
g_equiposAulas[i][j].IP:='';
g_equiposAulas[i][j].estadoActividad:=eAveriado;
if j=0 then
begin
g_equiposAulas[i][j].curso:=equipoServidorAula[i].curso;
g_equiposAulas[i][j].miHost:=equipoServidorAula[i].mihost;
g_equiposAulas[i][j].IP:=equipoServidorAula[i].ip;
g_equiposAulas[i][j].estadoActividad:=eApagado;
end;

g_equiposAulas[i][j].usuarioActivo:='';
end;
end;
// Application.ProcessMessages;
////writeln(g_num_servidores_aula,Length(g_EstadoAulasCentro),Length(datoscentro));
for i:=0 to g_num_servidores_aula -1 do
begin
g_EstadoAulasCentro[i]:=datoscentro[i];
if (trim (datoscentro[i])<>'') then
begin
cargasEquiposAula(i,g_EstadoAulasCentro[i]);
//writeln ('g_EstadoAulasCentro[i]',g_EstadoAulasCentro[i]);
end;
if (equipoServidorAula[i].UsuarioActivo <>g_equiposAulas[i][0].usuarioActivo) or (equipoServidorAula[i].EstadoActivadEquipo <>g_equiposAulas[i][0].estadoActividad) then
begin
equipoServidorAula[i].EstadoActivadEquipo:=g_equiposAulas[i][0].estadoActividad;
equipoServidorAula[i].UsuarioActivo:=g_equiposAulas[i][0].usuarioActivo;
RefrescarEquipoAulaNuevo (i);
Application.ProcessMessages;
end;
end;

except
//writeln('error al cargar datos')
end;
finally
f_contador_centro:=0;
g_revisionCentro_actualizada:=true;
tmrPingEstadoCentro.Enabled:=true;
if lblRevInicio.Visible then
begin
lblRevInicio.visible:=false;
enabled:=true;
Cursor:=crDefault;
Image1.Cursor:=crDefault;
pnEnc.Cursor:=crDefault;
end;
end;
end;

procedure TfrmMain.cargasEquiposAula(aula: integer; equipos: ansiString);
var
sl,seips:TStringList;
d,i:integer;
estado:String;
begin
enabled:=true;
try
try
if trim(equipos)='' then exit;
sl:=TStringList.create;
seips:=TStringList.create;
sl.text:=equipos;
//writeln(equipos);
d:=0;
for i:=0 to sl.Count -1 do
begin
if (aula < g_num_servidores_aula) and (d < Length(g_equiposAulas[aula])) then;
//writeln('--------->'+sl[i]);
seips.Delimiter:='&';
seips.DelimitedText:=sl[i];
seips.Delimiter:='&';
g_equiposAulas[aula][d].miHost:=seips[0];
g_equiposAulas[aula][d].Ip:=seips[1];
g_equiposAulas[aula][d].mac:=seips[2];
g_equiposAulas[aula][d].usuarioActivo:=seips[3];
estado:=seips[4];
g_equiposAulas[aula][d].estadoActividad:=eApagado;
if estado='1' then
begin
g_equiposAulas[aula][d].estadoActividad:=eEncendido;
if trim (g_equiposAulas[aula][d].usuarioActivo) <> '' then
g_equiposAulas[aula][d].estadoActividad:=eUsuario;
end;
inc(d);
end
except
//
end;
finally
sl.Free;
seips.free;
end
end;

procedure TfrmMain.iniciaRevisionCentro();
var
i:integer;
ipsServidores:array of String;

begin
tmrPingEstadoCentro.Enabled:=false;
SetLength(ipsServidores,Length(equipoServidorAula));
//writeln('Length(equipoServidorAula) ',Length(equipoServidorAula));
//writeln('---------------Iniciando revisión del cetro');
try
for i:=0 to High(equipoServidorAula) do
ipsServidores[i]:=Trim(equipoServidorAula[i].IP);
f_contador_centro:=0;
with ThrEstadoCentro.create(ipsServidores) do Resume;
except
tmrPingEstadoCentro.Enabled:=true;
//writeln('Error al revisar el centro');
end;
end;

procedure TfrmMain.tmrPingEstadoCentroTimer(Sender: TObject);
begin

g_contador_refresco_centro:=TIEMPO_REVISION_CENTRO-f_contador_centro;
inc(f_contador_centro);
//writeln(inttostr(f_contador_centro));
if f_contador_centro>=TIEMPO_REVISION_CENTRO then
begin

tmrPingEstadoCentro.Enabled:=false;
g_contador_refresco_centro:=1;
f_contador_centro:=0;
iniciaRevisionCentro();
g_contador_refresco_centro:=TIEMPO_REVISION_CENTRO;
//writeln('Iniciando la revisión del centro');

end;
end;

procedure TfrmMain.tmrRecogidaProcesos1Timer(Sender: TObject);
var
texto:String;
begin
if f_contador_procesos_ver>0 then f_contador_procesos_ver:=f_contador_procesos_ver-1;
case g_tipo_comando of
-1:texto:='Comando: ';
0:texto:='Archivo: ';
1:texto:='Paquete: ';
2:texto:='Script: ';
3:texto:='Carpeta: ';
end;
lblTiempoProceso.Caption:=texto+tiempo(f_contador_procesos_ver);
lblTiempoProceso1.Caption:='Esperando respuestas. '+tiempo(f_contador_procesos_ver);

end;

procedure TfrmMain.tmrRecogidaProcesosTimer(Sender: TObject);
var
i:integer;
todasrrecogidas:Boolean;
mfin:String;
begin
if not equipoAdministrador.RealizandoProcesos then exit;
todasrrecogidas:=true;
f_contador_procesos:=f_contador_procesos-1;
for i:=0 to high(equipoServidorAula) do
begin
if equipoServidorAula[i].ProcesoHace then
if equipoServidorAula[i].ProcesoTerminado=false then
todasrrecogidas:=false;

end;
if f_contador_procesos<=0 then
begin
tmrRecogidaProcesos1.Enabled:=false;
tmrRecogidaProcesos.Enabled:=false;
mfin:='Han pasado ' +inttostr((TIEMPO_PROCESOS *5) div 60) + ' minutos desde que ejecuto el ultimo proceso y aún quedan equipos por devolver la salida de consola de dicho proceso.';
mfin:=mfin+' ¿Deseas esperar otros ' +inttostr((TIEMPO_PROCESOS *5) div 60) +' a que dichos equipos lo hagan antes de ver los resultados del mismo?';
lblTiempoProceso.Caption:='Tiempo completado';
lblTiempoProceso.Caption:='Consulta finalizada';
Application.ProcessMessages;
if Mensaje(mfin,SiNo) = 1 then
begin
f_contador_procesos:=TIEMPO_PROCESOS;
f_contador_procesos_ver:=TIEMPO_PROCESOS*5;
tmrRecogidaProcesos1.Enabled:=true;
tmrRecogidaProcesos.Enabled:=true;
end;

end;
if (f_contador_procesos<=0) or todasrrecogidas then
begin

todasrrecogidas:=false;
muestraResultadosConsulta();
end;
end;
procedure TfrmMain.muestraResultadosConsulta();
var
i:integer;
begin
tmrRecogidaProcesos1.Enabled:=false;
tmrRecogidaProcesos.enabled:=false;
equipoAdministrador.RealizandoProcesos:=false;
f_contador_procesos:=TIEMPO_PROCESOS;
f_contador_procesos_ver:=TIEMPO_PROCESOS*5;
for i:=0 to High(equipoServidorAula) do
begin
btnProceso[i].Enabled:=false;
btnProceso[i].Font.Color:=clBlack;

if ((equipoServidorAula[i].ProcesoHace) and (equipoServidorAula[i].ProcesoId = equipoAdministrador.IdProcesos)) then
begin
btnProceso[i].Enabled:=true;
if equipoServidorAula[i].ProcesoTerminado then
begin
btnProceso[i].Font.Color:=clGreen;
end
else
begin
btnProceso[i].Font.Color:=clred;
end;
end;

end;
lblTiempoProceso1.Caption:='';
meProceso1.Clear;
if f_equipoEjecutandoProceso = -1 then
begin
btnTodosClick(btnTodos)
end
else if f_equipoEjecutandoProceso< g_num_servidores_aula then
begin
if btnProceso[f_equipoEjecutandoProceso].Enabled then
btnProcesoClick( btnProceso[f_equipoEjecutandoProceso])
end
else
btnTodosClick(btnTodos);
application.ProcessMessages;
pnTodos.Left:=0;
pnTodos.visible:=true;
pnTodos.BringToFront;
lblTiempoProceso.visible:=false;

end;
procedure TfrmMain.FormShow(Sender: TObject);
begin
////writeln('Revisando Estado del centro al mostrar el formulario');
//iniciaRevisionAula();
if pnPresenta.visible then edPassword.SetFocus;
//iniciaRevisionCentro();

end;



procedure TfrmMain.tmrBarrasETimer(Sender: TObject);
var
i:integer;
begin
for i:=0 to g_num_servidores_aula-1 do
begin
if equipoServidorAula[i].EstadoActivadEquipo=eEncendiendo then
begin;
fcontadorbarra[i]+=6;
if fcontadorbarra[i]>60 then fcontadorbarra[i]:=0;
if pgOrdenata[i].visible=true then
pgOrdenata[i].Progress:=fcontadorbarra[i]
end;
end;
end;

function TfrmMain.NombreUsuarioOrdenador(numord:integer):string;
var
nombre:String;
begin

nombre:=equipoServidorAula[numord].mihost;
if g_verNombreCursos then
if trim (equipoServidorAula[numord].Curso)<>'' then
nombre:=equipoServidorAula[numord].Curso;
Result:=nombre;
end;

Procedure TfrmMain.RefrescarEquipoAulaNuevo(numero:integer);
var
estadoActividad:TEstadoActividadEquipo;
i: integer;
begin
estadoActividad:= equipoServidorAula[numero].EstadoActivadEquipo;
lblOrdenata[numero].caption:= NombreUsuarioOrdenador(numero) ;
Case EstadoActividad of
eAveriado,eApagado,eApagando:
begin
for i:= 0 to f_NumeroPantallas -1 do
begin
equipoServidorAula[numero].fIconoMonitor[i]:=0;
equipoServidorAula[numero].fMonitorPulsado[i]:=false;
end;
end;
eEncendido,eUsuario:
begin
equipoServidorAula[numero].fmonitorPulsado[0]:=true;
equipoServidorAula[numero].fIconoMonitor[0]:=1;
end;
eEncendiendo:
for i:= 1 to f_NumeroPantallas -1 do
begin
equipoServidorAula[numero].fIconoMonitor[i]:=0;
equipoServidorAula[numero].fMonitorPulsado[i]:=false;
end;
end;
Case f_PantallaActiva of
0:PintarMonPant0(numero);
else
PintarMonPantOtros(numero);
end;
if not g_cambiando_menu then ordenata[numero].refresh;
end;

procedure TfrmMain.PintarMonPantOtros(numEquipo:integer);
var
icono:integer;
begin
icono:=equipoServidorAula[numEquipo].IconoEquipo(f_PantallaActiva);
pgOrdenata[numEquipo].visible:=false;
if lblOrdenata[numequipo].visible=false then exit;
with ordenata[numEquipo] do
begin
Picture.Bitmap.clear;
if (equipoServidorAula[numEquipo].EstadoActivadEquipo in [eUsuario])then
begin
cursor:=crHandPoint;
enabled:=true;
Case icono of
0: imlIcoIna.GetBitmap(f_PantallaActiva,Picture.Bitmap);
1: imlIcoAct1.GetBitmap(f_PantallaActiva,Picture.Bitmap);
end;
end
else if (f_PantallaActiva in [6,7]) and (equipoServidorAula[numEquipo].EstadoActivadEquipo=eEncendido) then
begin
cursor:=crHandPoint;
enabled:=true;
Case icono of
0: imlIcoIna.GetBitmap(f_PantallaActiva,Picture.Bitmap);
1: imlIcoAct1.GetBitmap(f_PantallaActiva,Picture.Bitmap);
end;
end
else
begin
Case icono of
2:imlIcoDis.GetBitmap(0,Picture.Bitmap);
0,1:imldisabled.GetBitmap(f_PantallaActiva,Picture.Bitmap);
end;
cursor:=crarrow;
enabled:=false;
end
end;
end;

procedure TfrmMain.PintarMonPant0(numEquipo:integer);
var
estado:TEstadoActividadEquipo;
begin
pgOrdenata[numEquipo].visible:=false;
estado:=equipoServidorAula[numequipo].EstadoActivadEquipo;
if lblOrdenata[numequipo].visible=false then exit;
with ordenata[numEquipo] do
begin
Picture.Bitmap.clear;
Case estado of
eApagado:
begin
imlEncender.GetBitmap(0,Picture.Bitmap);
cursor:=crHandPoint;
enabled:=true;
end;
eEncendiendo:
begin
imlEncender.GetBitmap(1,Picture.Bitmap);
cursor:=crHourGlass;
enabled:=false;
pgOrdenata[numEquipo].ForeColor:=clYellow;
pgOrdenata[numEquipo].MaxValue:=70;
pgOrdenata[numEquipo].Progress:=0;
pgOrdenata[numEquipo].visible:=true;
end;
eEncendido:
begin
imlEncender.GetBitmap(2,Picture.Bitmap);
cursor:=crHandPoint;
enabled:=true;
end;
eUsuario:
begin
imlEncender.GetBitmap(3,Picture.Bitmap);
cursor:=crHandPoint;
enabled:=true;
end;
eApagando:
begin
imlEncender.GetBitmap(4,Picture.Bitmap);
cursor:=crHourGlass;
enabled:=false;
pgOrdenata[numEquipo].ForeColor:=clRed;
pgOrdenata[numEquipo].MaxValue:=50;
pgOrdenata[numEquipo].Progress:=0;
pgOrdenata[numEquipo].visible:=true;
end;
eAveriado:
begin
imlEncender.GetBitmap(5,Picture.Bitmap);
cursor:=crDefault;
enabled:=false;
end;
end;
end;
end;


procedure TfrmMain.ProfeAulaMensaje(ord_num:integer);
begin
g_mensaje_prioridad:=PrioridadMensaje;
g_mensaje_asunto:=HTTPEncode(edasumen.text);
g_mensaje_texto:=HTTPEncode(metexmen.text);
EjecutarOrdenesFin(ord_num,true)
end;
procedure TfrmMain.EquipoAulaComando(ord_num:integer);
begin
if g_tipo_comando = 2 then g_archivo_path_root:=fnScript.filename;
EjecutarOrdenesFin(ord_num,true);

end;
procedure TfrmMain.EquipoAulaComandoNo(ord_num:integer);
begin
EjecutarOrdenesFin(ord_num,false)
end;
Function TfrmMain.PrioridadMensaje:string;
var
i,nprio:integer;
begin
nprio:=0;
for i:=0 to pnprioridad.ControlCount -1 do
if pnprioridad.controls[i] is Tradiobutton then
if (pnprioridad.controls[i] as Tradiobutton).Checked =true then
nprio:=(pnprioridad.controls[i] as Tradiobutton).tag;
result:=inttostr(nprio)
end;


procedure TfrmMain.ProfeAulaCarpetaNo(ord_num:integer);

begin
EjecutarOrdenesFin(ord_num,false);
end;

procedure TfrmMain.ProfeAulaCarpeta(ord_num:integer);
begin
g_carpeta_mensaje:=meCarpertas.text;
if trim(g_carpeta_mensaje)='' then g_carpeta_mensaje:='Has recibido una carpeta del administrador informático. La encontrarás en el directorio recibidos_administrador de tu directorio personal';
g_carpeta_mensaje:=HTTPEncode(g_carpeta_mensaje);
EjecutarOrdenesFin(ord_num,true)
end;

procedure TfrmMain.ProfeAulaMensajeNo(ord_num:integer);
begin
EjecutarOrdenesFin(ord_num,false);
end;

procedure TfrmMain.ProfeAulaArchivoNo(ord_num:integer);
begin
ProfeAulaMensajeNo(ord_num);
end;


procedure TfrmMain.ProfeAulaArchivo(ord_num:integer);
begin
g_archivo_path:=fnArchivo.filename;
g_archivo_mensaje:=meTexArc.Text;
if trim(g_archivo_mensaje)='' then g_archivo_mensaje:='Has recibido un archivo del administrador informático. La encontrarás en el directorio recibidos_administrador de tu directorio personal';
g_archivo_mensaje:=HTTPEncode(g_archivo_mensaje);
EjecutarOrdenesFin(ord_num,true)
end;
procedure TfrmMain.EquipoAulaArchivoRoot(ord_num:integer);
begin
g_archivo_path_root:=fnArchivoRoot.filename;
g_carpeta_destino_root:=HTTPEncode(edCarpetaDestino.Text);
EjecutarOrdenesFin(ord_num,true)
end;
procedure TfrmMain.EquipoAulaArchivoRootNo(ord_num:integer);
begin
EjecutarOrdenesFin(ord_num,false);
end;
procedure TfrmMain.EquipoAulaEncender(ord_num:integer);
begin
f_contador_ping:=0;
EjecutarOrdenesFin(ord_num,true)
end;

procedure TfrmMain.EquipoAulaEncenderNo(ord_num:integer);
begin
f_contador_ping:=0;
EjecutarOrdenesFin(ord_num,false);
end;

Procedure TfrmMain.ColocarPaneles();
var
j,i:integer;
cnt:Tcontrol;
begin
for i:=0 to controlcount-1 do
begin
if (controls[i] is TPanel) and ((controls[i] as Tpanel).Tag=20) then
begin
(controls[i] as TPanel).SetBounds(L_GROUPBOX,T_GROUPBOX,W_GROUPBOX,H_GROUPBOX);
(controls[i] as TPanel).color:=RGB(255,255,255);
for j:=0 to (controls[i] as TPanel).ControlCount-1 do
begin
cnt:=(controls[i] as TPanel).controls[j];
cnt.setbounds(cnt.Left,cnt.top,cnt.Width,cnt.Height);
end;
end;
end;
end;

procedure TfrmMain.OcultarMenus;
var
i:integer;
begin
for i:=0 to self.componentcount-1 do
if (components[i] is TmenuItem) then (components[i] as TmenuItem).visible:=false;
end;

procedure TfrmMain.MostrarMenus;
var
i:integer;
begin
for i:=0 to self.componentcount-1 do
if (components[i] is TmenuItem) then (components[i] as TmenuItem).visible:=true;

end;

procedure TfrmMain.FormCreate(Sender: TObject);
var
usuario:string;
begin

Application.Icon:=frmMain.Icon;
top:=13;left:=(screen.Width-width) div 2;
f_PantallaActiva:=0;
OcultarMenus();
ColocarPaneles();
pnPresenta.align:=alClient;
pnPresenta.bringtoFront;
imgPresentacion.align:=alClient;
Randomize();
pnfondo.align:=alclient;
usuario:=getenvironmentvariable('USER');
if usuario<>'root'then
begin
mensaje(MEN_SOLO_ROOT,aceptar);
application.Terminate;
exit;
end;
if not fileexists(DIR_SETUP_ADTOS) then
begin
mensaje('No existe '+ DIR_SETUP_ADTOS, aceptar);
Application.Terminate;
exit;
end;

application.processmessages;
application.Icon:=frmMain.Icon;
equipoAdministrador:=TEquipoAdministrador.create();
CargarConfiguracionCentro(g_archivo_configuracion_adtos);
IniciarPrograma();
tmrBarrasE.Enabled:=true;
if not directoryexists(equipoAdministrador.DirAdtos)
then mkdir(equipoAdministrador.DirAdtos);
IniciarTCPCMD();


end;

procedure TfrmMain.IdCmdTCPServer1ListenException(AThread: TIdListenerThread;
AException: Exception);
begin
//writeln('Exceso de hilos');
end;

procedure TfrmMain.imgPresentacionClick(Sender: TObject);
begin

end;

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
if mensaje(MEN_SALIR,sino) = 2 then
canclose:=false
else
begin
hide;
application.processmessages;
g_apagando:=true;
Application.ProcessMessages;
end;
end;

procedure TfrmMain.btnAndarClick(Sender: TObject);
begin
f_ordentodos:=-1;
if ValidarContenido(f_PantallaActiva)=false then exit;
//writeln(ValidarContenido(f_PantallaActiva), ' ',f_PantallaActiva);
OrdenEjecutarTodos(f_PantallaActiva);
end;

procedure TfrmMain.btnBuscarClick(Sender: TObject);
begin
posicionSelecFinal:=0;
dlBuscar.Execute;
end;

procedure TfrmMain.btnCerrarClick(Sender: TObject);
begin
pnTodos.visible:=false;
end;

procedure TfrmMain.btnEleMenClick(Sender: TObject);
begin
opendialog3.Filter:=FILTRO_TXT;
if opendialog3.execute then
meTexMen.lines.LoadFromFile(opendialog3.FileName);
end;

procedure TfrmMain.btnGuardarClick(Sender: TObject);
begin
if savedialog1.execute then
meProceso1.lines.savetofile(savedialog1.filename);
end;

procedure TfrmMain.Administrador1Click(Sender: TObject);
begin
TfrmConpro.Create(nil).showmodal;
end;

procedure TfrmMain.btnAceptarClick(Sender: TObject);
begin
if Trim(edPassword.Text)='' then
begin
Mensaje('Introduzca la contraseña de adtos',Aceptar);
exit;
end;
//if compruebaPasswordRoot(edPassword.Text) then
if edPassword.Text='adtos2014' then
EntrarPrograma()
else
begin
Mensaje('Introduzca la contraseña de adtos',Aceptar);
edPassword.text:='';
end;

end;

procedure TfrmMain.btnPararClick(Sender: TObject);
begin
if f_PantallaActiva =0 then
begin
if (Length(Trim(g_contraServidores)) <1) then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
if Mensaje('¿Deseas apagar todos los equipos?',sino)=2 then
exit
end;
OrdenRestablecerTodos(f_PantallaActiva);
end;

procedure TfrmMain.btnProcesoMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
g_botonProcesoMarcado:=(Sender as TSpeedButton).tag;
f_ordentodos:=g_botonProcesoMarcado;
f_equipoEjecutandoProceso:=g_botonProcesoMarcado;
//writeln(g_botonProcesoMarcado)
end;

procedure TfrmMain.btnReintentarTodosClick(Sender: TObject);
begin
if Mensaje('¿Deseas volver a enviar este proceso a los equipos que aún no han devuelto resultado?',sino)=2 then exit;
g_botonProcesoMarcado:=-1;
f_ordentodos:=g_botonProcesoMarcado;
f_equipoEjecutandoProceso:=-1;
RepetirProceso(g_botonProcesoMarcado);

end;

procedure TfrmMain.btnTodosClick(Sender: TObject);
var
textoTodos:TStringList;
i:integer;
datos:String;
comandoE:String;
textoNoConsulta:String;

begin
textoTodos:=TStringList.Create;
case g_tipo_comando of
-1:
begin
comandoE:='Ejecutar proceso: '+ HTTPDecode(equipoAdministrador.Procesos );
textoNoConsulta:='Este equipo no ha realizado la consulta';
end;
0:
begin
comandoE:='Enviar archivo: '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos ));
textoNoConsulta:='En este equipo no se ha copiado el archivo por estar apagado o averiado';
end;
1:
begin
comandoE:='Instalar Paquete debian: '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos ));
textoNoConsulta:='En este equipo no se ha instalado el paquete debian por estar apagado o averiado';
end;
2:
begin
comandoE:='Ejecutar script: '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos ));
textoNoConsulta:='En este equipo no se ha ejecutado el script por estar apagado o averiado'
end;
3:
begin
comandoE:='Enviar carpeta: '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos ));
textoNoConsulta:='Este equipo no se ha copiado la carpeta seleccionada por estar apagado o averiado'
end;
end;

textoTodos.Add('#################################################################');
textoTodos.Add(comandoE);
textoTodos.Add('Fecha: ' +DateToStr(Date())+' '+ TimeToStr(Time()) );
textoTodos.Add('#################################################################');
textoTodos.Add(' ');
lblAccionEjecutada.Caption:='Acción realizada-> '+ comandoE;
lblHost.Caption:='Todos los equipos';
lblIP.Caption:='';
lblMAC.Caption:='';
for i:=0 to g_num_servidores_aula -1 do
begin
if Trim(equipoServidorAula[i].mihost)<>'' then
begin
textoTodos.Add(' ');
datos:= 'Equipo: '+equipoServidorAula[i].mihost+'; IP: '+equipoServidorAula[i].ip+'; MAC: '+equipoServidorAula[i].mac+'; Grupo: '+ equipoServidorAula[i].dominio+'; Aula: '+ equipoServidorAula[i].CURSO;
textoTodos.Add(datos);
textoTodos.Add('======================================================================');
if equipoServidorAula[i].ProcesoHace then
textoTodos.Add(equipoServidorAula[i].ProcesoResultado)
else
textoTodos.Add(textoNoConsulta);
textoTodos.Add(' ');
textoTodos.Add('#################################################################');
textoTodos.Add(' ');
end
end;
meProceso1.Text:=textoTodos.Text;
//meProceso1.SetFocus;
textoTodos.Free;
end;

procedure TfrmMain.Calculadora1Click(Sender: TObject);
const
P_CALCU:string='gnome-calculator';
begin
ordenesaula(ORD_EJECUTAR_EN_ADMINISTRADOR,[P_CALCU]);
end;

function TfrmMain.ConvierteValorCombo(texto:String):integer;
var
valor:integer;
begin
valor:=SLEEP_MEDIO;
try
try
valor:= round(StrToFloat(texto) * 1000);
except
valor:=SLEEP_ALTO;
//writeln('Error al convertir el texto');
end;
finally
Result:=valor;
end;
end;
function TfrmMain.PausaEquipo(tipo:integer;estado:Boolean; actividad:TEstadoActividadEquipo): integer;
var
valor:integer;
begin
try
valor:=SLEEP_MINIMO;
if (tipo<>-1) or (actividad in [eApagado,eAveriado,eEncendiendo,eApagando]) then
begin
result:=SLEEP_MINIMO * g_factor_velocidad;
exit;
end;
case f_PantallaActiva of
0:
begin
if not estado then valor:=SLEEP_BAJO * g_factor_velocidad;
end;
3:
begin
if actividad = eUsuario then
begin
if estado then
valor:=SLEEP_ALTO * g_factor_velocidad
else
valor:=SLEEP_MEDIO * g_factor_velocidad;
end;
end;
4,5:
begin
if actividad = eUsuario then
begin
if estado then valor:=SLEEP_MAXIMO * g_factor_velocidad;
end;
end;
6:
begin
if estado then valor:=ConvierteValorCombo(cboIntervaloP6.text);
end;
7:
begin
if estado then valor:=ConvierteValorCombo(cboIntervaloP7.text);
end;
end;
finally
//writeln ('Valor intervalo, ', valor );
result:=valor ;
end;
end;
procedure TfrmMain.cboIntervaloP6KeyPress(Sender: TObject; var Key: char);
begin
key:=#0;
end;

procedure TfrmMain.deCarpetasChange(Sender: TObject);
begin
Application.ProcessMessages;
if directoryexists(deCarpetas.directory) then
g_carpeta_enviar_path:=deCarpetas.directory;
end;

procedure TfrmMain.deCarpetasRootChange(Sender: TObject);
begin
Application.ProcessMessages;
if (fileexists(deCarpetasRoot.directory)) and (Length (Trim(deCarpetasRoot.directory))>0) then
begin
g_carpeta_enviar_path_root:=deCarpetasRoot.directory;
end

end;

procedure TfrmMain.deCarpetasRootKeyPress(Sender: TObject; var Key: char);
begin
key:=#0;
end;

procedure TfrmMain.dlBuscarFind(Sender: TObject);
var
textoTemp : string;
poscionTextoBuscado : integer;
begin
with TFindDialog(Sender) do
begin
if posicionSelecFinal = 0 then
Options := Options - [frFindNext];

if frfindNext in Options then
begin
poscionTextoBuscado := posicionSelecFinal + Length(Findtext);
textoTemp := Copy(meProceso1.Lines.Text, poscionTextoBuscado, MaxInt);
end
else
begin
textoTemp := meProceso1.Lines.Text;
poscionTextoBuscado := 1;
end;
posicionSelecFinal := Pos(FindText, textoTemp);
if posicionSelecFinal > 0 then
begin
posicionSelecFinal := posicionSelecFinal + poscionTextoBuscado - 1;
meProceso1.SelStart := posicionSelecFinal - 1;
meProceso1.SelLength := Length(FindText);
meProceso1.SetFocus;
end
else
begin
if frfindNext in Options then
textoTemp := Concat('No hay más coincidencias de "', FindText, '" en el texto.')
else
textoTemp := Concat('No se ha encontrado "', FindText, '" en el texto.');
Mensaje(textoTemp,Aceptar);
end;
end;
end;

procedure TfrmMain.edPasswordKeyPress(Sender: TObject; var Key: char);
begin
if Key=#13 then btnAceptarClick(btnAceptar);
end;

procedure TfrmMain.fnArchivoRootChange(Sender: TObject);
begin
if (fileexists(fnArchivoRoot.filename)) and (Length(Trim(fnArchivoRoot.FileName))>0) then
begin
g_archivo_nombre_root:=ExtractFilename(fnArchivoRoot.filename);
case f_tipo_envio of
1:
begin
if RightStr(g_archivo_nombre_root,4)<>'.deb' then
begin
mensaje('El archivo elegido no es un paquete debian',aceptar);
g_archivo_nombre_root:='';
fnArchivoRoot.filename:=''
end;
end;

end;
end
end;

procedure TfrmMain.fnArchivoRootKeyPress(Sender: TObject; var Key: char);
begin
key:=#0;
end;

procedure TfrmMain.fnScriptChange(Sender: TObject);
begin
if (fileexists(fnScript.filename)) and (Length(Trim(fnScript.FileName))>0) then
begin
if RightStr(fnScript.FileName,3)<>'.sh' then
begin
fnScript.filename:='';
mensaje('El script elegido tiene que tener extesión .sh',aceptar);
g_archivo_nombre_root:='';
meScript.text:='';
end
else
begin
try
meScript.Lines.LoadFromFile(fnScript.filename);
g_archivo_nombre_root:=ExtractFilename(fnScript.filename);
except
g_archivo_nombre_root:='';
fnScript.filename:='';
mensaje('El script tiene un formato no válido',aceptar);
meScript.text:='';
//
end
end;
end;
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
Ejecutar('killall adtos &');
end;

procedure TfrmMain.fnArchivoChange(Sender: TObject);
begin
if fileexists(fnArchivo.filename) then
g_archivo_nombre:=ExtractFilename(fnArchivo.filename);
end;

Procedure TfrmMain.DesmarcarMenus();
var
i:integer;
begin
for i:=0 to ComponentCount-1 do
if (Components[i] is Tmenuitem) then (Components[i] as Tmenuitem).checked:=false;
end;

procedure TfrmMain.MenusClick(MenuPulsado:Tmenuitem;PantallaNumero:integer;GbParametros:TPanel;BotonHerramientas:Tspeedbutton);
begin
if TodosApagados then exit;
MostrarPanel(GbParametros);
DesmarcarMenus;
MenuPulsado.Checked:=true;
BotonHerramientas.Down:=true;
ComprobarEstadoOrdenadores(PantallaNumero);
Application.ProcessMessages;
//writeln(' Por funcion MenusClick, sigo bien');
end;

Procedure TfrmMain.ComprobarEstadoOrdenadores(numero_pantalla:integer);
var
j:integer;
begin

lblinfo.Caption:=NOMBRE_PANTALLA[numero_pantalla];
btnAndar.Caption:=CAPTION_BOTONES_ACTIVOS[numero_pantalla];
btnparar.Caption:=CAPTION_BOTONES_INACTIVOS[numero_pantalla];
btnparar.Enabled:=true;
btnandar.Enabled:=true;
pintarlogos(numero_pantalla);
Application.ProcessMessages;
g_cambiando_menu:=True;
for j:=0 to g_num_servidores_aula-1 do
begin
RefrescarEquipoAulaNuevo(j);
end;
g_cambiando_menu:=false;
Application.ProcessMessages;
end;

procedure TfrmMain.MostrarPanel(gb:TPanel);
var
i:integer;
begin
if (gb as TPanel).Name<>'pnEnc' then
gb.BringToFront;

gb.Visible:=true;
for i:=0 to ControlCount-1 do
if (Controls[i] is Tpanel) then
if (Controls[i] as Tpanel).name<>(gb as TPanel).Name then
(Controls[i] as Tpanel).visible:=false;
btnandar.visible:=not ((gb as TPanel).Name='pnAlu');
btnparar.visible:=not ((gb as TPanel).Name='pnAlu');
pnPresenta.Visible:=false;
end;

Function TfrmMain.TodosApagados():boolean;
var
i:integer;
inactivar:boolean;
begin
inactivar:=false;
if (not (f_PantallaActiva in [0,6,7])) then
begin
inactivar:=true;
for i:=0 to g_num_servidores_aula -1 do
if (equipoServidorAula[i].EstadoActivadEquipo in [eUsuario] )then inactivar:=false;
if inactivar then
begin
Mensaje(MEN_NO_ENCENDIDOS,aceptar);
f_PantallaActiva:=0;
spEnc.Down:=true;
end;
end;
result:=inactivar;
end;

Procedure TfrmMain.IniciarPrograma();
begin
hallaEquiposDominio();
if FileExists('/var/lib/adtos/grupos.ini') then
LeerFicheroCursos()
else
CrearGruposDominio();
cargaGruposEquipos();
IniciarVariables();
CrearColocarComponentes();
mnuAulas.Visible:=false;
ColocarPaneles();
pintarlogos(f_PantallaActiva);
pnPresenta.BringToFront;
meTexArc.Lines.Add('Has recibido un archivo del administrador informático. Lo encontrarás en la carpeta recibidos_administrador de tu directorio personal');
Application.ProcessMessages;
end;

procedure TfrmMain.pintarlogos(numero_pantalla:integer);
begin
with imgico do
begin
Stretch:=true;
Picture.Bitmap.clear;
imllogos.Getbitmap(numero_pantalla,picture.bitmap);
end;
end;

Procedure TfrmMain.IniciarVariables;
begin
setlength(Ordenata,g_num_ord_pantalla);
setlength(lblOrdenata,g_num_ord_pantalla);
SetLength(pgOrdenata,g_num_ord_pantalla);
Setlength(lblmesa,g_num_ord_pantalla);
Setlength(btnProceso,g_num_ord_pantalla);
end;
Procedure TfrmMain.CrearColocarComponentes();
var
numfbotproceso,i:integer;
begin
for i:=g_num_ord_pantalla-1 downto 0 do
begin
Ordenata[i]:= TImage.Create(self);
with Ordenata[i] do
begin
width:=W_ORDENADOR;
Height:=H_ORDENADOR;
stretch:=true;
Cursor:=crarrow;
imlicodis.GetBitmap(0,Picture.Bitmap);
Parent:=self;
tag:=i;
visible:=false;
OnClick:=@OrdenataClick;
OnMouseEnter:=@OrdenataMouseEnter;
OnMouseDown:=@OrdenataMouseDown;
OnDragOver:=@OrdenataDragOver;
OnDragDrop:=@OrdenataDragDrop;
PopupMenu:=poAula;
if i< g_num_servidores_aula then
if equipoServidorAula[i].EstadoActivadEquipo=eAveriado then

enabled:=false;
end;
end;
for i:=g_num_ord_pantalla-1 downto 0 do
begin
pgOrdenata[i]:= TColorProgress.Create(self);
with pgOrdenata[i] do
begin
width:=W_ORDENADOR-12;
Height:=5;
ShowText:=false;
MaxValue:=60;
MinValue:=0;
Progress:=0;
ForeColor:=clYellow;
BackColor:=clBlack;
Cursor:=crHourGlass;
Parent:=self;
tag:=i;
visible:=false;
end;
end;
MostrarServidoresAulas();
for i:=g_num_ord_pantalla-1 downto 0 do
begin
lblOrdenata[i]:= Tlabel.Create(self);
with lblOrdenata[i] do
begin
autosize:=false;
SetBounds(Ordenata[i].Left-5,Ordenata[i].top+Ordenata[i].height-5,Ordenata[i].Width+10,15);
alignment:=tacenter;
font.name:='Sans';
font.size:=6;
Font.Color:=rgb(0,0,0);
caption:= 'Mesa ' + NumOrdLet(i);
Parent:=self;
layout:=tlcenter;
Transparent:=true;
visible:=true;
end;
end;
for i:=g_num_ord_pantalla-1 downto 0 do
begin
lblmesa[i]:= Tlabel.Create(self);
with lblmesa[i] do
begin
autosize:=false;
SetBounds(Ordenata[i].Left-19,Ordenata[i].top,16,14);
alignment:=taRightJustify;
Font.Name:='Sans';
Font.Size :=10;
Font.Color:=rgb(100,100,100);
Font.Color:=clsilver;
caption:=inttostr(i+1);
Parent:=self;
//font.Style:=[fsbold];
layout:=tlcenter;
Transparent:=true;
visible:=false;
end;
end;
for i:= 0 to g_num_ord_pantalla-1 do
begin
btnProceso[i]:=TSpeedButton.Create(self);
with btnProceso[i] do
begin
tag:=i;
font.Name:='Sans';
font.Size:=10;
Visible:=false;
flat:=false;
Down:=false;
GroupIndex:=1;
width:=70;
Height:=26;
top:=50+ 28*(i div 12);
left:=10 + 73 * (i mod 12);
OnClick:=@btnProcesoClick;
OnMouseDown:=@btnProcesoMouseDown;
PopupMenu:=poRepetir;
if i< g_num_servidores_aula then
begin
Enabled:=false;
caption:=equipoServidorAula[i].mihost;
Visible:=true;

end;

Cursor:=crarrow;
Parent:=pnTodos;
end;
end;
for i:=g_num_servidores_aula to g_num_ord_pantalla-1 do
lblOrdenata[i].Caption:='';
for i:=g_num_servidores_aula to g_num_ord_pantalla-1 do
lblmesa[i].visible:=false;
for i:=g_num_servidores_aula to g_num_ord_pantalla-1 do
btnProceso[i].visible:=false;
numfbotproceso:=g_num_servidores_aula div 12;
lblHost.Top:=btnProceso[g_num_servidores_aula -1].top + btnProceso[g_num_servidores_aula -1].Height+10;
lblMAC.Top:= lblHost.Top;
lblIP.Top:= lblHost.Top;
lblHost.Font.Color:=clNavy;
lblIP.Font.Color:=clNavy;
lblMAC.Font.Color:=clNavy;
meProceso1.Top:=lblHost.Top+ lblHost.Height+10;
meProceso1.Height:=btnTodos.top- meProceso1.top -20;



end;
Procedure TfrmMain.btnProcesoClick(sender:TObject);
var
botPul:integer;
comandoE:String;
begin
botPul:=(sender as TSpeedButton).Tag;
try
case g_tipo_comando of
-1: comandoE:='Ejecutar comando: '+ HTTPDecode(equipoAdministrador.Procesos );
0: comandoE:='Enviar archivo: '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos ));
1: comandoE:='Instalar paquete debian: '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos));
2: comandoE:='Ejecutar script : '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos));
3: comandoE:='Enviar carpeta : '+ ExtractFileName(HTTPDecode(equipoAdministrador.Procesos));
end;
except
comandoE:=HTTPDecode(equipoAdministrador.Procesos );
end;
lblAccionEjecutada.Caption:='Acción realizada-> '+ comandoE;
lblHost.Caption:= 'Equipo: '+equipoServidorAula[botpul].mihost;
lblIP.Caption:='IP: '+equipoServidorAula[botpul].IP;
lblMAC.Caption:='MAC: '+equipoServidorAula[botpul].MAC;
meProceso1.Clear;
meProceso1.Lines.Add('#################################################################');
meProceso1.Lines.Add('Equipo: '+equipoServidorAula[botpul].mihost+'; IP: '+equipoServidorAula[botpul].ip+'; MAC: '+equipoServidorAula[botpul].mac+'; Grupo: '+ equipoServidorAula[botpul].dominio+'; Aula: '+ equipoServidorAula[botpul].CURSO);
meProceso1.Lines.Add(comandoE);
meProceso1.Lines.Add('Fecha: ' +DateToStr(Date())+' '+ TimeToStr(Time()) );
meProceso1.Lines.Add('#################################################################');
meProceso1.Lines.Add(' ');
meProceso1.Lines.add(equipoServidorAula[botpul].ProcesoResultado);

end;
procedure TfrmMain.EjecutarOrdenesFin(tipo:integer;estado:boolean;EnviarMensaje:boolean=false;asunto:string='Aviso';texto:string='Mensaje del Administrador');
var
misleep,i,inicio,fin:integer;
begin
inicio:=0;
fin:=0;
ObtenerInicioFin(tipo,inicio,fin);
for i:=inicio to fin do
begin
if ((f_pantallaactiva in [3,4,5]) and(equipoServidorAula[i].IconoEquipo(0) <> 1)) or (not ordenata[i].Enabled) or (equipoServidorAula[i].EstadoActivadEquipo=eAveriado) or (equipoServidorAula[i].mihost='') then continue;
misleep:=PausaEquipo(tipo,estado,equipoServidorAula[i].EstadoActivadEquipo);
equipoServidorAula[i].ElegirOrden(f_pantallaactiva,estado);
application.ProcessMessages;
if f_PantallaActiva= 0 then
begin
if Not estado then
begin
equipoServidorAula[i].UsuarioActivo:='';
lblOrdenata[i].Caption:=NombreUsuarioOrdenador(i)
end;
fcontadorbarra[i]:=0;
PintarMonPant0(i);
end
else
begin
if estado then
CambiarIconoActivo(i)
else
CambiarIconoInactivo(i);
end;
sleep(misleep);
application.ProcessMessages;
end
end;
function TfrmMain.HallaSleep(tipo:integer;estado:Boolean; actividad:TEstadoActividadEquipo):integer;
var
intervalo:integer;
begin

intervalo:=SLEEP_BAJO * g_factor_velocidad;
if tipo<> -1 then
intervalo:= SLEEP_BAJO * g_factor_velocidad
else if (f_PantallaActiva=0) and (estado) and (actividad<>eApagado) then
intervalo:= SLEEP_BAJO * g_factor_velocidad
else if (f_PantallaActiva=0) and (estado) and (actividad=eApagado) then
intervalo:= SLEEP_BAJO * g_factor_velocidad
else if (f_PantallaActiva=0) and ( not estado) and (actividad in [eApagado, eAveriado,eEncendiendo,eApagando]) then
intervalo:= SLEEP_BAJO * g_factor_velocidad
else if (f_PantallaActiva=0) and ( not estado) and (actividad in [eEncendido, eUsuario]) then
intervalo:= SLEEP_MEDIO * g_factor_velocidad
else if ((not estado) and ( f_PantallaActiva in [3]))then
intervalo:= SLEEP_MEDIO * g_factor_velocidad
else if ((not estado) and ( f_PantallaActiva in [4,5,6,7])) then
intervalo:=SLEEP_MINIMO * g_factor_velocidad
else if ((estado) and ( f_PantallaActiva in [0,3,6])) then
intervalo:= SLEEP_MEDIO * g_factor_velocidad
else if ((estado) and ( f_PantallaActiva in [4,5,7])) then
intervalo:= SLEEP_ALTO * g_factor_velocidad;
Result:=intervalo;
end;

procedure TfrmMain.MensajeEnviado(ord_num:integer; asunto,texto:string);
begin
if f_PantallaActiva in [1,2,10,12,13] then
begin
g_mensaje_prioridad:='0';
g_mensaje_asunto:=HTTPEncode(asunto);
g_mensaje_texto:=HTTPEncode(texto);
equipoServidorAula[ord_num].mensaje();
end;
end;

Procedure TfrmMain.CambiarIconoActivo(ord_num:integer);
var
activo:boolean;
begin
activo:=ordenata[ord_num].enabled;
if activo then
begin
ordenata[ord_num].Picture.Bitmap.clear;
imlIcoAct1.GetBitmap(f_PantallaActiva,ordenata[ord_num].Picture.Bitmap);
end
end;
procedure TfrmMain.CambiarIconoInactivo(ord_num:integer);
var
activo:boolean;
begin
activo:=ordenata[ord_num].enabled;
if activo then
begin
ordenata[ord_num].Picture.Bitmap.clear;
imlicoina.GetBitmap(f_PantallaActiva,ordenata[ord_num].Picture.Bitmap);
end
end;

procedure TfrmMain.ObtenerInicioFin(ord_num:integer;var inicio:integer; var fin:integer);
begin
if (ord_num=-1) then
inicio:=0
else
inicio:=ord_num;
if (ord_num=-1) then
fin:=g_num_servidores_aula-1
else
fin:=ord_num;
end;

Procedure TfrmMain.OrdenataClick(sender:TObject);
var
ordpul:integer;
begin

ordpul:=(sender as Timage).Tag;
if equipoServidorAula[ordpul].fIconoMonitor[f_PantallaActiva]=0 then
begin
f_ordentodos:=ordpul;
if validarcontenido(f_PantallaActiva)=false then exit;
equipoServidorAula[ordpul].fIconoMonitor[f_PantallaActiva]:=1;
Iniciaractividad(f_PantallaActiva,ordpul);
end
else if equipoServidorAula[ordpul].fIconoMonitor[f_PantallaActiva]=1 then
begin
if f_PantallaActiva =0 then
begin
if (Length(Trim(g_contraServidores)) <1) then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
if Mensaje('¿Deseas apagar este equipo?',sino)=2 then
exit
end;
equipoServidorAula[ordpul].fIconoMonitor[f_PantallaActiva]:=0;
DetenerActividad(f_PantallaActiva,ordpul);
end;
end;
procedure TfrmMain.recolocaComponetesMovido(numOrd:integer);
begin
pgOrdenata[numOrd].SetBounds(Ordenata[numOrd].Left+6, (Ordenata[numOrd].top+((Ordenata[numOrd].height div 12)*7)),(Ordenata[numOrd].Width-12),8);
lblOrdenata[numOrd].SetBounds(Ordenata[numOrd].Left-5,Ordenata[numOrd].top+Ordenata[numOrd].height-5,Ordenata[numOrd].Width+10,15);
lblMesa[numOrd].SetBounds(Ordenata[numOrd].Left-19,Ordenata[numOrd].top,16,14);
end;
procedure TfrmMain.OrdenataDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
numOrdD:=Timage(sender).Tag;
(source as Timage).SetBounds((sender as Timage).left, (sender as Timage).top, (sender as Timage).width,(sender as Timage).height);
(Sender as Timage).SetBounds(PuntoO.x, PuntoO.y, (source as Timage).width,(source as Timage).height);
recolocaComponetesMovido(numOrdO);
recolocaComponetesMovido(numOrdD);
end;

procedure TfrmMain.OrdenataDragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept:= (Source is TImage);
end;

procedure TfrmMain.OrdenataMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if button = mbLeft then
begin
numOrdO:= TImage(sender).tag;
PuntoO:=Point(TImage(Sender).Left,TImage(Sender).top);
TImage(Sender).BeginDrag(false,30)
end
else
begin
f_equipoAulaBotonDerecho:=TImage(sender).tag;
end;
end;
procedure TfrmMain.OrdenataMouseEnter(Sender: TObject);
var
numeord:integer;
begin
numeord:=(sender as Timage).tag;
(sender as Timage).ShowHint:=false;
if (g_mostrarNombreUsuario) then
begin
if (equipoServidorAula[numeord].EstadoActivadEquipo=eUsuario) then
(sender as Timage).Hint:='Usuario: ' +equipoServidorAula[numeord].UsuarioActivo
else
(sender as Timage).Hint:='Equipo: '+equipoServidorAula[numeord].mihost;
(sender as Timage).ShowHint:=(Trim(equipoServidorAula[numeord].mihost)<>'');
end;
end;
Procedure TfrmMain.IniciarActividad(numero_pantalla:integer;ord_num:integer);
begin
case numero_pantalla of
0:EquipoAulaEncender(ord_num);
3:ProfeAulaMensaje(ord_num);
4:ProfeAulaArchivo(ord_num);
5:ProfeAulaCarpeta(ord_num);
6:begin
f_equipoEjecutandoProceso:=ord_num;
EquipoAulaComando(ord_num);
end;
7:begin
f_equipoEjecutandoProceso:=ord_num;
EquipoAulaArchivoRoot(ord_num)
end;
end;

end;

Procedure TfrmMain.DetenerActividad(numero_pantalla:integer;ord_num:integer);
begin
case numero_pantalla of
0:EquipoAulaEncenderNo(ord_num);
3:ProfeAulaMensajeNo(ord_num);
4:ProfeAulaArchivoNo(ord_num);
5:ProfeAulaCarpetaNo(ord_num);
6:EquipoAulaComandoNo(ord_num);
7:EquipoAulaArchivoRootNo(ord_num);
end;
end;

procedure TfrmMain.despulsarMonitores(numero_pant:integer);
var
i:integer;
begin
for i:=0 to high(equipoServidorAula) do
begin
if equipoServidorAula[i].EstadoActivadEquipo<>eAveriado then
equipoServidorAula[i].fMonitorPulsado[numero_pant]:=false;
end;
end;

procedure TfrmMain.pulsarMonitores(numero_pant:integer);
var
i:integer;
begin
for i:=0 to high(equipoServidorAula) do
begin
if equipoServidorAula[i].EstadoActivadEquipo<>eAveriado then
equipoServidorAula[i].fMonitorPulsado[numero_pant]:=true;
end;
end;

procedure TfrmMain.OrdenRestablecerTodos(numero_pantalla:integer);
begin
cursor:=crHourGlass;
Enabled:=false;
tmrPingEstadoCentro.Enabled:=false;
try
pulsarMonitores(numero_pantalla);
case numero_pantalla of
0:EquipoAulaEncenderNo(-1);
3:ProfeAulaMensajeNo(-1);
4:ProfeAulaArchivoNo(-1);
5:ProfeAulaCarpetaNo(-1);
6:EquipoAulaComandoNo(-1);
7:EquipoAulaArchivoRootNo(-1);
end;
finally
begin
Enabled:=true;
cursor:=crarrow;
tmrPingEstadoCentro.Enabled:=true;
end;
end;
end;

procedure TfrmMain.OrdenEjecutarTodos(numero_pantalla:integer);
begin

cursor:=crHourGlass;
enabled:=false;
tmrPingEstadoCentro.Enabled:=false;
try
despulsarMonitores(numero_pantalla);
case numero_pantalla of
0:EquipoAulaEncender(-1);
3:ProfeAulaMensaje(-1);
4:ProfeAulaArchivo(-1);
5:ProfeAulaCarpeta(-1);
6:begin
f_equipoEjecutandoProceso:=-1;
EquipoAulaComando(-1);
end;
7:begin
f_equipoEjecutandoProceso:=-1;
EquipoAulaArchivoRoot(-1);
end;
end;
finally
begin
tmrPingEstadoCentro.Enabled:=true;
Enabled:=true;
cursor:=crArrow;
end;
end
end;

Function TfrmMain.ValidarContenido(PantallaActual:integer):boolean;
begin
result:=true;

case PantallaActual of

3:
begin
if ((length(trim(metexmen.Text))<1) or (length(trim(edasumen.Text))<1)) then
begin
mensaje(MEN_ESCRIBE_MENSAJE,aceptar);
result:=false;
end;
end;
4:
begin
if rightstr(fnArchivo.FileName,2)='/*' then
begin
mensaje(MEN_ERROR_COPIA_CARPETA,aceptar);
result:=true;
exit;
end;
if not fileexists(fnArchivo.FileName) then
begin
mensaje(MEN_NO_EXISTE_ARCHIVO,aceptar);
result:=false;
exit;
end;
if length(trim(meTexArc.Text))<1 then
begin
mensaje(MEN_ESCRIBE_MENSAJE,aceptar);
result:=false;
end;
end;

5:
begin
if ((length(trim(mecarpertas.Text))<1)) then
begin
mensaje(MEN_ESCRIBE_MENSAJE,aceptar);
result:=false;
end
else if (length(decarpetas.directory)< 2) or (not directoryexists(decarpetas.directory)) then
begin
mensaje(MEN_ELIGE_DIRECTORIO,aceptar);
result:=false;
end
end;
6:
begin
result:=ValidarProcesoAsi();
end;
7:
begin
result:=ValidarProcesoArchivoRoot();
end;
end;
end;
Function TfrmMain.ValidarProcesoArchivoRoot():Boolean;
var
i:integer;
respuesta:Boolean;
procesoAnterior:String;
begin
respuesta:=true;
if Length(Trim(edCarpetaDestino.text))<1 then
begin
mensaje('Indica la carpeta de destino',aceptar);
result:=false;
exit;
end;
case f_tipo_envio of
0:
begin
if not fileexists(fnArchivoRoot.FileName) then
begin
mensaje(MEN_NO_EXISTE_ARCHIVO,aceptar);
result:=false;
exit;
end;
end;
3:
begin
if (length(deCarpetasRoot.directory)< 2) or (not directoryexists(deCarpetasRoot.directory)) then
begin
mensaje(MEN_ELIGE_DIRECTORIO,aceptar);
result:=false;
exit;
end;
if (length(edCarpetaDestino.Text)<1) then
begin
mensaje('Indica la carpeta de destino',aceptar);
result:=false;
exit;
end
end;
1:

begin
if not fileexists(fnArchivoRoot.FileName) then
begin
mensaje(MEN_NO_EXISTE_ARCHIVO,aceptar);
result:=false;
exit;
end
else if (RightStr(fnArchivoRoot.FileName,3)<>'deb') then
begin
mensaje('El archivo seleccionado no es un paquete debian',aceptar);
result:=false;
exit;
end

end;

end;
case f_tipo_envio of
0:
begin
if mensaje('¿Desea copiar el archivo ' + fnArchivoRoot.FileName +' en la caperta '+ edCarpetaDestino.text +' de los equipos elegidos?' ,SiNo)=2 then
begin
result:=false;
exit;
end;
end;
1:

begin
if mensaje('¿Desea instalar el paquete ' + fnArchivoRoot.FileName +' en los equipos elegidos?' ,SiNo)=2 then
begin
result:=false;
exit;
end
end;
3:
begin
if mensaje('¿Desea ejecutar copiar la carpeta ' +deCarpetasRoot.Directory+' en el directorio '+ edCarpetaDestino.text +' de los equipos elegidos?' ,SiNo)=2 then
begin

result:=false;
exit;
end;
end;
end;
respuesta:=CompruebaProcesosActivos();
if respuesta then
begin
Randomize;
equipoAdministrador.RealizandoProcesos:=false;
tmrRecogidaProcesos.Enabled:=false;
tmrRecogidaProcesos1.Enabled:=false;
f_contador_procesos:=TIEMPO_PROCESOS;
f_contador_procesos_ver:=TIEMPO_PROCESOS*5;
g_tipo_comando:=f_tipo_envio;
procesoAnterior:=equipoAdministrador.Procesos;
case g_tipo_comando of
0:
begin
if equipoAdministrador.Procesos<> Trim(HTTPEncode(fnArchivoRoot.FileName)) then
begin
equipoAdministrador.IdProcesos:='A-'+IntToStr(Random(100000000));
equipoAdministrador.Procesos:=Trim(HTTPEncode(fnArchivoRoot.FileName));
end
end;
3:
begin
if equipoAdministrador.Procesos<> Trim(HTTPEncode(deCarpetasRoot.Directory)) then
begin
equipoAdministrador.IdProcesos:='C-'+IntToStr(Random(100000000));
equipoAdministrador.Procesos:=Trim(HTTPEncode(deCarpetasRoot.Directory));
g_carpeta_enviar_path:=deCarpetasRoot.Directory;
end;
end;
1:
begin
if equipoAdministrador.Procesos<> Trim(HTTPEncode(fnArchivoRoot.FileName)) then
begin
equipoAdministrador.IdProcesos:='D-'+IntToStr(Random(100000000));
equipoAdministrador.Procesos:=Trim(HTTPEncode(fnArchivoRoot.FileName));
end
end;
end;
if equipoAdministrador.Procesos<> procesoAnterior then
begin
if f_PantallaActiva=6 then EquipoAulaComandoNo(-1);
for i:=0 to High(equipoServidorAula) do
begin
btnProceso[i].Enabled:=false;
btnProceso[i].Font.Color:=clBlack;
end;

end;
if f_ordentodos = -1 then
begin
for i:=0 to High(equipoServidorAula) do
begin
if equipoServidorAula[i].EstadoActivadEquipo in [eEncendido,eEncendiendo,eUsuario,eApagando] then
begin
equipoServidorAula[i].ProcesoHace:=true;
equipoServidorAula[i].ProcesoTerminado:=false;
equipoServidorAula[i].ProcesoId:=equipoAdministrador.IdProcesos;
end
else
begin
equipoServidorAula[i].ProcesoHace:=false;
equipoServidorAula[i].ProcesoTerminado:=true;
equipoServidorAula[i].ProcesoId:='S';
end
end;
end
else
begin
equipoServidorAula[f_ordentodos].ProcesoHace:=true;
equipoServidorAula[f_ordentodos].ProcesoTerminado:=false;
equipoServidorAula[f_ordentodos].ProcesoId:=equipoAdministrador.IdProcesos;
end;
g_archivo_nombre_root:=ExtractFilename(fnArchivoRoot.filename);
equipoAdministrador.RealizandoProcesos:=true;
lblTiempoProceso.Caption:='';
tmrRecogidaProcesos.Enabled:=true;
tmrRecogidaProcesos1.Enabled:=true;
lblTiempoProceso.Visible:=true;
lblTiempoProceso.BringToFront;
g_pantalla_proceso:=7;
////writeln('validar proceso ',equipoAdministrador.Procesos,' ',equipoAdministrador.IdProcesos);
end;
////writeln(respuesta);
result:=respuesta;
end;

procedure TfrmMain.MostrarServidoresAulas();
var
tor,wo,ho,lb,tb :integer;
spt,i,numsep,numfilas:integer;

begin
wo:=g_Distribuciones[g_TipoAula].ancho;
ho:=g_Distribuciones[g_TipoAula].alto;
tor:=g_Distribuciones[g_TipoAula].altura;
numfilas:=(g_num_ord_pantalla div g_Distribuciones[g_TipoAula].numColumnas);
numsep:=numfilas -1;
spt:=(tor-(numfilas*ho)) div numsep;
if g_tipoAula>= 7 then spt:=spt;
for i:=g_num_ord_pantalla-1 downto 0 do
begin
tb:= i div g_Distribuciones[g_TipoAula].numColumnas;
tb:= g_Distribuciones[g_TipoAula].altura-tb*(g_Distribuciones[g_TipoAula].alto+spt);
lb:= i mod g_Distribuciones[g_TipoAula].numColumnas;
lb:= g_Distribuciones[g_TipoAula].izquierda+ g_Distribuciones[g_TipoAula].sepH[lb];
if i< g_num_servidores_aula then
begin
equipoServidorAula[i].L:=lb;
equipoServidorAula[i].T:=tb;
end;
Ordenata[i].SetBounds(lb,tb,wo,ho);
Ordenata[i].visible:=true;
pgOrdenata[i].Width:=Ordenata[i].Width-12;
pgOrdenata[i].Height:=8;
pgOrdenata[i].left:=Ordenata[i].left+6;
pgOrdenata[i].top:=Ordenata[i].top+((Ordenata[i].height div 12)*5);
pgOrdenata[i].visible:=false;

end;

for i:=g_num_servidores_aula to g_num_ord_pantalla-1 do
begin
Ordenata[i].visible:=false;
pgOrdenata[i].visible:=false;
end;

end;

procedure TfrmMain.CargarOrdenesRoot();
begin
if not fileexists(equipoAdministrador.ArcOrdenesRoot) then
equipoAdministrador.creaArchivoOrdenes();
Application.ProcessMessages;
equipoAdministrador.LeerArchivoOrdenes();
end;

procedure TfrmMain.CargarConfiguracionCentro(archivoaula:string);
var
Mifichero:TMemIniFile;
i:integer;
nmord:string;
dominio,curso,mhost,mip,mmac:string;
mestado:boolean;
begin
try
if FileExists(archivoaula) then
begin
Mifichero:= TMemIniFile.create(archivoaula);
With Mifichero do
begin
nmord:=ReadString('Centro','Numero aulas','48');
g_num_servidores_aula:=strtoint(nmord);
g_velocidad_red:=ReadInteger('Centro','Velocidad red',1);
g_factor_velocidad:= g_velocidad_red+1;
cargaDistribuciones();
g_ExploradorArchivos:=ReadString('Centro','Explorador archivos','nautilus');
g_tipoAula :=9;
if g_num_servidores_aula >54 then g_tipoAula :=10;
g_num_ord_pantalla:=NumeroOrdenadorePantalla(g_TipoAula,g_num_servidores_aula);
setlength(equipoServidorAula,g_num_servidores_aula);
SetLength(g_EstadoAulasCentro,g_num_servidores_aula);
SetLength(g_equiposAulas,g_num_servidores_aula);
for i:=0 to g_num_ord_pantalla-1 do
begin
if i < g_num_servidores_aula then
begin
mestado :=strtobool(ReadString('Estado','Aula '+ NumOrdLet(i),'-1'));
mhost:=ReadString('Nombre','Aula '+ NumOrdLet(i),'');
mip:=ReadString('IP','Aula '+ NumOrdLet(i),'');
mmac:=ReadString('MAC','Aula '+ NumOrdLet(i),'');
curso:=ReadString('Curso','Aula '+ NumOrdLet(i),'');
dominio:=ReadString('Dominio','Aula '+ NumOrdLet(i),'general');
equipoServidorAula[i]:=TEquipo.create(i,mhost,mip,mmac,mestado,curso,dominio);
Application.ProcessMessages;
end
end;
equipoAdministrador.host:= ReadString('Administrador','IP','192.168.0.254');
Free;
end;
end;
except
begin
Mensaje(MEN_ERROR_AULA,aceptar);
application.Terminate
end
end;
end;

procedure TfrmMain.EntrarPrograma();
begin
//TfrmContraServidores.Create(nil).showmodal;
CargarOrdenesRoot();
MostrarMenus();
mnuEncenderclick(mnuEncender);
iniciaRevisionCentro();
application.ProcessMessages;
pnPresenta.Visible:=false;
cursor:=crDefault;
application.ProcessMessages;
lblRevInicio.visible:=true;
enabled:=false;
cursor:=crHourGlass;
Image1.Cursor:=crHourGlass;
pnEnc.Cursor:=crHourGlass;
lstComandos.Visible:=false;
lstProcesos.Visible:=true;

end;
procedure TfrmMain.lstComandosClick(Sender: TObject);
begin
if lstComandos.ItemIndex <>-1 then
begin
edComando.Text:=lstComandos.Items.Strings[lstComandos.itemindex];
end;
end;

procedure TfrmMain.lstProcesosClick(Sender: TObject);
begin
//anteriorcomando:=edComando.Text;
if lstProcesos.ItemIndex <>-1 then
begin
edComando.Text:=lstProcesos.Items.Strings[lstProcesos.itemindex];
//if anteriorcomando<>edComando.Text then EquipoAulaComandoNo(-1)
end;
end;

procedure TfrmMain.mnuAulaClick(Sender: TObject);
begin
if Length(Trim(g_contraServidores)) <1 then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
TfrmEquiposAulas.Create(nil).showmodal;
end;

procedure TfrmMain.mnuConfigurarGruposClick(Sender: TObject);
begin
TfrmGruposServidores.Create(nil).showmodal;
end;

procedure TfrmMain.mnuConfigurarImpresoraClick(Sender: TObject);

var
orden,ip:String;
begin
if equipoServidorAula[f_equipoAulaBotonDerecho].EstadoActivadEquipo in [eUsuario,eEncendido,eEncendiendo,eApagando] then
begin
ip:=equipoServidorAula[f_equipoAulaBotonDerecho].IP;
orden:='firefox http://%s:631 &';
orden:=Format(orden,[ip]);
Ejecutar(orden);
end
else
begin
mensaje('Este servidor está apagado. No se puede configurar su impresora',aceptar)
end;
end;

procedure TfrmMain.mnuContraClick(Sender: TObject);
begin
TfrmContraServidores.Create(nil).showmodal;
end;

procedure TfrmMain.mnuAcercadeClick(Sender: TObject);
begin
Application.CreateForm(TfrmAcerca, frmAcerca);
frmAcerca.ShowModal;
end;

procedure TfrmMain.mnuArchivoRootClick(Sender: TObject);
begin
if Length(Trim(g_contraServidores)) <1 then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
if rbCopias.Checked then
begin
f_tipo_envio:=0;
cboIntervaloP7.Text:='2';
btnAndar.caption:='Archivo todos';
end
else if rbDebian.Checked then
begin
f_tipo_envio:=1;
cboIntervaloP7.Text:='3';
btnAndar.caption:='Instalar todos';
g_comando_consulta:=3;
end
else if rbCopiasCarpeta.Checked then
begin
f_tipo_envio:=3;
cboIntervaloP7.Text:='3';
btnAndar.caption:='Carpeta todos';
end; ;
f_PantallaActiva:=7;

fnArchivoRoot.FileName:='';
edCarpetaDestino.text:='/tmp';
deCarpetasRoot.DialogTitle:='';
edCarpetaDestino.enabled:=g_DestinosLibres;
rbDebian.Enabled:=g_ComandosLibres;
menusclick(mnuArchivoRoot,f_PantallaActiva,pnArcRoot,spArcRoot);
end;

procedure TfrmMain.mnuComandoRootClick(Sender: TObject);
var
i:integer;
begin
if Length(Trim(g_contraServidores)) <1 then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
f_PantallaActiva:=6;
f_tipo_envio:= -1;
lstComandos.Visible:=false;
lstProcesos.Visible:=false;
meScript.Visible:=false;
if rbConsulta.Checked then
begin
g_comando_consulta:=0;
btnAndar.caption:='Consulta a todos';
cboIntervaloP6.Text:='0.5';
f_tipo_envio:= -1;
lstProcesos.Visible:=true;

end
else if rbComando.Checked then
begin
btnAndar.caption:='Comando a todos';
g_comando_consulta:=1;
f_tipo_envio:= -1;
lstComandos.Visible:=true;
end
else if rbScript.Checked then
begin
f_tipo_envio:=2;
cboIntervaloP6.Text:='1';
btnAndar.caption:='Script todos';
g_comando_consulta:=2;
meScript.Visible:=true;
end;

edComando.enabled:=g_ComandosLibres;
lstComandos.clear;
lstProcesos.clear;
for i:=0 to High(g_ordenes_root) do
lstComandos.Items.Add(g_ordenes_root[i]);
for i:=0 to High(g_procesos_root) do
lstProcesos.Items.Add(g_procesos_root[i]);
menusclick(mnuComandoRoot,f_PantallaActiva,pnComandos,spCom);
end;

procedure TfrmMain.mnuConsultaClick(Sender: TObject);
begin
if Length(Trim(g_contraServidores)) <1 then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
Application.CreateForm(TfrmEvaluar, frmEvaluar);
frmEvaluar.ShowModal;
end;

procedure TfrmMain.mnuCursosClick(Sender: TObject);
var
i:integer;
begin
g_verNombreCursos:=not g_verNombreCursos;
if g_verNombreCursos then
mnuCursos.Caption:='Nombre equipos'
else
mnuCursos.Caption:='Nombre cursos';
for i:=0 to g_num_servidores_aula-1 do
lblOrdenata[i].Caption:=NombreUsuarioOrdenador(i);
end;

procedure TfrmMain.mnuEncenderClick(Sender: TObject);
begin
f_PantallaActiva:=0;
menusclick(mnuencender,f_PantallaActiva,pnenc,spenc);
pnenc.visible:=true;
pnenc.BringToFront;
end;

procedure TfrmMain.mnuEnvCarClick(Sender: TObject);
begin
if Length(Trim(g_contraServidores)) <1 then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
f_PantallaActiva:=5;
MenusClick(mnuenvcar,f_PantallaActiva,pncar,spcar);
end;

procedure TfrmMain.mnuEnviarArchivoClick(Sender: TObject);
begin
if Length(Trim(g_contraServidores)) <1 then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
f_PantallaActiva:=4;
menusclick(mnuEnviarArchivo,f_PantallaActiva,pnarc,sparc);
end;

procedure TfrmMain.mnuIniEvaClick(Sender: TObject);
begin
Application.CreateForm(TfrmEvaluar, frmEvaluar);
frmEvaluar.ShowModal;
end;

procedure TfrmMain.mnuMapaClick(Sender: TObject);
begin
Application.CreateForm(TfrmMapa, frmMapa);
frmMapa.ShowModal;
end;

procedure TfrmMain.mnuMensajeClick(Sender: TObject);
begin
if Length(Trim(g_contraServidores)) <1 then
begin
mensaje(MEN_CONTRA_SERVIDORES_AULA, aceptar);
exit;
end;
f_PantallaActiva:=3;
menusclick(mnumensaje,f_PantallaActiva,pnmen,spmen);
end;

procedure TfrmMain.mnuNotClick(Sender: TObject);
const
P_BLOC:string='gedit';
begin
ordenesaula(ORD_EJECUTAR_EN_ADMINISTRADOR,[P_BLOC]);
end;

procedure TfrmMain.mnuRepetirClick(Sender: TObject);
begin
if Mensaje('¿Deseas ejecutar este proceso en el equipo seleccionado?', SiNo)=2 then exit;
RepetirProceso(g_botonProcesoMarcado);
end;
procedure TfrmMain.RepetirProceso(numEqui:integer);
var
i:integer;
begin
equipoAdministrador.RealizandoProcesos:=true;
f_contador_procesos_ver:=TIEMPO_PROCESOS*5;
f_contador_procesos:=TIEMPO_PROCESOS;
if numEqui = -1 then
begin
for i:=0 to High(equipoServidorAula) do
begin
if equipoServidorAula[i].EstadoActivadEquipo in [eEncendido,eEncendiendo,eUsuario,eApagando] then
begin
if btnProceso[i].Enabled then
begin
if btnProceso[i].Font.Color=clRed then
begin
equipoServidorAula[i].ProcesoHace:=true;
equipoServidorAula[i].ProcesoTerminado:=false;
equipoServidorAula[i].ejecutarProcesoAsi();
Application.ProcessMessages;
end;
end;
end
end
end
else
begin
if equipoServidorAula[i].EstadoActivadEquipo in [eEncendido,eEncendiendo,eUsuario,eApagando] then
begin
if btnProceso[i].Enabled then
begin
equipoServidorAula[numEqui].ProcesoHace:=true;
equipoServidorAula[numEqui].ProcesoTerminado:=false;
equipoServidorAula[numEqui].ejecutarProcesoAsi();
Application.ProcessMessages;
end;
end
end;
tmrRecogidaProcesos.Enabled:=true;
tmrRecogidaProcesos1.Enabled:=true;
lblTiempoProceso.Caption:='';
lblTiempoProceso.Visible:=true;
lblTiempoProceso.BringToFront;
Application.ProcessMessages;
end;

procedure TfrmMain.mnuRestaurarClick(Sender: TObject);
begin
try
destruirComponentes();
lblGrupo.visible:=false;
CargarConfiguracionCentro('/etc/adtosadmin.conf');
IniciarVariables();
CrearColocarComponentes();
mnuEncenderClick(mnuEncender);
iniciaRevisionCentro();
except
//
end
end;

procedure TfrmMain.mnuResultadosClick(Sender: TObject);
var
i:integer;
begin
if not g_proceso_realizado then
begin
Mensaje('Los servidores de aula aún no han ejecutado ningún proceso o devuelto ninguna respuesta',aceptar);
exit;
end;
if tmrRecogidaProcesos.Enabled then
if mensaje('Aún queda equipos por devolver resultados del proceso, ¿Deseas ver los resultado de los que yan lo han hecho?',sino) =2 then exit;
for i:=0 to High(equipoServidorAula) do
begin
btnProceso[i].Enabled:=false;
btnProceso[i].Font.Color:=clBlack;
if ((equipoServidorAula[i].ProcesoHace) and (equipoServidorAula[i].ProcesoId = equipoAdministrador.IdProcesos)) then
begin
btnProceso[i].Enabled:=true;
if equipoServidorAula[i].ProcesoTerminado then
begin
btnProceso[i].Font.Color:=clGreen;
end
else
begin
equipoServidorAula[i].ProcesoResultado:='Aún no se ha recibido respuesta de este equipo';
btnProceso[i].Font.Color:=clred;
end;
end;

end;
meProceso1.Clear;
pnTodos.visible:=true;
pnTodos.BringToFront;
btnTodosClick(btnTodos);

end;

procedure TfrmMain.mnuSalir1Click(Sender: TObject);
begin
close;
end;

procedure TfrmMain.mnuTerminalClick(Sender: TObject);
const
P_CALCU:string='gnome-terminal';
begin
ordenesaula(ORD_EJECUTAR_EN_ADMINISTRADOR,[P_CALCU]);
end;



procedure TfrmMain.rbComandoChange(Sender: TObject);
var
marcado:integer;
begin
//marcado:=(Sender as TRadioButton).Tag;
IF (rbConsulta.Checked) then
marcado:=0
Else IF (rbComando.Checked) then
marcado:=1
Else IF (rbScript.Checked) then
marcado:=2;
fnScript.FileName:='';
edComando.text:='';
edComando.visible:=false;
fnScript.Visible:=false;
lstComandos.Visible:=false;
lstProcesos.Visible:=false;
meScript.visible:=false;
meScript.Text:='';
case marcado of
0:
begin
f_tipo_envio:=-1;
g_comando_consulta:=0;
lstProcesos.Visible:=true;
edComando.Visible:=true;
lblProScript.Caption:='Consulta';
lblInfoProScrip.Caption:='Selecciona una consulta y pulsa sobre el icono deseado para ejecutarlo en el correspondiente servidor de aula o sobre el botón "Consuta todos" para ejecutarla en todos los servidores de aula';
btnAndar.Caption:='Consulta todos';
cboIntervaloP6.Text:='0.5';

end;
1:
begin
f_tipo_envio:=-1;
g_comando_consulta:=1;
lstComandos.Visible:=true;
edComando.Visible:=true;
lblProScript.Caption:='Comando';
lblInfoProScrip.Caption:='Selecciona el comando que desear ejecutar y pulsa sobre el icono deseado para ejecutarlo en el correspondiente servidor de aula o sobre el botón "Comando todos" para ejecutarlos en todos los servidores de aula';
btnAndar.Caption:='Comando todos';
cboIntervaloP6.Text:='0.5';
end;

2:
begin
f_tipo_envio:=2;
fnScript.Visible:=true;
meScript.Visible:=true;
lblProScript.Caption:='Script';
lblInfoProScrip.Caption:='Selecciona el script que deseas enviar y ejecutar, debe tener extensión .sh, y pulsa sobre el icono deseado para ejecutarlo en el correspondiente servidor de aula o sobre el botón "Script todos" para hacerlo en todos los servidores de aula';
btnAndar.Caption:='Script todos';
cboIntervaloP6.Text:='1';
g_comando_consulta:=2;
end;
end;
end;


procedure TfrmMain.rbCopiasChange(Sender: TObject);
begin
f_tipo_envio:=(sender as TRadioButton).tag;
edCarpetaDestino.Enabled:=g_DestinosLibres;
edCarpetaDestino.text:='/tmp';
fnArchivoRoot.FileName:='';
deCarpetasRoot.Visible:=false;
fnArchivoRoot.Visible:=true;
case f_tipo_envio of
0:
begin
lblEnviar.Caption:='Archivo';
lblInfoEnviar.Caption:='Pulsa sobre el icono amarillo para abrir el explorador de archivos para seleccionar uno, indica la carpeta de destino y pulsa sobre un monitor o sobre el botón "Archivo todos".';
btnAndar.Caption:='Archivo todos' ;
cboIntervaloP7.Text:='2';
end;
1:
begin
edCarpetaDestino.Enabled:=false;
lblEnviar.Caption:='Paquete debian';
lblInfoEnviar.Caption:='Pulsa sobre el icono amarillo para abrir el explorador de archivos para seleccionar un paquete debian, indica la carpeta de destino y pulsa sobre un monitor o sobre el botón "Instalar todos".';
btnAndar.Caption:='Instalar todos' ;
cboIntervaloP7.Text:='3';
end;

3:
begin
lblEnviar.Caption:='Carpeta';
lblInfoEnviar.Caption:='Pulsa sobre el icono amarillo para abrir el explorador de directorios para seleccionar uno, indica la carpeta de destino y pulsa sobre un monitor o sobre el botón "Carpeta todos".';
btnAndar.Caption:='Carpeta todos' ;
deCarpetasRoot.Visible:=true;
fnArchivoRoot.Visible:=false;
cboIntervaloP7.Text:='3';
end;
end;

end;

procedure TfrmMain.resultadoProcesoCommand(ASender: TIdCommand);
var
ip,codigo,host,respuesta:string;
numE, size:integer;
begin
try
//writeln('Asender.Params[0] ',Asender.Params[0] ,' ip ',Asender.Params[1] ,'host ',Asender.Params[2] ,'numEquipo ',Asender.Params[3] );
// writeln('Asender.Params.Count '+IntToStr(Asender.Params.Count));
if (Asender.Params.Count=4) then
begin

codigo:=HTTPDecode(Asender.Params[0]);
ip:=HTTPDecode(Asender.Params[1]);
host:= HTTPDecode(Asender.Params[2]);
numE:=StrToInt(HTTPDecode(Asender.Params[3]));
Asender.sendReply;
size:= asender.Context.Connection.IOHandler.ReadLongInt(true);
//writeln('Size ' +inttostr(size));
respuesta:= asender.Context.Connection.IOHandler.ReadString(size);
//writeln(respuesta);
respuesta:=HTTPDecode(respuesta);
THallarResultadoProcesoSync.add(codigo,ip, host,respuesta,numE);
//writeln(codigo,' ',ip,' ',host,' ','mi numero es ',numE);
end;
except
//writeln('Error al recibir respuesta');
end;
end;

procedure TfrmMain.spBloClick(Sender: TObject);
var
botonpulsado:integer;
begin
botonpulsado:=(sender as Tspeedbutton).Tag;
Application.ProcessMessages;
case botonpulsado of
0:mnuEncenderClick(mnuEncender);
3:mnuMensajeClick(mnuMensaje);
4:mnuEnviarArchivoClick(mnuEnviarArchivo);
5:mnuEnvCarClick(mnuEnvCar);
6:mnuComandoRootClick(mnuComandoRoot);
7:mnuArchivoRootClick(mnuArchivoRoot);
10:mnuAulaClick(mnuAula);
18:mnuConsultaClick(mnuConsulta);
end;
end;

initialization
{$I inicio.lrs}

end.