En marzo pasado entramos uno de nuestros sistemas a calidad y se le detectaron una serie de no conformidades que fueron resueltas. A principios de esta semana me dieron la tarea de crear un actualizador que actualizara (valga la redundancia) el sistema que estaba instalado en el servidor de los compañeros de calidad para proceder a una segunda iteración de pruebas.

Buscando la forma de hacerlo no encontré una sino varias. La más fácil era reinstalar el sistema desde cero utilizando el instalador pero por políticas de la dirección de tecnología no se podía. Además tenía sentido. En la vida real los sistemas no se reinstalan así porque sí porque se perderían datos, configuraciones, etc. No era necesario reinstalar todo un sistema cuando solo se modificaron algunos ficheros. Para eso están los actualizadores.

Otra de las vías que hallé era crear un paquete de Debian (.deb) con los archivos modificados pero aunque muy atractiva tenía el inconveniente de que solo me serviría para actualizar el servidor en calidad, si el sistema estuviese en producción, instalado en una distribución que usara un tipo de paquetería diferente (como openSUSE por poner un ejemplo), tendría que empaquetar la actualización para cada distribución por lo que quedó descartada.

Ahora solo me quedaba actualizar los ficheros manualmente o comprimiéndolos en un fichero y luego haciendo un script que se encargara de extraer los ficheros y copiarlos en donde iban pero no me gustaba la idea de estar cargando con varios ficheros por lo que seguí buscando hasta que pensé en el Netbeans y en el Visual Paradigm y me pregunté cómo habrían hecho sus instaladores. ¿La respuesta?

sfx

Los instaladores del Netbeans y Visual Paradigm son archivos comprimidos auto-extraíbles (SFX).

Mientras que un archivo comprimido típico depende de un programa separado (por ejemplo, tar, gunzip) para extraer su contenido, un archivo auto-extraíble es un ejecutable en sí que puede auto-extraer su contenido al ser ejecutado. Un instalador autoextraíble hace lo mismo, pero también copia el contenido extraído a los directorios apropiados.

En esta entrada, les explicaré cómo crear un archivo o instalador auto-extraíble en Linux.

Para ello, utilizaremos una herramienta de línea de comandos llamada makeself . La herramienta makeself es un shell script que crea un archivo comprimido TAR con los directorios/ficheros especificados, y agrega una pequeña porción de script de shell en el comienzo del archivo para iniciar la auto-extracción, y guiar la instalación de los archivos extraídos.

Para instalar makeself en Linux, es necesario descargar la última versión estable, y extraer el archivo descargado como sigue. Una vez que el archivo se autoextrajo, se creará un nuevo directorio llamado makeself-2.1.5. Copie todos los scripts de shell en el directorio /usr/bin.

wget http://megastep.org/makeself/makeself-2.1.5.run
chmod 755 makeself-2.1.5.run
./makeself-2.1.5.run
cd makeself-2.1.5
sudo cp *.sh /usr/bin

O puede buscarlo en los repositorios de la distribución que uses actualmente. En mi caso uso Debian e instalo así:

aptitude install makeself

El uso básico de makeself es como sigue:

makeself [options] archive_dir file_name label [startup_script] [args]

El parámetro “label” es el mensaje a imprimir mientras un archivo SFX es descomprimido.

El parámetro “startup_script” especifica el script/comando a ejecutar después que el archivo SFX se haya extraído correctamente. Esto es útil cuando se quiere crear un instalador autoextraíble. Normalmente el “startup_script” copiará/instalará el contenido extraído a los directorios apropiados (donde se deseen copiar). El “startup_script” debe estar ubicado dentro del directorio a empaquetar, de manera que se incluya en el archivo SFX.

Estas son algunas de las opciones disponibles para makeself:

  • –gzip : Usar gzip para la compresión (opción por defecto).
  • –bzip2 : Usar bzip2 para la compresión.
  • –xz: Usar xz para la compresión.
  • –notemp : No extrae los ficheros en un directorio temporal sino que lo hace en un nuevo sub-directorio creado en el directorio actual.
  • –follow : Sigue todos los enlaces simbólicos, y archiva los ficheros enlazados simbólicamente.

Crear un archivo autoextraíble

Para crear un archivo de extracción automática que contiene todos los archivos dentro del directorio ./backup, se debe hacer lo siguiente. Aquí la rutina del “startup_script” no hace nada más que imprimir “”Extraction done.”

makeself --notemp ./backup ./backup.run "SFX archive for backup" echo "Extraction done"
Header is 403 lines long

About to compress 1540 KB of data...
Adding files to archive named "./backup.run"...
./
./jpeg/
./jpeg/1.jpg
.
.
CRC: 2238411397
MD5: 0b0fd3a2ba08ffcec821b9cbaa11b70d

Self-extractible archive "./backup.run" successfully created.

Para extraer los ficheros del archivo, simplemente se debe ejecutar el archivo:

./backup.run
Creating directory backup
Verifying archive integrity... All good.
Uncompressing SFX archive for backup.............
Done

Crear un instalador autoextraíble

Si desea crear un instalador autoextraíble, es necesario preparar un “startup_script” separado con lo que se va a hacer, sobre los ficheros extraídos. Aquí asumimos que el directorio del programa para empaquetar se localiza en ./program. Así que el “startup_script” debe estar dentro de la carpeta ./program.

nano ./program/install.sh
#!/bin/sh

if [ -d $HOME/bin ]
then
    cp myprogram $HOME/bin/
fi

A continuación, daremos permisos de ejecución al “startup_script”.

chmod 755 ./program/install.sh

Crearemos un instalador autoextraíble, y empaquetaremos el “startup_script” junto con el contenido del directorio ./program de la siguiente manera.

makeself --xz ./program ./program.run "SFX installer for program" ./install.sh

Eso es todo por hoy. Espero que les sea útil. No olviden comentar!!!

PD: Casi siempre les digo “No olviden comentar!!!” o algo parecido porque no tenemos un botón “Me gusta”. Si tuvieramos uno les diría “…y si te gusta dale me gusta porque me encanta cuando te gusta…. y además no olviden comentar!!!” WTF? 😀

Fuente: Xmodulo.Com.