Difference between revisions of "Packages.xml:Spanish"

From WPKG | Open Source Software Deployment and Distribution
Jump to: navigation, search
(Uninstall)
(Acciones)
 
Line 347: Line 347:
 
* delayed - reiniciar una vez que la acción el paquete se haya completado y el fichero local WPKG.XML se haya actualizado
 
* delayed - reiniciar una vez que la acción el paquete se haya completado y el fichero local WPKG.XML se haya actualizado
 
* postponed - reiniciar sólo cuando todos los paquetes se hayan procesado
 
* postponed - reiniciar sólo cuando todos los paquetes se hayan procesado
 
Please note that the target value for a download action is always relative to the downloadDir defined in wpkg.js (and there's currently no configuration option to change this from the default of %TEMP%).
 
  
 
Tenga en cuenta que el valor objetivo de una acción de descarga es siempre relativo al directorio '''DownloadDir'' definido en '''WPKG.js''' (y no hay actualmente ninguna opción de configuración para cambiar esto desde el valor predeterminado de %TEMP%).
 
Tenga en cuenta que el valor objetivo de una acción de descarga es siempre relativo al directorio '''DownloadDir'' definido en '''WPKG.js''' (y no hay actualmente ninguna opción de configuración para cambiar esto desde el valor predeterminado de %TEMP%).

Latest revision as of 13:30, 19 November 2010

Este documento en otros idiomas: Inglés Francés


packages.xml es el fichero que indica como realizar las instalaciones, actualizaciones y desinstalaciones de los paquetes de software. En otras palabras, es la lista de todos los programas y scripts que pueden ser instalados o ejecutados en las estaciones de trabajo.

Este fichero se localiza en el mismo directorio que wpkg.js.

WPKG no trabajará sin este fichero.

Estructura de packages.xml

La estructura básica de packages.xml es la siguiente:

<packages>
<package
id="wpkg1"
name="Windows Packager sample 1"
revision="1"
reboot="false"
priority="0">
<check type="registry" condition="exists" path="HKLM\Software\wpkg\full\key\not\part\of\it" />
<check type="file" condition="exists" path="%PROGRAMFILES%\wpkg\wpkg.bat" />
<check type="uninstall" condition="exists" path="WPKG" />

<install cmd='msiexec /i (path to msi)'>
<exit code="0" />
</install>

<remove  cmd='%PROGRAMFILES%\uninstall\uninst.exe -quiet' />

<upgrade cmd='msiexec /i (path to msi)' />

</package>

</packages>

Cada paquete tiene los siguientes atributos:

  • id - un identificador único que representa al paquete. Debería ser corto y representativo.
  • name - descripción de texto del paquete. Esto debería ser el nombre completo del producto.
  • revision - un número de versión creado por el usuario que representa la "versión" específica del "WPKG package" para esta instalación. Si cambias el paquete ".XML", incrementalo. Puede ser la revisión del paquete para WPKG, o la versión del programa de software (aunque tenga en cuenta que esta estrategia no evitará que tenga que cambiar el número de versión, cada vez que modifique el fichero de paquete, por ejemplo cuando realize una mejora o corrija un bug en este fichero XML, y la aplicación de software ya esté actualizada).
    • Los siguientes formatos son soportados:
      • un entero (1, 10, 1000, etc.)
      • números de versión separados por puntos (1.1, 2.1.4, 3.200.3987, etc.) ... introducidos en WPKG 1.0
      • revisiones volátiles (1.2RC1, 1.5I32, 2.73M24, 1.65.b, etc.) ... introducidas en WPKG 1.1.1 (mirar el changelog para más ejemplos)
    • Si le gusta hacer un seguimiento de fechas de los últimos cambios realizados en el paquete, en lugar del número de revisión, puede utilizar el formato YYYY.MM.DD (2010.07.27, etc.)
    • Además puede definir una variable dentro del paquete y utilizarla como revisión, lo que puede ser útil si se utiliza en diferentes lugares del paquete (revisión del paquete, camino para instalar, comprobaciones.) ... introducidos en WPKG 1.1.2:
<package 
  id="firefox"
  name="Mozilla Firefox"
  revision="%PKG_VERSION%"
  reboot="false"
  priority="10">

  <variable name="PKG_VERSION" value="3.6.8" />
  • reboot - indica si el sistema debe "rebotar" tras realizar con éxito la instalación, desinstalación o actualización de un paquete.
    • true - siempre reiniciar después de procesar satisfactoriamente el paquete.
    • postponed - reiniciar después de que WPKG halla terminado de procesar todos los paquetes, si los controles del paquete tienen éxito después de la acción.
    • cualquier otra cosa - no causa el reinicio debidoa este paquete. Otros paquetes todavía sí pueden forzar la reiniciación.
  • priority - especifica un valor numérico que determina en que orden el paquete será instalado. Los números mayores, la mayor prioridad, y por eso, el primer paquete que se instalará será el que tenga la mayor prioridad. Por ejemplo:
    • 2 - instala este paquete el primero
    • 1 - instala este paquete el segundo
    • 0 - instala este paquete el tercero

Note que la instalación de un paquete con la prioridad de '5' se instará antes que cualquiera de estos.

Comprobar condiciones / tipos de comprobaciones

WPKG utiliza las condiciones de verificación de las cláusulas check para verificar que una aplicación está instalada. Para ello, si todas las condiciones indicadas en el paquete con la clausula check son ciertas, WPKG, entiende que la aplicación está instalada.

Por supuesto, no sería prudente lanzar el instalador de una aplicación que ya está instalada. Por eso tiene sentido, "comprobar las condiciones".

Las condiciones de verificación, también se comprueban después de que la instalación haya finalizado para verificar que el software se ha comportado de forma satisfactoria durante la misma, es decir, se ha instalado correctamente.

Si no existen sentencias de comprobación en el paquete (cláusulas check), WPKG actuará ejecutando los comandos de instalación (o actualización) y (si no se detectan errores) añadirá/actualizará los detalles del paquete en la base de datos local del cliente; pero nunca desinstalará el paquete. Dicho de otra forma, para que WPKG desinstale un paquete hemos tenido que incluir clausulas check obligatoriamente en el paquete y todas han de verificarse como ciertas.

Estas condiciones de comprobación (claúsulas check) se pueden dividir en 4 categorías:

  • Registry - Comprueba condiciones del registro de Windows
  • File - Verifica diferentes informaciones sobre los archivos y el sistema de archivos
  • Uninstall - Comprueba la información de desinstalación en el registro de Windows (que Windows utiliza en la lista de agregar/quitar programas para desinstalar)
  • Execute - Ejecuta un script y comprueba el valor de "errorlevel" devuelto por la ejecución (desde la versión WPKG 1.1.0)
  • Logical también puede ser utilizado.

Registry

Registry permite comprobar la existencia de una clave del registro con un determinado valor (Nota: en pre-1.0 versions, sólo trabaja comprobando un valor del registro, no la existencia de una clave).


Cuidado, hay una limitación en el método de lectura de valores del registro que utiliza WPKG para buscar las claves que contienen el caracter ('\'). Vea la sección de ejecución más abajo para abordar esta cuestión.

Hay dos posibles condiciones disponibles para las comprobaciones del registro: exists y equals.

exists - Esto comprueba la existencia de una clave del registro. Si se encuentra la clave, la condición devuelve true, en caso contrario devuelveeee false. equals - Comprueba un valor específico de una clave del registro. Si se encuentra la clave y el valor es igual al proporcionado, la condición devuelve true, en caso contrario false.

Ejemplos:

Esto comprueba la existencia de Adobe Reader dentro del registro:

<check type="registry" condition="exists" path="HKLM\Software\Adobe\Adobe Reader\7.0" />

Esto comprueba si la versión instalada de Firefox es la de idioma US English, con número de versión 1.5.0.6:

<check type="registry" condition="equals" path="HKLM\Software\Mozilla\Mozilla Firefox\CurrentVersion" value="1.5.0.6 (en-US)" />


File

Para comprobar la existencia de un fichero, su tamaño en concreto, o la información de versión del archivo. Hay varias posibles condiciones disponibles para las comprobaciones:

exists - Esto comprueba la existencia de un fichero. Si el fichero existe, la condición devuelve true.

sizeequals - Esto comprueba el tamaño de un fichero. Si se encuentra el archivo y su tamaño es el mismo que el suministrado en la condición, devuelve true.

versionsmallerthan - Comprueba la versión de un fichero en particular. Si se encuentra el archivo y su versión es inferior al número de versión suministrado, la condición devuelve true.

versionlessorequal - Comprueba la versión de un fichero en particular. Si el fichero se encuentra y la versión es inferior o igual a la suministrada en la condición, devuelve true.

versionequalto - Comprueba la versión de un fichero en particular. Si se encuentra el fichero y su versión es igual a la proporcionada en la condición devuelve true.

versiongreaterorequal - Comprueba la versión de un fichero en particular. Si se encuentra el fichero y su versión es mayor o igual a la proporcionada en la condición devuelve true.

versiongreaterthan - Comprueba la versión de un fichero en particular. Si se encuentra el fichero y su versión es mayor que la proporcionada en la condición devuelve true.

Ejemplos:

Esto comprueba si existe Adobe Reader dentro del sistema de archivos:

<check type="file" condition="exists" path="%PROGRAMFILES%\Adobe\Acrobat 7.0\Reader\AcroRd32.exe" />

Esto comprueba si la versión si está instalada la el Firefox US English version 1.5.0.6 comprobando la coincidencia del tamaño de su fichero ejecutable:

<check type="file" condition="sizeequals" path="%PROGRAMFILES%\Mozilla Firefox\firefox.exe" value="7183469" />

Coprueba si la versión del ejecutable de Firefox (.exe) que está instalado es inferior a la 1.5.0.6:

<check type="file" condition="versionsmallerthan" path="%PROGRAMFILES%\Mozilla Firefox\firefox.exe" value="1.5.0.6" />


Uninstall

La desinstalación le permite comprobar la instalación de software según las claves de registro de Microsoft (visualizado por Windows en la sección de agregar o quitar programas), y asi comprobar si se ha instalado una aplicación particular. Microsoft mantiene la lista de aplicaciones instaladas y disponibles para desinstalar en la clave de registro HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall. El valor de DisplayName de una entrada en particular es lo que se pretende encontrar. Versiones pre-1.1.de WPKG disponen sólo de la condición de comprobar si esta opción existe.

exists - Esto comprueba la existencia de un paquete de software en particular en la base de datos de instalaciones. Si el paquete se encuentra, la condición devuelve true.

Desde la versión 1.1.0 la comprobación se extiende con otras condiciones:

versionsmallerthan - Esto comprueba la existencia de un paquete en particular in la base de datos de instalaciones y también comprueba la versión de ese software. Si se encuentra el pquete y la versión es más pequeña que el valor proporcionado, la condición devuelve true.

versionlessorequal - idem., con menor o igual...

versionequalto - idem., con igual...

versiongreaterorequal - idem., con mayor o igual...

versiongreaterthan - idem., con mayor que...

Ejemplos:

Esto comprueba que está instalado Adobe Reader através de la lista de instalaciones:

<check type="uninstall" condition="exists" path="Adobe Reader 7.0" />

Esto comprueba si la versión de Firefox, 1.5.0.6 está instalada en la lista de instalaciones:

<check type="uninstall" condition="exists" path="Mozilla Firefox (1.5.0.6)" />

Esto compruba la existencia de la aplicación Gimp 2.6.6 o superior en la lista de programas instalados:

<check type="uninstall" condition="versiongreaterorequal" path="GIMP" value="2.6.6" />

Execute

Permite ejecutar un script para comprobar si una aplicación está instalada. WPKG comprueba el código de finalización del script para determinar la existencia del paquete.

Este tipo de comprobaciones también permite complejas verificaciones. Por ejemplo hay una limitación en el método de lectura del registro utilizado por WPKG para comprobar valores que contienen el carácter '\'. Ahora puede ejecutar un 'script de tipo batch' que compruebe el valor del registro utilizando 'reg query ...'.

Hay varias posibles condiciones disponibles para conocer los resultados de las comprobaciones:

exitcodesmallerthan - Esto comprueba que el código de salida del script ejecutado es inferior al dato proporcionado, en cuyo caso devuelve true.

exitcodelessorequal - idem., con menor o igual...

exitcodeequalto - idme., con igual...

exitcodegreaterorequal - idem., con mayor o igual...

exitcodegreaterthan - idem., con mayor que...

Ejemplos:

Ésto comprueba que el código de salida sea negativo, en cuyo caso devuelve true:

<check type="execute" path="\\path\to\script.cmd" condition="exitcodesmallerthan" value="0">

Ésto será cierto si el código de salida es 0 o negativo:

<check type="execute" path="\\path\to\script.cmd" condition="exitcodelessorequal" value="0" >

Ésto sólo es cierto cuando el código de salida sea exactamete 0:

<check type="execute" path="\\path\to\script.cmd" condition="exitcodeequalto" value="0" >

Ésto será cierto si el código de salida es 0 o cualquier número positivo:

<check type="execute" path="\\path\to\script.cmd" condition="exitcodegreaterorequal" value="0" >

Ésto sólo será cierto cuando el código de salida sea positivo:

<check type="execute" path="\\path\to\script.cmd" condition="exitcodegreaterthan" value="0" >

Condiciones lógicas

Pueden existir 0 o más condiciones a verificar durante las comprobaciones de existencia. Si no se han proporcionado condiciones, WPKG intenta instalar el paquete a menos que ya esté instalado. Para facilitar utilizar más de una condición, hay 4 tipos de condiciones que pueden ser utilizados, llamados condiciones lógicas. Las condiciones lógicas le permiten crear multiples condiciones mientras se comprueba la exitencia del paquete. Las condiciones lógicas son las condiciones de primer nivel, con las condiciones de verificación real como subnodos en el XML.

Las siguientes condiciones lógicas están disponibles: not, and, or, atleast, y atmost.

  • ) ambas: atleast y atmost requieren el parámetro value=

Ejemplos:

Digamos que, por ejemplo tiene un Adobe Reader 7.0.8 como paquete para instalar, pero sólo desea que se instale en estaciones de trabajo que ejecuten Windows XP Service Pack 2 o superior, debido a alguna incompatibilidad extraña. Digamos también que algunas estaciones de trabajo no pueden ser actualizadas a Windows XP Service Pack 2 hasta que dispongan por ejemplo de una actualización de memoria de 256 MB a 512 MB de memoria. Para un escenario como este, puede (y probablemente debería!) utilizar varios perfiles de los puestos de trabajo, disponiendo del Service Pack 1 en un perfil, mientras que las estaciones de trabajo con SP2 están en otro. Sin embargo, sólo a modo de ejemplo, digamos que todas las estaciones se encuentran en un único perfil. Puede proporcionar una condición lógica para que sólo las estaciones de trabajo que corran SP2 se acualicen con Adobe Reader 7.0.8:

<check type="logical" condition="or">
   <check type="registry" condition="exists" path="HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Acrobat Reader\7.0\Installer\Updates\708" />
   <check type="registry" condition="equals" path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CSDVersion" value="Service Pack 1" />
</check>

La segunda condición aquí puede parecer contraria a la intuición, pero recuerde que estamos buscado la asencia de cosas, cuando estamos escribiendo condiciones de chequeo. Lo que la condicionr anterior dice es: ¿Está instalado Adobe Reader 7.0.8 o el Service Pack 1? Si cada una de estas condiciones son cirtas, la instalación se evitará. En este caso particular, no está instalado Adobe Reader 7.0.8, pero el valor CSDVersion del Service Pack 1 (en las cajas del SP1) por lo que el software no se instalará.

Una vez que todas las condiciones se han probado, si el resultado final de las condiciones es igual a false, WPKG tratará de ejecutar el comando"instalar cmd".

Una vez que se ejecuta, WPKG comprobará el código de salida (debe ser 0 en este ejemplo) *y* verificar todos las comprobaciones.

Si *cualquiera* de las comprobaciones no se cumple, el software se considera *no* instalado - por eso introducir estos valores con cuidado!

Además, si no se han especificado comprobaciones, WPKG dirá que la instalación ha fallado. Aunque esto es útil para casos en los que desea instalar el paquete de cada vez que WPKG se ejecute, es probable que desee la instalación sin ningún error - ver Execute once / always para la ejecución de paquetes sin ningún tipo de comprobación.

Recuerde que no es necesario especificar las tres condiciones de verificación, por lo general una es suficiente: si el software que está a punto de instalar aparecerá en Windows "Agregar o quitar programas (y no todos lo hacen), es suficiente con especificar sólo la comprobación de "uninstall".

Acciones

WPKG comprende varias acciones: install (instalar), upgrade (actualizar), downgrade (desactualizar), remove (desinstalar) and download (descargar). Se pueden ejecutar multiples comandos para cada una de estas acciones, y WPKG las ejecutará según el orden en que aparezcan en el programa.

El comado install se ejecutará por WPKG cuando un paquete nuevo aparezca en el ámbito de un perfil.

Los comandos upgrade se ejecutarán cuando una nueva revisión del paquete se corresponda con el ámbito de ejecución. Esto es, cuando el número de revision en el fichero packages.xml del servidor sea mayor que el que aparezca en el fichero local wpkg.xml. Tenga en cuenta que los comandos de actualización se ejecutarán incluso si las condiciones ya se cumplen.

El comando de desactualización, downgrade será ejecutado si la versión instalada en el cliente es más moderna que la del lado del servidor.


El comando de desinstalación, remove será ejecutado cuando el paquete se elimine del perfil profile.xml.

El comando de descarga, download será siempre ejecutado cuando se usan en el nivel de paquete global. Desde la versión de WPKG 1.1.0 sin embargo, este comando también se permite como subnodo de cualquiera de los otros comandos. Esto le permite realizar una descarga que sólo se efectuará desde un comando específico. Esto se implementó así, ya que sólo tiene sentido descargar el paquete de instalación de nuevo justo antes de eliminar los comandos que serán ejecutados (los cuales habitualmente ejecutan un comando de desinstalación local que no necesita el instalador original).

Nota: Si múltiples acciones instalación (o actualización/desactualización/descarga/desinstalación) se indican, WPKG will descargará los archivos, de todos los nodos de comandos de la misma clase antes de comenzar a ejecutar los comandos en secuencia.

En muchos de los ejemplos de la sección Category:Silent_Installers, cmd.exe se ejecuta para realizar la expansión de variables de entorno y utiliza 'arrancar/esperar' esperando la finalización del comando. Esta forma de ejecutar comandos tiene el resultado de que la ventana de ejecución de cmd aparezca en la pantalla. Sin embargo, este método no parece ser necesario. La versión actual de WPKG ejecuta comandos utilizando la función WScript.Shell.Exec() y realiza la expansión de variables antes de su ejecución. WPKG entonces espera hasta que el comando se complete antes de continuar.

El método correcto de ejecutar un intérprete de comandos es utilizar la variable de entorno %comspec%, sin especificar explícitamente cmd.exe. Esto es necesario para ejecutar comandos que estén implementados en el propio intérprete, sin necesidad de ficheros ejecutables externos.

Cuando la salida de un comando sea demasiado grande (cosas como: copy, calcls), el comando puede fallar. Hay que redirigir en estos casos la salida a un fichero NUL (ejemplo: "%command% >nul").

Ejemplos típicos:

<download url='http://wpkg.example.com/installers/some.msi' target="installers\some.msi" />
<install cmd="msiexec /qn /i %SOFTWARE%\package.msi" />
<install cmd="msiexec /qn /i %SOFTWARE%\package.msi" timeout="1800" />
<install cmd="%comspec% /c copy %SOFTWARE%\file.dll %WINDIR%" />
<remove cmd="msiexec /qn /x %SOFTWARE%\package.msi" />

La opción timeout (Timeouts) dice a WPKG cuando tiempo tiene que esperar a que se complete el comando. Esto se indica en segundos, y su valor por defecto son 3600 seconds= 120 minutos= 2 horas.

Si el comando indicado devuelve un valor de "0", entonces WPKG asume que la ejecución fué satisfactoria y continua con el siguiente comando; en caso contrario, si el comando devuelve un valor diferente a cero, entonces WPKG para y guarda en LOG el fallo del paquete. A veces, códigos diferentes a cero se esperan, y también pueden ser aceptados. Puedes hacer esto añadiendo secciones de códigos de salida dentro de la sencción de instalacion, como se indica:

<install cmd="msiexec /qn /i %SOFTWARE%\package.msi" >
    <exit code="0" />
    <exit code="259" />
</install>

Si no le preocupa el código de finalización, utilize exit code="any":

<install cmd="msiexec /qn /i %SOFTWARE%\installer.exe /silent" >
    <exit code="any" />
</install>

Puede especificar una acción de reinicio del equipo para ciertos códigos de finalización como en el siguiente ejemplo:

<install cmd="msiexec /qn /i %SOFTWARE%\package.msi" >
    <exit code="3010" reboot="true" />
    <exit code="0" />
</install>

Las opciones para el código de salida para reiniciar son:

  • true - reiniciar inmediatamente, sin actualizar el fichero local WPKG.XML
  • delayed - reiniciar una vez que la acción el paquete se haya completado y el fichero local WPKG.XML se haya actualizado
  • postponed - reiniciar sólo cuando todos los paquetes se hayan procesado

Tenga en cuenta que el valor objetivo de una acción de descarga es siempre relativo al directorio DownloadDir definido en WPKG.js' (y no hay actualmente ninguna opción de configuración para cambiar esto desde el valor predeterminado de %TEMP%).

Ejemplos rápidos

Otro ejemplo - WPKG comprueba si el paquete ha sido ya instalado en la parte de Windows de 'agregar o quitar programas' exclusivamente antes de decidir instalarlo (para asegurarse de que no ha sido instalado previamente):

<package
id="wpkg3"
name="Windows Packager sample 3"
revision="1"
reboot="false"
priority="1">

<!--
This is a comment.
Checks in Windows' Add/Remove Programs only.
-->
<check type="uninstall" condition="exists" path="WPKG" />

<install cmd='%PACKAGES%\package.exe /quiet /install' />

<remove  cmd='%PACKAGES%\package.exe /quiet /uninstall' />

<upgrade cmd='%PACKAGES%\package.exe /quiet /install' />

</package>

En el siguiete no hay condiciones de comprobación. Esto significa que WPKG lo ejecutará cada vez que el equipo arranque e instalará el software:

<package
id="backupfiles"
name="Makes backup of some file"
revision="1"
reboot="false"
priority="0">

<!--
This is a comment.
'''No check conditions; script will be executed *each time* wpkg.js is called - each time PC is booted.'''
-->

<install cmd='\\server\path\script.bat' />
</package>


Ejemplo similar, también sin condiciones. Tenga en cuenta la entrada execute="once" - esto significa que este script sólo será ejecutado una vez. Esto puede ser útil para tareas que sólo han de realizarse una vez, como desfragmentaciones de disco, algunos test, cambiar impresoras, etc.

<package
id="backupfiles"
name="Makes backup of some file"
revision="1"
reboot="false"
execute="once"
priority="0">

<install cmd='\\server\path\script.bat' />
</package>

De forma similar, si desea ejecutar una aplicación o un script siempre - utilice "always" en lugar de "once". Para más información sobre esta funcionalidad vea esto.

Dependencias de paquetes

Los paquetes también pueden depender de otros paquetes, vea package dependencies para más información.

Archivos XML con paquetes individuales

Si prefiere mantener su descripción de paquete XML en archivos separados, puede hacer esto: Crear una carpeta packages donde guardar wpkg.js, y localizar los ficheros individuales en ella (p.e.: thunderbird.xml, firefox.xml, etc.,). La sintaxis es la misma que en packages.xml.

Tenga en cuenta que si decide disponer todos los paquetes en ficheros separados, todavía necesita un archivo packages.xml, con al menos una entrada como:

<?xml version="1.0" encoding="UTF-8"?>
<packages>
</packages>

A continuación un ejemplo de un fichero individual con una sóla entrada - advierta que debe contener las sentencias <packages> y </packages> al principio y al final del mismo respectivamente:

<?xml version="1.0" encoding="UTF-8"?>
<packages>
 <package id="setadminpassword"
          name="Set admin password"
          revision="1"
          priority="999"
          reboot="false"
          execute="once">
       <install cmd='cmd /c net user administrator password' />
 </package>
</packages>

¡ATENCIÓN! Advierta en este ejemplo que el password será visivle en la copia local, en el archivo WPKG.xml, eso hay que quitarlo después de finalizar la instalación, o mejor todavía, utilice el comando en un archivo .bat separado.


Puede utilizar el siguiente script para convertir/mezclar los ficheros XML individuales en uno único. (Esto es preferible en redes con una latencia alta).

Nota: Este script debe ser ejecutado dentre del directorio de paquetes. Este script no comprueba la sintáxis XML de los archivos. Deberían eliminarse después el directorio. Sobreescribe el fichero packages.xml.

#!/bin/bash
echo '<?xml version="1.0" encoding="UTF-8"?>' > ../packages.xml
echo '<packages>' >> ../packages.xml
for package in `ls *.xml`
	do
		xmlwf $package | grep "not well-formed"
		if [ "$?" == "1" ]; then
		   cat $package | sed -e :a -e 's/<\(\(\/\)*packages\)[^>]*>//g;/</N;//ba' | sed -e :a -e 's/<?xml.*>//g;/</N;//ba' >>../packages.xml
		fi
done
echo '</packages>' >> ../packages.xml

Vea también