diff options
author | ramon <ramongomez@us.es> | 2015-05-29 07:34:07 +0000 |
---|---|---|
committer | ramon <ramongomez@us.es> | 2015-05-29 07:34:07 +0000 |
commit | de687e3ba82883fa561b00bca0dbd0a73b6ee2d5 (patch) | |
tree | 617373349e83966c6914cb4f49980dcc0f90fc88 | |
parent | e589e1def0bea3c39e7691283a2ea13e170d84cd (diff) |
#673: Integrar código de la versión 1.0.6 en rama principal.
git-svn-id: https://opengnsys.es/svn/trunk@4641 a21b9725-9963-47de-94b9-378ad31fedc9
192 files changed, 4103 insertions, 2498 deletions
diff --git a/admin/Database/ogAdmBD-1.0-1.0.5.sql b/admin/Database/ogAdmBD-1.0-1.0.5.sql deleted file mode 120000 index 162c8be8..00000000 --- a/admin/Database/ogAdmBD-1.0-1.0.5.sql +++ /dev/null @@ -1 +0,0 @@ -ogAdmBD-1.0.1-1.0.5.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD-1.0-1.0.6.sql b/admin/Database/ogAdmBD-1.0-1.0.6.sql new file mode 120000 index 00000000..52b3ee2a --- /dev/null +++ b/admin/Database/ogAdmBD-1.0-1.0.6.sql @@ -0,0 +1 @@ +ogAdmBD-1.0.1-1.0.6.sql
\ No newline at end of file diff --git a/admin/Database/ogAdmBD-1.0.1-1.0.5.sql b/admin/Database/ogAdmBD-1.0.1-1.0.6.sql index 618ab02b..2eae13c5 100644 --- a/admin/Database/ogAdmBD-1.0.1-1.0.5.sql +++ b/admin/Database/ogAdmBD-1.0.1-1.0.6.sql @@ -1,8 +1,9 @@ ### Fichero de actualización de la base de datos. -# OpenGnSys 1.0.1 - 1.0.5 +# OpenGnSys 1.0 y 1.0.1 - 1.0.6 #use ogAdmBD -UPDATE parametros SET tipopa = '1', visual = '1' WHERE idparametro = 30; +# Mostrar protocolo de clonación en la cola de acciones (ticket #672) +UPDATE parametros SET tipopa = 0, visual = 1 WHERE idparametro = 30; UPDATE idiomas SET descripcion = 'English' WHERE ididioma = 2; UPDATE idiomas SET descripcion = 'Català' WHERE ididioma = 3; @@ -17,11 +18,8 @@ ALTER TABLE ordenadores_particiones ADD cache varchar(500), DROP INDEX idordenadornumpar, ADD UNIQUE idordenadornumdisknumpar(idordenador,numdisk,numpar); -ALTER TABLE imagenes - ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idrepositorio; # Nuevos tipos de particiones y particiones GPT. -ALTER TABLE imagenes MODIFY codpar int(8) NOT NULL; ALTER TABLE sistemasficheros MODIFY codpar int(8) NOT NULL; ALTER TABLE tipospar MODIFY codpar int(8) NOT NULL; INSERT INTO tipospar (codpar,tipopar,clonable) VALUES @@ -103,6 +101,10 @@ INSERT INTO comandos (idcomando, descripcion, pagina, gestor, funcion, urlimg, a ALTER TABLE parametros ADD KEY (nemonico); INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, nomtabla, nomliteral, tipopa, visual) VALUES + (12, 'nci', 'Nombre canónico', '', '', '', 0, 1), + (21, 'sfi', 'Sistema de fichero', 'nemonico', 'sistemasficheros', 'nemonico', 1, 0), + (22, 'tam', 'Tamaño', '', '', '', 0, 1), + (30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 0, 1), (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), @@ -112,11 +114,18 @@ INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, no (37, 'met', 'Método clonación', ';', '', 'Desde caché; Desde repositorio', 3, 1), (38, 'nba', 'No borrar archivos en destino', '', '', '', 0, 1); -# Imágenes incrementales. +# Imágenes incrementales, soporte para varios discos y fecha de creación +# (tickets #565, #601 y #677). ALTER TABLE imagenes - ADD tipo TINYINT NULL, - ADD imagenid INT NOT NULL DEFAULT '0', - ADD ruta VARCHAR(250) NULL; + MODIFY idrepositorio INT(11) NOT NULL DEFAULT 0, + MODIFY numpar SMALLINT NOT NULL DEFAULT 0, + MODIFY codpar INT(8) NOT NULL DEFAULT 0, + ADD idordenador INT(11) NOT NULL DEFAULT 0 AFTER idrepositorio, + ADD numdisk SMALLINT NOT NULL DEFAULT 0 AFTER idordenador, + ADD tipo SMALLINT NULL, + ADD imagenid INT NOT NULL DEFAULT 0, + ADD ruta VARCHAR(250) NULL, + ADD fechacreacion DATETIME DEFAULT NULL; UPDATE imagenes SET tipo=1; # Cambio de tipo de grupo. @@ -181,6 +190,12 @@ INSERT INTO tipospar (codpar, tipopar, clonable) VALUES ON DUPLICATE KEY UPDATE codpar=VALUES(codpar), tipopar=VALUES(tipopar), clonable=VALUES(clonable); +# Internacionalización correcta de los asistentes. +UPDATE asistentes + SET descripcion = 'Asistente Deploy de Imagenes' WHERE descripcion = 'Asistente "Deploy" de Imagenes'; +UPDATE asistentes + SET descripcion = 'Asistente UpdateCache con Imagenes' WHERE descripcion = 'Asistente "UpdateCache" con Imagenes'; + # Añadir proxy para aulas. ALTER TABLE aulas ADD proxy VARCHAR(30) AFTER dns; @@ -192,3 +207,28 @@ ALTER TABLE ordenadores UPDATE ordenadores SET fotoord = SUBSTRING_INDEX(fotoord, '/', -1); +# Incluir fecha de despliegue/restauración (ticket #677) y +# correcion en eliminar imagen de cache de cliente (ticket #658) +ALTER TABLE ordenadores_particiones + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + MODIFY cache TEXT NOT NULL; + +# Mostrar disco en comandos Inventario de software e Iniciar sesión. +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;mac;dsk;par' + WHERE idcomando = 7; +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;dsk;par' + WHERE idcomando = 9; + +# Eliminar campos que ya no se usan (ticket #705). +ALTER TABLE repositorios + DROP pathrepoconf, + DROP pathrepod, + DROP pathpxe; +ALTER TABLE menus + DROP coorx, + DROP coory, + DROP scoorx, + DROP scoory; + diff --git a/admin/Database/ogAdmBD-1.0.2-1.0.5.sql b/admin/Database/ogAdmBD-1.0.2-1.0.6.sql index 65746893..4694c395 100644 --- a/admin/Database/ogAdmBD-1.0.2-1.0.5.sql +++ b/admin/Database/ogAdmBD-1.0.2-1.0.6.sql @@ -1,10 +1,11 @@ ### Fichero de actualización de la base de datos. -# OpenGnSys 1.0.2 - 1.0.5 +# OpenGnSys 1.0.2 - 1.0.6 #use ogAdmBD UPDATE entornos SET ipserveradm = 'SERVERIP' WHERE ipserveradm = '' LIMIT 1; -UPDATE parametros SET tipopa = '1' WHERE idparametro = 30; +# Mostrar protocolo de clonación en la cola de acciones (ticket #672) +UPDATE parametros SET tipopa = 0 WHERE idparametro = 30; UPDATE idiomas SET descripcion = 'English' WHERE ididioma = 2; UPDATE idiomas SET descripcion = 'Català' WHERE ididioma = 3; @@ -19,11 +20,8 @@ ALTER TABLE ordenadores_particiones ADD cache varchar(500), DROP INDEX idordenadornumpar, ADD UNIQUE idordenadornumdisknumpar(idordenador,numdisk,numpar); -ALTER TABLE imagenes - ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idrepositorio; # Nuevos tipos de particiones y particiones GPT. -ALTER TABLE imagenes MODIFY codpar int(8) NOT NULL; ALTER TABLE sistemasficheros MODIFY codpar int(8) NOT NULL; ALTER TABLE tipospar MODIFY codpar int(8) NOT NULL; INSERT INTO tipospar (codpar,tipopar,clonable) VALUES @@ -72,6 +70,12 @@ ALTER TABLE ordenadores ADD fotoord VARCHAR (250) NOT NULL; UPDATE aulas SET urlfoto = SUBSTRING_INDEX (urlfoto, '/', -1) WHERE urlfoto LIKE '%/%'; +# Internacionalización correcta de los asistentes. +UPDATE asistentes + SET descripcion = 'Asistente Deploy de Imagenes' WHERE descripcion = 'Asistente "Deploy" de Imagenes'; +UPDATE asistentes + SET descripcion = 'Asistente UpdateCache con Imagenes' WHERE descripcion = 'Asistente "UpdateCache" con Imagenes'; + # Añadir validación del cliente. ALTER TABLE aulas ADD validacion TINYINT(1) DEFAULT 0, @@ -103,6 +107,10 @@ INSERT INTO comandos (idcomando, descripcion, pagina, gestor, funcion, urlimg, a ALTER TABLE parametros ADD KEY (nemonico); INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, nomtabla, nomliteral, tipopa, visual) VALUES + (12, 'nci', 'Nombre canónico', '', '', '', 0, 1), + (21, 'sfi', 'Sistema de fichero', 'nemonico', 'sistemasficheros', 'nemonico', 1, 0), + (22, 'tam', 'Tamaño', '', '', '', 0, 1), + (30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 0, 1), (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), @@ -112,11 +120,18 @@ INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, no (37, 'met', 'Método clonación', ';', '', 'Desde caché; Desde repositorio', 3, 1), (38, 'nba', 'No borrar archivos en destino', '', '', '', 0, 1); -# Imágenes incrementales. +# Imágenes incrementales, soporte para varios discos y fecha de creación +# (tickets #565, #601 y #677). ALTER TABLE imagenes - ADD tipo TINYINT NULL, - ADD imagenid INT NOT NULL DEFAULT '0', - ADD ruta VARCHAR(250) NULL; + MODIFY idrepositorio INT(11) NOT NULL DEFAULT 0, + MODIFY numpar SMALLINT NOT NULL DEFAULT 0, + MODIFY codpar INT(8) NOT NULL DEFAULT 0, + ADD idordenador INT(11) NOT NULL DEFAULT 0 AFTER idrepositorio, + ADD numdisk SMALLINT NOT NULL DEFAULT 0 AFTER idordenador, + ADD tipo SMALLINT NULL, + ADD imagenid INT NOT NULL DEFAULT 0, + ADD ruta VARCHAR(250) NULL, + ADD fechacreacion DATETIME DEFAULT NULL; UPDATE imagenes SET tipo=1; # Cambio de tipo de grupo. @@ -192,3 +207,28 @@ ALTER TABLE ordenadores UPDATE ordenadores SET fotoord = SUBSTRING_INDEX(fotoord, '/', -1); +# Incluir fecha de despliegue/restauración (ticket #677) y +# correcion en eliminar imagen de cache de cliente (ticket #658) +ALTER TABLE ordenadores_particiones + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + MODIFY cache TEXT NOT NULL; + +# Mostrar disco en comandos Inventario de software e Iniciar sesión. +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;mac;dsk;par' + WHERE idcomando = 7; +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;dsk;par' + WHERE idcomando = 9; + +# Eliminar campos que ya no se usan (ticket #705). +ALTER TABLE repositorios + DROP pathrepoconf, + DROP pathrepod, + DROP pathpxe; +ALTER TABLE menus + DROP coorx, + DROP coory, + DROP scoorx, + DROP scoory; + diff --git a/admin/Database/ogAdmBD-1.0.2a-1.0.5.sql b/admin/Database/ogAdmBD-1.0.2a-1.0.6.sql index df905d5d..4f0f5345 100644 --- a/admin/Database/ogAdmBD-1.0.2a-1.0.5.sql +++ b/admin/Database/ogAdmBD-1.0.2a-1.0.6.sql @@ -1,5 +1,5 @@ ### Fichero de actualización de la base de datos. -# OpenGnSys 1.0.2a - 1.0.5 +# OpenGnSys 1.0.2a - 1.0.6 #use ogAdmBD UPDATE idiomas SET descripcion = 'English' WHERE ididioma = 2; @@ -18,11 +18,8 @@ ALTER TABLE ordenadores_particiones ADD cache varchar(500), DROP INDEX idordenadornumpar, ADD UNIQUE idordenadornumdisknumpar(idordenador,numdisk,numpar); -ALTER TABLE imagenes - ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idrepositorio; # Nuevos tipos de particiones y particiones GPT. -ALTER TABLE imagenes MODIFY codpar int(8) NOT NULL; ALTER TABLE sistemasficheros MODIFY codpar int(8) NOT NULL; ALTER TABLE tipospar MODIFY codpar int(8) NOT NULL; INSERT INTO tipospar (codpar,tipopar,clonable) VALUES @@ -102,6 +99,10 @@ INSERT INTO comandos (idcomando, descripcion, pagina, gestor, funcion, urlimg, a ALTER TABLE parametros ADD KEY (nemonico); INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, nomtabla, nomliteral, tipopa, visual) VALUES + (12, 'nci', 'Nombre canónico', '', '', '', 0, 1), + (21, 'sfi', 'Sistema de fichero', 'nemonico', 'sistemasficheros', 'nemonico', 1, 0), + (22, 'tam', 'Tamaño', '', '', '', 0, 1), + (30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 0, 1), (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), @@ -111,11 +112,18 @@ INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, no (37, 'met', 'Método clonación', ';', '', 'Desde caché; Desde repositorio', 3, 1), (38, 'nba', 'No borrar archivos en destino', '', '', '', 0, 1); -# Imágenes incrementales. +# Imágenes incrementales, soporte para varios discos y fecha de creación +# (tickets #565, #601 y #677). ALTER TABLE imagenes - ADD tipo TINYINT NULL, - ADD imagenid INT NOT NULL DEFAULT '0', - ADD ruta VARCHAR(250) NULL; + MODIFY idrepositorio INT(11) NOT NULL DEFAULT 0, + MODIFY numpar SMALLINT NOT NULL DEFAULT 0, + MODIFY codpar INT(8) NOT NULL DEFAULT 0, + ADD idordenador INT(11) NOT NULL DEFAULT 0 AFTER idrepositorio, + ADD numdisk SMALLINT NOT NULL DEFAULT 0 AFTER idordenador, + ADD tipo SMALLINT NULL, + ADD imagenid INT NOT NULL DEFAULT 0, + ADD ruta VARCHAR(250) NULL, + ADD fechacreacion DATETIME DEFAULT NULL; UPDATE imagenes SET tipo=1; # Cambio de tipo de grupo. @@ -180,6 +188,12 @@ INSERT INTO tipospar (codpar, tipopar, clonable) VALUES ON DUPLICATE KEY UPDATE codpar=VALUES(codpar), tipopar=VALUES(tipopar), clonable=VALUES(clonable); +# Internacionalización correcta de los asistentes. +UPDATE asistentes + SET descripcion = 'Asistente Deploy de Imagenes' WHERE descripcion = 'Asistente "Deploy" de Imagenes'; +UPDATE asistentes + SET descripcion = 'Asistente UpdateCache con Imagenes' WHERE descripcion = 'Asistente "UpdateCache" con Imagenes'; + # Añadir proxy para aulas. ALTER TABLE aulas ADD proxy VARCHAR(30) AFTER dns; @@ -191,3 +205,28 @@ ALTER TABLE ordenadores UPDATE ordenadores SET fotoord = SUBSTRING_INDEX(fotoord, '/', -1); +# Incluir fecha de despliegue/restauración (ticket #677) y +# correcion en eliminar imagen de cache de cliente (ticket #658) +ALTER TABLE ordenadores_particiones + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + MODIFY cache TEXT NOT NULL; + +# Mostrar disco en comandos Inventario de software e Iniciar sesión. +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;mac;dsk;par' + WHERE idcomando = 7; +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;dsk;par' + WHERE idcomando = 9; + +# Eliminar campos que ya no se usan (ticket #705). +ALTER TABLE repositorios + DROP pathrepoconf, + DROP pathrepod, + DROP pathpxe; +ALTER TABLE menus + DROP coorx, + DROP coory, + DROP scoorx, + DROP scoory; + diff --git a/admin/Database/ogAdmBD-1.0.3-1.0.5.sql b/admin/Database/ogAdmBD-1.0.3-1.0.6.sql index 663c6107..db4af9c1 100644 --- a/admin/Database/ogAdmBD-1.0.3-1.0.5.sql +++ b/admin/Database/ogAdmBD-1.0.3-1.0.6.sql @@ -1,23 +1,21 @@ ### Fichero de actualización de la base de datos. -# OpenGnSys 1.0.3 - 1.0.5 +# OpenGnSys 1.0.3 - 1.0.6 #use ogAdmBD # Añadir tipo de arranque Windows al perfil hardware. ALTER TABLE perfileshard ADD winboot enum( 'reboot', 'kexec' ) NOT NULL DEFAULT 'reboot'; -# Soportar particiones GPT y añadir información de caché. +# Soportar particiones GPT, añadir información de caché y fecha de despliegue. ALTER TABLE ordenadores_particiones MODIFY codpar int(8) NOT NULL, ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idordenador, - ADD cache varchar(500), + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + ADD cache TEXT NOT NULL; DROP INDEX idordenadornumpar, ADD UNIQUE idordenadornumdisknumpar(idordenador,numdisk,numpar); -ALTER TABLE imagenes - ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idrepositorio; # Nuevos tipos de particiones y particiones GPT. ALTER TABLE tipospar MODIFY codpar int(8) NOT NULL; -ALTER TABLE imagenes MODIFY codpar int(8) NOT NULL; ALTER TABLE sistemasficheros MODIFY codpar int(8) NOT NULL; INSERT INTO tipospar (codpar,tipopar,clonable) VALUES (6, 'FAT16', 1), @@ -61,12 +59,34 @@ INSERT INTO tipospar (codpar,tipopar,clonable) VALUES ON DUPLICATE KEY UPDATE codpar=VALUES(codpar), tipopar=VALUES(tipopar), clonable=VALUES(clonable); +# Añadir proxy para aulas. +ALTER TABLE aulas + ADD proxy VARCHAR(30) AFTER dns; + +# Valores por defecto para incorporar ordenadores (ticket #609). +ALTER TABLE ordenadores + ALTER fotoord SET DEFAULT 'fotoordenador.gif', + ALTER idproautoexec SET DEFAULT 0; +UPDATE ordenadores + SET fotoord = SUBSTRING_INDEX(fotoord, '/', -1); + +# Corregir errata en particiones vacías con número de partición asignado al código de partición. +UPDATE ordenadores_particiones + SET codpar = 0 + WHERE codpar = numpar AND tamano = 0; + # Añadir foto de ordenador. ALTER TABLE ordenadores ADD fotoord VARCHAR (250) NOT NULL; # Actualizar localización de foto de aula (eliminar el camino). UPDATE aulas SET urlfoto = SUBSTRING_INDEX (urlfoto, '/', -1) WHERE urlfoto LIKE '%/%'; +# Internacionalización correcta de los asistentes. +UPDATE asistentes + SET descripcion = 'Asistente Deploy de Imagenes' WHERE descripcion = 'Asistente "Deploy" de Imagenes'; +UPDATE asistentes + SET descripcion = 'Asistente UpdateCache con Imagenes' WHERE descripcion = 'Asistente "UpdateCache" con Imagenes'; + # Añadir validación del cliente. ALTER TABLE aulas ADD validacion TINYINT(1) DEFAULT 0, @@ -94,10 +114,14 @@ INSERT INTO comandos (idcomando, descripcion, pagina, gestor, funcion, urlimg, a parametros=VALUES(parametros), comentarios=VALUES(comentarios), activo=VALUES(activo), submenu=VALUES(submenu); -# Parámetros para los comandos nuevos. +# Actualizar y definir parámetros para los comandos nuevos. ALTER TABLE parametros ADD KEY (nemonico); INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, nomtabla, nomliteral, tipopa, visual) VALUES + (12, 'nci', 'Nombre canónico', '', '', '', 0, 1), + (21, 'sfi', 'Sistema de fichero', 'nemonico', 'sistemasficheros', 'nemonico', 1, 0), + (22, 'tam', 'Tamaño', '', '', '', 0, 1), + (30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 0, 1), (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), @@ -107,11 +131,18 @@ INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, no (37, 'met', 'Método clonación', ';', '', 'Desde caché; Desde repositorio', 3, 1), (38, 'nba', 'No borrar archivos en destino', '', '', '', 0, 1); -# Imágenes incrementales. +# Imágenes incrementales, soporte para varios discos y fecha de creación +# (tickets #565, #601 y #677). ALTER TABLE imagenes - ADD tipo TINYINT NULL, - ADD imagenid INT NOT NULL DEFAULT '0', - ADD ruta VARCHAR(250) NULL; + MODIFY idrepositorio INT(11) NOT NULL DEFAULT 0, + MODIFY numpar SMALLINT NOT NULL DEFAULT 0, + MODIFY codpar INT(8) NOT NULL DEFAULT 0, + ADD idordenador INT(11) NOT NULL DEFAULT 0 AFTER idrepositorio, + ADD numdisk SMALLINT NOT NULL DEFAULT 0 AFTER idordenador, + ADD tipo SMALLINT NULL, + ADD imagenid INT NOT NULL DEFAULT 0, + ADD ruta VARCHAR(250) NULL, + ADD fechacreacion DATETIME DEFAULT NULL; UPDATE imagenes SET tipo=1; # Cambio de tipo de grupo. @@ -168,13 +199,6 @@ INSERT INTO sistemasficheros (descripcion, nemonico) VALUES ('XFS', 'XFS') ON DUPLICATE KEY UPDATE descripcion=VALUES(descripcion), nemonico=VALUES(nemonico); -# Nuevas particiones marcadas como clonables. -INSERT INTO tipospar (codpar, tipopar, clonable) VALUES - (CONV('EF',16,10), 'EFI', 1), - (CONV('AB00',16,10), 'HFS-BOOT', 1), - (CONV('EF00',16,10), 'EFI', 1) - ON DUPLICATE KEY UPDATE - codpar=VALUES(codpar), tipopar=VALUES(tipopar), clonable=VALUES(clonable); # Añadir proxy para aulas. ALTER TABLE aulas @@ -192,3 +216,28 @@ UPDATE ordenadores_particiones SET codpar = 0 WHERE codpar = numpar AND tamano = 0; +# Incluir fecha de despliegue/restauración (ticket #677) y +# correcion en eliminar imagen de cache de cliente (ticket #658) +ALTER TABLE ordenadores_particiones + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + MODIFY cache TEXT NOT NULL; + +# Mostrar disco en comandos Inventario de software e Iniciar sesión. +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;mac;dsk;par' + WHERE idcomando = 7; +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;dsk;par' + WHERE idcomando = 9; + +# Eliminar campos que ya no se usan (ticket #705). +ALTER TABLE repositorios + DROP pathrepoconf, + DROP pathrepod, + DROP pathpxe; +ALTER TABLE menus + DROP coorx, + DROP coory, + DROP scoorx, + DROP scoory; + diff --git a/admin/Database/ogAdmBD-1.0.4-1.0.5.sql b/admin/Database/ogAdmBD-1.0.4-1.0.6.sql index 63cc14a4..dbe54d61 100644 --- a/admin/Database/ogAdmBD-1.0.4-1.0.5.sql +++ b/admin/Database/ogAdmBD-1.0.4-1.0.6.sql @@ -1,5 +1,5 @@ ### Fichero de actualización de la base de datos. -# OpenGnSys 1.0.4 - 1.0.5 +# OpenGnSys 1.0.4 - 1.0.6 #use ogAdmBD # Mejorar el rendimiento en acceso a la cola de acciones. @@ -43,10 +43,14 @@ INSERT INTO comandos (idcomando, descripcion, pagina, gestor, funcion, urlimg, a activo=VALUES(activo), submenu=VALUES(submenu); -# Parámetros para los comandos nuevos. +# Actualizar y definir parámetros para los comandos nuevos. ALTER TABLE parametros ADD KEY (nemonico); INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, nomtabla, nomliteral, tipopa, visual) VALUES + (12, 'nci', 'Nombre canónico', '', '', '', 0, 1), + (21, 'sfi', 'Sistema de fichero', 'nemonico', 'sistemasficheros', 'nemonico', 1, 0), + (22, 'tam', 'Tamaño', '', '', '', 0, 1), + (30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 0, 1), (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), @@ -56,12 +60,18 @@ INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, no (37, 'met', 'Método clonación', ';', '', 'Desde caché; Desde repositorio', 3, 1), (38, 'nba', 'No borrar archivos en destino', '', '', '', 0, 1); -# Imágenes incrementales y completar soporte para varios discos. +# Imágenes incrementales, soporte para varios discos y fecha de creación +# (tickets #565, #601 y #677). ALTER TABLE imagenes - ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idrepositorio, - ADD tipo TINYINT NULL, - ADD imagenid INT NOT NULL DEFAULT '0', - ADD ruta VARCHAR(250) NULL; + MODIFY idrepositorio INT(11) NOT NULL DEFAULT 0, + MODIFY numpar SMALLINT NOT NULL DEFAULT 0, + MODIFY codpar INT(8) NOT NULL DEFAULT 0, + ADD idordenador INT(11) NOT NULL DEFAULT 0 AFTER idrepositorio, + ADD numdisk SMALLINT NOT NULL DEFAULT 0 AFTER idordenador, + ADD tipo SMALLINT NULL, + ADD imagenid INT NOT NULL DEFAULT 0, + ADD ruta VARCHAR(250) NULL, + ADD fechacreacion DATETIME DEFAULT NULL; UPDATE imagenes SET tipo=1; # Cambio de tipo de grupo. @@ -142,4 +152,28 @@ UPDATE ordenadores_particiones SET codpar = 0 WHERE codpar = numpar AND tamano = 0; +# Incluir fecha de despliegue/restauración (ticket #677) y +# correcion en eliminar imagen de cache de cliente (ticket #658) +ALTER TABLE ordenadores_particiones + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + MODIFY cache TEXT NOT NULL; + +# Mostrar disco en comandos Inventario de software e Iniciar sesión. +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;mac;dsk;par' + WHERE idcomando = 7; +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;dsk;par' + WHERE idcomando = 9; + +# Eliminar campos que ya no se usan (ticket #705). +ALTER TABLE repositorios + DROP pathrepoconf, + DROP pathrepod, + DROP pathpxe; +ALTER TABLE menus + DROP coorx, + DROP coory, + DROP scoorx, + DROP scoory; diff --git a/admin/Database/ogAdmBD-1.0.4a-1.0.5.sql b/admin/Database/ogAdmBD-1.0.4a-1.0.6.sql index 4f228eb0..42d7acdd 100644 --- a/admin/Database/ogAdmBD-1.0.4a-1.0.5.sql +++ b/admin/Database/ogAdmBD-1.0.4a-1.0.6.sql @@ -1,5 +1,5 @@ ### Fichero de actualización de la base de datos. -# OpenGnSys 1.0.4a - 1.0.5 +# OpenGnSys 1.0.4a - 1.0.6 #use ogAdmBD # Añadir validación del cliente. @@ -29,10 +29,14 @@ INSERT INTO comandos (idcomando, descripcion, pagina, gestor, funcion, urlimg, a parametros=VALUES(parametros), comentarios=VALUES(comentarios), activo=VALUES(activo), submenu=VALUES(submenu); -# Parámetros para los comandos nuevos. +# Actualización y definición de parámetros para los comandos nuevos. ALTER TABLE parametros ADD KEY (nemonico); INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, nomtabla, nomliteral, tipopa, visual) VALUES + (12, 'nci', 'Nombre canónico', '', '', '', 0, 1), + (21, 'sfi', 'Sistema de fichero', 'nemonico', 'sistemasficheros', 'nemonico', 1, 0), + (22, 'tam', 'Tamaño', '', '', '', 0, 1), + (30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 0, 1), (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), @@ -42,12 +46,18 @@ INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, no (37, 'met', 'Método clonación', ';', '', 'Desde caché; Desde repositorio', 3, 1), (38, 'nba', 'No borrar archivos en destino', '', '', '', 0, 1); -# Imágenes incrementales y completar soporte para varios discos. +# Imágenes incrementales, soporte para varios discos y fecha de creación +# (tickets #565, #601 y #677). ALTER TABLE imagenes - ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idrepositorio, - ADD tipo TINYINT NULL, - ADD imagenid INT NOT NULL DEFAULT '0', - ADD ruta VARCHAR(250) NULL; + MODIFY idrepositorio INT(11) NOT NULL DEFAULT 0, + MODIFY numpar SMALLINT NOT NULL DEFAULT 0, + MODIFY codpar INT(8) NOT NULL DEFAULT 0, + ADD idordenador INT(11) NOT NULL DEFAULT 0 AFTER idrepositorio, + ADD numdisk SMALLINT NOT NULL DEFAULT 0 AFTER idordenador, + ADD tipo SMALLINT NULL, + ADD imagenid INT NOT NULL DEFAULT 0, + ADD ruta VARCHAR(250) NULL, + ADD fechacreacion DATETIME DEFAULT NULL; UPDATE imagenes SET tipo=1; # Cambio de tipo de grupo. @@ -134,3 +144,28 @@ UPDATE ordenadores_particiones SET codpar = 0 WHERE codpar = numpar AND tamano = 0; +# Incluir fecha de despliegue/restauración (ticket #677) y +# correccion en eliminar imagen de cache de cliente (ticket #658). +ALTER TABLE ordenadores_particiones + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + MODIFY cache TEXT NOT NULL; + +# Mostrar disco en comandos Inventario de software e Iniciar sesión. +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;mac;dsk;par' + WHERE idcomando = 7; +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;dsk;par' + WHERE idcomando = 9; + +# Eliminar campos que ya no se usan (ticket #705). +ALTER TABLE repositorios + DROP pathrepoconf, + DROP pathrepod, + DROP pathpxe; +ALTER TABLE menus + DROP coorx, + DROP coory, + DROP scoorx, + DROP scoory; + diff --git a/admin/Database/ogAdmBD-1.0.5-1.0.6.sql b/admin/Database/ogAdmBD-1.0.5-1.0.6.sql new file mode 100644 index 00000000..ada710d8 --- /dev/null +++ b/admin/Database/ogAdmBD-1.0.5-1.0.6.sql @@ -0,0 +1,44 @@ +### Fichero de actualización de la base de datos. +# OpenGnSys 1.0.5 - 1.0.6 +#use ogAdmBD + +# Incluir ordenador modelo y fecha de creación de imagen y +# establecer valores por defecto (ticket #677). +ALTER TABLE imagenes + MODIFY idrepositorio INT(11) NOT NULL DEFAULT 0, + MODIFY numdisk SMALLINT NOT NULL DEFAULT 0, + MODIFY numpar SMALLINT NOT NULL DEFAULT 0, + MODIFY codpar INT(8) NOT NULL DEFAULT 0, + ADD idordenador INT(11) NOT NULL DEFAULT 0 AFTER idrepositorio, + ADD fechacreacion DATETIME DEFAULT NULL; + +# Incluir fecha de despliegue/restauración de imagen (ticket #677) y +# correcion en eliminar imagen de cache de cliente (ticket #658). +ALTER TABLE ordenadores_particiones + ADD fechadespliegue DATETIME NULL AFTER idperfilsoft, + MODIFY cache TEXT NOT NULL; + +# Mostrar protocolo de clonación en la cola de acciones (ticket #672). +UPDATE parametros + SET tipopa = 0 + WHERE idparametro = 30; + +# Mostrar disco en comandos Inventario de software e Iniciar sesión. +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;mac;dsk;par' + WHERE idcomando = 7; +UPDATE comandos + SET visuparametros = 'dsk;par', parametros = 'nfn;iph;dsk;par' + WHERE idcomando = 9; + +# Eliminar campos que ya no se usan (ticket #705). +ALTER TABLE repositorios + DROP pathrepoconf, + DROP pathrepod, + DROP pathpxe; +ALTER TABLE menus + DROP coorx, + DROP coory, + DROP scoorx, + DROP scoory; + diff --git a/admin/Database/ogAdmBD-1.0.5pre-1.0.5.sql b/admin/Database/ogAdmBD-1.0.5pre-1.0.5.sql deleted file mode 100644 index bb3fa2c8..00000000 --- a/admin/Database/ogAdmBD-1.0.5pre-1.0.5.sql +++ /dev/null @@ -1,171 +0,0 @@ -### Procedimiento para actualización de la base de datos. -# OpenGnSys 1.0.5 -#use ogAdmBD - -# Eliminar procedimiento para evitar errores de ejecución. -DROP PROCEDURE IF EXISTS addcols; -# Procedimiento para actualización condicional de tablas. -delimiter '//' -CREATE PROCEDURE addcols() BEGIN - # Añadir validación del cliente. - IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS - WHERE COLUMN_NAME='validacion' AND TABLE_NAME='aulas' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE aulas - ADD validacion TINYINT(1) DEFAULT 0, - ADD paginalogin VARCHAR(100), - ADD paginavalidacion VARCHAR(100); - END IF; - IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS - WHERE COLUMN_NAME='validacion' AND TABLE_NAME='ordenadores' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE ordenadores - ADD validacion TINYINT(1) DEFAULT 0, - ADD paginalogin VARCHAR(100), - ADD paginavalidacion VARCHAR(100); - END IF; - # Submenú para comandos. - IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS - WHERE COLUMN_NAME='submenu' AND TABLE_NAME='comandos' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE comandos - ADD submenu VARCHAR(50) NOT NULL DEFAULT ''; - END IF; - # Añadir índice para mnemónicos de parámetros. - IF NOT EXISTS (SELECT * FROM information_schema.STATISTICS - WHERE COLUMN_NAME='nemonico' AND TABLE_NAME='parametros' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE parametros - ADD KEY (nemonico); - END IF; - # Añadir imágenes diferenciales. - IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS - WHERE COLUMN_NAME='tipo' AND TABLE_NAME='imagenes' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE imagenes - ADD tipo TINYINT NOT NULL DEFAULT 1, - ADD imagenid INT NOT NULL DEFAULT 0, - ADD ruta VARCHAR(250) NULL; - UPDATE grupos SET tipo=70 WHERE tipo=50; - END IF; - # Soporte completo para varios discos. - IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS - WHERE COLUMN_NAME='numdisk' AND TABLE_NAME='imagenes' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE imagenes - ADD numdisk smallint NOT NULL DEFAULT 1 AFTER idrepositorio; - ALTER TABLE ordenadores_particiones - MODIFY numdisk smallint NOT NULL, - MODIFY numpar smallint NOT NULL; - END IF; - # Comando Particionar y formatear. - IF NOT EXISTS (SELECT * FROM information_schema.STATISTICS - WHERE INDEX_NAME='descripcion' AND TABLE_NAME='sistemasficheros' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE sistemasficheros - ADD UNIQUE INDEX descripcion (descripcion); - END IF; - # Añadir proxy para aulas. - IF NOT EXISTS (SELECT * FROM information_schema.COLUMNS - WHERE COLUMN_NAME='proxy' AND TABLE_NAME='aulas' AND TABLE_SCHEMA=DATABASE()) - THEN - ALTER TABLE aulas - ADD proxy VARCHAR(30) AFTER dns; - END IF; -END// -# Ejecutar actualización condicional. -delimiter ';' -CALL addcols(); -DROP PROCEDURE addcols; - -# Nuevos comandos. -INSERT INTO comandos (idcomando, descripcion, pagina, gestor, funcion, urlimg, aplicambito, visuparametros, parametros, comentarios, activo, submenu) VALUES - (11, 'Eliminar Imagen Cache', '../comandos/EliminarImagenCache.php', '../comandos/gestores/gestor_Comandos.php', 'EliminarImagenCache', '', 31, 'iph;tis;dcr;scp', 'nfn;iph;tis;dcr;scp', '', 1, ''), - (12, 'Crear Imagen Basica', '../comandos/CrearImagenBasica.php', '../comandos/gestores/gestor_Comandos.php', 'CrearImagenBasica', '', 16, 'dsk;par;cpt;idi;nci;ipr;iph;bpi;cpc;bpc;rti;nba', 'nfn;dsk;par;cpt;idi;nci;ipr;iph;bpi;cpc;bpc;rti;nba', '', 1, 'Sincronizacion'), - (13, 'Restaurar Imagen Basica', '../comandos/RestaurarImagenBasica.php', '../comandos/gestores/gestor_Comandos.php', 'RestaurarImagenBasica', '', 28, 'dsk;par;idi;nci;ipr;iph;bpi;cpc;bpc;rti;nba;met', 'nfn;dsk;par;idi;nci;ipr;iph;bpi;cpc;bpc;rti;nba;met', '', 1, 'Sincronizacion'), - (14, 'Crear Software Incremental', '../comandos/CrearSoftIncremental.php', '../comandos/gestores/gestor_Comandos.php', 'CrearSoftIncremental', '', 16, 'dsk;par;idi;nci;ipr;idf;ncf;bpi;cpc;bpc;iph;rti;nba', 'nfn;dsk;par;idi;nci;ipr;idf;ncf;bpi;cpc;bpc;iph;rti;nba', '', 1, 'Sincronizacion'), - (15, 'Restaurar Software Incremental', '../comandos/RestaurarSoftIncremental.php', '../comandos/gestores/gestor_Comandos.php', 'RestaurarSoftIncremental', '', 28, 'dsk;par;idi;nci;ipr;idf;ncf;bpi;cpc;bpc;iph;rti;met;nba', 'nfn;dsk;par;idi;nci;ipr;idf;ncf;bpi;cpc;bpc;iph;rti;met;nba', '', 1, 'Sincronizacion') - ON DUPLICATE KEY UPDATE - descripcion=VALUES(descripcion), pagina=VALUES(pagina), - gestor=VALUES(gestor), funcion=VALUES(funcion), urlimg=VALUES(urlimg), - aplicambito=VALUES(aplicambito), visuparametros=VALUES(visuparametros), - parametros=VALUES(parametros), comentarios=VALUES(comentarios), - activo=VALUES(activo), submenu=VALUES(submenu); - -# Parámetros para los comandos nuevos. -INSERT INTO parametros (idparametro, nemonico, descripcion, nomidentificador, nomtabla, nomliteral, tipopa, visual) VALUES - (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), - (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), - (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), - (34, 'cpc', 'Copiar también en cache', '', '', '', 5, 1), - (35, 'bpc', 'Borrado previo de la imagen en cache', '', '', '', 5, 1), - (36, 'rti', 'Ruta de origen', '', '', '', 0, 1), - (37, 'met', 'Método clonación', ';', '', 'Desde caché; Desde repositorio', 3, 1), - (38, 'nba', 'No borrar archivos en destino', '', '', '', 0, 1) - ON DUPLICATE KEY UPDATE - nemonico=VALUES(nemonico), descripcion=VALUES(descripcion), - nomidentificador=VALUES(nomidentificador), nomtabla=VALUES(nomtabla), - nomliteral=VALUES(nomliteral), tipopa=VALUES(tipopa), visual=VALUES(visual); - -# Actualizar menús para nuevo parámetro "video" del Kernel, que sustituye a "vga" (ticket #573). -ALTER TABLE menus - MODIFY resolucion VARCHAR(50) DEFAULT NULL; -#UPDATE menus -# SET resolucion = CASE resolucion -# WHEN '355' THEN 'uvesafb:1152x864-16' -# WHEN '788' THEN 'uvesafb:800x600-16' -# WHEN '789' THEN 'uvesafb:800x600-24' -# WHEN '791' THEN 'uvesafb:1024x768-16' -# WHEN '792' THEN 'uvesafb:1024x768-24' -# WHEN '794' THEN 'uvesafb:1280x1024-16' -# WHEN '795' THEN 'uvesafb:1280x1024-24' -# WHEN '798' THEN 'uvesafb:1600x1200-16' -# WHEN '799' THEN 'uvesafb:1600x1200-24' -# WHEN NULL or '0' THEN 'uvesafb:800x600-16' -# ELSE resolucion -# END; - -# Cambios para NetBoot con ficheros dinámicos (tickets #534 #582). -DROP TABLE IF EXISTS menuboot; -DROP TABLE IF EXISTS itemboot; -DROP TABLE IF EXISTS menuboot_itemboot; -ALTER TABLE ordenadores - MODIFY arranque VARCHAR(30) NOT NULL DEFAULT '00unknown'; -UPDATE ordenadores SET arranque = '01' WHERE arranque = '1'; -UPDATE ordenadores SET arranque = '19pxeadmin' WHERE arranque = 'pxeADMIN'; - -# Habilitar el comando Particionar y formatear. -UPDATE comandos SET activo = '1' WHERE idcomando = 10; -INSERT INTO sistemasficheros (descripcion, nemonico) VALUES - ('EMPTY', 'EMPTY'), - ('CACHE', 'CACHE'), - ('BTRFS', 'BTRFS'), - ('EXT2', 'EXT2'), - ('EXT3', 'EXT3'), - ('EXT4', 'EXT4'), - ('FAT12', 'FAT12'), - ('FAT16', 'FAT16'), - ('FAT32', 'FAT32'), - ('HFS', 'HFS'), - ('HFSPLUS', 'HFSPLUS'), - ('JFS', 'JFS'), - ('NTFS', 'NTFS'), - ('REISERFS', 'REISERFS'), - ('REISER4', 'REISER4'), - ('UFS', 'UFS'), - ('XFS', 'XFS'), - ('EXFAT', 'EXFAT') - ON DUPLICATE KEY UPDATE - descripcion=VALUES(descripcion), nemonico=VALUES(nemonico); -INSERT INTO tipospar (codpar, tipopar, clonable) VALUES - (CONV('EF',16,10), 'EFI', 1), - (CONV('AB00',16,10), 'HFS-BOOT', 1), - (CONV('EF00',16,10), 'EFI', 1) - ON DUPLICATE KEY UPDATE - codpar=VALUES(codpar), tipopar=VALUES(tipopar), clonable=VALUES(clonable); - -# Valores por defecto para incorporar ordenadores (ticket #609). -ALTER TABLE ordenadores - ALTER fotoord SET DEFAULT 'fotoordenador.gif', - ALTER idproautoexec SET DEFAULT 0; - diff --git a/admin/Database/ogAdmBD-1.0.5-postinst.sql b/admin/Database/ogAdmBD-1.0.6-postinst.sql index 8b2e7be6..8b2e7be6 100644 --- a/admin/Database/ogAdmBD-1.0.5-postinst.sql +++ b/admin/Database/ogAdmBD-1.0.6-postinst.sql diff --git a/admin/Database/ogAdmBD.sql b/admin/Database/ogAdmBD.sql index ff7507e7..cdfcf536 100644 --- a/admin/Database/ogAdmBD.sql +++ b/admin/Database/ogAdmBD.sql @@ -1,11 +1,4 @@ --- phpMyAdmin SQL Dump --- version 3.2.2.1deb1 --- http://www.phpmyadmin.net --- --- Servidor: localhost --- Tiempo de generación: 20-09-2010 a las 22:43:50 --- Versión del servidor: 5.1.37 --- Versión de PHP: 5.2.10-2ubuntu6.4 +-- Fichero de instalación de la base de datos. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; @@ -225,9 +218,9 @@ INSERT INTO `comandos` (`idcomando`, `descripcion`, `pagina`, `gestor`, `funcion (4, 'Crear Imagen', '../comandos/CrearImagen.php', '../comandos/gestores/gestor_Comandos.php', 'CrearImagen', '', 16, 'dsk;par;idi;nci;ipr;cpt', 'nfn;iph;mac;dsk;par;idi;nci;ipr;cpt;', '', 1, ''), (5, 'Reiniciar', '../comandos/Reiniciar.php', '../comandos/gestores/gestor_Comandos.php', 'Reiniciar', '', 31, '', 'nfn;iph;mac;', '', 1, ''), (6, 'Inventario Hardware', '../comandos/InventarioHardware.php', '../comandos/gestores/gestor_Comandos.php', 'InventarioHardware', '', 16, '', 'nfn;iph;mac;', '', 1, ''), -(7, 'Inventario Software', '../comandos/InventarioSoftware.php', '../comandos/gestores/gestor_Comandos.php', 'InventarioSoftware', '', 16, 'par', 'nfn;iph;mac;par', '', 1, ''), +(7, 'Inventario Software', '../comandos/InventarioSoftware.php', '../comandos/gestores/gestor_Comandos.php', 'InventarioSoftware', '', 16, 'dsk;par', 'nfn;iph;mac;dsk;par', '', 1, ''), (8, 'Ejecutar Script', '../comandos/EjecutarScripts.php', '../comandos/gestores/gestor_Comandos.php', 'EjecutarScript', '', 31, 'iph;tis;dcr;scp', 'nfn;iph;tis;dcr;scp', '', 1, ''), -(9, 'Iniciar Sesion', '../comandos/IniciarSesion.php', '../comandos/gestores/gestor_Comandos.php', 'IniciarSesion', '', 31, 'par', 'nfn;iph;par', '', 1, ''), +(9, 'Iniciar Sesion', '../comandos/IniciarSesion.php', '../comandos/gestores/gestor_Comandos.php', 'IniciarSesion', '', 31, 'dsk;par', 'nfn;iph;dsk;par', '', 1, ''), (10, 'Particionar y Formatear', '../comandos/Configurar.php', '../comandos/gestores/gestor_Comandos.php', 'Configurar', '', 28, 'dsk;cfg;', 'nfn;iph;mac;dsk;cfg;par;cpt;sfi;tam;ope', '', 1, ''), (11, 'Eliminar Imagen Cache', '../comandos/EliminarImagenCache.php', '../comandos/gestores/gestor_Comandos.php', 'EliminarImagenCache', '', 31, 'iph;tis;dcr;scp', 'nfn;iph;tis;dcr;scp', '', 1, ''), (12, 'Crear Imagen Basica', '../comandos/CrearImagenBasica.php', '../comandos/gestores/gestor_Comandos.php', 'CrearImagenBasica', '', 16, 'dsk;par;cpt;idi;nci;ipr;iph;bpi;cpc;bpc;rti;nba', 'nfn;dsk;par;cpt;idi;nci;ipr;iph;bpi;cpc;bpc;rti;nba', '', 1, 'Sincronizacion'), @@ -421,13 +414,15 @@ CREATE TABLE IF NOT EXISTS `imagenes` ( `idcentro` int(11) DEFAULT NULL, `comentarios` text, `grupoid` int(11) DEFAULT NULL, - `idrepositorio` int(11) NOT NULL, - `numdisk` smallint NOT NULL DEFAULT 1, - `numpar` smallint NOT NULL, - `codpar` int(8) NOT NULL, + `idrepositorio` int(11) NOT NULL DEFAULT 0, + `idordenador` int(11) NOT NULL DEFAULT 0, + `numdisk` smallint NOT NULL DEFAULT 0, + `numpar` smallint NOT NULL DEFAULT 0, + `codpar` int(8) NOT NULL DEFAULT 0, `tipo` tinyint NULL, - `imagenid` int NOT NULL DEFAULT '0', + `imagenid` int NOT NULL DEFAULT 0, `ruta` varchar(250) NULL, + `fechacreacion` datetime DEFAULT NULL, PRIMARY KEY (`idimagen`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; @@ -443,11 +438,7 @@ CREATE TABLE IF NOT EXISTS `menus` ( `idcentro` int(11) NOT NULL DEFAULT '0', `idurlimg` int(11) NOT NULL DEFAULT '0', `titulo` varchar(250) DEFAULT NULL, - `coorx` int(11) DEFAULT NULL, - `coory` int(11) DEFAULT NULL, `modalidad` tinyint(4) DEFAULT NULL, - `scoorx` int(11) DEFAULT NULL, - `scoory` int(11) DEFAULT NULL, `smodalidad` tinyint(4) DEFAULT NULL, `comentarios` text, `grupoid` int(11) NOT NULL DEFAULT '0', @@ -518,7 +509,8 @@ CREATE TABLE IF NOT EXISTS `ordenadores_particiones` ( `idnombreso` smallint(11) NOT NULL, `idimagen` int(11) NOT NULL, `idperfilsoft` int(11) NOT NULL, - `cache` varchar(500) NOT NULL, + `fechadespliegue` datetime NULL, + `cache` text NOT NULL, UNIQUE KEY `idordenadornumdisknumpar` (`idordenador`,`numdisk`,`numpar`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; @@ -574,7 +566,7 @@ INSERT INTO `parametros` (`idparametro`, `nemonico`, `descripcion`, `nomidentifi (26, 'sft', 'Nombre del archivo de inventario software enviado por la red', '', '', '', 0, 0), (27, 'tpc', 'Tipo de cliente', '', '', '', 0, 0), (28, 'scp', 'Código script', '', '', '', 4, 1), -(30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 1, 1), +(30, 'ptc', 'Protocolo de clonación', ';', '', ';Unicast;Multicast;Torrent', 0, 1), (31, 'idf', 'Imagen Incremental', 'idimagen', 'imagenes', 'descripcion', 1, 1), (32, 'ncf', 'Nombre canónico de la Imagen Incremental', '', '', '', 0, 1), (33, 'bpi', 'Borrar imagen o partición previamente', '', '', '', 5, 1), @@ -737,9 +729,6 @@ CREATE TABLE IF NOT EXISTS `repositorios` ( `nombrerepositorio` varchar(250) NOT NULL, `ip` varchar(15) NOT NULL DEFAULT '', `passguor` varchar(50) NOT NULL DEFAULT '', - `pathrepoconf` varchar(250) NOT NULL, - `pathrepod` varchar(250) NOT NULL, - `pathpxe` varchar(250) NOT NULL, `idcentro` int(11) DEFAULT NULL, `grupoid` int(11) DEFAULT NULL, `comentarios` text, @@ -747,8 +736,8 @@ CREATE TABLE IF NOT EXISTS `repositorios` ( PRIMARY KEY (`idrepositorio`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -INSERT INTO `repositorios` (`idrepositorio`,`nombrerepositorio`,`ip`,`passguor`,`pathrepoconf`,`pathrepod`,`pathpxe`,`idcentro`,`grupoid`,`comentarios`,`puertorepo`) VALUES - (1,'Repositorio (Default)','SERVERIP','','','/opt/opengnsys/admin','/opt/opengnsys/tftpboot/pxelinux.cfg',1,0,'',2002); +INSERT INTO `repositorios` (`idrepositorio`,`nombrerepositorio`,`ip`,`passguor`,`idcentro`,`grupoid`,`comentarios`,`puertorepo`) VALUES + (1,'Repositorio (Default)','SERVERIP','',1,0,'',2002); -- -------------------------------------------------------- diff --git a/admin/Interface/Configurar b/admin/Interface/Configurar index a10143f3..18a68ebf 100755 --- a/admin/Interface/Configurar +++ b/admin/Interface/Configurar @@ -67,83 +67,85 @@ IFS='%' read -a TBPRM <<<"$sparam" maxp=0 for ((i=0; i<${#TBPRM[@]}; i++)); do - # Leer datos de la partición, separados por "*". - unset par - IFS='*' read -a CFG <<<"${TBPRM[i]}" 2>/dev/null - [[ ${CFG} =~ = ]] && eval ${CFG[@]} # Comprobar asignación antes de exportar valores. - # Saltar si no existe definición de partición. - if [ -n "$par" -a $par != 0 ]; then - # Componer datos de particionado. - TBP[par]="$cpt:$tam" - # Si se activa operación de formatear, componer datos de formateo. - if [ "$ope" == 1 ]; then - TBF[par]="$sfi" - else - TBF[par]="EMPTY" - fi - # Obtener la partición mayor por si hay que rellenar con valores EMPTY. - [ $par -gt $maxp ] && maxp=$par - fi + # Leer datos de la partición, separados por "*". + unset par + IFS='*' read -a CFG <<<"${TBPRM[i]}" 2>/dev/null + [[ ${CFG} =~ = ]] && eval ${CFG[@]} # Comprobar asignación antes de exportar valores. + # Componer datos de particionado. + if [ "$cpt" != "CACHE" ]; then + TBP[par]="$cpt:$tam" + fi + # Si se activa operación de formatear, componer datos de formateo. + if [ "$ope" == 1 ]; then + # Comprobamos que la particion y el s.f sean validos. + ogCheckStringInGroup $cpt "EMPTY EXTENDED LINUX-SWAP LINUX-LVM" + [ $? -ne 0 ] && TBF[par]="$sfi" + fi + # Obtener la partición mayor. + [ $par -gt $maxp ] && maxp=$par done - -# Control de datos. -for ((par=1; par<=maxp; par++)); do - # Ignorar partición 4 si existe caché. - if [ $che != 1 -o $par -ne 4 ]; then - # Rellenar con "EMPTY:0" la configuración de particiones no definidas. - [ -z "${TBP[par]}" ] && TBP[par]="EMPTY:0" - fi - # Ignorar formateo en particiones que no soportan sistemas de archivos. - case "${TBP[par]%:*}" in - ""|EMPTY|EXTENDED|LINUX-SWAP|LINUX-LVM) - TBF[par]="EMPTY" ;; - esac -done - #____________________________________________________ # # Proceso #____________________________________________________ +# Tamaño actual de la cache +CACHESIZE=$(ogGetCacheSize) # Desmonta todas las particiones y la caché -ogUnmountCache + +ogEcho session log "[10] $MSG_HELP_ogUnmountAll" ogUnmountAll $dis &>/dev/null +ogUnmountCache # Elimina la tabla de particiones -ogDeletePartitionTable $dis -ogUpdatePartitionTable $dis | tee -a $OGLOGSESSION $OGLOGFILE +ogDeletePartitionTable $dis +ogExecAndLog COMMAND ogUpdatePartitionTable $dis # Crea tabla de particiones MSDOS (NOTA: adaptar para tablas GPT). -ogCreatePartitionTable $dis MSDOS +ogCreatePartitionTable $dis MSDOS -# Cuestión caché -if [ "$che" == "1" ]; then - initCache $tch >/dev/null | tee -a $OGLOGSESSION $OGLOGFILE +# Inicia la cache. +if echo "$sparam" |grep "CACHE" >/dev/null; then + ogEcho session log "[30] $MSG_HELP_ogCreateCache" + ogEcho session log " initCache $tch" + ogExecAndLog COMMAND initCache $tch fi # Definir particionado. -ogCreatePartitions $dis ${TBP[@]} | tee -a $OGLOGSESSION $OGLOGFILE -ogUpdatePartitionTable $dis | tee -a $OGLOGSESSION $OGLOGFILE +ogEcho session log "[50] $MSG_HELP_ogCreatePartitions" +ogEcho session log " ogCreatePartitions $dis ${TBP[@]}" +ogExecAndLog COMMAND ogCreatePartitions $dis ${TBP[@]} +if [ $? -ne 0 ]; then + kill $COPROC_PID + exit $(ogRaiseError session log $OG_ERR_GENERIC "ogCreatePartitions $dis ${TBP[@]}") +fi +ogExecAndLog COMMAND ogUpdatePartitionTable $dis -RETVAL=$? -if [ $RETVAL -ne 0 ]; then - kill $COPROC_PID - exit $RETVAL -fi +# Formatear particiones +ogEcho session log "[70] $MSG_HELP_ogFormat" -# Formatear particiones, excepto las marcadas como "EMPTY". for ((par=1; par<=$maxp; par++)); do - sfi="${TBF[par]}" - if [ "$sfi" != "EMPTY" ]; then - ogFormatFs $dis $par $sfi | tee -a $OGLOGSESSION $OGLOGFILE - RETVAL=$? - if [ $RETVAL -ne 0 ]; then - kill $COPROC_PID - exit $OG_ERR_PARTITION - fi - fi -done + case "${TBF[par]}" in + CACHE) # Si el tamaño es distinto ya se ha formateado. + if [ "$CACHESIZE" == $tch ]; then + ogEcho session log " ogFormatCache" + ogExecAndLog COMMAND ogFormatCache + fi + ;; + "") ;; + *) ogEcho session log " ogFormatFs $dis $par ${TBF[par]}" + ogExecAndLog COMMAND ogFormatFs $dis $par ${TBF[par]} + if [ $? -ne 0 ]; then + kill $COPROC_PID + exit $(ogRaiseError session log $OG_ERR_GENERIC "ogFormatFs $dis $par ${TBF[par]}"); + fi + ;; + esac +done +RETVAL=$? +# Registro de fin de ejecución +ogEcho log session "$MSG_INTERFACE_END $RETVAL" #___________________________________________________________________ # diff --git a/admin/Interface/CrearImagen b/admin/Interface/CrearImagen index ca642845..c3fa9b45 100755 --- a/admin/Interface/CrearImagen +++ b/admin/Interface/CrearImagen @@ -51,14 +51,6 @@ if [ "$CALLER" != "ogAdmClient" ]; then exit $? fi -# Si el origen(pariticion) esta bloqueada salir. - -#if ogIsLocked $1 $2; then -# ogRaiseError $OG_ERR_LOCKED "$MSG_PARTITION, $1 $2" -# exit $? -#fi - - # Valor por defecto para el repositorio. REPO=${4:-"REPO"} [ "$REPO" == "$(ogGetRepoIp)" ] && REPO="REPO" @@ -73,25 +65,17 @@ then [ $RETVAL -gt 0 ] && exit $RETVAL fi - - -if [ -f createImage$ogengine ]; then - createImage$ogengine "$1" "$2" "$REPO" /"$3" &>> $OGLOGCOMMAND +# Si existe, ejecuta script personalizado "createImageCustom"; si no, llama al genérico "createImage". +if which createImageCustom &>/dev/null; then + createImageCustom "$1" "$2" "$REPO" /"$3" &>> $OGLOGCOMMAND else createImage "$1" "$2" "$REPO" /"$3" &>> $OGLOGCOMMAND fi RETVAL=$? +# Cambiar acceso a modo usuario, si es necesario. [ "$REPO" == "REPO" -a "$boot" != "admin" ] && CambiarAcceso user -#if [ $RETVAL == 0 ] -#then -#rm $OGLOGFILE -# touch $OGLOGFILE -#else -# echo $RETVAL &>> $OGLOGFILE -#fi - # Registro de fin de ejecución ogEcho log session "$MSG_INTERFACE_END $RETVAL" diff --git a/admin/Interface/EjecutarScript b/admin/Interface/EjecutarScript index 50b54a56..26453ed4 100755 --- a/admin/Interface/EjecutarScript +++ b/admin/Interface/EjecutarScript @@ -31,7 +31,8 @@ if [ $RETVAL == 0 ] then ogEcho log session "[100] Duracion de la operacion $[TIME/60]m $[TIME%60]s" else - ogEcho log session "ERROR: operacion no realizada" + ogRaiseError log session $RETVAL + ogEcho log session error "Operacion no realizada" fi diff --git a/admin/Interface/RestaurarImagen b/admin/Interface/RestaurarImagen index 7e714ba3..6f9ae244 100755 --- a/admin/Interface/RestaurarImagen +++ b/admin/Interface/RestaurarImagen @@ -3,17 +3,13 @@ # # PARAMETROS RECIBIDOS DESDE EL CLIENTE: # $1 disco -# $2 par=N�mero de particion -# $3 Nombre can�nico de la imagen -# $4 Direcci�n IP del repositorio +# $2 par=Número de particion +# $3 Nombre canónico de la imagen +# $4 Dirección IP del repositorio # $5 Protocolo UNICAST MULTICAST TORRENT # $6 Opciones del protocolo #_______________________________________________________________________________________________________________________________ -# Si existe, ejecuta script personalizado "deployImageCustom"; si no, llama al genérico "deployImage". -if which deployImageCustom &>/dev/null; then - deployImageCustom "$4" "$3" "$1" "$2" "$5" "$6" "$7" "$8" || exit $? -else - deployImage "$4" "$3" "$1" "$2" "$5" "$6" "$7" "$8" || exit $? -fi +# Llamar al script de despliegue "deployImage". +deployImage "$4" "$3" "$1" "$2" "$5" "$6" "$7" "$8" || exit $? diff --git a/admin/Interface/getConfiguration b/admin/Interface/getConfiguration index 2bfdaeeb..0979986d 100755 --- a/admin/Interface/getConfiguration +++ b/admin/Interface/getConfiguration @@ -17,6 +17,7 @@ for ((dsk=1; dsk<=$disks; dsk++)); do case "$ptt" in MSDOS) ptt=1 ;; GPT) ptt=2 ;; + LVM) ptt=3 ;; *) ptt=0 ;; esac # Información de disco (partición 0) @@ -31,8 +32,8 @@ for ((dsk=1; dsk<=$disks; dsk++)); do tam=$(ogGetPartitionSize $dsk $par 2>/dev/null) tam=${tam:-"0"} # Sistema operativo instalado - case "$cod" in - ""|82|8200|A502|BF02|EE) + case "$fsi" in + ""|EMPTY|CACHE|LINUX-SWAP|LINUX-LVM) soi="" ;; *) soi=$(getOsVersion $dsk $par 2>/dev/null | cut -f2 -d:) # Sistema de archivos para datos (sistema operativo "DATA") diff --git a/admin/Sources/Clients/ogAdmClient/Makefile b/admin/Sources/Clients/ogAdmClient/Makefile index a79855e3..d3628c9d 100644 --- a/admin/Sources/Clients/ogAdmClient/Makefile +++ b/admin/Sources/Clients/ogAdmClient/Makefile @@ -8,8 +8,8 @@ DIRS := LIBS := -static # Opciones de compilacion -#OPCS := -m32 -O0 -g -Wall # Depuracion -OPCS := -m32 -O3 -Wall # Optimizacion +OPCS := -m32 -O0 -g -Wall # Depuracion +#OPCS := -m32 -O3 -Wall # Optimizacion # Ficheros objetos OBJS := sources/ogAdmClient.o @@ -17,14 +17,11 @@ OBJS := sources/ogAdmClient.o all: $(PROYECTO) $(PROYECTO): $(OBJS) - g++ $(OPCS) $(DIRS) $(LIBS) $(OBJS) -o $(PROYECTO) - strip $(PROYECTO) # Optimizacion + gcc $(OPCS) $(DIRS) $(LIBS) $(OBJS) -o $(PROYECTO) +# strip $(PROYECTO) # Optimizacion clean: - rm $(PROYECTO) $(OBJS) - -sources/%.o: sources/%.cpp - g++ $(OPCS) -c -o"$@" "$<" + rm -f $(PROYECTO) $(OBJS) sources/%.o: sources/%.c gcc $(OPCS) -I ../../Includes -c -o"$@" "$<" diff --git a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c b/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c index 8e4ed5d8..64d5cc6e 100644 --- a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c +++ b/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.c @@ -452,15 +452,13 @@ BOOLEAN cuestionCache(char* tam) // ________________________________________________________________________________________________________
int cargaPaginaWeb(char *url)
{
+ pid_t pidbrowser; // Identificador del proceso que se crea para mostrar una pgina web con el browser
int resul=0;
char* argumentos[4];
char modulo[] = "cargaPaginaWeb()";
- if(pidbash>0)
- kill(pidbash,SIGQUIT); // Destruye el proceso hijo del proceso bash si existiera una conmutacin
-
- if(pidbrowser>0)
- kill(pidbrowser,SIGQUIT); // Destruye el proceso hijo anterior y se queda slo el actual
+ // Destruye los procesos del Browser y lanza uno nuevo.
+ system("pkill -9 browser");
sprintf(interface,"/opt/opengnsys/bin/browser");
sprintf(parametros,"browser -qws %s",url);
@@ -1227,6 +1225,7 @@ BOOLEAN CrearImagen(TRAMA* ptrTrama) initParametros(ptrTrama,0);
lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagen");
lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
+ lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin de donde se cre
lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o cdigo de particin
lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se aloj
@@ -1312,6 +1311,7 @@ BOOLEAN CrearImagenBasica(TRAMA* ptrTrama) initParametros(ptrTrama,0);
lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearImagenBasica");
lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
+ lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin de donde se cre
lon+=sprintf(ptrTrama->parametros+lon,"cpt=%s\r",cpt); // Tipo o cdigo de particin
lon+=sprintf(ptrTrama->parametros+lon,"ipr=%s\r",ipr); // Ip del repositorio donde se aloj
@@ -1412,6 +1412,7 @@ BOOLEAN CrearSoftIncremental(TRAMA* ptrTrama) initParametros(ptrTrama,0);
lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_CrearSoftIncremental");
lon+=sprintf(ptrTrama->parametros+lon,"idf=%s\r",idf); // Identificador de la imagen incremental
+ lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
respuestaEjecucionComando(ptrTrama,herror,ids);
@@ -1487,6 +1488,7 @@ BOOLEAN RestaurarImagen(TRAMA* ptrTrama) initParametros(ptrTrama,0);
lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagen");
lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
+ lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
respuestaEjecucionComando(ptrTrama,herror,ids);
@@ -1567,6 +1569,7 @@ BOOLEAN RestaurarImagenBasica(TRAMA* ptrTrama) initParametros(ptrTrama,0);
lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarImagenBasica");
lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idi); // Identificador de la imagen
+ lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
respuestaEjecucionComando(ptrTrama,herror,ids);
@@ -1660,6 +1663,7 @@ BOOLEAN RestaurarSoftIncremental(TRAMA* ptrTrama) initParametros(ptrTrama,0);
lon=sprintf(ptrTrama->parametros,"nfn=%s\r","RESPUESTA_RestaurarSoftIncremental");
lon+=sprintf(ptrTrama->parametros+lon,"idi=%s\r",idf); // Identificador de la imagen incremental (Forzada a idi)
+ lon+=sprintf(ptrTrama->parametros+lon,"dsk=%s\r",dsk); // Nmero de disco
lon+=sprintf(ptrTrama->parametros+lon,"par=%s\r",par); // Nmero de particin
lon+=sprintf(ptrTrama->parametros+lon,"ifs=%s\r",ifs); // Identificador del perfil software
diff --git a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h b/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h index 357059fa..9539afbf 100644 --- a/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h +++ b/admin/Sources/Clients/ogAdmClient/sources/ogAdmClient.h @@ -41,8 +41,6 @@ int herror; BOOLEAN CMDPTES; // Para bucle de comandos pendientes -pid_t pidbrowser; // Identificador del proceso que se crea para mostrar una página web con el browser -pid_t pidbash; // Identificador del proceso que se crea cuando se conmuta el browser char urlmenu[MAXLONURL]; // Url de la pagina de menu para el browser char urlmsg[MAXLONURL]; // Url de la página de mensajed para el browser @@ -88,7 +86,7 @@ char* tbErroresScripts[]={"Se han generado errores desconocidos. No se puede con "029-Error no definido",\ "030-Error al restaurar imagen - Imagen mas grande que particion",\ "031-Error al realizar el comando updateCache",\ - "032-Error no definido",\ + "032-Error al formatear",\ "033-Error no definido",\ "034-Error no definido",\ "035-Error no definido",\ diff --git a/admin/Sources/Services/ogAdmRepoAux b/admin/Sources/Services/ogAdmRepoAux index 4d245daf..4e922e1a 100755 --- a/admin/Sources/Services/ogAdmRepoAux +++ b/admin/Sources/Services/ogAdmRepoAux @@ -23,11 +23,11 @@ REPODIR="$BASEDIR/images/" # Para las sincronizadas # BACKUP: Define si se realiza copia de seguridad al crear una imagen (true|false). -eval $(grep BACKUP $BASEDIR/client/etc/engine.cfg) -# FS segun kernel. ext4 para < 3.7, para >= BTRFS +# IMGFS: Sistema de ficheros al crear las sincronizadas tipo archivo (EXT4|BTRFS). +[ -z $OGENGINECONFIGURATE ] && source $BASEDIR/client/etc/engine.cfg +# FS segun la configuracion y la version del kernel. ext4 para < 3.7, para >= BTRFS KERNEL=$(file -bkr /opt/opengnsys/tftpboot/ogclient/ogvmlinuz |awk '/Linux/ {for(i=1;i<=NF;i++) if($i~/version/) {v=$(i+1);printf("%d",v);sub(/[0-9]*\./,"",v);printf(".%02d",v)}}') -[ $KERNEL \< 3.07 ] && IMGFS="EXT4" || IMGFS="BTRFS" - +[ $KERNEL \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"} # Añade registro de incidencias. function echolog () { @@ -46,14 +46,18 @@ function mountImage () { [ "$3" != "" ] && OPTMOUNT=" -o $3 " # Si está montado nada que hacer df |grep "$2$" 2>&1 >/dev/null && return 0 - if [ $IMGFS == "EXT4" ]; then + # FS de la imagen segun el contenido del archivo .img + if file "$1" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then echolog "mount $OPTMOUNT -t ext4 $1 $2" mount $OPTMOUNT -t ext4 $1 $2 else echolog "mount $OPTMOUNT -o compress=lzo $1 $2" mount $OPTMOUNT -o compress=lzo "$1" "$2" fi - return $? + # Si esta montado da error 32, lo damos como bueno + RETVAL=$? + [ $RETVAL -eq 32 ] && RETVAL=0 + return $RETVAL } mkdir -p $MCASTLOGBASE @@ -137,8 +141,8 @@ case "$PARM1" in echolog "Redimensionamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED" echolog "truncate --size=\">$SIZEREQUIRED\"k $IMGFILE" truncate --size=">$SIZEREQUIRED"k $IMGFILE 2>&1 > $REPOLOG - # Montamos la imagen, si da error nos salimos - if [ $IMGFS == "EXT4" ]; then + # FS de la imagen segun el contenido del archivo .img + if file "$IMGFILE" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then losetup $LOOPDEVICE "$IMGFILE" echolog "resize2fs -f $LOOPDEVICE" resize2fs -f $LOOPDEVICE &> $REPOLOG @@ -153,8 +157,9 @@ case "$PARM1" in # Si no existe la imagen creamos el fichero. else echolog "Creamos la imagen $IMGFILE al tamaño necesario: $SIZEREQUIRED" - echolog dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED - dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED + touch "$IMGFILE" + echolog "truncate --size=\">$SIZEREQUIRED\"k $IMGFILE" + truncate --size=">$SIZEREQUIRED"k $IMGFILE 2>&1 > $REPOLOG #Formateamos imagen echo losetup $LOOPDEVICE "$IMGFILE" losetup $LOOPDEVICE "$IMGFILE" @@ -168,11 +173,10 @@ case "$PARM1" in fi # Montamos la imagen. mountImage "$IMGFILE" "$DIRMOUNT" - RETVAL=$? - if [ $RETVAL -ne 0 ]; then + if [ $? -ne 0 ]; then rmdir "$DIRMOUNT" echolog -o "Error al crear/redimensionar la imagen" - exit $RETVAL + exit 1 fi #touch "$DIRMOUNT/ogimg.info" @@ -197,7 +201,6 @@ case "$PARM1" in DIRMOUNT="$DIRMOUNT.diff" fi IMGFILE="$REPODIR/$PARM2.$IMGEXT" - LOCKFILE="$IMGFILE.lock" echolog "Montamos la imagen $IMGFILE " mkdir -p "$DIRMOUNT" mountImage "$IMGFILE" "$DIRMOUNT" ro || (echolog "Error al montar la imagen"; exit 1) @@ -239,45 +242,48 @@ case "$PARM1" in LOCKFILE="$IMGFILE.lock" [ ! -f $IMGFILE ] && echolog "Imagen $IMGFILE no existe" && exit 1 - # Solo funciona si la imagen es ext4, si no nos salimos sin error - file $IMGFILE |grep -i -e " ext4 filesystem " 2>&1 > /dev/null || exit 0 + # Para imagenes EXT4 reduzco, para BTRFS solo desmonto. + if file $IMGFILE |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then + + [ -d $DIRMOUNT ] || mkdir $DIRMOUNT + mountImage "$IMGFILE" "$DIRMOUNT" || (echolog "Error al montar la imagen $IMGFILE"; exit 1) - [ -d $DIRMOUNT ] || mkdir $DIRMOUNT - mountImage "$IMGFILE" "$DIRMOUNT" || (echolog "Error al montar la imagen $IMGFILE"; exit 1) - # Si el espacio libre menor que 500Mb desmontamos la imagen y nos salimos - AVAILABLE=$(df -k|grep $DIRMOUNT|awk '{print $4}') - if [ $AVAILABLE -lt 200000 ]; then + # Si el espacio libre menor que 200Mb desmontamos la imagen y nos salimos + AVAILABLE=$(df -k|grep $DIRMOUNT|awk '{print $4}') + if [ $AVAILABLE -lt 200000 ]; then echolog "reducir imagen REPO $PARM2 $IMGEXT. tamaño minimo, nada que hacer" - umount $DIRMOUNT - rmdir $DIRMOUNT - exit 0 - fi - - # Calculamos la diferencia entre el tamaño interno y externo - EXTSIZE=$(ls -l --block-size=1024 $IMGFILE | cut -f5 -d" ") - INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}') - let EDGESIZE=$EXTSIZE-$INTSIZE - - echolog "reducir imagen REPO $PARM2 $IMGEXT, tamaño final: $ENDSIZE" - umount $DIRMOUNT - LOOPDEVICE=$(losetup -f) - losetup $LOOPDEVICE "$IMGFILE" + umount $DIRMOUNT || (echolog "Error al desmontar la imagen $IMGFILE"; exit 1) + else - # Redimensiono sistema de ficheros - echolog "resize2fs -fpM $LOOPDEVICE " - resize2fs -fpM $LOOPDEVICE # 2>&1 > $REPOLOG - mountImage "$IMGFILE" "$DIRMOUNT" - # Calculamos el tamaño final del archivo - INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}') - let EXTSIZE=$INTSIZE+$EDGESIZE - umount $DIRMOUNT || (echolog "Error al desmontar la imagen $IMGFILE"; exit 1) - # Si existe dispositivo loop lo borramos. - [ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null && losetup -d $LOOPDEVICE - # Corto el archivo al tamaño del sistema de ficheros - echo "truncate --size=\"$EXTSIZE\"k $IMGFILE" - echolog "truncate --size=\"$EXTSIZE\"k $IMGFILE" - truncate --size="$EXTSIZE"k $IMGFILE + # Calculamos la diferencia entre el tamaño interno y externo + EXTSIZE=$(ls -l --block-size=1024 $IMGFILE | cut -f5 -d" ") + INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}') + let EDGESIZE=$EXTSIZE-$INTSIZE + + echolog "reducir imagen REPO $PARM2 $IMGEXT, tamaño final: $ENDSIZE" + umount $DIRMOUNT + LOOPDEVICE=$(losetup -f) + losetup $LOOPDEVICE "$IMGFILE" + + # Redimensiono sistema de ficheros + echolog "resize2fs -fpM $LOOPDEVICE " + resize2fs -fpM $LOOPDEVICE # 2>&1 > $REPOLOG + mountImage "$IMGFILE" "$DIRMOUNT" + # Calculamos el tamaño final del archivo + INTSIZE=$(df -k|grep "$DIRMOUNT"|awk '{print $2}') + let EXTSIZE=$INTSIZE+$EDGESIZE + umount $DIRMOUNT || (echolog "Error al desmontar la imagen $IMGFILE"; exit 1) + # Si existe dispositivo loop lo borramos. + [ $LOOPDEVICE ] && losetup -a| grep $LOOPDEVICE &> /dev/null && losetup -d $LOOPDEVICE + # Corto el archivo al tamaño del sistema de ficheros + echo "truncate --size=\"$EXTSIZE\"k $IMGFILE" + echolog "truncate --size=\"$EXTSIZE\"k $IMGFILE" + truncate --size="$EXTSIZE"k $IMGFILE + fi + else + umount $DIRMOUNT || (echolog "Error al desmontar la imagen $IMGFILE"; exit 1) + fi rmdir $DIRMOUNT echo "reduced" >$LOCKFILE diff --git a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.cpp b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.cpp index 929a5264..19503065 100644 --- a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.cpp +++ b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.cpp @@ -835,10 +835,11 @@ BOOLEAN actualizaConfiguracion(Database db, Table tbl, char* cfg, int ido) " tamano=%s," " idsistemafichero=%d," " idnombreso=%d," - " idimagen=%d," - " idperfilsoft=%d" + " idimagen=0," + " idperfilsoft=0," + " fechadespliegue=NULL" " WHERE idordenador=%d AND numdisk=%s AND numpar=%s", - cpt, tam, idsfi, idsoi, 0, 0, ido, disk, par); + cpt, tam, idsfi, idsoi, ido, disk, par); if (!db.Execute(sqlstr, tbl)) { // Error al recuperar los datos errorLog(modulo, 21, FALSE); db.GetErrorErrStr(msglog); @@ -1924,7 +1925,7 @@ BOOLEAN RESPUESTA_CrearImagen(SOCKET *socket_c, TRAMA* ptrTrama) char msglog[LONSTD]; Database db; Table tbl; - char *iph, *par, *cpt, *ipr, *ido; + char *iph, *dsk, *par, *cpt, *ipr, *ido; char *idi; BOOLEAN res; char modulo[] = "RESPUESTA_CrearImagen()"; @@ -1948,11 +1949,12 @@ BOOLEAN RESPUESTA_CrearImagen(SOCKET *socket_c, TRAMA* ptrTrama) // Acciones posteriores idi = copiaParametro("idi",ptrTrama); + dsk = copiaParametro("dsk",ptrTrama); par = copiaParametro("par",ptrTrama); cpt = copiaParametro("cpt",ptrTrama); ipr = copiaParametro("ipr",ptrTrama); - res=actualizaCreacionImagen(db, tbl, idi, par, cpt, ipr, ido); + res=actualizaCreacionImagen(db, tbl, idi, dsk, par, cpt, ipr, ido); liberaMemoria(idi); liberaMemoria(par); @@ -1977,6 +1979,7 @@ BOOLEAN RESPUESTA_CrearImagen(SOCKET *socket_c, TRAMA* ptrTrama) // - db: Objeto base de datos (ya operativo) // - tbl: Objeto tabla // - idi: Identificador de la imagen +// - dsk: Disco de donde se creó // - par: Partición de donde se creó // - cpt: Código de partición // - ipr: Ip del repositorio @@ -1985,14 +1988,15 @@ BOOLEAN RESPUESTA_CrearImagen(SOCKET *socket_c, TRAMA* ptrTrama) // TRUE: Si el proceso es correcto // FALSE: En caso de ocurrir algún error // ________________________________________________________________________________________________________ -BOOLEAN actualizaCreacionImagen(Database db, Table tbl, char* idi, char* par, - char* cpt, char* ipr, char *ido) { +BOOLEAN actualizaCreacionImagen(Database db, Table tbl, char* idi, char* dsk, + char* par, char* cpt, char* ipr, char *ido) { char msglog[LONSTD], sqlstr[LONSQL]; char modulo[] = "actualizaCreacionImagen()"; int idr,ifs; /* Toma identificador del repositorio correspondiente al ordenador modelo */ - sprintf(sqlstr, "SELECT repositorios.idrepositorio" + snprintf(sqlstr, LONSQL, + "SELECT repositorios.idrepositorio" " FROM repositorios" " LEFT JOIN ordenadores USING (idrepositorio)" " WHERE repositorios.ip='%s' AND ordenadores.idordenador=%s", ipr, ido); @@ -2010,7 +2014,10 @@ BOOLEAN actualizaCreacionImagen(Database db, Table tbl, char* idi, char* par, } /* Toma identificador del perfilsoftware */ - sprintf(sqlstr,"SELECT idperfilsoft FROM ordenadores_particiones WHERE idordenador=%s AND numpar=%s", ido,par); + snprintf(sqlstr, LONSQL, + "SELECT idperfilsoft" + " FROM ordenadores_particiones" + " WHERE idordenador=%s AND numdisk=%s AND numpar=%s", ido, dsk, par); if (!db.Execute(sqlstr, tbl)) { // Error al leer errorLog(modulo, 21, FALSE); @@ -2025,9 +2032,10 @@ BOOLEAN actualizaCreacionImagen(Database db, Table tbl, char* idi, char* par, } /* Actualizar los datos de la imagen */ - sprintf(sqlstr, - "UPDATE imagenes SET numpar=%s,codpar=%s,idperfilsoft=%d,idrepositorio='%d'" - " WHERE idimagen=%s", par, cpt, ifs, idr, idi); + snprintf(sqlstr, LONSQL, + "UPDATE imagenes" + " SET idordenador=%s, numdisk=%s, numpar=%s, codpar=%s, idperfilsoft=%d, idrepositorio=%d, fechacreacion=NOW()" + " WHERE idimagen=%s", ido, dsk, par, cpt, ifs, idr, idi); if (!db.Execute(sqlstr, tbl)) { // Error al recuperar los datos errorLog(modulo, 21, FALSE); @@ -2313,7 +2321,7 @@ BOOLEAN RESPUESTA_RestaurarImagen(SOCKET *socket_c, TRAMA* ptrTrama) Database db; Table tbl; BOOLEAN res; - char *iph, *ido, *idi, *par, *ifs; + char *iph, *ido, *idi, *dsk, *par, *ifs; char modulo[] = "RESPUESTA_RestaurarImagen()"; if (!db.Open(usuario, pasguor, datasource, catalog)) { // Error de conexion @@ -2335,10 +2343,11 @@ BOOLEAN RESPUESTA_RestaurarImagen(SOCKET *socket_c, TRAMA* ptrTrama) // Acciones posteriores idi = copiaParametro("idi",ptrTrama); // Toma identificador de la imagen + dsk = copiaParametro("dsk",ptrTrama); // Número de disco par = copiaParametro("par",ptrTrama); // Número de partición ifs = copiaParametro("ifs",ptrTrama); // Identificador del perfil software contenido - res=actualizaRestauracionImagen(db, tbl, idi, par, ido, ifs); + res=actualizaRestauracionImagen(db, tbl, idi, dsk, par, ido, ifs); liberaMemoria(iph); liberaMemoria(ido); @@ -2396,6 +2405,7 @@ BOOLEAN RESPUESTA_RestaurarSoftIncremental(SOCKET *socket_c, TRAMA* ptrTrama) { // - db: Objeto base de datos (ya operativo) // - tbl: Objeto tabla // - idi: Identificador de la imagen +// - dsk: Disco de donde se restauró // - par: Partición de donde se restauró // - ido: Identificador del cliente donde se restauró // - ifs: Identificador del perfil software contenido en la imagen @@ -2404,14 +2414,15 @@ BOOLEAN RESPUESTA_RestaurarSoftIncremental(SOCKET *socket_c, TRAMA* ptrTrama) { // FALSE: En caso de ocurrir algún error // ________________________________________________________________________________________________________ BOOLEAN actualizaRestauracionImagen(Database db, Table tbl, char* idi, - char* par, char* ido, char* ifs) { + char* dsk, char* par, char* ido, char* ifs) { char msglog[LONSTD], sqlstr[LONSQL]; char modulo[] = "actualizaRestauracionImagen()"; /* Actualizar los datos de la imagen */ - sprintf(sqlstr, - "UPDATE ordenadores_particiones SET idimagen=%s,idperfilsoft=%s" - " WHERE idordenador=%s AND numpar=%s", idi, ifs, ido, par); + snprintf(sqlstr, LONSQL, + "UPDATE ordenadores_particiones" + " SET idimagen=%s, idperfilsoft=%s, fechadespliegue=NOW()" + " WHERE idordenador=%s AND numdisk=%s AND numpar=%s", idi, ifs, ido, dsk, par); if (!db.Execute(sqlstr, tbl)) { // Error al recuperar los datos errorLog(modulo, 21, FALSE); @@ -3452,13 +3463,24 @@ BOOLEAN envioProgramacion(SOCKET *socket_c, TRAMA *ptrTrama) errorInfo(modulo, msglog); return (FALSE); } - mar = copiaParametro("mar",ptrTrama); // Toma modo de arranque si el comando es Arrancar - if (!Levanta(iph,mac,mar)) { + + //mar = copiaParametro("mar",ptrTrama); // Toma modo de arranque si el comando es Arrancar + + // Se manda por broadcast y por unicast + if (!Levanta(iph,mac,"1")) { sprintf(msglog, "%s:%s", tbErrores[32], modulo); errorInfo(modulo, msglog); liberaMemoria(mar); return (FALSE); } + + if (!Levanta(iph,mac,"2")) { + sprintf(msglog, "%s:%s", tbErrores[32], modulo); + errorInfo(modulo, msglog); + liberaMemoria(mar); + return (FALSE); + } + liberaMemoria(mar); } if (clienteDisponible(iph, &idx)) { // Si el cliente puede recibir comandos diff --git a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h index bc887d08..cf2930a8 100644 --- a/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h +++ b/admin/Sources/Services/ogAdmServer/sources/ogAdmServer.h @@ -100,7 +100,7 @@ BOOLEAN CrearSoftIncremental(SOCKET *,TRAMA *); BOOLEAN RESPUESTA_CrearImagen(SOCKET *,TRAMA *); BOOLEAN RESPUESTA_CrearImagenBasica(SOCKET *,TRAMA *); BOOLEAN RESPUESTA_CrearSoftIncremental(SOCKET *,TRAMA *); -BOOLEAN actualizaCreacionImagen(Database,Table,char*,char*,char*,char*,char*); +BOOLEAN actualizaCreacionImagen(Database,Table,char*,char*,char*,char*,char*,char*); BOOLEAN actualizaCreacionSoftIncremental(Database,Table,char*,char*); BOOLEAN RestaurarImagen(SOCKET *,TRAMA *); BOOLEAN RestaurarImagenBasica(SOCKET *,TRAMA *); @@ -108,7 +108,7 @@ BOOLEAN RestaurarSoftIncremental(SOCKET *,TRAMA *); BOOLEAN RESPUESTA_RestaurarImagen(SOCKET *,TRAMA *); BOOLEAN RESPUESTA_RestaurarImagenBasica(SOCKET *,TRAMA *); BOOLEAN RESPUESTA_RestaurarSoftIncremental(SOCKET *,TRAMA *); -BOOLEAN actualizaRestauracionImagen(Database,Table,char*,char*,char*,char*); +BOOLEAN actualizaRestauracionImagen(Database,Table,char*,char*,char*,char*,char*); BOOLEAN Configurar(SOCKET *,TRAMA* ); BOOLEAN RESPUESTA_Configurar(SOCKET *,TRAMA* ); BOOLEAN actualizaConfigurar(Database , Table , char* ); diff --git a/admin/Sources/Services/opengnsys.init b/admin/Sources/Services/opengnsys.init index 359a3166..2912811e 100755 --- a/admin/Sources/Services/opengnsys.init +++ b/admin/Sources/Services/opengnsys.init @@ -82,12 +82,13 @@ fi config() { if [ -f /etc/os-release ]; then source /etc/os-release - OSDISTRIB="$NAME" + OSDISTRIB="$ID" else OSDISTRIB=$(lsb_release -is 2>/dev/null) fi + OSDISTRIB="${OSDISTRIB,,}" case "$OSDISTRIB" in - Ubuntu|Debian|LinuxMint) + ubuntu|debian|linuxmint) INITFUNCTIONS=/lib/lsb/init-functions DAEMONSTART="start-stop-daemon --start --quiet --background --exec" EXTRAOPTS="--" @@ -101,7 +102,7 @@ config() { SEEDERSTART="start-stop-daemon --make-pidfile --pidfile $BTSEEDERPID --start --quiet --background --exec" SEEDERSTOP="start-stop-daemon --stop --quiet --oknodo --pidfile $BTSEEDERPID" ;; - CentOS|Fedora) + centos|fedora) INITFUNCTIONS=/etc/init.d/functions DAEMONSTART="daemon" ENDOPTS="&" diff --git a/admin/WebConsole/asistentes/AsistenteCloneRemotePartition.php b/admin/WebConsole/asistentes/AsistenteCloneRemotePartition.php index 15362ff8..22ed2973 100644 --- a/admin/WebConsole/asistentes/AsistenteCloneRemotePartition.php +++ b/admin/WebConsole/asistentes/AsistenteCloneRemotePartition.php @@ -38,7 +38,7 @@ if (!$cmd) <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <LINK rel="stylesheet" type="text/css" href="../estilos.css"> <SCRIPT language="javascript" src="./jscripts/EjecutarScripts.js"></SCRIPT> - <SCRIPT language="javascript" src="./jscripts/comunescomandos.js"></SCRIPT> + <SCRIPT language="javascript" src="../comandos/jscripts/comunescomandos.js"></SCRIPT> <SCRIPT language="javascript" src="./jscripts/asistentes.js"></SCRIPT> <? echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/ejecutarscripts_'.$idioma.'.js"></SCRIPT>'?> <? echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> diff --git a/admin/WebConsole/asistentes/AsistenteDeployImage.php b/admin/WebConsole/asistentes/AsistenteDeployImage.php index bf074f76..36fec6bc 100644 --- a/admin/WebConsole/asistentes/AsistenteDeployImage.php +++ b/admin/WebConsole/asistentes/AsistenteDeployImage.php @@ -44,7 +44,7 @@ if (!$cmd) <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <LINK rel="stylesheet" type="text/css" href="../estilos.css"> <SCRIPT language="javascript" src="./jscripts/EjecutarScripts.js"></SCRIPT> - <SCRIPT language="javascript" src="./jscripts/comunescomandos.js"></SCRIPT> + <SCRIPT language="javascript" src="../comandos/jscripts/comunescomandos.js"></SCRIPT> <SCRIPT language="javascript" src="./jscripts/asistentes.js"></SCRIPT> <?php echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/ejecutarscripts_'.$idioma.'.js"></SCRIPT>'?> <?php echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> diff --git a/admin/WebConsole/asistentes/AsistenteParticionado.php b/admin/WebConsole/asistentes/AsistenteParticionado.php index 160bb62e..88767d95 100644 --- a/admin/WebConsole/asistentes/AsistenteParticionado.php +++ b/admin/WebConsole/asistentes/AsistenteParticionado.php @@ -48,7 +48,7 @@ if (!$cmd) <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <LINK rel="stylesheet" type="text/css" href="../estilos.css"> <SCRIPT language="javascript" src="./jscripts/EjecutarScripts.js"></SCRIPT> - <SCRIPT language="javascript" src="./jscripts/comunescomandos.js"></SCRIPT> + <SCRIPT language="javascript" src="../comandos/jscripts/comunescomandos.js"></SCRIPT> <SCRIPT language="javascript" src="./jscripts/asistentes.js"></SCRIPT> <?php echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/ejecutarscripts_'.$idioma.'.js"></SCRIPT>'?> <?php echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> diff --git a/admin/WebConsole/asistentes/AsistenteUpdateCache.php b/admin/WebConsole/asistentes/AsistenteUpdateCache.php index 7e06210f..e120f7f7 100644 --- a/admin/WebConsole/asistentes/AsistenteUpdateCache.php +++ b/admin/WebConsole/asistentes/AsistenteUpdateCache.php @@ -48,7 +48,7 @@ if (!$cmd) <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <LINK rel="stylesheet" type="text/css" href="../estilos.css"> <SCRIPT language="javascript" src="./jscripts/EjecutarScripts.js"></SCRIPT> - <SCRIPT language="javascript" src="./jscripts/comunescomandos.js"></SCRIPT> + <SCRIPT language="javascript" src="../comandos/jscripts/comunescomandos.js"></SCRIPT> <SCRIPT language="javascript" src="./jscripts/asistentes.js"></SCRIPT> <? echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/ejecutarscripts_'.$idioma.'.js"></SCRIPT>'?> <? echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> diff --git a/admin/WebConsole/asistentes/gestores/gestor_Comandos.php b/admin/WebConsole/asistentes/gestores/gestor_Comandos.php index d007e551..58e2f3b0 100644 --- a/admin/WebConsole/asistentes/gestores/gestor_Comandos.php +++ b/admin/WebConsole/asistentes/gestores/gestor_Comandos.php @@ -70,8 +70,8 @@ $atributos=str_replace('$',chr(9),$atributos); <HEAD> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <BODY> - <SCRIPT language="javascript" src="../jscripts/comunescomandos.js"></SCRIPT> - <? echo '<SCRIPT language="javascript" src="../../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> + <SCRIPT language="javascript" src="../../comandos/jscripts/comunescomandos.js"></SCRIPT> + <?php echo '<SCRIPT language="javascript" src="../../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> <? /* Recopila identificadore ,ipes y macs para envío de comandos */ diff --git a/admin/WebConsole/asistentes/includes/asistentes/formDeployImage.php b/admin/WebConsole/asistentes/includes/asistentes/formDeployImage.php index 0a6da102..78502d83 100644 --- a/admin/WebConsole/asistentes/includes/asistentes/formDeployImage.php +++ b/admin/WebConsole/asistentes/includes/asistentes/formDeployImage.php @@ -12,8 +12,8 @@ for($cfgIndex = 0; $cfgIndex < $conKeys; $cfgIndex++){ ?> <? echo $TbMsg["WDI13"] ?> <br> - <input type="radio" name="modo" value="deployImage" checked ><? echo $TbMsg["WDI14"] ?> <br> - <input type="radio" name="modo" value="updateCache" > <? echo $TbMsg["WDI15"] ?> <br> + <input type="radio" name="modo" value="deployImage" onClick="enableDirect(this.form)" checked ><? echo $TbMsg["WDI14"] ?> <br> + <input type="radio" name="modo" value="updateCache" onClick="disableDirect(this.form)" > <? echo $TbMsg["WDI15"] ?> <br> <tr> <td> <? echo $TbMsg["WDI16"] ?> </td> <td> <? echo $TbMsg["WDI17"] ?> </td> <td> <? echo $TbMsg["WDI18"] ?> </td> <td> <? echo $TbMsg["WDI19"] ?> </td></tr> @@ -43,11 +43,12 @@ for($cfgIndex = 0; $cfgIndex < $conKeys; $cfgIndex++){ <? echo $TbMsg["WDI23"] ?> <br /> - <select name="idmetodo" id="idmetodo" style="WIDTH:220";"> - <!-- <option value="UNICAST"> UNICAST </option> --> + <select name="idmetodo" id="idmetodo" style="WIDTH:220;"> <option value="TORRENT"> TORRENT </option> <option value="MULTICAST"> MULTICAST </option> + <option value="MULTICAST-DIRECT"> MULTICAST-DIRECT </option> <option value="UNICAST"> UNICAST </option> + <option value="UNICAST-DIRECT"> UNICAST-DIRECT </option> </select> <br /> </td> diff --git a/admin/WebConsole/asistentes/jscripts/EjecutarScripts.js b/admin/WebConsole/asistentes/jscripts/EjecutarScripts.js index e17411c0..bfc2d162 100644 --- a/admin/WebConsole/asistentes/jscripts/EjecutarScripts.js +++ b/admin/WebConsole/asistentes/jscripts/EjecutarScripts.js @@ -11,7 +11,21 @@ if (comprobar_datos()){ var RC='@'; document.fdatosejecucion.atributos.value="scp="+escape(document.fdatos.codigo.value)+RC; - document.fdatosejecucion.submit(); + // Enviar datos si el formulario no tiene método de clonación. + if (document.fdatos.idmetodo == undefined) { + document.fdatosejecucion.submit(); + }else{ + // Pedir confirmación si clonación masiva por Unicast. + if( document.fdatosejecucion.ambito.value!=16 && document.fdatos.idmetodo.value=="UNICAST" || document.fdatos.idmetodo.value=="UNICAST-DIRECT"){ + if (confirm(TbMsg[4]) == true) { + document.fdatosejecucion.submit(); + } else { + cancelar(); + } + }else{ + document.fdatosejecucion.submit(); + } + } } } //________________________________________________________________________________________________________ diff --git a/admin/WebConsole/asistentes/jscripts/asistentes.js b/admin/WebConsole/asistentes/jscripts/asistentes.js index d86176ca..a9749c78 100644 --- a/admin/WebConsole/asistentes/jscripts/asistentes.js +++ b/admin/WebConsole/asistentes/jscripts/asistentes.js @@ -9,6 +9,7 @@ // *********************************************************************************************************** function codeCloneRemotePartition(form){ +var command ; switch (form.idmetodo.value) { case "MULTICAST": @@ -21,24 +22,44 @@ switch (form.idmetodo.value) //form.codigo.value="cloneRemoteFromMaster " + form.ipMaster.value + " 1 " + form.PartOrigen.value + " " + form.mcastpuerto.value + ":" + form.mcastmodo.value + ":" + form.mcastdireccion.value + ":" + form.mcastvelocidad.value + "M:" + form.mcastnclien.value + ":" + form.mcastseg.value + " 1 " + form.PartOrigen.value + " " + form.tool.value + " " + form.compresor.value; command="cloneRemoteFromMaster " + form.ipMaster.value + " " + form.source.value + " " + protocol + " " + form.targetpart.value + " " + form.tool.value + " " + form.compresor.value; form.codigo.value="\ -ogEcho log session \"[0] $MSG_SCRIPTS_TASK_START " + comand + "\"\n " + -command + " | tee -a $OGLOGCOMMAND \n "; -//cloneRemoteFromMaster " + form.ipMaster.value + " " + form.source.value + " " + protocol + " " + form.targetpart.value + " " + form.tool.value + " " + form.compresor.value + " | tee -a $OGLOGCOMMAND \n"; -//form.codigo.value="cloneRemoteFromMaster " + form.ipMaster.value + " " + form.source.value + " " + protocol + " " + form.targetpart.value + " " + form.tool.value + " " + form.compresor.value; +ogEcho log session \"[0] $MSG_SCRIPTS_TASK_START " + command + "\"\n \ +ogExecAndLog command " + command + " \n "; } +// disableDirect(form): En Deploy de imagenes si se elige updateCache se impide elegir multicast-direct o unicast-direct +function disableDirect(form){ + // MULTICAST-DIRECT + form.idmetodo.options[2].disabled=true; + // UNICAST-DIRECT + form.idmetodo.options[4].disabled=true; +} +// enableDirect(form): En Deploy de imagenes si se elige deployCache se permite elegir multicast-direct o unicast-direct +function enableDirect(form){ + // MULTICAST-DIRECT + form.idmetodo.options[2].disabled=false; + // UNICAST-DIRECT + form.idmetodo.options[4].disabled=false; +} + + function codeDeployImage(form){ switch (form.idmetodo.value) { case "MULTICAST": protocol="MULTICAST " + form.mcastpuerto.value + ":" + form.mcastmodo.value + ":" + form.mcastdireccion.value + ":" + form.mcastvelocidad.value + "M:" + form.mcastnclien.value + ":" + form.mcastseg.value + " "; break; + case "MULTICAST-DIRECT": + protocol="MULTICAST-DIRECT " + form.mcastpuerto.value + ":" + form.mcastmodo.value + ":" + form.mcastdireccion.value + ":" + form.mcastvelocidad.value + "M:" + form.mcastnclien.value + ":" + form.mcastseg.value + " "; + break; case "TORRENT": protocol=" TORRENT " + form.modp2p.value + ":" + form.timep2p.value; break; case "UNICAST": protocol=" UNICAST"; break; + case "UNICAST-DIRECT": + protocol=" UNICAST-DIRECT"; + break; } //form.codigo.value="deployImage REPO /"; if (form.modo[0].checked) @@ -142,9 +163,9 @@ ogEcho session \"[20] $MSG_HELP_ogGetCacheSize\"\n \ sizecache=`ogGetCacheSize` \n \ ogEcho session \"[30] $MSG_HELP_ogUpdatePartitionTable "+n_disk+"\"\n \ ogDeletePartitionTable "+n_disk+" \n \ -ogUpdatePartitionTable "+n_disk+" | tee -a $OGLOGCOMMAND \n \ +ogExecAndLog command ogUpdatePartitionTable "+n_disk+" \n \ ogEcho session \"[50] $MSG_HELP_ogCreateCache\"\n \ -initCache "+n_disk+" $sizecache &>/dev/null | tee -a $OGLOGCOMMAND \n "; +initCache "+n_disk+" $sizecache &>/dev/null \n "; } else { if (form.size4.value == "CUSTOM") { cacheSize = form.size4custom.value; @@ -156,7 +177,7 @@ ogEcho session \"[30] $MSG_HELP_ogUpdatePartitionTable "+n_disk+"\"\n \ ogDeletePartitionTable "+n_disk+" \n \ ogUpdatePartitionTable "+n_disk+" \n \ ogEcho session \"[50] $MSG_HELP_ogCreateCache\"\n \ -initCache " + n_disk + " " + cacheSize + " &>/dev/null | tee -a $OGLOGCOMMAND"; +initCache " + n_disk + " " + cacheSize + " &>/dev/null"; } } else { cacheCode="\ @@ -203,19 +224,19 @@ partCode += " EMPTY:0"; ogCreatePartitionTable "+n_disk+" "+tipo_part_table +" \n \ ogEcho log session \"[0] $MSG_HELP_ogCreatePartitions \"\n \ ogEcho session \"[10] $MSG_HELP_ogUnmountAll "+n_disk+"\"\n \ -ogUnmountCache \n \ ogUnmountAll "+n_disk+" 2>/dev/null\n \ +ogUnmountCache \n \ " + cacheCode + " \n \ ogEcho session \"[60] $MSG_HELP_ogListPartitions "+n_disk+"\"\n \ -ogListPartitions "+n_disk+" | tee -a $OGLOGCOMMAND $OGLOGSESSION \n \ +ogExecAndLog command session ogListPartitions "+n_disk+" \n \ ogEcho session \"[70] $MSG_HELP_ogCreatePartitions " + partCode + "\"\n \ -ogCreatePartitions "+n_disk+" " + partCode + " | tee -a $OGLOGCOMMAND \n \ +ogExecAndLog command ogCreatePartitions "+n_disk+" " + partCode + " \n \ ogEcho session \"[80] $MSG_HELP_ogSetPartitionActive "+n_disk+" 1\"\n \ ogSetPartitionActive "+n_disk+" 1 \n \ ogEcho log session \"[100] $MSG_HELP_ogListPartitions "+n_disk+"\"\n \ ogUpdatePartitionTable "+n_disk+" \n \ ms-sys /dev/sda | grep unknow && ms-sys /dev/sda \n \ -ogListPartitions "+n_disk+" | tee -a $OGLOGCOMMAND $OGLOGSESSION $OGLOGFILE \n \ +ogExecAndLog command session log ogListPartitions "+n_disk+" \n \ reboot \n"; } @@ -242,9 +263,9 @@ ogEcho session \"[20] $MSG_HELP_ogGetCacheSize\"\n \ sizecache=`ogGetCacheSize` \n \ ogEcho session \"[30] $MSG_HELP_ogUpdatePartitionTable "+n_disk+"\"\n \ ogDeletePartitionTable "+n_disk+" \n \ -ogUpdatePartitionTable "+n_disk+" | tee -a $OGLOGCOMMAND \n \ +ogExecAndLog command ogUpdatePartitionTable "+n_disk+" \n \ ogEcho session \"[50] $MSG_HELP_ogCreateCache\"\n \ -initCache "+ n_disk +" $sizecache &>/dev/null | tee -a $OGLOGCOMMAND \n "; +initCache "+ n_disk +" $sizecache &>/dev/null \n "; } else { if (form.sizeGPT4.value == "CUSTOM") { cacheSize = form.sizeGPT4custom.value; @@ -256,7 +277,7 @@ ogEcho session \"[30] $MSG_HELP_ogUpdatePartitionTable "+n_disk+"\"\n \ ogDeletePartitionTable "+n_disk+" \n \ ogUpdatePartitionTable "+n_disk+" \n \ ogEcho session \"[50] $MSG_HELP_ogCreateCache\"\n \ -initCache " + n_disk +" "+ cacheSize + " &>/dev/null | tee -a $OGLOGCOMMAND"; +initCache " + n_disk +" "+ cacheSize + " &>/dev/null"; } } else{ var partType=eval("form.partGPT"+nPart); @@ -290,19 +311,19 @@ partCode += " EMPTY:0"; ogCreatePartitionTable "+n_disk+" "+tipo_part_table +" \n \ ogEcho log session \"[0] $MSG_HELP_ogCreatePartitions "+n_disk+"\"\n \ ogEcho session \"[10] $MSG_HELP_ogUnmountAll "+n_disk+"\"\n \ -ogUnmountCache \n \ ogUnmountAll "+n_disk+" \n \ +ogUnmountCache \n \ " + cacheCode + " \n \ ogEcho session \"[60] $MSG_HELP_ogListPartitions "+n_disk+"\"\n \ -ogListPartitions "+n_disk+" | tee -a $OGLOGCOMMAND $OGLOGSESSION \n \ +ogExecAndLog command session ogListPartitions "+n_disk+" \n \ ogEcho session \"[70] $MSG_HELP_ogCreatePartitions " + partCode + "\"\n \ -ogCreatePartitions "+n_disk+" " + partCode + " | tee -a $OGLOGCOMMAND \n \ +ogExecAndLog command ogCreatePartitions "+n_disk+" " + partCode + " \n \ ogEcho session \"[80] $MSG_HELP_ogSetPartitionActive "+n_disk+" 1\"\n \ ogSetPartitionActive "+n_disk+" 1 \n \ ogEcho log session \"[100] $MSG_HELP_ogListPartitions "+n_disk+"\"\n \ ogUpdatePartitionTable "+n_disk+" \n \ ms-sys /dev/sda | grep unknow && ms-sys /dev/sda \n \ -ogListPartitions "+n_disk+" | tee -a $OGLOGCOMMAND $OGLOGSESSION $OGLOGFILE \n \ +ogExecAndLog command session log ogListPartitions "+n_disk+" \n \ reboot \n"; } @@ -392,7 +413,7 @@ function calculateFreeDisk(form) { var freeDisk=document.getElementById("freedisk"); freeDisk.value=diskSize; - for (npart=1; npart<=4; npart++) { + for (var npart=1; npart<=4; npart++) { var partCheck=eval("form.check"+npart); var partSize=eval("form.size"+npart); var partSizeCustom=eval("form.size"+npart+"custom"); diff --git a/admin/WebConsole/asistentes/jscripts/comunescomandos.js b/admin/WebConsole/asistentes/jscripts/comunescomandos.js deleted file mode 100644 index b82bfa29..00000000 --- a/admin/WebConsole/asistentes/jscripts/comunescomandos.js +++ /dev/null @@ -1,190 +0,0 @@ -// ************************************************************************************************************************************************* -// Libreria de scripts de Javascript -// Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla -// Fecha Creación: 2009-2010 -// Fecha Última modificación: Agosto-2010 -// Nombre del fichero: comunescomandos.js -// Descripción : -// Este fichero implementa las funciones javascript comunes a todos los comandos -// ************************************************************************************************************************************************* - function comprobar_datosejecucion(){ - /* Comprobación de las opciones de ejecución */ - var sw_ejya=document.fdatosejecucion.sw_ejya.checked; - var sw_ejprg=document.fdatosejecucion.sw_ejprg.checked; - - var sw_seguimientocon=document.fdatosejecucion.sw_seguimiento[0].checked; - var sw_seguimientosin=document.fdatosejecucion.sw_seguimiento[1].checked; - - var sw_mkprocedimiento=document.fdatosejecucion.sw_mkprocedimiento.checked; - var sw_nuevaprocedimiento=document.fdatosejecucion.sw_procedimiento[0].checked; - var descripcion_nuevaprocedimiento=document.fdatosejecucion.nombreprocedimiento.value; - var sw_procedimientoexistente=document.fdatosejecucion.sw_procedimiento[1].checked; - - var sw_mktarea=document.fdatosejecucion.sw_mktarea.checked; - var sw_nuevatarea=document.fdatosejecucion.sw_tarea[0].checked; - var descripcion_nuevatarea=document.fdatosejecucion.nombretarea.value; - var sw_tareaexistente=document.fdatosejecucion.sw_tarea[1].checked; - - var pprocedimiento=document.fdatosejecucion.idprocedimiento.selectedIndex - var ptarea=document.fdatosejecucion.idtarea.selectedIndex - - if(!sw_ejya && !sw_ejprg && !sw_mkprocedimiento && !sw_mktarea ){ - alert("ATENCIÓN.- Debe elegir al menos un modo de ejecución"); - return(false); - } - - // Cuestión procedimiento --------------------------------------------------------------------- - - if(sw_ejya){ - if(!sw_seguimientocon && !sw_seguimientosin){ - alert("ATENCIÓN.- Debe elegir un modo de ejecución inmediata"); - return(false); - } - } - // Cuestión procedimiento ----------------------------------------------------------------------- - if(sw_mkprocedimiento){ - if(!sw_nuevaprocedimiento && !sw_procedimientoexistente){ - alert("ATENCIÓN.- Debe elegir un modo de inclusión en procedimiento de este comando"); - return(false); - } - if(sw_nuevaprocedimiento && descripcion_nuevaprocedimiento==""){ - alert("ATENCIÓN.- Debe especificar el nombre del nuevo procedimiento que se creará y al que se añadirá este comando"); - document.fdatosejecucion.nombreprocedimiento.focus(); - return(false); - } - if(sw_procedimientoexistente && pprocedimiento==0){ - alert("ATENCIÓN.- Debe elegir el procedimiento al que se añadirá este comando"); - document.fdatosejecucion.idprocedimiento.focus(); - return(false); - } - } - - // Cuestión tarea ------------------------------------------------------------------------------------------------------------------------------ - if(sw_mktarea){ - if(!sw_nuevatarea && !sw_tareaexistente){ - alert("ATENCIÓN.- Debe elegir un modo de inclusión en tarea ejecutable, de este comando"); - return(false); - } - if(sw_nuevatarea && descripcion_nuevatarea==""){ - alert("ATENCIÓN.- Debe especificar el nombre de la nueva tarea ejecutable que se creará y a la que se añadirá este comando"); - document.fdatosejecucion.nombretarea.focus(); - return(false); - } - if(sw_tareaexistente && ptarea==0){ - alert("ATENCIÓN.- Debe elegir la tarea a la que se añadirá este comando"); - document.fdatosejecucion.idtarea.focus(); - return(false); - } - } - //----------------------------------------------------------------------------------------------------------------------------------------------------- - return(true) -} -//____________________________________________________________________________ -function clic_mktarea(o){ - if(!o.checked){ - document.fdatosejecucion.sw_tarea[0].checked=false; - document.fdatosejecucion.nombretarea.value=""; - document.fdatosejecucion.sw_tarea[1].checked=false; - document.fdatosejecucion.idtarea.selectedIndex=0; - } -} -function clic_nwtarea(o){ - if(o.checked){ - document.fdatosejecucion.sw_mktarea.checked=true; - document.fdatosejecucion.sw_tarea[1].checked=false; - document.fdatosejecucion.idtarea.selectedIndex=0; - } -} -function clic_extarea(o){ - if(o.checked){ - document.fdatosejecucion.sw_mktarea.checked=true; - document.fdatosejecucion.sw_tarea[0].checked=false; - document.fdatosejecucion.nombretarea.value=""; - } -} -function clic_nomtarea(o){ - document.fdatosejecucion.sw_mktarea.checked=true; - document.fdatosejecucion.sw_tarea[0].checked=true; - document.fdatosejecucion.idtarea.selectedIndex=0; -} -function clic_mkprocedimiento(o){ - if(!o.checked){ - document.fdatosejecucion.sw_procedimiento[0].checked=false; - document.fdatosejecucion.nombreprocedimiento.value=""; - document.fdatosejecucion.sw_procedimiento[1].checked=false; - document.fdatosejecucion.idprocedimiento.selectedIndex=0; - } -} -function clic_nwprocedimiento(o){ - if(o.checked){ - document.fdatosejecucion.sw_mkprocedimiento.checked=true; - document.fdatosejecucion.sw_procedimiento[1].checked=false; - document.fdatosejecucion.idprocedimiento.selectedIndex=0; - } -} -function clic_exprocedimiento(o){ - if(o.checked){ - document.fdatosejecucion.sw_mkprocedimiento.checked=true; - document.fdatosejecucion.sw_procedimiento[0].checked=false; - document.fdatosejecucion.nombreprocedimiento.value=""; - } -} -function clic_nomprocedimiento(o){ - document.fdatosejecucion.sw_mkprocedimiento.checked=true; - document.fdatosejecucion.sw_procedimiento[0].checked=true; - document.fdatosejecucion.idprocedimiento.selectedIndex=0; -} - -function procedimientoexistente(o){ - document.fdatosejecucion.sw_mkprocedimiento.checked=true; - document.fdatosejecucion.sw_procedimiento[1].checked=true; - document.fdatosejecucion.nombreprocedimiento.value=""; -} - -function tareaexistente(o){ - document.fdatosejecucion.sw_mktarea.checked=true; - document.fdatosejecucion.sw_tarea[1].checked=true; - document.fdatosejecucion.nombretarea.value=""; -} -//____________________________________________________________________________ -function compone_urlejecucion(){ - - var wurl="" - - var sw_ejya=document.fdatosejecucion.sw_ejya.checked; - var sw_seguimiento=document.fdatosejecucion.sw_seguimiento[0].checked; - - var sw_ejprg=document.fdatosejecucion.sw_ejprg.checked; - - var sw_mkprocedimiento=document.fdatosejecucion.sw_mkprocedimiento.checked; - if (document.fdatosejecucion.sw_procedimiento[0].checked){ - var nwidprocedimiento=0 - var nwdescriprocedimiento=document.fdatosejecucion.nombreprocedimiento.value; - } - else{ - var p=document.fdatosejecucion.idprocedimiento.selectedIndex - var nwidprocedimiento=document.fdatosejecucion.idprocedimiento.options[p].value - var nwdescriprocedimiento=document.fdatosejecucion.idprocedimiento.options[p].text - } - - var sw_mktarea=document.fdatosejecucion.sw_mktarea.checked; - if (document.fdatosejecucion.sw_tarea[0].checked){ - var nwidtarea=0 - var nwdescritarea=document.fdatosejecucion.nombretarea.value; - } - else{ - var p=document.fdatosejecucion.idtarea.selectedIndex - var nwidtarea=document.fdatosejecucion.idtarea.options[p].value - var nwdescritarea=document.fdatosejecucion.idtarea.options[p].text - } - wurl+="sw_ejya="+sw_ejya +"&sw_seguimiento="+sw_seguimiento+"sw_ejprg="+sw_ejprg+"&sw_mktarea="+sw_mktarea+"&nwidtarea="+nwidtarea+"&nwdescritarea="+nwdescritarea - wurl+="&sw_mkprocedimiento="+sw_mkprocedimiento+"&nwidprocedimiento="+nwidprocedimiento+"&nwdescriprocedimiento="+nwdescriprocedimiento - return(wurl) -} -//________________________________________________________________________________________________________ -// -// Resultado ejecución de un comando -//________________________________________________________________________________________________________ -function resultado_comando(resul){ - alert(CTbMsg[resul]); -} diff --git a/admin/WebConsole/comandos/CrearImagen.php b/admin/WebConsole/comandos/CrearImagen.php index 603336f9..8e741bac 100644 --- a/admin/WebConsole/comandos/CrearImagen.php +++ b/admin/WebConsole/comandos/CrearImagen.php @@ -100,15 +100,19 @@ function tomaPropiedades($cmd,$ido){ } /*________________________________________________________________________________________________________ Crea la etiqueta html <SELECT> de los perfiles softwares - UHU - 2013/05/17 - Ahora las imagenes pueden ser en cualquier disco +// UHU - 2013/05/17 - Ahora las imagenes pueden ser en cualquier disco +// Version 0.1: La consulta SQL se limita a IMAGENES_MONOLITICAS. +// US ETSII - Irina Gomez - 2014-11-11 ________________________________________________________________________________________________________*/ function HTMLSELECT_imagenes($cmd,$idrepositorio,$idperfilsoft,$disk,$particion,$masterip) { + global $IMAGENES_MONOLITICAS; $SelectHtml=""; - $cmd->texto="SELECT imagenes.idimagen,imagenes.descripcion,imagenes.nombreca,imagenes.idperfilsoft, repositorios.nombrerepositorio - FROM imagenes INNER JOIN repositorios on imagenes.idrepositorio = repositorios.idrepositorio - WHERE imagenes.idrepositorio=".$idrepositorio ." OR repositorios.ip='" .$masterip ."'"; - //echo $cmd->texto; + $cmd->texto="SELECT imagenes.idimagen,imagenes.descripcion,imagenes.nombreca, + imagenes.idperfilsoft, repositorios.nombrerepositorio + FROM imagenes INNER JOIN repositorios on imagenes.idrepositorio = repositorios.idrepositorio + WHERE imagenes.tipo=".$IMAGENES_MONOLITICAS." + AND imagenes.idrepositorio=".$idrepositorio ." OR repositorios.ip='" .$masterip ."'"; $rs=new Recordset; $rs->Comando=&$cmd; $SelectHtml.= '<SELECT class="formulariodatos" id="despleimagen_'.$disk."_".$particion.'" style="WIDTH: 300">'; @@ -128,33 +132,6 @@ function HTMLSELECT_imagenes($cmd,$idrepositorio,$idperfilsoft,$disk,$particion, return($SelectHtml); } -function HTMLSELECT_imagenesORIGINAL($cmd,$idrepositorio,$idperfilsoft,$particion,$masterip) -{ - $SelectHtml=""; - $cmd->texto="SELECT imagenes.idimagen,imagenes.descripcion,imagenes.nombreca,imagenes.idperfilsoft - FROM imagenes INNER JOIN repositorios on imagenes.idrepositorio = repositorios.idrepositorio - WHERE imagenes.idrepositorio=".$idrepositorio ." OR repositorios.ip='" .$masterip ."'"; - //echo $cmd->texto; - $rs=new Recordset; - $rs->Comando=&$cmd; - $SelectHtml.= '<SELECT class="formulariodatos" id="despleimagen_'.$particion.'" style="WIDTH: 300">'; - $SelectHtml.= ' <OPTION value="0"></OPTION>'; - if ($rs->Abrir()){ - $rs->Primero(); - while (!$rs->EOF){ - $SelectHtml.='<OPTION value="'.$rs->campos["idimagen"]."_".$rs->campos["nombreca"]."_".$rs->campos["nombreca"].'"'; - if($idperfilsoft==$rs->campos["idperfilsoft"]) $SelectHtml.=" selected "; - $SelectHtml.='>'; - $SelectHtml.= $rs->campos["descripcion"].'</OPTION>'; - $rs->Siguiente(); - } - $rs->Cerrar(); - } - $SelectHtml.= '</SELECT>'; - return($SelectHtml); -} - - /*________________________________________________________________________________________________________ Crea la etiqueta html <SELECT> de los repositorios UHU - 2013/05/17 - Ahora las imagenes pueden ser en cualquier disco diff --git a/admin/WebConsole/comandos/EliminarImagenCache.php b/admin/WebConsole/comandos/EliminarImagenCache.php index bbb59015..3a825a0c 100644 --- a/admin/WebConsole/comandos/EliminarImagenCache.php +++ b/admin/WebConsole/comandos/EliminarImagenCache.php @@ -103,18 +103,18 @@ switch($ambito){ $cuentarepos=$idx; // Guarda contador $rs->Cerrar(); if ($cuentarepos==1){ - $cmd->texto="SELECT repositorios.ip - FROM repositorios - INNER JOIN ordenadores ON ordenadores.idrepositorio=repositorios.idrepositorio - AND ordenadores.grupoid='$idambito' - GROUP BY ip"; - $rs=new Recordset; - $rs->Comando=&$cmd; - if (!$rs->Abrir()) return($tablaHtml); // Error al abrir recordset - $rs->Primero(); - $iprepositorioord=$rs->campos["ip"]; - if ( $iprepositorioord == $ipservidor ){$cuentarepos=1;}else{$cuentarepos=2;} - $rs->Cerrar(); + $cmd->texto="SELECT repositorios.ip + FROM repositorios + INNER JOIN ordenadores ON ordenadores.idrepositorio=repositorios.idrepositorio + AND ordenadores.grupoid='$idambito' + GROUP BY ip"; + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) return($tablaHtml); // Error al abrir recordset + $rs->Primero(); + $iprepositorioord=$rs->campos["ip"]; + if ( $iprepositorioord == $ipservidor ){$cuentarepos=1;}else{$cuentarepos=2;} + $rs->Cerrar(); }//#agp break; @@ -129,8 +129,8 @@ switch($ambito){ $rs->Comando=&$cmd; if (!$rs->Abrir()) return($tablaHtml); // Error al abrir recordset $rs->Primero(); - $iprepositorioord=$rs->campos["ip"]; - if ( $iprepositorioord == $ipservidor ){$cuentarepos=1;}else{$cuentarepos=2;} + $iprepositorioord=$rs->campos["ip"]; + if ( $iprepositorioord == $ipservidor ){$cuentarepos=1;}else{$cuentarepos=2;} $rs->Cerrar();//#agp break; } @@ -142,7 +142,7 @@ switch($ambito){ <?php // Mensaje aviso limitacion version si hay dos repositorios if ($cuentarepos >1){ ?> - <TABLE id="tabla_conf" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos> + <TABLE id="tabla" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos> <TR> <TH align=center > <? if ($ambito==16){ @@ -349,100 +349,96 @@ switch($ambito){ while (!$rs->EOF){ - $cache=$rs->campos["cache"]; - $idordenador=$rs->campos["idordenador"]; - $ima=split(",",$cache); - - for ($x=0;$x<count($ima); $x++) - { - if(ereg(".img",$ima[$x]) ) //si contiene .img son ficheros de imagen - { - if (ereg(".img.sum",$ima[$x]) || ereg(".img.torrent",$ima[$x]) )//Si el nombre contiene .img.sum o img.torrent - {}else{$esdir[]="f"; - if (ereg(".img.diff",$ima[$x])) - { - $ima[$x] = str_replace(".img.diff", "", $ima[$x]); //quitar todos los .img - $ima[$x]=trim($ima[$x]); - $nombreimagenes[]=$ima[$x]; - }else{ - $ima[$x] = str_replace(".img", "", $ima[$x]); //quitar todos los .img - $ima[$x]=trim($ima[$x]); - $nombreimagenes[]=$ima[$x]; - + $cache=$rs->campos["cache"]; + $idordenador=$rs->campos["idordenador"]; + $ima=split(",",$cache); + for ($x=0;$x<count($ima); $x++) + { + if(ereg(".img",$ima[$x]) ) //si contiene .img son ficheros de imagen + { + if (ereg(".img.sum",$ima[$x]) || ereg(".img.torrent",$ima[$x]) || ereg(".img.full.sum",$ima[$x]) )//Si el nombre contiene .img.sum o img.torrent o img.full.sum + {}else{$esdir[]="f"; + if (ereg(".img.diff",$ima[$x])) + { + $ima[$x] = str_replace(".img.diff", "", $ima[$x]); //quitar todos los .img + $ima[$x]=trim($ima[$x]); + $nombreimagenes[]="f-".$ima[$x]; + }else{ + $ima[$x] = str_replace(".img", "", $ima[$x]); //quitar todos los .img + $ima[$x]=trim($ima[$x]); + $nombreimagenes[]="f-".$ima[$x]; + } + } + }elseif (ereg(".MB",$ima[$x])){ + }else{ // Es un directorio + $ima[$x]=trim($ima[$x]); + $nombreimagenes[]="d-".$ima[$x]; + $esdir[]="d"; } - } - }elseif (ereg("MB",$ima[$x])) - {}else{ // Es un directorio - $ima[$x]=trim($ima[$x]); - $nombreimagenes[]=$ima[$x]; - $esdir[]="d"; - } - } + } - $rs->Siguiente(); + $rs->Siguiente(); } - $rs->Cerrar(); + $rs->Cerrar(); ////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + $sin_duplicados=array_unique($nombreimagenes); + + if (empty($sin_duplicados)) { + // Equipo sin configuracion en base de datos. + $inicioTabla='<table id="tabla_conf" width="95%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13); + $inicioTabla.='<tr><th align="center" >'.$TbMsg["CONFIG_NOCONFIG"].'</th><tr>'.chr(13); + }else{ + // Equipo con configuracion en BD + // Incluimos primera linea de la tabla. + $inicioTabla='<TABLE id="tabla_conf" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos>'.chr(13); + $inicioTabla.=' <TR>'.chr(13); + $inicioTabla.=' <TH align=center> '.$TbMsg[11].' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '.$TbMsg[19].' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '.$TbMsg[12].' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '.$TbMsg[10].' </TH>'.chr(13); + if ($cuentarepos==1) + $inicioTabla.=' <TH align=center> '.$TbMsg[13].' </TH>'.chr(13); + } + + echo $inicioTabla; + $numdir=0; + $contar=1; + foreach($sin_duplicados as $value){ //imprimimos $sin_duplicados - //$sin_duplicados=array_unique($nombreimagenes); - $sin_duplicados=$nombreimagenes; - $contar=1; - if (empty($sin_duplicados)) { - // Equipo sin configuracion en base de datos. - $inicioTabla='<table id="tabla_conf" width="95%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13); - $inicioTabla.='<tr><th align="center" >'.$TbMsg["CONFIG_NOCONFIG"].'</th><tr>'.chr(13); - }else{ - // Equipo con configuracion en BD - // Incluimos primera linea de la tabla. - $inicioTabla='<TABLE id="tabla_conf" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos>'.chr(13); - $inicioTabla.=' <TR>'.chr(13); - $inicioTabla.=' <TH align=center> '.$TbMsg[11].' </TH>'.chr(13); - $inicioTabla.=' <TH align=center> '.$TbMsg[19].' </TH>'.chr(13); - $inicioTabla.=' <TH align=center> '.$TbMsg[12].' </TH>'.chr(13); - $inicioTabla.=' <TH align=center> '.$TbMsg[10].' </TH>'.chr(13); - if ($cuentarepos==1) - $inicioTabla.=' <TH align=center> '.$TbMsg[13].' </TH>'.chr(13); - - - - } - - echo $inicioTabla; - $numdir=0; - - foreach($sin_duplicados as $value) //imprimimos $sin_duplicados - { - if (empty($value)){ - // Equipo sin imagenes en la cache. - $inicioTabla='<table id="tabla_conf" width="25%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13); - $inicioTabla.='<tr><th align="center" >NO '.$TbMsg["7"].'</th><tr>'.chr(13); - echo $inicioTabla; - }else{ - $nombrefichero=$value.'.img'; - $tamanofich=exec("du -h /opt/opengnsys/images/$nombrefichero"); - if ($tamanofich==""){$tamanofich=$TbMsg[14];} - $tamanofich=split("/",$tamanofich); - $todo=".*"; - if ($esdir[$numdir] == "d"){ - $ruta[]='rm%20-r%20/opt/opengnsys/cache/opt/opengnsys/images/'.$value; - }else{ - $ruta[]='rm%20-r%20/opt/opengnsys/cache/opt/opengnsys/images/'.$value.$todo; - } - echo '<TR>'.chr(13); - echo '<TD align=center> '.$contar.' </TD>'.chr(13); - if ($esdir[$numdir]=="d"){echo '<TD align=center><font color=blue> D </font></TD>'.chr(13);}else{echo '<TD align=center> F </TD>'.chr(13);} - echo '<TD align=center ><input type="radio" name="codigo" value='.$ruta[$numdir].'></TD>'.chr(13); - if ($esdir[$numdir]=="d"){echo '<TD align=center><font color=blue> '.$value.' </font></TD>'.chr(13);}else{echo '<TD align=center> '.$value.' </TD>'.chr(13);} - if ($cuentarepos==1){echo '<TD align=center> '.$tamanofich[0].'</TD>'.chr(13);} - echo '</TR>'.chr(13); - $contar++;$numdir++; - } - } - echo "</table>".chr(13); + // Eliminino las f- y d- + $value=split("-",$value); + $value=$value[1]; + + if (empty($value) && $ambito == $AMBITO_ORDENADORES){ + // Equipo sin imagenes en la cache. + $inicioTabla='<table id="tabla_conf" width="25%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13); + $inicioTabla.='<tr><th align="center" >NO '.$TbMsg["7"].'</th><tr>'.chr(13); + echo $inicioTabla; + }elseif (empty($value)){ $numdir++; + }else{ + $nombrefichero=$value.'.img'; + $tamanofich=exec("du -h /opt/opengnsys/images/$nombrefichero"); + if ($tamanofich==""){$tamanofich=$TbMsg[14];} + $tamanofich=split("/",$tamanofich); + $todo=".*"; + if ($esdir[$numdir] == "d"){$ruta[$numdir]='rm%20-r%20/opt/opengnsys/cache/opt/opengnsys/images/'.$value;}else{$ruta[$numdir]='rm%20-r%20/opt/opengnsys/cache/opt/opengnsys/images/'.$value.$todo;} + echo '<TR>'.chr(13); + echo '<TD align=center> '.$contar.' </TD>'.chr(13); + if ($esdir[$numdir]=="d"){echo '<TD align=center><font color=blue> D </font></TD>'.chr(13);}else{echo '<TD align=center> F </TD>'.chr(13);} + echo '<TD align=center ><input type="radio" name="codigo" value='.$ruta[$numdir].'></TD>'.chr(13); + if ($esdir[$numdir]=="d"){echo '<TD align=center><font color=blue> '.$value.' </font></TD>'.chr(13);}else{echo '<TD align=center> '.$value.' </TD>'.chr(13);} + if ($cuentarepos==1){echo '<TD align=center> '.$tamanofich[0].'</TD>'.chr(13);} + echo '</TR>'.chr(13); + $contar++;$numdir++; + } + } + echo "</table>".chr(13); - return($tablaHtml); +return($tablaHtml); } ?> + diff --git a/admin/WebConsole/comandos/IniciarSesion.php b/admin/WebConsole/comandos/IniciarSesion.php index 2f1cd7e7..3ef3b9c5 100644 --- a/admin/WebConsole/comandos/IniciarSesion.php +++ b/admin/WebConsole/comandos/IniciarSesion.php @@ -7,6 +7,9 @@ // Nombre del fichero: IniciarSesion.php // Descripción : // Implementación� del comando "Iniciar Sesión" +// Version 0.1 - En ambito distinto a ordenador muestra los equipos agrupados en configuraciones iguales. +// Fecha: 2014-10-23 +// Autora: Irina Gomez, ETSII Universidad de Sevilla // ************************************************************************************************************************************************* include_once("../includes/ctrlacc.php"); include_once("../clases/AdoPhp.php"); @@ -15,6 +18,8 @@ include_once("../includes/comunes.php"); include_once("../includes/CreaComando.php"); include_once("../includes/HTMLSELECT.php"); include_once("../includes/TomaDato.php"); +include_once("../includes/RecopilaIpesMacs.php"); +include_once("../includes/ConfiguracionesParticiones.php"); include_once("../includes/pintaTablaConfiguraciones.php"); include_once("../idiomas/php/".$idioma."/comandos/iniciarsesion_".$idioma.".php"); include_once("../idiomas/php/".$idioma."/comandos/opcionesacciones_".$idioma.".php"); @@ -33,9 +38,11 @@ if (!$cmd) <LINK rel="stylesheet" type="text/css" href="../estilos.css"> <SCRIPT language="javascript" src="./jscripts/IniciarSesion.js"></SCRIPT> <SCRIPT language="javascript" src="../clases/jscripts/HttpLib.js"></SCRIPT> +<SCRIPT language="javascript" src="./jscripts/comunescomandos.js"></SCRIPT> +<SCRIPT language="javascript" src="../jscripts/constantes.js"></SCRIPT> +<SCRIPT language="javascript" src="../jscripts/arrays.js"></SCRIPT> <?php echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/iniciarsesion_'.$idioma.'.js"></SCRIPT>'?> <?php echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> -<SCRIPT language="javascript" src="./jscripts/comunescomandos.js"></SCRIPT> </HEAD> <BODY> <?php @@ -44,13 +51,24 @@ if (!$cmd) // include_once("./includes/FiltradoAmbito.php"); //________________________________________________________________________________________________________ -?> + if($ambito!=$AMBITO_ORDENADORES){ + $cadenaid=""; + $cadenaip=""; + $cadenamac=""; + RecopilaIpesMacs($cmd,$ambito,$idambito); + + ?> <P align=center> <SPAN align=center class=subcabeceras><? echo $TbMsg[7] ?></SPAN> </BR> -<form align=center name="fdatos"> - <?php echo tablaConfiguracionesIniciarSesion($cmd,$idambito); ?> +<form align=center name="fdatos" method="POST"> + <INPUT type="hidden" name="idambito" value="<? echo $idambito?>"> + <INPUT type="hidden" name="ambito" value="<? echo $ambito?>"> + <INPUT type="hidden" name="cadenaid" value="<? echo $cadenaid?>"> </form> + <?php } // fin if $ambito!=$AMBITO_ORDENADORES + + tablaConfiguracionesIniciarSesion($cmd,$idambito,$ambito); ?> <?php //________________________________________________________________________________________________________ include_once("./includes/formularioacciones.php"); diff --git a/admin/WebConsole/comandos/InventarioSoftware.php b/admin/WebConsole/comandos/InventarioSoftware.php index 1aeea4bb..3f154134 100644 --- a/admin/WebConsole/comandos/InventarioSoftware.php +++ b/admin/WebConsole/comandos/InventarioSoftware.php @@ -67,7 +67,7 @@ switch($ambito){ <P align=center> <SPAN align=center class=subcabeceras><? echo $TbMsg[7] ?></SPAN> </p> - <?php echo tablaConfiguracionesIniciarSesion($cmd,$idambito); ?> + <?php echo tablaConfiguracionesInventarioSoftware($cmd,$idambito); ?> </BR> <? diff --git a/admin/WebConsole/comandos/RestaurarImagen.php b/admin/WebConsole/comandos/RestaurarImagen.php index e1633415..ec61a10e 100644 --- a/admin/WebConsole/comandos/RestaurarImagen.php +++ b/admin/WebConsole/comandos/RestaurarImagen.php @@ -132,6 +132,8 @@ if (isset($_POST["fk_nombreSO"])) $fk_nombreSO=$_POST["fk_nombreSO"]; /*________________________________________________________________________________________________________ Crea la etiqueta html <SELECT> de los perfiles softwares +// Version 0.1: En consulta SQL se quita imagenes.numpar>0. las imágenes recien creadas tienen numpar=0. +// US ETSII - Irina Gomez - 2014-11-11 ________________________________________________________________________________________________________*/ function HTMLSELECT_imagenes($cmd,$idimagen,$numpar,$codpar,$icp,$sw,$idordenadores,$ambito) { @@ -145,8 +147,8 @@ function HTMLSELECT_imagenes($cmd,$idimagen,$numpar,$codpar,$icp,$sw,$idordenado else $cmd->texto.= " WHERE imagenes.codpar<>".$codpar; - $cmd->texto.=" AND imagenes.numpar>0 AND imagenes.codpar>0 AND imagenes.idrepositorio>0 "; // La imagene debe existir y - $cmd->texto.=" AND imagenes.tipo=".$IMAGENES_MONOLITICAS; + $cmd->texto.=" AND imagenes.codpar>0 AND imagenes.idrepositorio>0 "; // La imagene debe existir y + $cmd->texto.=" AND imagenes.tipo=".$IMAGENES_MONOLITICAS; $idordenador1 = explode(",",$idordenadores); $idordenador=$idordenador1[0]; @@ -154,10 +156,6 @@ function HTMLSELECT_imagenes($cmd,$idimagen,$numpar,$codpar,$icp,$sw,$idordenado $cmd->texto.=" AND repositorios.idrepositorio=(select idrepositorio from ordenadores where ordenadores.idordenador=" .$idordenador .") OR repositorios.ip=(select ip from ordenadores where ordenadores.idordenador=". $idordenador .")"; else $cmd->texto.=" AND repositorios.idrepositorio=(select idrepositorio from ordenadores where ordenadores.idordenador=" .$idordenador .")"; - - - - //echo $cmd->texto; $rs=new Recordset; $rs->Comando=&$cmd; diff --git a/admin/WebConsole/comandos/RestaurarImagenBasica.php b/admin/WebConsole/comandos/RestaurarImagenBasica.php index e08a7211..7b431c67 100644 --- a/admin/WebConsole/comandos/RestaurarImagenBasica.php +++ b/admin/WebConsole/comandos/RestaurarImagenBasica.php @@ -161,7 +161,6 @@ function HTMLSELECT_imagenes($cmd,$idimagen,$numpar,$codpar,$icp,$sw,$idordenado $cmd->texto.= " WHERE imagenes.codpar<>".$codpar; $cmd->texto.=" AND imagenes.tipo=".$IMAGENES_BASICAS." - AND imagenes.numpar>0 AND imagenes.codpar>0 AND imagenes.idrepositorio>0"; //AND imagenes.idperfilsoft>0"; // La imagene debe existir y estar creada diff --git a/admin/WebConsole/comandos/gestores/gestor_Comandos.php b/admin/WebConsole/comandos/gestores/gestor_Comandos.php index cd01a728..7e22d431 100644 --- a/admin/WebConsole/comandos/gestores/gestor_Comandos.php +++ b/admin/WebConsole/comandos/gestores/gestor_Comandos.php @@ -75,8 +75,20 @@ $atributos=str_replace('$',chr(9),$atributos); <BODY> <SCRIPT language="javascript" src="../jscripts/comunescomandos.js"></SCRIPT> <? echo '<SCRIPT language="javascript" src="../../idiomas/javascripts/'.$idioma.'/comandos/comunescomandos_'.$idioma.'.js"></SCRIPT>'?> + <? echo '<SCRIPT language="javascript" src="../../idiomas/javascripts/'.$idioma.'/comandos/ejecutarscripts_'.$idioma.'.js"></SCRIPT>'?> <?php +//################################################################## +if ( ereg("ptc=UNICAST", $atributos) & $ambito!=16) { ?> + <SCRIPT language="javascript"> + if (confirm(TbMsg[4]) == false) { + alert(CTbMsg[0]); + location.href="../../nada.php" + } + </SCRIPT> +<?php } ?> +<?php +//################################################################## /* Recopila identificadore ,ipes y macs para envío de comandos */ $cadenaid=""; $cadenaip=""; diff --git a/admin/WebConsole/comandos/includes/opcionesacciones.php b/admin/WebConsole/comandos/includes/opcionesacciones.php index 601403b0..c973a691 100644 --- a/admin/WebConsole/comandos/includes/opcionesacciones.php +++ b/admin/WebConsole/comandos/includes/opcionesacciones.php @@ -10,8 +10,9 @@ // ************************************************************************************************************************************************* ?> <P align=center><span align=center class=subcabeceras><? echo $TbMsgAux[0] ?></span></P> - - +<?php if ($ambito !=16 ){ ?> + <INPUT type="hidden" name="ambito" value="<? echo $ambito?>"> +<?php } ?> <?if($idcomando!=10){?> <TABLE align=center> <TR> diff --git a/admin/WebConsole/comandos/jscripts/Configurar.js b/admin/WebConsole/comandos/jscripts/Configurar.js index bcb9e0ff..2b7e5f29 100644 --- a/admin/WebConsole/comandos/jscripts/Configurar.js +++ b/admin/WebConsole/comandos/jscripts/Configurar.js @@ -101,6 +101,7 @@ function Confirmar(cc) // Confirma un bloque de configuración de particiones // Parametros: // cc: Identificador de la configuración (bloque de particiones) +// Version 1.1: 2015-02-25. Irina Gomez ETSII US. Se envian datos de cuarta particion. //________________________________________________________________________________________________________ function comprobarDatos(cc) @@ -213,12 +214,13 @@ function comprobarDatos(cc) } for(var i=1;i<=maxpar;i++){ - if(i!=4){ + // Version 1.1: Se envian datos cuarta particion. + //if(i!=4){ if(tbparam[i]!=undefined) atributos+=tbparam[i]; else atributos+="par="+i+TB+"cpt=EMPTY"+TB+"sfi=EMPTY"+TB+"tam=0"+TB+"ope=0"+SL; - } + //} } // Completa con EMPTY si las particiones son menores a 4 y no hay cache diff --git a/admin/WebConsole/comandos/jscripts/IniciarSesion.js b/admin/WebConsole/comandos/jscripts/IniciarSesion.js index 3967f665..343524e3 100644 --- a/admin/WebConsole/comandos/jscripts/IniciarSesion.js +++ b/admin/WebConsole/comandos/jscripts/IniciarSesion.js @@ -6,24 +6,57 @@ // Nombre del fichero: IniciarSesion.js // Descripción : // Este fichero implementa las funciones javascript del fichero IniciarSesion.php (Comandos) +// Version: 0.1 - el valor del filtro = ips de los equipos comunes entre la seleccion de la configuración y el filtro. +// Nota: no se utiliza document.fdatosejecucion.idambito.value. Su valor no es correcto. +// Fecha: 2014-10-23 +// Autora: Irina Gomez, ETSII Universidad de Sevilla // ************************************************************************************************************************************************* function confirmar(){ if (comprobar_datos()){ + var RC="@"; + // UHU - Ahora puede ser cualquier disco + var atributos=""; + // devuelve las ip de los ordenadores del filtro o vacio si estan todos seleccionados. + filtrado(); + var ipfiltro=document.fdatosejecucion.filtro.value; // Compone atributos del comando tb_conf=document.getElementById("tabla_conf"); - var ochecks=tb_conf.getElementsByTagName('INPUT') - var diskPart; + var ochecks=tb_conf.getElementsByTagName('INPUT'); for(var i=0;i<ochecks.length;i++){ if(ochecks[i].checked){ - diskPart=ochecks[i].value.split(";"); + var diskPart = ochecks[i].value.split(";"); + var disco = diskPart[0]; + var numpar= diskPart[1]; + atributos+="dsk="+disco+RC; + atributos+="par="+numpar+RC; + // Datos bloque de configuracion: ip equipos. + var cc=ochecks[i].getAttribute('idcfg'); + var tbOrd=document.getElementById("tbOrd_"+cc); + var iptabla=tbOrd.getAttribute('value'); + + // Elimino los ordenadores del filtro que no estén en la tabla. + if (ipfiltro!=''){ + var arraytabla = iptabla.split(","); + var arrayfiltro =ipfiltro.split(";"); + arrayfiltro = array_interset (arrayfiltro.sort(), arraytabla.sort()); + ipfiltro = arrayfiltro.join(";"); + if (ipfiltro ==''){ + alert(TbMsg["FILTER"]); + return(false); + } + } + else { + ipfiltro=iptabla.replace(",", ";"); + } + document.fdatosejecucion.filtro.value=ipfiltro; + document.fdatosejecucion.atributos.value=atributos; + document.fdatosejecucion.submit(); + break; + + } } - var RC='@'; - var disk = diskPart[0]; - var particion = diskPart[1]; - document.fdatosejecucion.atributos.value="dsk="+disk+RC+"par="+particion+RC; - filtrado(); - document.fdatosejecucion.submit(); + } } //________________________________________________________________________________________________________ diff --git a/admin/WebConsole/comandos/jscripts/RestaurarImagen.js b/admin/WebConsole/comandos/jscripts/RestaurarImagen.js index 91e7b3ea..d675fa8d 100644 --- a/admin/WebConsole/comandos/jscripts/RestaurarImagen.js +++ b/admin/WebConsole/comandos/jscripts/RestaurarImagen.js @@ -59,7 +59,7 @@ } //________________________________________________________________________________________________________ function cancelar(){ - alert(CTbMsg[0]); + alert(TbMsg[0]); location.href="../nada.php" } //________________________________________________________________________________________________________ diff --git a/admin/WebConsole/comandos/jscripts/comunescomandos.js b/admin/WebConsole/comandos/jscripts/comunescomandos.js index 36bc6a38..22c316b9 100644 --- a/admin/WebConsole/comandos/jscripts/comunescomandos.js +++ b/admin/WebConsole/comandos/jscripts/comunescomandos.js @@ -94,6 +94,14 @@ function clic_mktarea(o){ document.fdatosejecucion.nombretarea.value=""; document.fdatosejecucion.sw_tarea[1].checked=false; document.fdatosejecucion.idtarea.selectedIndex=0; + }else{ + // Avisar si el código incluye reinicio o apagado. + if (typeof document.fdatos.codigo !== undefined) { + if (document.fdatos.codigo.value.match(/(poweroff|reboot)/)) { + // AVISO: si el código incluye reinicio o apagado, puede provocar que el cliente no inicie correctamente. + alert(CTbMsg[16]); + } + } } } function clic_nwtarea(o){ @@ -121,6 +129,14 @@ function clic_mkprocedimiento(o){ document.fdatosejecucion.nombreprocedimiento.value=""; document.fdatosejecucion.sw_procedimiento[1].checked=false; document.fdatosejecucion.idprocedimiento.selectedIndex=0; + }else{ + // Avisar si el código incluye reinicio o apagado. + if (typeof document.fdatos.codigo !== undefined) { + if (document.fdatos.codigo.value.match(/(poweroff|reboot)/)) { + // AVISO: si el código incluye reinicio o apagado, puede provocar que el cliente no inicie correctamente. + alert(CTbMsg[16]); + } + } } } function clic_nwprocedimiento(o){ diff --git a/admin/WebConsole/gestores/gestor_ejecutaracciones.php b/admin/WebConsole/gestores/gestor_ejecutaracciones.php index cf53f5c4..308d1680 100644 --- a/admin/WebConsole/gestores/gestor_ejecutaracciones.php +++ b/admin/WebConsole/gestores/gestor_ejecutaracciones.php @@ -156,13 +156,14 @@ function ejecucionTarea($idtarea) //________________________________________________________________________________________________________
function recorreProcedimientos($idprocedimiento,$ambito,$idambito)
{
- global $cmd;
-
- $cmd->texto="SELECT idcomando,procedimientoid,parametros
- FROM procedimientos_acciones
- WHERE idprocedimiento=".$idprocedimiento."
- ORDER BY orden";
- //echo $cmd->texto;
+ global $cmd;
+ global $sesion;
+
+ $cmd->texto="SELECT idcomando,procedimientoid,parametros
+ FROM procedimientos_acciones
+ WHERE idprocedimiento=".$idprocedimiento."
+ ORDER BY orden";
+
$rs=new Recordset;
$rs->Comando=&$cmd;
if (!$rs->Abrir()) return(false); // Error al abrir recordset
@@ -176,6 +177,13 @@ function recorreProcedimientos($idprocedimiento,$ambito,$idambito) else{
$parametros=$rs->campos["parametros"];
$idcomando=$rs->campos["idcomando"];
+ // Ticket 681: bucle infinito en procedimiento compuesto (J.M. Alonso).
+ do{
+ $nwsesion=time();
+ }while($sesion==$nwsesion);
+ $sesion=$nwsesion;
+ $cmd->ParamSetValor("@sesion",$sesion);
+ // Fin ticket 681.
if(!insertaComando($idcomando,$parametros,$idprocedimiento,$ambito,$idambito))
return(false);
}
diff --git a/admin/WebConsole/gestores/gestor_menus.php b/admin/WebConsole/gestores/gestor_menus.php index 0b1bb948..e024100c 100644 --- a/admin/WebConsole/gestores/gestor_menus.php +++ b/admin/WebConsole/gestores/gestor_menus.php @@ -23,11 +23,7 @@ $opcion=0; // Inicializa parametros $idmenu=0; $descripcion=""; $titulo=""; -$coorx=0; -$coory=0; $modalidad=0; -$scoorx=0; -$scoory=0; $smodalidad=0; $comentarios=""; $grupoid=0; @@ -42,12 +38,8 @@ if (isset($_POST["idmenu"])) $idmenu=$_POST["idmenu"]; if (isset($_POST["identificador"])) $idmenu=$_POST["identificador"]; if (isset($_POST["descripcion"])) $descripcion=$_POST["descripcion"]; if (isset($_POST["titulo"])) $titulo=$_POST["titulo"]; -if (isset($_POST["coorx"])) $coorx=$_POST["coorx"]; -if (isset($_POST["coory"])) $coory=$_POST["coory"]; -if (isset($_POST["modalidad"])) $modalidad=$_POST["modalidad"]; -if (isset($_POST["scoorx"])) $scoorx=$_POST["scoorx"]; -if (isset($_POST["scoory"])) $scoory=$_POST["scoory"]; +if (isset($_POST["modalidad"])) $modalidad=$_POST["modalidad"]; if (isset($_POST["smodalidad"])) $smodalidad=$_POST["smodalidad"]; if (isset($_POST["comentarios"])) $comentarios=$_POST["comentarios"]; @@ -120,13 +112,9 @@ function Gestiona(){ global $idcentro; global $idmenu; global $descripcion; - global $titulo; - global $coorx; - global $coory; - global $modalidad; - global $scoorx; - global $scoory; - global $smodalidad; + global $titulo; + global $modalidad; + global $smodalidad; global $comentarios; global $grupoid; global $htmlmenupub; @@ -146,11 +134,7 @@ function Gestiona(){ $cmd->CreaParametro("@idmenu",$idmenu,1); $cmd->CreaParametro("@descripcion",$descripcion,0); $cmd->CreaParametro("@titulo",$titulo,0); - $cmd->CreaParametro("@coorx",$coorx,1); - $cmd->CreaParametro("@coory",$coory,1); $cmd->CreaParametro("@modalidad",$modalidad,1); - $cmd->CreaParametro("@scoorx",$scoorx,1); - $cmd->CreaParametro("@scoory",$scoory,1); $cmd->CreaParametro("@smodalidad",$smodalidad,1); $cmd->CreaParametro("@comentarios",$comentarios,0); $cmd->CreaParametro("@grupoid",$grupoid,1); @@ -161,9 +145,9 @@ function Gestiona(){ switch($opcion){ case $op_alta : - $cmd->texto="INSERT INTO menus (descripcion,titulo,coorx,coory,modalidad,scoorx,scoory,smodalidad, + $cmd->texto="INSERT INTO menus (descripcion,titulo,modalidad,smodalidad, comentarios,idcentro,grupoid,htmlmenupub,htmlmenupri,resolucion,idurlimg) - VALUES (@descripcion,@titulo,@coorx,@coory,@modalidad,@scoorx,@scoory,@smodalidad, + VALUES (@descripcion,@titulo,@modalidad,@smodalidad, @comentarios,@idcentro,@grupoid,@htmlmenupub,@htmlmenupri,@resolucion,@idurlimg)"; $resul=$cmd->Ejecutar(); if ($resul){ // Crea una tabla nodo para devolver a la página que llamó ésta @@ -176,7 +160,7 @@ function Gestiona(){ } break; case $op_modificacion: - $cmd->texto="UPDATE menus SET descripcion=@descripcion,titulo=@titulo,coorx=@coorx,coory=@coory,modalidad=@modalidad,scoorx=@scoorx,scoory=@scoory,smodalidad=@smodalidad, + $cmd->texto="UPDATE menus SET descripcion=@descripcion,titulo=@titulo,modalidad=@modalidad,smodalidad=@smodalidad, comentarios=@comentarios,htmlmenupub=@htmlmenupub ,htmlmenupri=@htmlmenupri,resolucion=@resolucion,idurlimg=@idurlimg WHERE idmenu=@idmenu"; $resul=$cmd->Ejecutar(); diff --git a/admin/WebConsole/gestores/gestor_ordenadores.php b/admin/WebConsole/gestores/gestor_ordenadores.php index 58ccb0fd..d89e7fe1 100644 --- a/admin/WebConsole/gestores/gestor_ordenadores.php +++ b/admin/WebConsole/gestores/gestor_ordenadores.php @@ -60,7 +60,7 @@ if (isset($_POST["idordenador"])) $idordenador=$_POST["idordenador"]; if (isset($_POST["identificador"])) $idordenador=$_POST["identificador"]; if (isset($_POST["nombreordenador"])) $nombreordenador=$_POST["nombreordenador"]; if (isset($_POST["ip"])) $ip=$_POST["ip"]; -if (isset($_POST["mac"])) $mac=$_POST["mac"]; +if (isset($_POST["mac"])) $mac=str_replace(":","",$_POST["mac"]); if (isset($_POST["idperfilhard"])) $idperfilhard=$_POST["idperfilhard"]; if (isset($_POST["idrepositorio"])) $idrepositorio=$_POST["idrepositorio"]; if (isset($_POST["idmenu"])) $idmenu=$_POST["idmenu"]; diff --git a/admin/WebConsole/gestores/gestor_repositorios.php b/admin/WebConsole/gestores/gestor_repositorios.php index c8eb14a2..88727394 100644 --- a/admin/WebConsole/gestores/gestor_repositorios.php +++ b/admin/WebConsole/gestores/gestor_repositorios.php @@ -23,9 +23,6 @@ $idrepositorio=0; $nombrerepositorio=""; $ip=""; $passguor=""; -$pathrepoconf=""; -$pathrepod=""; -$pathpxe=""; $grupoid=0; $puertorepo=""; @@ -40,9 +37,6 @@ if (isset($_POST["identificador"])) $idrepositorio=$_POST["identificador"]; if (isset($_POST["nombrerepositorio"])) $nombrerepositorio=$_POST["nombrerepositorio"]; if (isset($_POST["ip"])) $ip=$_POST["ip"]; if (isset($_POST["passguor"])) $passguor=$_POST["passguor"]; -if (isset($_POST["pathrepoconf"])) $pathrepoconf=$_POST["pathrepoconf"]; -if (isset($_POST["pathrepod"])) $pathrepod=$_POST["pathrepod"]; -if (isset($_POST["pathpxe"])) $pathpxe=$_POST["pathpxe"]; if (isset($_POST["puertorepo"])) $puertorepo=$_POST["puertorepo"]; if (isset($_POST["comentarios"])) $comentarios=$_POST["comentarios"]; @@ -114,9 +108,6 @@ function Gestiona(){ global $nombrerepositorio; global $ip; global $passguor; - global $pathrepoconf; - global $pathrepod; - global $pathpxe; global $puertorepo; global $comentarios; @@ -134,15 +125,12 @@ function Gestiona(){ $cmd->CreaParametro("@nombrerepositorio",$nombrerepositorio,0); $cmd->CreaParametro("@ip",$ip,0); $cmd->CreaParametro("@passguor",$passguor,0); - $cmd->CreaParametro("@pathrepoconf",$pathrepoconf,0); - $cmd->CreaParametro("@pathrepod",$pathrepod,0); - $cmd->CreaParametro("@pathpxe",$pathpxe,0); $cmd->CreaParametro("@puertorepo",$puertorepo,0); $cmd->CreaParametro("@comentarios",$comentarios,0); switch($opcion){ case $op_alta : - $cmd->texto="INSERT INTO repositorios(idcentro,grupoid,nombrerepositorio,ip,passguor,pathrepoconf,pathrepod,pathpxe,puertorepo,comentarios) VALUES (@idcentro,@grupoid,@nombrerepositorio,@ip,@passguor,@pathrepoconf,@pathrepod,@pathpxe,@puertorepo,@comentarios)"; + $cmd->texto="INSERT INTO repositorios(idcentro,grupoid,nombrerepositorio,ip,passguor,puertorepo,comentarios) VALUES (@idcentro,@grupoid,@nombrerepositorio,@ip,@passguor,@puertorepo,@comentarios)"; $resul=$cmd->Ejecutar(); if ($resul){ // Crea una tabla nodo para devolver a la p�gina que llam� �sta $idrepositorio=$cmd->Autonumerico(); @@ -154,7 +142,7 @@ function Gestiona(){ } break; case $op_modificacion: - $cmd->texto="UPDATE repositorios SET nombrerepositorio=@nombrerepositorio,ip=@ip,passguor=@passguor,pathrepoconf=@pathrepoconf,pathrepod=@pathrepod,pathpxe=@pathpxe,puertorepo=@puertorepo,comentarios=@comentarios WHERE idrepositorio=@idrepositorio"; + $cmd->texto="UPDATE repositorios SET nombrerepositorio=@nombrerepositorio,ip=@ip,passguor=@passguor,puertorepo=@puertorepo,comentarios=@comentarios WHERE idrepositorio=@idrepositorio"; $resul=$cmd->Ejecutar(); break; case $op_eliminacion : diff --git a/admin/WebConsole/idiomas/javascripts/cat/comandos/comunescomandos_cat.js b/admin/WebConsole/idiomas/javascripts/cat/comandos/comunescomandos_cat.js index 0c7c5904..337bd952 100644 --- a/admin/WebConsole/idiomas/javascripts/cat/comandos/comunescomandos_cat.js +++ b/admin/WebConsole/idiomas/javascripts/cat/comandos/comunescomandos_cat.js @@ -1,9 +1,9 @@ //________________________________________________________________________________________________________ // -// Fichero de idiomas javascripts: comunescomandos_esp.js (Común a todos los comandos) -// Idioma: Español +// Fichero de idiomas javascripts: comunescomandos_cat.js (Común a todos los comandos) +// Idioma: Catalán //________________________________________________________________________________________________________ -CTbMsg=new Array; +var CTbMsg=new Array; CTbMsg[0]="ATENCIÓN.- Acción cancelada, puede volver en cualquier momento a esta pantalla para ejecutar este Comando"; CTbMsg[1]="ATENCIÓN: Ha ocurrido un error al intentar enviar este Comando"; CTbMsg[2]="El comando se ha enviado correctamente"; @@ -12,3 +12,13 @@ CTbMsg[4]="El comando se ha registrado correctamente como un Procedimineto"; CTbMsg[5]="ATENCIÓN: Ha ocurrido un error al intentar registrar este Comando como una Tarea"; CTbMsg[6]="El comando se ha registrado correctamente como una Tarea"; CTbMsg[7]="ATENCIÓN: Ha ocurrido un error al intentar registrar la acción de Comando"; + +CTbMsg[8]="ATENCIÓN.- Debe elegir al menos un modo de ejecución "; +CTbMsg[9]="ATENCIÓN.- Debe elegir un modo de ejecución inmediata"; +CTbMsg[10]="ATENCIÓN.- Debe elegir un modo de inclusión en procedimiento de este comando "; +CTbMsg[11]="ATENCIÓN.- Debe especificar el nombre del nuevo procedimiento que se creará y al que se añadirá este comando "; +CTbMsg[12]="ATENCIÓN.- Debe elegir el procedimiento al que se añadirá este comando"; +CTbMsg[13]="ATENCIÓN.- Debe elegir un modo de inclusión en tarea ejecutable, de este comando"; +CTbMsg[14]="ATENCIÓN.- Debe especificar el nombre de la nueva tarea ejecutable que se creará y a la que se añadirá este comando"; +CTbMsg[15]="ATENCIÓN.- Debe elegir la tarea a la que se añadirá este comando"; +CTbMsg[16]="AVISO: si el código incluye reinicio o apagado, puede provocar que el cliente no inicie correctamente"; diff --git a/admin/WebConsole/idiomas/javascripts/cat/comandos/configurar_cat.js b/admin/WebConsole/idiomas/javascripts/cat/comandos/configurar_cat.js index b4b05984..57a833e0 100644 --- a/admin/WebConsole/idiomas/javascripts/cat/comandos/configurar_cat.js +++ b/admin/WebConsole/idiomas/javascripts/cat/comandos/configurar_cat.js @@ -9,4 +9,7 @@ TbMsg[1]="El número de la partición debe ser mayor de 0"; TbMsg[2]="El tipo de partición no se ha especificado"; TbMsg[3]="El tamaño de la partición debe ser mayor que cero"; TbMsg[4]="ATENCIÓN: Se va a eliminar esta partición ¿ Está seguro ?"; +TbMsg[5]="Debe especificar el tipo de sistema de fichero si desea formatear la partición"; +TbMsg[6]="La CACHE sólo puede definirse en la partición 4"; +TbMsg[7]="El número máximo de particiones es 4"; diff --git a/admin/WebConsole/idiomas/javascripts/cat/comandos/iniciarsesion_cat.js b/admin/WebConsole/idiomas/javascripts/cat/comandos/iniciarsesion_cat.js index 2708a5fe..09b21331 100644 --- a/admin/WebConsole/idiomas/javascripts/cat/comandos/iniciarsesion_cat.js +++ b/admin/WebConsole/idiomas/javascripts/cat/comandos/iniciarsesion_cat.js @@ -6,3 +6,4 @@ TbMsg=new Array; TbMsg[0]=""; TbMsg[1]="Debe elegir al menos una partición"; +TbMsg["FILTER"]="Debe seleccionar al menos un ordenador que tenga la configuración elegida."; diff --git a/admin/WebConsole/idiomas/javascripts/cat/ejecutaracciones_cat.js b/admin/WebConsole/idiomas/javascripts/cat/ejecutaracciones_cat.js index 5a655679..2ebeff37 100644 --- a/admin/WebConsole/idiomas/javascripts/cat/ejecutaracciones_cat.js +++ b/admin/WebConsole/idiomas/javascripts/cat/ejecutaracciones_cat.js @@ -6,5 +6,4 @@ TbMsg=new Array; TbMsg[0]="ATENCIÓN.- El Procedimiento será ejecutado aplicándolo a este ámbito. ¿ Está seguro ?"; TbMsg[1]="El Procedimiento ha sido gestionado correctamente para este ámbito"; -TbMsg[2]="ATENCIÓN.- El Procedimiento se convertirá en procedimiento de inicio (Autoexec) para todos los ordenadores de este ámbito. ¿ Está seguro ?"; - +TbMsg[4]="\t!!!!! ATENCIÓ !!!!! \nHa seleccionat Unicast en diversos ordinadors,\nLa transferència pot demorar en el temps";
\ No newline at end of file diff --git a/admin/WebConsole/idiomas/javascripts/cat/propiedades_aulas_cat.js b/admin/WebConsole/idiomas/javascripts/cat/propiedades_aulas_cat.js index db27cc88..fcc7d60b 100644 --- a/admin/WebConsole/idiomas/javascripts/cat/propiedades_aulas_cat.js +++ b/admin/WebConsole/idiomas/javascripts/cat/propiedades_aulas_cat.js @@ -4,7 +4,7 @@ // Idioma: Catalán //________________________________________________________________________________________________________ TbMsg=new Array; -TbMsg[0]="Debe introducir un nombre para este aula"; +TbMsg[0]="El nombre del aula debe contener caracteres alfanuméricos"; TbMsg[1]="Debe introducir un número de puestos para este aula"; TbMsg[2]="ATENCIÓN.- Esta aula contiene grupos de ordenadores u ordenadores. Si los elimina, eliminará también éstos. ¿ Está seguro ?"; TbMsg[3]="La hora de comienzo del intervalo de reservas debe ser menor que la hora final"; @@ -19,4 +19,8 @@ TbMsg[11]="La velocidad de multicast no es válida, sólo números"; TbMsg[12]="La dirección IP del servidor DNS no es válida"; TbMsg[13]="La URL del servidor Proxy no es válida"; TbMsg[14]="Deben introducirse datos de validación: página de login y página de validación"; +TbMsg[15]="La URL de la página de login no es válida"; +TbMsg[16]="La URL de la página de validación no es válida"; +TbMsg[17]="La ubicación sólo puede contener caracteres alfanuméricos" +TbMsg[18]="Los comentarios sólo pueden contener caracteres alfanuméricos" diff --git a/admin/WebConsole/idiomas/javascripts/cat/propiedades_menus_cat.js b/admin/WebConsole/idiomas/javascripts/cat/propiedades_menus_cat.js index 5aafbe88..b0e2c34f 100644 --- a/admin/WebConsole/idiomas/javascripts/cat/propiedades_menus_cat.js +++ b/admin/WebConsole/idiomas/javascripts/cat/propiedades_menus_cat.js @@ -6,3 +6,4 @@ TbMsg=new Array; TbMsg[0]="Debe introducir un nombre para este menú"; TbMsg[1]="ATENCIÓN: Hay ordenadores con este menú. No puede darlo de baja hasta que cambie este dato en dichos ordenadores"; +TbMsg[2]="Las url de los menús personalizados,privados o públicos, deben empezar con http:// o https://"; diff --git a/admin/WebConsole/idiomas/javascripts/cat/propiedades_repositorios_cat.js b/admin/WebConsole/idiomas/javascripts/cat/propiedades_repositorios_cat.js index 881a9860..547d7e6b 100644 --- a/admin/WebConsole/idiomas/javascripts/cat/propiedades_repositorios_cat.js +++ b/admin/WebConsole/idiomas/javascripts/cat/propiedades_repositorios_cat.js @@ -1,12 +1,11 @@ //____________________________________________________________________________ // -// Fichero de idiomas javascript: propiedades_servidoresrembo_esp.js -// Idioma: Español +// Fichero de idiomas javascript: propiedades_repositorios_cat.js +// Idioma: Catalán //____________________________________________________________________________ TbMsg=new Array; -TbMsg[0]="Debe introducir un nombre para este repositorio"; +TbMsg[0]="El nombre del repositorio sólo puede contener caracteres alfanuméricos"; TbMsg[1]="Debe introducir una dirección IP"; TbMsg[2]="ATENCIÓN: Hay imágenes alojadas por este repositorio. ¿Está seguro de querer eliminarlo ?"; TbMsg[3]="Debe introducir un puerto de comunicaciones para los clientes"; -TbMsg[4]="Debe introducir la ruta del directorio base del Repositorio"; -TbMsg[5]="Debe introducir la ruta del directorio donde están los archivos de configuración del PXE"; +TbMsg[4]="Los comentarios sólo pueden contener caracteres alfanuméricos"; diff --git a/admin/WebConsole/idiomas/javascripts/eng/comandos/comunescomandos_eng.js b/admin/WebConsole/idiomas/javascripts/eng/comandos/comunescomandos_eng.js index 645666e0..a5023c96 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/comandos/comunescomandos_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/comandos/comunescomandos_eng.js @@ -1,9 +1,9 @@ //________________________________________________________________________________________________________ // -// Fichero de idiomas javascripts: comunescomandos_eng.js (Com�n a todos los comandos) -// Idioma: Ing�s +// Fichero de idiomas javascripts: comunescomandos_eng.js (Común a todos los comandos) +// Idioma: Inglés //________________________________________________________________________________________________________ -CTbMsg=new Array; +var CTbMsg=new Array; CTbMsg[0]="WARNING.- Cancelled operation, you will might come back this screen in another moment to perform this command"; CTbMsg[1]="WARNING: An error occurs when attempt to register command"; CTbMsg[2]="The command has been successfully registered"; @@ -18,6 +18,7 @@ CTbMsg[9]="WARNING: You must choose a way of immediate execution"; CTbMsg[10]="WARNING: You must choose a way of inclusion this command on procedure"; CTbMsg[11]="WARNING: You must specify the name of the new procedure where this command will be added"; CTbMsg[12]="WARNING: You should choose the procedure that will add this command"; -CTbMsg[13]="WARNING: You must choose a way of inclusion this command on task executable"; +CTbMsg[13]="WARNING: You must choose a way of inclusion this command on task executable"; CTbMsg[14]="WARNING: You must specify the name of the new task where this command will be added"; -CTbMsg[15]="WARNING: You must choose the task that will add this command";
\ No newline at end of file +CTbMsg[15]="WARNING: You must choose the task that will add this command"; +CTbMsg[16]="AVISO: si el código incluye reinicio o apagado, puede provocar que el cliente no inicie correctamente"; diff --git a/admin/WebConsole/idiomas/javascripts/eng/comandos/configurar_eng.js b/admin/WebConsole/idiomas/javascripts/eng/comandos/configurar_eng.js index 0175c9a6..3c62905a 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/comandos/configurar_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/comandos/configurar_eng.js @@ -4,12 +4,12 @@ // Idioma: Ings //________________________________________________________________________________________________________ TbMsg=new Array; -TbMsg[0]="WARNING.- There are not partitions table modified, therefore no command will be registered"; -TbMsg[1]="WARNING.- There are partitions with the same number, you must select another or remove it clicking in the last column"; -TbMsg[2]="WARNING.- The size of the partition must be greater than zero"; -TbMsg[3]="WARNING.- The partition must be correlative and there would not have spaces between partitions"; -TbMsg[4]="WARNING.- This partition is empty, therefore you can't to perform any operation"; -TbMsg[5]="WARNING.- This partition must be just formatted because the operating system has changed or has changed the size of some partition"; -TbMsg[6]="WARNING.- There is not coherent to hide this partition because it is not a Windows partition"; -TbMsg[7]="WARNING.- There is not coherent to show this partition because it is not a Windows partition"; -TbMsg[8]="You can't add more partitions"; +TbMsg[0]="WARNING.- There are partitions with the same number, you must select another or remove it clicking in the last column"; +TbMsg[1]="WARNING.- The number of the partition must be greater than zero"; +TbMsg[2]="El tipo de particin no se ha especificado"; +TbMsg[3]="WARNING.- The size of the partition must be greater than zero"; +TbMsg[4]="ATENCION: Se va a eliminar esta particin Esta seguro ?"; +TbMsg[5]="Debe especificar el tipo de sistema de ficheros si desea formatear la particion"; +TbMsg[6]="La CACHE solo puede definirse en la particion 4"; +TbMsg[7]="El nmero maximo de particiones es 4"; + diff --git a/admin/WebConsole/idiomas/javascripts/eng/comandos/ejecutarscripts_eng.js b/admin/WebConsole/idiomas/javascripts/eng/comandos/ejecutarscripts_eng.js index e2de10f6..577b52c8 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/comandos/ejecutarscripts_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/comandos/ejecutarscripts_eng.js @@ -8,3 +8,4 @@ TbMsg[0]="WARNING.- Bash code will be performed Are you sure ?"; TbMsg[1]="You must introduce some code lines or at least a file with Bash code"; TbMsg[2]="You must introduce the title of the script whether you want to follow-up the accion or to save it like a procedure or task"; TbMsg[3]="You must introduce the description of the script whether you want to follow-up the accion or to save it like a procedure or task"; +TbMsg[4]="\t!!!!! WARNING !!!!! \nYou have selected unicast to multiple computers,\nThe transfer may be delayed in time";
\ No newline at end of file diff --git a/admin/WebConsole/idiomas/javascripts/eng/comandos/iniciarsesion_eng.js b/admin/WebConsole/idiomas/javascripts/eng/comandos/iniciarsesion_eng.js index 9af3afc2..86cd4cb3 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/comandos/iniciarsesion_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/comandos/iniciarsesion_eng.js @@ -6,3 +6,4 @@ TbMsg=new Array; TbMsg[0]=""; TbMsg[1]="You must choose at least one partition"; +TbMsg["FILTER"]="Debe seleccionar al menos un ordenador que tenga la configuración elegida."; diff --git a/admin/WebConsole/idiomas/javascripts/eng/ejecutaracciones_eng.js b/admin/WebConsole/idiomas/javascripts/eng/ejecutaracciones_eng.js index 5a655679..d8d27714 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/ejecutaracciones_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/ejecutaracciones_eng.js @@ -1,7 +1,7 @@ //____________________________________________________________________________ // -// Fichero de idiomas javascript: ejecutarprocedimientos_esp.js -// Idioma: Español +// Fichero de idiomas javascript: ejecutaracciones_eng.js +// Idioma: Ingles //____________________________________________________________________________ TbMsg=new Array; TbMsg[0]="ATENCIÓN.- El Procedimiento será ejecutado aplicándolo a este ámbito. ¿ Está seguro ?"; diff --git a/admin/WebConsole/idiomas/javascripts/eng/inclusionacciones_eng.js b/admin/WebConsole/idiomas/javascripts/eng/inclusionacciones_eng.js index 98239c6e..bb842521 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/inclusionacciones_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/inclusionacciones_eng.js @@ -1,7 +1,7 @@ //________________________________________________________________________________________________________ // -// Fichero de idiomas javascript: accionmenu_esp.js -// Idioma: Español +// Fichero de idiomas javascript: inclusionacciones_eng.js +// Idioma: Ingles //________________________________________________________________________________________________________ TbMsg=new Array; TbMsg[0]=""; diff --git a/admin/WebConsole/idiomas/javascripts/eng/propiedades_aulas_eng.js b/admin/WebConsole/idiomas/javascripts/eng/propiedades_aulas_eng.js index 7bd40d8c..94f5005d 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/propiedades_aulas_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/propiedades_aulas_eng.js @@ -4,7 +4,7 @@ // Idioma: Ings //________________________________________________________________________________________________________ TbMsg=new Array; -TbMsg[0]="You must introduce a name for this lab"; +TbMsg[0]="El nombre del aula debe contener caracteres alfanumericos"; TbMsg[1]="You must introduce a number of places for this lab"; TbMsg[2]="WARNING.- This lab contain others groups or labs. If you remove it, you will also remove all these. Are you sure ?"; TbMsg[3]="Time for begining of reserves periode must be smaller than final time"; @@ -18,5 +18,8 @@ TbMsg[10]="Multicast port is not valid"; TbMsg[11]="Multicast speed is not valid, use numbers only"; TbMsg[12]="DNS server IP address is not valid"; TbMsg[13]="Proxy server URL is not valid"; -TbMsg[14]="Deben introducirse datos de validacin: pgina de login y pgina de validacin"; - +TbMsg[14]="Deben introducirse datos de validacion: pagina de login y pagina de validacion"; +TbMsg[15]="La URL de la pagina de login no es valida"; +TbMsg[16]="La URL de la pagina de validacin no es valida"; +TbMsg[17]="La ubicacion solo puede contener caracteres alfanumericos" +TbMsg[18]="Los comentarios solo pueden contener caracteres alfanumericos" diff --git a/admin/WebConsole/idiomas/javascripts/eng/propiedades_menus_eng.js b/admin/WebConsole/idiomas/javascripts/eng/propiedades_menus_eng.js index 22f45bae..ab85bf7e 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/propiedades_menus_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/propiedades_menus_eng.js @@ -6,3 +6,4 @@ TbMsg=new Array; TbMsg[0]="You must introduce a name for this menu"; TbMsg[1]="WARNING: There are computers managed by this menu. You can't remove them until you change menu to this computers"; +TbMsg[2]="Las url de los mens personalizados,privados o pblicos, deben empezar con http:// o https://"; diff --git a/admin/WebConsole/idiomas/javascripts/eng/propiedades_repositorios_eng.js b/admin/WebConsole/idiomas/javascripts/eng/propiedades_repositorios_eng.js index 881a9860..bc243de7 100644 --- a/admin/WebConsole/idiomas/javascripts/eng/propiedades_repositorios_eng.js +++ b/admin/WebConsole/idiomas/javascripts/eng/propiedades_repositorios_eng.js @@ -1,12 +1,11 @@ //____________________________________________________________________________ // -// Fichero de idiomas javascript: propiedades_servidoresrembo_esp.js -// Idioma: Español +// Fichero de idiomas javascript: propiedades_repositorios_eng.js +// Idioma: Ingles //____________________________________________________________________________ TbMsg=new Array; -TbMsg[0]="Debe introducir un nombre para este repositorio"; +TbMsg[0]="El nombre del repositorio sólo puede contener caracteres alfanuméricos"; TbMsg[1]="Debe introducir una dirección IP"; TbMsg[2]="ATENCIÓN: Hay imágenes alojadas por este repositorio. ¿Está seguro de querer eliminarlo ?"; TbMsg[3]="Debe introducir un puerto de comunicaciones para los clientes"; -TbMsg[4]="Debe introducir la ruta del directorio base del Repositorio"; -TbMsg[5]="Debe introducir la ruta del directorio donde están los archivos de configuración del PXE"; +TbMsg[4]="Los comentarios sólo pueden contener caracteres alfanuméricos"; diff --git a/admin/WebConsole/idiomas/javascripts/esp/comandos/comunescomandos_esp.js b/admin/WebConsole/idiomas/javascripts/esp/comandos/comunescomandos_esp.js index f9ef7ac9..152c3787 100644 --- a/admin/WebConsole/idiomas/javascripts/esp/comandos/comunescomandos_esp.js +++ b/admin/WebConsole/idiomas/javascripts/esp/comandos/comunescomandos_esp.js @@ -3,7 +3,7 @@ // Fichero de idiomas javascripts: comunescomandos_esp.js (Común a todos los comandos) // Idioma: Español //________________________________________________________________________________________________________ -CTbMsg=new Array; +var CTbMsg=new Array; CTbMsg[0]="ATENCIÓN.- Acción cancelada, puede volver en cualquier momento a esta pantalla para ejecutar este Comando"; CTbMsg[1]="ATENCIÓN: Ha ocurrido un error al intentar enviar este Comando"; CTbMsg[2]="El comando se ha enviado correctamente"; @@ -20,4 +20,5 @@ CTbMsg[11]="ATENCIÓN.- Debe especificar el nombre del nuevo procedimiento que s CTbMsg[12]="ATENCIÓN.- Debe elegir el procedimiento al que se añadirá este comando"; CTbMsg[13]="ATENCIÓN.- Debe elegir un modo de inclusión en tarea ejecutable, de este comando"; CTbMsg[14]="ATENCIÓN.- Debe especificar el nombre de la nueva tarea ejecutable que se creará y a la que se añadirá este comando"; -CTbMsg[15]="ATENCIÓN.- Debe elegir la tarea a la que se añadirá este comando "; +CTbMsg[15]="ATENCIÓN.- Debe elegir la tarea a la que se añadirá este comando"; +CTbMsg[16]="AVISO: si el código incluye reinicio o apagado, puede provocar que el cliente no inicie correctamente"; diff --git a/admin/WebConsole/idiomas/javascripts/esp/comandos/configurar_esp.js b/admin/WebConsole/idiomas/javascripts/esp/comandos/configurar_esp.js index 0bbde452..2a65e061 100644 --- a/admin/WebConsole/idiomas/javascripts/esp/comandos/configurar_esp.js +++ b/admin/WebConsole/idiomas/javascripts/esp/comandos/configurar_esp.js @@ -9,4 +9,6 @@ TbMsg[1]="El número de la partición debe ser mayor de 0"; TbMsg[2]="El tipo de partición no se ha especificado"; TbMsg[3]="El tamaño de la partición debe ser mayor que cero"; TbMsg[4]="ATENCIÓN: Se va a eliminar esta partición ¿ Está seguro ?"; -TbMsg[5]="Debe especificar el tipo de fichero si desea formatear la partición"; +TbMsg[5]="Debe especificar el tipo de sistema de ficheros si desea formatear la partición"; +TbMsg[6]="La CACHE sólo puede definirse en la partición 4"; +TbMsg[7]="El número máximo de particiones es 4"; diff --git a/admin/WebConsole/idiomas/javascripts/esp/comandos/ejecutarscripts_esp.js b/admin/WebConsole/idiomas/javascripts/esp/comandos/ejecutarscripts_esp.js index 80da1b67..4d084149 100644 --- a/admin/WebConsole/idiomas/javascripts/esp/comandos/ejecutarscripts_esp.js +++ b/admin/WebConsole/idiomas/javascripts/esp/comandos/ejecutarscripts_esp.js @@ -6,3 +6,4 @@ TbMsg=new Array; TbMsg[0]=""; TbMsg[1]="El script debe tener alguna linea de código"; +TbMsg[4]="\t!!!!! ATENCIÓN !!!!! \nHa seleccionado UNICAST en varios ordenadores,\nLa transferencia puede demorarse en el tiempo";
\ No newline at end of file diff --git a/admin/WebConsole/idiomas/javascripts/esp/comandos/iniciarsesion_esp.js b/admin/WebConsole/idiomas/javascripts/esp/comandos/iniciarsesion_esp.js index 2708a5fe..09b21331 100644 --- a/admin/WebConsole/idiomas/javascripts/esp/comandos/iniciarsesion_esp.js +++ b/admin/WebConsole/idiomas/javascripts/esp/comandos/iniciarsesion_esp.js @@ -6,3 +6,4 @@ TbMsg=new Array; TbMsg[0]=""; TbMsg[1]="Debe elegir al menos una partición"; +TbMsg["FILTER"]="Debe seleccionar al menos un ordenador que tenga la configuración elegida."; diff --git a/admin/WebConsole/idiomas/javascripts/esp/propiedades_aulas_esp.js b/admin/WebConsole/idiomas/javascripts/esp/propiedades_aulas_esp.js index efdc4a57..0bc14ecc 100644 --- a/admin/WebConsole/idiomas/javascripts/esp/propiedades_aulas_esp.js +++ b/admin/WebConsole/idiomas/javascripts/esp/propiedades_aulas_esp.js @@ -4,7 +4,7 @@ // Idioma: Español //________________________________________________________________________________________________________ TbMsg=new Array; -TbMsg[0]="Debe introducir un nombre para este aula"; +TbMsg[0]="El nombre del aula debe contener caracteres alfanuméricos"; TbMsg[1]="Debe introducir un número de puestos para este aula"; TbMsg[2]="ATENCIÓN.- Esta aula contiene grupos de ordenadores u ordenadores. Si los elimina, eliminará también éstos. ¿ Está seguro ?"; TbMsg[3]="La hora de comienzo del intervalo de reservas debe ser menor que la hora final"; @@ -19,4 +19,8 @@ TbMsg[11]="La velocidad de multicast no es válida, sólo números"; TbMsg[12]="La dirección IP del servidor DNS no es válida"; TbMsg[13]="La URL del servidor Proxy no es válida"; TbMsg[14]="Deben introducirse datos de validación: página de login y página de validación"; +TbMsg[15]="La URL de la página de login no es válida"; +TbMsg[16]="La URL de la página de validación no es válida"; +TbMsg[17]="La ubicación sólo puede contener caracteres alfanuméricos" +TbMsg[18]="Los comentarios sólo pueden contener caracteres alfanuméricos" diff --git a/admin/WebConsole/idiomas/javascripts/esp/propiedades_menus_esp.js b/admin/WebConsole/idiomas/javascripts/esp/propiedades_menus_esp.js index 5aafbe88..b0e2c34f 100644 --- a/admin/WebConsole/idiomas/javascripts/esp/propiedades_menus_esp.js +++ b/admin/WebConsole/idiomas/javascripts/esp/propiedades_menus_esp.js @@ -6,3 +6,4 @@ TbMsg=new Array; TbMsg[0]="Debe introducir un nombre para este menú"; TbMsg[1]="ATENCIÓN: Hay ordenadores con este menú. No puede darlo de baja hasta que cambie este dato en dichos ordenadores"; +TbMsg[2]="Las url de los menús personalizados,privados o públicos, deben empezar con http:// o https://"; diff --git a/admin/WebConsole/idiomas/javascripts/esp/propiedades_repositorios_esp.js b/admin/WebConsole/idiomas/javascripts/esp/propiedades_repositorios_esp.js index 881a9860..9145ffd8 100644 --- a/admin/WebConsole/idiomas/javascripts/esp/propiedades_repositorios_esp.js +++ b/admin/WebConsole/idiomas/javascripts/esp/propiedades_repositorios_esp.js @@ -1,12 +1,11 @@ //____________________________________________________________________________ // -// Fichero de idiomas javascript: propiedades_servidoresrembo_esp.js +// Fichero de idiomas javascript: propiedades_repositorios_esp.js // Idioma: Español //____________________________________________________________________________ TbMsg=new Array; -TbMsg[0]="Debe introducir un nombre para este repositorio"; +TbMsg[0]="El nombre del repositorio sólo puede contener caracteres alfanuméricos"; TbMsg[1]="Debe introducir una dirección IP"; TbMsg[2]="ATENCIÓN: Hay imágenes alojadas por este repositorio. ¿Está seguro de querer eliminarlo ?"; TbMsg[3]="Debe introducir un puerto de comunicaciones para los clientes"; -TbMsg[4]="Debe introducir la ruta del directorio base del Repositorio"; -TbMsg[5]="Debe introducir la ruta del directorio donde están los archivos de configuración del PXE"; +TbMsg[4]="Los comentarios sólo pueden contener caracteres alfanuméricos"; diff --git a/admin/WebConsole/idiomas/php/cat/avisos_cat.php b/admin/WebConsole/idiomas/php/cat/avisos_cat.php index 39248b31..eb927081 100644 --- a/admin/WebConsole/idiomas/php/cat/avisos_cat.php +++ b/admin/WebConsole/idiomas/php/cat/avisos_cat.php @@ -7,6 +7,8 @@ if (empty ($TbMsg)) $TbMsg=array(); $TbMsg["WARN_NAMELENGTH"]='AVÍS: El nom d\'equip no ha de superar els 15 caràcters si s\'instalen sistemes Windows.'; +$TbMsg["WARN_NETBOOT"]='ATENCIÓN: El equipo iniciará en local por defecto; usar NetBoot Avanzado para modificar su arranque.'; $TbMsg["WARN_REBOOTAFTER"]='AVÍS: Es realitzarà automàticament un reinici després d\'executar l\'operació.'; +$TbMsg["WARN_NOTESOFMENU"]='NOTAS: Los menús personalizados tienen mayor prioridad que los menús automáticos.<br>Un menú personalizado se define introduciendo la URL de la página HTML que lo define.<br>Un menú automático se compone a partir de los procedimientos definidos.'; ?> diff --git a/admin/WebConsole/idiomas/php/cat/configuraciones_cat.php b/admin/WebConsole/idiomas/php/cat/configuraciones_cat.php index 4370c92f..753a256b 100644 --- a/admin/WebConsole/idiomas/php/cat/configuraciones_cat.php +++ b/admin/WebConsole/idiomas/php/cat/configuraciones_cat.php @@ -58,7 +58,7 @@ $TbMsg[42]='Variable'; $TbMsg["CONFIG_NOCONFIG"]='Sense configuració: client no connectat al servidor.'; $TbMsg[44]='Equip sense Perfil de Hardware'; $TbMsg[45]='Afegeixi Perfil per obtenir dades'; -$TbMsg[495]='Contingut Caché'; +$TbMsg[495]='Data/Caché'; $TbMsg[4951]='Caché lliure'; ?> diff --git a/admin/WebConsole/idiomas/php/cat/incorporaordenadores_cat.php b/admin/WebConsole/idiomas/php/cat/incorporaordenadores_cat.php index a03ed606..42ffe53f 100644 --- a/admin/WebConsole/idiomas/php/cat/incorporaordenadores_cat.php +++ b/admin/WebConsole/idiomas/php/cat/incorporaordenadores_cat.php @@ -1,4 +1,4 @@ -<? +<?php //________________________________________________________________________________________________________ // // Fitxer d'idiomes php: incorporaordenadores_cat.php (Comandos) @@ -7,11 +7,12 @@ $TbMsg=array(); $TbMsg[0]='Incorporaci d\'Ordinadors'; $TbMsg[1]='Aula'; - $TbMsg[2]='Fitxer'; + $TbMsg["MSG_DHCPCODE"]='Codi DHCP'; + $TbMsg["MSG_DHCPHOST"]='(declaracions "host")'; $TbMsg[3]='ATENCI: Hi ha hagut algn problema al incorporar ordinadors des del fitxer'; $TbMsg[4]='ATENCI: El fitxer est buit'; $TbMsg[5]='ATENCI: El fitxer no cont informaci amb el format necesari per incorporar ordinadors'; $TbMsg[6]='ATENCI: Hi ha algn problema per a salvar el fitxer'; $TbMsg[7]='S\'han incorporat correctament ordinadors desde fitxer'; $TbMsg[8]='Contingut'; -?>
\ No newline at end of file +?> diff --git a/admin/WebConsole/idiomas/php/cat/informacion_repositorio_cat.php b/admin/WebConsole/idiomas/php/cat/informacion_repositorio_cat.php index acc4c2e8..0501064a 100644 --- a/admin/WebConsole/idiomas/php/cat/informacion_repositorio_cat.php +++ b/admin/WebConsole/idiomas/php/cat/informacion_repositorio_cat.php @@ -1,16 +1,19 @@ -<? +<?php //________________________________________________________________________________________________________ // // Fichero de idiomas php: informacion_repositorio_cat.php // Idioma: Català //________________________________________________________________________________________________________ - $TbMsg=array(); + if (empty ($TbMsg)) $TbMsg=array(); $TbMsg[0]='Repositoris'; $TbMsg[1]='Informació sobre Repositoris'; $TbMsg[2]='Repositori'; $TbMsg[3]='Informació Repositori'; $TbMsg[4]='Comentaris'; $TbMsg[5]='Imatges allotjades'; + $TbMsg["IMGTYPE1"]='monolitic'; + $TbMsg["IMGTYPE2"]='sincronizada bísica'; + $TbMsg["IMGTYPE3"]='sincronizada incremental'; $TbMsg[6]='Ordinadors assignats'; ?> diff --git a/admin/WebConsole/idiomas/php/cat/pintaParticiones_cat.php b/admin/WebConsole/idiomas/php/cat/pintaParticiones_cat.php index 1773f1d1..8bb3a033 100644 --- a/admin/WebConsole/idiomas/php/cat/pintaParticiones_cat.php +++ b/admin/WebConsole/idiomas/php/cat/pintaParticiones_cat.php @@ -21,11 +21,12 @@ $TbMsg["DISK"]='Disco'; $TbMsg["CONFIG_PARTTABLE"]='Tabla de particiones'; $TbMsg["VARIABLE"]='Variable'; -$TbMsg["CACHE_CONTENT"]='Contenido caché'; +$TbMsg["CACHE_CONTENT"]='Data/Caché'; $TbMsg["CACHE_FREESPACE"]='Caché libre'; +$TbMsg["CACHE_COMPLETE"]='CACHE COMPLETA'; -$TbMsg["SAMESYSTEM_IMAGE"]='Imagen (Mismo sistema)'; -$TbMsg["DIFFERENTSYSTEM_IMAGE"]='Imagen (Distinto sistema)'; +$TbMsg["SAMESYSTEM_IMAGE"]='Imagen (mismo tipo partición)'; +$TbMsg["DIFFERENTSYSTEM_IMAGE"]='Imagen (distinto tipo partición)'; $TbMsg["RESTORE_METHOD"]='Método'; $TbMsg["SO_NAME"]='Nombre S.O.'; @@ -47,5 +48,6 @@ $TbMsg["TITLE_E"]='Opción de rsync: Se compara el destino con el origen y se bo $TbMsg["TITLE_C"]='Opción de rsync: Comprime los archivos de datos que se envían a la máquina de destino, lo que reduce la cantidad de datos que se transmiten. '; $TbMsg["SEND"]='Protocolo'; +$TbMsg["WARN_PROTOCOL"]='La opción "protocolo" sólo se utiliza en las sincronizadas tipo archivo la primera vez que se envía la imagen a caché. <br>En otro caso el protocolo es RSYNC.'; ?> diff --git a/admin/WebConsole/idiomas/php/cat/propiedades_aulas_cat.php b/admin/WebConsole/idiomas/php/cat/propiedades_aulas_cat.php index b3b2edc0..8f19422c 100644 --- a/admin/WebConsole/idiomas/php/cat/propiedades_aulas_cat.php +++ b/admin/WebConsole/idiomas/php/cat/propiedades_aulas_cat.php @@ -40,7 +40,7 @@ $TbMsg[30]="Validació"; $TbMsg[31]="Pàgina login"; $TbMsg[32]="Pàgina validació"; // UHU -$TbMsg[495]="Contingut cache"; +$TbMsg[495]="Data/Caché"; $TbMsg[509]="Foto ordinador"; $TbMsg[5091]="Afegir foto"; $TbMsg[5092]="Veure fotos"; diff --git a/admin/WebConsole/idiomas/php/cat/propiedades_menus_cat.php b/admin/WebConsole/idiomas/php/cat/propiedades_menus_cat.php index 12fa7942..c3c72b9d 100644 --- a/admin/WebConsole/idiomas/php/cat/propiedades_menus_cat.php +++ b/admin/WebConsole/idiomas/php/cat/propiedades_menus_cat.php @@ -1,4 +1,4 @@ -<? +<?php //________________________________________________________________________________________________________ // // Fitxer d'idioms php: propiedades_menus_cat.php @@ -13,14 +13,13 @@ $TbMsg[4]="Gesti Menus"; $TbMsg[5]="Nom del Men"; $TbMsg[6]="Ttol"; $TbMsg[7]="Comentaris"; -$TbMsg[8]="tems pblics del Men"; +$TbMsg[8]="Items de Men Pblico"; $TbMsg[9]="Coordenada x"; $TbMsg[10]="Coordenada y"; -$TbMsg[11]="Modalitat"; -$TbMsg[12]="tems privats del Men"; +$TbMsg[11]="Columnas men automtico"; $TbMsg[13]="Men simple"; $TbMsg[14]="Men doble"; -$TbMsg[15]="Html men pblic"; -$TbMsg[16]="Html men privat"; +$TbMsg[15]="URL men personalizado"; $TbMsg[17]="Resoluci de pantalla"; -?>
\ No newline at end of file +$TbMsg[18]="Imagen de fondo"; +?> diff --git a/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php b/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php index c2939945..4baf492e 100644 --- a/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php +++ b/admin/WebConsole/idiomas/php/cat/propiedades_ordenadores_cat.php @@ -23,7 +23,7 @@ $TbMsg[14]="Driver de Xarxa"; $TbMsg[509]="Foto ordinador"; $TbMsg[5091]="Afegir foto"; $TbMsg[5092]="Veure fotos"; -$TbMsg[495]="Contingut cach"; +$TbMsg[495]="Data/Cach"; $TbMsg[4951]="Cach lliure"; ?> diff --git a/admin/WebConsole/idiomas/php/cat/propiedades_usuarios_cat.php b/admin/WebConsole/idiomas/php/cat/propiedades_usuarios_cat.php index 7848de59..440cbba9 100644 --- a/admin/WebConsole/idiomas/php/cat/propiedades_usuarios_cat.php +++ b/admin/WebConsole/idiomas/php/cat/propiedades_usuarios_cat.php @@ -16,4 +16,12 @@ $TbMsg[7]="Nom complet"; $TbMsg[8]="E-mail"; $TbMsg[9]="Unitat organitzativa"; $TbMsg[10]="Idioma"; -?> +$TbMsg[11]="SuperAdministrador "; +$TbMsg[12]="Administrador"; +$TbMsg[13]="Operador"; +$TbMsg[14]="Per realitzar canvis en aquest usuari<br>"; +$TbMsg[15]="creat en el procs d'installaci,<br><br>"; +$TbMsg[16]=" +premi aqu<br>"; +$TbMsg[17]="http://opengnsys.es/wiki/ModificarUsuarios"; +?>
\ No newline at end of file diff --git a/admin/WebConsole/idiomas/php/eng/avisos_eng.php b/admin/WebConsole/idiomas/php/eng/avisos_eng.php index 42d61299..316a167d 100644 --- a/admin/WebConsole/idiomas/php/eng/avisos_eng.php +++ b/admin/WebConsole/idiomas/php/eng/avisos_eng.php @@ -7,6 +7,8 @@ if (empty ($TbMsg)) $TbMsg=array(); $TbMsg["WARN_NAMELENGTH"]='WARNING: The hostname must not exceed 15 characters if you install Windows systems.'; +$TbMsg["WARN_NETBOOT"]='ATENCIÓN: El equipo iniciará en local por defecto; usar NetBoot Avanzado para modificar su arranque.'; $TbMsg["WARN_REBOOTAFTER"]='WARNING: Client(s) will be automatically rebooted after executing the operation.'; +$TbMsg["WARN_NOTESOFMENU"]='NOTAS: Los menús personalizados tienen mayor prioridad que los menús automáticos.<br>Un menú personalizado se define introduciendo la URL de la página HTML que lo define.<br>Un menú automático se compone a partir de los procedimientos definidos.'; ?> diff --git a/admin/WebConsole/idiomas/php/eng/incorporaordenadores_eng.php b/admin/WebConsole/idiomas/php/eng/incorporaordenadores_eng.php index 83b91381..929b355a 100644 --- a/admin/WebConsole/idiomas/php/eng/incorporaordenadores_eng.php +++ b/admin/WebConsole/idiomas/php/eng/incorporaordenadores_eng.php @@ -1,13 +1,14 @@ -<? +<?php //________________________________________________________________________________________________________ // // Fichero de idiomas php: incorporaordenadores_eng.php (Comandos) // Idioma: Ingls //________________________________________________________________________________________________________ - $TbMsg=array(); + if (empty ($TbMsg)) $TbMsg=array(); $TbMsg[0]='Computers Entry'; $TbMsg[1]='(Throught file configuratipon of dhcp servers)'; - $TbMsg[2]='File'; + $TbMsg["MSG_DHCPCODE"]='DHCP Code'; + $TbMsg["MSG_DHCPHOST"]='("host" declarations)'; $TbMsg[3]='WARNING: There are some problem to insert computers from file'; $TbMsg[4]='WARNING: The file do not have any information line'; $TbMsg[5]='WARNING: El fichero no contiene informacin con el formato necesario para incorporar ordenadores'; @@ -15,4 +16,4 @@ $TbMsg[7]='Computers has successfully registered'; $TbMsg[8]='Content'; -?>
\ No newline at end of file +?> diff --git a/admin/WebConsole/idiomas/php/eng/informacion_repositorio_eng.php b/admin/WebConsole/idiomas/php/eng/informacion_repositorio_eng.php index 04db56b7..c9ae6ef5 100644 --- a/admin/WebConsole/idiomas/php/eng/informacion_repositorio_eng.php +++ b/admin/WebConsole/idiomas/php/eng/informacion_repositorio_eng.php @@ -4,13 +4,16 @@ // Fichero de idiomas php: informacion_repositorio_eng.php // Idioma: English //________________________________________________________________________________________________________ - $TbMsg=array(); + if (empty ($TbMsg)) $TbMsg=array(); $TbMsg[0]='Repositories'; $TbMsg[1]='Repositories Information'; $TbMsg[2]='Repository'; $TbMsg[3]='Repository Information'; $TbMsg[4]='Comments'; $TbMsg[5]='Hosted Images'; + $TbMsg["IMGTYPE1"]='monolithic'; + $TbMsg["IMGTYPE2"]='base synchronized'; + $TbMsg["IMGTYPE3"]='incremental synchronized'; $TbMsg[6]='Computers assigned'; ?> diff --git a/admin/WebConsole/idiomas/php/eng/pintaParticiones_eng.php b/admin/WebConsole/idiomas/php/eng/pintaParticiones_eng.php index 01ca897a..34953b7a 100644 --- a/admin/WebConsole/idiomas/php/eng/pintaParticiones_eng.php +++ b/admin/WebConsole/idiomas/php/eng/pintaParticiones_eng.php @@ -23,9 +23,10 @@ $TbMsg["CONFIG_PARTTABLE"]='Tabla de particiones'; $TbMsg["VARIABLE"]='Variable'; $TbMsg["CACHE_CONTENT"]='Contenido caché'; $TbMsg["CACHE_FREESPACE"]='Caché libre'; +$TbMsg["CACHE_COMPLETE"]='FULL CACHE'; -$TbMsg["SAMESYSTEM_IMAGE"]='Imagen (Mismo sistema)'; -$TbMsg["DIFFERENTSYSTEM_IMAGE"]='Imagen (Distinto sistema)'; +$TbMsg["SAMESYSTEM_IMAGE"]='Imagen (mismo tipo partición)'; +$TbMsg["DIFFERENTSYSTEM_IMAGE"]='Imagen (distinto tipo partición)'; $TbMsg["RESTORE_METHOD"]='Método'; $TbMsg["SO_NAME"]='Nombre S.O.'; @@ -47,5 +48,6 @@ $TbMsg["TITLE_E"]="Rsync option: delete extraneous files from the receiving si $TbMsg["TITLE_C"]='Rsync option: compresses the file data as it is sent to the destination machine, which reduces the amount of data being transmitted.'; $TbMsg["SEND"]='Protocol'; +$TbMsg["WARN_PROTOCOL"]='La opción "protocolo" sólo se utiliza en las sincronizadas tipo archivo la primera vez que se envía la imagen a caché. <br>En otro caso el protocolo es RSYNC.'; ?> diff --git a/admin/WebConsole/idiomas/php/eng/propiedades_menus_eng.php b/admin/WebConsole/idiomas/php/eng/propiedades_menus_eng.php index 81fec455..f1bf3262 100644 --- a/admin/WebConsole/idiomas/php/eng/propiedades_menus_eng.php +++ b/admin/WebConsole/idiomas/php/eng/propiedades_menus_eng.php @@ -1,4 +1,4 @@ -<? +<?php //________________________________________________________________________________________________________ // // Fichero de idiomas php: propiedades_menus_eng.php @@ -13,16 +13,14 @@ $TbMsg[4]="Menus Management"; $TbMsg[5]="Menu name"; $TbMsg[6]="Title"; $TbMsg[7]="Comments"; -$TbMsg[8]="Public Items Menu"; +$TbMsg[8]="Public Menu Items"; $TbMsg[9]="Coordinate x"; $TbMsg[10]="Coordinate y"; -$TbMsg[11]="Modality"; -$TbMsg[12]="Private Items Menu"; +$TbMsg[11]="Columnas menú automático"; +$TbMsg[12]="Private Menu Items"; $TbMsg[13]="Simple menu"; $TbMsg[14]="Double menu"; -$TbMsg[15]="Html public menu"; -$TbMsg[16]="Html private menu"; +$TbMsg[15]="URL menú personalizado"; $TbMsg[17]="Screen resolution"; $TbMsg[18]="Background image"; ?> - diff --git a/admin/WebConsole/idiomas/php/eng/propiedades_usuarios_eng.php b/admin/WebConsole/idiomas/php/eng/propiedades_usuarios_eng.php index f8d3bfeb..c06c95f8 100644 --- a/admin/WebConsole/idiomas/php/eng/propiedades_usuarios_eng.php +++ b/admin/WebConsole/idiomas/php/eng/propiedades_usuarios_eng.php @@ -19,5 +19,8 @@ $TbMsg[10]="Language "; $TbMsg[11]="Super-Administrator"; $TbMsg[12]="Administrator"; $TbMsg[13]="Operator"; -?> - +$TbMsg[14]="To make changes to this user<br>"; +$TbMsg[15]="created in the installation,<br><br>"; +$TbMsg[16]="click here<br>"; +$TbMsg[17]="http://opengnsys.es/wiki/ModificarUsuarios"; +?>
\ No newline at end of file diff --git a/admin/WebConsole/idiomas/php/esp/avisos_esp.php b/admin/WebConsole/idiomas/php/esp/avisos_esp.php index e3211ccb..e3f35c23 100644 --- a/admin/WebConsole/idiomas/php/esp/avisos_esp.php +++ b/admin/WebConsole/idiomas/php/esp/avisos_esp.php @@ -7,6 +7,8 @@ if (empty ($TbMsg)) $TbMsg=array(); $TbMsg["WARN_NAMELENGTH"]='AVISO: El nombre de equipo no debe superar los 15 caracteres si se instalan sistemas Windows.'; +$TbMsg["WARN_NETBOOT"]='ATENCIÓN: El equipo iniciará en local por defecto; usar NetBoot Avanzado para modificar su arranque.'; $TbMsg["WARN_REBOOTAFTER"]='AVISO: Se realizará automáticamente un reinicio después de ejecutar la operación.'; +$TbMsg["WARN_NOTESOFMENU"]='NOTAS: Los menús personalizados tienen mayor prioridad que los menús automáticos.<br>Un menú personalizado se define introduciendo la URL de la página HTML que lo define.<br>Un menú automático se compone a partir de los procedimientos definidos.'; ?> diff --git a/admin/WebConsole/idiomas/php/esp/configuraciones_esp.php b/admin/WebConsole/idiomas/php/esp/configuraciones_esp.php index fe3ed192..9bd274b2 100644 --- a/admin/WebConsole/idiomas/php/esp/configuraciones_esp.php +++ b/admin/WebConsole/idiomas/php/esp/configuraciones_esp.php @@ -58,7 +58,7 @@ $TbMsg[42]='Variable'; $TbMsg["CONFIG_NOCONFIG"]='Sin configuración: cliente no conectado al servidor.'; $TbMsg[44]='Equipo sin perfil de hardware'; $TbMsg[45]='Agregue perfil para obtener datos'; -$TbMsg[495]='Contenido caché'; +$TbMsg[495]='Fecha/Caché'; $TbMsg[4951]='Caché libre'; ?> diff --git a/admin/WebConsole/idiomas/php/esp/incorporaordenadores_esp.php b/admin/WebConsole/idiomas/php/esp/incorporaordenadores_esp.php index 493e3a49..533490ae 100644 --- a/admin/WebConsole/idiomas/php/esp/incorporaordenadores_esp.php +++ b/admin/WebConsole/idiomas/php/esp/incorporaordenadores_esp.php @@ -1,15 +1,16 @@ -<? +<?php //________________________________________________________________________________________________________ // // Fichero de idiomas php: incorporaordenadores_esp.php (Comandos) // Idioma: Español //________________________________________________________________________________________________________ - $TbMsg=array(); + if (empty ($TbMsg)) $TbMsg=array(); $TbMsg[0]='Incorporación de Ordenadores'; $TbMsg[1]='Aula'; - $TbMsg[2]='Contenido'; + $TbMsg["MSG_DHCPCODE"]='Código DHCP'; + $TbMsg["MSG_DHCPHOST"]='(declaraciones "host")'; $TbMsg[3]='Los ordenadores se han incorporado correctamente'; $TbMsg[4]='ATENCIÓN: Ha ocurrido alǵun problema en el proceso de incorporación de ordenadores'; $TbMsg[5]='ATENCIÓN: Se han intentado incorporar ordenadores que ya existen'; -?>
\ No newline at end of file +?> diff --git a/admin/WebConsole/idiomas/php/esp/informacion_repositorio_esp.php b/admin/WebConsole/idiomas/php/esp/informacion_repositorio_esp.php index a05dca48..ccfd489d 100644 --- a/admin/WebConsole/idiomas/php/esp/informacion_repositorio_esp.php +++ b/admin/WebConsole/idiomas/php/esp/informacion_repositorio_esp.php @@ -1,16 +1,19 @@ -<? +<?php //________________________________________________________________________________________________________ // // Fichero de idiomas php: informacion_repositorio_esp.php // Idioma: Español //________________________________________________________________________________________________________ - $TbMsg=array(); + if (empty ($TbMsg)) $TbMsg=array(); $TbMsg[0]='Repositorios'; $TbMsg[1]='Información sobre Repositorios'; $TbMsg[2]='Repositorio'; $TbMsg[3]='Información Repositorio'; $TbMsg[4]='Comentarios'; $TbMsg[5]='Imágenes alojadas'; + $TbMsg["IMGTYPE1"]='monolítica'; + $TbMsg["IMGTYPE2"]='sincronizada bísica'; + $TbMsg["IMGTYPE3"]='sincronizada incremental'; $TbMsg[6]='Ordenadores asigandos'; ?> diff --git a/admin/WebConsole/idiomas/php/esp/pintaParticiones_esp.php b/admin/WebConsole/idiomas/php/esp/pintaParticiones_esp.php index c50bf84d..a1bf2d14 100644 --- a/admin/WebConsole/idiomas/php/esp/pintaParticiones_esp.php +++ b/admin/WebConsole/idiomas/php/esp/pintaParticiones_esp.php @@ -21,11 +21,12 @@ $TbMsg["DISK"]='Disco'; $TbMsg["CONFIG_PARTTABLE"]='Tabla de particiones'; $TbMsg["VARIABLE"]='Variable'; -$TbMsg["CACHE_CONTENT"]='Contenido caché'; +$TbMsg["CACHE_CONTENT"]='Fecha/Caché'; $TbMsg["CACHE_FREESPACE"]='Caché libre'; +$TbMsg["CACHE_COMPLETE"]='CACHE COMPLETA'; -$TbMsg["SAMESYSTEM_IMAGE"]='Imagen (Mismo sistema)'; -$TbMsg["DIFFERENTSYSTEM_IMAGE"]='Imagen (Distinto sistema)'; +$TbMsg["SAMESYSTEM_IMAGE"]='Imagen (mismo tipo partición)'; +$TbMsg["DIFFERENTSYSTEM_IMAGE"]='Imagen (distinto tipo partición)'; $TbMsg["RESTORE_METHOD"]='Método'; $TbMsg["SO_NAME"]='Nombre S.O.'; @@ -46,5 +47,7 @@ $TbMsg["TITLE_W"]='Opción de rsync: El algoritmo incremental rsync no se usa y $TbMsg["TITLE_E"]='Opción de rsync: Se compara el destino con el origen y se borran los ficheros que no existen en el primero.'; $TbMsg["TITLE_C"]='Opción de rsync: Comprime los archivos de datos que se envían a la máquina de destino, lo que reduce la cantidad de datos que se transmiten. '; $TbMsg["SEND"]='Protocolo'; + +$TbMsg["WARN_PROTOCOL"]='La opción "protocolo" sólo se utiliza en las sincronizadas tipo archivo la primera vez que se envía la imagen a caché. <br>En otro caso el protocolo es RSYNC.'; ?> diff --git a/admin/WebConsole/idiomas/php/esp/propiedades_aulas_esp.php b/admin/WebConsole/idiomas/php/esp/propiedades_aulas_esp.php index 2c5dfc87..cffb26ed 100644 --- a/admin/WebConsole/idiomas/php/esp/propiedades_aulas_esp.php +++ b/admin/WebConsole/idiomas/php/esp/propiedades_aulas_esp.php @@ -40,7 +40,7 @@ $TbMsg[30]="Validación"; $TbMsg[31]="Página login"; $TbMsg[32]="Página validación"; // UHU -$TbMsg[495]="Contenido caché"; +$TbMsg[495]="Fecha/Caché"; $TbMsg[509]="Foto ordenador"; $TbMsg[5091]="Insertar foto"; $TbMsg[5092]="Ver fotos"; diff --git a/admin/WebConsole/idiomas/php/esp/propiedades_imagenes_esp.php b/admin/WebConsole/idiomas/php/esp/propiedades_imagenes_esp.php index 57345240..46ff5b76 100644 --- a/admin/WebConsole/idiomas/php/esp/propiedades_imagenes_esp.php +++ b/admin/WebConsole/idiomas/php/esp/propiedades_imagenes_esp.php @@ -13,7 +13,7 @@ $TbMsg[4]="Gestión Imágenes Monolíticas"; $TbMsg[5]="Descripción"; $TbMsg[6]="Perfil Software"; $TbMsg[7]="Comentarios"; -$TbMsg[8]="Partición"; +$TbMsg[8]="Disco, Partición"; $TbMsg[9]="Tipo partición"; $TbMsg[10]="Repositorio"; $TbMsg[11]="Nombre"; @@ -25,4 +25,6 @@ $TbMsg[15]="ATENCIÓN.- Una imagen que tiene perfil software indica que en algú $TbMsg[16]="Ruta Origen"; $TbMsg[17]='"Nombre canónico fichero-imagen existe : Introduzca otro nombre"'; $TbMsg[18]="Introduzca otro Nombre"; +$TbMsg[19]="Equipo modelo"; +$TbMsg[20]="Fecha de creación"; ?> diff --git a/admin/WebConsole/idiomas/php/esp/propiedades_menus_esp.php b/admin/WebConsole/idiomas/php/esp/propiedades_menus_esp.php index d27cb5c9..b39705ef 100644 --- a/admin/WebConsole/idiomas/php/esp/propiedades_menus_esp.php +++ b/admin/WebConsole/idiomas/php/esp/propiedades_menus_esp.php @@ -13,15 +13,12 @@ $TbMsg[4]="Gestión Menús"; $TbMsg[5]="Nombre del Menú"; $TbMsg[6]="Título"; $TbMsg[7]="Comentarios"; -$TbMsg[8]="Items públicos del Menú"; -$TbMsg[9]="Coordenada X"; -$TbMsg[10]="Coordenada Y"; -$TbMsg[11]="Modalidad"; -$TbMsg[12]="Items privados del Menú"; +$TbMsg[8]="Items de Menú Público"; +$TbMsg[11]="Columnas menú automático"; +$TbMsg[12]="Items de Menú Privado"; $TbMsg[13]="Menú simple"; $TbMsg[14]="Menú doble"; -$TbMsg[15]="URL menú público"; -$TbMsg[16]="URL menú privado"; +$TbMsg[15]="URL menú personalizado"; $TbMsg[17]="Resolución de pantalla"; $TbMsg[18]="Imagen de fondo"; ?> diff --git a/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php b/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php index 90bcc4d0..21d3498e 100644 --- a/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php +++ b/admin/WebConsole/idiomas/php/esp/propiedades_ordenadores_esp.php @@ -28,7 +28,7 @@ $TbMsg[17]="Pagina validación"; $TbMsg[509]="Foto ordenador"; $TbMsg[5091]="Insertar foto"; $TbMsg[5092]="Ver fotos"; -$TbMsg[495]="Contenido caché"; +$TbMsg[495]="Fecha/Caché"; $TbMsg[4951]="Caché libre"; ?> diff --git a/admin/WebConsole/idiomas/php/esp/propiedades_usuarios_esp.php b/admin/WebConsole/idiomas/php/esp/propiedades_usuarios_esp.php index fd06af09..dfe15349 100644 --- a/admin/WebConsole/idiomas/php/esp/propiedades_usuarios_esp.php +++ b/admin/WebConsole/idiomas/php/esp/propiedades_usuarios_esp.php @@ -19,4 +19,8 @@ $TbMsg[10]="Idioma "; $TbMsg[11]="SuperAdministrador "; $TbMsg[12]="Administrador"; $TbMsg[13]="Operador"; -?> +$TbMsg[14]="Para realizar cambios en este usuario<br>"; +$TbMsg[15]="creado en el proceso de instalación,<br><br>"; +$TbMsg[16]="pulse aquí<br>"; +$TbMsg[17]="http://opengnsys.es/wiki/ModificarUsuarios"; +?>
\ No newline at end of file diff --git a/admin/WebConsole/includes/ConfiguracionesParticiones.php b/admin/WebConsole/includes/ConfiguracionesParticiones.php index bf5b1e6a..54fdab36 100644 --- a/admin/WebConsole/includes/ConfiguracionesParticiones.php +++ b/admin/WebConsole/includes/ConfiguracionesParticiones.php @@ -99,6 +99,7 @@ function cargaCaves($cmd,$idambito,$ambito,$sws,$swr) imagenes.descripcion AS imagen, imagenes.nombreca AS nombreca, imagenes.idrepositorio AS repositorio, + ordenadores_particiones.fechadespliegue, ordenadores_particiones.idperfilsoft, perfilessoft.descripcion AS perfilsoft @@ -151,6 +152,7 @@ function cargaCaves($cmd,$idambito,$ambito,$sws,$swr) $tbKeys[$idx]["imagen"]=$rs->campos["imagen"]; $tbKeys[$idx]["nombreca"]=$rs->campos["nombreca"]; $tbKeys[$idx]["repositorio"]=$rs->campos["repositorio"]; + $tbKeys[$idx]["fechadespliegue"]=$rs->campos["fechadespliegue"]; $tbKeys[$idx]["idperfilsoft"]=$rs->campos["idperfilsoft"]; $tbKeys[$idx]["perfilsoft"]=$rs->campos["perfilsoft"]; //$tbKeys[$idx]["cache"]=$rs->campos["cache"]; @@ -291,17 +293,23 @@ function pintaConfiguraciones($cmd,$idambito,$ambito,$colums,$sws,$swr,$pintaPar // $idordenadores: Cadena con los identificadores de los ordenadores separados por "," // $maxcontor: Número máximo de ordenadores por fila // $cc: Identificador del bloque de configuración +// $tipoid: define si el "value" de la tabla es una cadena de ip o de id de los equipos. +// Valores ipordenador o idordenador (por defecto id). +// Versión 0.1 - Se incluye parametro tipoid. +// Fecha 2014-10-23 +// Autora: Irina Gomez, ETSII Universidad de Sevilla //________________________________________________________________________________________________________ -function pintaOrdenadores($cmd,$idordenadores,$maxcontor,$cc) +function pintaOrdenadores($cmd,$idordenadores,$maxcontor,$cc,$tipoid='idordenador') { $tablaHtml=""; + $ipordenadores=""; $contor=0; $maxcontor=10; // Número máximo de prodenadores por fila $cmd->texto=" SELECT idordenador,nombreordenador,ip FROM ordenadores WHERE idordenador IN (".$idordenadores.") ORDER BY nombreordenador"; $rs=new Recordset; $rs->Comando=&$cmd; if (!$rs->Abrir()) return(""); // Error al abrir recordset - $tablaHtml.='<table align="left" border="0" id="tbOrd_'.$cc.'" value="'.$idordenadores.'"><tr>'; + // Cada ordenador es una celda de la tabla. while (!$rs->EOF){ $contor++; $tablaHtml.= '<td align="center" style="BACKGROUND-COLOR: #FFFFFF;"> @@ -311,10 +319,22 @@ function pintaOrdenadores($cmd,$idordenadores,$maxcontor,$cc) $contor=0; $tablaHtml.='</tr><tr>'; } + $ipordenadores.=$rs->campos["ip"].','; $rs->Siguiente(); } $tablaHtml.='</tr>'; $tablaHtml.= '</table>'; + + //Quitamos coma final en ipordenadores + $ipordenadores = trim($ipordenadores, ','); + + // Inicio tabla: el identificador de los ordenadores puede ser las ips o las ids. + if ($tipoid == 'ipordenador') + $inicioTablaHtml='<table align="left" border="0" id="tbOrd_'.$cc.'" value="'.$ipordenadores.'"><tr>'; + else + $inicioTablaHtml='<table align="left" border="0" id="tbOrd_'.$cc.'" value="'.$idordenadores.'"><tr>'; + + $tablaHtml=$inicioTablaHtml.$tablaHtml; return($tablaHtml); } /*________________________________________________________________________________________________________ diff --git a/admin/WebConsole/includes/pintaParticiones.php b/admin/WebConsole/includes/pintaParticiones.php index 41046771..e818bb3e 100644 --- a/admin/WebConsole/includes/pintaParticiones.php +++ b/admin/WebConsole/includes/pintaParticiones.php @@ -85,6 +85,8 @@ function pintaParticiones($cmd,$configuraciones,$idordenadores,$cc) break; case 2: $disktable[$tbKeys[$k]["numdisk"]] = "GPT"; break; + case 3: $disktable[$tbKeys[$k]["numdisk"]] = "LVM"; + break; default: $disktable[$tbKeys[$k]["numdisk"]] = ""; } } @@ -92,11 +94,16 @@ function pintaParticiones($cmd,$configuraciones,$idordenadores,$cc) echo'<tr height="16">'.chr(13); echo'<td align="center"> </td>'.chr(13); echo'<td align="center">'.$tbKeys[$k]["numpar"].'</td>'.chr(13); - if (is_numeric ($tbKeys[$k]["tipopar"])) { - echo '<td align="center"><em>'.sprintf("%02X",$tbKeys[$k]["tipopar"]).'</em></td>'.chr(13); + if ($disktable[$tbKeys[$k]["numdisk"]] == "LVM") { + echo '<td></td>'.chr(13); } else { - echo '<td align="center">'.$tbKeys[$k]["tipopar"].'</td>'.chr(13); + if (is_numeric ($tbKeys[$k]["tipopar"])) { + echo '<td align="center"><em>'.sprintf("%02X",$tbKeys[$k]["tipopar"]).'</em></td>'.chr(13); + } + else { + echo '<td align="center">'.$tbKeys[$k]["tipopar"].'</td>'.chr(13); + } } $filesys=tomaSistemasFicheros($tbKeys[$k]["numpar"],$idordenadores,false,$tbKeys[$k]["numdisk"]); echo'<td align="center"> '.$filesys.' </td>'.chr(13); @@ -108,24 +115,19 @@ function pintaParticiones($cmd,$configuraciones,$idordenadores,$cc) echo'<td align="center"> '.tomaImagenes($tbKeys[$k]["numpar"],$idordenadores,$tbKeys[$k]["numdisk"]).' </td>'.chr(13); echo'<td align="center"> '.tomaPerfiles($tbKeys[$k]["numpar"],$idordenadores,$tbKeys[$k]["numdisk"]).' </td>'.chr(13); - + if ($filesys == "CACHE") { - $rs=new Recordset; - $cmd->texto="SELECT cache FROM ordenadores_particiones WHERE idordenador=".$idordenadores." AND numdisk=".$tbKeys[$k]["numdisk"]." AND numpar=".$tbKeys[$k]["numpar"]; - $rs->Comando=&$cmd; - if (!$rs->Abrir()) return(false); // Error al abrir recordset - $rs->Primero(); - if (!$rs->EOF){ - $campocache=$rs->campos["cache"]; - } - $rs->Cerrar(); echo '<td align="leght"> '; - $campocache = eregi_replace("[\n|\r|\n\r]", '', $campocache); + $campocache = eregi_replace("[\n|\r|\n\r]", '', tomaCache($tbKeys[$k]["numpar"],$idordenadores,$tbKeys[$k]["numdisk"])); $ima=split(",",$campocache); $numero=1; for ($x=0;$x<count($ima); $x++) { if(substr($ima[$x],-3)==".MB") { - echo '<strong>'.$TbMsg["CACHE_FREESPACE"].': '.$ima[$x].'</strong>'; + if ( $ima[$x] == "0.MB" ){ + echo '<font color=red><strong>'.$TbMsg["CACHE_COMPLETE"].': '.$ima[$x].'</strong></font>'; + }else{ + echo '<strong>'.$TbMsg["CACHE_FREESPACE"].': '.$ima[$x].'</strong>'; + } }elseif (! empty($ima[1])){ // $dir=is_dir('$ima');echo $dir; // if ($ima == "directorio"){$dir="si";} @@ -134,7 +136,7 @@ function pintaParticiones($cmd,$configuraciones,$idordenadores,$cc) // Esto para numerarla if(substr($ima[$x],-4)==".img" || substr($ima[$x],-5)==".diff" || substr($ima[$x],-4)=="") { echo '<br />('.$info.') '.$numero++.'.-'.$ima[$x]; - } elseif(ereg(".sum",$ima[$x]) || ereg(".torrent",$ima[$x])) { + } elseif(ereg(".sum",$ima[$x]) || ereg(".torrent",$ima[$x]) || ereg(".full.sum",$ima[$x])) { echo '<br /> '.$ima[$x]; }else{ echo '<br /><font color=blue>('.$info.') </font>'.$numero++.'.-<font color=blue>'.$ima[$x]."</font>"; @@ -144,7 +146,7 @@ function pintaParticiones($cmd,$configuraciones,$idordenadores,$cc) echo ' </td>'.chr(13); } else { - echo'<td align="center"> </td>'.chr(13); + echo'<td align="center"> '.$tbKeys[$k]["fechadespliegue"].' </td>'.chr(13); } echo'</tr>'.chr(13); @@ -329,11 +331,13 @@ function pintaParticionesConfigurar($cmd,$configuraciones,$idordenadores,$cc) } } } - if ($aviso) { // Mostrar aviso: solo disco 1 con tabla MSDOS. + // Marcar fin de zona de datos de la tabla. + echo '<TR id="TRIMG_'.$cc.'" height=5><TD colspan='.$colums.' style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #FFFFFF;"> </TD></TR>'; + // Mostrar aviso: solo disco 1 con tabla MSDOS. + if ($aviso) { echo '<tr><th colspan='.$colums.'">'.$TbMsg["CONFIG_NODISK1MSDOS"].'</th></tr>'; } - /* Botones de añadir y confirmar */ - echo '<TR id="TRIMG_'.$cc.'" height=5><TD colspan='.$colums.' style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #FFFFFF;"> </TD></TR>'; + // Botones de añadir y confirmar. echo '<TR height=30><TD style="BACKGROUND-COLOR: #FFFFFF;" colspan='.$colums.' align=center>'; echo ' <A href="#add" style="text-decoration:none"> <IMG id="IMG_'.$icp.'" border=0 src="../images/boton_insertar.gif" @@ -437,7 +441,9 @@ function pintaParticionesRestaurarImagenSincronizacion1($cmd,$configuraciones,$i } } } + echo '<TR height=5><TD colspan='.$columns.' style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #FFFFFF;"> </TD></TR>'; + echo '<tr><th colspan="14">'.$TbMsg["WARN_PROTOCOL"].'</th></tr>'; } /** * Las funcion pintaParticionesRestaurarImagenSincronizacion1 sustituye a las funciones diff --git a/admin/WebConsole/includes/pintaTablaConfiguraciones.php b/admin/WebConsole/includes/pintaTablaConfiguraciones.php index b5dddee9..21c9c69b 100644 --- a/admin/WebConsole/includes/pintaTablaConfiguraciones.php +++ b/admin/WebConsole/includes/pintaTablaConfiguraciones.php @@ -1,338 +1,470 @@ -<?php
-include_once("../idiomas/php/".$idioma."/pintaParticiones_".$idioma.".php");
-
-/*________________________________________________________________________________________________________
- Crea la tabla de configuraciones y perfiles a crear
-________________________________________________________________________________________________________*/
-function tablaConfiguracionesIniciarSesion($cmd,$idordenador){
- global $TbMsg;
- global $idcentro;
- $tablaHtml="";
- $cmd->texto="SELECT ordenadores_particiones.numdisk,ordenadores_particiones.numpar,
- ordenadores_particiones.tamano,
- ordenadores_particiones.idnombreso, nombresos.nombreso,
- tipospar.tipopar, imagenes.descripcion AS imagen,
- perfilessoft.descripcion AS perfilsoft,
- sistemasficheros.descripcion AS sistemafichero
- FROM ordenadores
- INNER JOIN ordenadores_particiones ON ordenadores_particiones.idordenador=ordenadores.idordenador
- LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso
- INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar
- LEFT OUTER JOIN imagenes ON imagenes.idimagen=ordenadores_particiones.idimagen
- LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft
- LEFT OUTER JOIN sistemasficheros ON sistemasficheros.idsistemafichero=ordenadores_particiones.idsistemafichero
- WHERE ordenadores.idordenador=".$idordenador."
- AND tipospar.clonable=1
- AND nombresos.nombreso!='DATA'
- ORDER BY ordenadores_particiones.numdisk,ordenadores_particiones.numpar";
-
- $rs->Comando=&$cmd;
- $rs=new Recordset;
- $rs->Comando=&$cmd;
- if (!$rs->Abrir())
- return($tablaHtml); // Error al abrir recordset
- $rs->Primero();
- $actualDisk = 0;
- $columns = 3;
- while (!$rs->EOF){
- if($actualDisk != $rs->campos["numdisk"]){
- $actualDisk = $rs->campos["numdisk"];
- $tablaHtml.='<td colspan="'.$columns.'" style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #D4D0C8;"> <strong>'.$TbMsg["DISK"].' '.$actualDisk.'</strong></td>'.chr(13);
- }
- if(!empty($rs->campos["idnombreso"])){
- $tablaHtml.='<TR>'.chr(13);
- $tablaHtml.='<TD ><input type="radio" name="particion" value='.$rs->campos["numdisk"].";".$rs->campos["numpar"].'></TD>'.chr(13);
- $tablaHtml.='<TD align=center> '.$rs->campos["numpar"].' </TD>'.chr(13);
- $tablaHtml.='<TD> '.$rs->campos["nombreso"].' </TD>'.chr(13);
- $tablaHtml.='</TR>'.chr(13);
- }
- $rs->Siguiente();
- }
- $rs->Cerrar();
-
- if ( $tablaHtml == "" ) {
- // Equipo sin configuracion en base de datos.
- $tablaHtml='<table id="tabla_conf" width="95%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13);
- $tablaHtml.='<tr><th align="center" >'.$TbMsg["CONFIG_NOCONFIG"].'</th><tr>'.chr(13);
- }
- else
- {
- // Equipo con configuracion en BD
- // Incluimos primera linea de la tabla.
- $inicioTabla='<TABLE id="tabla_conf" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos>'.chr(13);
- $inicioTabla.=' <TR>'.chr(13);
- $inicioTabla.=' <TH align=center> </TH>'.chr(13);
- $inicioTabla.=' <TH align=center> '. $TbMsg["PARTITION"] .' </TH>'.chr(13);
- $inicioTabla.=' <TH align=center> '. $TbMsg["SO_NAME"] .' </TH>'.chr(13);
- $inicioTabla.=' </TR>'.chr(13);
- $tablaHtml=$inicioTabla.$tablaHtml;
- }
-
- $tablaHtml.="</table>".chr(13);
-
- return($tablaHtml);
-}
-
-
-/*________________________________________________________________________________________________________
- Crea la tabla de configuraciones y perfiles a crear
-________________________________________________________________________________________________________*/
-function tablaConfiguracionesCrearImagen($cmd,$idordenador,$idrepositorio)
-{
- global $idcentro;
- global $TbMsg;
- $tablaHtml="";
- $rs=new Recordset;
- $cmd->texto="SELECT ordenadores.ip AS masterip,ordenadores_particiones.numdisk, ordenadores_particiones.numpar,ordenadores_particiones.codpar,ordenadores_particiones.tamano,
- ordenadores_particiones.idnombreso,nombresos.nombreso,tipospar.tipopar,tipospar.clonable,
- imagenes.nombreca,imagenes.descripcion as imagen,perfilessoft.idperfilsoft,
- perfilessoft.descripcion as perfilsoft,sistemasficheros.descripcion as sistemafichero
- FROM ordenadores
- INNER JOIN ordenadores_particiones ON ordenadores_particiones.idordenador=ordenadores.idordenador
- LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso
- INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar
- LEFT OUTER JOIN imagenes ON imagenes.idimagen=ordenadores_particiones.idimagen
- LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft
- LEFT OUTER JOIN sistemasficheros ON sistemasficheros.idsistemafichero=ordenadores_particiones.idsistemafichero
- WHERE ordenadores.idordenador=".$idordenador." ORDER BY ordenadores_particiones.numdisk,ordenadores_particiones.numpar";
- //echo $cmd->texto;
- $rs->Comando=&$cmd;
- $rs=new Recordset;
- $rs->Comando=&$cmd;
- if (!$rs->Abrir())
- return($tablaHtml."</table>"); // Error al abrir recordset
- $rs->Primero();
- $actualDisk = 0;
- $columns = 6;
- while (!$rs->EOF){
-
- if($actualDisk != $rs->campos["numdisk"]){
- $actualDisk = $rs->campos["numdisk"];
- $tablaHtml.='<td colspan="'.$columns.'" style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #D4D0C8;"> <strong>'.$TbMsg["DISK"].' '.$actualDisk.'</strong></td>'.chr(13);
- }
-
- $swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]);
- $swc=$rs->campos["idperfilsoft"]>0; // Una partición es clonable si posee un identificador de perfil software
- $swccc=$swcc && $swcc;
- $tablaHtml.='<TR>'.chr(13);
- if($swccc){
- $tablaHtml.='<TD><input type=radio name="particion" value="'.$rs->campos["numdisk"]."_".$rs->campos["numpar"]."_".$rs->campos["codpar"].'"></TD>'.chr(13);
- $tablaHtml.='<TD align=center> '.$rs->campos["numpar"].' </TD>'.chr(13);
- $tablaHtml.='<TD align=center> '.$rs->campos["tipopar"].' </TD>'.chr(13);
- if(empty($rs->campos["nombreso"]) && !empty($rs->campos["idnombreso"])) // Si el identificador del S.O. no es nulo pero no hay descripción
- $tablaHtml.='<TD align=center> '.'<span style="FONT-SIZE:10px; COLOR: red;" >'.$TbMsg[12].'</span></TD>'.chr(13);
- else
- $tablaHtml.='<TD> '.$rs->campos["nombreso"].' </TD>'.chr(13);
- $tablaHtml.='<TD>'.HTMLSELECT_imagenes($cmd,$idrepositorio,$rs->campos["idperfilsoft"],$rs->campos["numdisk"],$rs->campos["numpar"],$rs->campos["masterip"]).'</TD>';
- $tablaHtml.='<TD>'.HTMLSELECT_repositorios($cmd,$idcentro,$idrepositorio,$rs->campos["numdisk"],$rs->campos["numpar"],$rs->campos["masterip"]).'</TD>';
- //$tablaHtml.='<TD> </TD>';
- }
- $tablaHtml.='</TR>'.chr(13);
- $rs->Siguiente();
- }
- $rs->Cerrar();
- if ( $tablaHtml == "" ) {
- // Equipo sin configuracion en base de datos.
- $tablaHtml='<table id="tabla_conf" width="95%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13);
- $tablaHtml.='<tr><th align="center" >'.$TbMsg["CONFIG_NOCONFIG"].'</th><tr>'.chr(13);
- }
- else
- {
- // Equipo con configuracion en BD
- // Incluimos primera linea de la tabla.
- $inicioTabla='<TABLE id="tabla_conf" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos>'.chr(13);
- $inicioTabla.=' <TR>'.chr(13);
- $inicioTabla.=' <TH align=center> </TH>'.chr(13);
- $inicioTabla.=' <TH align=center> '. $TbMsg["PARTITION"] .' </TH>'.chr(13);
- $inicioTabla.=' <TH align=center> '. $TbMsg["PARTITION_TYPE"] .' </TH>'.chr(13);
- $inicioTabla.=' <TH align=center> '. $TbMsg["SO_NAME"] .' </TH>'.chr(13);
- $inicioTabla.=' <TH align=center> '. $TbMsg["IMAGE_TO_CREATE"] .' </TH>'.chr(13);
- $inicioTabla.=' <TH align=center> '. $TbMsg["DESTINATION_REPOSITORY"] .' </TH>'.chr(13);
- $inicioTabla.=' </TR>'.chr(13);
-
- $tablaHtml=$inicioTabla.$tablaHtml;
-
- }
-
-
- $tablaHtml.="</table>";
- return($tablaHtml);
-}
-
-/*----------------------------------------------------------------------------------------------
- Dibuja una tabla con los datos de particiones y parametros a elegir
-
- Parametros:
- - idordenador: El identificador del ordenador
-----------------------------------------------------------------------------------------------*/
-function tablaConfiguracionesSincronizacion1($idordenador)
-{
- global $idcentro;
- global $TbMsg;
- global $cmd;
-
- $tablaHtml="";
-
- $cmd->texto="SELECT DISTINCT ordenadores_particiones.numdisk,ordenadores_particiones.numpar, ordenadores_particiones.idnombreso, nombresos.nombreso,
- ordenadores_particiones.idimagen, ordenadores_particiones.codpar,
- tipospar.clonable, perfilessoft.idperfilsoft,
- nombresos.idnombreso, nombresos.nombreso
- FROM ordenadores_particiones
- INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar
- LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso
- LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft
- WHERE ordenadores_particiones.idordenador=".$idordenador."
- ORDER BY ordenadores_particiones.numdisk, ordenadores_particiones.numpar";
- //echo $cmd->texto;
- $rs=new Recordset;
- $rs->Comando=&$cmd;
- if (!$rs->Abrir())
- return($tablaHtml); // Error al abrir recordset
- $rs->Primero();
- $tbPAR="";
- $actualDisk = 0;
- $columns = 9;
- while (!$rs->EOF){
- if($actualDisk != $rs->campos["numdisk"]){
- $actualDisk = $rs->campos["numdisk"];
- $tablaHtml.='<td colspan="'.$columns.'" style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #D4D0C8;"> <strong>'.$TbMsg["DISK"].' '.$actualDisk.'</strong></td>'.chr(13);
- }
- //$swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]) && !empty($rs->campos["idperfilsoft"]);
- $sw=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]);
- if($sw){// Una partici�n es clonable si es cierta esta variable
- $tbPAR.=$rs->campos["numpar"].";"; // Cadena con las particiones a procesar
- $tablaHtml.='<tr id="trPar-'.$rs->campos["numpar"].'">';
- $tablaHtml.='<td align=center><input type=radio name="particion" value="'.$rs->campos["codpar"].'"></td>';
- $tablaHtml.='<td align="center"> '.$rs->campos["numpar"].' </td>'; // N�mero de partici�n
- $tablaHtml.='<td align=center> '.$rs->campos["nombreso"].' </td>'; // Nombre sistema operativo
+<?php +include_once("../idiomas/php/".$idioma."/pintaParticiones_".$idioma.".php"); + +/*________________________________________________________________________________________________________ + Crea la tabla de configuraciones y perfiles a crear +// Version 0.1 - En ambito distinto a ordenador muestra los equipos agrupados en configuraciones iguales. +// Fecha: 2014-10-23 +// Autora: Irina Gomez, ETSII Universidad de Sevilla + +________________________________________________________________________________________________________*/ +function tablaConfiguracionesIniciarSesion($cmd,$idambito,$ambito){ + // TODO despues de las pruebas: idnombreso <> 5 + global $TbMsg; + global $idcentro; + + global $AMBITO_AULAS; + global $AMBITO_GRUPOSORDENADORES; + global $AMBITO_ORDENADORES; + global $msk_nombreSO; + // array: identificadores y nombres sistemas operativos en BD; + $sistOperativo= SistemaOperativoBD($cmd); + // Identificador del "sistema operativo" DATA. + $sistData= array_search ('DATA', $sistOperativo); + + $tablaHtml=''; + // Incluimos primera linea de la tabla para todos los equipos. + $inicioTabla='<table id="tabla_conf" class="tabla_datos" border="0" cellpadding="1" cellspacing="1" align="center">'.chr(13); + // Cabecera información sistemas operativos. + $cabeceraTabla='<tr>'.chr(13); + $cabeceraTabla.='<th align="center"> </th>'.chr(13); + $cabeceraTabla.='<th align="center"> Partición </th>'.chr(13); + $cabeceraTabla.='<th align="center"> Nombre del S.O. </th>'.chr(13); + $cabeceraTabla.='</tr>'.chr(13); + // Mensaje si no existen datos en la base de datos. + $tablaSinConfiguracion='<table id="tabla_conf" width="95%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13); + $tablaSinConfiguracion.='<tr><th align="center" >'.$TbMsg["CONFIG_NOCONFIG"].'</th><tr>'.chr(13).'</table>'.chr(13); + + // CONSULTA BD: grupo de equipos con iguales sistemas operativos: idordenadores,configuracion + $cmd->texto=""; + // agrupamos equipos con igual conf de disco. + $cmd->texto="select GROUP_CONCAT(pcconf.idordenador SEPARATOR ',') AS idordenadores, pcconf.configuraciones FROM ("; + + // partconf agrupa la configuracion de todas las part: idordenador | configuracionTodasPart + $cmd->texto.=" select partconf.idordenador , GROUP_CONCAT(partconf.configuracion ORDER BY partconf.configuracion ASC SEPARATOR '@' ) AS configuraciones FROM ("; + + // particion conf: idordenador, numdisk, configuracion (numdisk;numpar;idnombreso) + $cmd->texto.="SELECT ordenadores_particiones.idordenador,ordenadores_particiones.numdisk, CONCAT_WS(';',ordenadores_particiones.numdisk, ordenadores_particiones.numpar, ordenadores_particiones.idnombreso) AS configuracion FROM ordenadores_particiones "; + + switch($ambito){ + case $AMBITO_AULAS : + $cmd->texto.=" INNER JOIN ordenadores ON ordenadores_particiones.idordenador=ordenadores.idordenador + INNER JOIN aulas ON aulas.idaula = ordenadores.idaula + WHERE aulas.idaula =".$idambito; + break; + case $AMBITO_GRUPOSORDENADORES : + $cmd->texto.=" INNER JOIN ordenadores ON ordenadores_particiones.idordenador=ordenadores.idordenador + INNER JOIN gruposordenadores ON gruposordenadores.idgrupo = ordenadores.grupoid + WHERE gruposordenadores.idgrupo =".$idambito; + break; + case $AMBITO_ORDENADORES : + $cmd->texto.=" WHERE ordenadores_particiones.idordenador =".$idambito; + break; + } + + $cmd->texto.=" AND ordenadores_particiones.idnombreso <> 0 "; + // Si existen particiones de datos no las mostramos. + if ($sistData != '') + $cmd->texto.=" AND ordenadores_particiones.idnombreso <> ".$sistData; + + $cmd->texto.=" ORDER BY ordenadores_particiones.idordenador, idordenador,ordenadores_particiones.numdisk, ordenadores_particiones.numpar"; + // fin consulta basica -> partcion conf + $cmd->texto.=") AS partconf GROUP BY partconf.idordenador"; + // fin consulta partconf. + $cmd->texto.=" ) AS pcconf GROUP BY pcconf.configuraciones " ; + + // Muestro datos de la consulta en tabla. + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) + return($tablaHtml); // Error al abrir recordset + $rs->Primero(); + $columns = 3; + $cc=0; + echo $inicioTabla; + // Si no hay datos pinto mensaje informativo. + if($rs->EOF) + echo $tablaSinConfiguracion; + // Para cada grupo de pc con iguales Sist. Operativo pinto una tabla. + while (!$rs->EOF){ + $cc++; + echo '<tr><td colspan="'.$columns.'" style="background-color: #ffffff;">'; + echo pintaOrdenadores($cmd,$rs->campos["idordenadores"],10,$cc,'ipordenador'); + echo "</td></tr>"; + $configuraciones=explode("@",$rs->campos["configuraciones"]); + echo $cabeceraTabla; + // Una fila para cada particion. + $actualDisk = 0; + $tablaHtml=''; + foreach ( $configuraciones as $particiones) { + $datos= explode (';', $particiones); + // Si es inicio de disco + if($actualDisk != $datos[0]){ + $actualDisk = $datos[0]; + $tablaHtml.='<tr><td colspan="'.$columns.'" style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #D4D0C8;"> <strong>'.$TbMsg["DISK"].' '.$actualDisk.'</strong></td><tr>'.chr(13); + } + $tablaHtml.='<tr><td><input name="particion" idcfg="'.$cc.'" id="'.$cc.'_'.$datos[0].'_'.$datos[1].'" value="'.$datos[0].';'.$datos[1].'" type="radio"></td>'.chr(13); + $tablaHtml.='<td align="center"> '.$datos[1].' </td>'.chr(13); + $tablaHtml.='<td> '.$sistOperativo[$datos[2]].'</td></tr>'.chr(13); + + } + echo $tablaHtml; + + + $rs->Siguiente(); + } + $rs->Cerrar(); + echo "</table>".chr(13); + +} + +function tablaConfiguracionesInventarioSoftware($cmd,$idordenador){ + global $TbMsg; + global $idcentro; + $tablaHtml=""; + $cmd->texto="SELECT ordenadores_particiones.numdisk,ordenadores_particiones.numpar, + ordenadores_particiones.tamano, + ordenadores_particiones.idnombreso, nombresos.nombreso, + tipospar.tipopar, imagenes.descripcion AS imagen, + perfilessoft.descripcion AS perfilsoft, + sistemasficheros.descripcion AS sistemafichero + FROM ordenadores + INNER JOIN ordenadores_particiones ON ordenadores_particiones.idordenador=ordenadores.idordenador + LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso + INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar + LEFT OUTER JOIN imagenes ON imagenes.idimagen=ordenadores_particiones.idimagen + LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft + LEFT OUTER JOIN sistemasficheros ON sistemasficheros.idsistemafichero=ordenadores_particiones.idsistemafichero + WHERE ordenadores.idordenador=".$idordenador." + AND nombresos.nombreso!='DATA' + ORDER BY ordenadores_particiones.numdisk,ordenadores_particiones.numpar"; + + $rs->Comando=&$cmd; + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) + return($tablaHtml); // Error al abrir recordset + $rs->Primero(); + $actualDisk = 0; + $columns = 3; + while (!$rs->EOF){ + if($actualDisk != $rs->campos["numdisk"]){ + $actualDisk = $rs->campos["numdisk"]; + $tablaHtml.='<td colspan="'.$columns.'" style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #D4D0C8;"> <strong>'.$TbMsg["DISK"].' '.$actualDisk.'</strong></td>'.chr(13); + } + if(!empty($rs->campos["idnombreso"])){ + $tablaHtml.='<TR>'.chr(13); + $tablaHtml.='<TD ><input type="radio" name="particion" value='.$rs->campos["numdisk"].";".$rs->campos["numpar"].'></TD>'.chr(13); + $tablaHtml.='<TD align=center> '.$rs->campos["numpar"].' </TD>'.chr(13); + $tablaHtml.='<TD> '.$rs->campos["nombreso"].' </TD>'.chr(13); + $tablaHtml.='</TR>'.chr(13); + } + $rs->Siguiente(); + } + $rs->Cerrar(); + + if ( $tablaHtml == "" ) { + // Equipo sin configuracion en base de datos. + $tablaHtml='<table id="tabla_conf" width="95%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13); + $tablaHtml.='<tr><th align="center" >'.$TbMsg["CONFIG_NOCONFIG"].'</th><tr>'.chr(13); + } + else + { + // Equipo con configuracion en BD + // Incluimos primera linea de la tabla. + $inicioTabla='<TABLE id="tabla_conf" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos>'.chr(13); + $inicioTabla.=' <TR>'.chr(13); + $inicioTabla.=' <TH align=center> </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '. $TbMsg["PARTITION"] .' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '. $TbMsg["SO_NAME"] .' </TH>'.chr(13); + $inicioTabla.=' </TR>'.chr(13); + $tablaHtml=$inicioTabla.$tablaHtml; + } + + $tablaHtml.="</table>".chr(13); + + return($tablaHtml); +} + + +/*________________________________________________________________________________________________________ + Crea la tabla de configuraciones y perfiles a crear +________________________________________________________________________________________________________*/ +function tablaConfiguracionesCrearImagen($cmd,$idordenador,$idrepositorio) +{ + global $idcentro; + global $TbMsg; + $tablaHtml=""; + $rs=new Recordset; + $cmd->texto="SELECT ordenadores.ip AS masterip,ordenadores_particiones.numdisk, ordenadores_particiones.numpar,ordenadores_particiones.codpar,ordenadores_particiones.tamano, + ordenadores_particiones.idnombreso,nombresos.nombreso,tipospar.tipopar,tipospar.clonable, + imagenes.nombreca,imagenes.descripcion as imagen,perfilessoft.idperfilsoft, + perfilessoft.descripcion as perfilsoft,sistemasficheros.descripcion as sistemafichero + FROM ordenadores + INNER JOIN ordenadores_particiones ON ordenadores_particiones.idordenador=ordenadores.idordenador + LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso + INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar + LEFT OUTER JOIN imagenes ON imagenes.idimagen=ordenadores_particiones.idimagen + LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft + LEFT OUTER JOIN sistemasficheros ON sistemasficheros.idsistemafichero=ordenadores_particiones.idsistemafichero + WHERE ordenadores.idordenador=".$idordenador." ORDER BY ordenadores_particiones.numdisk,ordenadores_particiones.numpar"; + //echo $cmd->texto; + $rs->Comando=&$cmd; + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) + return($tablaHtml."</table>"); // Error al abrir recordset + $rs->Primero(); + $actualDisk = 0; + $columns = 6; + while (!$rs->EOF){ + + if($actualDisk != $rs->campos["numdisk"]){ + $actualDisk = $rs->campos["numdisk"]; + $tablaHtml.='<td colspan="'.$columns.'" style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #D4D0C8;"> <strong>'.$TbMsg["DISK"].' '.$actualDisk.'</strong></td>'.chr(13); + } + + $swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]); + $swc=$rs->campos["idperfilsoft"]>0; // Una partición es clonable si posee un identificador de perfil software + $swccc=$swcc && $swcc; + $tablaHtml.='<TR>'.chr(13); + if($swccc){ + $tablaHtml.='<TD><input type=radio name="particion" value="'.$rs->campos["numdisk"]."_".$rs->campos["numpar"]."_".$rs->campos["codpar"].'"></TD>'.chr(13); + $tablaHtml.='<TD align=center> '.$rs->campos["numpar"].' </TD>'.chr(13); + $tablaHtml.='<TD align=center> '.$rs->campos["tipopar"].' </TD>'.chr(13); + if(empty($rs->campos["nombreso"]) && !empty($rs->campos["idnombreso"])) // Si el identificador del S.O. no es nulo pero no hay descripción + $tablaHtml.='<TD align=center> '.'<span style="FONT-SIZE:10px; COLOR: red;" >'.$TbMsg[12].'</span></TD>'.chr(13); + else + $tablaHtml.='<TD> '.$rs->campos["nombreso"].' </TD>'.chr(13); + $tablaHtml.='<TD>'.HTMLSELECT_imagenes($cmd,$idrepositorio,$rs->campos["idperfilsoft"],$rs->campos["numdisk"],$rs->campos["numpar"],$rs->campos["masterip"]).'</TD>'; + $tablaHtml.='<TD>'.HTMLSELECT_repositorios($cmd,$idcentro,$idrepositorio,$rs->campos["numdisk"],$rs->campos["numpar"],$rs->campos["masterip"]).'</TD>'; + //$tablaHtml.='<TD> </TD>'; + } + $tablaHtml.='</TR>'.chr(13); + $rs->Siguiente(); + } + $rs->Cerrar(); + if ( $tablaHtml == "" ) { + // Equipo sin configuracion en base de datos. + $tablaHtml='<table id="tabla_conf" width="95%" class="tabla_listados_sin" align="center" border="0" cellpadding="0" cellspacing="1">'.chr(13); + $tablaHtml.='<tr><th align="center" >'.$TbMsg["CONFIG_NOCONFIG"].'</th><tr>'.chr(13); + } + else + { + // Equipo con configuracion en BD + // Incluimos primera linea de la tabla. + $inicioTabla='<TABLE id="tabla_conf" align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos>'.chr(13); + $inicioTabla.=' <TR>'.chr(13); + $inicioTabla.=' <TH align=center> </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '. $TbMsg["PARTITION"] .' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '. $TbMsg["PARTITION_TYPE"] .' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '. $TbMsg["SO_NAME"] .' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '. $TbMsg["IMAGE_TO_CREATE"] .' </TH>'.chr(13); + $inicioTabla.=' <TH align=center> '. $TbMsg["DESTINATION_REPOSITORY"] .' </TH>'.chr(13); + $inicioTabla.=' </TR>'.chr(13); + + $tablaHtml=$inicioTabla.$tablaHtml; + + } + + + $tablaHtml.="</table>"; + return($tablaHtml); +} + +/*---------------------------------------------------------------------------------------------- + Dibuja una tabla con los datos de particiones y parametros a elegir + + Parametros: + - idordenador: El identificador del ordenador +----------------------------------------------------------------------------------------------*/ +function tablaConfiguracionesSincronizacion1($idordenador) +{ + global $idcentro; + global $TbMsg; + global $cmd; + + $tablaHtml=""; + + $cmd->texto="SELECT DISTINCT ordenadores_particiones.numdisk,ordenadores_particiones.numpar, ordenadores_particiones.idnombreso, nombresos.nombreso, + ordenadores_particiones.idimagen, ordenadores_particiones.codpar, + tipospar.clonable, perfilessoft.idperfilsoft, + nombresos.idnombreso, nombresos.nombreso + FROM ordenadores_particiones + INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar + LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso + LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft + WHERE ordenadores_particiones.idordenador=".$idordenador." + ORDER BY ordenadores_particiones.numdisk, ordenadores_particiones.numpar"; + //echo $cmd->texto; + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) + return($tablaHtml); // Error al abrir recordset + $rs->Primero(); + $tbPAR=""; + $actualDisk = 0; + $columns = 9; + while (!$rs->EOF){ + if($actualDisk != $rs->campos["numdisk"]){ + $actualDisk = $rs->campos["numdisk"]; + $tablaHtml.='<td colspan="'.$columns.'" style="BORDER-TOP: #999999 1px solid;BACKGROUND-COLOR: #D4D0C8;"> <strong>'.$TbMsg["DISK"].' '.$actualDisk.'</strong></td>'.chr(13); + } + //$swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]) && !empty($rs->campos["idperfilsoft"]); + $sw=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]); + if($sw){// Una partici�n es clonable si es cierta esta variable + $tbPAR.=$rs->campos["numpar"].";"; // Cadena con las particiones a procesar + $tablaHtml.='<tr id="trPar-'.$rs->campos["numpar"].'">'; + $tablaHtml.='<td align=center><input type=radio name="particion" value="'.$rs->campos["codpar"].'"></td>'; + $tablaHtml.='<td align="center"> '.$rs->campos["numpar"].' </td>'; // N�mero de partici�n + $tablaHtml.='<td align=center> '.$rs->campos["nombreso"].' </td>'; // Nombre sistema operativo $tablaHtml.='<td align=center>'.HTMLSELECT_imagenes($rs->campos["idimagen"]).'</td>'; $metodos="SYNC0="." ".chr(13); $metodos.="SYNC1=".$TbMsg["SYNC1_DIR"].chr(13); $metodos.="SYNC2=".$TbMsg["SYNC2_FILE"]; $tablaHtml.= '<TD align=center>'.HTMLCTESELECT($metodos,"desplesync_".$rs->campos["numpar"],"estilodesple","",1,100).'</TD>'; -
- $tablaHtml.='<td align=center><input type=checkbox name="whole" id="whl-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='<td align=center><input type=checkbox name="paramb" checked id="eli-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='<td align=center><input type=checkbox name="compres" id="cmp-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='</tr>';
- }
- $rs->Siguiente();
- }
- $rs->Cerrar();
- echo $tablaHtml;
- return($tbPAR);
-}
-
-/**
- * La funcion tablaConfiguracionesSincronizacion1 sustituye a las funciones tablaConfiguracionesCrearImagenBasica y
- * tablaConfiguracionesCrearSoftIncremental que eran llamadas desde comandos/CrearImagenBasica.php y comandos/CrearSoftIncremental.php
- * Ahora en ambos ficheros se llama a la misma función ya que pintaban lo mismo en pantalla
- *
-
-/*----------------------------------------------------------------------------------------------
- Dibuja una tabla con los datos de particiones y parametros a elegir
-
- Parametros:
- - idordenador: El identificador del ordenador
-----------------------------------------------------------------------------------------------*
-function tablaConfiguracionesCrearImagenBasica($idordenador)
-{
- global $idcentro;
- global $TbMsg;
- global $cmd;
-
- $tablaHtml="";
- $cmd->texto="SELECT DISTINCT ordenadores_particiones.numpar, ordenadores_particiones.idnombreso, nombresos.nombreso,
- ordenadores_particiones.idimagen, ordenadores_particiones.codpar,
- tipospar.clonable, perfilessoft.idperfilsoft,
- nombresos.idnombreso, nombresos.nombreso
- FROM ordenadores_particiones
- INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar
- LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso
- LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft
- WHERE ordenadores_particiones.idordenador=$idordenador
- ORDER BY ordenadores_particiones.numpar";
- //echo $cmd->texto;
- $rs=new Recordset;
- $rs->Comando=&$cmd;
- if (!$rs->Abrir()) return($tablaHtml); // Error al abrir recordset
- $rs->Primero();
- $tbPAR="";
- while (!$rs->EOF){
- //$swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]) && !empty($rs->campos["idperfilsoft"]);
- $sw=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]);
- if($sw){// Una partici�n es clonable si es cierta esta variable
- $tbPAR.=$rs->campos["numpar"].";"; // Cadena con las particiones a procesar
- $tablaHtml.='<tr id="trPar-'.$rs->campos["numpar"].'">';
- $tablaHtml.='<td align=center><input type=radio name="particion" value="'.$rs->campos["codpar"].'"></td>';
- $tablaHtml.='<td align="center"> '.$rs->campos["numpar"].' </td>'; // N�mero de partici�n
- $tablaHtml.='<td align=center> '.$rs->campos["nombreso"].' </td>'; // Nombre sistema operativo
- $tablaHtml.='<td align=center>'.HTMLSELECT_imagenes($rs->campos["idimagen"]).'</td>';
- $tablaHtml.='<td align=center><input type=checkbox name="whole" id="whl-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='<td align=center><input type=checkbox name="paramb" checked id="eli-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='<td align=center><input type=checkbox name="compres" id="cmp-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='</tr>';
- }
- $rs->Siguiente();
- }
- $rs->Cerrar();
- echo $tablaHtml;
- return($tbPAR);
-}
-
-
-/*----------------------------------------------------------------------------------------------
- Dibuja una tabla con los datos de particiones y parametros a elegir
-
- Parametros:
- - idordenador: El identificador del ordenador
-----------------------------------------------------------------------------------------------*
-function tablaConfiguracionesCrearSoftIncremental($idordenador)
-{
- global $idcentro;
- global $TbMsg;
- global $cmd;
-
- $tablaHtml="";
-
- $cmd->texto="SELECT DISTINCT ordenadores_particiones.numpar, ordenadores_particiones.idnombreso,
- nombresos.nombreso, ordenadores_particiones.idimagen,
- tipospar.clonable, perfilessoft.idperfilsoft,
- nombresos.idnombreso, nombresos.nombreso
- FROM ordenadores_particiones
- INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar
- LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso
- LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft
- WHERE ordenadores_particiones.idordenador=$idordenador
- ORDER BY ordenadores_particiones.numpar";
- //echo $cmd->texto;
- $rs=new Recordset;
- $rs->Comando=&$cmd;
- if (!$rs->Abrir()) return($tablaHtml); // Error al abrir recordset
- $rs->Primero();
- $tbPAR="";
- while (!$rs->EOF){
- //$swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]) && !empty($rs->campos["idperfilsoft"]);
- $sw=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]);
- if($sw){// Una partici�n es clonable si es cierta esta variable
- $tbPAR.=$rs->campos["numpar"].";"; // Cadena con las particiones a procesar
- $tablaHtml.='<TR id="trPar-'.$rs->campos["numpar"].'">';
- $tablaHtml.='<td align=center ><input type=radio name="particion" value="'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='<td align="center"> '.$rs->campos["numpar"].' </td>'; // N�mero de partici�n
- $tablaHtml.='<td align=center> '.$rs->campos["nombreso"].' </td>'; // Nombre sistema operativo
- $tablaHtml.='<td align=center>'.HTMLSELECT_imagenes($rs->campos["idimagen"]).'</td>';
- $tablaHtml.='<td align=center><input type=checkbox name="whole" id="whl-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='<td align=center><input type=checkbox name="paramb" checked id="eli-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='<td align=center><input type=checkbox name="compres" id="cmp-'.$rs->campos["numpar"].'"></td>';
- $tablaHtml.='</TR>';
- }
- $rs->Siguiente();
- }
- $rs->Cerrar();
- echo $tablaHtml;
- return($tbPAR);
-}
-<<<<<<< .mine
+ + $tablaHtml.='<td align=center><input type=checkbox name="whole" id="whl-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='<td align=center><input type=checkbox name="paramb" checked id="eli-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='<td align=center><input type=checkbox name="compres" id="cmp-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='</tr>'; + } + $rs->Siguiente(); + } + $rs->Cerrar(); + echo $tablaHtml; + return($tbPAR); +} + +/** + * La funcion tablaConfiguracionesSincronizacion1 sustituye a las funciones tablaConfiguracionesCrearImagenBasica y + * tablaConfiguracionesCrearSoftIncremental que eran llamadas desde comandos/CrearImagenBasica.php y comandos/CrearSoftIncremental.php + * Ahora en ambos ficheros se llama a la misma función ya que pintaban lo mismo en pantalla + * + +/*---------------------------------------------------------------------------------------------- + Dibuja una tabla con los datos de particiones y parametros a elegir + + Parametros: + - idordenador: El identificador del ordenador +----------------------------------------------------------------------------------------------* +function tablaConfiguracionesCrearImagenBasica($idordenador) +{ + global $idcentro; + global $TbMsg; + global $cmd; + + $tablaHtml=""; + $cmd->texto="SELECT DISTINCT ordenadores_particiones.numpar, ordenadores_particiones.idnombreso, nombresos.nombreso, + ordenadores_particiones.idimagen, ordenadores_particiones.codpar, + tipospar.clonable, perfilessoft.idperfilsoft, + nombresos.idnombreso, nombresos.nombreso + FROM ordenadores_particiones + INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar + LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso + LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft + WHERE ordenadores_particiones.idordenador=$idordenador + ORDER BY ordenadores_particiones.numpar"; + //echo $cmd->texto; + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) return($tablaHtml); // Error al abrir recordset + $rs->Primero(); + $tbPAR=""; + while (!$rs->EOF){ + //$swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]) && !empty($rs->campos["idperfilsoft"]); + $sw=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]); + if($sw){// Una partici�n es clonable si es cierta esta variable + $tbPAR.=$rs->campos["numpar"].";"; // Cadena con las particiones a procesar + $tablaHtml.='<tr id="trPar-'.$rs->campos["numpar"].'">'; + $tablaHtml.='<td align=center><input type=radio name="particion" value="'.$rs->campos["codpar"].'"></td>'; + $tablaHtml.='<td align="center"> '.$rs->campos["numpar"].' </td>'; // N�mero de partici�n + $tablaHtml.='<td align=center> '.$rs->campos["nombreso"].' </td>'; // Nombre sistema operativo + $tablaHtml.='<td align=center>'.HTMLSELECT_imagenes($rs->campos["idimagen"]).'</td>'; + $tablaHtml.='<td align=center><input type=checkbox name="whole" id="whl-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='<td align=center><input type=checkbox name="paramb" checked id="eli-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='<td align=center><input type=checkbox name="compres" id="cmp-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='</tr>'; + } + $rs->Siguiente(); + } + $rs->Cerrar(); + echo $tablaHtml; + return($tbPAR); +} + + +/*---------------------------------------------------------------------------------------------- + Dibuja una tabla con los datos de particiones y parametros a elegir + + Parametros: + - idordenador: El identificador del ordenador +----------------------------------------------------------------------------------------------* +function tablaConfiguracionesCrearSoftIncremental($idordenador) +{ + global $idcentro; + global $TbMsg; + global $cmd; + + $tablaHtml=""; + + $cmd->texto="SELECT DISTINCT ordenadores_particiones.numpar, ordenadores_particiones.idnombreso, + nombresos.nombreso, ordenadores_particiones.idimagen, + tipospar.clonable, perfilessoft.idperfilsoft, + nombresos.idnombreso, nombresos.nombreso + FROM ordenadores_particiones + INNER JOIN tipospar ON tipospar.codpar=ordenadores_particiones.codpar + LEFT OUTER JOIN nombresos ON nombresos.idnombreso=ordenadores_particiones.idnombreso + LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=ordenadores_particiones.idperfilsoft + WHERE ordenadores_particiones.idordenador=$idordenador + ORDER BY ordenadores_particiones.numpar"; + //echo $cmd->texto; + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) return($tablaHtml); // Error al abrir recordset + $rs->Primero(); + $tbPAR=""; + while (!$rs->EOF){ + //$swcc=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]) && !empty($rs->campos["idperfilsoft"]); + $sw=$rs->campos["clonable"] && !empty($rs->campos["idnombreso"]); + if($sw){// Una partici�n es clonable si es cierta esta variable + $tbPAR.=$rs->campos["numpar"].";"; // Cadena con las particiones a procesar + $tablaHtml.='<TR id="trPar-'.$rs->campos["numpar"].'">'; + $tablaHtml.='<td align=center ><input type=radio name="particion" value="'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='<td align="center"> '.$rs->campos["numpar"].' </td>'; // N�mero de partici�n + $tablaHtml.='<td align=center> '.$rs->campos["nombreso"].' </td>'; // Nombre sistema operativo + $tablaHtml.='<td align=center>'.HTMLSELECT_imagenes($rs->campos["idimagen"]).'</td>'; + $tablaHtml.='<td align=center><input type=checkbox name="whole" id="whl-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='<td align=center><input type=checkbox name="paramb" checked id="eli-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='<td align=center><input type=checkbox name="compres" id="cmp-'.$rs->campos["numpar"].'"></td>'; + $tablaHtml.='</TR>'; + } + $rs->Siguiente(); + } + $rs->Cerrar(); + echo $tablaHtml; + return($tbPAR); +} +<<<<<<< .mine /**/ -
+ + +// Devuelve un Array nombres de los sistemas operativos en BD con sus identificadores. +function SistemaOperativoBD ($cmd) { + $idSistOperativo = array(); // Array nombres de los sistemas operativos + + $cmd->texto="select idnombreso, nombreso from nombresos"; + $rs=new Recordset; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) return; // Error al abrir recordset + $rs->Primero(); + while (!$rs->EOF){ + $idSistOperativo[ $rs->campos["idnombreso"] ] = $rs->campos["nombreso"]; + $rs->Siguiente(); + } + + return $idSistOperativo; + +} + diff --git a/admin/WebConsole/index.php b/admin/WebConsole/index.php index 11eb7746..61ea54b9 100644 --- a/admin/WebConsole/index.php +++ b/admin/WebConsole/index.php @@ -25,10 +25,6 @@ include_once("./includes/CreaComando.php"); include_once("./clases/AdoPhp.php"); include_once("./includes/HTMLSELECT.php"); -// Valores por defecto. -$herror=0; -$idcentro=""; - // Control de errores. if (isset($_GET["herror"])) $herror=$_GET["herror"]; if (isset($_POST["herror"])) $herror=$_POST["herror"]; @@ -39,10 +35,28 @@ if (!empty ($parmidi) and file_exists ("idiomas/php/$parmidi/acceso_$parmidi.php } include ("idiomas/php/$idi/acceso_$idi.php"); +$busidcentro=""; $cmd=CreaComando($cnx); // Crea objeto comando if (!$cmd) die($TbMsg["ACCESS_ERROR"]); + $rs=new Recordset; +// $cmd->texto="SELECT * FROM centros WHERE idcentro='$idc'"; + $cmd->texto="SELECT * FROM centros "; + $rs->Comando=&$cmd; + if (!$rs->Abrir()) return(false); // Error al abrir recordset + $rs->Primero(); + if (!$rs->EOF){ + $busidcentro=$rs->campos["identidad"]; + }$rs->Cerrar(); + +// Valores por defecto. +$herror=0; +if (empty($busidcentro)){ + $idcentro=""; +}else{ + $idcentro=$busidcentro; +} ?> <html> <head> diff --git a/admin/WebConsole/jscripts/arrays.js b/admin/WebConsole/jscripts/arrays.js new file mode 100644 index 00000000..4af858f6 --- /dev/null +++ b/admin/WebConsole/jscripts/arrays.js @@ -0,0 +1,30 @@ +/// @file arrays.js +/// @brief: implementa funciones de uso común para arrays. +/// @date: 2014-10-23 + +/// @function array_interset +/// @brief Devuelve un array con los elementos comunes a los dos arrays iniciales. +/// @brief Los arrays deben estar ordenados. +/// @param 1 {Array} array ordenado. +/// @param 2 {Array} array ordenado. +/// @return {Array} array con elementos comunes. +/// @date: 2014-10-23 +function array_interset (a, b) { + var ai=0, bi=0; + var result = new Array(); + while( ai < a.length && bi < b.length ) + if (a[ai] < b[bi] ){ ai++; } + else if (a[ai] > b[bi] ){ bi++; } + else /* they're equal */ + { + result.push(a[ai]); + ai++; + bi++; + } + return result; +} + + + + + diff --git a/admin/WebConsole/jscripts/aulas.js b/admin/WebConsole/jscripts/aulas.js index c2634c3b..254e0ac0 100644 --- a/admin/WebConsole/jscripts/aulas.js +++ b/admin/WebConsole/jscripts/aulas.js @@ -140,7 +140,7 @@ function consola_remota(ambito){ function ver_log(ambito){ var nombre_ordenador=currentNodo.toma_infonodo(); var whref="../principal/verlog.php?nombreordenador="+nombre_ordenador; - window.open(whref,"","width=400,height=100,scrollbars=YES,resizable=YES") + window.open(whref,"","width=1024,height=870,scrollbars=YES,resizable=YES") } //________________________________________________________________________________________________________ @@ -152,7 +152,7 @@ function ver_log(ambito){ function ver_log_seguimiento(ambito){ var nombre_ordenador=currentNodo.toma_infonodo(); var whref="../principal/verlogseguimiento.php?nombreordenador="+nombre_ordenador; - window.open(whref,"","width=400,height=100,scrollbars=YES,resizable=YES") + window.open(whref,"","width=1024,height=870,scrollbars=YES,resizable=YES") } //________________________________________________________________________________________________________ @@ -231,7 +231,7 @@ function confirmarcomando(ambito,idcomando,descricomando,pagina,gestor,funcion){ reset_contextual(-1,-1); // Oculta menu contextual document.fcomandos.idcomando.value=idcomando; // Identificador del comandos document.fcomandos.descricomando.value=descricomando; // Descripción del comandos - document.fcomandos.ambito.value=ambito; // Ámbito de aplicación + document.fcomandos.ambito.value=ambito; // ?mbito de aplicación document.fcomandos.idambito.value=currentNodo.toma_identificador(); // Identificador del ámbito document.fcomandos.nombreambito.value=currentNodo.toma_infonodo() ; // Nombre del ámbito document.fcomandos.action=pagina; // Página interactiva del comando diff --git a/admin/WebConsole/jscripts/propiedades_aulas.js b/admin/WebConsole/jscripts/propiedades_aulas.js index 947ab1d5..dd8502fe 100644 --- a/admin/WebConsole/jscripts/propiedades_aulas.js +++ b/admin/WebConsole/jscripts/propiedades_aulas.js @@ -110,9 +110,17 @@ function comprobar_datos(){ validation_highlight (document.fdatos.paginavalidacion); return(false); } + // Validacion paginas de autenticacion, se usan variables auxiliares + var prefix = 'https://' + form.router.value + '/opengnsys/validacion/'; + var plogin = document.createElement("INPUT"); + var pvalidacion = document.createElement("INPUT"); + plogin.value = prefix + form.paginalogin.value; + pvalidacion.value = prefix + form.paginavalidacion.value; // Validación general de datos del formulario. - return validate (form.nombreaula, validate_notnull, 0) && + return validate (form.nombreaula, validate_text_notnull, 0) && validate (form.puestos, validate_number_notnull, 1) && + validate (form.ubicacion, validate_text, 17) && + validate (form.comentarios, validate_text, 18) && validate (form.router, validate_ipadress_notnull, 4) && validate (form.netmask, validate_ipadress_notnull, 5) && validate (form.dns, validate_ipadress, 12) && @@ -122,7 +130,10 @@ function comprobar_datos(){ validate (form.modomul, validate_notnull, 8) && validate (form.ipmul, validate_ipadress_notnull, 9) && validate (form.pormul, validate_notnull, 10) && - validate (form.velmul, validate_number_notnull, 11); + validate (form.velmul, validate_number_notnull, 11) && + validate (plogin, validate_url, 15) && + validate (pvalidacion, validate_url, 16); + } //________________________________________________________________________________________________________ diff --git a/admin/WebConsole/jscripts/propiedades_imagenes.js b/admin/WebConsole/jscripts/propiedades_imagenes.js index 0161f715..f8655a22 100644 --- a/admin/WebConsole/jscripts/propiedades_imagenes.js +++ b/admin/WebConsole/jscripts/propiedades_imagenes.js @@ -87,15 +87,14 @@ function comprobar_datos(){ if(form.tipoimg.getAttribute("value")!=IMAGENES_INCREMENTALES){ return validate (form.nombreca, validate_nameimagefile, 3) && validate (form.nombreca, validate_notnull, 3) && - validate (form.descripcion, validate_notnull, 0) && - validate (form.numpar, validate_notnull, 4) && + validate (form.descripcion, validate_notnull, 0) && validate (form.codpar, validate_notnull, 5) && validate (form.idrepositorio, validate_notnull, 6); } else{ return validate (form.nombreca, validate_nameimagefile, 3) && validate (form.nombreca, validate_notnull, 3) && - validate (form.descripcion, validate_notnull, 0) && + validate (form.descripcion, validate_notnull, 0) && validate (form.imagenid, validate_notnull, 8); } return(true); diff --git a/admin/WebConsole/jscripts/propiedades_menus.js b/admin/WebConsole/jscripts/propiedades_menus.js index b270eebf..7a7ae518 100644 --- a/admin/WebConsole/jscripts/propiedades_menus.js +++ b/admin/WebConsole/jscripts/propiedades_menus.js @@ -74,10 +74,18 @@ function confirmar(op){ // Comprobar_datos //___________________________________________________________________________________________________________ function comprobar_datos(){ + var url=[document.fdatos.htmlmenupub.value,document.fdatos.htmlmenupri.value]; + var expreg=new RegExp("^http://|^https://"); if (document.fdatos.descripcion.value=="") { alert(TbMsg[0]); document.fdatos.descripcion.focus(); return(false); } + for (i = 0; i < url.length; i++) { + if (url[i]!="" && ! expreg.test(url[i])) { + alert(TbMsg[2]); + return(false); + } + } return(true); } diff --git a/admin/WebConsole/jscripts/propiedades_repositorios.js b/admin/WebConsole/jscripts/propiedades_repositorios.js index abe90b46..a27e2ed8 100644 --- a/admin/WebConsole/jscripts/propiedades_repositorios.js +++ b/admin/WebConsole/jscripts/propiedades_repositorios.js @@ -80,31 +80,18 @@ function confirmar(op){ // Comprobar_datos //___________________________________________________________________________________________________________ function comprobar_datos(){ - if (document.fdatos.nombrerepositorio.value=="") { - alert(TbMsg[0]); - document.fdatos.nombrerepositorio.focus(); - return(false); - } - if (document.fdatos.ip.value=="") { - alert(TbMsg[1]); - document.fdatos.ip.focus(); - return(false); - } - if (document.fdatos.puertorepo.value=="") { - alert(TbMsg[3]); - document.fdatos.puertorepo.focus(); - return(false); - } - if (document.fdatos.pathrepod.value=="") { - alert(TbMsg[4]); - document.fdatos.pathrepod.focus(); - return(false); - } - if (document.fdatos.pathpxe.value=="") { - alert(TbMsg[5]); - document.fdatos.pathpxe.focus(); - return(false); + function validate (field, validator, msgi) { + if (!validator (field.value)) { + alert(TbMsg[msgi]); + validation_highlight (field); + return false; + } + return true; } - - return(true); + // Validación general de datos del formulario. + return validate (fdatos.nombrerepositorio, validate_text_notnull, 0 ) && + validate (fdatos.ip, validate_ipadress_notnull, 1 ) && + validate (fdatos.puertorepo, validate_number_notnull, 3 ) && + validate (fdatos.comentarios, validate_text, 4 ); + } diff --git a/admin/WebConsole/jscripts/validators.js b/admin/WebConsole/jscripts/validators.js index b4f40801..7c031f8b 100644 --- a/admin/WebConsole/jscripts/validators.js +++ b/admin/WebConsole/jscripts/validators.js @@ -46,7 +46,7 @@ function validate_number_notnull(value) { } function validate_alphanum_notnull(value) { - return validate_number(value) && validate_notnull(value); + return validate_alphanum(value) && validate_notnull(value); } // Validar dirección IPv4. @@ -60,10 +60,10 @@ function validate_ipadress_notnull(value) { return validate_ipadress(value) && validate_notnull(value); } -// Validar direccion MAC +// Validar direccion MAC (sin contar caracteres ":"). function validate_macaddress(value) { var regex = '^([0-9a-fA-F]){12}$' - return validate_expr(value, regex); + return validate_expr(value.replace(/:/g,''), regex); } function validate_macaddress_notnull(value) { @@ -86,6 +86,14 @@ function validate_nameimagefile(value) { return validate_expr(value, "^[0-9a-zA-Z]*$"); } +// Validar texto: alfanumerico más espacios, subrayado y guiones. +function validate_text(value) { + return ! validate_expr(value, /.*['"%&<=>*$+?|\/]/); +} + +function validate_text_notnull(value) { + return validate_text(value) && validate_notnull(value); +} function validation_highlight(field) { field.focus(); diff --git a/admin/WebConsole/principal/repositorios.php b/admin/WebConsole/principal/repositorios.php index d1d5497e..6d4254c3 100644 --- a/admin/WebConsole/principal/repositorios.php +++ b/admin/WebConsole/principal/repositorios.php @@ -46,7 +46,6 @@ $XMLcontextual=ContextualXMLComandos($LITAMBITO_CENTROS,$AMBITO_CENTROS); <SCRIPT language="javascript" src="../jscripts/comunes.js"></SCRIPT> <SCRIPT language="javascript" src="../clases/jscripts/HttpLib.js"></SCRIPT> <? echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/comunes_'.$idioma.'.js"></SCRIPT>'?> - <? echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/repositorios_'.$idioma.'.js"></SCRIPT>'?> </HEAD> <BODY OnContextMenu="return false"> <FORM name="fcomandos" action="" method="post" target="frame_contenidos"> @@ -359,4 +358,4 @@ function ContextualXMLComandos($litambito,$ambito){ return($finallayerXML); } } -?>
\ No newline at end of file +?> diff --git a/admin/WebConsole/propiedades/propiedades_imagenes.php b/admin/WebConsole/propiedades/propiedades_imagenes.php index b622fb44..bdd7b21c 100644 --- a/admin/WebConsole/propiedades/propiedades_imagenes.php +++ b/admin/WebConsole/propiedades/propiedades_imagenes.php @@ -12,7 +12,8 @@ include_once("../includes/ctrlacc.php"); include_once("../clases/AdoPhp.php"); include_once("../includes/constantes.php"); include_once("../includes/opciones.php"); -include_once("../includes/CreaComando.php");include_once("../includes/HTMLSELECT.php"); +include_once("../includes/CreaComando.php"); +include_once("../includes/HTMLSELECT.php"); include_once("../includes/TomaDato.php"); include_once("../idiomas/php/".$idioma."/propiedades_imagenes_".$idioma.".php"); //________________________________________________________________________________________________________ @@ -26,8 +27,10 @@ $idimagen=0; $nombreca=""; $ruta=""; $descripcion=""; -$codpar=0; +$modelo=""; +$numdisk=0; $numpar=0; +$codpar=0; $idperfilsoft=0; $perfilsoft=""; $comentarios=""; @@ -35,6 +38,7 @@ $grupoid=0; $litamb=""; $tipoimg=0; $idrepositorio=0; +$fechacreacion=""; $imagenid=0; if (isset($_POST["validnombreca"])) {$opcion=$_POST["validnombreca"];}else{$validnombreca="";} // Recoge parametros if (isset($_POST["datospost"])) {$datospost=$_POST["datospost"];}else{$datospost=0;} // Recoge parametros @@ -67,11 +71,14 @@ if ( $opcion == 1 && $datospost == 1) if (isset($_POST["idperfilsoft"])) $idperfilsoft=$_POST["idperfilsoft"]; if (isset($_POST["comentarios"])) $comentarios=$_POST["comentarios"]; if (isset($_POST["identificador"])) $idimagen=$_POST["identificador"]; + if (isset($_POST["modelo"])) $numpar=$_POST["modelo"]; + if (isset($_POST["numdisk"])) $numpar=$_POST["numdisk"]; if (isset($_POST["numpar"])) $numpar=$_POST["numpar"]; if (isset($_POST["codpar"])) $codpar=$_POST["codpar"]; if (isset($_POST["idrepositorio"])) $idrepositorio=$_POST["idrepositorio"]; if (isset($_POST["imagenid"])) $imagenid=$_POST["imagenid"]; if (isset($_POST["tipoimg"])) $tipoimg=$_POST["tipoimg"]; + if (isset($_POST["fechacreacion"])) $fechacreacion=$_POST["fechacreacion"]; if (isset($_POST["litamb"])) $litamb=$_POST["litamb"]; @@ -103,7 +110,7 @@ if ( $opcion == 1 && $datospost == 1) <INPUT type="hidden" name="tipoimg" value="<?=$tipoimg?>"> <INPUT type="hidden" name="litamb" value="<?=$litamb?>"> <INPUT type="hidden" name="datospost" value="1"> - <? + <?php switch($tipoimg){ case $IMAGENES_MONOLITICAS: $lit=$TbMsg[4]; @@ -153,27 +160,16 @@ if ( $opcion == 1 && $datospost == 1) ?> </TR> <?}?> - <!--------------------------------------------------------------------------------------> - <?if($tipoimg!=$IMAGENES_INCREMENTALES){?> - <TR> - <TH align=center> <?echo $TbMsg[8]?> </TD> - <? - if ($opcion==$op_eliminacion || !empty($idperfilsoft)) - echo '<TD>'.$numpar.' - <INPUT type="hidden" name="numpar" value="'.$numpar.'"></TD>'; - else - echo '<TD><INPUT class="formulariodatos" name=numpar style="width:30" type=text value="'.$numpar.'"></TH>'; - ?> - </TR> + <?php if($tipoimg!=$IMAGENES_INCREMENTALES){?> <!--------------------------------------------------------------------------------------> <tr> <th align="center"> <?php echo $TbMsg[9]?> </th> <?php if ($opcion==$op_eliminacion || !empty($idperfilsoft)) - echo '<td>'.$tipopar.' - <INPUT type="hidden" name="codpar" value="'.$codpar.'"></TD>'; + echo '<td>'.$tipopar.' ('.dechex($codpar).') + <input type="hidden" name="codpar" value="'.$codpar.'"></td>'; else - echo '<td>'.HTMLSELECT($cmd,0,'tipospar',$codpar,'codpar',"CONCAT(tipopar,' (',HEX(codpar),')')",170,"","","clonable=1").'</td>'; + echo '<td>'.HTMLSELECT($cmd,0,'tipospar',$codpar,'codpar',"CONCAT(CASE WHEN codpar BETWEEN 1 AND 255 THEN '1-MSDOS' WHEN codpar BETWEEN 256 AND 65535 THEN '2-GPT' ELSE codpar END,': ',tipopar,' (',HEX(codpar),')')",170,"","","clonable=1").'</td>'; ?> </tr> <!--------------------------------------------------------------------------------------> @@ -207,6 +203,25 @@ if ( $opcion == 1 && $datospost == 1) echo '<TD><TEXTAREA class="formulariodatos" name=comentarios rows=3 cols=55>'.$comentarios.'</TEXTAREA></TH>'; ?> </TR> + <!-- Equipo modelo (aula) --> + <tr> + <th align=center> <?php echo $TbMsg[19]?> </th> + <td> <?php echo $modelo ?> + <input type="hidden" name="modelo" value="<?php echo $modelo ?>"> + </tr> + <!-- Disco y partición --> + <tr> + <th align="center"> <?php echo $TbMsg[8]?> </th> + <td> <?php if (! empty ($modelo)) echo "$numdisk, $numpar" ?> + <input type="hidden" name="numdisk" value="<?php echo $numdisk ?>"> + <input type="hidden" name="numpar" value="<?php echo $numpar ?>"></td> + </tr> + <!-- Fecha de creación --> + <tr> + <th align="center"> <?php echo $TbMsg[20]?> </th> + <td> <?php if (! empty ($modelo)) echo "$fechacreacion" ?> + <input type="hidden" name="fechacreacion" value="<?php echo $fechacreacion ?>"></td> + </tr> <!--------------------------------------------------------------------------------------> <TR> @@ -264,21 +279,26 @@ function TomaPropiedades($cmd,$idmagen){ global $descripcion; global $comentarios; global $idperfilsoft; + global $modelo; + global $numdisk; global $numpar; global $codpar; global $tipopar; global $nombrerepositorio; global $idrepositorio; - global $perfilsoft; - global $imagenid; + global $perfilsoft; + global $imagenid; + global $fechacreacion; $rs=new Recordset; - $cmd->texto="SELECT imagenes.*,tipospar.tipopar,repositorios.nombrerepositorio,perfilessoft.descripcion as perfilsoft - FROM imagenes - LEFT OUTER JOIN tipospar ON tipospar.codpar=imagenes.codpar - LEFT OUTER JOIN repositorios ON repositorios.idrepositorio=imagenes.idrepositorio - LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=imagenes.idperfilsoft - WHERE imagenes.idimagen=".$idmagen; + $cmd->texto="SELECT imagenes.*, tipospar.tipopar, repositorios.nombrerepositorio, perfilessoft.descripcion AS perfilsoft, CONCAT (ordenadores.nombreordenador,' (',aulas.nombreaula,')') AS modelo + FROM imagenes + LEFT OUTER JOIN tipospar ON tipospar.codpar=imagenes.codpar + LEFT OUTER JOIN repositorios ON repositorios.idrepositorio=imagenes.idrepositorio + LEFT OUTER JOIN perfilessoft ON perfilessoft.idperfilsoft=imagenes.idperfilsoft + LEFT OUTER JOIN ordenadores ON ordenadores.idordenador=imagenes.idordenador + LEFT OUTER JOIN aulas ON ordenadores.idaula=aulas.idaula + WHERE imagenes.idimagen=".$idmagen; $rs->Comando=&$cmd; if (!$rs->Abrir()) return(0); // Error al abrir recordset $rs->Primero(); @@ -288,6 +308,8 @@ function TomaPropiedades($cmd,$idmagen){ $descripcion=$rs->campos["descripcion"]; $idperfilsoft=$rs->campos["idperfilsoft"]; $comentarios=$rs->campos["comentarios"]; + $modelo=$rs->campos["modelo"]; + $numdisk=$rs->campos["numdisk"]; $numpar=$rs->campos["numpar"]; $tipopar=$rs->campos["tipopar"]; $codpar=$rs->campos["codpar"]; @@ -295,6 +317,7 @@ function TomaPropiedades($cmd,$idmagen){ $nombrerepositorio=$rs->campos["nombrerepositorio"]; $perfilsoft=$rs->campos["perfilsoft"]; $imagenid=$rs->campos["imagenid"]; + $fechacreacion=$rs->campos["fechacreacion"]; $rs->Cerrar(); return(true); } diff --git a/admin/WebConsole/propiedades/propiedades_menus.php b/admin/WebConsole/propiedades/propiedades_menus.php index ffc645d1..efe3575b 100644 --- a/admin/WebConsole/propiedades/propiedades_menus.php +++ b/admin/WebConsole/propiedades/propiedades_menus.php @@ -25,11 +25,7 @@ $opciones=array($TbMsg[0],$TbMsg[1],$TbMsg[2],$TbMsg[3]); $idmenu=0; $descripcion=""; $titulo=""; -$coorx=0; -$coory=0; $modalidad=0; -$scoorx=0; -$scoory=0; $smodalidad=0; $comentarios=""; $grupoid=0; @@ -160,23 +156,12 @@ if ($opcion!=$op_alta){ <!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> <TABLE align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos> <TR> - <TD align=center colspan=6> <b><?echo $TbMsg[8]?></b> </TD> + <TD align=center colspan=2> <b><?echo $TbMsg[8]?></b> </TD> </TR> <!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> <TR> - <TH align=center> <?echo $TbMsg[9]?> </TH> - <?if ($opcion==$op_eliminacion) - echo '<TD style="width:50">'.$coorx.'</TD>'; - else - echo '<TD><INPUT class="formulariodatos" name=coorx style="width:50" type=text value="'.$coorx.'"></TD>';?> - <TH align=center> <?echo $TbMsg[10]?> </TH> - <?if ($opcion==$op_eliminacion) - echo '<TD style="width:50">'.$coorx.'</TD>'; - else - echo '<TD><INPUT class="formulariodatos" name=coory style="width:50" type=text value="'.$coory.'"></TD>';?> - <TH align=center> <?echo $TbMsg[11]?> </TH> - <? - if ($opcion==$op_eliminacion){ + <TH align=center> <?php echo $TbMsg[11]?> </TH> + <?php if ($opcion==$op_eliminacion){ $tbmodalidad[1]=$TbMsg[13]; $tbmodalidad[2]=$TbMsg[14]; echo '<TD style="width:100">'.$tbmodalidad[$modalidad].'</TD>'; @@ -206,19 +191,8 @@ if ($opcion!=$op_alta){ </TR> <!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> <TR> - <TH align=center> <?echo $TbMsg[9]?> </TH> - <?if ($opcion==$op_eliminacion) - echo '<TD style="width:50">'.$scoorx.'</TD>'; - else - echo '<TD><INPUT class="formulariodatos" name=scoorx style="width:50" type=text value="'.$scoorx.'"></TD>';?> - <TH align=center> <?echo $TbMsg[10]?> </TH> - <?if ($opcion==$op_eliminacion) - echo '<TD style="width:50">'.$scoorx.'</TD>'; - else - echo '<TD><INPUT class="formulariodatos" name=scoory style="width:50" type=text value="'.$scoory.'"></TD>';?> - <TH align=center> <?echo $TbMsg[11]?> </TH> - <? - if ($opcion==$op_eliminacion){ + <TH align=center> <?php echo $TbMsg[11]?> </TH> + <?php if ($opcion==$op_eliminacion){ $tbmodalidad[1]=$TbMsg[13]; $tbmodalidad[2]=$TbMsg[14]; echo '<TD style="width:100">'.$tbmodalidad[$smodalidad].'</TD>'; @@ -234,15 +208,21 @@ if ($opcion!=$op_alta){ ?> </TR> <TR> - <TH align=center> <?echo $TbMsg[16]?> </TH> + <TH align=center> <?echo $TbMsg[15]?> </TH> <?if ($opcion==$op_eliminacion) echo '<TD colspan=5">'.$htmlmenupri.'</TD>'; else echo '<TD colspan=5><INPUT class="formulariodatos" name=htmlmenupri style="width:350" type=text value="'.$htmlmenupri.'"></TD>'; ?> </TR> -<!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> </TABLE> +<!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> + <br> + <table align="center" border="0" cellpadding="1" cellspacing="1" class="tabla_datos"> + <?php if ($opcion!=$op_eliminacion) + echo '<tr><th align="center"> '.$TbMsg["WARN_NOTESOFMENU"].' </th></th>'; + ?> + </table> </FORM> </DIV> <?php @@ -262,11 +242,7 @@ include_once("../includes/opcionesbotonesop.php"); function TomaPropiedades($cmd,$id){ global $descripcion; global $titulo; - global $coorx; - global $coory; global $modalidad; - global $scoorx; - global $scoory; global $smodalidad; global $comentarios; global $htmlmenupub; @@ -282,11 +258,7 @@ function TomaPropiedades($cmd,$id){ if (!$rs->EOF){ $descripcion=$rs->campos["descripcion"]; $titulo=$rs->campos["titulo"]; - $coorx=$rs->campos["coorx"]; - $coory=$rs->campos["coory"]; $modalidad=$rs->campos["modalidad"]; - $scoorx=$rs->campos["scoorx"]; - $scoory=$rs->campos["scoory"]; $smodalidad=$rs->campos["smodalidad"]; $comentarios=$rs->campos["comentarios"]; $htmlmenupub=$rs->campos["htmlmenupub"]; diff --git a/admin/WebConsole/propiedades/propiedades_ordenadores.php b/admin/WebConsole/propiedades/propiedades_ordenadores.php index cf9b55cb..b4ebc196 100644 --- a/admin/WebConsole/propiedades/propiedades_ordenadores.php +++ b/admin/WebConsole/propiedades/propiedades_ordenadores.php @@ -263,6 +263,11 @@ function abrir_ventana(URL){ <tr> <th colspan="4" align="center"> <sup>*</sup> <?php echo $TbMsg["WARN_NAMELENGTH"]?> </th> </tr> +<?php } + if ($opcion==$op_alta) { ?> + <tr> + <th colspan="4" align="center"> <?php echo $TbMsg["WARN_NETBOOT"]?> </th> + </tr> <?php } ?> </table> </form> diff --git a/admin/WebConsole/propiedades/propiedades_repositorios.php b/admin/WebConsole/propiedades/propiedades_repositorios.php index deee1367..571c7d0e 100644 --- a/admin/WebConsole/propiedades/propiedades_repositorios.php +++ b/admin/WebConsole/propiedades/propiedades_repositorios.php @@ -21,8 +21,6 @@ $idrepositorio=0; $nombrerepositorio="";
$ip="";
$puertorepo="2002";
-$pathrepod="/opt/opengnsys/admin";
-$pathpxe="/opt/opengnsys/tftpboot/pxelinux.cfg";
$grupoid=0;
$comentarios="";
$ordenadores=0; // Número de ordenador a los que da servicio
@@ -87,6 +85,7 @@ else{ <HEAD>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<LINK rel="stylesheet" type="text/css" href="../estilos.css">
+ <SCRIPT language="javascript" src="../jscripts/validators.js"></SCRIPT>
<SCRIPT language="javascript" src="../jscripts/propiedades_repositorios.js"></SCRIPT>
<SCRIPT language="javascript" src="../jscripts/opciones.js"></SCRIPT>
<? echo '<SCRIPT language="javascript" src="../idiomas/javascripts/'.$idioma.'/propiedades_repositorios_'.$idioma.'.js"></SCRIPT>'?>
@@ -137,26 +136,6 @@ else{ </TR>
<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
<TR>
- <TH align=center> <?echo $TbMsg[9]?> </TD>
- <?
- if ($opcion==$op_eliminacion)
- echo '<TD colspan=2>'.$pathrepod.'</TD>';
- else
- echo'<TD colspan=2><INPUT class="formulariodatos" name=pathrepod type=text style="width:330" value="'.$pathrepod.'"></TD>';
- ?>
- </TR>
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
- <TR>
- <TH align=center> <?echo $TbMsg[10]?> </TD>
- <?
- if ($opcion==$op_eliminacion)
- echo '<TD colspan=2>'.$pathpxe.'</TD>';
- else
- echo'<TD colspan=2><INPUT class="formulariodatos" name=pathpxe type=text style="width:330" value="'.$pathpxe.'"></TD>';
- ?>
- </TR>
-<!------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
- <TR>
<TH align=center> <?echo $TbMsg[7]?> </TD>
<?
if ($opcion==$op_eliminacion)
@@ -218,8 +197,6 @@ function TomaPropiedades($cmd,$id){ global $ip;
global $comentarios;
global $puertorepo;
- global $pathrepod;
- global $pathpxe;
global $ordenadores;
@@ -240,8 +217,6 @@ function TomaPropiedades($cmd,$id){ $ip=$rs->campos["ip"];
$comentarios=$rs->campos["comentarios"];
$puertorepo=$rs->campos["puertorepo"];
- $pathrepod=$rs->campos["pathrepod"];
- $pathpxe=$rs->campos["pathpxe"];
// $ordenadores=$rs->campos["numordenadores"];
}
$rs->Cerrar();
diff --git a/admin/WebConsole/propiedades/propiedades_usuarios.php b/admin/WebConsole/propiedades/propiedades_usuarios.php index 8ba7762e..ddff2e4b 100644 --- a/admin/WebConsole/propiedades/propiedades_usuarios.php +++ b/admin/WebConsole/propiedades/propiedades_usuarios.php @@ -77,40 +77,35 @@ switch($idtipousuario){ <INPUT type=hidden name=idusuario value=<?=$idusuario?>> <INPUT type=hidden name=idtipousuario value=<?=$idtipousuario?>> <INPUT type=hidden name=idambito value=<?=$idambito?>> - <? - if ($opcion==$op_modificacion && $idtipousuario!=$SUPERADMINISTRADOR){ - echo '<INPUT type=hidden name=usuario value='.$usuario.'>'; - echo '<INPUT type=hidden name=pasguor value='.$pasguor.'>'; - } - ?> + <P align=center class=cabeceras><?echo $TbMsg[4]." (".$litusu.")"?><BR> <SPAN align=center class=subcabeceras><? echo $opciones[$opcion]?></SPAN></P> <TABLE align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos> -<!--------------------------------------------------------------------------------------------------------------------------------------------------> +<!------------------------------------------------ NOMBRE USUARIO --------------------------------------------------------------------------------------------------> <TR> <TH> <?echo $TbMsg[5]?> </TH> - <?if ($opcion==$op_eliminacion || ($opcion==$op_modificacion && $idtipousuario!=$SUPERADMINISTRADOR)){?> - <TD><?echo $usuario?>  <IMG src="<? echo $urlimg ?>"></TD> + <?if ($opcion==$op_eliminacion || $opcion==$op_modificacion && $idusuario==1){?> + <TD><INPUT type=hidden class=cajatexto name="usuario" style="width:100" value="<? echo $usuario?>"></INPUT><?echo $usuario?>  <IMG src="<? echo $urlimg ?>"></TD> <?}else{?> <TD><INPUT type=text class=cajatexto name="usuario" style="width:100" value="<? echo $usuario?>"> <IMG src="<? echo $urlimg ?>"> <?}?> </TR> -<!--------------------------------------------------------------------------------------------------------------------------------------------------> +<!---------------------------------------------------- PASSWORD --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> <TR> <TH> <?echo $TbMsg[6]?> </TH> - <?if ($opcion==$op_eliminacion || ($opcion==$op_modificacion && $idtipousuario!=$SUPERADMINISTRADOR)){?> - <TD><?echo $pasguor?></TD> + <?if ($opcion==$op_eliminacion || $opcion==$op_modificacion && $idusuario==1){?> + <TD><INPUT type=hidden class=cajatexto name="pasguor" style="width:100" value="<? echo $pasguor?>"></INPUT><?echo $pasguor?></TD> <?}else{?> <TD><INPUT type=text class=cajatexto name="pasguor" style="width:100" value="<? echo $pasguor?>"> <?}?> </TR> -<!--------------------------------------------------------------------------------------------------------------------------------------------------> +<!--------------------------------------------------- NOMBRE COMPLETO -----------------------------------------------------------------------------------------------> <TR> <TH> <?echo $TbMsg[7]?> </TH> - <?if ($opcion==$op_eliminacion){?> - <TD><?echo $nombre?></TD> + <?if ($opcion==$op_eliminacion || ($opcion==$op_modificacion && $idusuario==1)){?> + <TD><INPUT type=hidden class=cajatexto name="nombre" style="width:250" value="<? echo $nombre?>"></INPUT><?echo $nombre?></TD> <?}else{?> <TD><INPUT type=text class=cajatexto name="nombre" style="width:250" value="<? echo $nombre?>"> <?}?> @@ -138,10 +133,29 @@ switch($idtipousuario){ </TABLE> </FORM> </DIV> + +<?php +if ($idusuario==1){ +///* + + echo '<TABLE id=tabla_conf align=center border=0 cellPadding=1 cellSpacing=1 class=tabla_datos>'; + echo '<TR>'; + echo '</TR>'; + echo '<div onclick=window.open("http://opengnsys.es/wiki/ModificarUsuarios")><TR>'; + echo '<TH align=center > '.$TbMsg[14].$TbMsg[15].$TbMsg[16].$TbMsg[17].'<a color=white href='.$TbMsg[17].' target=blank></a></br>'.$nombreambito.$TbMsg[23].'</br>'.$TbMsg[24].' </TH>'; + echo '</TR></div>'; + echo '</TABLE>'; + +//*/ +} +?> <? +if ($opcion==$op_eliminacion && $idusuario==1) +{}else{ //________________________________________________________________________________________________________ include_once("../includes/opcionesbotonesop.php"); //________________________________________________________________________________________________________ +} ?> </BODY> </HTML> diff --git a/admin/WebConsole/validacion/functions.php b/admin/WebConsole/validacion/functions.php index c605c9eb..3f4281f8 100644 --- a/admin/WebConsole/validacion/functions.php +++ b/admin/WebConsole/validacion/functions.php @@ -55,8 +55,8 @@ function TomaPropiedades($cmd){ //___________________________________________________________________________________________________ function RecuperaMenu($cmd,$iph){ $rs=new Recordset; - $cmd->texto="SELECT menus.idcentro,menus.resolucion,menus.titulo,menus.idurlimg,menus.coorx,menus.coory, - menus.modalidad,menus.scoorx,menus.scoory,menus.smodalidad,menus.htmlmenupub,menus.htmlmenupri, + $cmd->texto="SELECT menus.idcentro,menus.resolucion,menus.titulo,menus.idurlimg, + menus.modalidad,menus.smodalidad,menus.htmlmenupub,menus.htmlmenupri, acciones_menus.tipoaccion,acciones_menus.idaccionmenu,acciones_menus.idtipoaccion, acciones_menus.tipoitem,acciones_menus.descripitem,iconos.urlicono FROM ordenadores @@ -81,13 +81,8 @@ function GeneraMenu($rs,$tipo,$iph){ global $UrlPaginaIconos; $titulo=$rs->campos["titulo"]; - $coorx=$rs->campos["coorx"]; - $coory=$rs->campos["coory"]; $modalidad=$rs->campos["modalidad"]; - $scoorx=$rs->campos["scoorx"]; - $scoory=$rs->campos["scoory"]; $smodalidad=$rs->campos["smodalidad"]; - $scoory=$rs->campos["scoory"]; $resolucion=$rs->campos["resolucion"]; $htmlmenupub=$rs->campos["htmlmenupub"]; $htmlmenupri=$rs->campos["htmlmenupri"]; @@ -98,8 +93,7 @@ function GeneraMenu($rs,$tipo,$iph){ $mod=$modalidad; $codeHTML=""; - // Genera HTML de la p�ina en funci� de las propiedades del Men del clioente - //$codeHTML.='<DIV style="POSITION:absolute;TOP:'.$coory."px;LEFT:".$coorx.'px">'; + // Genera HTML de la página en función de las propiedades del menú del cliente. $codeHTML.='<P align=center>'; $codeHTML.='<SPAN style="COLOR: #999999;FONT-FAMILY: Arial, Helvetica, sans-serif;FONT-SIZE: 20px;"><U>'.$titulo.'</U></SPAN>'; $codeHTML.='</BR>'; @@ -148,6 +142,7 @@ function GeneraMenu($rs,$tipo,$iph){ $codeHTML.='<BR><BR>'; $codeHTML.='<P align=center>'; + if (empty($url)) $url=""; switch($tipo){ case $ITEMS_PUBLICOS: $url.='acceso_operador.php'; diff --git a/admin/WebConsole/varios/incorporaordenadores.php b/admin/WebConsole/varios/incorporaordenadores.php index b6fe7c4b..756a8f5c 100644 --- a/admin/WebConsole/varios/incorporaordenadores.php +++ b/admin/WebConsole/varios/incorporaordenadores.php @@ -58,9 +58,11 @@ if(!empty($contenido)){ // Se ha introducido contenido en lugar de fichero <table align="center" class="tabla_datos" border="0" cellpadding="0" cellspacing="1"> <!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> <tr> - <th> <?php echo $TbMsg[2]?> </th> - <td><textarea class="cajatexto" name="contenido" cols="70" rows="18"></textarea></td></tr> + <th> <?php echo $TbMsg["MSG_DHCPCODE"]?> <br> + <?php echo $TbMsg["MSG_DHCPHOST"]?> </th> + <td><textarea class="cajatexto" name="contenido" cols="70" rows="18"></textarea></td></tr> <tr><th colspan="2"> <?php echo $TbMsg["WARN_NAMELENGTH"]?> </th></tr> + <tr><th colspan="2"> <?php echo $TbMsg["WARN_NETBOOT"]?> </th></tr> <!-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> </table> </FORM> diff --git a/admin/WebConsole/varios/informacion_repositorios.php b/admin/WebConsole/varios/informacion_repositorios.php index 22174c3d..40e6b819 100644 --- a/admin/WebConsole/varios/informacion_repositorios.php +++ b/admin/WebConsole/varios/informacion_repositorios.php @@ -1,4 +1,4 @@ -<? +<?php // ************************************************************************************************************************************************* // Aplicación WEB: ogAdmWebCon // Autor: José Manuel Alonso (E.T.S.I.I.) Universidad de Sevilla @@ -41,13 +41,13 @@ $arbol=new ArbolVistaXml($arbolXML,0,$baseurlimg,$clasedefault,1,20,130,1,$titul </HEAD> <BODY> <P align=center class=cabeceras><?echo $TbMsg[0]?><BR> - <SPAN align=center class=subcabeceras><?echo $TbMsg[1]?></SPAN> <IMG src="../images/iconos/repositorios.gif"><BR><BR> + <SPAN align=center class=subcabeceras><?echo $TbMsg[1]?></SPAN> <IMG src="../images/iconos/repositorio.gif"><BR><BR> <IMG src="../images/iconos/repositorio.gif"><SPAN class=presentaciones> <U><?echo $TbMsg[2]?></U>:<? echo $descripcionrepositorio?></SPAN></P> <?echo $arbol->CreaArbolVistaXml(); // Crea arbol de configuraciones?> </BODY> </HTML> -<? +<?php /************************************************************************************************************************************************** Devuelve una cadena con formato XML de toda la información de los repositorios Parametros: @@ -145,7 +145,6 @@ function SubarbolXML_ImagenesDisponibles($cmd,$idrepositorio) global $TbMsg; $cadenaXML=""; - $gidimagen=0; $cmd->texto="SELECT DISTINCT imagenes.* FROM imagenes WHERE imagenes.idrepositorio=".$idrepositorio." @@ -161,21 +160,13 @@ function SubarbolXML_ImagenesDisponibles($cmd,$idrepositorio) $cadenaXML.='>'; } while (!$rs->EOF){ - if ($gidimagen!=$rs->campos["idperfilsoft"]){ - if ($gidimagen){ - $cadenaXML.='</IMAGENES>'; - } - $gidimagen=$rs->campos["idperfilsoft"]; - $cadenaXML.='<IMAGENES'; - // Atributos - $cadenaXML.=' imagenodo="../images/iconos/imagenes.gif"'; - $cadenaXML.=' infonodo="'.$rs->campos["descripcion"].'"'; - $cadenaXML.='>'; - } + $cadenaXML.='<IMAGENES'; + $cadenaXML.=' imagenodo="../images/iconos/imagenes.gif"'; + $cadenaXML.=' infonodo="'.$rs->campos["descripcion"].' ('.$TbMsg["IMGTYPE".$rs->campos["tipo"]].')"'; + $cadenaXML.='</IMAGENES>'; $rs->Siguiente(); } - if ($gidimagen){ - $cadenaXML.='</IMAGENES>'; + if ($rs->numeroderegistros>0) { $cadenaXML.='</DISPONIBLESIMAGENES>'; } $rs->Cerrar(); diff --git a/admin/WebConsole/varios/menucliente.php b/admin/WebConsole/varios/menucliente.php index b7694993..06cd6816 100644 --- a/admin/WebConsole/varios/menucliente.php +++ b/admin/WebConsole/varios/menucliente.php @@ -24,6 +24,7 @@ if(!isset($_SESSION["validated"]) || $_SESSION["validated"] != true) include("../validacion/access_controller.php"); } else{ + include_once("../validacion/functions.php"); //___________________________________________________________________________________________________ //________________________________________________________________________________________________________ @@ -47,10 +48,16 @@ else{ //________________________________________________________________________________________________________ //agp $nombre_archivo = "/opt/opengnsys/log/clients/".$iph.".cache.txt"; - $gestor = fopen($nombre_archivo, 'r'); - $contenidofichero = fread($gestor, filesize($nombre_archivo)); - fclose($gestor); - if (! empty ($contenidofichero)) { + $contenidofichero = file_get_contents($nombre_archivo); + if (empty ($contenidofichero)) { + // Sin caché local. + $cmd->texto="UPDATE ordenadores_particiones + SET cache='' + WHERE idordenador=(SELECT idordenador + FROM ordenadores + WHERE ip='".$iph."')"; + } else { + // Actualizar datos de caché local. $cmd->texto="UPDATE ordenadores_particiones SET cache='".$contenidofichero."' WHERE idordenador=(SELECT idordenador @@ -59,8 +66,8 @@ else{ AND idsistemafichero=(SELECT idsistemafichero FROM sistemasficheros WHERE descripcion='CACHE')"; - $resul=$cmd->Ejecutar(); } + $resul=$cmd->Ejecutar(); //agp //________________________________________________________________________________________________________ $rsmenu=RecuperaMenu($cmd,$iph); // Recupera un recordset con los datos del m en @@ -69,7 +76,7 @@ else{ case $ITEMS_PUBLICOS: if(!empty($rsmenu->campos["htmlmenupub"])){ $urlHtml=$rsmenu->campos["htmlmenupub"]; - if(strtoupper(substr($urlHtml,0,7))!="HTTP://") $urlHtml="http://".$urlHtml; + //if(strtoupper(substr($urlHtml,0,7))!="HTTP://") $urlHtml="http://".$urlHtml; Header('Location: '.$urlHtml); // Url del menu personalizado } else{ @@ -82,7 +89,7 @@ else{ if(!empty($rsmenu->campos["htmlmenupri"])){ $urlHtml=$rsmenu->campos["htmlmenupri"]; - if(strtoupper(substr($urlHtml,0,7))!="HTTP://") $urlHtml="http://".$urlHtml; + //if(strtoupper(substr($urlHtml,0,7))!="HTTP://") $urlHtml="http://".$urlHtml; Header('Location: '.$urlHtml); // Url del menu personalizado } else{ diff --git a/client/boot-tools/boottoolsfunctions.lib b/client/boot-tools/boottoolsfunctions.lib index d27aea3d..d0ede9cd 100755 --- a/client/boot-tools/boottoolsfunctions.lib +++ b/client/boot-tools/boottoolsfunctions.lib @@ -51,6 +51,7 @@ case "${1,,}" in OSDISTRIB="ubuntu" OSCODENAME="precise" OSRELEASE="3.2.0-23-generic" + #OSRELEASE="3.11.0-26-generic" OSARCH="i386" OSHTTP="http://es.archive.ubuntu.com/ubuntu/" ;; @@ -365,8 +366,18 @@ function btogIsoGenerator { btogGetVar #Preparamos los gestores de arranque mkdir -p /tmp/iso/isolinux -cp -prv /usr/lib/syslinux/* /tmp/iso/isolinux/ -cp -prv /usr/share/gpxe/* /tmp/iso/isolinux/ +cp -av /usr/lib/syslinux/* /tmp/iso/isolinux/ +cp -av /usr/share/gpxe/* /tmp/iso/isolinux/ + +# Si existe isolinux/gpxe.iso, montarlo para extraer isolinux.bin. +if [ -f /tmp/iso/isolinux/gpxe.iso ]; then + mkdir -p /tmp/iso/isolinux/mount + mount -o loop /tmp/iso/isolinux/gpxe.iso /tmp/iso/isolinux/mount + cp -va /tmp/iso/isolinux/mount/* /tmp/iso/isolinux + umount /tmp/iso/isolinux/mount + rmdir /tmp/iso/isolinux/mount + rm -f /tmp/iso/isolinux/gpxe.iso +fi cat << FIN > /tmp/iso/isolinux/isolinux.cfg DEFAULT menu.c32 diff --git a/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions b/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions index 1870dcaf..991ec890 100644 --- a/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions +++ b/client/boot-tools/includes/etc/initramfs-tools/scripts/ogfunctions @@ -74,6 +74,8 @@ ogExportVarEnvironment () { export CFGINITRD="/tmp/initrd.cfg" OGPROTOCOL="${ogprotocol:-smb}" + # OPTIONS Para samba y local (a nfs no le afecta) + export OPTIONS=" -o user=opengnsys,pass=og" case "$OGPROTOCOL" in nfs|NFS) export SRCOGLIVE="/var/lib/tftpboot" && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD @@ -82,14 +84,17 @@ ogExportVarEnvironment () export SRCOGIMAGES="/opt/opengnsys/images" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD ;; smb|SMB|cifs|CIFS|samba|SAMBA) - export OPTIONS=" -o user=opengnsys,pass=og" export SRCOGLIVE="tftpboot" && echo "SRCOGLIVE=$SRCOGLIVE" >> $CFGINITRD export SRCOGSHARE="ogclient" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD export SRCOGLOG="oglog" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD export SRCOGIMAGES="ogimages" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD ;; local|LOCAL) + # Ponemos variables SRC compatibles con smb y nfs. export SRCOGLIVE="local" + export SRCOGSHARE="client" && echo "SRCOGSHARE=$SRCOGSHARE" >> $CFGINITRD + export SRCOGLOG="log" && echo "SRCOGLOG=$SRCOGLOG" >> $CFGINITRD + export SRCOGIMAGES="images" && echo "SRCOGIMAGES=$SRCOGIMAGES" >> $CFGINITRD ;; esac #punto de acceso al boot-tools live @@ -214,8 +219,39 @@ ogPostConfigureFS() #enlace si iniciamos desde ogprotocolo=local { cdrom, usb, cache } . # monta el raiz del dispositivo local en /opt/og2fs/tftpboot - acceso al fichero .sqfs # y monta el sistema root sqfs en /opt/og2fs/2ndfs - [ "$LOCALMEDIA" == "CACHE" ] && ln -s $DSTOGLIVE /opt/opengnsys/cache - [ "$ogprotocol" == "local" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/ + #[ "$LOCALMEDIA" == "CACHE" ] && ln -s $DSTOGLIVE /opt/opengnsys/cache + #[ "$ogprotocol" == "local" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/ + if [ "$ogprotocol" == "local" ]; then + # Creamos los subdirectorios de /opt/opengnsys/ + [ "$ogstatus" == "offline" ] && ln -s ${OGLIVEROOTFS}/opt/opengnsys/* /opt/opengnsys/ + # Montamos CACHE + # Si existe particion identificada como CACHE se monta. + DEVICECACHE=$(blkid -L "CACHE") + if [ "$DEVICECACHE" != "" ]; then + # Se monta diferente segun el dispositivo de cache igual o no al de ogclient. + DEVICEOGLIVE=$(df |grep $DSTOGLIVE|awk '{print $1}') + if [[ "$DEVICECACHE" == "*$DEVICEOGLIVE*" ]];then + mount --bind $DSTOGLIVE /opt/opengnsys/cache + else + mount $DEVICECACHE /opt/opengnsys/cache + fi + if [ "$ogstatus" == "offline" ]; then + [ -d /opt/opengnsys/cache/log ] || mkdir /opt/opengnsys/cache/log + mount --bind /opt/opengnsys/cache/log /opt/opengnsys/log + fi + fi + # Montamos REPO + if [ "$ogstatus" == "offline" ]; then + # Si estatus distinto de online buscamos un dispositivo con etiqueta repo + # y si no existe montamos la cache como repo (si existe). + TYPE=$(blkid | grep REPO | awk -F"TYPE=" '{print $2}' | tr -d \") + if [ "$TYPE" == "" ]; then + [ -d "/opt/opengnsys/cache$DSTOGIMAGES" ] && mount --bind /opt/opengnsys/cache$DSTOGIMAGES $DSTOGIMAGES + else + mount -t $TYPE LABEL=REPO $DSTOGIMAGES &>/dev/null + fi + fi + fi #Montamos un directorio temporal para el apt-get mount tmpfs /var/cache/apt/archives -t tmpfs -o size=15M @@ -361,6 +397,17 @@ ogConnect () smb) mount.cifs //${SERVER}/${SRC} ${DST} ${OPTIONS}${READONLY} ;; + local) + # Comprobamos que estatus sea online y que la variable del server no esta vacia. + if [ "$ogstatus" != "offline" -a "$SERVER" != "" -a "$SRC" != "" ]; then + # Comprobamos que existe un servicio de samba. + smbclient -L $SERVER -N &>/dev/null + if [ $? -eq 0 ]; then + mount.cifs //${SERVER}/og${SRC} ${DST} ${OPTIONS}${READONLY} + fi + # TODO: buscar condicion para NFS + fi + ;; esac } @@ -387,11 +434,11 @@ ogConnectOgLive () then # Si local es particion CACHE es identificada como CACHE mount LABEL=CACHE $DSTOGLIVE - export LOCALMEDIA=CACHE + #export LOCALMEDIA=CACHE fi else -# Si ogprotocol es remoto. TODO en smb rw y en nfs ro?? - ogConnect $OGSERVERLIVE $OGPROTOCOL $SRCOGLIVE $DSTOGLIVE + # Si ogprotocol es remoto. TODO en smb rw y en nfs ro?? + ogConnect $OGSERVERLIVE $OGPROTOCOL $SRCOGLIVE $DSTOGLIVE fi # Si el montaje ha sido correcto, tanto en local como en remoto. Procedemos con la union ogMergeLive @@ -612,6 +659,8 @@ done if [ -n "${DEVICE}" ]; then export DEVICE export DEVICECFG="/run/net-${DEVICE}.conf" + # En algunos casos, el fichero de configuración está en /tmp. + [ ! -f $DEVICECFG -a -f ${DEVICECFG/run/tmp} ] && mv ${DEVICECFG/run/tmp} $DEVICECFG source $DEVICECFG echo "DEVICE=$DEVICE" >> $CFGINITRD echo "DEVICECFG=$DEVICECFG" >> $CFGINITRD diff --git a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh index 17437b56..70207cae 100755 --- a/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh +++ b/client/boot-tools/includes/usr/bin/boot-tools/boottoolsSoftwareInstall.sh @@ -48,7 +48,8 @@ if [ "$OSRELEASE" == "3.7.6-030706-generic" ]; then rm -fr /tmp/kernel else # Instalar Kernel del repositorio de paquetes. - apt-get -y --force-yes install linux-image-${OSRELEASE} linux-image-extra-${OSRELEASE} linux-headers-${OSRELEASE} + apt-get -y --force-yes install linux-image-${OSRELEASE} linux-headers-${OSRELEASE} + apt-get -y --force-yes install linux-image-extra-${OSRELEASE} 2>/dev/null fi diff --git a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic index 1dd2ac6a..7708c146 100644 --- a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic +++ b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.basic @@ -13,6 +13,8 @@ install gawk install subversion install python-openssl install python +install php5-cli install dmidecode -#install hwinfo install realpath +install rpm +install sqlite3 diff --git a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local index 2978f409..ab9aca8b 100644 --- a/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local +++ b/client/boot-tools/includes/usr/bin/boot-tools/listpackages/sw.filesystem.local @@ -2,7 +2,6 @@ install squashfs-tools install unionfs-fuse install drbl-ntfsprogs -#install ntfsprogs install ntfs-3g install dosfstools install fatresize @@ -22,9 +21,10 @@ install hfsprogs install hfsutils install nilfs-tools install ufsutils -#install ubuntu-zfs -install zfs-fuse -install android-tools-adb -install android-tools-fastboot -install android-tools-fsutils -install f2fs-tools +install vmfs-tools +install ubuntu-zfs +# Solo en ogLive basado en Ubuntu 14.04 +#install android-tools-adb +#install android-tools-fastboot +#install android-tools-fsutils +#install f2fs-tools diff --git a/client/boot-tools/ogclientImg2Sqfs b/client/boot-tools/ogclientImg2Sqfs new file mode 100755 index 00000000..5dfb2b00 --- /dev/null +++ b/client/boot-tools/ogclientImg2Sqfs @@ -0,0 +1,55 @@ +#!/bin/bash +#/** +#@brief Comprime el fichero ogclient.img en ogclient.sqfs. +#@param none +#@exeption 1 No es usuario root +#@exeption 2 No existe el fichero ogclient.img +#@date 2013-11.27 +#*/ +PROG="$(basename $0)" +# Mostrar ayuda: Si se solicita, si faltan parametros o $3 no es SYNC1 o SYNC2. +if [ "$*" == "help" ]; then + echo -e "$PROG: Comprime el fichero ogclient.img en ogclient.sqfs. \n" + " Uso: $PROG (sin parametros)" + exit 0 +fi + +if [ "$USER" != "root" ]; then + echo "$PROG: Error: solo ejecutable por root" >&2 + exit 1 +fi + + +DATE=$(date +%y-%m-%d) +OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} +OGCLIENTBASEDIR=$OPENGNSYS/tftpboot/ogclient/; +OGCLIENTFILE=${OGCLIENTBASEDIR}ogclient.img; +OGCLIENTSQFS=${OGCLIENTBASEDIR}ogclient.sqfs +OGCLIENTMOUNT=${OGCLIENTBASEDIR}ogclientmount; +OGCLIENTSIZEMB=1900; +OGCLIENTLABEL=ogClient; + +# Comprobamos que existe el cliente .sqfs +! [ -f $OGCLIENTFILE -a -d $OGCLIENTMOUNT ] && echo "No existe $OGCLIENTFILE o $OGCLIENTMOUNT" && exit 3 +# Montamos ogclient.img. +echo "Montamos ogclient.img." +mkdir -p $OGCLIENTMOUNT; +mount | grep $OGCLIENTMOUNT || mount $OGCLIENTFILE $OGCLIENTMOUNT -o loop,offset=32256; + +# Si existe ogclient.sqfs hacemos copia de seguridad. +echo "Si existe ogclient.sqfs hacemos copia de seguridad." +[ -f ${OGCLIENTSQFS} ] && mv ${OGCLIENTSQFS} ${OGCLIENTSQFS}.$DATE + +# Comprimimos el cliente. +echo "Comprimimos el cliente." +echo "mksquashfs $OGCLIENTMOUNT ${OGCLIENTSQFS}" +mksquashfs $OGCLIENTMOUNT ${OGCLIENTSQFS} + +# Desmontamos el ogclient.img +echo "Desmontamos el ogclient.img" +umount $OGCLIENTMOUNT + +# Generamos nuevo archivo de suma de comprobación. +echo "Generamos nuevo archivo de suma de comprobacion." +mv ${OGCLIENTSQFS}.sum ${OGCLIENTSQFS}.sum.$DATE +md5sum ${OGCLIENTSQFS} |awk '{print $1}' >${OGCLIENTSQFS}.sum diff --git a/client/boot-tools/ogclientSqfs2Img b/client/boot-tools/ogclientSqfs2Img new file mode 100755 index 00000000..4f8447da --- /dev/null +++ b/client/boot-tools/ogclientSqfs2Img @@ -0,0 +1,120 @@ +#!/bin/bash +#/** +#@brief Descomprime el fichero ogclient.sqfs en ogclient.img con un formato donde podemos escribir. +#@param none +#@note Copiado del wiki: http://opengnsys.es/wiki/ClienteInitrdDSGenerarlo +#@note para "entrar" en ogclient: schroot -c ogclient.img o mount ogclient.img ogclientmount -o loop,offset=32256 +#@exeption 1 No es usuario root +#@exeption 2 No existe el fichero ogclient.sqfs +#@date 2013-11.27 +#*/ +PROG="$(basename $0)" +# Mostrar ayuda si se solicita. +if [ "$*" == "help" ]; then + echo -e "$PROG: Descomprime el fichero ogclient.sqfs en ogclient.img con un formato donde podemos escribir. \n" \ + " Uso: $PROG (sin parametros)" + exit 0 +fi + +if [ "$USER" != "root" ]; then + echo "$PROG: Error: solo ejecutable por root" >&2 + exit 1 +fi + + + +DATE=$(date +%y-%m-%d) +OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} +OGCLIENTBASEDIR=$OPENGNSYS/tftpboot/ogclient/; +OGCLIENTSQFS=${OGCLIENTBASEDIR}ogclient.sqfs +OGCLIENTFILE=${OGCLIENTBASEDIR}ogclient.img; +OGCLIENTMOUNT=${OGCLIENTBASEDIR}ogclientmount; +OGCLIENTSIZEMB=1900; +OGCLIENTLABEL=ogClient; + +# Comprobamos que existe el cliente .sqfs +! [ -f $OGCLIENTSQFS ] && echo "No existe $OGCLIENTSQFS" && exit 3 + +# instalamos los paquetes necesarios. +echo "Si no existen, instalamos los paquetes necesarios: squashfs-tools schroot." +if ! which schroot unsquashfs 2>&1 >/dev/null; then + apt-get update + apt-get -y install squashfs-tools schroot +fi + +# Creamos el archivo. +echo -e "\nCreamos el archivo." +echo dd if=/dev/zero of=$OGCLIENTFILE bs=1048576 count=$OGCLIENTSIZEMB; +dd if=/dev/zero of=$OGCLIENTFILE bs=1048576 count=$OGCLIENTSIZEMB; +DISKLOOP=$(losetup -f); +losetup $DISKLOOP $OGCLIENTFILE; +echo -e "n\np\n1\n\n\nt\n83\nw" | fdisk $DISKLOOP; +losetup -d $DISKLOOP ; + +# Creamos el sistema de ficheros. +echo "Creamos el sistema de ficheros." +echo "mkfs.ext4 -b 4096 -L $OGCLIENTLABEL $PARTLOOP" +PARTLOOP=$(losetup -f); +losetup -o 32256 $PARTLOOP $OGCLIENTFILE && mkfs.ext4 -b 4096 -L $OGCLIENTLABEL $PARTLOOP; +losetup -d $PARTLOOP ; + +# Descomprimimos el ogclient.sqfs en el sistema de ficheros. +mkdir -p $OGCLIENTMOUNT; +echo "Descomprimimos el ogclient.sqfs en el sistema de ficheros." +mount | grep $OGCLIENTMOUNT || mount $OGCLIENTFILE $OGCLIENTMOUNT -o loop,offset=32256; +echo "unsquashfs -d ${OGCLIENTMOUNT}/ -f $OGCLIENTSQFS" +unsquashfs -d ${OGCLIENTMOUNT}/ -f $OGCLIENTSQFS +umount $OGCLIENTMOUNT; + +# Creamos los archivos de configuracion de schroot. +echo "Creamos los archivos de configuracion de schroot." +cp /etc/schroot/schroot.conf /etc/schroot/schroot.conf.$DATE +cat << EOF > /etc/schroot/schroot.conf +[ogclient.img] +type=loopback +file=${OGCLIENTBASEDIR}ogclient.img +description=ogclient ubuntu luc IMGi +#priority=1 +users=root +groups=root +root-groups=root +mount-options=-o offset=32256 +root-users=root +#[DIRogclient] +#type=directory +#directory=${OGCLIENTBASEDIR}ogclientmount +#description=ogclient ubuntu lucid DIR +#priority=2 +#users=root +#groups=root +#root-groups=root +#root-users=root +EOF + +cp /etc/schroot/mount-defaults /etc/schroot/mount-defaults.$DATE +cat << EOF > /etc/schroot/mount-defaults +# mount.defaults: static file system information for chroots. +# Note that the mount point will be prefixed by the chroot path +# (CHROOT_PATH) +# +# <file system> <mount point> <type> <options> <dump> <pass> +proc /proc proc defaults 0 0 +#procbususb /proc/bus/usb usbfs defaults 0 0 +/dev /dev none rw,bind 0 0 +/dev/pts /dev/pts none rw,bind 0 0 +/dev/shm /dev/shm none rw,bind 0 0 +#/home /home none rw,bind 0 0 +/tmp /tmp none rw,bind 0 0 +EOF + +# Si existen dispositivos loop los eliminamos. +echo "Si existen dispositivos loop los eliminamos." +LOOPDEVICES=$(losetup -a|grep $OGCLIENTFILE |cut -d: -f1) +for DEVICE in $LOOPDEVICES +do + echo "losetup -d $DEVICE" + losetup -d $DEVICE +done + +echo -e "Para \"entrar\" en ogclient: \n \t schroot -c ogclient.img o \n \t mount ogclient.img ogclientmount -o loop,offset=32256" +echo "El servicio schroot montará el cliente automaticamente, si no queremos que pase hay que apagarlo." diff --git a/client/engine/Boot.lib b/client/engine/Boot.lib index a32e7720..ea3badb7 100755 --- a/client/engine/Boot.lib +++ b/client/engine/Boot.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Boot #@class Boot #@brief Funciones para arranque y post-configuración de sistemas de archivos. -#@version 1.0.5 +#@version 1.0.6 #@warning License: GNU GPLv3+ #*/ @@ -29,6 +29,9 @@ #@version 1.0.4 - Soporta modo de arranque Windows (parámetro de inicio "winboot"). #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2012-04-12 +#@version 1.0.6 - Selección a partir de tipo de sistema operativo (en vez de S.F.). +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-08-28 #*/ ## function ogBoot () { @@ -46,30 +49,37 @@ fi # Detectar tipo de sistema de archivos y montarlo. PART=$(ogDiskToDev $1 $2) || return $? -TYPE=$(ogGetFsType $1 $2) || return $? +TYPE=$(ogGetOsType $1 $2) || return $? # Error si no puede montar sistema de archivos. MNTDIR=$(ogMount $1 $2) || return $? case "$TYPE" in - EXT[234]|REISERFS|REISER4|JFS|XFS) + Linux|Android) # Obtiene los parámetros de arranque para Linux. - PARAMS=$(ogLinuxBootParameters $1 $2) || return $? + PARAMS=$(ogLinuxBootParameters $1 $2) + # Si no existe, buscar sistema de archivo /boot en /etc/fstab. + if [ -z "$PARAMS" -a -e $MNTDIR/etc/fstab ]; then + # Localizar S.F. /boot en /etc/fstab del S.F. actual. + PART=$(ogDevToDisk $(awk '$2=="/boot" {print $1}' $MNTDIR/etc/fstab)) + # Buscar los datos de arranque. + PARAMS=$(ogLinuxBootParameters $PART) || exit $? + fi read -e KERNEL INITRD APPEND <<<"$PARAMS" # Si no hay kernel, no hay sistema operativo. - [ -n "$KERNEL" ] || ogRaiseError $OG_ERR_NOTOS || return $? + [ -n "$KERNEL" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $? # Arrancar de partición distinta a la original. [ -e "$MNTDIR/etc" ] && APPEND=$(echo $APPEND | awk -v P="$PART " '{sub (/root=[-+=_/a-zA-Z0-9]* /,"root="P);print}') # Configurar kernel Linux con los parámetros leídos de su GRUB. kexec -l "${MNTDIR}${KERNEL}" --append="$APPEND" --initrd="${MNTDIR}${INITRD}" kexec -e & ;; - NTFS|HNTFS|FAT32|HFAT32) + Windows|WinLoader) # Compruebar si hay un cargador de Windows. for f in io.sys ntldr bootmgr; do FILE="$(ogGetPath $1 $2 $f 2>/dev/null)" [ -n "$FILE" ] && LOADER="$f" done - [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS || return $? + [ -n "$LOADER" ] || ogRaiseError $OG_ERR_NOTOS "$1 $2 ($TYPE)" || return $? if [ "$winboot" == "kexec" ]; then # Modo de arranque en caliente (con kexec). cp $OGLIB/grub4dos/* $MNTDIR # */ (Comentario Doxygen) @@ -89,7 +99,17 @@ case "$TYPE" in reboot fi ;; - *) ogRaiseError $OG_ERR_PARTITION "$1, $2" + MacOS) + # Modo de arranque por reinicio. + # Nota: el cliente tiene que tener configurado correctamente Grub. + touch ${MNTDIR}/boot.mac &>/dev/null + reboot + ;; + GrubLoader) + # Reiniciar. + reboot + ;; + *) ogRaiseError $OG_ERR_NOTOS "$1 $2 ${TYPE:+($TYPE)}" return $? ;; esac @@ -150,11 +170,14 @@ ogGetRegistryValue $MNTDIR system '\ControlSet001\Control\ComputerName\ComputerN #@version 1.0.5 - Mejoras en tratamiento de GRUB2. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2013-05-14 +#@version 1.0.6 - Detectar instalaciones sobre EFI. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-09-15 #*/ ## function ogLinuxBootParameters () { # Variables locales. -local MNTDIR CONFDIR CONFFILE +local MNTDIR CONFDIR CONFFILE f # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -169,13 +192,12 @@ fi MNTDIR=$(ogMount $1 $2) || return $? # Fichero de configuración de GRUB. -CONFDIR=$MNTDIR # Partición de arranque /boot. -[ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot # Partición raíz con directorio boot. -CONFFILE="$CONFDIR/grubPARTITION/boot/grub/grub.cfg" -[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub/menu.lst" -[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub/grub.cfg" -[ ! -e $CONFFILE ] && CONFFILE="$CONFDIR/grub2/grub.cfg" -[ -e $CONFFILE ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $? +CONFDIR=$MNTDIR # Sistema de archivos de arranque (/boot). +[ -d $MNTDIR/boot ] && CONFDIR=$MNTDIR/boot # Sist. archivos raíz con directorio boot. +for f in $MNTDIR/{,grubPARTITION/}{,boot/}{grub{,2},{,efi/}EFI/*}/{menu.lst,grub.cfg,grub.cfg.backup.og}; do + [ -r $f ] && CONFFILE=$f +done +[ -n "$CONFFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "grub.cfg" || return $? # Toma del fichero de configuracion los valores del kernel, initrd # y parámetros de arranque usando las cláusulas por defecto @@ -184,15 +206,16 @@ CONFFILE="$CONFDIR/grubPARTITION/boot/grub/grub.cfg" # /* (comentario Doxygen) awk 'BEGIN {cont=-1;} $1~/^default$/ {sub(/=/," "); def=$2;} - $1~/^set$/ && $2~/^default$/ {gsub(/[="]/," "); def=$3; + $1~/^set$/ && $2~/^default/ { gsub(/[="]/," "); def=$3; if (def ~ /saved_entry/) def=0; - } + } $1~/^(title|menuentry)$/ {cont++} - $1~/^(kernel|linux)$/ {if (def==cont) { - kern=$2; - sub($1,"");sub($1,"");sub(/^[ \t]*/,"");app=$0} # /* (comentario Doxygen) - } - $1~/^initrd$/ {if (def==cont) init=$2} + $1~/^(kernel|linux(efi)?)$/ { if (def==cont) { + kern=$2; + sub($1,""); sub($1,""); sub(/^[ \t]*/,""); app=$0 + } # /* (comentario Doxygen) + } + $1~/^initrd(efi)?$/ {if (def==cont) init=$2} END {if (kern!="") printf("%s %s %s", kern,init,app)} ' $CONFFILE # */ (comentario Doxygen) @@ -966,3 +989,199 @@ MNTDIR=$(ogMount $1 $2) || return $? rm -f ${MNTDIR}/etc/udev/rules.d/70-persistent-net.rules } +#/** +# ogGrubAddOgclient num_disk num_part [ timeout ] [ offline ] +#@brief Crea entrada de menu grub para ogclient, tomando como paramentros del kernel los actuales del cliente. +#@param 1 Numero de disco +#@param 2 Numero de particion +#@param 3 timeout Segundos de espera para iniciar el sistema operativo por defecto (opcional) +#@param 4 offline configura el modo offline [offline|online] (opcional) +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND No existe kernel o initrd en cache. +#@exception OG_ERR_NOTFOUND No existe archivo de configuracion del grub. +# /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos. +#*/ + +ogGrubAddOgclient () { + local TIMEOUT DIRMOUNT GRUBGFC PARTTABLETYPE NUMDISK NUMPART KERNEL STATUS NUMLINE MENUENTRY + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition [ time_out ] [ offline|online ] " \ + "$FUNCNAME 1 1" \ + "$FUNCNAME 1 6 15 offline" + return + fi + + # Error si no se reciben 2 parámetros. + [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part [ timeout ]"; echo $?) + [[ "$3" =~ ^[0-9]*$ ]] && TIMEOUT="$3" + + # Error si no existe el kernel y el initrd en la cache. + # Falta crear nuevo codigo de error. + [ -r $OGCAC/boot/ogvmlinuz -a -r $OGCAC/boot/oginitrd.img ] || return $(ogRaiseError log session OG_ERR_NOTFOUND "CACHE: ogvmlinuz, oginitrd.img" 1>&2; echo ?) + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + + # Error si no existe archivo del grub + [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC" 1>&2; echo $?) + + # Si existe la entrada de opengnsys nos salimos. + grep "menuentry Opengnsys" $GRUBGFC &>/dev/null && return 0 + + # Tipo de tabla de particiones + PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:]) + + # Localizacion de la cache + read NUMDISK NUMPART <<< $(ogFindCache) + let NUMDISK=$NUMDISK-1 + # kernel y sus opciones. Pasamos a modo usuario + KERNEL="/boot/ogvmlinuz $(sed -e s/^.*linuz//g -e s/ogactiveadmin=true/ogactiveadmin=false/g /proc/cmdline)" + + # Configuracion offline si existe parametro + echo "$@" |grep offline &>/dev/null && STATUS=offline + echo "$@" |grep online &>/dev/null && STATUS=online + [ -z "$STATUS" ] || KERNEL="$(echo $KERNEL | sed s/"ogprotocol=[a-z]* "/"ogprotocol=local "/g ) ogstatus=$STATUS" + + # Numero de línea de la primera entrada del grub. + NUMLINE=$(grep -n -m 1 "^menuentry" $GRUBGFC|cut -d: -f1) + # Texto de la entrada de opengnsys +MENUENTRY="menuentry "Opengnsys" --class gnu-linux --class gnu --class os { \n \ +\tinsmod part_$PARTTABLETYPE \n \ +\tinsmod ext2 \n \ +\tset root='(hd${NUMDISK},$PARTTABLETYPE${NUMPART})' \n \ +\tlinux $KERNEL \n \ +\tinitrd /boot/oginitrd.img \n \ +}" + + + # Insertamos la entrada de opengnsys antes de la primera entrada existente. + sed -i "${NUMLINE}i\ $MENUENTRY" $GRUBGFC + + # Ponemos que la entrada por defecto sea la primera. + sed -i s/"set.*default.*$"/"set default=\"0\""/g $GRUBGFC + + # Si me dan valor para timeout lo cambio en el grub. + [ $TIMEOUT ] && sed -i s/timeout=.*$/timeout=$TIMEOUT/g $GRUBGFC +} + + +#/** +# ogGrubHidePartitions num_disk num_part +#@brief Configura el grub para que oculte las particiones de windows que no se esten iniciando. +#@param 1 Numero de disco +#@param 2 Numero de particion +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception No existe archivo de configuracion del grub. +#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos. +#*/ +function ogGrubHidePartitions { + local DIRMOUNT GRUBGFC PARTTABLETYPE WINENTRY ENTRY TEXT ENTRY2 LINE2 PART2 HIDDEN + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 6" + return + fi + + # Error si no se reciben 2 parámetros. + [ $# -lt 2 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?) + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + + # Error si no existe archivo del grub + [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC" 1>&2; echo $?) + + # Si solo hay una entrada de Windows me salgo + [ $(grep -n "menuentry.*Windows" $GRUBGFC |wc -l) -eq 1 ] && return 0 + + # Elimino llamadas a parttool, se han incluido en otras ejecuciones de esta funcion. + sed -i '/parttool/d' $GRUBGFC + + PARTTABLETYPE=$(ogGetPartitionTableType $1 | tr [:upper:] [:lower:]) + + # Entradas de Windows: numero de linea y particion. De mayor a menor. + WINENTRY=$(awk '/menuentry.*Windows/ { gsub(/\/dev\/sda/,""); gsub(/\)\"/, ""); print NR":"$6} ' $GRUBGFC | sed '1!G;h;$!d' ) + # Modifico todas las entradas de Windows. + for ENTRY in $WINENTRY; do + LINE=${ENTRY%:*} + # En cada entrada, oculto o muestro cada particion. + TEXT="" + for ENTRY2 in $WINENTRY; do + LINE2=${ENTRY2%:*} + PART2=${ENTRY2#*:} + # Muestro solo la particion de la entrada actual. + [ $LINE2 -eq $LINE ] && HIDDEN="-" || HIDDEN="+" + + TEXT="\tparttool (hd0,$PARTTABLETYPE$PART2) hidden$HIDDEN \n$TEXT" + done + + sed -i "${LINE}a\ $TEXT" $GRUBGFC + done + + # Activamos la particion que se inicia en todas las entradas de windows. + sed -i "/chainloader/i\\\tparttool \$\{root\} boot+" $GRUBGFC + +} + +#/** +# ogGrubDeleteEntry num_disk num_part num_part_delete +#@brief Borra en el grub las entradas para el inicio en una particion. +#@param 1 Numero de disco donde esta el grub +#@param 2 Numero de particion donde esta el grub +#@parm 3 Numero de la particion de la que borramos las entradas +#@return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception No existe archivo de configuracion del grub. +#@ /// FIXME: Solo para el grub instalado en MBR por Opengnsys, ampliar para más casos. +#*/ + + +function ogGrubDeleteEntry { + local DIRMOUNT GRUBGFC MENUENTRY DELETEENTRY ENDENTRY ENTRY + + # Si se solicita, mostrar ayuda. + if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition int_npartition_delete" \ + "$FUNCNAME 1 6 2" + return + fi + + # Error si no se reciben 3 parámetros. + [ $# -lt 3 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $FUNCNAME num_disk num_part"; echo $?) + + # Archivo de configuracion del grub + DIRMOUNT=$(ogMount $1 $2) + GRUBGFC="$DIRMOUNT/boot/grubMBR/boot/grub/grub.cfg" + + # Error si no existe archivo del grub) + [ -r $GRUBGFC ] || return $(ogRaiseError log session $OG_ERR_NOTFOUND "$GRUBGFC"; echo $?) + + # Numero de linea de cada entrada, de mayor a menor. + MENUENTRY="$(grep -n -e menuentry.*/dev/sda $GRUBGFC| cut -d: -f1 | sed '1!G;h;$!d' )" + + # Entradas que hay que borrar. + DELETEENTRY=$(grep -n menuentry.*/dev/sda$3 $GRUBGFC| cut -d: -f1) + + # Recorremos el fichero del final hacia el principio. + ENDENTRY="$(wc -l $GRUBGFC|cut -d" " -f1)" + for ENTRY in $MENUENTRY; do + # Comprobamos si hay que borrar la entrada. + if ogCheckStringInGroup $ENTRY "$DELETEENTRY" ; then + let ENDENTRY=$ENDENTRY-1 + sed -i -e $ENTRY,${ENDENTRY}d $GRUBGFC + fi + + # Guardamos el número de línea de la entrada, que sera el final de la siguiente. + ENDENTRY=$ENTRY + done + +} + diff --git a/client/engine/Disk.lib b/client/engine/Disk.lib index 88fb132b..adb9cb01 100755 --- a/client/engine/Disk.lib +++ b/client/engine/Disk.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Disk #@class Disk #@brief Funciones para gestión de discos y particiones. -#@version 1.0.5 +#@version 1.0.6 #@warning License: GNU GPLv3+ #*/ @@ -351,41 +351,56 @@ esac #/** -# ogDevToDisk path_device -#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo. -#@param path_device Camino del fichero de dispositivo. +# ogDevToDisk path_device | LABEL="str_label" | UUID="str_uuid" +#@brief Devuelve el nº de orden de dicso (y partición) correspondiente al nombre de fichero de dispositivo o a la etiqueta o UUID del sistema de archivos asociado. +#@param path_device Camino del fichero de dispositivo. +#@param str_label etiqueta de sistema de archivos. +#@param str_uuid UUID de sistema de archivos. #@return int_ndisk (para dispositivo de disco) #@return int_ndisk int_npartition (para dispositivo de partición). #@exception OG_ERR_FORMAT Formato incorrecto. #@exception OG_ERR_NOTFOUND Dispositivo no detectado. -#@note Requisitos: awk +#@note Solo se acepta en cada llamada 1 de los 3 tipos de parámetros. #@version 0.1 - Integracion para Opengnsys - EAC: DiskEAC() en ATA.lib #@author Antonio J. Doblas Viso, Universidad de Malaga #@date 2008/10/27 #@version 0.9 - Primera version para OpenGnSys #@author Ramon Gomez, ETSII Universidad Sevilla #@date 2009/07/20 +#@version 1.0.6 - Soporta parámetro con UIID o etiqueta. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2014/07/13 #*/ ## function ogDevToDisk () { # Variables locales. -local d n +local DEV d n # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_device" \ - "$FUNCNAME /dev/sda => 1 1" + ogHelp "$FUNCNAME" "$FUNCNAME path_device | LABEL=str_label | UUID=str_uuid" \ + "$FUNCNAME /dev/sda => 1" \ + "$FUNCNAME /dev/sda1 => 1 1" \ + "$FUNCNAME LABEL=CACHE => 1 4" return fi # Error si no se recibe 1 parámetro. [ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Obtener dispositivo a partir de camino, etiqueta o UUID. +DEV="$1" +case "$DEV" in + LABEL=*) DEV=$(blkid -L "${1#*=}") ;; + UUID=*) DEV=$(blkid -U "${1#*=}") ;; +esac + # Error si no es fichero de bloques. -[ -b "$1" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? +[ -b "$DEV" ] || ogRaiseError $OG_ERR_NOTFOUND "$1" || return $? # Procesa todos los discos para devolver su nº de orden y de partición. n=1 for d in $(ogDiskToDev); do - [ -n "$(echo $1 | grep $d)" ] && echo "$n ${1#$d}" && return + [ -n "$(echo $DEV | grep $d)" ] && echo "$n ${DEV#$d}" && return n=$[n+1] done ogRaiseError $OG_ERR_NOTFOUND "$1" @@ -415,11 +430,14 @@ return $OG_ERR_NOTFOUND #@version 1.0.5 - Comprobación correcta de parámetros para soportar valores > 9. #@author Ramon Gomez, ETSII Universidad Sevilla #@date 2013-05-07 +#@version 1.0.6 - Soporta RAID hardware y Multipath. +#@author Ramon Gomez, ETSII Universidad Sevilla +#@date 2014-09-23 #*/ ## function ogDiskToDev () { # Variables locales -local ALLDISKS VOLGROUPS DISK PART +local ALLDISKS MPATH VOLGROUPS DISK PART i # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -430,11 +448,23 @@ if [ "$*" == "help" ]; then return fi -# Listar dispositivo para los discos duros (tipos: 3=hd, 8=sd). -ALLDISKS=$(awk '($1==3 || $1==8) && $4!~/[0-9]/ {printf "/dev/%s ",$4}' /proc/partitions) +# Listar dispositivos de discos duros. +ALLDISKS=$(lsblk -n | awk '$6~/^disk$/ {gsub(/!/,"/"); printf "/dev/%s ",$1}') + +# Listar volúmenes lógicos. VOLGROUPS=$(vgs -a --noheadings 2>/dev/null | awk '{printf "/dev/%s ",$1}') ALLDISKS="$ALLDISKS $VOLGROUPS" +# Detectar caminos múltiples (ignorar mensaje si no está configurado Multipath). +if MPATH=$(multipath -l -v 1 2>/dev/null | awk '{printf "/dev/mapper/%s ",$1}'; exit ${PIPESTATUS[0]}); then + # Quitar de la lista los discos que forman parte de Multipath. + for i in $(multipath -ll | awk '$6=="ready" {printf "/dev/%s ",$3}'); do + ALLDISKS="${ALLDISKS//$i/}" + done + # Añadir caminos múltiples a los discos detectados. + ALLDISKS="$ALLDISKS $MPATH" +fi + # Mostrar salidas segun el número de parametros. case $# in 0) # Muestra todos los discos, separados por espacios. @@ -455,14 +485,21 @@ case $# in # Comprobar si es partición. if [ -b "$PART" ]; then echo "$PART" - elif [ -n "$VOLGROUPS" ]; then - # Comprobar si volumen lógico. /* (comentario Doxygen) - PART=$(lvscan -a 2>/dev/null | grep "'$DISK/" | awk -v n=$2 -F\' '{if (NR==n) print $2}') - [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $? - # (comentario Doxygen) */ - echo "$PART" else - ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $? + # Comprobar si RAID o Multipath (tener en cuenta enlace simbólico). + PART="${DISK}p$2" + if [ "$(stat -L -c "%A" "$PART" 2>/dev/null | cut -c1)" == "b" ]; then + echo "$PART" + elif [ -n "$VOLGROUPS" ]; then + # Comprobar si volumen lógico. /* (comentario Doxygen) + PART=$(lvscan -a 2>/dev/null | \ + awk -F\' -v n=$2 "\$2~/^${DISK//\//\\/}\// {if (NR==n) print \$2}") + [ -e "$PART" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $? + # (comentario Doxygen) */ + echo "$PART" + else + ogRaiseError $OG_ERR_NOTFOUND "$1 $2" || return $? + fi fi ;; *) # Formato erroneo. @@ -484,11 +521,14 @@ esac #@version 0.9.2 - Primera version para OpenGnSys #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010/09/15 +#@version 1.0.6 - Soportar LVM. +#@author Universidad de Huelva +#@date 2014/09/04 #*/ ## function ogGetDiskSize () { # Variables locales. -local DISK +local DISK SIZE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -500,7 +540,13 @@ fi # Obtener el tamaño del disco. DISK="$(ogDiskToDev $1)" || return $? -awk -v D=${DISK#/dev/} '{if ($4==D) {print $3}}' /proc/partitions +SIZE=$(awk -v D=${DISK#/dev/} '{if ($4==D) {print $3}}' /proc/partitions) +# Si no, obtener tamaño del grupo de volúmenes. +[ -z "$SIZE" ] && SIZE=$(vgs --noheadings --units=B -o dev_size $DISK 2>/dev/null | \ + awk '{print $1/1024}') + +# Mostrar salida. +[ -n "$SIZE" ] && echo "$SIZE" } @@ -727,6 +773,9 @@ esac #@version 1.0.4 - Uso de /proc/partitions para detectar el numero de particiones #@author Universidad de Huelva #@date 2012/03/28 +#@version 1.0.6 - Soportar LVM. +#@author Universidad de Huelva +#@date 2014/09/04 #*/ ## function ogGetPartitionsNumber () { @@ -746,6 +795,7 @@ DISK=$(ogDiskToDev $1) 2>/dev/null case "$(ogGetPartitionTableType $1)" in GPT) grep -c "${DISK#/dev/}." /proc/partitions ;; MSDOS) sfdisk -l $DISK 2>/dev/null | grep -c "^$DISK" ;; + LVM) lvs --noheadings $DISK 2>/dev/null | wc -l ;; esac } @@ -761,11 +811,14 @@ esac #@version 1.0.4 - Primera versión para OpenGnSys #@author Universidad de Huelva #@date 2012/03/01 +#@version 1.0.6 - Soportar LVM. +#@author Universidad de Huelva +#@date 2014/09/04 #*/ ## function ogGetPartitionTableType () { # Variables locales. -local DISK +local DISK TYPE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -777,8 +830,14 @@ fi [ $# == 1 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Sustituye n de disco por su dispositivo. -DISK=`ogDiskToDev $1` || return $? -parted -sm $DISK print | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}' +DISK=$(ogDiskToDev $1) || return $? + +# Comprobar tabla de particiones. +[ -b $DISK ] && TYPE=$(parted -sm $DISK print | awk -F: -v D=$DISK '{ if($1 == D) print toupper($6)}') +[ -d $DISK ] && vgs $DISK &>/dev/null && TYPE="LVM" + +# Mostrar salida. +[ -n "$TYPE" ] && echo "$TYPE" } @@ -1108,12 +1167,15 @@ ID="${3^^}" PTTYPE=$(ogGetPartitionTableType $1) case "$PTTYPE" in GPT) sgdisk -t$2:$ID $DISK 2>/dev/null ;; - MSDOS) echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK &>/dev/null ;; + MSDOS) echo -ne "t\n$2\n${ID}\nw\n" | fdisk $DISK | grep Syncing &>/dev/null ;; *) ogRaiseError $OG_ERR_OUTOFLIMIT "$1,$PTTYPE" return $? ;; esac -if [ $? == 0 ]; then + +# MSDOS) Correcto si fdisk sin error o con error pero realiza Syncing +if [ "${PIPESTATUS[1]}" == "0" -o $? -eq 0 ]; then partprobe $DISK 2>/dev/null + return 0 else ogRaiseError $OG_ERR_PARTITION "$1,$2,$3" return $? diff --git a/client/engine/File.lib b/client/engine/File.lib index e602b64d..88e0af7e 100755 --- a/client/engine/File.lib +++ b/client/engine/File.lib @@ -80,6 +80,39 @@ test "$(cat "$SOURCE.sum" 2>/dev/null)" == "$(cat "$TARGET.sum" 2>/dev/null)" #/** +# ogCalculateFullChecksum [ str_repo | int_ndisk int_npart ] path_filepath +#@brief Devuelve la suma COMPLETA de comprobación (checksum) de un fichero. +#@param path_filepath camino del fichero (independiente de mayúsculas) +#@param str_repo repositorio de ficheros +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return hex_checksum Checksum del fichero +#@version 1.0.5 - Primera versión para OpenGnSys. +#@author Antonio Doblas Viso, EVLT Universidad de Málaga +#@date 2014-07-09 +#*/ ## +function ogCalculateFullChecksum () +{ +# Variables locales. +local FILE +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME [ str_repo | int_ndisk int_npartition ] path_filepath" \ + "$FUNCNAME REPO ubuntu.img ==> ef899299caf8b517ce36f1157a93d8bf" + return +fi + +# Comprobar que existe el fichero y devolver sus datos. +FILE=$(ogGetPath "$@") +[ -n "$FILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$*" || return $? +#ADV +md5sum "$FILE" -b 2>&1 | cut -f1 -d" " +# tail -c1M "$FILE" | md5sum -b 2>&1 | cut -f1 -d" " +} + + + + +#/** # ogCopyFile [ str_repo | int_ndisk int_npart ] path_source [ str_repo | int_ndisk int_npart ] path_target #@brief Metafunción para copiar un fichero de sistema OpenGnSys a un directorio. #@see ogGetPath @@ -232,8 +265,11 @@ case $# in return $? ;; esac -# Eliminar caracteres \c / iniciales, finales y duplicados. +# Volver a directorio inicial en caso de error. CURRENTDIR="$PWD" +trap "cd $CURRENTDIR" RETURN + +# Eliminar caracteres \c / iniciales, finales y duplicados. # /* (comentario Doxygen) FILE="$(echo $FILE|sed -e 's/\(\/\)*\1/\//g' -e 's/^\///' -e 's/\/$//')" PREVFILE="" @@ -248,7 +284,6 @@ done # (comentario Doxygen) */ # Muestra el camino Linux, quitando el / inicial duplicado. [ "$FILEPATH" != "/" ] && echo ${FILEPATH#/} -cd $CURRENTDIR } diff --git a/client/engine/FileSystem.lib b/client/engine/FileSystem.lib index 2cdc1c0b..257c5a23 100755 --- a/client/engine/FileSystem.lib +++ b/client/engine/FileSystem.lib @@ -4,7 +4,7 @@ #@brief Librería o clase FileSystem #@class FileSystem #@brief Funciones para gestión de sistemas de archivos. -#@version 1.0.5 +#@version 1.0.6 #@warning License: GNU GPLv3+ #*/ @@ -227,7 +227,7 @@ esac function ogFormatFs () { # Variables locales -local PART ID TYPE LABEL PROG PARAMS LABELPARAM ERRCODE +local PART TYPE LABEL PROG PARAMS LABELPARAM ERRCODE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -244,7 +244,7 @@ fi PART="$(ogDiskToDev $1 $2)" || return $? # Error si la partición está montada o bloqueada. if ogIsMounted $1 $2; then - ogRaiseError $OG_ERR_PARTITION "$1 $2" # Indicar nuevo error + ogRaiseError $OG_ERR_DONTFORMAT "$MSG_MOUNT: $1 $2" return $? fi if ogIsLocked $1 $2; then @@ -384,7 +384,7 @@ echo ${SIZE%.0*} function ogGetFsType () { # Variables locales. -local PART ID TYPE +local PART TYPE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ @@ -396,16 +396,13 @@ fi # Detectar tipo de sistema de archivo (independientemente del tipo de partición). PART=$(ogDiskToDev "$1" "$2") || return $? -TYPE=$(blkid -o export $PART | awk -F= '$1~/^TYPE/ { print toupper($2) }') +TYPE=$(blkid -o export $PART | awk -F= '$1=="TYPE" { print toupper($2) }') # Componer valores correctos. case "$TYPE" in EXT4) # Comprobar si es caché o Ext4. - if [ "$1 $2" == "$(ogFindCache)" ]; then - ogIsFormated $1 $2 2>/dev/null && TYPE="CACHE" - fi - ;; - VFAT) TYPE="$(blkid -po export $PART | awk -F= '$1~/^VERSION$/ { print toupper($2) }')" ;; + [ "$1 $2" == "$(ogFindCache)" ] && TYPE="CACHE" ;; + VFAT) TYPE="$(blkid -po export $PART | awk -F= '$1=="VERSION" { print toupper($2) }')" ;; SWAP) TYPE="LINUX-SWAP" ;; LVM*) TYPE="LINUX-LVM" ;; *RAID*) TYPE="LINUX-RAID" ;; @@ -428,6 +425,9 @@ esac #@version 0.9 - Primera versión para OpenGnSys. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2009-10-15 +#@version 1.0.6 - Usar comando findmnt. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-09-04 #*/ ## function ogGetMountPoint () { @@ -444,7 +444,8 @@ fi # Obtener partición. PART="$(ogDiskToDev $1 $2)" || return $? -mount | awk -v P=$PART '{if ($1==P) {print $3}}' +# Devolver punto de montaje. +findmnt -n -o TARGET $PART } @@ -739,11 +740,14 @@ echo $MNTDIR #@version 1.0 - Deteccion automatica del tamaño minimo adecuado #@author Antonio J. Doblas Viso. Universidad de Malaga #@date 2011-02-24 +#@version 1.0.6 - Integrar código de antigua función "ogReduceFsCheck". +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-10-28 #*/ ## function ogReduceFs () { # Variables locales -local PART BLKS SIZE +local PART BLKS SIZE MAXSIZE EXTRASIZE=0 RETVAL # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -769,6 +773,7 @@ case "$(ogGetFsType $1 $2)" in #resize2fs -fp $PART "${SIZE}M" &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? resize2fs -fpM $PART &>/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? ;; + BTRFS) MNTDIR=$(ogMount $1 $2) # Calcular tamaño ocupado + 10%. @@ -776,98 +781,55 @@ case "$(ogGetFsType $1 $2)" in btrfs filesystem resize ${SIZE}k $MNTDIR ;; REISERFS|REISER4) - MNTDIR=$(ogMount $1 $2) # Calcular tamaño ocupado + 10%. + MNTDIR=$(ogMount $1 $2) SIZE=$[ $(df -k $MNTDIR | awk '{getline;print $3}') * 110 / 100 ] ogUnmount $1 $2 2>/dev/null - resize_reiserfs -s${SIZE}K $PART + resize_reiserfs -s${SIZE}K $PART <<<"y" ;; + JFS) ;; # No se reduce (por el momento). XFS) ;; # No se reduce (por el momento). + NTFS) - # Borrar ficheros de hibernación y paginación de Windows. - ogDeleteFile $1 $2 hiberfil.sys 2>/dev/null - ogDeleteFile $1 $2 pagefile.sys 2>/dev/null - ogDeleteFile $1 $2 swapfile.sys 2>/dev/null - ogUnmount $1 $2 2>/dev/null - ## NTFS: Obtiene tamaño mínimo en MB. - #SIZE=$(ntfsresize -fi $PART | awk '/resize at/ {print int($8*1.1)}') - #ntfsresize -fns "${SIZE}M" $PART >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? - #ntfsresize -fs "${SIZE}M" $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? - SIZE=$(ogReduceFsCheck $1 $2) - [ "$SIZE" == 0 ] && return 1 - ntfsresize -fs "${SIZE}M" $PART <<<"y" || ogRaiseError $OG_ERR_PARTITION "error reduciendo $1,$2" || return $? + # Calcular tamaño ocupado + 10%. + ogUnmount $1 $2 &>/dev/null + read -e MAXSIZE SIZE <<<$(ntfsresize -fi $PART | \ + awk '/device size/ {d=$4} + /resize at/ {r=int($5*1.1/1024+1)*1024} + END { print d,r}') + # Error si no puede obtenerse el tamaño máximo del volumen. + [ -n "$MAXSIZE" ] || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? + # Simular la redimensión y comprobar si es necesario ampliarala. + RETVAL=1 + while [ $RETVAL != 0 -a $[ SIZE+=EXTRASIZE ] -lt $MAXSIZE ]; do + # Obtener espacio de relocalización y devolver código de salida + # (ntfsresize devuelve 0 si no necesita relocalizar). + EXTRASIZE=$(ntfsresize -fns $SIZE $PART 2>/dev/null | \ + awk '/Needed relocations/ {print int($4*1.1/1024+1)*1024}' + exit ${PIPESTATUS[0]}) + RETVAL=$? + done + # Redimensionar solo si hace falta. + if [ $SIZE -lt $MAXSIZE ]; then + ntfsresize -fs $SIZE $PART <<<"y" >/dev/null || ogRaiseError $OG_ERR_PARTITION "$1,$2" || return $? + fi ;; + EXFAT) ;; # No se reduce (por el momento). FAT32|FAT16) ;; # No se reduce (probar "fatresize"). HFS|HFSPLUS) ;; # No se reduce (por el momento). UFS) ;; # No se reduce (por el momento). + *) ogRaiseError $OG_ERR_PARTITION "$1,$2" return $? ;; esac -ogGetFsSize $1 $2 -} - - -function ogReduceFsCheck () -{ -#IMPORTANTE: retorna el valor en MB que podrá reducir el FS de una particion ntfs -#valor devuelto 0, y codigo error 1. No se puede reducir, probar a reiniciar windows y chkdsk - -local PART RC MODE SIZE SIZEDATA -[ $# == 2 ] && MODE=STAGE1 -[ $# == 3 ] && MODE=STAGE2 -[ -z $MODE ] && return - -PART="$(ogDiskToDev $1 $2)" || return $? -ogUnmount $1 $2 &>/dev/null - - -case $MODE in - STAGE1) - # echo "primera etapa $*" - # Mostramos el error - #ntfsresize -fi $PART &>/dev/null - ntfsresize -fi $PART | grep -A 10 -e ERROR >&2 - RC=`echo $?` - # echo "RC es" $RC - # if [ "$RC" -eq "1" ] # con error la salida del grep es 0 - if [ "$RC" -eq "0" ] - then - echo "0" - return 1 - fi - SIZEDATA=$(ntfsresize -fi $PART | awk '/resize at/ {print $8+1000}') - # echo "salida" $? - # echo $SIZEDATA - ogReduceFsCheck $1 $2 $SIZEDATA - return 0 - ;; - STAGE2) - # echo "segunda etapa $*" - SIZEDATA=$3 - ntfsresize -fns "${SIZEDATA}M" $PART &>/tmp/ntfsresize.txt - RC=$? - if [ "$RC" == "0" ] - then - SIZE=$SIZEDATA - echo $SIZE - else - SIZEEXTRA=$(cat /tmp/ntfsresize.txt | awk '/Needed relocations :/ {print $0}' | awk -F"(" '{print $2}' | awk '{print $1+500}') - SIZE=$(expr $SIZEDATA + $SIZEEXTRA) - ogReduceFsCheck $1 $2 $SIZE - return 0 - fi - ;; - *) - return - ;; -esac +# Devuelve tamaño del sistema de ficheros. +ogGetFsSize $1 $2 } - #/** # ogUnlock int_ndisk int_npartition #@see ogUnlockPartition diff --git a/client/engine/Image.lib b/client/engine/Image.lib index 81014462..5e799968 100755 --- a/client/engine/Image.lib +++ b/client/engine/Image.lib @@ -363,6 +363,77 @@ IMGFILE="$IMGDIR/$(basename "$3").mbr" dd if="$DISK" of="$IMGFILE" bs=446 count=1 || ogRaiseError $OG_ERR_IMAGE "$1 $IMGFILE" || return $? } +#/** +# ogGetSizeParameters int_num_disk int_num_part str_repo [monolit|sync|diff] +#@brief Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido. +#@param int_disk numero de disco +#@param int_part numero de particion +#@param str_repo repositorio de imágenes { REPO, CACHE } +#@param str_imageType Tipo de imagen: monolit (por defecto), sync o diff. (parametro opcional) +#@return SIZEDATA SIZEREQUIRED ISENOUGHSPACE +#@note si str_imageType= diff necesario /tmp/ogimg.info, que es creado por ogCreateInfoImage. +#@exception OG_ERR_FORMAT formato incorrecto. +#@author Irina Gomez, ETSII Universidad de Sevilla +#@date 2014/10/24 +#*/ ## +function ogGetSizeParameters () +{ +local MNTDIR SIZEDATA KERNELVERSION SIZEREQUIRED FACTORGZIP FACTORLZOP SIZEFREE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME num_disk num_part str_repo [monolic|sync|diff]" \ + "if $FUNCNAME 1 2 REPO sync ; then ...; fi" \ + "if $FUNCNAME 1 6 CACHE ; then ...; fi" + return +fi +# Error si no se reciben 1 o 2 parámetros. +[ $# -lt 3 ] && return $(ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ndisco nparticion REPO|CACHE [monolitic|sync]" ; echo $?) + +MNTDIR=$(ogMount $1 $2) +if [ "$MNTDIR" == "" ]; then + ogRaiseError $OG_ERR_PARTITION "$1 $2" + return $? +fi + +# Datos contenidos en la particion o en la lista de archivos de contiene la diferencial. +if [ "_${4^^}_" == "_DIFF_" ]; then + [ -r /tmp/ogimg.info ] || return $(ogRaiseError session $OG_ERR_NOTFOUND "/tmp/ogimg.info"; echo $?) + cd $MNTDIR + SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1) +else + SIZEDATA=$(df -k | grep $MNTDIR | awk '{print $3}') +fi + +#Aplicar factor de compresion +if [ "_${4^^}_" == "_SYNC_" -o "_${4^^}_" == "_DIFF_" ]; then + + # Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision + KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') + [ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"} + FACTORSYNC=${FACTORSYNC:-"120"} + # Si IMGFS="BTRFS" la compresion es mayor. + [ $IMGFS == "BTRFS" ] && let FACTORSYNC=$FACTORSYNC-20 + + let SIZEREQUIRED=$SIZEDATA*$FACTORSYNC/100 + # El tamaño mínimo del sistema de ficheros btrfs es 250M, ponemos 300 + [ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000 + +else + FACTORGZIP=55/100 + FACTORLZOP=65/100 + let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP +fi + +#Comprobar espacio libre en el contenedor. +[ "${3^^}" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) +[ "${3^^}" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}') + +[ "$SIZEREQUIRED" -lt "$SIZEFREE" ] && ISENOUGHSPACE=TRUE || ISENOUGHSPACE=FALSE + +echo $SIZEDATA $SIZEREQUIRED $ISENOUGHSPACE + + +} #/** # ogIsImageLocked [str_repo] path_image diff --git a/client/engine/Inventory.lib b/client/engine/Inventory.lib index 60da936f..4cbdcabb 100755 --- a/client/engine/Inventory.lib +++ b/client/engine/Inventory.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Inventory #@class Inventory #@brief Funciones para recogida de datos de inventario de hardware y software de los clientes. -#@version 1.0.5 +#@version 1.0.6 #@warning License: GNU GPLv3+ #*/ @@ -29,6 +29,26 @@ fi #/** +# ogGetOsType int_ndisk int_npartition +#@brief Devuelve el tipo del sistema operativo instalado. +#@param int_ndisk nº de orden del disco +#@param int_npartition nº de orden de la partición +#@return OSType - Tipo de sistema operativo. +#@see ogGetOsVersion +#*/ ## +function ogGetOsType () +{ +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ + "$FUNCNAME 1 2 => Linux" + return +fi +ogGetOsVersion "$@" | cut -sf1 -d: +} + + +#/** # ogGetOsVersion int_ndisk int_nfilesys #@brief Devuelve la versión del sistema operativo instalado en un sistema de archivos. #@param int_ndisk nº de orden del disco @@ -48,6 +68,9 @@ fi #@version 1.0.5 - Incluir tipos GrubLoader, Hurd y WinLoader, leer por defecto fichero /etc/os-release. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2013-10-07 +#@version 1.0.6 - Detectar GrubLoader al final y sistemas basados en EFI. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-08-27 #*/ ## function ogGetOsVersion () { @@ -87,16 +110,6 @@ fi [ -z "$VERSION" ] && VERSION=$(chroot $MNTDIR lsb_release -d 2>/dev/null | awk -F":\t" '{print $2}') # Comprobar Linux de 64 bits. [ -n "$VERSION" ] && [ -e $MNTDIR/lib64 ] && IS64BIT="$MSG_64BIT" -# Para cargador GRUB, comprobar fichero de configuración. -if [ -z "$VERSION" ]; then - TYPE="GrubLoader" - for FILE in $MNTDIR/{,boot/}grub/menu.lst; do - [ -r $FILE ] && VERSION="GRUB Loader" - done - for FILE in $MNTDIR/{,boot/}{grub{,2},EFI/*}/grub.cfg; do - [ -r $FILE ] && VERSION="GRUB2 Loader" - done -fi # Para Android, leer fichero de propiedades. if [ -z "$VERSION" ]; then TYPE="Android" @@ -120,12 +133,11 @@ fi if [ -z "$VERSION" ]; then TYPE="WinLoader" FILE="$(ogGetPath $MNTDIR/boot/bcd)" + [ -z "$FILE" ] && FILE="$(ogGetPath $MNTDIR/EFI/Microsoft/boot/bcd)" if [ -n "$FILE" ]; then - for DISTRIB in "Windows 8" "Windows 7" "Windows Vista" \ - "Windwos Server 2008" "Windwos Server 2008 R2" \ - "Windwos Recovery Environment"; do + for DISTRIB in "Windows Recovery" "Windows Boot"; do if grep -qs "$(echo "$DISTRIB" | sed 's/./&./g')" $FILE; then - VERSION="$DISTRIB loader" + VERSION="$DISTRIB loader" fi done fi @@ -133,19 +145,22 @@ fi # Para MacOS: detectar kernel y completar con fichero plist de información del sistema. if [ -z "$VERSION" ]; then TYPE="MacOS" - # Kernel de Mac OS. + # Kernel de Mac OS (no debe ser fichero de texto). FILE="$MNTDIR/mach_kernel" - [ -n "$(file -b $FILE | grep 'Mach-O')" ] && VERSION="Mac OS" - [ -n "$(file -b $FILE | grep 'Mach-O 64-bit')" ] && IS64BIT="$MSG_64BIT" - # Datos de configuración de versión de Mac OS. - FILE="$MNTDIR/System/Library/CoreServices/SystemVersion.plist" - [ -r $FILE ] && VERSION=$(awk -F"[<>]" ' - /ProductName/ {getline;s=$3} - /ProductVersion/ {getline;v=$3} - END {print s,v}' $FILE) - # Datos de recuperación de Mac OS. - FILE="$MNTDIR/com.apple.recovery.boot" - [ -r $FILE -a -n "$VERSION" ] && VERSION="$VERSION recovery" + if [ -z "$(file -b $FILE | grep 'text')" ]; then + # Obtener tipo de kernel. + [ -n "$(file -b $FILE | grep 'Mach-O')" ] && VERSION="Mac OS" + [ -n "$(file -b $FILE | grep 'Mach-O 64-bit')" ] && IS64BIT="$MSG_64BIT" + # Datos de configuración de versión de Mac OS. + FILE="$MNTDIR/System/Library/CoreServices/SystemVersion.plist" + [ -r $FILE ] && VERSION=$(awk -F"[<>]" ' + /ProductName/ {getline;s=$3} + /ProductVersion/ {getline;v=$3} + END {print s,v}' $FILE) + # Datos de recuperación de Mac OS. + FILE="$MNTDIR/com.apple.recovery.boot" + [ -r $FILE -a -n "$VERSION" ] && VERSION="$VERSION recovery" + fi fi # Para FreeBSD: obtener datos del Kernel. ### TODO Revisar solución. @@ -164,6 +179,16 @@ if [ -z "$VERSION" ]; then FILE="$MNTDIR/etc/release" [ -r $FILE ] && VERSION="$(head -1 $FILE)" fi +# Para cargador GRUB, comprobar fichero de configuración. +if [ -z "$VERSION" ]; then + TYPE="GrubLoader" + for FILE in $MNTDIR/{,boot/}grub/menu.lst; do + [ -r $FILE ] && VERSION="GRUB Loader" + done + for FILE in $MNTDIR/{,boot/}{grub{,2},EFI/*}/grub.cfg; do + [ -r $FILE ] && VERSION="GRUB2 Loader" + done +fi # Mostrar resultado y salir sin errores. [ -n "$VERSION" ] && echo "$TYPE:$VERSION $IS64BIT" @@ -172,27 +197,6 @@ return 0 #/** -# ogGetOsType int_ndisk int_npartition -#@brief Devuelve el tipo del sistema operativo instalado. -#@param int_ndisk nº de orden del disco -#@param int_npartition nº de orden de la partición -#@return OSType - Tipo de sistema operativo. -#@note OSType = { Android, BSD, Linux, MacOS, Windows } -#@see ogGetOsVersion -#*/ ## -function ogGetOsType () -{ -# Si se solicita, mostrar ayuda. -if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_npartition" \ - "$FUNCNAME 1 2 => Linux" - return -fi -ogGetOsVersion "$@" | cut -sf1 -d: -} - - -#/** # ogListHardwareInfo #@brief Lista el inventario de hardware de la máquina cliente. #@return TipoDispositivo:Modelo (por determinar) @@ -259,6 +263,9 @@ lshw | awk 'BEGIN {type="mod";} #@version 1.0.5 - Aproximación para inventario de software de Mac OS. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2013-10-08 +#@version 1.0.6 - Proceso depende del tipo de SO y sporte para FreeBSD. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-11-13 #*/ ## function ogListSoftware () { @@ -274,11 +281,11 @@ fi [ $# = 2 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Obtener tipo de sistema de archivos y montarlo. -TYPE=$(ogGetFsType $1 $2) || return $? MNTDIR=$(ogMount $1 $2) || return $? +TYPE=$(ogGetOsType $1 $2) || return $? case "$TYPE" in - EXT[234]|REISERFS|REISER4) # Software de GNU/Linux. + Linux) # Software de GNU/Linux. # Procesar paquetes dpkg. DPKGDIR="${MNTDIR}/var/lib/dpkg" if [ -r $DPKGDIR ]; then @@ -292,7 +299,7 @@ case "$TYPE" in vers=$2} /Status:/ {if ($2!="install") pack=vers=""} END {if (pack!="") print pack,vers} - ' $MNTDIR/var/lib/dpkg/status | sort | uniq + ' $DPKGDIR/status | sort | uniq else # FIXME Sólo 32 bits chroot "$MNTDIR" /usr/bin/dpkg -l | \ @@ -304,14 +311,21 @@ case "$TYPE" in # Procesar paquetes RPM. RPMDIR="${MNTDIR}/var/lib/rpm" if [ -r $RPMDIR ]; then - # Correccion inconsistencia de version de base de datos. - # rm -f ${RPMDIR}/__db.* - # rpm --dbpath $RPMDIR -qa --qf "%{NAME} %{VERSION}\n" | \ - # FIXME Sólo 32 bits - chroot $MNTDIR /bin/rpm -qa --qf "%{NAME} %{VERSION}\n" | \ - awk '$1!~/-devel$/ {sub(/-.*$/,"",$2); print $0}' | \ - sort | uniq - # rm -f ${RPMDIR}/__db.* + # Listar si está instalado el paquete "rpm" en el cliente. + if which rpm &>/dev/null; then + rm -f ${RPMDIR}/__db.* + rpm --dbpath $RPMDIR -qa --qf "%{NAME} %{VERSION}\n" 2>/dev/null | \ + awk '$1!~/-devel$/ {sub(/-.*$/,"",$2); print $0}' | sort | uniq + rm -f ${RPMDIR}/__db.* + else + # Obtener el nombre de cada paquete en la BD de RPM. + python <<<" +import re; +import bsddb; +db=bsddb.hashopen('$RPMDIR/Name','r'); +for k in db.keys(): + print re.sub('-devel$','',k);" | sort | uniq + fi fi # Procesar paquetes pacman. PACMANDIR="${MNTDIR}/var/lib/pacman/local" @@ -320,7 +334,7 @@ case "$TYPE" in ls -A $PACMANDIR fi ;; - NTFS|HNTFS|FAT32|HFAT32) # Software de Windows. + Windows) # Software de Windows. # Claves de registro para programas instalados: formato "{clave}". KEYS=$(ogListRegistryKeys $MNTDIR software '\Microsoft\Windows\CurrentVersion\Uninstall') KEYS32=$(ogListRegistryKeys $MNTDIR software '\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall') @@ -340,18 +354,27 @@ case "$TYPE" in fi done) | sort | uniq ;; - HFS|HFSPLUS) # Software de Mac OS. - # Listar directorios de aplicaciones (falta buscar versiones en ficheros .plist). + MacOS) # Software de Mac OS. + # Listar directorios de aplicaciones e intentar obtener la versión del fichero .plist (tanto original como descomprimido). find "${MNTDIR}/Applications" -type d -name "*.app" -prune -print | \ while read k; do - echo "$(basename "$k" .app)" + FILE="$k/Contents/version.plist" + [ -s "$FILE" ] || FILE="$k/Contents/version.plist.uncompress" + [ -s "$FILE" ] && VERSION=$(awk -F"[<>]" '/ShortVersionString/ {getline;v=$3} + END {print v}' "$FILE") + echo "$(basename "$k" .app) $VERSION" done | sort ;; + BSD) # Software de FreeBSD. + sqlite3 $MNTDIR/var/db/pkg/local.sqlite <<<"SELECT name FROM pkg_search;" 2>/dev/null | \ + sed 's/\(.*\)-\(.*\)/\1 \2/g' | sort + ;; *) ogRaiseError $OG_ERR_PARTITION "$1, $2" return $? ;; esac } + #/** @function ogInfoCache: @brief muestra la informacion de la CACHE. #@param sin parametros #@return texto que se almacena en $IP.-InfoCache. punto_montaje, tama?oTotal, TamanioOcupado, TaminioLibre, imagenes dentro de la cahce diff --git a/client/engine/Net.lib b/client/engine/Net.lib index 10f55abd..f76dcc11 100755 --- a/client/engine/Net.lib +++ b/client/engine/Net.lib @@ -4,7 +4,7 @@ #@brief Librería o clase Net #@class Net #@brief Funciones básicas de red. -#@version 1.0.2 +#@version 1.0.6 #@warning License: GNU GPLv3+ #*/ @@ -187,20 +187,27 @@ fi #@note Comprobacion segun protocolo de conexion al Repo #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2011-02-24 +#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-08-27 #*/ ## function ogGetRepoIp () { +# Variables locales. +local SOURCE FSTYPE + +# Mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2" return fi -# Obtener direcciones IP, segun el protocolo de montaje -if [ -n "$OGIMG" ]; then - case "$ogprotocol" in - nfs) mount | grep " on $OGIMG " | cut -f1 -d: ;; - smb) mount | grep " on $OGIMG " | cut -f3 -d/ ;; - esac -fi + +# Obtener direcciones IP, según el tipo de montaje. +eval $(findmnt -P -o SOURCE,FSTYPE $OGIMG) +case "$FSTYPE" in + nfs) echo "$SOURCE" | cut -f1 -d: ;; + cifs) echo "$SOURCE" | cut -f3 -d/ ;; +esac } @@ -215,20 +222,27 @@ fi #@note Comprobacion segun protocolo de conexion al Repo #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2011-02-24 +#@version 1.0.6 - Obtener datos del punto de montaje, evitando fallo si $ogprotocol está vacía. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-08-27 #*/ ## function ogGetServerIp () { +# Variables locales. +local SOURCE FSTYPE + +# Mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME" "$FUNCNAME" "$FUNCNAME => 192.168.0.2" return fi -# Obtener direcciones IP. -if [ -n "$OPENGNSYS" ]; then - case "$ogprotocol" in - nfs) mount | grep " on $OPENGNSYS " | cut -f1 -d: ;; - smb) mount | grep " on $OPENGNSYS " | cut -f3 -d/ ;; - esac -fi + +# Obtener direcciones IP, según el tipo de montaje. +eval $(findmnt -P -o SOURCE,FSTYPE $OPENGNSYS) +case "$FSTYPE" in + nfs) echo "$SOURCE" | cut -f1 -d: ;; + cifs) echo "$SOURCE" | cut -f3 -d/ ;; +esac } diff --git a/client/engine/PostConf.lib b/client/engine/PostConf.lib index 24fb00d8..e82c00cb 100755 --- a/client/engine/PostConf.lib +++ b/client/engine/PostConf.lib @@ -8,6 +8,50 @@ #@warning License: GNU GPLv3+ #*/ + +#/** +# ogCleanOs int_ndisk int_nfilesys +#@brief Elimina los archivos que no son necesarios en el sistema operativo. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Disco o particion no corresponden con un dispositivo. +#@exception OG_ERR_PARTITION Partición desconocida o no accesible. +#@note Antes incluido en la funcion ogReduceFs +#@author Irina Gomez. Universidad de Sevilla. +#@return (nada) +#@date 2014-10-27 +#*/ ## +function ogCleanOs { + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_nfilesys" \ + "$FUNCNAME 1 1" + return +fi + +# Error si no se reciben 2 parámetros. +[ $# == 2 ] || ogRaiseError $OG_ERR_FORMAT "$FUNCNAME int_ndisk int_nfilesys" || return $? + +case "$(ogGetOsType $1 $2)" in + Linux) + # Borramos los ficheros de dispositivos y los temporales. + ogCleanLinuxDevices $1 $2 + rm -rf $(ogMount $1 $2)/tmp/* + ;; + Windows) + # Borrar ficheros de hibernación y paginación de Windows. + ogGetPath $1 $2 pagefile.sys &>/dev/null && ogDeleteFile $1 $2 pagefile.sys + ogGetPath $1 $2 hiberfil.sys &>/dev/null && ogDeleteFile $1 $2 hiberfil.sys + ogGetPath $1 $2 swapfile.sys &>/dev/null && ogDeleteFile $1 $2 swapfile.sys + ;; +esac + +} + + + #/** # ogInstallMiniSetup int_ndisk int_npartition str_filename [str_admuser str_admpassword bool_autologin [str_autouser str_autopassword] ] #@brief Metafunción para instalar archivo que se ejecutará en el arranque de Windows. @@ -258,6 +302,110 @@ EOF } +### PRUEBAS. + +#/** +# ogInstallLaunchDaemon int_ndisk int_nfilesys str_filename +#@brief Instala archivo que se ejecutará en el arranque de Mac OS. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param str_filename nombre del script +#return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado. +#@npte Crea ficheros de configuración /Library/LaunchDaemon/es.opengnsys.Script.plist. +#@version 1.0.6 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-10-06 +#*/ ## +function ogInstallLaunchDaemon () +{ +# Variables locales. +local LAUNCHDIR SCRIPTDIR +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \ + "$FUNCNAME 1 2 postconf" + return +fi + +# Error si no se reciben 3 parámetros. +[ $# == 3 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Comprobar directorios. +LAUNCHDIR=$(ogGetPath $1 $2 /Library/LaunchDaemons) +[ -n "$LAUNCHDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /Library/LaunchDaemons" || return $? +SCRIPTDIR=$(ogGetPath $1 $2 /usr/share) +[ -n "$SCRIPTDIR" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share" || return $? + +# Crear fichero de configuración del servicio de arranque. +cat << EOT $LAUNCHDIR/es.opengnsys.$3.plist +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>Label</key> + <string>es.opengnsys.$3</string> + <key>ProgramArguments</key> + <array> + <string>$SCRIPTDIR/$3.sh</string> + </array> + <key>RunAtLoad</key> + <true/> + <key>StandardOutPath</key> + <string>/var/log/$3.log</string> + <key>StandardErrorPath</key> + <string>/var/log/$3.err</string> + <true/> + </dict> +</plist> +EOT + +# Crear un fichero de script vacío. +rm -f $SCRIPTDIR/$3.sh +touch $SCRIPTDIR/$3.sh +chmod +x $SCRIPTDIR/$3.sh +} + + +### PRUEBAS. + +#/** +# ogAddToLaunchDaemon int_ndisk int_nfilesys str_filename str_commands +#@brief Añade comandos al script creado por ogInstalLaunchDaemon. +#@param int_ndisk nº de orden del disco +#@param int_nfilesys nº de orden del sistema de archivos +#@param str_filename nombre del script (siempre se guardará en /usr/share para que sea visible por el sistema +#@param str_commands comando o comandos que se añadiran al fichero +#return (nada) +#@exception OG_ERR_FORMAT Formato incorrecto. +#@exception OG_ERR_NOTFOUND Fichero o directorio no encontrado. +#@version 1.0.6 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2014-10-06 +#*/ ## +function ogAddToLaunchDaemon () +{ +# Variables locales. +local SCRIPTFILE +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME" "$FUNCNAME int_ndisk int_filesys str_scriptname" \ + "$FUNCNAME 1 2 postconf \"diskutil enableJournal disk0s2\"" + return +fi + +# Error si no se reciben 4 parámetros. +[ $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? +# Comprobar que existe el fichero de comandos. +SCRIPTFILE=$(ogGetPath $1 $2 "/usr/share/$3.sh") +[ -n "$SCRIPTFILE" ] || ogRaiseError $OG_ERR_NOTFOUND "$1 $2 /usr/share/$3" || return $? + +# Concatenamos el comando en el fichero de comandos +cat >> "$SCRIPTFILE" << EOT +$4 +EOT +} + + #/** # ogInstallLinuxClient int_ndisk int_filesys #@brief Instala el cliente OpenGnSys para sistemas operativos GNU/Linux. diff --git a/client/engine/Protocol.lib b/client/engine/Protocol.lib index 603f6e1b..36ef1fba 100755 --- a/client/engine/Protocol.lib +++ b/client/engine/Protocol.lib @@ -983,77 +983,118 @@ ctorrent -t `basename $SOURCE` -u http://$IPTORRENT:6969/announce -s $SOURCE.tor #@brief Comprueba que el fichero que se desea almacenar en la cache del cliente, no esta. #@param 1 str_REPO #@param 2 str_Relative_path_file_OGIMG_with_/ -#@return 0 si es necesario actualizar el fichero. -#@return 1 si la imagen ya esta en la cache, por lo tanto no es necesario actualizar el fichero +#@param 3 md5 to check: use full to check download image torrent +#@return 0 (true) cache sin imagen, SI es necesario actualizar el fichero. +#@return 1 (false) imagen en la cache, NO es necesario actualizar el fichero +#@return >1 (false) error de sintaxis (TODO) #@note #@todo: Proceso en el caso de que el fichero tenga el mismo nombre, pero su contenido sea distinto. #@todo: Se dejan mensajes mientras se confirma su funcionamiento. #@version 0.1 - Integracion para OpenGNSys. #@author Antonio J. Doblas Viso. Universidad de Malaga #@date +#@version 1.6 - gestiona ficheros hash full.sum (TORRENT) y .sum (MULTICAST) +#@author Antonio J. Doblas Viso. Universidad de Malaga +#@date #*/ ## function ogUpdateCacheIsNecesary () { - +#echo "admite full check con 3param TORRENT" # Variables locales. local ERROR SOURCE CACHE FILESOURCE MD5SOURCE FILETARGET MD5TARGET ERROR=0 # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME $FUNCNAME [ str_repo] [ [Relative_path_image] " \ - "$FUNCNAME REPO /PS1_PH1.img" \ - "$FUNCNAME REPO /ogclient.sqfs" + ogHelp "$FUNCNAME" "$FUNCNAME str_repo relative_path_image [protocol|FULL]" \ + "$FUNCNAME REPO /PS1_PH1.img UNICAST" \ + "$FUNCNAME REPO /ogclient.sqfs FULL" return fi #Control de la cache -ogFindCache || return $(ogRaiseError $OG_ERR_NOTCACHE; echo $?) +ogFindCache &>/dev/null || return $(ogRaiseError $OG_ERR_NOTCACHE; echo $?) + +#Control de parametros: ahora admite tres. +[ $# -ge 2 ] || return $(ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG str_repo relative_path_image [protocol|FULL]"; echo $?) -[ $# == "2" ] || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) ogCheckStringInGroup "$1" "REPO repo" || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) FILESOURCE=`ogGetPath $1 $2` || return $(ogRaiseError $OG_ERR_NOTFOUND " $1 $2"; echo $?) -#echo "paso 1. si no existe la imagen, confirmamos que es necesaria la actualizacion de la cache." +#echo "paso 1. si no existe la imagen, confirmar que es necesario actualizar la cache." FILETARGET=`ogGetPath CACHE $2` if [ -z $FILETARGET ] then # borramos el fichero bf del torrent, en el caso de que se hubiese quedado de algun proceso fallido - ogDeleteFile CACHE "/$2.torrent.bf" &> /dev/null - ogDeleteFile CACHE "/$2.sum" &> /dev/null - echo "TRUE=0, es necesario actualizar. Paso 1, la cache no contiene esa imagen " + ogGetPath CACHE "/$2.torrent.bf" && ogDeleteFile CACHE "/$2.torrent.bf" &> /dev/null + ogGetPath CACHE "/$2.sum" && ogDeleteFile CACHE "/$2.sum" &> /dev/null + ogGetPath CACHE "/$2.full.sum" && ogDeleteFile CACHE "/$2.full.sum" &> /dev/null + echo "TRUE(0), es necesario actualizar. Paso 1, la cache no contiene esa imagen " return 0 fi #echo "Paso 2. Comprobamos que la imagen no estuviese en un proceso previo torrent" if ogGetPath $FILETARGET.torrent.bf > /dev/null then - #TODO: comprobar los md5 para asegurarnos que la imagen es la misma. - echo "TRUE=0, es necesario actualizar. Paso 2, la imagen esta en un estado de descarga torrent interrumpido" + #TODO: comprobar los md5 del fichero .torrent para asegurarnos que la imagen a descarga es la misma. + echo "TRUE(0), es necesario actualizar. Paso 2, la imagen esta en un estado de descarga torrent interrumpido" return 0 fi ## En este punto la imagen en el repo y en la cache se llaman igual, -#echo "paso 4. recuperamos o calculamos los md5 de los ficheros" -if [ -f $FILESOURCE.sum ] -then - MD5SOURCE=$(cat $FILESOURCE.sum) -else - MD5SOURCE=$(ogCalculateChecksum $FILESOURCE) -fi -[ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum -MD5TARGET=$(cat $FILETARGET.sum) +#echo "paso 4. Obtener los md5 del fichero imagen en la cacha segun PROTOCOLO $3" +case "${3^^}" in + FULL|TORRENT) + #Buscamos MD5 en el REPO SOURCE + if [ -f $FILESOURCE.full.sum ] + then + MD5SOURCE=$(cat $FILESOURCE.full.sum) + else + MD5SOURCE=$(ogCalculateFullChecksum $FILESOURCE) + fi + # Generamos el MD5 (full) en la CACHE + [ ! -f $FILETARGET.full.sum ] && ogCalculateFullChecksum $FILETARGET > $FILETARGET.full.sum + MD5TARGET=$(cat $FILETARGET.full.sum) + # Generamos el MD5 (little) en la CACHE para posteriores usos del protocolo MULTICAST + [ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum + ;; + *) + #Buscamos MD5 en el REPO SOURCE + if [ -f $FILESOURCE.sum ] + then + MD5SOURCE=$(cat $FILESOURCE.sum) + else + MD5SOURCE=$(ogCalculateChecksum $FILESOURCE) + fi + # Generamos el MD5 (little) en la CACHE + [ ! -f $FILETARGET.sum ] && ogCalculateChecksum $FILETARGET > $FILETARGET.sum + MD5TARGET=$(cat $FILETARGET.sum) + #Generamos o copiamos MD5 (full) en la CACHE para posteriores usos con Torrent + # Si no existe el full.sum y si existe el .sum es porque el upateCACHE multicast o unicast ha sido correcto. + if [ ! -f $FILETARGET.full.sum -a $FILETARGET.sum ] + then + if [ -f $FILESOURCE.full.sum ] + then + #Existe el .full.sum en REPO realizamos COPIA + cp $FILESOURCE.full.sum $FILETARGET.full.sum + else + #No existe .full.sum no en REPO LO GENERAMOS en la cache: situacion dificil que ocurra + ogCalculateFullChecksum $FILETARGET > $FILETARGET.full.sum + fi + fi + +esac -#echo "Paso 5. comparamos los md5" -#TODO: que hacer cuando los md5 son distintos. Por defecto borrar. +#echo "Paso 5. comparar los md5" if [ "$MD5SOURCE" == "$MD5TARGET" ] -then - echo "FALSE=1, No es neceario actualizar. Paso5.A la imagen esta en cache" +then + echo "FALSE (1), No es neceario actualizar. Paso5.A la imagen esta en cache" return 1 else - echo "TRUE=0, Si es necesario actualizar. paso 5.b la imagen en cache es distinta, borramos la imagen anterior y devolvemos 0 para confirmar la actualizacion" - rm -f $FILETARGET $FILETARGET.sum $FILETARGET.torrent + echo "imagen en cache distinta, borramos la imagen anterior" + rm -f $FILETARGET $FILETARGET.sum $FILETARGET.torrent $FILETARGET.full.sum + echo "TRUE (0), Si es necesario actualizar." return 0 fi } diff --git a/client/engine/Registry.lib b/client/engine/Registry.lib index 1a6045f2..a46404d0 100755 --- a/client/engine/Registry.lib +++ b/client/engine/Registry.lib @@ -94,12 +94,12 @@ fi [ $# == 3 -o $# == 4 ] || ogRaiseError $OG_ERR_FORMAT || return $? # Camino del fichero de registro. FILE=$(ogGetHivePath "$1" "$2") || return $? -case "$4" in - string|STRING|"") TYPE=1 ;; - binary|BINARY) TYPE=3 ;; - dword|DWORD) TYPE=4 ;; - *) ogRaiseError $OG_ERR_OUTOFLIMIT "$4" - return $? ;; +case "${4^^}" in + STRING|"") TYPE=1 ;; + BINARY) TYPE=3 ;; + DWORD) TYPE=4 ;; + *) ogRaiseError $OG_ERR_OUTOFLIMIT "$4" + return $? ;; esac # Devolver el dato del valor de registro. @@ -222,7 +222,7 @@ local FILE FILENT FILEXP # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive" + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive" \ "$FUNCNAME /mnt/sda1 SOFTWARE => /mnt/sda1/WINDOWS/System32/config/SOFTWARE" return fi @@ -388,7 +388,7 @@ local FILE # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then - ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename str_data" + ogHelp "$FUNCNAME" "$FUNCNAME path_mountpoint str_hive str_valuename str_data" \ "$FUNCNAME /mnt/sda1 SOFTWARE '\Microsoft\NewKey\Value1' 1" return fi diff --git a/client/engine/Rsync.lib b/client/engine/Rsync.lib index 5b735c5e..a2889dac 100755 --- a/client/engine/Rsync.lib +++ b/client/engine/Rsync.lib @@ -1,4 +1,21 @@ #!/bin/bash + +#/** +# rsync +#@brief Función para utilizar la versión de rsync situada en $OPENGNSYS/bin en vez de la del sistema operativo. +#@param los mismos que el comando rsync del sistema operativo. +#@return instrucción para ser ejecutada. +#*/ +function rsync () +{ +local RSYNC +[ -x $OPENGNSYS/bin/rsync ] && RSYNC=$OPENGNSYS/bin/rsync +RSYNC=${RSYNC:-$(which rsync)} + +$RSYNC "$@" +} + + #/** # ogCreateFileImage [ REPO | CACHE ] image_name extension size #@brief Crear el archivo @@ -64,8 +81,8 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then ogEcho log session " $MSG_SYNC_RESIZE" echo " truncate --size=>$SIZEREQUIRED k $IMGFILE" truncate --size=">$SIZEREQUIRED"k "$IMGFILE" &> $OGLOGCOMMAND - # FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs - if [ $KERNELVERSION \< 3.07 ]; then + # FS de la imagen segun el contenido del archivo .img + if file "$IMGFILE" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then losetup $LOOPDEVICE "$IMGFILE" echo " resize2fs -f $LOOPDEVICE" resize2fs -f $LOOPDEVICE &> $OGLOGCOMMAND @@ -78,12 +95,15 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then fi fi else - echo " dd if=/dev/zero of=$IMGFILE bs=1024 count=$SIZEREQUIRED" - dd if=/dev/zero of="$IMGFILE" bs=1024 count=$SIZEREQUIRED 2>&1 | tee -a $OGLOGCOMMAND + touch "$IMGFILE" + echo " truncate --size=>$SIZEREQUIRED k $IMGFILE" + truncate --size=">$SIZEREQUIRED"k "$IMGFILE" &> $OGLOGCOMMAND #Formateamos imagen losetup $LOOPDEVICE $IMGFILE - # FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs - if [ $KERNELVERSION \< 3.07 ]; then + # FS de la imagen segun la configuracion y la version del kernel: < 3.7 ext4, si >= btrfs + [ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"} + + if [ "$IMGFS" == "EXT4" ]; then echo " mkfs.ext4 -i 4096 -b 4096 -L "${2##*\/}" $LOOPDEVICE" mkfs.ext4 -i 4096 -b 4096 -L "${2##*\/}" $LOOPDEVICE 2>&1 |tee -a $OGLOGCOMMAND else @@ -94,7 +114,6 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then # Monto la imagen ogMountImage $1 "$2" $3 &>/dev/null [ $? -eq 0 ] || return $( ogRaiseError $OG_ERR_IMAGE "$3 $4"; echo $?) - #touch "$DIRMOUNT/ogimg.info" echo "mounted"> $IMGFILE.lock # Si existe dispositivo de loop lo borro. @@ -117,8 +136,9 @@ function ogCreateInfoImage () { #@param 3 Repositorio [ REPO | CACHE ] (opcional en las completas) #@param 4 Nombre Imagen Basica (opcional en las completas) #@param 5 Tipo imagen [ img | diff ] +#@version 1.0.6 rsync opcion W (whole) para que sea más rápido #*/ -local IMGTYPE IMGDIRAUX DIRMOUNT DESTRSYNC PASSWORD OPTRSYNC USERRSYNC ORIG FSTYPE PART DIREMPTY IMGLIST IMGINFO IMGACL KERNELVERSION +local IMGTYPE IMGDIRAUX DIRMOUNT DESTRSYNC PASSWORD USERRSYNC ORIG FSTYPE PART DIREMPTY IMGLIST IMGINFO IMGACL KERNELVERSION # Ayuda o menos de 5 parametros y la imagen no es basica if [ "$*" == "help" -o $# -lt 5 -a "$3" != "img" ]; then ogHelp "$FUNCNAME" : "$MSG_HELP_ogCreateInfoImage" \ @@ -177,23 +197,20 @@ SIZEDATA=${SIZEDATA:-"SIZEDATA"} # Incluimos información de la imagen. Segun el kernel sera ext4 o btrfs. KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') -if [ $KERNELVERSION \< 3.07 ]; then - echo "#EXT4:NO:$FSTYPE:$SIZEDATA" > $IMGINFO -else - echo "#BTRFS:LZO:$FSTYPE:$SIZEDATA" > $IMGINFO -fi +[ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS=${IMGFS:-"BTRFS"} +echo "#$IMGFS:NO:$FSTYPE:$SIZEDATA" > $IMGINFO if [ "$IMGTYPE" == "img" ]; then # Imagen Basica - echo " rsync -aHAXvn --delete $ORIG/ $DIREMPTY >> $IMGINFO" - rsync -aHAXvn --delete $ORIG/ $DIREMPTY>> $IMGINFO + echo " rsync -aHAXWvn --delete $ORIG/ $DIREMPTY >> $IMGINFO" + rsync -aHAXWvn --delete $ORIG/ $DIREMPTY>> $IMGINFO sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGINFO sed -i '/^\.\//d' $IMGINFO else # Imagen Diferencial - echo " rsync -aHAXvn$OPTRSYNC --delete $ORIG/ $DESTRSYNC a $IMGLIST" - rsync -aHAXvn$OPTRSYNC $PASSWORD --delete "$ORIG/" "$DESTRSYNC" >> $IMGLIST + echo " rsync -aHAXWvn --delete $ORIG/ $DESTRSYNC a $IMGLIST" + rsync -aHAXWvn $PASSWORD --delete "$ORIG/" "$DESTRSYNC" >> $IMGLIST sed -i -e s/"^sent.*.bytes\/sec"//g -e s/^total.*.speedup.*.$//g -e s/"sending.*.list"//g $IMGLIST sed -i '/^\.\//d' $IMGLIST @@ -226,14 +243,14 @@ fi #/** # ogAclFilter -#@brief Del fichero de acl de la partición extraemos las acl de los ficheros de la diferencial +#@brief Del fichero de acl de la partición extraemos las acl de los ficheros de la diferencial (falla: no se usa) #@param No. #@return (nada) #*/ function ogAclFilter () { local IMGACL IMGINFO FILES ACLTMP -# Ayuda o menos de 5 parametros y la imagen no es basica +# Ayuda if [ "$*" == "help" ]; then ogHelp "$MSG_HELP_ogAclFilter" \ "$FUNCNAME [ no parameters ] " @@ -252,14 +269,12 @@ ACLFILES="/tmp/aclfiles$$" echo "" > $ACLTMP grep -n -e "File" -e "Directory" $IMGACL > $ACLFILES -# Al fichero le quitamos las líneas sobrantes: comentarios y lineas vacias. -sed -e s/"^#.*$"//g $IMGINFO > $FILES -sed -i '/^$/d' $FILES +# Al listado de ficheros le quitamos las líneas sobrantes: comentarios y lineas vacias. +sed -e s/"^#.*$"//g -e '/^$/d' $IMGINFO > $FILES # Recorremos el listado y extraemos la acl correspondiente al fichero o directorio. while read LINE; do - #read END INI <<< "$(grep -n -e "File" -e "Directory" $IMGACL| grep -A 1 "$LINE"| awk -F : '!(NR%2){print $1" "p}{p=$1}' )" read END INI <<< "$(grep -A 1 "$LINE" $ACLFILES | awk -F : '!(NR%2){print $1" "p}{p=$1}' )" let NUM=$END-$INI-1 # Si algún archivo no se encuentra, el error lo mandamos a /dev/null @@ -301,12 +316,16 @@ DEST=$(ogMount $1 $2) || return $? IMGACL="ogimg.acl" IMGLN="ogimg.ln" +IMGINFO="ogimg.info" + +# Copiamos informacion de la imagen a /tmp (para basicas) +[ -r $DEST/$IMGACL ] && cp $DEST/ogimg.* /tmp #Creamos o modificamos los enlaces. # La imagen diferencial tiene ogimg.ln # para la completa lo generamos con los enlaces que contengan /mnt/ -[ -r "$DEST/$IMGLN" ] || grep -e "->" -e "=>" "$DEST/ogimg.info"|grep "/mnt/" > "$DEST/$IMGLN" -if [ $(wc -l "$DEST/$IMGLN"|cut -f1 -d" ") -ne 0 ]; then +[ -r "/tmp/$IMGLN" ] || grep -e "->" -e "=>" "/tmp/$IMGINFO"|grep "/mnt/" > "/tmp/$IMGLN" +if [ $(wc -l "/tmp/$IMGLN"|cut -f1 -d" ") -ne 0 ]; then while read LINEA do ORIGLN="${LINEA#*> }" @@ -327,15 +346,26 @@ if [ $(wc -l "$DEST/$IMGLN"|cut -f1 -d" ") -ne 0 ]; then rm -f "$(basename "$DESTLN")" ln $OPTLN "$ORIGLN" "$(basename "$DESTLN")" echo -n "." - done < "$DEST/$IMGLN" 2>/dev/null + done < "/tmp/$IMGLN" 2>/dev/null echo "" fi +cd / +} +#/** +# ogRestoreAclImage +#@brief Restaurar las ACL. La informacion esta ya copiada al directorio /tmp +#@param 1 num_disk +#@param 2 num_part +#*/ +function ogRestoreAclImage () { +local PART IMGACL +PART=$(ogDiskToDev "$1" "$2") || return $? +IMGACL="ogimg.acl" # Restauramos acl -if [ "$(ogGetFsType $1 $2)" == "NTFS" -a -f "$DEST/$IMGACL" ] ; then +if [ "$(ogGetFsType $1 $2)" == "NTFS" -a -f "/tmp/$IMGACL" ] ; then cd / - cp "$DEST/$IMGACL" /tmp ogUnmount "$1" "$2" echo "ntfs-3g.secaudit -se $PART /tmp/$IMGACL" ntfs-3g.secaudit -se $PART /tmp/$IMGACL @@ -442,6 +472,7 @@ DESTRSYNC=$(ogGetMountPoint $4 $5) # Borramos ficheros de informacion de restauraciones antiguas rm -rf $DESTRSYNC/ogimg.* +rm -rf /tmp/ogimg.* # Origen y destino de la sincronizacion y en REPO opciones rsync if [ "$1" == "CACHE" -o "$1" == "cache" ]; then @@ -467,23 +498,25 @@ ogEcho log session " $MSG_SYNC_RESTORE" if [ "$3" == "diff" ]; then # Lista de archivos a copiar: IMGINFO="ogimg.info" - FILESFROM=" --files-from=$DESTRSYNC/$IMGINFO" + FILESFROM=" --files-from=/tmp/$IMGINFO" - echo " rsync -aHAX$OPTRSYNC --progress $ORIG/ogimg* $DESTRSYNC" - rsync -aHAX$OPTRSYNC $PASSWORD --progress "$ORIG"/ogimg* $DESTRSYNC + echo " rsync -aHAX$OPTRSYNC --progress $ORIG/ogimg* /tmp" + rsync -aHAX$OPTRSYNC $PASSWORD --progress "$ORIG"/ogimg* /tmp # Borramos linea de información de la imagen, sino busca un fichero con ese nombre - sed -i '/^\#/d' $DESTRSYNC/$IMGINFO + sed -i '/^\#/d' /tmp/$IMGINFO cd $DESTRSYNC # Diferencial: Borramos archivos sobrantes. ogEcho log session " $MSG_SYNC_DELETE" - cat "$DESTRSYNC/ogimg.rm" 2>/dev/null | xargs rm -rf + sed -e s/^/\"/g -e s/$/\"/g "/tmp/ogimg.rm" 2>/dev/null | xargs rm -rf fi echo " rsync -aHAX$OPTRSYNC --progress $FILESFROM $ORIG/ $DESTRSYNC" rsync -aHAX$OPTRSYNC $PASSWORD --progress $FILESFROM "$ORIG/" "$DESTRSYNC" 2>$OGLOGCOMMAND | egrep "^deleting|^sent|^sending|^total|%" |tee -a $OGLOGCOMMAND -return ${PIPESTATUS[0]} +RETVAL=${PIPESTATUS[0]} +cd / +return $RETVAL } @@ -528,9 +561,9 @@ else || return $(ogRaiseError $OG_ERR_NOTFOUND "$1 $2.$IMGEXT"; echo $?) mkdir -p "/tmp/$DIRMOUNT" - # FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs - KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') - if [ $KERNELVERSION \< 3.07 ]; then + + # FS de la imagen segun el contenido del archivo .img + if file "$IMGFILE" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then mount -t ext4 -o loop "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null else mount -o compress=lzo "$IMGFILE" "/tmp/$DIRMOUNT" 1>/dev/null @@ -669,7 +702,7 @@ echo -n -e " $MSG_SYNC_SLEEP: $DIRMOUNT\n #" | tee -a $OGLOGSESSION $ let TIMEOUT=$SIZE/$CREATESPEED [ $TIMEOUT -lt 60 ] && TIMEOUT=60 until $(grep -i $STATE $LOCKFILE &>/dev/null) ; do - [ $STATE = "mounted" -a -f "$DIRMOUNT/ogimg.info" ] && ogEcho session "" && return 0 + [ $STATE = "mounted" -a -f "$DIRMOUNT/ogimg.info" ] && ogEcho log session "" && return 0 TIMEAUX=$[SECONDS-TIME] [ "$TIMEAUX" -lt "$TIMEOUT" ] || return $(ogRaiseError $OG_ERR_DONTMOUNT_IMAGE "$3 $4 $IMGEXT: time_out."; echo $?) echo -n "#" | tee -a $OGLOGSESSION $OGLOGFILE @@ -710,10 +743,10 @@ fi IMGDIR="$(ogGetParentPath "$1" "/$2")" IMGFILE="${IMGDIR}/$(basename "/$2").$IMGEXT" -# Solo es posible para imagenes EXT4. Si no es EXT4 salimos sin error -file "$IMGFILE" | grep -i " ext4 filesystem " 2>&1 > /dev/null || return 0 if [ "$1" == "CACHE" -o "$1" == "cache" ]; then + # Para imagenes EXT4 reduzco, para BTRFS solo desmonto. + if file "$IMGFILE" | grep -i " ext4 filesystem " 2>&1 > /dev/null; then # Al montar se comprueba la existencia de la imagen DIRMOUNT="$(ogMountImage $1 "$2" ${IMGEXT#*\.})" AVAILABLE=$(df -k|grep "$DIRMOUNT$"|awk '{print $4}') @@ -748,10 +781,13 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then # Corto el archivo al tamaño del sistema de ficheros. echo " truncate --size=\"$EXTSIZE\"k $IMGFILE " truncate --size="$EXTSIZE"k "$IMGFILE" - + else # Desmonto la imagen - echo "reduced" > "$IMGFILE.lock" - rmdir "$DIRMOUNT" + umount "$DIRMOUNT" + fi + + echo "reduced" > "$IMGFILE.lock" + rmdir "$DIRMOUNT" else [ -z $REPOIP ] && REPOIP=$(ogGetRepoIp) @@ -838,13 +874,12 @@ if [ "$1" == "CACHE" -o "$1" == "cache" ]; then else [ -f "$OGIMG/mount/$2${IMGEXT#img}/ogimg.info" ] && ISMOUNT=TRUE fi -[ "$ISMOUNT" == TRUE ] && ogEcho session warning "$MSG_SYNC_NOCHECK" && return 0 +[ "$ISMOUNT" == TRUE ] && ogEcho log session warning "$MSG_SYNC_NOCHECK" && return 0 DIRMOUNT="/tmp/ogCheckImage$$" -mkdir "$DIRMOUNT" -# FS de la imagen segun la version del kernel: < 3.7 ext4, si >= btrfs -KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') -if [ $KERNELVERSION \< 3.07 ]; then +mkdir "$DIRMOUNT" +# FS de la imagen segun el contenido del archivo .img +if file "$IMGFILE" |grep -i -e " ext4 filesystem " 2>&1 > /dev/null ; then mount -t ext4 -o loop "$IMGFILE" "$DIRMOUNT" 2>&1 | tee -a $OGLOGCOMMAND RETVAL=${PIPESTATUS[0]} else diff --git a/client/engine/String.lib b/client/engine/String.lib index a81e3b07..3c4430e6 100755 --- a/client/engine/String.lib +++ b/client/engine/String.lib @@ -15,8 +15,9 @@ #@date 2010/05/09 #*/ ## #/** -ogCheckStringInGroup () +function ogCheckStringInGroup () { +local i # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then ogHelp "$FUNCNAME str_elemento str_grupo" \ @@ -56,7 +57,7 @@ return 1 #/** -ogCheckStringInReg() +function ogCheckStringInReg() { local REG @@ -91,7 +92,7 @@ REG=$2 #@date 2010/05/09 #*/ ## #/** -ogCheckIpAddress() +function ogCheckIpAddress() { local REG IP arrIP diff --git a/client/engine/System.lib b/client/engine/System.lib index 51365902..cbadd952 100755 --- a/client/engine/System.lib +++ b/client/engine/System.lib @@ -4,7 +4,7 @@ #@brief Librería o clase System #@class System #@brief Funciones básicas del sistema. -#@version 1.0.5 +#@version 1.0.6 #@warning License: GNU GPLv3+ #*/ @@ -25,7 +25,7 @@ #@date 2009-07-23 #@version 1.0.5 - Elegir fichero de log. #@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009-07-23 +#@date 2014-03-17 #*/ function ogEcho () { @@ -61,6 +61,108 @@ fi #/** +# ogExecAndLog str_logfile ... str_command ... +#@brief Ejecuta un comando y guarda su salida en fichero de registro. +#@param str_logfile fichero de registro (pueden ser varios). +#@param str_command comando y comandos a ejecutar. +#@return Salida de ejecución del comando. +#@note str_logfile = { LOG, SESSION, COMMAND } +#@version 1.0.6 - Primera versión para OpenGnSys +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-07-02 +#*/ +function ogExecAndLog () { + +# Variables locales +local ISCOMMAND ISLOG ISSESSION COMMAND CONTINUE=1 FILES REDIREC + +# Si se solicita, mostrar ayuda. +if [ "$*" == "help" ]; then + ogHelp "$FUNCNAME str_logfile ... str_command ..." \ + "$FUNCNAME COMMAND ls -al /" + return +fi + +# Procesar parámetros. +while [ $CONTINUE ]; do + case "${1,,}" in + command) ISCOMMAND=1; shift ;; + log) ISLOG=1; shift ;; + session) ISSESSION=1; shift ;; + *) COMMAND="$@" + CONTINUE= ;; + esac +done +# Error si no se recibe un comando que ejecutar. +[ -n "$COMMAND" ] || ogRaiseError $OG_ERR_FORMAT || return $? + +# Componer lista de ficheros de registro. +if [ $ISCOMMAND ]; then + FILES="$OGLOGCOMMAND" + > $FILES + REDIREC="2>&1" +fi +[ $ISLOG ] && FILES="$FILES $OGLOGFILE" +[ $ISSESSION ] && FILES="$FILES $OGLOGSESSION" + +# Ejecutar comando. +eval $COMMAND $REDIREC | tee -a $FILES +# Salida de error del comando ejecutado. +return ${PIPESTATUS[0]} +} + + +#/** +# ogGetCaller +#@brief Devuelve nombre del programa o script ejecutor (padre). +#@param No. +#@return str_name - Nombre del programa ejecutor. +#@version 0.10 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2011-01-17 +#*/ +function ogGetCaller () { + +# Obtener el nombre del programa o del script que ha llamado al proceso actual. +basename "$(ps hlp $PPID | awk '{if ($13~/bash/ && $14!="") print $14; + else { sub(/^-/,"",$13); print $13; } }')" +} + + +#/** +# ogHelp ["str_function" ["str_format" ["str_example" ... ]]] +#@brief Muestra mensaje de ayuda para una función determinda. +#@param str_function Nombre de la función. +#@param str_format Formato de ejecución de la función. +#@param str_example Ejemplo de ejecución de la función. +#@return str_help - Salida de ayuda. +#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME +#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas. +#@note Pueden especificarse varios mensajes con ejemplos. +#@version 0.9 - Primera versión para OpenGnSys. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-07-27 +#*/ +function ogHelp () { + +# Variables locales. +local FUNC MSG + +# Mostrar función, descripción y formato. +FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}" +MSG="MSG_HELP_$FUNC" +ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}" +[ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2" +# Mostrar ejemplos (si existen). +shift 2 +while [ $# -gt 0 ]; do + ogEcho help " $MSG_EXAMPLE: $1" + shift +done +} + + +#/** # ogRaiseError [str_logtype ...] int_errcode ["str_errmessage" ...] #@brief Devuelve el mensaje y el código de error correspondiente. #@param str_logtype tipo de registro de incidencias. @@ -110,6 +212,7 @@ case "$CODE" in $OG_ERR_EXTENDFS) MSG="$MSG_ERR_EXTENDFS \"$2\"" ;; $OG_ERR_IMGSIZEPARTITION) MSG="$MSG_ERR_IMGSIZEPARTITION \"$2\"" ;; $OG_ERR_UPDATECACHE) MSG="$MSG_ERR_UPDATECACHE \"$2\"" ;; + $OG_ERR_DONTFORMAT) MSG="$MSG_ERR_DONTFORMAT \"$2\"" ;; $OG_ERR_UCASTSYNTAXT) MSG="$MSG_ERR_UCASTSYNTAXT \"$2\"" ;; $OG_ERR_UCASTSENDPARTITION) MSG="$MSG_ERR_UCASTSENDPARTITION \"$2\"" ;; $OG_ERR_UCASTSENDFILE) MSG="$MSG_ERR_UCASTSENDFILE \"$2\"" ;; @@ -140,23 +243,6 @@ return $CODE #/** -# ogGetCaller -#@brief Devuelve nombre del programa o script ejecutor (padre). -#@param No. -#@return str_name - Nombre del programa ejecutor. -#@version 0.10 - Primera versión para OpenGnSys. -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2011-01-17 -#*/ -function ogGetCaller () { - -# Obtener el nombre del programa o del script que ha llamado al proceso actual. -basename "$(ps hlp $PPID | awk '{if ($13~/bash/ && $14!="") print $14; - else { sub(/^-/,"",$13); print $13; } }')" -} - - -#/** # ogIsRepoLocked #@brief Comprueba si el repositorio está siendo usado (tiene ficheros abiertos). #@param No. @@ -183,40 +269,6 @@ test -n "$FILES" } - -#/** -# ogHelp ["str_function" ["str_format" ["str_example" ... ]]] -#@brief Muestra mensaje de ayuda para una función determinda. -#@param str_function Nombre de la función. -#@param str_format Formato de ejecución de la función. -#@param str_example Ejemplo de ejecución de la función. -#@return str_help - Salida de ayuda. -#@note Si no se indican parámetros, la función se toma de la variable \c $FUNCNAME -#@note La descripción de la función se toma de la variable compuesta por \c MSG_FUNC_$función incluida en el fichero de idiomas. -#@note Pueden especificarse varios mensajes con ejemplos. -#@version 0.9 - Primera versión para OpenGnSys. -#@author Ramon Gomez, ETSII Universidad de Sevilla -#@date 2009-07-27 -#*/ -function ogHelp () { - -# Variables locales. -local FUNC MSG - -# Mostrar función, descripción y formato. -FUNC="${1:-${FUNCNAME[${#FUNCNAME[*]}-1]}}" -MSG="MSG_HELP_$FUNC" -ogEcho help "$MSG_FUNCTION $FUNC: ${!MSG}" -[ -n "$2" ] && ogEcho help " $MSG_FORMAT: $2" -# Mostrar ejemplos (si existen). -shift 2 -while [ $# -gt 0 ]; do - ogEcho help " $MSG_EXAMPLE: $1" - shift -done -} - - function ogCheckProgram () { # Si se solicita, mostrar ayuda. diff --git a/client/shared/bin/rsync-3.1.0 b/client/shared/bin/rsync-3.1.0 Binary files differnew file mode 100755 index 00000000..366204f0 --- /dev/null +++ b/client/shared/bin/rsync-3.1.0 diff --git a/client/shared/etc/engine.cfg b/client/shared/etc/engine.cfg index 103a0211..895881be 100644 --- a/client/shared/etc/engine.cfg +++ b/client/shared/etc/engine.cfg @@ -10,8 +10,8 @@ OGWINCHKDISK=TRUE #Configuracion de interface restauracion #Que hacer cuando la cache no tenga espacio libre. [ NONE | FORMAT ] ] ACTIONCACHEFULL=NONE -# Protocolo a usar en el caso de que no exita cache o no haya espacio sufiencie. -RESTOREPROTOCOLNOCACHE=UNICAST +#Que protocolo de restauracion usar en el caso de que no exista cache o no exista espacio sufiente. [NONE | UNICAST | MULTICAST].NONE retorna error +RESTOREPROTOCOLNOTCACHE=UNICAST #script Creacion imagen IMGPROG="partclone" @@ -27,9 +27,14 @@ OGWINREDUCE=TRUE # Factor para calcular el time-out al crear la imagen. 100000k -> 4s CREATESPEED=100000*4 # Factor de compresion para las imagenes (windos en ext4). -ZSYNC=120 +FACTORSYNC=120 # Realizar copia de seguridad antes de crear la imagen. -BACKUP="false" +BACKUP=false +# Sistema de archivo de la imagenes sincronizadas. EXT4 o BTRFS +IMGFS=EXT4 # Tiempo de sleep antes de realizar el reboot OGSLEEP="20" + +# Indica si se instala automáticamente el cliente OpenGnSys en el despliegue de un SO (por defecto, no instalar). +INSTALLOSCLIENT=FALSE diff --git a/client/shared/etc/init/default.sh b/client/shared/etc/init/default.sh index 7d18def1..e87b4b61 100755 --- a/client/shared/etc/init/default.sh +++ b/client/shared/etc/init/default.sh @@ -20,13 +20,20 @@ if [ -x $OPENGNSYS/job_executer/init.d/job_executer ]; then fi # Arranque de OpenGnSys Client daemon (socket). -if [ -x "$OPENGNSYS/bin/ogAdmClient" ]; then - echo "${MSG_LAUNCHCLIENT:-.}" - [ $ogactiveadmin == "true" ] && boot="admin" - # Indicar fichero de teclado de Qt para el idioma especificado (tipo "es.qmap"). - [ -f /usr/local/etc/${LANG%_*}.qmap ] && export QWS_KEYBOARD="TTY:keymap=/usr/local/etc/${LANG%_*}.qmap" +echo "${MSG_LAUNCHCLIENT:-.}" +[ "$ogactiveadmin" == "true" ] && boot="admin" +# Indicar fichero de teclado de Qt para el idioma especificado (tipo "es.qmap"). +[ -f /usr/local/etc/${LANG%_*}.qmap ] && export QWS_KEYBOARD="TTY:keymap=/usr/local/etc/${LANG%_*}.qmap" + +if [ -x "$OPENGNSYS/bin/ogAdmClient" -a "$ogstatus" != "offline" ]; then # Ejecutar servicio cliente. $OPENGNSYS/bin/ogAdmClient -f $OPENGNSYS/etc/ogAdmClient.cfg -l $OGLOGFILE -d $LOGLEVEL +else + for FILE in index $OGGROUP $(ogGetIpAddress) + do + [ -f $OGCAC/menus/$FILE.html ] && OGMENU="$OGCAC/menus/$FILE.html" + done + $OPENGNSYS/bin/browser -qws $OGMENU fi # Si fallo en cliente y modo "admin", cargar shell; si no, salir. diff --git a/client/shared/etc/lang.ca_ES.conf b/client/shared/etc/lang.ca_ES.conf index 6aa9fa2a..24ca7798 100644 --- a/client/shared/etc/lang.ca_ES.conf +++ b/client/shared/etc/lang.ca_ES.conf @@ -10,7 +10,7 @@ MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo" MSG_ERR_CACHE="Error en partición de caché local" MSG_ERR_NOGPT="El disco indicado no contiene una particion GPT" MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar" -MSG_ERR_NOTOS="Sistema operativo no instalado o no detectado" +MSG_ERR_NOTOS="Sistema operativo no detectado o no se puede iniciar" MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema" MSG_ERR_NOTEXEC="Programa o función no ejecutable" MSG_ERR_NOTWRITE="No hay acceso de escritura" @@ -31,6 +31,7 @@ MSG_ERR_MCASTRECEIVERFILE="Error en la recepcion MULTICAST de un fichero" MSG_ERR_MCASTSENDPARTITION="Error en envio MULTICAST de una particion" MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepcion MULTICAST de un fichero" MSG_ERR_PROTOCOLJOINMASTER="Error en la conexion de una sesion UNICAST|MULTICAST con el MASTER" +MSG_ERR_DONTFORMAT="Error al formatear" MSG_ERR_DONTMOUNT_IMAGE="Error al montar/reducir la imagen" MSG_ERR_DONTUNMOUNT_IMAGE="Error al desmontar la imagen" MSG_ERR_DONTSYNC_IMAGE="Imagen no sincronizable" @@ -40,6 +41,7 @@ MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restaurac # Mensajes de avisos. MSG_DONTMOUNT="Sistema de archivos no montado" MSG_DONTUNMOUNT="El sistema de archivos no se puede desmontar o no está montado" +MSG_MOUNT="Sistema de archivos montado" # Mensajes complementarios para las ayudas. MSG_64BIT="64 bits" @@ -90,6 +92,7 @@ MSG_HELP_ogBoot="Arranca un sistema operativo instalado." MSG_HELP_ogCalculateChecksum="Calcula la suma de comprobación (checksum) de un fichero." MSG_HELP_ogCheckFs="Comprueba la consistencia de un sistema de archivos." MSG_HELP_ogCheckSyncImage="Muestra el contenido de la imagen para comprobarla." +MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo." MSG_HELP_ogCompareChecksumFiles="Compara si coinciden las sumas de comprobación almacenadas de 2 ficheros." MSG_HELP_ogCopyFile="Copia un fichero a otro almacenamiento." MSG_HELP_ogCreateCache="Reserva espacio para la partición de caché al final del disco 1." @@ -119,7 +122,7 @@ MSG_HELP_ogGetCacheSpace="Devuelve el espacio máximo disponible que puede ser r MSG_HELP_ogGetDiskSize="Devuelve el tamaño del disco." MSG_HELP_ogGetFsSize="Devuelve el tamaño de un sistema de archivos." MSG_HELP_ogGetFsType="Devuelve el mnemónico de tipo de sistema de archivos." -MSG_HELP_ogGetGroupDir="Devuelve el cmaino del directorio por defecto para el grupo del cliente." +MSG_HELP_ogGetGroupDir="Devuelve el camino del directorio por defecto para el grupo del cliente." MSG_HELP_ogGetGroupName="Devuelve el nombre del grupo al que pertenece el cliente." MSG_HELP_ogGetHivePath="Devuelve el camino completo del fichero de una sección del registro de Windows." MSG_HELP_ogGetHostname="Devuelve el nombre de la máquina local." @@ -141,7 +144,11 @@ MSG_HELP_ogGetPath="Devuelve el camino completo de un fichero de sistema OpenGnS MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Windows." MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos." MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal." +MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido." MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows." +MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando." MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones." MSG_HELP_ogHidePartition="Oculta una partición de Windows." MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." @@ -198,6 +205,7 @@ MSG_HELP_ogUnmountAll="Desmonta todos los sistemas de archivos." MSG_HELP_ogUnmountCache="Desmonta el sistema de archivos de caché local." MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount MSG_HELP_ogUnmountImage="Desmonta la imagen" +MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local." MSG_HELP_ogUpdatePartitionTable="Actualiza informacion tabla particiones del disco" MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen en el servidor." @@ -228,7 +236,7 @@ MSG_SCRIPTS_FILE_RENAME=" Renombrar fichero-imagen previo: " MSG_SCRIPTS_CREATE_SIZE=" Calcular espacio (KB) requerido para almacenarlo y el disponible: " # Script updateCache. -MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobamos si Actualizacion - existe una imagen con igual nombre pero distinto sum-" +MSG_SCRIPTS_UPDATECACHE_DOUPDATE="comprovar si es necessari actualitzar el fitxer imatge" MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Comprobar que el tamaño de la cache es mayor que el fichero a descargar." # Script updateCache: para las imágenes sincronizadas tipo dir. MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR="Calculamos el tamaño de la imagen." diff --git a/client/shared/etc/lang.en_GB.conf b/client/shared/etc/lang.en_GB.conf index 98dd7877..e3698328 100644 --- a/client/shared/etc/lang.en_GB.conf +++ b/client/shared/etc/lang.en_GB.conf @@ -10,7 +10,7 @@ MSG_ERR_LOCKED="Resource locked by an operation" MSG_ERR_CACHE="Local cache error" MSG_ERR_NOGPT="The current disc does not contain a GPT partition" MSG_ERR_FILESYS="Unknown or unmounted filesystem" -MSG_ERR_NOTOS="Undetected operating system" +MSG_ERR_NOTOS="Cannot detect or boot the operating system" MSG_ERR_IMAGE="Cannot create or cannot restore an image" MSG_ERR_NOTEXEC="The function or binary is not executable" MSG_ERR_NOTWRITE="Write permission denied" @@ -31,6 +31,7 @@ MSG_ERR_MCASTRECEIVERFILE="Error en la recepcion MULTICAST de un fichero" MSG_ERR_MCASTSENDPARTITION="Error en envio MULTICAST de una particion" MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepcion MULTICAST de un fichero" MSG_ERR_PROTOCOLJOINMASTER="Error in connecting a Unicast|Multicast session to the master" +MSG_ERR_DONTFORMAT="Error al formatear" MSG_ERR_DONTMOUNT_IMAGE="Failed to mount/reduce image" MSG_ERR_DONTUNMOUNT_IMAGE="Failed to unmount image" MSG_ERR_DONTSYNC_IMAGE="Not synchronized image" @@ -40,6 +41,7 @@ MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restaurac # Warning messages. MSG_DONTMOUNT="Unmounted filesystem" MSG_DONTUNMOUNT="Cannot unmount the filesystem" +MSG_MOUNT="Sistema de archivos montado" # Help auxiliary menssages. MSG_64BIT="64 bit" @@ -90,6 +92,7 @@ MSG_HELP_ogBoot="Boot a installed operating system." MSG_HELP_ogCalculateChecksum="Calculate file checksum." MSG_HELP_ogCheckFs="Check a filesystem." MSG_HELP_ogCheckSyncImage="Displays the contents of the image to check it." +MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo." MSG_HELP_ogCompareChecksumFiles="Compare if the checksums match." MSG_HELP_ogCopyFile="Copy a file to other storage." MSG_HELP_ogCreateCache="Reserve space for the cache partition at the end of disc 1." @@ -141,7 +144,11 @@ MSG_HELP_ogGetPath="Return the file full path." MSG_HELP_ogGetRegistryValue="Return a data value from the Windows registry." MSG_HELP_ogGetRepoIp="Return the IP address of an OpenGnsys Repository." MSG_HELP_ogGetServerIp="Return the main OpenGnSys Server IP address." +MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido." MSG_HELP_ogGetWindowsName="Return the client name saved in the Windows registry." +MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando." MSG_HELP_ogHelp="Show the help menssages for functions." MSG_HELP_ogHidePartition="Hide a Windows partition." MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." @@ -198,6 +205,7 @@ MSG_HELP_ogUnmountAll="Unmount all filesystems." MSG_HELP_ogUnmountCache="Unmount the cache filesystem." MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount MSG_HELP_ogUnmountImage="Desmonta la imagen" +MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local." MSG_HELP_ogUpdatePartitionTable="Update info about disk partition table " MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen en el servidor." diff --git a/client/shared/etc/lang.es_ES.conf b/client/shared/etc/lang.es_ES.conf index 9b4afdfd..b3c5b761 100644 --- a/client/shared/etc/lang.es_ES.conf +++ b/client/shared/etc/lang.es_ES.conf @@ -10,7 +10,7 @@ MSG_ERR_LOCKED="Recurso bloqueado por operación de uso exclusivo" MSG_ERR_CACHE="Error en partición de caché local" MSG_ERR_NOGPT="El disco indicado no contiene una partición GPT" MSG_ERR_FILESYS="Sistema de archivos desconocido o no se puede montar" -MSG_ERR_NOTOS="Sistema operativo no instalado o no detectado" +MSG_ERR_NOTOS="Sistema operativo no detectado o no se puede iniciar" MSG_ERR_IMAGE="No se puede crear o restaurar una image de sistema" MSG_ERR_NOTEXEC="Programa o función no ejecutable" MSG_ERR_NOTWRITE="No hay acceso de escritura" @@ -31,6 +31,7 @@ MSG_ERR_MCASTRECEIVERFILE="Error en la recepción Multicast de un fichero" MSG_ERR_MCASTSENDPARTITION="Error en envío Multicast de una partición" MSG_ERR_MCASTRECEIVERPARTITION="Error en la recepción Multicast de un fichero" MSG_ERR_PROTOCOLJOINMASTER="Error en la conexión de una sesión Unicast|Multicast con el Master" +MSG_ERR_DONTFORMAT="Error al formatear" MSG_ERR_DONTMOUNT_IMAGE="Error al montar/reducir la imagen" MSG_ERR_DONTUNMOUNT_IMAGE="Error al desmontar la imagen" MSG_ERR_DONTSYNC_IMAGE="Imagen no sincronizable" @@ -40,6 +41,7 @@ MSG_ERR_SYNCHRONIZING="Error al sincronizar, puede afectar la creacion|restaurac # Mensajes de avisos. MSG_DONTMOUNT="Sistema de archivos no montado" MSG_DONTUNMOUNT="El sistema de archivos no se puede desmontar o no está montado" +MSG_MOUNT="Sistema de archivos montado" # Mensajes complementarios para las ayudas. MSG_64BIT="64 bits" @@ -90,6 +92,7 @@ MSG_HELP_ogBoot="Arranca un sistema operativo instalado." MSG_HELP_ogCalculateChecksum="Calcula la suma de comprobación (checksum) de un fichero." MSG_HELP_ogCheckFs="Comprueba la consistencia de un sistema de archivos." MSG_HELP_ogCheckSyncImage="Muestra el contenido de la imagen para comprobarla." +MSG_HELP_ogCleanOs="Elimina los archivos que no son necesarios en el sistema operativo." MSG_HELP_ogCompareChecksumFiles="Compara si coinciden las sumas de comprobación almacenadas de 2 ficheros." MSG_HELP_ogCopyFile="Copia un fichero a otro almacenamiento." MSG_HELP_ogCreateCache="Reserva espacio para la partición de caché al final del disco 1." @@ -119,7 +122,7 @@ MSG_HELP_ogGetCacheSpace="Devuelve el espacio máximo disponible que puede ser r MSG_HELP_ogGetDiskSize="Devuelve el tamaño del disco." MSG_HELP_ogGetFsSize="Devuelve el tamaño de un sistema de archivos." MSG_HELP_ogGetFsType="Devuelve el mnemónico de tipo de sistema de archivos." -MSG_HELP_ogGetGroupDir="Devuelve el cmaino del directorio por defecto para el grupo del cliente." +MSG_HELP_ogGetGroupDir="Devuelve el camino del directorio por defecto para el grupo del cliente." MSG_HELP_ogGetGroupName="Devuelve el nombre del grupo al que pertenece el cliente." MSG_HELP_ogGetHivePath="Devuelve el camino completo del fichero de una sección del registro de Windows." MSG_HELP_ogGetHostname="Devuelve el nombre de la máquina local." @@ -141,7 +144,11 @@ MSG_HELP_ogGetPath="Devuelve el camino completo de un fichero de sistema OpenGnS MSG_HELP_ogGetRegistryValue="Devuelve el dato de un valor del registro de Windows." MSG_HELP_ogGetRepoIp="Devuelve la dirección IP del repositorio de datos." MSG_HELP_ogGetServerIp="Devuelve la dirección IP del servidor principal." +MSG_HELP_ogGetSizeParameters="Devuelve el tamaño de los datos de un sistema de ficheros, el espacio necesario para la imagen y si cabe en el repositorio elegido." MSG_HELP_ogGetWindowsName="Devuelve el nombre del cliente guardado en el registro de Windows." +MSG_HELP_ogGrubAddOgclient="Incluye en el grub del MBR una entrada llamando al cliente de opengnsys." +MSG_HELP_ogGrubDeleteEntry="Borra en el grub del MBR las entradas para el inicio en una particion." +MSG_HELP_ogGrubHidePartitions="Configura el grub del MBR para que oculte las particiones de windows que no se esten iniciando." MSG_HELP_ogHelp="Muestra mensajes de ayudas para las funciones." MSG_HELP_ogHidePartition="Oculta una partición de Windows." MSG_HELP_ogIdToType="Devuelve el mnemónico asociado al identificador de tipo de partición." @@ -198,6 +205,7 @@ MSG_HELP_ogUnmountAll="Desmonta todos los sistemas de archivos." MSG_HELP_ogUnmountCache="Desmonta el sistema de archivos de caché local." MSG_HELP_ogUnmountFs=$MSG_HELP_ogUnmount MSG_HELP_ogUnmountImage="Desmonta la imagen" +MSG_HELP_ogUpdateCacheIsNecesary="Comprueba si es necesario actualizar una archivo en la cache local." MSG_HELP_ogUpdatePartitionTable="Actualiza información de la tabla de particiones del disco" MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen en el servidor." @@ -205,6 +213,7 @@ MSG_HELP_ogWaitMountImage="Se espera un tiempo estimado a que se monte la imagen MSG_HELP_configureOs="Post-configura de arranque del sistema" MSG_HELP_createBaseImage="Genera imagen básica de la partición" MSG_HELP_createDiffImage="Genera imagen diferencial de la partición respecto a la imagen básica" +MSG_HELP_installOfflineMode="Prepara el equipo cliente para el modo offline." MSG_HELP_partclone2sync="Convierte imagen de partclone en imagen sincronizable." MSG_HELP_restoreBaseImage="Restaura una imagen básica en una partición" MSG_HELP_restoreDiffImage="Restaura una imagen diferencial en una partición" @@ -228,7 +237,7 @@ MSG_SCRIPTS_FILE_RENAME=" Renombrar fichero-imagen previo: " MSG_SCRIPTS_CREATE_SIZE=" Calcular espacio (KB) requerido para almacenarlo y el disponible: " # Script updateCache. -MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobar si actualización -existe una imagen con igual nombre pero distinto sum-" +MSG_SCRIPTS_UPDATECACHE_DOUPDATE="Comprobar si es necesario actualizar el fichero imagen " MSG_SCRIPTS_UPDATECACHE_CHECKSIZECACHE="Comprobar que el tamaño de la caché es mayor que el fichero a descargar." # Script updateCache: para las imágenes sincronizadas tipo dir. MSG_SCRIPTS_UPDATECACHE_CHECKSIZEDIR="Calcular el tamaño de la imagen." diff --git a/client/shared/etc/preinit/default.sh b/client/shared/etc/preinit/default.sh index 0c697b65..2624edc4 100755 --- a/client/shared/etc/preinit/default.sh +++ b/client/shared/etc/preinit/default.sh @@ -5,7 +5,7 @@ set -a source /opt/opengnsys/etc/preinit/loadenviron.sh # Scripts de inicio. -for f in fileslinks loadmodules mountrepo poweroff otherservices; do +for f in fileslinks loadmodules metadevs mountrepo poweroff otherservices; do $OGETC/preinit/$f.sh done unset f diff --git a/client/shared/etc/preinit/loadenviron.sh b/client/shared/etc/preinit/loadenviron.sh index f5f45628..b165ecfd 100755 --- a/client/shared/etc/preinit/loadenviron.sh +++ b/client/shared/etc/preinit/loadenviron.sh @@ -119,6 +119,7 @@ export OG_ERR_NOGPT=22 # El disco indicado no contiene una particion GPT export OG_ERR_IMGSIZEPARTITION=30 # Error al restaurar partición más pequeña que la imagen export OG_ERR_UPDATECACHE=31 # Error al realizar el comando updateCache +export OG_ERR_DONTFORMAT=32 # Error al formatear export OG_ERR_GENERIC=40 # Error imprevisto no definido export OG_ERR_UCASTSYNTAXT=50 # Error en la generación de sintaxis de transferenica UNICAST export OG_ERR_UCASTSENDPARTITION=51 # Error en envío UNICAST de partición @@ -137,3 +138,4 @@ export OG_ERR_DONTSYNC_IMAGE=71 # Imagen no sincronizable (es monolitica) export OG_ERR_DONTUNMOUNT_IMAGE=72 # Error al desmontar la imagen export OG_ERR_NOTDIFFERENT=73 # No se detectan diferencias entre la imagen basica y la particion. export OG_ERR_SYNCHRONIZING=74 # Error al sincronizar, puede afectar la creacion/restauracion de la imagen + diff --git a/client/shared/etc/preinit/loadmodules.sh b/client/shared/etc/preinit/loadmodules.sh index 3d03b247..ded35393 100755 --- a/client/shared/etc/preinit/loadmodules.sh +++ b/client/shared/etc/preinit/loadmodules.sh @@ -5,6 +5,9 @@ #@version 1.0 #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2010-01-26 +#@version 1.0.5 - Cargar módulos específicos para el cliente. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-11-11 #*/ @@ -13,4 +16,8 @@ echo "${MSG_LOADMODULES:-.}" # Módulo del ratón. modprobe psmouse 2>/dev/null +# Cargar módulos específicos del kernel del cliente. +for m in $OGLIB/modules/$(uname -r)/*.ko; do + [ -r $m ] && insmod $m &>/dev/null +done diff --git a/client/shared/etc/preinit/metadevs.sh b/client/shared/etc/preinit/metadevs.sh new file mode 100755 index 00000000..d9b12d45 --- /dev/null +++ b/client/shared/etc/preinit/metadevs.sh @@ -0,0 +1,28 @@ +#!/bin/bash +#/** +#@file metadevs.sh +#@brief Script de inicio para detectar metadispositivos LVM y RAID. +#@note Desglose del script "loadenviron.sh". +#@warning License: GNU GPLv3+ +#@version 0.9 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2009-10-10 +#@version 0.9.4 +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2010-04-19 +#*/ + + +# Si está configurado OpenGNSys ... +if [ -n "$OPENGNSYS" ]; then + echo "$MSG_DETECTLVMRAID" + # Detectar metadispositivos LVM. + vgchange -ay &>/dev/null + # Detectar metadispositivos RAID. + dmraid -ay &>/dev/null +else + # FIXME Error: entorno de OpenGNSys no configurado. + echo "Error: OpenGNSys environment is not configured." # FIXME: definir mensaje. + exit 1 +fi + diff --git a/client/shared/etc/preinit/mountrepo.sh b/client/shared/etc/preinit/mountrepo.sh index 9b0aebaa..62b1107e 100755 --- a/client/shared/etc/preinit/mountrepo.sh +++ b/client/shared/etc/preinit/mountrepo.sh @@ -12,7 +12,7 @@ OGIMG=${OGIMG:-/opt/opengnsys/images} ROOTREPO=${ROOTREPO:-"$ROOTSERVER"} # TODO Revisar proceso de arranque para no montar 2 veces el repositorio. -if [ $ogactiveadmin == "true" ]; then +if [ "$ogactiveadmin" == "true" ]; then export boot=admin # ATENCIÓN: siempre en modo "admin". umount $OGIMG 2>/dev/null @@ -25,6 +25,29 @@ if [ $ogactiveadmin == "true" ]; then PASS=${PASS:-"og"} mount.cifs //${ROOTREPO}/ogimages $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS ;; + local) # TODO: hacer funcion dentro de este script que monte smb + # Comprobamos que estatus sea online. + if [ "$ogstatus" == "offline" -o "$SERVER" == "" ]; then + # Si estatus es offline buscamos un dispositivo con etiqueta repo + # y si no existe montamos la cache como repo (si existe). + TYPE=$(blkid | grep REPO | awk -F"TYPE=" '{print $2}' | tr -d \") + if [ "$TYPE" == "" ]; then + [ -d $OGCAC/$OGIMG ] && mount --bind $OGCAC/$OGIMG $OGIMG + else + mount -t $TYPE LABEL=REPO $OGIMG &>/dev/null + fi + else + # Comprobamos que existe un servicio de samba. + smbclient -L $SERVER -N &>/dev/null + if [ $? -eq 0 ]; then + PASS=$(grep "^[ ]*\(export \)\?OPTIONS=" /scripts/ogfunctions 2>&1 | \ + sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/') + PASS=${PASS:-"og"} + mount.cifs //${ROOTREPO}/ogimages $OGIMG -o rw,serverino,acl,username=opengnsys,password=$PASS + fi + # TODO: buscar condicion para NFS + fi + ;; esac fi diff --git a/client/shared/scripts/cloneRemoteFromMaster b/client/shared/scripts/cloneRemoteFromMaster index 64f511d6..9aedefde 100755 --- a/client/shared/scripts/cloneRemoteFromMaster +++ b/client/shared/scripts/cloneRemoteFromMaster @@ -54,6 +54,9 @@ #@version 1.0.3 - Habilita el uso de la variable OGWINREDUCE=TRUE|TRUE para reducir el sistema de archivos a enviar #@author Antonio J. Doblas Viso. Universidad de Malaga. #@date 2011/12/22 +#@version 1.0.6 - Uso de la funcion ogExecuteAndLog +#@author Antonio J. Doblas Viso. Universidad de Malaga. +#@date 2012/02/12 #*/ ## #test 1. cliente sin particiones. Detectado TODO: crear estrucutras de particiones @@ -63,25 +66,35 @@ #test 5. master sin origen particion. #test 6. master sin origen fichero. -#Carga del configurador del engine -[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg - +TIME1=$SECONDS +PROG="$(basename $0)" trap "pkill faucet; exit 1" 0 1 2 3 6 9 14 15 -TIME1=$SECONDS -PROG="$(basename $0)" +#AYUDA if [ $# -lt 1 -o "$1" == "help" ]; then - echo "cloneRemoteFromMaster ipmaster disk init [MULTICAST|UNICAST] session disk part tool comp" - exit 1 + echo "cloneRemoteFromMaster ipmaster disk init [MULTICAST|UNICAST] session disk part tool comp" + exit 1 fi -if [ $# -lt 6 ]; then - ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ipMaster SOURCE_disco SOURCE_particion [MULTICAT|UNICAST] SESSION TARGER_disck TARGET_partition" +#ERROR +if [ $# -lt 6 ]; then + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG ipMaster SOURCE_disco SOURCE_particion [MULTICAST|UNICAST] SESSION TARGET_disk TARGET_partition" exit $? fi -# Obtener información de los parámetros de entrada. +#Load engine configurator from engine.cfg file. +#Carga el configurador del engine desde el fichero engine.cfg +# Valores por defecto: #IMGPROG="partclone" ; #IMGCOMP="lzop" ; #IMGEXT="img" #IMGREDUCE="TRUE" +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg + +# Clear temporary file used as log track by httpdlog +# Limpia los ficheros temporales usados como log de seguimiento para httpdlog +echo " " > $OGLOGCOMMAND + +ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" + +# Procesar parámetros de entrada HOSTIP=`ogGetIpAddress` if [ -z "$HOSTIP" ] then @@ -115,7 +128,7 @@ pkill faucet # Preparando Instrucción según sea Master o Client case $MASTERIP in $HOSTIP) - echo "[1] Equipo Master preparando el origen de los datos a enviar" + ogEcho log session "[1] Equipo Master preparando el origen de los datos a enviar" ogGetPath $2 $3.img &>/dev/null; RC=$?; ogDiskToDev $2 $3 &>/dev/null; RETVAL=$?; @@ -168,15 +181,13 @@ case $MASTERIP in fi case "${PROTOCOL^^}" in MULTICAST) - ogEcho log session "[29] Transferencia Multicast" - ogEcho log "ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR" - ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR || RETVAL=$? + ogEcho log session "[29] Transferencia Multicast: ogMcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONMCASTSERVER $TOOLCLONE $COMPRESOR " + ogExecAndLog session "ogMcastSendPartition" "$DISKSOURCE" "$PARTSOURCE" "$SESSIONMCASTSERVER" "$TOOLCLONE" "$COMPRESOR" || RETVAL=$? ;; UNICAST) sleep 60 - ogEcho log session "[29] Transferencia Unicast" - ogEcho log "ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR" - ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR || RETVAL=$? + ogEcho log session "[29] Transferencia Unicast: ogUcastSendPartition $DISKSOURCE $PARTSOURCE $SESSIONUCASTSERVER $TOOLCLONE $COMPRESOR" + ogExecAndLog session "ogUcastSendPartition" "$DISKSOURCE" "$PARTSOURCE" "$SESSIONUCASTSERVER" "$TOOLCLONE" "$COMPRESOR" || RETVAL=$? ;; esac @@ -264,8 +275,8 @@ case $MASTERIP in SIZEIMAGE=$(echo $INFOEXTRA | awk '{print $4}') ogEcho log "$INFOEXTRA = herramienta= $TOOLCLONE compresor= $COMPRESOR size= $SIZEIMAGE" ogMount $DISKTARGET $PARTTARGET || ogFormat $DISKTARGET $PARTTARGET - SIZEPARTTARGET=$(parted `ogDiskToDev $DISKTARGET $PARTTARGET` unit kB print | grep Disk | awk -F" " '{print $3}' | tr -d kB); - + #SIZEPARTTARGET=$(parted `ogDiskToDev $DISKTARGET $PARTTARGET` unit kB print | grep Disk | awk -F" " '{print $3}' | tr -d kB); + SIZEPARTTARGET=$(ogGetPartitionSize $DISKTARGET $PARTTARGET ) ogEcho log session "[28] comprobando que el tamaño de la imagen $SIZEIMAGE es menor que el de la particion destino $SIZEPARTTARGET" # comprobamos que el tamaño de a imagen es menor que la del cliente. if [ "$SIZEIMAGE" -lt "$SIZEPARTTARGET" ] @@ -274,15 +285,23 @@ case $MASTERIP in case "${PROTOCOL^^}" in MULTICAST) ogEcho log session "ogMcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONMCASTCLIENT $TOOLCLONE $COMPRESOR" - ogMcastReceiverPartition "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_MCASTRECEIVERPARTITION " l251 "; echo $?) + ogExecAndLog command "ogMcastReceiverPartition" "$DISKTARGET" "$PARTTARGET" "$SESSIONMCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_MCASTRECEIVERPARTITION " l251 "; echo $?) ;; UNICAST) ogEcho log session "ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR" - ogUcastReceiverPartition $DISKTARGET $PARTTARGET $SESSIONUCASTCLIENT $TOOLCLONE $COMPRESOR || exit $(ogRaiseError $OG_ERR_UCASTRECEIVERPARTITION " l230 "; echo $?) + ogExecAndLog command "ogUcastReceiverPartition" "$DISKTARGET" "$PARTTARGET" "$SESSIONUCASTCLIENT" "$TOOLCLONE" "$COMPRESOR" || exit $(ogRaiseError $OG_ERR_UCASTRECEIVERPARTITION " l230 "; echo $?) ;; esac - ogEcho log session "[90] llamando a configureOS $DISKTARGET $PARTTARGET" - configureOs $DISKTARGET $PARTTARGET + if which configureOsCustom &>/dev/null; then + ogEcho log session "[90] configureOsCustom $DISKTARGET $PARTTARGET" + # Si $2 = num_disk las varibles REPO IMGNAME estan vacias + ! [[ $2 =~ ^[0-9]+$ ]] && REPO="$2" && IMGNAME="$3" + configureOsCustom $DISKTARGET $PARTTARGET $REPO $IMGNAME + else + ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE $DISKTARGET $PARTTARGET" + configureOs $DISKTARGET $PARTTARGET + fi + else # Si el tamaño de los datos recibidos es más grande que la particion destino ogRaiseError $OG_ERR_IMGSIZEPARTITION "ERROR tamanio particion= $SIZEPARTTARGET menor que la imagen= $SIZEIMAGE"; exit $? diff --git a/client/shared/scripts/configureOs b/client/shared/scripts/configureOs index ba5ee735..2aa5288d 100755 --- a/client/shared/scripts/configureOs +++ b/client/shared/scripts/configureOs @@ -23,6 +23,9 @@ #@version 1.0.4 - Inyecta el cliente para gestión del sistema operativo. #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2012-04-11 +#@version 1.0.5 - Postconfiguración para Mac OS X. +#@author Ramon Gomez, ETSII Universidad de Sevilla +#@date 2013-10-11 # Carga el configurador del engine y los parámetros de red. [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg @@ -32,20 +35,29 @@ PARTSIZE=$(ogGetPartitionSize $1 $2) || exit $? FSSIZE=$(ogGetFsSize $1 $2) if [ $FSSIZE -lt $PARTSIZE ]; then - echo "Extender sistema de archivos." - ogExtendFs $1 $2 + echo "Extender sistema de archivos." + ogExtendFs $1 $2 fi # Si no existe partición activa, activar este sistema. FLAGACTIVE=$(ogGetPartitionActive $1) [ -z $FLAGACTIVE ] && ogSetPartitionActive $1 $2 +# Si el sistema de archivos es de solo lectura, no hacer la post-configuración. +MNTDIR=$(ogMount $1 $2) +if ! ogIsWritable $1 $2; then + echo "AVISO: sistema de archivos de solo lectura, no se ejecuta postconfiguración." + exit +fi + +# Nombre del cliente. +HOST="$(ogGetHostname)" + # Post-configuración personalizada para cada tipo de sistema operativo. OSTYPE="$(ogGetOsType $1 $2)" case "$OSTYPE" in - Windows) + Windows) # Postconfiguración de Windows. # Cambiar nombre en sistemas Windows. - HOST=$(ogGetHostname) HOST=${HOST:-"pc"} ogSetWindowsName $1 $2 "$HOST" # Descomentar la siguiente línea para cambiar usuario de inicio. @@ -57,15 +69,99 @@ case "$OSTYPE" in # Registrar en Windows que la partición indicada es su nueva unidad C:\ ogWindowsRegisterPartition $1 $2 C $1 $2 #ogLoadHiveWindows $1 $2; ogSetWindowsChkdisk $OGWINCHKDISK; ogUpdateHiveWindows - # Instalar cliente para Windows (no activar en sistema en produccion ver ticket 604). - ogInstallMiniSetup $1 $2 postconf.cmd - ogInstallWindowsClient $1 $2 postconf.cmd + # Instalar cliente para Windows si se indica en la variable INSTALLOSCLIENT. + if [ "${INSTALLOSCLIENT^^}" == "TRUE" ]; then + ogInstallMiniSetup $1 $2 postconf.cmd + ogInstallWindowsClient $1 $2 postconf.cmd + fi ;; - Linux) + Linux) # Postconfiguración de GNU/Linux. ## Install and Configure Grub based on OS installed and Grub 1st stage location. ogGrubInstallPartition $1 $2 - # Instalar cliente para Linux. - ogInstallLinuxClient $1 $2 + # Instalar cliente para GNU/Linux si se indica en la variable INSTALLOSCLIENT. + if [ "${INSTALLOSCLIENT^^}" == "TRUE" ]; then + ogInstallLinuxClient $1 $2 + fi + ;; + MacOS) # Postconfiguración de Mac OS X. + # Fichero indicador de activación de postconfiguración. + touch $MNTDIR/osxpostconf + + # Crear fichero de configuración del servicio de arranque. + cat << EOT >$MNTDIR/Library/LaunchDaemons/es.opengnsys.postconfd.plist +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> + <dict> + <key>Label</key> + <string>es.opengnsys.postconfd.sh</string> + <key>ProgramArguments</key> + <array> + <string>/var/root/postconfd.sh</string> + </array> + <key>RunAtLoad</key> + <true/> + <key>StandardOutPath</key> + <string>/var/log/postconfd.log</string> + <key>StandardErrorPath</key> + <string>/var/log/postconfd.err</string> + <key>Debug</key> + <true/> + </dict> +</plist> +EOT + + # Programa de inicio que será ejecutado en el arranque de Mac OS X. + cat << EOT >$MNTDIR/var/root/postconfd.sh +#!/bin/bash +# postconfd - ejecución de scripts de inicio. + +# Ejecutar postconfiguración si existe el fichero indicador. +if [ -e /osxpostconf ]; then + ### NOTA: descomentar las opciones deseadas. + # Activar Journaling en HFS+ (no usar si el cliente continua en OpenGnsys). + #diskutil enableJournal disk$[$1-1]s$2 + # Pedir usuario y clave en pantalla de conexión. + #defaults write /Library/Preferences/com.apple.loginwindow SHOWFULLNAME -bool yes + # No mostrar botón de cambio rápido de usuario. + #defaults write /Library/Preferences/.GlobalPreferences MultipleSessionEnabled -bool NO + # Bloquear escritorio, fondo, dock, etc del usuario "usuario". + #chflags uchange /Users/usuario/Library/Preferences/com.apple.desktop.plist + #chflags uchange /Users/usuario/Library/Preferences/com.apple.dock.plist + #chflags uchange /Users/usuario/Desktop + # Añadir usuario "usuario" a la lista de desarrolladores de Xcode. + #DevToolsSecurity --enable + #dscl . -append /Groups/_developer GroupMembership usuario + # Bajar volumen (valor entre 0 y 7). + #osascript -e 'set volume 1' + # Tomar nombre del equipo. + HOST="$HOST" + if [ -z "\$HOST" ]; then + # Si no hay nombre asociado, activar la red para obtener datos del DHCP. + source /etc/rc.common + CheckForNetwork + while [ "\$NETWORKUP" != "-YES-" ]; do + sleep 5 + NETWORKUP= + CheckForNetwork + done + # Componer nombre del equipo a partir de datos del DHCP. + IP=\$(ifconfig en0 inet | awk '{if (\$1=="inet") print \$2}') + HOST="mac-\$(echo \${IP//./-} | cut -f3-4 -d-)" + fi + # Asignar nombre del equipo. + scutil --set ComputerName "\$HOST" + scutil --set LocalHostName "\$HOST" + scutil --set HostName "\$HOST" + hostname "\$HOST" + # Descromprimir ficheros de versión para obtener inventario de aplicaciones. + find /Applications -type d -name "*.app" -prune -exec \ + ditto --nopreserveHFSCompression "{}/Contents/version.plist" "{}/Contents/version.plist.uncompress" + # Borrar fichero indicador de psotconfiguración + rm -f /osxpostconf +fi +EOT + # Dar permiso de ejecución. + chmod 700 $MNTDIR/var/root/postconfd.sh ;; esac diff --git a/client/shared/scripts/configureOsCustom.template b/client/shared/scripts/configureOsCustom.template index a9573cae..691b95b9 100644 --- a/client/shared/scripts/configureOsCustom.template +++ b/client/shared/scripts/configureOsCustom.template @@ -1,12 +1,30 @@ #!/bin/bash -# configureOsCustom.template -# Plantilla para fichero de configuración del cliente tras restaurar una imagen. -# Recibe los mismos parámetros que el script "configureOsCustom". -# Nota: para usar este fichero, renombrar como "createImageCustomPost". +#/** +# configureOsCustom +#@brief Plantilla para scirpt de configuracion personalizada de sistema operativo restaurado. +#@param $1 nº de disco +#@param $2 nº de partición +#@param $3 Repositorio: CACHE, REPO o dirección IP (opcional) +#@param $4 Nombre canónico de la imagen sin extensión (opcional) +#@warning Renombrar este fichero como "configureOsCustom" para sustituir al script estándar "configureOs". +#@note Los parámetros disco y partición son obligatorios y opcionalmente puede recibir también el repositorio y la imagen usada para en el despliegue. +#**/ # Control de parámetros. -[ $# -ne 4 ] || exit +[ $# -eq 2 -o $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: configureOsCustom int_ndisc int_npart [str_repo str_imgname]" || exit $? +# Parámetros obligatorios. +DISK="$1" # Nº de disco. +PART="$2" # Nº de partición. +# Parámetros opcionales. +REPO="${3^^}" # Repositorio (en mayúsculas). +IMGNAME="$4" # Nombre canónico de imagen (sin extensión). + + +# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). + +# Paso 1: Añadir aquí el código personalizado de postconfiguración. +# Nota: puede llamarse al script estandar "configureOs", pero el orden de aplicación de los comandos puede ser importante. diff --git a/client/shared/scripts/createBaseImage b/client/shared/scripts/createBaseImage index b9a3c557..ed9255b4 100755 --- a/client/shared/scripts/createBaseImage +++ b/client/shared/scripts/createBaseImage @@ -40,19 +40,6 @@ TIME1=$SECONDS #Carga el configurador del engine desde el fichero engine.cfg [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg -# Factor de calculo de Time out al crear imagen: valor por defecto en engine.cfg -CREATESPEED=${CREATESPEED:-"100000*4"} - -# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision -KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') -[ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS="BTRFS" - -# % de compresion para estimacion tamaño imagen IMGFS="EXT4" -ZSYNC=${ZSYNC:-"120"} - -# Si IMGFS="BTRFS" la compresion es mayor. -[ $IMGFS == "BTRFS" ] && let ZSYNC=$ZSYNC-30 - PROG="$(basename $0)" # Si se solicita, mostrar ayuda. if [ "$*" == "help" ]; then @@ -66,12 +53,12 @@ fi # Limpiamos fichero de log echo " " > $OGLOGCOMMAND -[ "$(ogGetCaller)" == "RestaurarImagenBasica" ] || echo -n ""> $OGLOGSESSION +[ "$(ogGetCaller)" == "CrearImagenBasica" ] || echo -n ""> $OGLOGSESSION ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" # Valores por defecto en etc/engine.cfg -IMGEXT="img" +IMGEXT=${IMGEXT:-"img"} REPOIP=$(ogGetRepoIp) @@ -97,29 +84,14 @@ ogCheckFs $1 $2 &> $OGLOGCOMMAND || exit $(ogRaiseError session $OG_ERR_PARTITIO ORIG=$(ogMount $1 $2) || exit $(ogRaiseError session $OG_ERR_PARTITION "$1 $2" ; echo $?) # Borramos ficheros de paginacion y configuracion -case "$(ogGetFsType $1 $2)" in - EXT[234]) - ogCleanLinuxDevices $1 $2 - rm -rf $ORIG/tmp/* - ;; - NTFS) - [ $(ogGetPath $1 $2 pagefile.sys) ] && ogDeleteFile $1 $2 pagefile.sys - [ $(ogGetPath $1 $2 hiberfil.sys) ] && ogDeleteFile $1 $2 hiberfil.sys - [ $(ogGetPath $1 $2 swapfile.sys) ] && ogDeleteFile $1 $2 swapfile.sys - ;; -esac +ogCleanOs $1 $2 #Comprobar espacio que requerira la imagen para ser almacenada -SIZEDATA=$(df -k | grep $PART | awk '{print $3}') -#Aplicar factor de compresion -let SIZEREQUIRED=$SIZEDATA*$ZSYNC/100 -# El tamaño mínimo del sistema de ficheros btrfs es 250M, ponemos 300 -[ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000 -#Comprobar espacio libre en el contenedor. -[ "$3" == "CACHE" -o "$3" == "cache" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) -[ "$3" == "REPO" -o "$3" == "repo" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}') -ogEcho log session " $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED $SIZEFREE" -[ $SIZEREQUIRED -gt $SIZEFREE ] && exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?) +read SIZEDATA SIZEREQUIRED ISENOUGHSPACE <<< $(ogGetSizeParameters $1 $2 "$3" SYNC) + +ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED" +[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?) + IMGDIR="$(ogGetParentPath "$3" "/$4")" IMGFILE=${IMGDIR[$3]}/$(basename "/$4").$IMGEXT @@ -128,9 +100,11 @@ echo " " > $OGLOGCOMMAND TIME2=$SECONDS ogEcho log session "[40] $MSG_HELP_ogCreateImage $1 $2 $3 $4 " + # Si existe el fichero de la imagen se hace copia de seguridad y se redimensiona, si no existe se crea. +# Bloqueo la imagen. Si esta en modo lectura dara error y nos salimos ogEcho log session "[50] $MSG_HELP_ogCreateFileImage." -ogLockImage "$3" "/$4.$IMGEXT" +ogLockImage "$3" "/$4.$IMGEXT" || exit $? ogCreateFileImage $3 "$4" $IMGEXT $SIZEREQUIRED # Creamos la lista del contenido y lo situamos en la particion a copiar. diff --git a/client/shared/scripts/createDiffImage b/client/shared/scripts/createDiffImage index 32784012..862c05c8 100755 --- a/client/shared/scripts/createDiffImage +++ b/client/shared/scripts/createDiffImage @@ -43,16 +43,6 @@ function onexit() { #Carga el configurador del engine desde el fichero engine.cfg [ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg -# Factor de calculo de Time out al crear imagen: valor por defecto en engine.cfg -CREATESPEED=${CREATESPEED:-"100000*4"} -# Sistema de fichero de la imagen según kernel, menor que 3.7 EXT4. comparamos revision -KERNELVERSION=$(uname -r| awk '{printf("%d",$1);sub(/[0-9]*\./,"",$1);printf(".%02d",$1)}') -[ $KERNELVERSION \< 3.07 ] && IMGFS="EXT4" || IMGFS="BTRFS" -# % de compresion para estimacion tamaño imagen IMGFS="EXT4" -ZSYNC=${ZSYNC:-"120"} -# Si IMGFS="BTRFS" la compresion es mayor. -[ $IMGFS == "BTRFS" ] && let ZSYNC=$ZSYNC-30 - TIME1=$SECONDS PROG="$(basename $0)" @@ -105,8 +95,9 @@ ORIG=$(ogMount $1 $2) || exit $(ogRaiseError session $OG_ERR_PARTITION "$1 $2" DIFFDIR="$(ogGetParentPath "$3" "/$5")" DIFFFILE="$DIFFDIR/$5.$DIFFEXT" -ogLockImage "$3" "/$4.$IMGEXT" -ogLockImage "$3" "/$5.$DIFFEXT" +# Bloqueo las imagenes -> Si no hay acceso de escritura dara error y nos saldremos. +ogLockImage "$3" "/$4.$IMGEXT" || exit $? +ogLockImage "$3" "/$5.$DIFFEXT" || exit $? # Comprobar consistencia del sistema de archivos. echo " " > $OGLOGCOMMAND @@ -116,18 +107,7 @@ ogUnmount $1 $2 ogCheckFs $1 $2 >$OGLOGCOMMAND || exit $(ogRaiseError session $OG_ERR_PARTITION "ogCheckFs $1 $2" ; echo $?) # Borramos ficheros de paginacion y configuracion -FSTYPE=$(ogGetFsType $1 $2) -case "$FSTYPE" in - EXT[234]) - ogCleanLinuxDevices $1 $2 - rm -rf $ORIG/tmp/* - ;; - NTFS) - [ $(ogGetPath $1 $2 pagefile.sys) ] && ogDeleteFile $1 $2 pagefile.sys - [ $(ogGetPath $1 $2 hiberfil.sys) ] && ogDeleteFile $1 $2 hiberfil.sys - [ $(ogGetPath $1 $2 swapfile.sys) ] && ogDeleteFile $1 $2 swapfile.sys - ;; -esac +ogCleanOs $1 $2 # Crear la imagen. echo " " > $OGLOGCOMMAND @@ -142,36 +122,23 @@ ogMountImage $3 "$4" $IMGEXT >/dev/null ogWaitSyncImage $3 "$4" $IMGEXT "mounted" || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$3 $4 $IMGEXT: time_out."; echo $?) # Creamos la informacion de la imagen. -ogEcho log session "[50] $MSG_HELP_ogCreateInfoImage " +ogEcho log session "[45] $MSG_HELP_ogCreateInfoImage " ogCreateInfoImage $1 $2 $3 "$4" "${DIFFTYPE}" [ $? -eq $OG_ERR_NOTDIFFERENT ] && exit $(ogRaiseError session $OG_ERR_NOTDIFFERENT; echo $?) +#Comprobar espacio que requerira la imagen para ser almacenada +read SIZEDATA SIZEREQUIRED ISENOUGHSPACE <<< $(ogGetSizeParameters $1 $2 "$3" DIFF) + +ogEcho log session "[50] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED" +[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?) + #Calculamos el tamaño de la imagen: ogMount $1 $2 >/dev/null ogLock $1 $2 -ogEcho log session " $MSG_SCRIPTS_CREATE_SIZE" -cd $ORIG -SIZEDATA=$(grep -v "\/$" /tmp/ogimg.info | tr '\n' '\0'| du -x -c --files0-from=- 2>/dev/null|tail -n1 |cut -f1) -let SIZEREQUIRED=$SIZEDATA*$ZSYNC/100 -# Tamaño minimo fichero imagen 300000 -[ $SIZEREQUIRED -lt 300000 ] && SIZEREQUIRED=300000 - -# Comprueba que quepa en el repositorio -[ "$3" == "CACHE" -o "$3" == "cache" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) && ogMountCache >/dev/null -[ "$3" == "REPO" -o "$3" == "repo" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}') -ogEcho log session " $SIZEREQUIRED $SIZEFREE" -[ $SIZEREQUIRED -gt $SIZEFREE ] && exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?) TIMEAUX3=$[SECONDS-TIME2] ogEcho log session " $MSG_SCRIPTS_TASK_END $MSG_SCRIPTS_TIME_PARTIAL: $[TIMEAUX3/60]m $[TIMEAUX3%60]s" -# Del fichero de acl de la partición extraemos las acl de los ficheros de la diferencial -if [ "$FSTYPE" == "NTFS" ]; then - ogEcho log session "[55] $MSG_HELP_ogAclFilter " - ogAclFilter - TIMEAUX4=$[SECONDS-TIMEAUX3] - ogEcho log session " $MSG_SCRIPTS_TASK_END $MSG_SCRIPTS_TIME_PARTIAL: $[TIMEAUX4/60]m $[TIMEAUX4%60]s" -fi TIMEAUX5=$[SECONDS-TIMEAUX3] # Configuro la informacion del tamaño de los datos en /tmp/ogimg.info @@ -202,7 +169,6 @@ ogWaitSyncImage "$3" "$5" $DIFFTYPE "reduced" $SIZEREQUIRED || exit $(ogRaiseErr echo " " > $OGLOGCOMMAND # Comprobamos que la imagen esta bien ogEcho log session "[95] $MSG_HELP_ogCheckSyncImage" -sleep 10 ogCheckSyncImage $3 "$5" diff || exit $(ogRaiseError session $OG_ERR_IMAGE "$3 $5 diff"; echo $?) #resumen de la operacion diff --git a/client/shared/scripts/createImage b/client/shared/scripts/createImage index df98ec5b..7c6ed5bb 100755 --- a/client/shared/scripts/createImage +++ b/client/shared/scripts/createImage @@ -53,7 +53,7 @@ TIME1=$SECONDS # Valores por defecto en etc/engine.cfg #IMGPROG="partclone" #IMGCOMP="lzop" -#IMGEXT="img" +IMGEXT=${IMGEXT:-"img"} #IMGREDUCE="TRUE" # Clear temporary file used as log track by httpdlog @@ -63,7 +63,7 @@ echo " " > $OGLOGSESSION; echo " " > $OGLOGCOMMAND; echo " " > ${OGLOGCOMMAND}.t ogEcho log session "[1] $MSG_SCRIPTS_START $0 $*" # Si el repositorio es CACHE comprobamos que exista -if [ "$3" == "CACHE" -o "$3" == "cache" ]; then +if [ "${3^^}" == "CACHE" ]; then ! ogFindCache >/dev/null && exit $(ogRaiseError $OG_ERR_NOTCACHE "CACHE "; echo $?) fi @@ -89,32 +89,18 @@ if [ -f "$IMGFILE" ]; then mv "$IMGFILE" "$IMGFILE.ant" mv "$IMGFILE.torrent" "$IMGFILE.torrent.ant" 2>/dev/null mv "$IMGFILE.sum" "$IMGFILE.sum.ant" 2>/dev/null + mv "$IMGFILE.full.sum" "$IMGFILE.full.sum.ant" 2>/dev/null fi -#Comprobar espacio que requerira la imagen para ser almacenada echo " " > $OGLOGCOMMAND -if ogMount $1 $2 &>/dev/null -then - SIZEDATA=$(df -k | grep $PART | awk '{print $3}') - #Aplicar factor de compresion - FACTORGZIP=55/100 - FACTORLZOP=65/100 - let SIZEREQUIRED=$SIZEDATA*$FACTORLZOP - #Comprobar espacio libre en el contenedor. - [ "$3" == "CACHE" ] && SIZEFREE=$(ogGetFreeSize `ogFindCache`) - [ "$3" == "REPO" ] && SIZEFREE=$(df -k | grep $OGIMG | awk '{print $4}') -else - ogRaiseError $OG_ERR_PARTITION "$1 $2" - exit $? -fi +# Borramos ficheros de paginacion y configuracion +ogCleanOs $1 $2 -ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED $SIZEFREE" -[ "$SIZEREQUIRED" -gt "$SIZEFREE" ] && exit $(ogRaiseError $OG_ERR_CACHESIZE "$3" || echo $?) +#Comprobar espacio que requerira la imagen para ser almacenada +read SIZEDATA SIZEREQUIRED ISENOUGHSPACE <<< $(ogGetSizeParameters $1 $2 "$3") -# Ejecuta script personalizado de preconfiguración del sistema operativo modelo. -if which createImageCustomPre &>/dev/null; then - createImageCustomPre "$1" "$2" "$3" "$4" -fi +ogEcho log session "[16] $PROG: $MSG_SCRIPTS_CREATE_SIZE $SIZEREQUIRED" +[ "$ISENOUGHSPACE" == "TRUE" ] || exit $(ogRaiseError session $OG_ERR_CACHESIZE "$3"; echo $?) # Comprobar consistencia del sistema de archivos. echo " " > $OGLOGCOMMAND @@ -154,16 +140,11 @@ ogEcho log session " $MSG_HELP_ogExtendFs $NEWSIZEFS -> $SIZEFS = $SIZEFS #TODO que hacer si error al extender sistemade archivos #resumen de la operacion -IMGSIZE=$(ls -s `ogGetPath $3 /$4.img`| cut -f1 -d" ") -IMGOS=$(ogGetImageInfo `ogGetPath $3 /$4.img`) +IMGSIZE=$(ls -s `ogGetPath $3 /$4.$IMGEXT`| cut -f1 -d" ") +IMGOS=$(ogGetImageInfo `ogGetPath $3 /$4.$IMGEXT`) TIME=$[SECONDS-TIME1] ogEcho log session "[100] $MSG_SCRIPTS_TIME_TOTAL $[TIME/60]m $[TIME%60]s" ogEcho log session " FileSystem $PART with $NEWSIZEFS KB data created onto file-image as $4 and used $IMGSIZE KB across DFS $ogprotocol" ogEcho log session " Image-file $4 metada: $IMGOS" -# Ejecuta scripts personalizado de postconfiguracion del sistema operativo modelo. -if which createImageCustomPost &>/dev/null; then - createImageCustomPost "$1" "$2" "$3" "$4" -fi - diff --git a/client/shared/scripts/createImageCustom.template b/client/shared/scripts/createImageCustom.template new file mode 100644 index 00000000..73269d1b --- /dev/null +++ b/client/shared/scripts/createImageCustom.template @@ -0,0 +1,35 @@ +#!/bin/bash +#/** +# createImageCustom +#@brief Plantilla para scirpt de creación personalizada de imagen. +#@param $1 nº de disco +#@param $2 nº de partición +#@param $3 Repositorio: CACHE, REPO o dirección IP +#@param $4 Nombre canónico de la imagen sin extensión +#@warning Renombrar este fichero como "createImageCustom" para sustituir al script estándar "createImage". +#**/ + + +# Control de parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: createImageCustom int_ndisc int_npart str_repo str_imgname" || exit $? + +# Toma de parámetros. +DISK="$1" # Nº de disco. +PART="$2" # Nº de partición. +REPO="${3^^}" # Repositorio (en mayúsculas). +IMGNAME="$4" # Nombre canónico de imagen (sin extensión). + + +# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). + + +# Paso 1: Añadir aquí el código para el proceso previo antes de la creación de la imagen en el equipo modelo (opcional). + + +# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de creación de imagen por código personalizado. +createImage "$@" + + +# Paso 3: Añadir aquí el código para el proceso posterior tras la creación de la imagen (opcional). + + diff --git a/client/shared/scripts/createImageCustomPost.template b/client/shared/scripts/createImageCustomPost.template deleted file mode 100644 index 1cec03f6..00000000 --- a/client/shared/scripts/createImageCustomPost.template +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# createImageCustomPost.template -# Plantilla para fichero de postconfiguración del cliente modelo tras crear una imagen. -# Recibe los mismos parámetros que el script "createImage". -# Nota: para usar este fichero, renombrar como "createImageCustomPost". - - -# Control de parámetros. -[ $# -ne 4 ] || exit - - - diff --git a/client/shared/scripts/createImageCustomPre.template b/client/shared/scripts/createImageCustomPre.template deleted file mode 100644 index 9c58bcab..00000000 --- a/client/shared/scripts/createImageCustomPre.template +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# createImageCustomPre.template -# Plantilla para fichero de preconfiguración del cliente modelo antes de crear una imagen. -# Recibe los mismos parámetros que el script "createImage". -# Nota: para usar este fichero, renombrar como "createImageCustomPre". - - -# Control de parámetros. -[ $# -le 4 ] || exit - - diff --git a/client/shared/scripts/deployImage b/client/shared/scripts/deployImage index 1b2973e9..3be16e92 100755 --- a/client/shared/scripts/deployImage +++ b/client/shared/scripts/deployImage @@ -14,6 +14,8 @@ #@exception OG_ERR_LOCKED 4 partición bloqueada por otra operación. #@exception OG_ERR_IMAGE 5 error al restaurar la imagen del sistema. #@exception OG_ERR_IMGSIZEPARTITION 30 Tamaño de la particion es menor al tamaño de la imagen. +#@exception OG_ERR_NOTCACHE No existe cache -15- +#@exception OG_ERR_CACHESIZE Tamaño de la paticion menor al archivo a descargar -16- #@version 1.0.1 - Separación en protocolos de transferencia y postconfiguracion #@author Antonio J. Doblas Viso. Universidad de Málaga #@date 2011-05-11 @@ -26,21 +28,22 @@ #@version 1.0.5 - Renominación del script como "deployImage". #@author Antonio J. Doblas Viso y Ramón M. Gómez. #@date 2013-12-04 +#@version 1.0.6 - Se añade la gestión de errores de la CACHE cuando en el engine.cfg se define RESTOREPROTOCOLNOCACHE=NONE. +#@author Antonio J. Doblas Viso. +#@date 2015-02-23 #**/ #Descripcion: -# La interfaz detecta: -# Si Repositorio es el global (REPO) realiza un deploy. -# Si Repositorio es local (CACHE) realiza un restoreImage CACHE -# El deploy, si detecta que el cliente no tiene una cache con espacio suficiente -# -- reazlia un ogRestore REPO +# Si Repositorio es el global (REPO) realiza un deploy. +# Si Repositorio es local (CACHE) realiza un restoreImage CACHE +# El deploy, si detecta que el cliente no tiene una CACHE o no tiene espacio suficiente consulta el engine.cfg RESTOREPROTOCOLNOCACHE PROG="$(basename $0)" if [ $# -lt 4 ]; then - ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO imagen ndisco nparticion [ UNICAST|UNICAST-CACHE|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]" + ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO imagen ndisco nparticion [ UNICAST-DIRECT|UNICAST|UNICAST-CACHE|MULTICAST-DIRECT|MULTICAST|MULTICAST-CACHE|TORRENT [opciones protocolo] ]" exit $? fi @@ -111,17 +114,35 @@ case "$REPO" in NEXTOPERATION=CACHE ;; 15|16) + # no se permite usar la cache (no existe(15) o no espacio sufiente (16). Se consulta engine.cfg para RESTOREPROTOCOLNOCACHE [ multicast unicast none ] ogEcho log session "[50] $MSG_ERR_NOTCACHE ; $MSG_ERR_CACHESIZE " - ogEcho log session "[50] $MSG_SCRIPTS_CHECK_ENGINE " - if [ "$RESTOREPROTOCOLNOCACHE" == "MULTICAST" ]; then - case "$PROTO" in - MULTICAST) NEXTOPERATION=MULTICAST ;; - TORRENT) NEXTOPERATION=UNICAST ;; - UNICAST) NEXTOPERATION=UNICAST ;; - esac - else - NEXTOPERATION=UNICAST - fi + ogEcho log session "[50] $MSG_SCRIPTS_CHECK_ENGINE: RESTOREPROTOCOLNOTCACHE=$RESTOREPROTOCOLNOTCACHE " + case "$RESTOREPROTOCOLNOTCACHE" in + MULTICAST) + case "$PROTO" in + MULTICAST) NEXTOPERATION=MULTICAST ;; + TORRENT) NEXTOPERATION=UNICAST ;; + UNICAST) NEXTOPERATION=UNICAST ;; + esac + ;; + UNICAST) + NEXTOPERATION=UNICAST + ;; + NONE) + case $RETVAL in + 15) + ogEcho log session "[100] $MSG_ERR_NOTCACHE" + ogRaiseError session $OG_ERR_NOTCACHE "NOT CACHE" + exit $? + ;; + 16) + ogEcho log session "[100] $MSG_ERR_CACHESIZE " + ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL" + exit $? + ;; + esac # del segundo RETAVAL + ;; + esac # del RESTOREPROTOCOLNOTCACHE ;; esac ;; @@ -139,23 +160,27 @@ esac TIME3=$SECONDS +# Obtener parámetros de restauración. case "$NEXTOPERATION" in CACHE) - ogEcho log session "[55] $MSG_HELP_ogRestoreImage : restoreImage CACHE $IMGNAME $DISK $PART UNICAST" - restoreImage CACHE "$IMGNAME" "$DISK" "$PART" - RETVAL=$? - ;; + PARAMS="CACHE $IMGNAME $DISK $PART" ;; UNICAST) - ogEcho log session "[55] $MSG_HELP_ogRestoreImage : restoreImage REPO $IMGNAME $DISK $PART UNICAST" - restoreImage REPO "$IMGNAME" "$DISK" "$PART" - RETVAL=$? - ;; + PARAMS="REPO $IMGNAME $DISK $PART" ;; MULTICAST) - ogEcho log session "[55] $MSG_HELP_ogRestoreImage : restoreImage REPO $IMGNAME $DISK $PART $PROTO $PROTOOPT" - restoreImage REPO "$IMGNAME" "$DISK" "$PART" $PROTO $PROTOOPT - RETVAL=$? - ;; + PARAMS="REPO $IMGNAME $DISK $PART $PROTO $PROTOOPT" ;; esac + +# Si existe, ejecuta script personalizado "restoreImageCustom"; si no, llama al genérico "restoreImage". +if which restoreImageCustom &>/dev/null; then + ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImageCustom $PARAMS" + restoreImageCustom $PARAMS +else + ogEcho log session "[55] $MSG_HELP_ogRestoreImage: restoreImage $PARAMS" + restoreImage $PARAMS +fi +RETVAL=$? + +# Mostrar resultados. RESUMERESTOREIMAGE=$(grep -m 1 "Total Time:" $OGLOGCOMMAND) ogEcho log session " [ ] $RESUMERESTOREIMAGE " # Si la transferencia ha dado error me salgo. @@ -168,9 +193,10 @@ fi TIME3=$[SECONDS-TIME3] ogEcho log session " [ ] $MSG_SCRIPTS_TIME_PARTIAL : $[TIME3/60]m $[TIME3%60]s" +# Si existe, ejecuta script personalizado de postconfiguración "configureOsCustom"; si no, llama al genérico "configureOs". if which configureOsCustom &>/dev/null; then ogEcho log session "[90] configureOsCustom" - configureOsCustom "$DISK" "$PART" + configureOsCustom "$DISK" "$PART" "$REPO" "$IMGNAME" else ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE " configureOs "$DISK" "$PART" diff --git a/client/shared/scripts/generateMenuDefault b/client/shared/scripts/generateMenuDefault index 7a9abd6e..09e4300f 100755 --- a/client/shared/scripts/generateMenuDefault +++ b/client/shared/scripts/generateMenuDefault @@ -9,7 +9,7 @@ source /tmp/net-$DEVICE.conf FILEINFOHTML=$OGLOG/`ogGetIpAddress`.info.html FILEINFOCACHE=$OGLOG/`ogGetIpAddress`.cache.txt ogMountCache 2>/dev/null -CACHECONTENIDO=`ls -m $OGCAC/$OGIMG 2>/dev/null` +CACHECONTENIDO="ls -m $OGCAC/$OGIMG 2>/dev/null" SPEED=$(LANG=C ethtool $DEVICE 2>/dev/null | awk '$1~/Speed/ {print $2}') case "${SPEED,,}" in @@ -23,8 +23,13 @@ case "${DUPLEX,,}" in full) ;; *) DUPLEX="<font color=\"red\">$DUPLEX</font>" esac + CACHESIZEFREE=$(ogGetFreeSize `ogFindCache`) -expr $CACHESIZEFREE / 1024 > $FILEINFOCACHE 2>/dev/null && echo '.MB,' >> $FILEINFOCACHE +if [ $CACHESIZEFREE == 0 ]; then + echo '0.MB,' > $FILEINFOCACHE +else + expr $CACHESIZEFREE / 1024 > $FILEINFOCACHE 2>/dev/null && echo '.MB,' >> $FILEINFOCACHE +fi # Crear menú por defecto. cat > $FILEINFOHTML << EOT @@ -72,7 +77,5 @@ cat >> $FILEINFOHTML << EOT EOT # Crear contenido de la caché. -cat >> $FILEINFOCACHE << EOT -$CACHECONTENIDO -EOT +eval $CACHECONTENIDO >> $FILEINFOCACHE diff --git a/client/shared/scripts/initCache b/client/shared/scripts/initCache index 908ce85b..d5fba1e7 100755 --- a/client/shared/scripts/initCache +++ b/client/shared/scripts/initCache @@ -50,7 +50,7 @@ else PART=${FINDCACHE#* } # Si la CACHE actual esta definida en otro disco, se elimina - if [ "$NDISK" != "$CACHEDISK" ] + if [ -n "$CACHEDISK" -a "$NDISK" != "$CACHEDISK" ] then echo "[10] Detectada cache en otro disco, eliminarla" ogUnmountCache 2>/dev/null diff --git a/client/shared/scripts/installOfflineMode b/client/shared/scripts/installOfflineMode new file mode 100755 index 00000000..d9ff2459 --- /dev/null +++ b/client/shared/scripts/installOfflineMode @@ -0,0 +1,60 @@ +#!/bin/bash + +#/** +# installOfflineMode +#@brief Prepara el equipo cliente para el modo offline. +#@param no +#@return +#@exception OG_ERR_NOTFOUND Fichero o dispositivo no encontrado. +#@exception OG_ERR_NOTCACHE No existe cache. +#@author Irina Gomez. ETSII. Universidad de Sevilla +#@date 2013/12/5 +#*/ ## + +PROG="$(basename $0)" +if [ "$*" == "help" ]; then + ogHelp "$PROG $MSG_HELP_installOfflineMode" \ + "$PROG [ no param ]" + exit 0 +fi + +ogEcho log session "$MSG_HELP_installOfflineMode" +# Cargamos las variables de entorno. +[ -z $OGENGINECONFIGURATE ] && source /opt/opengnsys/etc/engine.cfg +DIRTFTP="/opt/oglive/tftpboot" +DIROGCLIENT="$DIRTFTP/ogclient" +# Comprobamos que el DIROGCLIENT esta montado desde repo +df |grep "$(ogGetRepoIp).*$DIRTFTP" &>/dev/null || ogRaiseError $OG_ERR_NOTFOUND "REPO OGclient" || exit $? + +# Copiamos el kernel y el initrd. +ogEcho log session " [10] updateBootCache" +updateBootCache || ogRaiseError $OG_ERR_NOTCACHE || exit $? + +# Creamos los dir necesarios. +ogEcho log session " [40] mkdir -p $OGCAC/{ogclient, menus, log}." +[ -d $OGCAC/menus/images/iconos ] || mkdir -p $OGCAC/menus/images/iconos +[ -d $OGCAC/ogclient ] || mkdir -p $OGCAC/ogclient +[ -d $OGCAC/log ] || mkdir -p $OGCAC/log +[ -d $OGCAC/opt/opengnsys/images ] || mkdir -p $OGCAC/opt/opengnsys/images + +# Comparamos el cliente en el server y en cache +ogEcho log session " [60] cp $DIROGCLIENT/ogclient.sqfs $OGCAC/ogclient/" +SERVEROGCLIENT=$(cat $DIROGCLIENT/ogclient.sqfs.sum 2>/dev/null) +CACHEOGCLIENT=$(cat $OGCAC/ogclient/ogclient.sqfs.sum 2>/dev/null) + +if [ "$CACHEOGCLIENT" != "$SERVEROGCLIENT" ]; then + cp $DIROGCLIENT/ogclient.sqfs $OGCAC/ogclient/ + cp $DIROGCLIENT/ogclient.sqfs.sum $OGCAC/ogclient/ +fi + +# Si se ha generado el menu de inicio lo copiamos a cache. +IPCLIENT=$(ogGetIpAddress) +MENU=$OGLOG/$IPCLIENT.info.html +ICONO="images/iconos/logoopengnsys.png" +[ -f $MENU ] || generateMenuDefault +ogEcho log session " [90] cp $MENU $OGCAC/menus/$IPCLIENT.html" +cp $MENU $OGCAC/menus/$IPCLIENT.html +sed -i s/"..\/images"/"images"/g $OGCAC/menus/$IPCLIENT.html +wget --no-check-certificate https://$(ogGetRepoIp)/opengnsys/$ICONO -O $OGCAC/menus/$ICONO + + diff --git a/client/shared/scripts/ogRestaurarImagenBasica b/client/shared/scripts/ogRestaurarImagenBasica index 4be8e49d..d045f831 100755 --- a/client/shared/scripts/ogRestaurarImagenBasica +++ b/client/shared/scripts/ogRestaurarImagenBasica @@ -186,7 +186,14 @@ fi echo "Ejecutando configure OS" | tee -a $OGLOGSESSION $OGLOGFILE - configureOs $DISCO $NPART + if which configureOsCustom &>/dev/null; then + ogEcho log session "[90] configureOsCustom" + configureOsCustom "$DISCO" "$NPART" "$IPREPOSITORIO" "$NOMBREIMG" + else + ogEcho log session "[90] $MSG_SCRIPTS_OS_CONFIGURE " + configureOs "$DISCO" "$NPART" + fi + echo "!!! Finaliza correctamente !!! restauracion imagen basica $NOMBREIMG desde cache local" | tee -a $OGLOGSESSION $OGLOGFILE #___________________________________________________________________ diff --git a/client/shared/scripts/poweroff b/client/shared/scripts/poweroff index 9af4d669..c108e08e 100755 --- a/client/shared/scripts/poweroff +++ b/client/shared/scripts/poweroff @@ -21,7 +21,7 @@ BUSYBOX=${BUSYBOX:-"busybox"} # Retardo para dar lugar al registro en cola de acciones. sleep 5 # Parar Browser para evitar "cuelgues". -pkill browser +[ "$ogstatus" == "offline" ] || pkill browser # Apagar. $BUSYBOX poweroff diff --git a/client/shared/scripts/reboot b/client/shared/scripts/reboot index 87df09d0..87e30e21 100755 --- a/client/shared/scripts/reboot +++ b/client/shared/scripts/reboot @@ -34,7 +34,8 @@ BUSYBOX=${BUSYBOX:-"busybox"} # Retardo para dar lugar al registro en cola de acciones. sleep $TIME # Parar Browser para evitar "cuelgues". -pkill browser +[ "$ogstatus" == "offline" ] || pkill browser # Reiniciar. $BUSYBOX reboot + diff --git a/client/shared/scripts/restoreBaseImage b/client/shared/scripts/restoreBaseImage index 318e7c6f..c4e87ba4 100755 --- a/client/shared/scripts/restoreBaseImage +++ b/client/shared/scripts/restoreBaseImage @@ -65,13 +65,13 @@ ogIsSyncImage REPO "$2" $IMGEXT || exit $(ogRaiseError session $OG_ERR_DONTSYN IMGEXT="img" # Comprobamos si la imagen o la particion estan bloqueada: -ogIsImageLocked "$1" "$2.$IMGEXT" && exit $(ogRaiseError session $OG_ERR_LOCKED "$1 $2.$IMGEXT"; echo $?) +ogIsImageLocked "REPO" "$2.$IMGEXT" && exit $(ogRaiseError session $OG_ERR_LOCKED "$1 $2.$IMGEXT"; echo $?) ogIsLocked "$3" "$4" && exit $(ogRaiseError session $OG_ERR_LOCKED "$3 $4"; echo $?) # Detectamos el sistema de ficheros de la imagen # TODO ogGetImageInfo -DIRMOUNT=$(ogMountImage "$1" "$2") -ogWaitSyncImage "$1" "$2" "$IMGEXT" "mounted" || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $IMGEXT: time_out."; echo $?) +DIRMOUNT=$(ogMountImage "REPO" "$2") +ogWaitSyncImage "REPO" "$2" "$IMGEXT" "mounted" || exit $(ogRaiseError session $OG_ERR_DONTMOUNT_IMAGE "$1 $2 $IMGEXT: time_out."; echo $?) IMGFSTYPE=$(head -1 $DIRMOUNT/ogimg.info |cut -d: -f3) # Comprobamos si el sistema de ficheros se puede montar @@ -132,14 +132,22 @@ ogUnmountImage "$1" "$2" "$IMGEXT" # Restableciendo acl ogUnlock $3 $4 ogEcho log session "[70] $MSG_HELP_ogRestoreInfoImage" -ogRestoreInfoImage $3 $4 2>&1 | tee -a $OGLOGCOMMAND +ogExecAndLog command ogRestoreInfoImage $3 $4 # Llamar al script de post-configuración del sistema operativo. # Si a este script lo ha llamado el script restoreDiffImage no post-configuramos if [ "$(ogGetCaller)" != "restoreDiffImage" ];then + ogExecAndLog command ogRestoreAclImage $3 $4 + if which configureOsCustom &>/dev/null; then + ogEcho log session "[90] configureOsCustom" + configureOsCustom "$3" "$4" "$1" "$2" + else ogEcho log session "[90] $MSG_HELP_configureOs" configureOs $3 $4 + fi fi +TIMEAUX3=$[SECONDS-TIMEAUX2] +ogEcho log session " $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX3/60]m $[TIMEAUX3%60]s" TIME=$[SECONDS-TIME1] ogEcho log session "[100] $MSG_SCRIPTS_END $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s" diff --git a/client/shared/scripts/restoreDiffImage b/client/shared/scripts/restoreDiffImage index 9af1064f..6bd7b1df 100755 --- a/client/shared/scripts/restoreDiffImage +++ b/client/shared/scripts/restoreDiffImage @@ -1,15 +1,15 @@ #!/bin/bash #/** -# restoreiDiffSquash +# restoreDiffImage #@brief Script de ejemplo para restaurar una imagen diferencial. #@brief (puede usarse como base para el programa de restauración de imágenes usado por OpenGNSys Admin). #@param 1 REPO|CACHE #@param 2 imagen basica -#@param 2 imagen diferencial -#@param 3 disco -#@param 4 particion -#@param 5 protocolo -#@param 6 opciones protocolo +#@param 3 imagen diferencial +#@param 4 disco +#@param 5 particion +#@param 6 protocolo +#@param 7 opciones protocolo #@return #@exception OG_ERR_FORMAT # 1 formato incorrecto. #@exception OG_ERR_NOTFOUND # 2 Fichero o dispositivo no encontrado @@ -121,15 +121,21 @@ ogEcho log session " $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[T # creando enlaces y restableciendo ACL (en windows) ogEcho log session "[70] $MSG_HELP_ogRestoreInfoImage" -ogRestoreInfoImage "$4" "$5" 2>&1 | tee -a $OGLOGCOMMAND +ogExecAndLog command ogRestoreInfoImage "$4" "$5" +ogExecAndLog command ogRestoreAclImage "$4" "$5" +TIMEAUX3=$[SECONDS-TIMEAUX2] +ogEcho log session " $MSG_SCRIPTS_TASK_END, $MSG_SCRIPTS_TIME_PARTIAL : $[TIMEAUX3/60]m $[TIMEAUX3%60]s" # Llamar al script de post-configuración del sistema operativo. -ogEcho log session "[90] $MSG_HELP_configureOs." -configureOs $4 $5 - +if which configureOsCustom &>/dev/null; then + ogEcho log session "[90] configureOsCustom" + configureOsCustom "$4" "$5" "$1" "$2" +else + ogEcho log session "[90] $MSG_HELP_configureOs." + configureOs $4 $5 +fi TIME=$[SECONDS-TIME1] ogEcho log session "[100] $MSG_SCRIPTS_END $MSG_SCRIPTS_TIME_TOTAL: $[TIME/60]m $[TIME%60]s" # Si ha habido problema al sincronizar nos salimos con error [ $RETVAL == 0 ] || exit $OG_ERR_SYNCHRONIZING - diff --git a/client/shared/scripts/restoreImage b/client/shared/scripts/restoreImage index b701b82a..6d5198aa 100755 --- a/client/shared/scripts/restoreImage +++ b/client/shared/scripts/restoreImage @@ -43,8 +43,8 @@ case "$PROTO" in UNICAST|UNICAST-DIRECT) # Restaurar la imagen. ogEcho log session "[40] ogRestoreImage $REPO $IMGNAME $DISK $PART UNICAST" - ogRestoreImage "$REPO" "$IMGNAME" "$DISK" "$PART" 2>&1 | tee -a $OGLOGCOMMAND - RETVAL=${PIPESTATUS[0]} + ogExecAndLog command ogRestoreImage "$REPO" "$IMGNAME" "$DISK" "$PART" + RETVAL=$? ;; MULTICAST|MULTICAST-DIRECT) PORT=$(echo $PROTOOPT | cut -f1 -d":") @@ -53,8 +53,8 @@ case "$PROTO" in #TODO comprobar parametros anteriores ogEcho log session "[40] ogMcastReceiverPartition $DISK $PART $PORT $TOOL $COMPRESS" ogMcastRequest "$IMGNAME.img" "$PROTOOPT" - ogMcastReceiverPartition "$DISK" "$PART" "$PORT" "$TOOL" "$COMPRESS" 2>&1 | tee -a $OGLOGCOMMAND - RETVAL=${PIPESTATUS[0]} + ogExecAndLog command ogMcastReceiverPartition "$DISK" "$PART" "$PORT" "$TOOL" "$COMPRESS" + RETVAL=$? ;; *) # Protocolo desconocido. ogRaiseError session $OG_ERR_FORMAT "$MSG_FORMAT: $PROG REPO|CACHE imagen ndisco nparticion [ UNICAST|MULTICAST opciones ]" diff --git a/client/shared/scripts/restoreImageCustom.template b/client/shared/scripts/restoreImageCustom.template new file mode 100644 index 00000000..da32779c --- /dev/null +++ b/client/shared/scripts/restoreImageCustom.template @@ -0,0 +1,34 @@ +#!/bin/bash +#/** +# restoreImageCustom +#@brief Plantilla para scirpt de rastauración personalizada de imagen. +#@param $1 nº de disco +#@param $2 nº de partición +#@param $3 Repositorio: CACHE, REPO o dirección IP +#@param $4 Nombre canónico de la imagen sin extensión +#@warning Renombrar este fichero como "restoreImageCustom" para sustituir al script estándar "restoreImage". +#**/ + + +# Control de parámetros. +[ $# -eq 4 ] || ogRaiseError $OG_ERR_FORMAT "$MSG_FORMAT: createImageCustom int_ndisc int_npart str_repo str_imgname" || exit $? + +# Toma de parámetros. +DISK="$1" # Nº de disco. +PART="$2" # Nº de partición. +REPO="${3^^}" # Repositorio (en mayúsculas). +IMGNAME="$4" # Nombre canónico de imagen (sin extensión). + + +# Paso 0: Añadir código para realizar control de errores de los parámetros de entrada (recomendado). + + +# Paso 1: Añadir aquí el código para el proceso previo antes de la restauración de la imagen en los equipos (opcional). + + +# Paso 2: Sustituir, si se desea, la llamada al proceso estándar de restauración de imagen por código personalizado. +restoreImage "$@" + + +# Aviso: editar la plantilla "configureOsCustom" para añadir el código personalizado para el proceso de postconfiguración de los clientes (no incluir aquí dicho código). + diff --git a/client/shared/scripts/updateCache b/client/shared/scripts/updateCache index a0670fe6..8760ddd2 100755 --- a/client/shared/scripts/updateCache +++ b/client/shared/scripts/updateCache @@ -25,6 +25,9 @@ #@date 2011-05-10 #@version 2.0.1 - Imagenes sincronizadas #@date 2013-02-20 +#@version 1.0.5 - uso de md5 full para las transferencias torrent, en la llamada => ogUpdateCacheIsNecesary +#@date 2014-07-09 + #*/ ## PROG="$(basename $0)" @@ -72,8 +75,7 @@ else # Si la imagen es monolitica y ha elegido protocolo = RSYNC salimos con error. [ $PROTOCOLO == "RSYNC" ] && exit $(ogRaiseError session $OG_ERR_DONTSYNC_IMAGE "REPO $2"; echo $?) IMGSYNC=FALSE - #TODO: ogUpdateCacheIsNecesary debe borrar la imagen que tenga igual nombre pero distinto sum- - ogUpdateCacheIsNecesary $1 $2 + ogUpdateCacheIsNecesary "$1" "$2" "$PROTOCOLO" RETVAL=$? fi # si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1 @@ -112,7 +114,7 @@ else SIZEREQUIRED=$FILESIZE fi -#ERROR CACHESIZE 16 +#ERROR CACHESIZE 16 (tamanyo de la CACHE insuficiente) if [ "$SIZEREQUIRED" -ge "$CACHESIZE" ] then ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE: $2 = $SIZEREQUIRED > CACHE = $CACHESIZE" @@ -120,14 +122,16 @@ then exit $? fi -ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO" -#ERROR CACHESIZE 16 + +#ERROR CACHESIZE 16 (Espacio libre en CACHE insuficiente) if [ "$SIZEREQUIRED" -ge "$CACHESIZEFREE" ] then - # ogEcho log session "[ ] No hay espacio sufiente en la CACHE, detectar que hacer con engine.cfg" + ogEcho log session "$MSG_SCRIPTS_UPDATECACHE_IFNOTCACHEDO: ACTIONCACHEFULL=$ACTIONCACHEFULL" case "$ACTIONCACHEFULL" in NONE) - NEXTOPERATION=UNICAST + ogEcho log session "$MSG_WARNING: $MSG_ERR_CACHESIZE: $2 = $SIZEREQUIRED > FREE SPACE CACHE = $CACHESIZEFREE" + ogRaiseError session $OG_ERR_CACHESIZE "CACHE FULL, NO SPACE FREE" + exit $? ;; FORMAT) ogEcho log session "[51] $MSG_HELP_ogFormatCache " @@ -150,7 +154,7 @@ then fi # Comprobamos que imagen cache igual a la del repo. Si sincronizada no podemos comprobar. -[ "$IMGSYNC" == "TRUE" ] || ogUpdateCacheIsNecesary $REPOSITORIO "$2" +[ "$IMGSYNC" == "TRUE" ] || ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO" RETVAL=$? # si RETVAL=0 => actualizamos si RETVAL=1 no actaulizasmo-exit 0 || si RETVAL>2 exit 1 [ "$RETVAL" == "1" ] && exit 0 @@ -173,7 +177,7 @@ case "$PROTOCOLO" in ogEcho log session "ogCopyFile $1 $2.torrent absolute $OGCAC/$OGIMG" # tiempos timewait=$(expr $(printf '%d\n' 0x$(ogGetMacAddress | awk -F: '{print $5$6}')) \* 120 / 65535) - ogCopyFile $REPOSITORIO "$2.torrent" "$IMGDIR" 2>&1 | tee -a $OGLOGCOMMAND + ogExecAndLog command ogCopyFile $REPOSITORIO "$2.torrent" "$IMGDIR" #TODO: comprobar que el tracker definido en el fichero es correcto. #TODO comprobar que el fichero torrent está en cache # retardamos el inicio -aleatorio de 0 a 120 segundos- al tracker para gestionar mas de +-40 equipos @@ -181,11 +185,11 @@ case "$PROTOCOLO" in ogEcho log session " [ ] $MSG_SCRIPTS_TASK_SLEEP : $P2PWAIT seconds ogTorrentStart CACHE $2.torrent $4" sleep $P2PWAIT ogEcho log session " [ ] $MSG_SCRIPTS_TASK_START: ogTorrentStart CACHE $2.torrent $4" - ogTorrentStart CACHE "$2.torrent" $4 2>&1 | tee -a $OGLOGCOMMAND + ogExecAndLog command ogTorrentStart CACHE "$2.torrent" $4 RESUMEUPDATECACHE=$(grep -m 1 -B1 "Download" $OGLOGCOMMAND) RESUMEUPDATECACHEbf=$(grep -m 1 "Download" $OGLOGCOMMAND) if [ "$RESUMEUPDATECACHEbf" == "Download complete." ]; then - rm $IMGDIR$2".torrent.bf" 2>&1 | tee -a $OGLOGCOMMAND + rm -f $IMGDIR$2".torrent.bf" fi ;; MULTICAST) @@ -198,7 +202,7 @@ case "$PROTOCOLO" in #FIN TODO if (nmap -n -sU -p $PORTAUX $REPOIP | grep open) then - ogMcastReceiverFile $PORT CACHE "$2" 2>&1 | tee -a $OGLOGCOMMAND + ogExecAndLog command ogMcastReceiverFile $PORT CACHE "$2" else # TODO ticket 379 Realizar la petición basada en identificador de operacion @@ -208,7 +212,7 @@ case "$PROTOCOLO" in sleep 10 if (nmap -n -sU -p $PORTAUX $REPOIP | grep open) then - ogMcastReceiverFile $PORT CACHE "$2" 2>&1 | tee -a $OGLOGCOMMAND + ogExecAndLog command ogMcastReceiverFile $PORT CACHE "$2" else ogEcho log session "$MSG_SCRIPTS_TASK_ERR : hose $REPOIP 2009 --out sh -c echo -ne START_MULTICAST $2 $OPTPROTOCOLO" exit $OG_ERR_UPDATECACHE @@ -221,7 +225,7 @@ case "$PROTOCOLO" in ;; UNICAST) #ogEcho log session "unicast" - ogCopyFile $REPOSITORIO "$2" "$IMGDIR" 2>&1 | tee -a $OGLOGCOMMAND + ogExecAndLog command ogCopyFile $REPOSITORIO "$2" "$IMGDIR" sleep 5 RESUMEUPDATECACHE=$(grep -m 1 "100%" $OGLOGCOMMAND.tmp) ;; @@ -262,7 +266,7 @@ case "$PROTOCOLO" in ogMountImage CACHE "${IMGNAME#\/}" $IMGTYPE || exit $? ogMountImage REPO "${IMGNAME#\/}" $IMGTYPE # Esperamos que se monte la imagen en el servidor - ogWaitMountImage REPO "$IMGNAME" $IMGTYPE || exit $? + ogWaitSyncImage REPO "$IMGNAME" $IMGTYPE "mounted" || exit $? ogEcho log session " rsync -aHAX$OPTRSYNC $USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/ $DIRLOCAL" rsync -aHAX$OPTRSYNC $PASSWORD "$USERRSYNC@$REPOIP::ogimages/$DIRMOUNT/" "$DIRLOCAL" 2>>$OGLOGCOMMAND | egrep "^sent|^sending|^total|%" >> $OGLOGCOMMAND # RETVAL="1" -> OK RETVAL="2" -> error # valores igual que ogUpdateCacheIsNecesary @@ -285,7 +289,7 @@ if [ "$IMGSYNC" == "TRUE" ]; then # RETVAL="1" -> OK RETVAL="2" -> error # valores igual que ogUpdateCacheIsNecesary [ $PROTOCOLO == "RSYNC" ] || RETVAL=1 else - ogUpdateCacheIsNecesary $REPOSITORIO "$2" + ogUpdateCacheIsNecesary $REPOSITORIO "$2" "$PROTOCOLO" RETVAL=$? fi if [ "$(ogGetCaller)" != "deployImage" ]; then diff --git a/doc/CHANGELOG.es.txt b/doc/CHANGELOG.es.txt index 7a45e245..61c2278b 100644 --- a/doc/CHANGELOG.es.txt +++ b/doc/CHANGELOG.es.txt @@ -1,7 +1,90 @@ -LISTA DE CAMBIOS CHANGELOG.es.ext +LISTA DE CAMBIOS CHANGELOG.es.txt ======================================== +Lista de cambios incluidos en OpenGnSys 1.0.6 +--------------------------------------------- + +Tickets resueltos en módulo OpenGnSys Cloning Engine: +#51 Detectar y tratar metadispositivos (mejora) +#660 El arranque de sistema operativo debe depender de su tipo y no del sistema de ficheros +#611 Crear función para mostrar y registrar la ejecución de un comando +#626 Mejorar la integridad en el protocolo torrent +#645 Configuración de sistemas GNU/Linux y Windows instalados sobre EFI +#651 Incluir en la interfaz de crear imagen una condición para que llame a script personalizado +#652 Incluir script personalizado para restoreImage (mejora) +#668 Comando restaurar torrent-cache si encuentra trozo de imagen monolítica previa se queda compartiendo la imagen sin restaurar (no se resolverá) +#671 ogFormat sobre NTFS no reconoce tipo de partición NTFS (no se resolverá) +#675 Bucle infinito al reducir sistema de archivos NTFS menor de 1 GB +#684 Usar función ogExecAndLog en los scripts de clonaciones remotas +#685 Arrancar sistema GNU/Linux con sistema de archivos /boot separado del raíz (mejora) +#690 Revisar log del script updateCache +#693 deployImage debe admitir el comportamiento correcto para RESTOREPROTOCOLNOCACHE=NONE +#694 Log en deployImage y updateCache al realizar la consulta al engine.cfg debería mostrar la variable consultada y su valor +#692 updateCache no reporta error cuando no hay espacio libre en la caché del cliente +#698 Mejoras en los mensajes de error + +Tickets resueltos en módulo OpenGnSys Client: +#136 Splash de arranque con Plymouth (no se resolverá) +#615 Cliente oglive 1.0.5 basado en Ubuntu 12.04.2 LTS (duplicado de #603) +#649 El arranque gráfico del ogLive depende del hardware (no se resolverá) +#653 Decidir el número de parámetros del script configureOsCustom +#656 Script updateCache: erratas en imágenes sincronizadas +#657 Sincronizadas tipo archivo: adaptación a ogclient 1.0.5 +#659 Rsync: Incompatibilidad versión 3.0.9 instalada en los clientes y la versión 3.1.0 del servidor +#669 Comando reboot no permite comunicar con la cola de acciones + +Tickets resueltos en módulo OpenGnSys Server: +#646 Script de servidor para comparar datos de red +#648 Comprobar y determinar permisos en /opt/opengnsys/images +#664 Script listclientmode: Identificacion de la plantilla por nombre en consola +#672 La cola de acciones no muestra el protocolo usado en una restauración (heredado de #473) +#682 Script de servidor para instalar cliente ogLive (mejora) + +Tickets resueltos en módulo OpenGnSys Repository Server: +#536 Desactivar la descarga no autenticada de ficheros torrent desde el servicio web del tracker +#532 Gestión básica de imágenes en el repositorio (heredado de #270) +#674 Corregir erratas en script deleteimage (heredado de #564) + +Tickets resueltos en módulo OpenGnSys Installer: +#647 Compatibilidad de instalación en CentOS 7 +#650 Posible error de actualización de la BD desde versiones que necesitan modificar IP del servidor + +Tickets resueltos en módulo OpenGnSys Web Admin Console: +#512 Asistente particionado: comprobar que las particiones no sobrepasan disco (mejora) +#654 Eliminar imagen de caché duplica algunas imágenes. +#655 Gestión Arranque Avanzado: opción eliminar no muestra plantillas (no válido) +#658 Correccion en eliminar imagen de caché de cliente +#661 Error al mostrar configuración de varios equipos con caché +#665 Comando Iniciar Sesión toma datos incorrectos para aulas +#666 Asistente de particiones remotas no genera la instrucción a ejecutar (tarea) +#667 Resolución de los menús en la configuración PXE (no válido) +#680 Opcion status de ordenador sobre objeto aulas es incorrecto cuando existe también objetos tipo "grupo de ordenadores" (no válido) +#681 Bucle infinito en 2º subprocedimiento de un procedimiento compuesto +#683 Consola web: comandos Iniciar sesión e Inventario software solo reconocen un disco +#686 Asistente deploy imágenes: incluir protocolos unicast-direct y multicast-direct +#687 Asigar menu "default" desde las propiedades del aula no funciona (no válido) +#688 Cambiar la contraseña del usuario usuog afecta al ogAdmclient.cfg +#689 Asistente particionado no modifica el tamaño de la partición caché +#691 Comando "Formatear y Particionar" no formate la caché +#695 No se muestra información del repositorio con imágenes sin asignar +#697 Las propiedades del menú no permiten URL con HTTPS +#699 No se borra imagen si caché completa +#700 Asistente Deploy Imagen avisa al usar Unicast sobre aulas (mejora) +#702 Mostrar Unidad Organizativa por defecto en login (mejora) +#703 Comando Restaurar avisa al usar Unicast sobre aulas (mejora) +#704 Ampliar tamaño de ventana log de seguimiento (mejora) +#705 Eliminar campos de formularios que han dejado de utilizarse +#707 Eliminar del repositorio imagen de tipo directorio +#710 Fallo al intentar cambiar cualquier campo de usuario administrador normal + +Tickets genéricos resueltos: +#541 Gestión plataformas Mac (tarea) +#670 Las copias en trunk y tags no mantienen los cambios del svn realizados en branches (informativo) +#673 Integración de OpenGnSys 1.0.6 en rama principal +#677 Incluir datos de creación y despliegue de imagen (mejora) + + Lista de cambios incluidos en OpenGnSys 1.0.5 --------------------------------------------- @@ -227,6 +310,7 @@ Tickets resueltos en módulo OpenGnSys Client: #476 Revisar y depurar el proceso de arranque del cliente #477 Mejorar la internacionalización del cliente (inglés, en especial) #482 Script de inicio mountrepo.sh no reconoce variable "ogprotocol" +#523 ogClient: actualizar ogClient compara en directorio incorrecto Tickets resueltos en módulo OpenGnSys Web Admin Console: #376 Menú para el Browser en equipos sin menú asignados con valores por defecto (se solucionará en #411) @@ -299,6 +383,7 @@ Tickets resueltos en módulo OpenGnSys Server: Tickets resueltos en módulo OpenGnSys Web Admin Console: #296 Consola Web: particionar y formatear no va si hay partición de linux-swap (no se resolverá) #341 Control del tamaño de disco duro en consola web +#377 Documentar como modificar el tiempo de las cookies para los menus personalizados desde la web de clientes (no se resolverá) #423 Netboot no configura el parámetro de IP serverADM #434 Soporte para particiones lógicas en el asistente de particionado #443 Usar HTTPS en la consola web @@ -415,6 +500,7 @@ Tickets resueltos en módulo OpenGnSys Repository Server: #384 Se ha portado una versión antigua del script sendFileMcast Tickets resueltos en módulo OpenGnSys Web Admin Console: +#125 Consola web: No se puede crear imagen desde algunos ordenadores #126 Integración de consola Web con bittorent (mejora) #138 Configurar parámetros de red en cliente #143 Integración con la consola web de los nuevos sistema de ficheros diff --git a/doc/INSTALL.es.txt b/doc/INSTALL.es.txt index cd111e2a..c5f63e35 100644 --- a/doc/INSTALL.es.txt +++ b/doc/INSTALL.es.txt @@ -1,16 +1,16 @@ -Instalación de OpenGnSys Server v 1.0.5 +Instalación de OpenGnSys Server v 1.0.6 ======================================= Notas iniciales --------------- -Se presupone que el servidor de OpenGnSys va a ser instalado en una distribución del sistema operativo Ubuntu Server a partir de la versión 12.04 LTS (también ha sido probado en sistemas basados en Fedora 20). +Se presupone que el servidor de OpenGnSys va a ser instalado en una distribución del sistema operativo Ubuntu Server a partir de la versión 12.04 LTS (también ha sido probado en sistemas basados en Fedora 20 y CentOS 6.5). El serividor debe tener acceso a Internet para descargar los paquetes necesarios, el código del proyecto y el cliente preconfigurado. Requisitos mínimos de almacenamiento: - 100 MB en el directorio /tmp (solo durante la instalación) -- 450 MB en el directorio /var/lib/tftpboot (o /srv en sistemas Debian) +- 500 MB en el directorio /var/lib/tftpboot (o /srv en sistemas Debian) - 500 MB en el directorio de instalación /opt/opengnsys sin contar el espacio para logs (100 MB si el cliente ogLive está previamente descargado). - Estimar la capacidad necesaria para el repositorio de imágenes en /opt/opengnsys/images (es recomendable que este directorio se monte sobre un sistema de archivos independiente). diff --git a/doc/VERSION.txt b/doc/VERSION.txt index b5fb630a..edca710e 100644 --- a/doc/VERSION.txt +++ b/doc/VERSION.txt @@ -1 +1 @@ -OpenGnSys 1.0.5 +OpenGnSys 1.0.6 diff --git a/installer/INSTALL.es.txt b/installer/INSTALL.es.txt index 9c47cbe3..f5446e98 100644 --- a/installer/INSTALL.es.txt +++ b/installer/INSTALL.es.txt @@ -1,4 +1,4 @@ -Instalación y Actualización de OpenGnSys 1.0.3 +Instalación y Actualización de OpenGnSys 1.0.6 ============================================== diff --git a/installer/opengnsys_installer.sh b/installer/opengnsys_installer.sh index a0bc643a..64e3631d 100755 --- a/installer/opengnsys_installer.sh +++ b/installer/opengnsys_installer.sh @@ -115,7 +115,7 @@ OPENGNSYS_DB_CREATION_FILE=opengnsys/admin/Database/${OPENGNSYS_DATABASE}.sql # Generar variables de configuración del instalador # Variables globales: -# - OSDISTRIB - tipo de distribución GNU/Linux +# - OSDISTRIB, OSVERSION - tipo y versión de la distribución GNU/Linux # - DEPENDENCIES - array de dependencias que deben estar instaladas # - UPDATEPKGLIST, INSTALLPKGS, CHECKPKGS - comandos para gestión de paquetes # - INSTALLEXTRADEPS - instalar dependencias no incluidas en la distribución @@ -137,15 +137,20 @@ function autoConfigure() # Detectar sistema operativo del servidor (compatible con fichero os-release y con LSB). if [ -f /etc/os-release ]; then source /etc/os-release - OSDISTRIB="$NAME" + OSDISTRIB="$ID" + OSVERSION="$VERSION_ID" else OSDISTRIB=$(lsb_release -is 2>/dev/null) + OSVERSION=$(lsb_release -rs 2>/dev/null) fi +# Convertir distribución a minúsculas y obtener solo el 1er número de versión. +OSDISTRIB="${OSDISTRIB,,}" +OSVERSION="${OSVERSION%%.*}" -# Configuración según la distribución GNU/Linux. +# Configuración según la distribución GNU/Linux (usar minúsculas). case "$OSDISTRIB" in - Ubuntu|Debian|LinuxMint) - DEPENDENCIES=( subversion apache2 php5 php5-ldap libapache2-mod-php5 mysql-server php5-mysql isc-dhcp-server bittorrent tftp-hpa tftpd-hpa syslinux xinetd build-essential g++-multilib libmysqlclient15-dev wget doxygen graphviz bittornado ctorrent samba rsync unzip netpipes debootstrap schroot squashfs-tools btrfs-tools procps ) + ubuntu|debian|linuxmint) + DEPENDENCIES=( subversion apache2 php5 php5-ldap libapache2-mod-php5 mysql-server php5-mysql isc-dhcp-server bittorrent tftp-hpa tftpd-hpa syslinux xinetd build-essential g++-multilib libmysqlclient15-dev wget doxygen graphviz bittornado ctorrent samba rsync unzip netpipes debootstrap schroot squashfs-tools btrfs-tools procps arp-scan ) UPDATEPKGLIST="apt-get update" INSTALLPKG="apt-get -y install --force-yes" CHECKPKG="dpkg -s \$package 2>/dev/null | grep Status | grep -qw install" @@ -181,11 +186,11 @@ case "$OSDISTRIB" in SYSLINUXDIR=/usr/lib/syslinux TFTPCFGDIR=/var/lib/tftpboot ;; - Fedora|CentOS) - DEPENDENCIES=( subversion httpd mod_ssl php php-ldap mysql-server mysql-devel mysql-devel.i686 php-mysql dhcp tftp-server tftp syslinux xinetd binutils gcc gcc-c++ glibc-devel glibc-devel.i686 glibc-static glibc-static.i686 libstdc++ libstdc++.i686 libstdc++-devel.i686 make wget doxygen graphviz ctorrent samba rsync unzip debootstrap schroot squashfs-tools python-crypto ) + fedora|centos) + DEPENDENCIES=( subversion httpd mod_ssl php php-ldap mysql-server mysql-devel mysql-devel.i686 php-mysql dhcp tftp-server tftp syslinux xinetd binutils gcc gcc-c++ glibc-devel glibc-devel.i686 glibc-static glibc-static.i686 libstdc++ libstdc++.i686 libstdc++-devel.i686 make wget doxygen graphviz ctorrent samba samba-client rsync unzip debootstrap schroot squashfs-tools python-crypto arp-scan ) INSTALLEXTRADEPS=( 'rpm -Uv ftp://ftp.altlinux.org/pub/distributions/ALTLinux/5.1/branch/files/i586/RPMS/netpipes-4.2-alt1.i586.rpm' - 'pushd /tmp; wget http://download.bittornado.com/download/BitTornado-0.3.18.tar.gz; tar xvzf BitTornado-0.3.18.tar.gz; cd BitTornado-CVS; python setup.py install; ln -fs btlaunchmany.py /usr/bin/btlaunchmany; ln -fs bttrack.py /usr/bin/bttrack; popd' ) - if [ "$OSDISTRIB" == "CentOS" ]; then + 'pushd /tmp; wget -t3 http://download.bittornado.com/download/BitTornado-0.3.18.tar.gz && tar xvzf BitTornado-0.3.18.tar.gz && cd BitTornado-CVS && python setup.py install && ln -fs btlaunchmany.py /usr/bin/btlaunchmany && ln -fs bttrack.py /usr/bin/bttrack; popd' ) + if [ "$OSDISTRIB" == "centos" ]; then UPDATEPKGLIST='test rpm -q --quiet epel-release || echo -e "[epel]\nname=EPEL temporal\nmirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-\$releasever&arch=\$basearch\nenabled=1\ngpgcheck=0" >/etc/yum.repos.d/epel.repo' fi INSTALLPKG="yum install -y" @@ -266,7 +271,7 @@ local DHCPVERSION # Configuración personallizada de algunos paquetes. case "$OSDISTRIB" in - Ubuntu|LinuxMint) # Postconfiguación personalizada para Ubuntu. + ubuntu|linuxmint) # Postconfiguación personalizada para Ubuntu. # Configuración para DHCP v3. DHCPVERSION=$(apt-cache show $(apt-cache pkgnames|egrep "dhcp.?-server$") | \ awk '/Version/ {print substr($2,1,1);}' | \ @@ -277,13 +282,22 @@ case "$OSDISTRIB" in DHCPCFGDIR=/etc/dhcp3 fi ;; - CentOS) # Postconfiguación personalizada para CentOS. + centos) # Postconfiguación personalizada para CentOS. # Incluir repositorio de paquetes EPEL y paquetes específicos. DEPENDENCIES=( ${DEPENDENCIES[@]} epel-release procps ) + # Cambios a aplicar a partir de CentOS 7. + if [ $OSVERSION -ge 7 ]; then + # Sustituir MySQL por MariaDB. + DEPENDENCIES=( ${DEPENDENCIES[*]/mysql-/mariadb-} ) + # Instalar arp-scan de CentOS 6 (no disponible en CentOS 7). + DEPENDENCIES=( ${DEPENDENCIES[*]/arp-scan/http://dag.wieers.com/redhat/el6/en/$(arch)/dag/RPMS/arp-scan-1.9-1.el6.rf.$(arch).rpm} ) + fi ;; - Fedora) # Postconfiguación personalizada para Fedora. + fedora) # Postconfiguación personalizada para Fedora. # Incluir paquetes específicos. DEPENDENCIES=( ${DEPENDENCIES[@]} libstdc++-static.i686 btrfs-progs procps-ng ) + # Sustituir MySQL por MariaDB a partir de Fedora 20. + [ $OSVERSION -ge 20 ] && DEPENDENCIES=( ${DEPENDENCIES[*]/mysql-/mariadb-} ) ;; esac } @@ -314,6 +328,14 @@ function errorAndLog() echo "$DATETIME;$SSH_CLIENT;ERROR: $1" >> $LOG_FILE } +# Escribe a fichero y muestra mensaje de aviso +function warningAndLog() +{ + local DATETIME=`getDateTime` + echo "Warning: $1" + echo "$DATETIME;$SSH_CLIENT;Warning: $1" >> $LOG_FILE +} + # Comprueba si el elemento pasado en $2 está en el array $1 function isInArray() { @@ -459,7 +481,7 @@ function backupFile() local dateymd=`date +%Y%m%d` if [ ! -f "$file" ]; then - errorAndLog "${FUNCNAME}(): file $file doesn't exists" + warningAndLog "${FUNCNAME}(): file $file doesn't exists" return 1 fi @@ -577,6 +599,7 @@ function mysqlDbExists() fi } +# Comprueba si la base de datos está vacía. function mysqlCheckDbIsEmpty() { if [ $# -ne 1 ]; then @@ -602,7 +625,14 @@ function mysqlCheckDbIsEmpty() } - +# Importa un fichero SQL en la base de datos. +# Parámetros: +# - 1: nombre de la BD. +# - 2: fichero a importar. +# Nota: el fichero SQL puede contener las siguientes palabras reservadas: +# - SERVERIP: se sustituye por la dirección IP del servidor. +# - DBUSER: se sustituye por usuario de conexión a la BD definido en este script. +# - DBPASSWD: se sustituye por la clave de conexión a la BD definida en este script. function mysqlImportSqlFileToDb() { if [ $# -ne 2 ]; then @@ -664,7 +694,7 @@ function mysqlCreateDb() return 0 } - +# Comprueba si ya está definido el usuario de acceso a la BD. function mysqlCheckUserExists() { if [ $# -ne 1 ]; then @@ -722,6 +752,7 @@ EOF ####### Funciones para el manejo de Subversion ##################################################################### +# Obtiene el código fuente del proyecto desde el servidor SVN. function svnExportCode() { if [ $# -ne 1 ]; then @@ -798,8 +829,8 @@ function getNetworkSettings() awk '/Mask/ {sub(/.*:/,"",$4); print $4} /netmask/ {print $4}') NETBROAD[i]=$(ip -o addr show dev $dev | awk '$3~/inet$/ {print ($6)}') - NETIP[i]=$(netstat -nr | awk -v d="$dev" '$1!~/0\.0\.0\.0/&&$8==d {if (n=="") n=$1} END {print n}') - ROUTERIP[i]=$(netstat -nr | awk -v d="$dev" '$1~/0\.0\.0\.0/&&$8==d {print $2}') + NETIP[i]=$(ip route | awk -v d="$dev" '$3==d && /src/ {sub (/\/.*/,""); print $1}') + ROUTERIP[i]=$(ip route | awk -v d="$dev" '$1=="default" && $5==d {print $3}') DEFAULTDEV=${DEFAULTDEV:-"$dev"} fi let i++ @@ -836,138 +867,27 @@ function tftpConfigure() perl -pi -e 's/disable.*/disable = no/' $INETDCFGDIR/$TFTPSERV else service=$TFTPSERV - $ENABLESERVICE + $ENABLESERVICE; $STARTSERVICE fi fi service=$INETDSERV $ENABLESERVICE; $STARTSERVICE - # preparacion contenedor tftpboot + # Copiar ficheros de Syslinux. cp -a $SYSLINUXDIR $TFTPCFGDIR/syslinux - cp -a $SYSLINUXDIR/pxelinux.0 $TFTPCFGDIR - # prepamos el directorio de la configuracion de pxe - mkdir -p $TFTPCFGDIR/pxelinux.cfg - cat > $TFTPCFGDIR/pxelinux.cfg/default <<EOF -DEFAULT syslinux/vesamenu.c32 -MENU TITLE Aplicacion GNSYS - -LABEL 1 -MENU LABEL 1 -KERNEL syslinux/chain.c32 -APPEND hd0 - -PROMPT 0 -TIMEOUT 10 -EOF + # comprobamos el servicio tftp sleep 1 testPxe } +# Comprueba que haya conexión al servicio TFTP/PXE. function testPxe () { echoAndLog "${FUNCNAME}(): Checking TFTP service... please wait." - pushd /tmp - tftp -v localhost -c get pxelinux.0 /tmp/pxelinux.0 && echoAndLog "TFTP service is OK." || errorAndLog "TFTP service is down." - popd -} - - -######################################################################## -## Configuracion servicio NFS -######################################################################## - -# Configurar servicio NFS. -# ADVERTENCIA: usa variables globales NETIP y NETMASK! -function nfsConfigure() -{ - echoAndLog "${FUNCNAME}(): Config nfs server." - backupFile /etc/exports - - nfsAddExport $INSTALL_TARGET/client ${NETIP}/${NETMASK}:ro,no_subtree_check,no_root_squash,sync - if [ $? -ne 0 ]; then - errorAndLog "${FUNCNAME}(): error while adding NFS client config" - return 1 - fi - - nfsAddExport $INSTALL_TARGET/images ${NETIP}/${NETMASK}:rw,no_subtree_check,no_root_squash,sync,crossmnt - if [ $? -ne 0 ]; then - errorAndLog "${FUNCNAME}(): error while adding NFS images config" - return 1 - fi - - nfsAddExport $INSTALL_TARGET/log/clients ${NETIP}/${NETMASK}:rw,no_subtree_check,no_root_squash,sync - if [ $? -ne 0 ]; then - errorAndLog "${FUNCNAME}(): error while adding logging client config" - return 1 - fi - - nfsAddExport $INSTALL_TARGET/tftpboot ${NETIP}/${NETMASK}:ro,no_subtree_check,no_root_squash,sync - if [ $? -ne 0 ]; then - errorAndLog "${FUNCNAME}(): error while adding second filesystem for the PXE ogclient" - return 1 - fi - - /etc/init.d/nfs-kernel-server restart - exportfs -va - if [ $? -ne 0 ]; then - errorAndLog "${FUNCNAME}(): error while configure exports" - return 1 - fi - - echoAndLog "${FUNCNAME}(): Added NFS configuration to file \"/etc/exports\"." - return 0 -} - - -# Añadir entrada en fichero de configuración del servidor NFS. -# Ejemplos: -#nfsAddExport /opt/opengnsys 192.168.0.0/255.255.255.0:ro,no_subtree_check,no_root_squash,sync -#nfsAddExport /opt/opengnsys 192.168.0.0/255.255.255.0 -#nfsAddExport /opt/opengnsys 80.20.2.1:ro 192.123.32.2:rw -function nfsAddExport() -{ - if [ $# -lt 2 ]; then - errorAndLog "${FUNCNAME}(): invalid number of parameters" - exit 1 - fi - if [ ! -f /etc/exports ]; then - errorAndLog "${FUNCNAME}(): /etc/exports don't exists" - return 1 - fi - - local export="$1" - local contador=0 - local cadenaexport - - grep "^$export" /etc/exports > /dev/null - if [ $? -eq 0 ]; then - echoAndLog "${FUNCNAME}(): $export exists in /etc/exports, omiting" - return 0 - fi - - cadenaexport="${export}" - for parametro in $*; do - if [ $contador -gt 0 ]; then - host=`echo $parametro | awk -F: '{print $1}'` - options=`echo $parametro | awk -F: '{print $2}'` - if [ "${host}" == "" ]; then - errorAndLog "${FUNCNAME}(): host can't be empty" - return 1 - fi - cadenaexport="${cadenaexport}\t${host}" - - if [ "${options}" != "" ]; then - cadenaexport="${cadenaexport}(${options})" - fi - fi - let contador=contador+1 - done - - echo -en "$cadenaexport\n" >> /etc/exports - - echoAndLog "${FUNCNAME}(): add $export to /etc/exports" - return 0 + echo "test" >$TFTPCFGDIR/testpxe + tftp -v 127.0.0.1 -c get testpxe /tmp/testpxe && echoAndLog "TFTP service is OK." || errorAndLog "TFTP service is down." + rm -f $TFTPCFGDIR/testpxe /tmp/testpxe } @@ -1216,7 +1136,6 @@ function createDirs() mkdir -p $path_opengnsys_base/images mkdir -p $TFTPCFGDIR ln -fs $TFTPCFGDIR $path_opengnsys_base/tftpboot - mkdir -p $path_opengnsys_base/tftpboot/pxelinux.cfg mkdir -p $path_opengnsys_base/tftpboot/menu.lst if [ $? -ne 0 ]; then errorAndLog "${FUNCNAME}(): error while creating dirs. Do you have write permissions?" @@ -1263,6 +1182,7 @@ function copyServerFiles () local path_opengnsys_base="$1" + # Lista de ficheros y directorios origen y de directorios destino. local SOURCES=( server/tftpboot \ server/bin \ repoman/bin \ @@ -1270,7 +1190,6 @@ function copyServerFiles () admin/Sources/Services/ogAdmRepoAux installer/opengnsys_uninstall.sh \ installer/opengnsys_update.sh \ - installer/install_ticket_wolunicast.sh \ doc ) local TARGETS=( tftpboot \ bin \ @@ -1279,7 +1198,6 @@ function copyServerFiles () sbin \ lib \ lib \ - lib \ doc ) if [ ${#SOURCES[@]} != ${#TARGETS[@]} ]; then @@ -1287,6 +1205,7 @@ function copyServerFiles () exit 1 fi + # Copiar ficheros. echoAndLog "${FUNCNAME}(): copying files to server directories" pushd $WORKDIR/opengnsys @@ -1299,9 +1218,10 @@ function copyServerFiles () echoAndLog "Copying content of ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}" cp -a "${SOURCES[$i]}"/* "${path_opengnsys_base}/${TARGETS[$i]}" else - echoAndLog "Warning: Unable to copy ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}" + warningAndLog "Unable to copy ${SOURCES[$i]} to $path_opengnsys_base/${TARGETS[$i]}" fi done + popd } @@ -1400,6 +1320,12 @@ function copyClientFiles() errstatus=1 fi + # Si el servidor tiene instalado Rsync > 3.0.9, renombrar el ejecutable + # compilado para el cliente. + if [ -n "$(rsync --version | awk '/version/ {if ($3>="3.1.0") print $3}')" ]; then + [ -e $INSTALL_TARGET/client/bin/rsync-3.1.0 ] && mv -f $INSTALL_TARGET/client/bin/rsync-3.1.0 $INSTALL_TARGET/client/bin/rsync + fi + if [ $errstatus -eq 0 ]; then echoAndLog "${FUNCNAME}(): client copy files success." else @@ -1414,8 +1340,8 @@ function copyClientFiles() function clientCreate() { local DOWNLOADURL="http://$OPENGNSYS_SERVER/downloads" - local FILENAME=ogLive-precise-3.2.0-23-generic-r3257.iso # 1.0.4-rc2 - #local FILENAME=ogLive-raring-3.8.0-22-generic-r3836.iso # 1.0.5-rc3 + local FILENAME=ogLive-precise-3.2.0-23-generic-r4311.iso # 1.0.6-kernel3.2 + #local FILENAME=ogLive-precise-3.11.0-26-generic-r4413.iso # 1.0.6-kernel3.11 local TARGETFILE=$INSTALL_TARGET/lib/$FILENAME local TMPDIR=/tmp/${FILENAME%.iso} @@ -1447,7 +1373,7 @@ function clientCreate() find -L $INSTALL_TARGET/tftpboot -type d -exec chmod 755 {} \; find -L $INSTALL_TARGET/tftpboot -type f -exec chmod 644 {} \; chown -R :$OPENGNSYS_CLIENT_USER $INSTALL_TARGET/tftpboot/ogclient - chown -R $APACHE_RUN_USER:$APACHE_RUN_GROUP $INSTALL_TARGET/tftpboot/{menu.lst,pxelinux.cfg} + chown -R $APACHE_RUN_USER:$APACHE_RUN_GROUP $INSTALL_TARGET/tftpboot/menu.lst # Ofrecer md5 del kernel y vmlinuz para ogupdateinitrd en cache cp -av $INSTALL_TARGET/tftpboot/ogclient/ogvmlinuz* $INSTALL_TARGET/tftpboot @@ -1467,6 +1393,11 @@ function openGnsysConfigure() echoAndLog "${FUNCNAME}(): Copying init files." cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.init /etc/init.d/opengnsys cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.default /etc/default/opengnsys + # Deshabilitar servicios de BitTorrent si no están instalados. + if [ ! -e /usr/bin/bttrack ]; then + sed -i 's/RUN_BTTRACKER="yes"/RUN_BTTRACKER="no"/; s/RUN_BTSEEDER="yes"/RUN_BTSEEDER="no"/' \ + /etc/default/opengnsys + fi echoAndLog "${FUNCNAME}(): Creating cron files." echo "* * * * * root [ -x $INSTALL_TARGET/bin/opengnsys.cron ] && $INSTALL_TARGET/bin/opengnsys.cron" > /etc/cron.d/opengnsys echo "* * * * * root [ -x $INSTALL_TARGET/bin/torrent-creator ] && $INSTALL_TARGET/bin/torrent-creator" > /etc/cron.d/torrentcreator @@ -1492,7 +1423,7 @@ function openGnsysConfigure() -e "s/DBPASSWORD/$OPENGNSYS_DB_PASSWD/g" \ -e "s/DATABASE/$OPENGNSYS_DATABASE/g" \ $WORKDIR/opengnsys/admin/Sources/Services/ogAdmAgent/ogAdmAgent.cfg > $INSTALL_TARGET/etc/ogAdmAgent-$dev.cfg - CONSOLEURL="http://${SERVERIP[i]}/opengnsys" + CONSOLEURL="https://${SERVERIP[i]}/opengnsys" sed -e "s/SERVERIP/${SERVERIP[i]}/g" \ -e "s/DBUSER/$OPENGNSYS_DB_USER/g" \ -e "s/DBPASSWORD/$OPENGNSYS_DB_PASSWD/g" \ @@ -1503,7 +1434,7 @@ function openGnsysConfigure() -e "s/OPENGNSYSURL/${CONSOLEURL//\//\\/}/g" \ $WORKDIR/opengnsys/admin/Sources/Clients/ogAdmClient/ogAdmClient.cfg > $INSTALL_TARGET/client/etc/ogAdmClient-$dev.cfg if [ "$dev" == "$DEFAULTDEV" ]; then - OPENGNSYS_CONSOLEURL="${CONSOLEURL/http:/https:}" + OPENGNSYS_CONSOLEURL="$CONSOLEURL" fi fi let i++ @@ -1517,6 +1448,13 @@ function openGnsysConfigure() chmod 600 $INSTALL_TARGET/etc/{ogAdmServer,ogAdmAgent}*.cfg chown $APACHE_RUN_USER:$APACHE_RUN_GROUP $INSTALL_TARGET/www/controlacceso*.php chmod 600 $INSTALL_TARGET/www/controlacceso*.php + + # Revisar permisos generales. + if [ -x $INSTALL_TARGET/bin/checkperms ]; then + echoAndLog "${FUNCNAME}(): Checking permissions." + OPENGNSYS_DIR="$INSTALL_TARGET" OPENGNSYS_USER="$OPENGNSYS_CLIENT_USER" APACHE_USER="$APACHE_RUN_USER" APACHE_GROUP="$APACHE_RUN_GROUP" $INSTALL_TARGET/bin/checkperms + fi + echoAndLog "${FUNCNAME}(): Starting OpenGnSys services." service="opengnsys" $ENABLESERVICE; $STARTSERVICE @@ -1531,9 +1469,13 @@ function installationSummary() { # Crear fichero de versión y revisión, si no existe. local VERSIONFILE="$INSTALL_TARGET/doc/VERSION.txt" - local REVISION=$(LANG=C svn info $SVN_URL|awk '/Rev:/ {print "r"$4}') - [ -f $VERSIONFILE ] || echo "OpenGnSys" >$VERSIONFILE - perl -pi -e "s/($| r[0-9]*)/ $REVISION/" $VERSIONFILE + [ -f $VERSIONFILE ] || echo "OpenGnSys Server" >$VERSIONFILE + # Incluir datos de revisión, si se está instaladno desde el repositorio + # de código o si no está incluida en el fichero de versión. + if [ $USESVN -eq 1 ] || [ -z "$(awk '$3~/r[0-9]*/ {print}' $VERSIONFILE)" ]; then + local REVISION=$(LANG=C svn info $SVN_URL|awk '/Rev:/ {print "r"$4}') + perl -pi -e "s/($| r[0-9]*)/ $REVISION/" $VERSIONFILE + fi # Mostrar información. echo @@ -1548,12 +1490,15 @@ function installationSummary() echoAndLog "Samba configuration directory: $SAMBACFGDIR" echoAndLog "Web Console URL: $OPENGNSYS_CONSOLEURL" echoAndLog "Web Console access data: specified in installer script" + if grep -q "^RUN_BTTRACK.*no" /etc/default/opengnsys; then + echoAndLog "BitTorrent service is disabled." + fi echo echoAndLog "Post-Installation Instructions:" echo "===============================" echoAndLog "Firewall service has been disabled and SELinux mode set to" echoAndLog " permissive during OpenGnSys installation. Please check" - echoAndLog " $FIREWALLSERV and SELinux configuration, if needed." + echoAndLog " ${FIREWALLSERV:-firewall} and SELinux configuration, if needed." echoAndLog "Review or edit all configuration files." echoAndLog "Insert DHCP configuration data and restart service." echoAndLog "Optional: Log-in as Web Console admin user." @@ -1676,7 +1621,7 @@ if [ $? -ne 0 ]; then fi # Instalar base de datos de OpenGnSys Admin. -isInArray notinstalled "mysql-server" +isInArray notinstalled "mysql-server" || isInArray notinstalled "mariadb-server" if [ $? -eq 0 ]; then # Habilitar gestor de base de datos (MySQL, si falla, MariaDB). service=$MYSQLSERV diff --git a/installer/opengnsys_update.sh b/installer/opengnsys_update.sh index 1dff1528..71f71d97 100755 --- a/installer/opengnsys_update.sh +++ b/installer/opengnsys_update.sh @@ -2,7 +2,6 @@ #/** #@file opengnsys_update.sh #@brief Script actualización de OpenGnSys -#@warning No se actualiza BD, ni ficheros de configuración. #@version 0.9 - basado en opengnsys_installer.sh #@author Ramón Gómez - ETSII Univ. Sevilla #@date 2010/01/27 @@ -24,6 +23,9 @@ #@version 1.0.5 - Actualizar BD en la misma versión, compatibilidad con Fedora (systemd) y configuración de Rsync. #@author Ramón Gómez - ETSII Univ. Sevilla #@date 2014/04/03 +#@version 1.0.6 - Redefinir URLs de ficheros de configuración usando HTTPS. +#@author Ramón Gómez - ETSII Univ. Sevilla +#@date 2015/03/12 #*/ @@ -91,13 +93,23 @@ function autoConfigure() { local i -# Detectar sistema operativo del servidor (debe soportar LSB). -OSDISTRIB=$(lsb_release -is 2>/dev/null) +# Detectar sistema operativo del servidor (compatible con fichero os-release y con LSB). +if [ -f /etc/os-release ]; then + source /etc/os-release + OSDISTRIB="$ID" + OSVERSION="$VERSION_ID" +else + OSDISTRIB=$(lsb_release -is 2>/dev/null) + OSVERSION=$(lsb_release -rs 2>/dev/null) +fi +# Convertir distribución a minúsculas y obtener solo el 1er número de versión. +OSDISTRIB="${OSDISTRIB,,}" +OSVERSION="${OSVERSION%%.*}" # Configuración según la distribución de Linux. case "$OSDISTRIB" in - Ubuntu|Debian|LinuxMint) - DEPENDENCIES=( php5-ldap xinetd rsync btrfs-tools procps) + ubuntu|debian|linuxmint) + DEPENDENCIES=( php5-ldap xinetd rsync btrfs-tools procps arp-scan ) UPDATEPKGLIST="apt-get update" INSTALLPKGS="apt-get -y install --force-yes" CHECKPKG="dpkg -s \$package 2>/dev/null | grep -q \"Status: install ok\"" @@ -113,8 +125,10 @@ case "$OSDISTRIB" in APACHEGROUP="www-data" INETDCFGDIR=/etc/xinetd.d ;; - Fedora|CentOS) - DEPENDENCIES=( php-ldap xinetd rsync btrfs-progs procps-ng ) + fedora|centos) + DEPENDENCIES=( php-ldap xinetd rsync btrfs-progs procps-ng arp-scan ) + # En CentOS 7 instalar arp-scan de CentOS 6. + [ "$OSDISTRIB$OSVERSION" == "centos7" ] && DEPENDENCIES=( ${DEPENDENCIES[*]/arp-scan/http://dag.wieers.com/redhat/el6/en/$(arch)/dag/RPMS/arp-scan-1.9-1.el6.rf.$(arch).rpm} ) INSTALLPKGS="yum install -y" CHECKPKG="rpm -q --quiet \$package" if which systemctl &>/dev/null; then @@ -188,6 +202,14 @@ function errorAndLog() echo "$DATETIME;$SSH_CLIENT;ERROR: $1" >> $LOG_FILE } +# Escribe a fichero y muestra mensaje de aviso +function warningAndLog() +{ + local DATETIME=`getDateTime` + echo "Warning: $1" + echo "$DATETIME;$SSH_CLIENT;Warning: $1" >> $LOG_FILE +} + ##################################################################### ####### Funciones de copia de seguridad y restauración de ficheros @@ -206,7 +228,7 @@ function backupFile() local fecha=`date +%Y%m%d` if [ ! -f $fichero ]; then - errorAndLog "${FUNCNAME}(): file $fichero doesn't exists" + warningAndLog "${FUNCNAME}(): file $fichero doesn't exists" return 1 fi @@ -363,6 +385,7 @@ function getNetworkSettings() local dev echoAndLog "${FUNCNAME}(): Detecting network parameters." + SERVERIP="$ServidorAdm" DEVICES="$(ip -o link show up | awk '!/loopback/ {sub(/:.*/,"",$2); print $2}')" for dev in $DEVICES; do [ -z "$SERVERIP" ] && SERVERIP=$(ip -o addr show dev $dev | awk '$3~/inet$/ {sub (/\/.*/, ""); print ($4)}') @@ -374,9 +397,10 @@ function getNetworkSettings() ####### Funciones específicas de la instalación de Opengnsys ##################################################################### -# Actualizar cliente OpenGnSys +# Actualizar cliente OpenGnSys. function updateClientFiles() { + # Actualizar ficheros del cliente. echoAndLog "${FUNCNAME}(): Updating OpenGnSys Client files." rsync --exclude .svn -irplt $WORKDIR/opengnsys/client/shared/* $INSTALL_TARGET/client if [ $? -ne 0 ]; then @@ -384,7 +408,14 @@ function updateClientFiles() exit 1 fi find $INSTALL_TARGET/client -name .svn -type d -exec rm -fr {} \; 2>/dev/null - + # Hacer coincidir las versiones de Rsync entre servidor y cliente. + if [ -n "$(rsync --version | awk '/version/ {if ($3>="3.1.0") print $3}')" ]; then + [ -e $WORKDIR/opengnsys/client/bin/rsync-3.1.0 ] && mv -f $WORKDIR/opengnsys/client/bin/rsync-3.1.0 $WORKDIR/opengnsys/client/bin/rsync + else + [ -e $WORKDIR/opengnsys/client/bin/rsync ] && mv -f $WORKDIR/opengnsys/client/bin/rsync $WORKDIR/opengnsys/client/bin/rsync-3.1.0 + fi + + # Actualizar librerías del motor de clonación. echoAndLog "${FUNCNAME}(): Updating OpenGnSys Cloning Engine files." rsync --exclude .svn -irplt $WORKDIR/opengnsys/client/engine/*.lib* $INSTALL_TARGET/client/lib/engine/bin if [ $? -ne 0 ]; then @@ -478,6 +509,13 @@ function updateWebFiles() fi restoreFile $INSTALL_TARGET/www/controlacceso.php + # Cambiar acceso a protocolo HTTPS. + if grep -q "http://" $INSTALL_TARGET/www/controlacceso.php 2>/dev/null; then + echoAndLog "${FUNCNAME}(): updating web access file" + perl -pi -e 's!http://!https://!g' $INSTALL_TARGET/www/controlacceso.php + NEWFILES="$NEWFILES $INSTALL_TARGET/www/controlacceso.php" + fi + # Compatibilidad con dispositivos móviles. COMPATDIR="$INSTALL_TARGET/www/principal" for f in acciones administracion aula aulas hardwares imagenes menus repositorios softwares; do @@ -548,7 +586,7 @@ function createDirs() [ -d $dir ] && ln -fs $dir ${INSTALL_TARGET}/tftpboot done fi - mkdir -p ${INSTALL_TARGET}/tftpboot/{pxelinux.cfg,menu.lst} + mkdir -p ${INSTALL_TARGET}/tftpboot/menu.lst if [ $? -ne 0 ]; then errorAndLog "${FUNCNAME}(): error while creating dirs. Do you have write permissions?" return 1 @@ -568,10 +606,10 @@ function createDirs() # Establecer los permisos básicos. echoAndLog "${FUNCNAME}(): setting directory permissions" - chmod -R 775 $INSTALL_TARGET/{log/clients,images,tftpboot/pxelinux.cfg,tftpboot/menu.lst} + chmod -R 775 $INSTALL_TARGET/{log/clients,images,tftpboot/menu.lst} mkdir -p $INSTALL_TARGET/tftpboot/menu.lst/examples ! [ -f $INSTALL_TARGET/tftpboot/menu.lst/templates/00unknown ] && mv $INSTALL_TARGET/tftpboot/menu.lst/templates/* $INSTALL_TARGET/tftpboot/menu.lst/examples - chown -R :$OPENGNSYS_CLIENTUSER $INSTALL_TARGET/{log/clients,images,tftpboot/pxelinux.cfg,tftpboot/menu.lst} + chown -R :$OPENGNSYS_CLIENTUSER $INSTALL_TARGET/{log/clients,images,tftpboot/menu.lst} if [ $? -ne 0 ]; then errorAndLog "${FUNCNAME}(): error while setting permissions" return 1 @@ -596,7 +634,6 @@ function updateServerFiles() admin/Sources/Services/ogAdmRepoAux \ server/tftpboot \ installer/opengnsys_uninstall.sh \ - installer/install_ticket_wolunicast.sh \ doc ) local TARGETS=( bin \ bin \ @@ -604,7 +641,6 @@ function updateServerFiles() sbin/ogAdmRepoAux \ tftpboot \ lib/opengnsys_uninstall.sh \ - lib/install_ticket_wolunicast.sh \ doc ) if [ ${#SOURCES[@]} != ${#TARGETS[@]} ]; then @@ -636,10 +672,10 @@ function updateServerFiles() cp -a $WORKDIR/opengnsys/admin/Sources/Services/opengnsys.init /etc/init.d/opengnsys NEWFILES="$NEWFILES /etc/init.d/opengnsys" fi - if grep -q "UrlMsg=.*msgbrowser.php" $INSTALL_TARGET/client/etc/ogAdmClient.cfg 2>/dev/null; then + if egrep -q "(UrlMsg=.*msgbrowser.php)|(UrlMenu=http://)" $INSTALL_TARGET/client/etc/ogAdmClient.cfg 2>/dev/null; then echoAndLog "${FUNCNAME}(): updating new client config file" backupFile $INSTALL_TARGET/client/etc/ogAdmClient.cfg - perl -pi -e 's!UrlMsg=.*msgbrowser\.php!UrlMsg=http://localhost/cgi-bin/httpd-log\.sh!g' $INSTALL_TARGET/client/etc/ogAdmClient.cfg + perl -pi -e 's!UrlMsg=.*msgbrowser\.php!UrlMsg=http://localhost/cgi-bin/httpd-log\.sh!g; s!UrlMenu=http://!UrlMenu=https://!g' $INSTALL_TARGET/client/etc/ogAdmClient.cfg NEWFILES="$NEWFILES $INSTALL_TARGET/client/etc/ogAdmClient.cfg" fi echoAndLog "${FUNCNAME}(): updating cron files" @@ -730,8 +766,8 @@ function compileServices() function updateClient() { local DOWNLOADURL="http://$OPENGNSYS_SERVER/downloads" - local FILENAME=ogLive-precise-3.2.0-23-generic-r3257.iso # 1.0.4-rc2 - #local FILENAME=ogLive-raring-3.8.0-22-generic-r3836.iso # 1.0.5-rc3 + local FILENAME=ogLive-precise-3.2.0-23-generic-r4311.iso # 1.0.6-kernel3.2 + #local FILENAME=ogLive-precise-3.11.0-26-generic-r4413.iso # 1.0.6-kernel3.11 local SOURCEFILE=$DOWNLOADURL/$FILENAME local TARGETFILE=$INSTALL_TARGET/lib/$FILENAME local SOURCELENGTH @@ -777,7 +813,7 @@ function updateClient() find -L $INSTALL_TARGET/tftpboot -type d -exec chmod 755 {} \; find -L $INSTALL_TARGET/tftpboot -type f -exec chmod 644 {} \; chown -R :$OPENGNSYS_CLIENTUSER $INSTALL_TARGET/tftpboot/ogclient - chown -R $APACHE_RUN_USER:$APACHE_RUN_GROUP $INSTALL_TARGET/tftpboot/{menu.lst,pxelinux.cfg} + chown -R $APACHE_RUN_USER:$APACHE_RUN_GROUP $INSTALL_TARGET/tftpboot/menu.lst # Ofrecer md5 del kernel y vmlinuz para ogupdateinitrd en cache cp -av $INSTALL_TARGET/tftpboot/ogclient/ogvmlinuz* $INSTALL_TARGET/tftpboot @@ -816,6 +852,22 @@ function updateClient() fi } +# Comprobar permisos y ficheros. +function checkFiles() +{ + # Comprobar permisos adecuados. + if [ -x $INSTALL_TARGET/bin/checkperms ]; then + echoAndLog "${FUNCNAME}(): Checking permissions." + OPENGNSYS_DIR="$INSTALL_TARGET" OPENGNSYS_USER="$OPENGNSYS_CLIENTUSER" APACHE_USER="$APACHE_RUN_USER" APACHE_GROUP="$APACHE_RUN_GROUP" $INSTALL_TARGET/bin/checkperms + fi + + # Eliminamos el fichero de estado del tracker porque es incompatible entre los distintos paquetes + if [ -f /tmp/dstate ]; then + echoAndLog "${FUNCNAME}(): Delete unused files." + rm -f /tmp/dstate + fi +} + # Resumen de actualización. function updateSummary() { @@ -956,10 +1008,8 @@ if [ $? -ne 0 ]; then exit 1 fi -# Eliminamos el fichero de estado del tracker porque es incompatible entre los distintos paquetes -if [ -f /tmp/dstate ]; then - rm -f /tmp/dstate -fi +# Comprobar permisos y ficheros. +checkFiles # Mostrar resumen de actualización. updateSummary diff --git a/repoman/bin/deleteimage b/repoman/bin/deleteimage index 3807b841..f208fb9b 100755 --- a/repoman/bin/deleteimage +++ b/repoman/bin/deleteimage @@ -1,17 +1,19 @@ #!/bin/bash -# deleteimage [ -b | -r | -i ] str_image +# deleteimage [ -b | -r ] str_image #@file deleteimage #@brief Borra del repositorio los ficheros de una imagen. #@param -b Elimina también la copia de seguridad de la imagen (opcional). #@param -r Recupera la copia de seguridad de la imagen (opcional). -#@param -i Elimina imagen Incremental o Basica #@param str_image Nombre canónico de la imagen, sin extensión. #@version 1.0 - Versión inicial. #@date 2012-10-14 #@author Ramón Gómez, ETSII Univ. Sevilla -#@version 1.2 - Eliminar imagen incremental. +#@version 1.0.5 - Eliminar imagen incremental. #@date 2013-07-17 #@author Alberto García, Univ. Málaga +#@version 1.0.6 - Detección automática del tipo de imagen. +#@date 2014-10-29 +#@author Ramón Gómez, ETSII Univ. Sevilla PROG=$(basename $0) @@ -25,80 +27,61 @@ DIFFEXT="diff" if [ "$*" == "help" ]; then cat << EOT $PROG: Borra los ficheros de una imagen del repositorio. -Formato: $PROG [ -b | -r | -i | -d ] str_image +Formato: $PROG [ -b | -r ] str_image -b Elimina también la copia de seguridad de la imagen. -r Recupera la copia de seguridad de la imagen. - -i Elimina imagen Incremental o Basica - -d Elimina Directorios Ejemplo: $PROG imagen1 EOT exit 0 fi - # Procesar parámetros -while getopts brid OPTION; do +while getopts br OPTION; do case $OPTION in b) DELETEBACKUP=1 ;; r) RECOVERBACKUP=1 ;; - i) DELETEINCREMEN=1 ;; - d) DELETEDIRECTORIO=1 ;; *) ERR=1 ;; esac shift $((OPTIND-1)) done - -[ -n "$DELETEBACKUP" ] && [ -n "$RECOVERBACKUP" ] && [ -n "$DELETEINCREMEN" ] && [ -n "$DELETEDIRECTORIO" ] && ERR=1 +[ -n "$DELETEBACKUP" ] && [ -n "$RECOVERBACKUP" ] && ERR=1 if [ $# != 1 -o -n "$ERR" ]; then - echo "$PROG Error: Formato: $PROG [ -b | -r | -i | -d ] str_image" + echo "$PROG Error: Formato: $PROG [ -b | -r ] str_image" exit 1 fi +# Eliminar ficheros de imagen monolítica o sincronizada básica. +IMGPATH="$OGIMG/$1.$IMGEXT" +if [ -f $IMGPATH ]; then + echo "Borrando fichero $PATHDIR" + rm -f $IMGPATH && rm -f $IMGPATH.{sum,full.sum,torrent} +else + # Eliminar ficheros de imagen sincronizada diferencial. + IMGPATH="$OGIMG/$1.$IMGEXT.$DIFFEXT" + if [ -f $IMGPATH ]; then + echo "Borrando fichero $PATHDIR" + rm -f $IMGPATH && rm -f $IMGPATH.{sum,full.sum,torrent} + else + # Eliminar directorio de imagen sincronizada. + IMGPATH="$OGIMG/$1" + if [ -d $IMGPATH ]; then + echo "Borrando directorio $PATHDIR" + rm -fr $IMGPATH + fi + fi +fi + # Recuperar copia de seguridad de la imagen. if [ -n "$RECOVERBACKUP" ]; then - mv -f $IMGFILE.$BAKEXT $IMGFILE && \ - (mv -f $IMGFILE.sum.$BAKEXT $IMGFILE.sum 2>/dev/null - mv -f $IMGFILE.torrent.$BAKEXT $IMGFILE.torrent 2>/dev/null) + [ -e $IMGPATH.$BAKEXT ] && echo "Recuperando copia $IMGPATH.$BAKEXT" + mv -f $IMGPATH.$BAKEXT $IMGPATH && \ + (mv -f $IMGPATH.sum.$BAKEXT $IMGPATH.sum 2>/dev/null + mv -f $IMGPATH.full.sum.$BAKEXT $IMGPATH.full.sum 2>/dev/null + mv -f $IMGPATH.torrent.$BAKEXT $IMGPATH.torrent 2>/dev/null) fi # Borrar copia de seguridad de la imagen. if [ -n "$DELETEBACKUP" ]; then - rm -f $IMGFILE.$BAKEXT && rm -f $IMGFILE.{sum,torrent}.$BAKEXT + [ -e $IMGPATH ] && echo "Eliminando copia $IMGPATH.$BAKEXT" + rm -f $IMGPATH.$BAKEXT && rm -f $IMGPATH.{sum,full.sum,torrent}.$BAKEXT fi -# Borrar directorio de imagen -IMGFILECA="$OGIMG/$1" -if [ -n "$DELETEINCREMEN" ];then -rm -R $IMGFILECA && exit -fi - -# Si el Nombre canonico es un directorio eliminamos -# o si la opcion es i tambien eliminamos -IMGFILECA="$OGIMG/$1" -if [ -n "$DELETEDIRECTORIO" ]; then -rm -R $IMGFILECA && exit - -# Si el Nomobre canonico NO es un directorio -else - # Comprobamos si es un archivo backup .ant - NOMBREANT=$(echo $1 | awk -F. '{print $1}') - if [ $1 == "$NOMBREANT.$BAKEXT" ]; then - IMGFILE="$OGIMG/$NOMBREANT.$IMGEXT.$BAKEXT" - # Eliminar fichero de seguridad .img.ant - rm -f $IMGFILE - else - # Comprobamos si es un archivo diferencial .diff - NOMBREDIF="$OGIMG/$1.$IMGEXT.$DIFFEXT" - if [ -f $NOMBREDIF ]; then - IMGFILE="$OGIMG/$1.$IMGEXT.$DIFFEXT" - # Eliminar fichero diferencial .diff .torrent .sum - rm -f $IMGFILE && rm -f $IMGFILE.{sum,torrent} - - else - # Fichero principal de la imagen. - IMGFILE="$OGIMG/$1.$IMGEXT" - # Eliminar ficheros de la imagen. - rm -f $IMGFILE && rm -f $IMGFILE.{sum,torrent} - fi - fi - -fi
\ No newline at end of file diff --git a/repoman/bin/deletepreimage b/repoman/bin/deletepreimage index 85883aea..39077483 100755 --- a/repoman/bin/deletepreimage +++ b/repoman/bin/deletepreimage @@ -44,7 +44,7 @@ for IMG in `ls /opt/opengnsys/images/*.delete`; do ## se llama al escript de borrado de imagen. ## Si es un Directorio Borramos if [[ $DELETEdir == "delete" ]]; then - /opt/opengnsys/bin/deleteimage -d $DELETEIMAGE + /opt/opengnsys/bin/deleteimage $DELETEIMAGE # Si es un Imagen Backup Borramos elif [[ $DELETEant == "ant" ]]; then diff --git a/repoman/bin/torrent-creator b/repoman/bin/torrent-creator index e890a958..1ede98c5 100755 --- a/repoman/bin/torrent-creator +++ b/repoman/bin/torrent-creator @@ -32,9 +32,11 @@ for IMG in *.{img,pgz,diff}; do continue fi # Comprobar si ya existe el fichero Torrent para esa imagen. - TORRENT="$IMG.torrent" + TORRENT="$IMG.torrent" SUMFILE="$IMG.sum" - if [ -f "$TORRENT" ]; then + #MD5 completo de todo el fichero imagen + SUMFULLFILE="$IMG.full.sum" + if [ -f "$TORRENT" -a -f "$SUMFULLFILE" ]; then FILESIZE="$(ls -l $IMG | awk '{print $5}')" read -e TORRFILE TORRSIZE <<<"$(ctorrent -x $TORRENT 2>/dev/null | awk '$1~/<1>/ {print $2,$3}')" [ "$(basename $IMG)" = "$TORRFILE" -a "[$FILESIZE]" = "$TORRSIZE" ] && continue @@ -43,10 +45,14 @@ for IMG in *.{img,pgz,diff}; do echo "`date` : Inicio creación de fichero $TORRENT" >> $LOGFILE touch "$LOCKFILE" trap "rm -f $LOCKFILE" 1 2 3 6 9 - rm -f "$TORRENT" "$SUMFILE" + rm -f "$TORRENT" "$SUMFILE" + # datasum de los ultimos megas del fichero para transferencias unicast y multicast DATASUM=$(tail -c1M "$IMG" | md5sum -b | cut -f1 -d" ") echo $DATASUM > "$SUMFILE" - nice -8 ctorrent -t "$IMG" -u $TRACKERURL -s "$TORRENT" -c $DATASUM -l 4194304 2>/dev/null + # Datasum completo para transferencias torrent + DATAFULLSUM=$(md5sum -b "$IMG"| cut -f1 -d" ") + echo $DATAFULLSUM > "$SUMFULLFILE" + nice -8 ctorrent -t "$IMG" -u $TRACKERURL -s "$TORRENT" -c $DATAFULLSUM -l 4194304 2>/dev/null rm -f "$LOCKFILE" if [ -f "$TORRENT" ]; then echo "`date` : Fin creación de fichero $TORRENT" >> $LOGFILE diff --git a/repoman/bin/torrent-tracker b/repoman/bin/torrent-tracker index f355b81a..7a0ac7ae 100755 --- a/repoman/bin/torrent-tracker +++ b/repoman/bin/torrent-tracker @@ -6,9 +6,9 @@ BTTRACKDFILE=/tmp/dstate BTTRACKLOG=/opt/opengnsys/log/bttrack.log BTINTERVAL=10 BTTORRENTSDIR=/opt/opengnsys/images -BTALLOW_GET=1 -#BTTRACK_OPTIONS=" --port $BTTRACKPORT --dfile $BTTRACKDFILE --reannounce_interval $BTINTERVAL --logfile $BTTRACKLOG --allowed_dir $BTTORRENTSDIR --allow_get $BTALLOW_GET --parse_allowed_interval 1" -# nuevos parametros basados en EAC 05-04-2009 antonio doblas viso. +# Desactivar descarga de torrents desde clientes no autorizados. +BTALLOW_GET=0 +# parametros basados en EAC 05-04-2009 antonio doblas viso. BTTRACK_OPTIONS=" --save_dfile_interval $BTINTERVAL --timeout_downloaders_interval $BTINTERVAL --port $BTTRACKPORT --dfile $BTTRACKDFILE --reannounce_interval $BTINTERVAL --logfile $BTTRACKLOG --allowed_dir $BTTORRENTSDIR --allow_get $BTALLOW_GET " BTTRACKPID="/var/run/bttrack.pid" BTSEEDERPID="/var/run/btseeder.pid" diff --git a/server/bin/compareDhcpOpengnsys b/server/bin/comparedhcpopengnsys index bc6447d1..53a9684c 100755 --- a/server/bin/compareDhcpOpengnsys +++ b/server/bin/comparedhcpopengnsys @@ -2,8 +2,8 @@ # Descripcion: scrit compara la configuración de los equipos en el dhcp y la base de datos de opengnsys # utiliza dos archivos temporales, uno de cada servicio, con el formato nombre;mac;ip. # El formato depende de que el fichero dhcpd.conf este en el orden "correcto" -# Uso: compareDhcpOpengnsys (fichero DHCP por defecto: /etc/dhcp/dhcpd.conf) -# DHCPFILE=/camino/fichero/dhcpd.conf compareDhcpOpengnsys +# Uso: comparedhcpopengnsys (fichero DHCP por defecto: /etc/dhcp/dhcpd.conf) +# DHCPFILE=/camino/fichero/dhcpd.conf comparedhcpopengnsys # Autora: Irina Gómez, Univ. Sevilla. # Fecha: 2012-02-08 @@ -52,7 +52,7 @@ mysql --defaults-extra-file=$TMP_MYCNF -D "$CATALOG" -N -e \ # Comparo los ficheros echo "Comparamos las configuraciones: < dhcp y > mysql" diff -bi $TMP_DHCP $TMP_MYSQL -[ $? == 0 ] && echo "El ficheros del servicio dhcp y la base de datos de ogAdmBD tienen la misma configuracion" +[ $? == 0 ] && echo "El fichero del servicio dhcp y la base de datos de ogAdmBD tienen la misma configuracion" rm -f $TMP_DHCP $TMP_MYSQL $TMP_MYCNF diff --git a/server/bin/comparemac b/server/bin/comparemac new file mode 100755 index 00000000..e3b2a24e --- /dev/null +++ b/server/bin/comparemac @@ -0,0 +1,57 @@ +#!/bin/bash +# comparemac - script para comparar las direcciones MAC (ethernet) de los clientes +# conectados a la red con las registradas en OpenGnSys. +# Requisitos: arp-scan +# Autores: Manuel González, Ramón M. Gómez - Univ. Sevilla, Junio 2014. + +# Variables. +PROG=$(basename $0) +OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} +SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg + +# Ficheros temporales. +MYCNF=$(mktemp /tmp/.my.cnf.XXXXX) +TMPSQL=$(mktemp /tmp/mysql.cnf.XXXXX) +TMPSCAN=$(mktemp /tmp/scan.cnf.XXXXX) + +# Control de errores. +if [ ! -r $SERVERCONF ]; then + echo "$PROG: Sin acceso a fichero de configuración." + exit 2 +fi +if ! which arp-scan &>/dev/null; then + echo "$PROG: Debe instalarse el programa \"arp-scan\"." + exit 2 +fi + +# Obtener datos de acceso a la base de datos. +source $SERVERCONF + +# Componer fichero con credenciales de conexión. +cat << EOT > $MYCNF +[client] +user=$USUARIO +password=$PASSWORD +EOT + +# Borrar ficheros temporales si termina el proceso. +trap "rm -f $MYCNF $TMPSQL $TMPSCAN" 0 1 2 3 6 9 15 + +# Obtener datos de ordenadores registrados. +mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \ + "SELECT ip, mac, REPLACE (aulas.nombreaula, ' ', '_') AS aula + FROM ordenadores + JOIN aulas USING (idaula) + ORDER BY ip" > $TMPSQL + +# Obtener datos de red. +NET=$(ip -o addr show up | awk -v ip="^$ServidorAdm/" '{if ($3=="inet" && $4 ~ ip) print $4}') +arp-scan $NET 2>/dev/null | awk '/^[0-2]*\./ {gsub(/:/,"");print $1,toupper($2)}' > $TMPSCAN + +# Comparar los ficheros y mostrar las diferencias de direcciones MAC. +(while read -e IP MAC; do + awk -v ip=$IP -v mac=$MAC '{if ($1 == ip && $2 != mac) + printf("%s (%s) conectado con MAC %s, registrado con %s\n",ip,$3,mac,$2); + }' $TMPSQL +done) < $TMPSCAN + diff --git a/server/bin/installoglive b/server/bin/installoglive new file mode 100755 index 00000000..32d90f82 --- /dev/null +++ b/server/bin/installoglive @@ -0,0 +1,75 @@ +#!/bin/bash +# installoglive - descarga e instala cliente ogLive. +# Nota: El usuario debe elegir el número del ogLive que desea instalar. +# Uso: installoglive +# Autor: Ramón M. Gómez - ETSII Univ. Sevilla +# Fecha: 2015-01-26 + + +# Control de acceso. +PROG=$(basename $0) +if [ "$USER" != "root" ]; then + echo "$PROG: Need to be root." >&2 + exit 1 +fi + +# Constantes. +DOWNLOADURL="http://opengnsys.es/downloads" +OPENGNSYS=/opt/opengnsys +OGINITRD=$OPENGNSYS/tftpboot/ogclient/oginitrd.img +OGVMLINUZ=$OPENGNSYS/tftpboot/ogclient/ogvmlinuz + +# Listar todos los ficheros ogLive que pueden ser descargados. +OGLIVE=( $(wget $DOWNLOADURL -O - 2>/dev/null|grep ogLive.*iso) ) +NISOS=${#OGLIVE[@]} +echo "Descargas disponibles (+- = instalado):" +for i in $(seq 1 $NISOS); do + [ -e $OPENGNSYS/lib/${OGLIVE[i-1]} ] && OGLIVE[i-1]="+-${OGLIVE[i-1]}" +done +select opt in ${OGLIVE[@]}; do + [ -n "$opt" ] && OGLIVEFILE=${opt/+-/} && break +done + +# Tamaño del fichero a descargar. +SOURCELENGTH=$(LANG=C wget --spider $DOWNLOADURL/$OGLIVEFILE 2>&1 | awk '/Length:/ {print $2}') +[ -n "$SOURCELENGTH" ] || exit + +# Descarga de ogLive. +TARGETFILE=$OPENGNSYS/lib/$OGLIVEFILE +wget $DOWNLOADURL/$OGLIVEFILE -O $TARGETFILE || exit + +# Obtener la clave actual de acceso a Samba para restaurarla tras la descarga. +if [ -f $OGINITRD ]; then + SAMBAPASS=$(gzip -dc $OGINITRD | \ + cpio -i --to-stdout scripts/ogfunctions 2>&1 | \ + grep "^[ ].*OPTIONS=" | \ + sed 's/\(.*\)pass=\(\w*\)\(.*\)/\2/') +fi + +# Hacer copia de seguridad del ogLive actual. +rm -fr $OPENGNSYS/tftpboot/ogclient.old +mv -f $OPENGNSYS/tftpboot/ogclient $OPENGNSYS/tftpboot/ogclient.old + +# Montar la imagen ISO del ogclient, actualizar ficheros y desmontar. +TMPDIR=/tmp/${OGLIVEFILE%.iso} +mkdir -p $TMPDIR +mount -o loop,ro $TARGETFILE $TMPDIR +cp -va $TMPDIR/ogclient $OPENGNSYS/tftpboot/ogclient +umount $TMPDIR +rmdir $TMPDIR + +# Recuperar la clave de acceso a Samba o solicitar una nueva clave. +if [ -n "$SAMBAPASS" ]; then + echo -ne "$SAMBAPASS\n$SAMBAPASS\n" | $OPENGNSYS/bin/setsmbpass +else + $OPENGNSYS/bin/setsmbpass +fi + +# Establecer los permisos. +find -L $OPENGNSYS/tftpboot/ogclient -type d -exec chmod 755 {} \; +find -L $OPENGNSYS/tftpboot/ogclient -type f -exec chmod 644 {} \; +chown -R :opengnsys $OPENGNSYS/tftpboot/ogclient + +# Ofrecer md5 del kernel y vmlinuz para ogupdateinitrd en cache +cp -av $OPENGNSYS/tftpboot/ogclient/{ogvmlinuz,oginitrd.img}* $OPENGNSYS/tftpboot + diff --git a/server/bin/listclientmode b/server/bin/listclientmode index da4404e0..2496a6da 100755 --- a/server/bin/listclientmode +++ b/server/bin/listclientmode @@ -11,6 +11,7 @@ PROG=$(basename $0) OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} SERVERCONF=$OPENGNSYS/etc/ogAdmServer.cfg +TMPLDIR=$OPENGNSYS/tftpboot/menu.lst/templates MYCNF=/tmp/.my.cnf.$$ # Control básico de errores. @@ -44,5 +45,7 @@ mysql --defaults-extra-file=$MYCNF -D "$CATALOG" -s -N -e \ JOIN aulas USING (idaula) WHERE aulas.nombreaula='$RESOURCE' OR nombreordenador='$RESOURCE';" | \ - awk '{ printf ("Equipo %s asociado a arranque tipo \"%s\"\n", $1, $2); }' + while read PC TMPL; do + echo "Equipo $PC asociado a arranque tipo \"$(head -1 $TMPLDIR/$TMPL |cut -f2 -d" ")\" (fichero $TMPL)" + done diff --git a/server/bin/setclientmode b/server/bin/setclientmode index 84ef0f95..02e5be59 100755 --- a/server/bin/setclientmode +++ b/server/bin/setclientmode @@ -21,14 +21,14 @@ MYCNF=/tmp/.my.cnf.$$ # Control básico de errores. if [ $# -ne 2 ]; then echo "$PROG: Error de ejecución" - echo "Formato: $PROG template [pc_name|group_name]" + echo "Formato: $PROG PLANTILLA [NOMBRE_PC|NOMBRE_AULA]" exit 1 fi if [ ! -r $SERVERCONF ]; then echo "$PROG: Sin acceso a fichero de configuración" exit 2 fi -TEMPLATE=$(grep "^#.* $1 *$" $PXEDIR/templates/*|cut -d: -f1) +TEMPLATE=$(grep -l "^#.* $1 *$" $PXEDIR/templates/*) if [ -z "$TEMPLATE" ]; then echo "No existe archivo platilla: $1" exit diff --git a/server/bin/setserveraddr b/server/bin/setserveraddr index a53245c6..921b4730 100755 --- a/server/bin/setserveraddr +++ b/server/bin/setserveraddr @@ -49,10 +49,10 @@ if [ -n "$SERVERIP" ]; then for f in /etc/{dhcp,hcp3}/dhcpd.conf; do if [ -f $f ]; then # Cambiar el parámetro "next-server" de DHCP. - sed "s/next-server.*/next-server $SERVERIP/" $f >$tmpfile + sed "s/next-server.*/next-server $SERVERIP;/" $f >$tmpfile file="${f/./-$1.}" # Copiar el fichero y enlazarlo si hay cambios. - if ! diff -q $tmpfile $file &>/dev/null; then + if [ ! $f -ef $file ] || ! diff -q $tmpfile $file &>/dev/null; then mv $tmpfile $file chmod 644 $file ln -f $file $f @@ -66,7 +66,7 @@ if [ -n "$SERVERIP" ]; then [ -x $f ] && $f restart done else - echo "Don't change the DHCP configuration." + echo "DHCP configuration has not changed." fi # Guardar la IP anterior del repositorio. @@ -90,10 +90,10 @@ if [ -n "$SERVERIP" ]; then -e "s,IPlocal=.*,IPlocal=$SERVERIP," \ -e '/localhost/!s,http://[^/]*/\(.*\),http://'$SERVERIP'/\1,' $f >$tmpfile file="${f/./-$1.}" - # Copiar el fichero y enlazarlo si hay cambios. - if ! diff -q $tmpfile $file &>/dev/null; then - mv $tmpfile $file - chmod 644 $file + # Si se usa otro interfaz o cambian los datos de red; ... + if [ ! $f -ef $file ] || ! diff -q $tmpfile $file &>/dev/null; then + # Copiar el fichero y enlazarlo. + cp $tmpfile $file ln -f $file $f CHANGE=1 fi @@ -134,7 +134,7 @@ Log-in as Web Console organization user. EOT else # Mensaje indicando que no se han cambiado datos. - echo "Don't change the default interface: $1" + echo "Default interface has not changed: $1" fi else # Error: interfaz de red no encontrado. @@ -142,3 +142,6 @@ else exit 1 fi +# Eliminar ficheros temporales. +rm -f $tmpfile $MYCNF + diff --git a/server/etc/smb-og.conf.tmpl b/server/etc/smb-og.conf.tmpl index 76022639..3ce6baad 100644 --- a/server/etc/smb-og.conf.tmpl +++ b/server/etc/smb-og.conf.tmpl @@ -1,5 +1,5 @@ [tftpboot] - comment = el directorio fisico ogclient debe estar como escritura + comment = OpenGnSys init files browseable = no writeable = no path = OPENGNSYSDIR/tftpboot diff --git a/server/tftpboot/NetbootPXE.es.txt b/server/tftpboot/NetbootPXE.es.txt index 3efd8371..b963d50b 100644 --- a/server/tftpboot/NetbootPXE.es.txt +++ b/server/tftpboot/NetbootPXE.es.txt @@ -1,6 +1,41 @@ + +Notas sobre arranque remoto de los clientes +=========================================== + +Desde la versión OpenGnSys 1.0.2 se utiliza Grub4Dos como gestor de arranque en sustitución de PXELinux. + +El instalador de OpenGnSys configura por defecto el servicio DHCP para usar el fichero "grldr" como gestor PXE, incluyendo la siguiente cláusula que debe ser común a todos los equipos afectados: + + filename "grldr"; + +En algunos equipos, puede aparecer el siguiente mensaje de error al finalizar la carga de los ficheros de arranque: +llll PXE unload fails: 1 +ln este caso, debe sustituirse el fichero por defecto "grldr" por "grldr-0.4.5b", que incluye una versión más actualizado de Grub4Dos, quedando la línea de configuración de DHCP como sigue: + + filename "grldr-0.4.5b"; + +Si se dispone distinto hardware compatible solo con uno de estos ficheros, deberá editarse el fichero de configuracińo de DHCP usando declaraciones para grupos de equipos: + + group { + filename "grldr"; + host ... + ... + } + group { + filename "grldr-0.4.5b"; + host ... + ... + } + +No olvidar reiniciar el servicio DHCP tras cada modificación de su fichero de configuración. + + + Como cambiar el arranque en red PXELinux por Grub4DOS ===================================================== +NOTA: la siguiente información está anticuada y es válido solo para versiones anteriores a OpenGnSys 1.0.2. + OpenGnSys 1.0.1 usa como gestor PXE el binario pxelinux.0, sin embargo, la actulización a OpenGnSys 1.0.2 sustituye automáticamente dicho gestor por Grub4Dos. diff --git a/server/tftpboot/grldr-0.4.5b b/server/tftpboot/grldr-0.4.5b Binary files differnew file mode 100644 index 00000000..50e25d53 --- /dev/null +++ b/server/tftpboot/grldr-0.4.5b diff --git a/server/tftpboot/pxelinux.cfg/default b/server/tftpboot/pxelinux.cfg/default deleted file mode 100644 index 2b92712a..00000000 --- a/server/tftpboot/pxelinux.cfg/default +++ /dev/null @@ -1,16 +0,0 @@ -DEFAULT syslinux/vesamenu.c32 -MENU TITLE Aplicacion OpenGnsys - -PROMPT 0 -TIMEOUT 100 - -LABEL Local_Boot -MENU LABEL Local_Boot -KERNEL syslinux/chain.c32 -APPEND hd0 - - -LABEL OpenGnsys_Client -MENU LABEL OpenGnsys_Client -KERNEL ogclient/ogvmlinuz -APPEND initrd=ogclient/oginitrd.img ro boot=oginit vga=788 irqpoll acpi=on og2nd=sqfs ogprotocol=smb ogactiveadmin=false ip=dhcp
\ No newline at end of file diff --git a/server/tftpboot/pxelinux.cfg/examples/callGRUBfromPXELINUX b/server/tftpboot/pxelinux.cfg/examples/callGRUBfromPXELINUX deleted file mode 100644 index e40294f9..00000000 --- a/server/tftpboot/pxelinux.cfg/examples/callGRUBfromPXELINUX +++ /dev/null @@ -1,61 +0,0 @@ -DEFAULT syslinux/vesamenu.c32 -PROMPT 0 - -MENU TITLE Aplicacion OpenGnsys -MENU BACKGROUND opengnsys.png - - - - -LABEL title Boot MBR of First Hard Disk -MENU LABEL title Boot MBR of First Hard Disk -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default 0; timeout 0; hiddenmenu; title MBR; chainloader (hd0)+1; rootnoverify (hd0); boot;" - - -title Boot Partition Boot Sector - First Hard Disk, First Partition -LABEL title Boot Partition Boot Sector - First Hard Disk, First Partition -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default 0; timeout 0; hiddenmenu; title PBS11; root (hd0,0); chainloader (hd0,0)+1; boot;" - -title Boot Partition Boot Sector - First Hard Disk, Second Partition -LABEL title Boot Partition Boot Sector - First Hard Disk, Second Partition -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default 0; timeout 0; hiddenmenu; title PBS11; root (hd0,1); chainloader (hd0,1)+1; boot;" - - -LABEL WindowsXP -MENU LABEL WindowsXP -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default 0; timeout 0; hiddenmenu; title windowsXP; fallback 1; find --set-root --ignore-floppies /ntldr; chainloader /ntldr; boot; title net; kernel (pd)/ogclient/ogvmlinuz ro boot=oginit vga=788 irqpoll acpi=on og2nd=sqfs ogprotocol=smb ogactiveadmin=false IP=172.17.9.204:172.17.9.249:172.17.9.254:255.255.255.0:cte204:eth0:none repo=172.17.9.249; initrd (pd)/ogclient/oginitrd.img; boot" - -LABEL ogClientUser -MENU LABEL ogClientUser -KERNEL ogclient/ogvmlinuz -APPEND initrd=ogclient/oginitrd.img ro boot=oginit vga=788 irqpoll acpi=on og2nd=sqfs ogprotocol=smb ogactiveadmin=true IP=172.17.9.204:172.17.9.249:172.17.9.254:255.255.255.0:cte204:eth0:none repo=172.17.9.249 - - - - -LABEL DetectaWindowsXP -MENU LABEL detectaWindowsXP -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default 0; timeout 0; hiddenmenu; title windowsXP; fallback 1; find --set-root --ignore-floppies /ogboot.me; chainloader /ntldr; boot; title net; kernel (pd)/ogclient/ogvmlinuz ro boot=oginit vga=788 irqpoll acpi=on og2nd=sqfs ogprotocol=smb ogactiveadmin=true IP=172.17.9.204:172.17.9.249:172.17.9.254:255.255.255.0:cte204:eth0:none repo=172.17.9.249; initrd (pd)/ogclient/oginitrd.img; boot" - - -LABEL DetectaWindowsXP2 -MENU LABEL detectaWindowsXP2 -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default saved; timeout 10; fallback 1 2; title firsboot; find --set-root --ignore-floppies /ogboot.me; cmp /ogboot.me /ogfirstboot.me || ls FALLBACK; write /ogfirstboot.me iniciado ; chainloader /ntldr; savedefault fallback; boot; title secondboot; find --set-root --ignore-floppies /ogboot.me; cmp /ogboot.me /ogsecondboot.me || ls FALLBACK; write /ogsecondboot.me iniciado ; chainloader /ntldr; savedefault fallback; boot; title OpenGnsys-NET; kernel (pd)/ogclient/ogvmlinuz ro boot=oginit vga=788 irqpoll acpi=on og2nd=sqfs ogprotocol=smb ogactiveadmin=true IP=172.17.9.204:172.17.9.249:172.17.9.254:255.255.255.0:cte204:eth0:none repo=172.17.9.249; initrd (pd)/ogclient/oginitrd.img; savedault; boot" - - - -LABEL IfNOTcacheGOnet -MENU LABEL IfNOTcacheGOnet -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default 0; timeout 0; hiddenmenu; title cache; fallback 1; find --set-root /ogvmlinuz; kernel /ogvmlinuz ip=dhcp ro boot=oginit vga=788 irqpoll acpi=on engine=testing ogrepo=172.17.36.11 ogprotocol=smb og2nd=sqfs; initrd /oginitrd; boot; title net; kernel (pd)/ogclient/vmlinuz-2.6.32-21-generic-pae ip=dhcp ro boot=oginit vga=788 irqpoll acpi=on engine=testing ogrepo=172.17.36.11 ogprotocol=nfs og2nd=sqfs; initrd (pd)/ogclient/initrd.img-2.6.32-21-generic-pae; boot" - -LABEL grub command line -MENU LABEL command line -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect;" diff --git a/server/tftpboot/pxelinux.cfg/examples/examplecallGrub b/server/tftpboot/pxelinux.cfg/examples/examplecallGrub deleted file mode 100644 index 2e888f98..00000000 --- a/server/tftpboot/pxelinux.cfg/examples/examplecallGrub +++ /dev/null @@ -1,29 +0,0 @@ -DEFAULT IfNOTcacheGOnet -#DEFAULT pxe-2.6.32-21-generic-pae - -#ejemplos para el parametro ip -#ip=ipCLIENTE:ipROOTserver:ipROUTER:NetMASK:hostNAME:[device] -#ip=172.17.36.2:172.17.36.11:172.17.36.254:255.255.255.0:r60 -#ip=dhcp - -LABEL cache -KERNEL grub.exe -APPEND --config-file="find --set-root /vmlinuz; kernel /vmlinuz ip=dhcp ro boot=oginit vga=788 irqpoll acpi=on engine=testing reposerver=172.17.32.242; initrd /initrd.img" - -LABEL net -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; kernel (pd)/ogclient/vmlinuz-2.6.32-21-generic-pae ip=dhcp ro boot=oginit vga=788 irqpoll acpi=on engine=testing ogrepo=172.17.32.242; initrd (pd)/ogclient/initrd.img-2.6.32-21-generic-pae" - -LABEL IfNOTcacheGOnet -KERNEL grub.exe -APPEND keeppxe --config-file="pxe detect; default 0; timeout 0; hiddenmenu; title cache; fallback 1; find --set-root /ogvmlinuz; kernel /ogvmlinuz ip=dhcp ro boot=oginit vga=788 irqpoll acpi=on engine=testing ogrepo=172.17.36.11 ogprotocol=smb og2nd=sqfs; initrd /oginitrd; boot; title net; kernel (pd)/ogclient/vmlinuz-2.6.32-21-generic-pae ip=dhcp ro boot=oginit vga=788 irqpoll acpi=on engine=testing ogrepo=172.17.36.11 ogprotocol=nfs og2nd=sqfs; initrd (pd)/ogclient/initrd.img-2.6.32-21-generic-pae; boot" - - - -LABEL pxe-2.6.32-21-generic-pae -KERNEL ogclient/vmlinuz-2.6.32-21-generic-pae -APPEND initrd=ogclient/initrd.img-2.6.32-21-generic-pae ip=dhcp ro boot=og vga=788 irqpoll acpi=on reposerver=172.17.32.242 - -LABEL grub -KERNEL grub.exe -APPEND keeppxe
\ No newline at end of file |