Automatización de confirmaciones de control de versiones

En el artículo anterior, expliqué cómo monitorear sus datos y cómo detectar cambios usando herramientas como Integrit, que es un sistema de detección de intrusos basado en host...

En el Artículo anterior expliqué cómo monitorear tus datos y cómo detectar cambios usando herramientas como Integrit, que es un Sistema de Detección de Intrusos basado en Host ( HID). Descubrir los cambios en los archivos ya es bastante bueno, pero hacer un seguimiento del contenido y sus cambios a lo largo del tiempo es mucho mejor. En este artículo, veremos diferentes formas de usar un sistema de control de revisión haciendo confirmaciones automáticamente.

Las soluciones que analizamos hasta ahora lo ayudarán a responder la pregunta "¿Cambiaron mis datos?", aunque no sabe qué ha cambiado exactamente. Los datos originales ya se sobrescribieron y, en retrospectiva, solo usted notará los cambios. Hay dos formas de identificar las diferencias: comparar los datos actuales con su copia de seguridad externa o usar un sistema de control de revisión como Git o [Subversión de Apache](https:/ /subversion.apache.org/) (SVN). Ambas herramientas le ofrecen un historial de versiones de los archivos y directorios.

Como ejemplo, el comando git status muestra los cambios que se han realizado:

1
2
3
4
5
6
7
8
9
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   dataset1.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

La desventaja de estas soluciones es que requieren un paso adicional: una confirmación tan pronto como haya cambiado una entrada en el sistema de archivos. Tanto Git como Subversion no lo hacen automáticamente.

Una solución muy sencilla es la siguiente:

1
2
$ git add --all
$ git commit -a -m "current changes"

En la línea uno se realiza un seguimiento de todos los cambios locales y en la línea dos se confirman estos cambios. Esto también cubre los archivos temporales, lo que puede no ser su deseo. Para evitar esto, ayuda un archivo llamado .gitignore. Este archivo contiene los nombres de archivo que están excluidos del control de versiones, por ejemplo, archivos temporales creados por el editor de texto Vim:

1
2
*~
*.sw?

Usando la interfaz de inotify

Combinando comandos Git/SVN con find, xargs, incron, [fswatch](http://emcrisostomo.github. io/fswatch/), o notificar ayuda y le permite procesar dichos eventos sin intervención manual.

Inotify funciona observando los cambios en el sistema de archivos y notificando a las aplicaciones sobre esos cambios.

El siguiente código muestra una llamada basada en el subsistema del kernel de inotify usando notificaresperar. Una confirmación de Git ocurre tan pronto como los cambios en el archivo file.txt se escriben en el disco.

1
2
$ inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh
...

Para rastrear directorios completos, debe usar el interruptor adicional -r.

Combinar find, xargs y git

El siguiente script bash utiliza herramientas que existen en todos los sistemas Linux y combina find, xargs y git. Una vez por hora, la secuencia de comandos comprueba si los archivos han cambiado en la última hora y los envía a un repositorio local de Git.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash

while true
do
    # calculate time range
    currentSec=$(date + "%s")
    currentTime=$(date + "%Y%m%d %H:%M:%S")

    previousSec=$(echo "$currentSec-3600" | bc)
    previousTime=$(date + "%Y%m%d %H:%M:%S" --date="@$previousSec")

    echo "--- $previousTime - $currentTime ---"
    currentPath=$(pwd)
    workingPath="$1"

    cd "$workingPath"
    echo "now here: $workingPath"

    find . -type f -newermt "$previousTime" ! -newermt "$currentTime" -print | xargs git add -v

    git commit -v -m "changes from $previousTime - $currentTime"

    cd "$currentPath"
    echo "now here: $currentPath"

    # wait for 1 hour
    sleep 60m
done

Llamar al script da como resultado una salida como la siguiente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ ./find-changes.sh /home/frank/data & 
...
--- 20190115 14:06:29 - 20190115 15:06:29 ---
now here: .
add '.data.txt'
[master 65797bb] changes from 20190115 14:06:29 - 20190115 15:06:29
 1 file changed, 2 insertions(+), 2 deletions(-)
 create mode 100644 data.txt
now here: /home/frank/data
...

Para que uno pueda ver qué ha cambiado entre las confirmaciones individuales, puede usar gitk, un navegador de repositorio gráfico, para mostrar eso.

gitk{.img-responsive}

Gitwatch y Flashbake

En la misma categoría de herramientas encontrarás gitwatch y flashbake. Básicamente, gitwatch es una versión extendida del script bash de arriba, y también usa el subsistema del kernel inotify. No obstante, gitwatch aún no se ha empaquetado para Debian o Ubuntu.

Descargue el script del sitio web del proyecto en Github, primero, y luego llámelo desde la línea de comando con el nombre del archivo o directorio que se rastreará. Aquí puedes ver cómo funciona mientras se trabaja en el artículo:

gitwatch{.img-responsive}

Sin embargo, el segundo proyecto, Flashbake, existe desde hace mucho más tiempo y conecta a Git y Cron. Escrito en Python, está disponible en el sitio web del proyecto, así como en un paquete Debian regular.

Para realizar un seguimiento de las modificaciones de archivos, Flashbake requiere un repositorio de Git, así como un archivo llamado .flashbake en él. El último está destinado a contener la lista de archivos a rastrear.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ cat .flashbake 

# files to track

data.txt
gitk.png
gitwatch.png
iviewdb.png
find-changes.sh
ils.png

A continuación, se requiere una entrada de cron correspondiente para ejecutar Flashbake con regularidad. Use el comando crontab -e para abrir el archivo crontab y agregue la siguiente línea:

1
*/15 * * * * flashbake /home/frank/data 15 > /dev/null

Esta entrada llama a Flashbake cada 15 minutos y rastrea el contenido del directorio /home/frank/data (aunque querrás cambiar esta ruta para adaptarla a tus necesidades). Los mensajes de error enviados a stdout simplemente se redireccionan a la papelera digital llamada /dev/null.

Para ver los cambios entre las confirmaciones, puede usar gitk (ver arriba) o usar el comando git diff.

git-diff{.img-responsive}

Conclusión

Con la ayuda de estas herramientas, puede averiguar si, cuándo y especialmente qué tipo de datos han cambiado en su sistema. Usando Git puedes recurrir a versiones anteriores. Se recomienda dejar espacio para datos adicionales: la copia de seguridad debe almacenarse en algún lugar, idealmente en un dispositivo externo.

En el contexto de la seguridad, para evitar cambios no deseados, se requiere trabajar con más medidas de seguridad, por ejemplo, en el nivel de los derechos de acceso y los servicios del sistema.

Agradecimientos

El autor desea agradecer a Axel Beckert, Veit Schiele y Zoleka Hofmann por su ayuda y comentarios críticos durante la preparación de este artículo.

Licensed under CC BY-NC-SA 4.0