20110802

WSUS Offline Update en OS X Lion

Para quien no lo conozca, WSUS Offline Update (http://www.wsusoffline.net/), antes CTUpdate, es un proyecto bajo GNU GPL que permite actualizar cualquier equipo con sistema operativo Microsoft Windows (y opcionalmente Microsoft Office), de un manera rápida, segura y sin tener conexión de red o conexión a internet.

Las primeras versiones estaban hechas a base de scripts de AutoIt, pero las últimas también incluyen unos script de Bash que, si se dispone de las utilidades adecuadas de la línea de comandos, son compatibles al 100% con OS X.

A continuación, explicaremos la forma de compilar las herramientas que no vienen de serie en OS X. Para quien no tenga los medios o la paciencia para hacerlo, se puede bajar una versión compilada (para OS X Lion, aunque puede que funcionen en versiones anteriores de Mac OS X para Intel), desde aquí. Luego bastaría con seguir las instrucciones de instalación y uso al final de esta misma entrada.

Herramientas necesarias
Las utilidades que faltan en OS X son las siguientes:

Podemos obtenerlas usando MacPorts (buscar wget, md5deep, cabextract, xmlstarlet, dos2unix y cdrtools), o  bien bajando el código fuente y compilando una a una. En nuestro caso, será este último el método que utilizaremos. Este procedimiento debería ser válido para cualquier versión reciente del sistema (Leopard, Snow Leopard o Lion).


Creación de los ejecutables necesarios
En primer lugar, si no las tuviéramos ya, instalaremos las herramientas de desarrollo. Se pueden obtener desde los discos que venían con el Mac o descargándolas de forma gratuita desde la web de desarrolladores de Apple (para versiones anteriores a OS X Lion),  o bien, en el caso de OS X Lion, de forma gratuita en Mac App Store.

Vamos a crear archivos binarios universales (32-bit y 64-bit). Si simplemente quisiéramos compilarlo para la arquitectura de nuestro sistema operativo, bastará con omitir los pasos para i386, así como la creación de binarios universales (comando lipo). Según el programa que sea, hay distintos métodos distintos para crear los binarios.

El primer método es el que se utiliza con wget.
Descomprimimos el código fuente que habremos descargado
tar -xjf wget-1.12.tar.gz
cd wget-1.12
Configuramos y compilamos para la arquitectura nativa de nuestro Mac en este caso es (64-bit)
./configure
make
Guardamos el binario que hemos creado
mv ./src/wget ./src/wget.x86_64
Limpiamos, y configuramos para la otra arquitectura (en este caso sería para 32-bit, si quisiéramos que fuera para 64-bit, cambiaríamos i396 por x86_64)
make clean
export CFLAGS='-arch i386'
export LDFLAGS='-arch i386'
./configure
make
export CFLAGS=
export LDFLAGS=
Guardamos el binario que hemos creado
mv ./src/wget ./src/wget.i386
Unimos los dos binarios en uno sólo, universal
cd src
lipo -create -arch i386 wget.i386 -arch x86_64 wget.x86_64 -output wget
Guardamos el archivo wget para su uso posterior. El resto se puede borrar.

Para compilar cabextract, debido a la forma en que se enlazan los binarios, podemos hacer que se genere de una única vez el binario universal:
Descomprimimos el código fuente
tar -xjf cabextract-1.4.tar.gz
cd cabextract-1.4
Ajustamos lo necesario para hacer compilación simultánea para 32-bit y 64-bit
export CFLAGS='-arch i386 -arch x86_64'
export LDFLAGS='-arch i386 -arch x86_64'
Y configuramos y compilamos
./configure
make
export CFLAGS=
export LDFLAGS=
Guardamos el archivo cabextract para su uso posterior. El resto se puede borrar.

Para obtener hashdeep se utiliza el mismo método que para wget (el binario a guardar se genera en el directorio ./hashdeep/hashdeep)

En el caso de dos2unix, debemos seguir estos pasos:
Descomprimir el código fuente
tar -xjf tofrodos-1.7.9.tar.tar.gz
Editar Makefile cambiando
CFLAGS = $(DEFINES) $(TFLAG) $(CDEBUG) -c -Wall
...
LDFLAGS = $(LDEBUG)
por
CFLAGS = $(DEFINES) $(TFLAG) $(CDEBUG) -c -Wall -arch i386 -arch x86_64
...
LDFLAGS = $(LDEBUG) -arch i386 -arch x86_64
Compilar fromdos 
cd tofrodos
cd src
make
Reservar para después el archivo fromdos cambiando el nombre a dos2unix.

Para xmlstarlet también se utiliza el método usado en wget y hashdeep (el binario se genera en ./xml), pero además debemos copiar ./examples/xmlstarlet y modificarlo para que sea así:
#!/bin/sh
abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
exepath=`dirname "$abspath"`
xml="${abs_builddir-$exepath/..}"/xml
if [ x"$OSTYPE" = xmsys ] ; then
    exec "$exepath/xmlstarlet.msys" "$xml" "$@"
fi
exec "$xml" "$@"

Para el caso de mkisofs, también se utiliza un método similar al usado para dos2unix:
Descomprimimos el código fuente y compilamos para nuestra arquitectura nativa
tar -xjf cdrtools-3.00.tar.gz
cd cdrtools-3.00
make
...
Y llegaremos a un punto en el que, debido a un bug aún no corregido (al menos en la versión 3.00), en OS X Lion, el proceso se queda detenido, apareciendo en pantalla
==> GENERATING include file "../incs/i386-darwin-cc/avoffset.h"
Pulsaremos Ctrl-Z y volveremos a lanzar la compilación, que esta vez terminará correctamente.
make
Copiar el archivo mkisofs/OBJ/i386-darwin-cc/mkisofs y renombrar a mkisofs.x86_64
Ahora editamos el archivo RULES/cc-gcc.rul e introducimos estos cambios (añadimos la arquitectura no nativa, en este caso 32-bit, i386).
CPPFLAGS= -DSCHILY_BUILD $(CPPOPTS) $(CPPOPTX) -arch i386
CFLAGS= $(COPTS) $(CWARNOPTS) $(COPTOPT) $(GCCOPTOPT) $(COPTX) -arch i386
..
LDFLAGS= $(LDOPTS) $(LDOPTX) -arch i386
Limpiamos la compilación y la volvemos a lanzar para que ahora sea con los nuevos parámetros
make clean
make
...
De nuevo, llegaremos al punto en el que el proceso se queda detenido, apareciendo en pantalla
==> GENERATING include file "../incs/i386-darwin-cc/avoffset.h"
Pulsaremos Ctrl-Z y volveremos a lanzar la compilación.
make
Copiamos el archivo ./mkisofs/OBJ/i386-darwin-cc/mkisofs y lo renombramos a mkisofs.i386
Creamos el binario universal
lipo -create -arch i386 mkisofs.i386 -arch x86_64 mkisofs.x86_64 -output mkisofs

Para finalizar, crearemos un script de texto llamado DownloadUpdates_OSX.sh y con este contenido.

#!/bin/bash
abspath=$(cd "${0%/*}" && echo "$PWD/${0##*/}")
fabspath=`dirname "$abspath"`
cd "$fabspath"
export PATH=$PATH:$fabspath
./DownloadUpdates.sh $@

Ahora ya dispondremos de todas las herramientas compiladas que necesita el script para funcionar. Sólo falta preparar el entorno adecuado para que todo funcione.



Instalación final y uso
Descomprimimos WSUS Offline Update y copiamos todos los ejecutables (wget, cabextract, hashdeep, dos2unix, xml, xmlstarlet, mkisofs y DownloadUpdates_OSX.sh) en el directorio sh (conviene guardar una copia si se fuera a utilizar también en Linux).

De esta manera, para poder utilizar la herramienta, bastará con desplazarnos desde Terminal al directorio sh, y lanzar DownloadUpdates_OSX.sh, bien sin parámetros, o bien con los mismos parámetros que usaríamos para utilizar el script original de Linux. Por ejemplo:
cd ./wsusoffline/sh
./DownloadUpdates_OSX wxp esn /makeiso /dotnet 

Puesto que no hemos modificado ninguno de los ficheros originales de WUS Offline Update, podremos seguir usando los mismos binarios y scripts personalizados con versiones posteriores, siguiendo el mismo proceso final de instalación.

No hay comentarios:

Publicar un comentario en la entrada