Anteriormente expliqué cómo aplicar parches utilizando patch. En esta ocasión voy a explicar cómo crear parches para distribuir y aplicar a lo largo de diferentes sistemas.

Un parche es un conjunto de modificaciones sobre uno o varios archivos. Generalmente se utilizan y aplican sobre archivos de código fuente, pero pueden utilizarse sobre cualquier tipo de archivo.

En estos casos, lo mejor es trabajar directamente con ejemplos. Supongamos que tenemos el archivo actualizar.sh con el siguiente contenido:

#!/bin/sh

echo -n "Actualizando el sistema... "

(apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1

echo "Finalizado."


Cabe destacar que es un script bastante estúpido y sirve sólo de terrible ejemplo. Jamás actualizar un sistema sin saber qué paquetes se están reemplazando.

Se desea realizar una modificación sobre el mismo, trabajando en una copia llamada actualizar.sh.nuevo:

root@linuxito:/tmp# cp actualizar.sh actualizar.sh.nuevo
root@linuxito:/tmp# nano actualizar.sh.nuevo

Luego de modificar el archivo con el editor nano (o cualquier otro), este script Bash queda con el siguiente código fuente:

#!/bin/sh

echo -n "Actualizando el sistema... "

if (apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1 ; then
  echo "Finalizado."
else
  echo "Finalizado con errores."
fi


Básicamente se ha agregado un condicional para verificar si la actualización fue exitosa.

Ahora bien, gracias a las herramientas diff y patch, es posible crear un parche para distribuir y aplicar, en caso de que el script haya sido replicado a lo largo de diferentes sistemas.

Para crear un parche que refleje estos nuevos cambios sobre el archivo actualizar.sh, ejecutar diff con la opción -u de la siguiente forma:

root@linuxito:/tmp# diff -u actualizar.sh actualizar.sh.nuevo > actualizar.sh.patch

El parche, el cual ha sido guardado en el archivo actualizar.sh.patch, posee el siguiente contenido:

root@linuxito:/tmp# cat actualizar.sh.patch 
--- actualizar.sh       2016-12-14 08:07:51.563855405 -0500
+++ actualizar.sh.nuevo 2016-12-14 08:19:59.168150333 -0500
@@ -2,8 +2,10 @@
 
 echo -n "Actualizando el sistema... "
 
-(apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1
-
-echo "Finalizado."
+if (apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1 ; then
+  echo "Finalizado."
+else
+  echo "Finalizado con errores."
+fi
 
 

Las líneas que comienzan con el signo - son líneas que se eliminan, mientras que las líneas que comienzan con + son líneas que se agregan.

Veamos ahora cómo aplicar este parche al archivo original (actualizar.sh):

root@linuxito:/tmp# cat actualizar.sh
#!/bin/sh

echo -n "Actualizando el sistema... "

(apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1

echo "Finalizado."


Para ello se debe recurrir a la herramienta patch, indicando el archivo que se desea parchar, junto con el parche a aplicar sobre el mismo:

root@linuxito:/tmp# patch actualizar.sh actualizar.sh.patch 
patching file actualizar.sh

Luego de hacerlo, el archivo actualizar.sh resulta idéntico a actualizar.sh.nuevo:

root@linuxito:/tmp# cat actualizar.sh
#!/bin/sh

echo -n "Actualizando el sistema... "

if (apt-get update && apt-get -y upgrade) >> /var/log/actualizar.log 2>&1 ; then
  echo "Finalizado."
else
  echo "Finalizado con errores."
fi


Es posible comprobarlo volviendo a ejecutar diff:

root@linuxito:/tmp# diff actualizar.sh actualizar.sh.nuevo 
root@linuxito:/tmp#

No se observan diferencias.

En la actualidad, es una buena práctica montar un repositorio git donde alojar todos los scripts de administración. De esta forma, es posible mantener los scripts actualizados a lo largo de muchos servidores corriendo sistemas heterogéneos de manera muy simple y práctica. Sin embargo, es necesario comprender el funcionamiento de estas herramientas básicas, pues en ocasiones pueden venir muy a mano para ciertas tareas, o para aplicar parches distribuidos por terceros.

Para más información:

man diff
man patch


Tal vez pueda interesarte


Compartí este artículo