Bienvenidos a mi página web personal

Welcome to my personal Web page

Clonado de pcs espejo (Debian)

Publicado por zebus en Febrero 20, 2009

Clonar el esquema de paquetes instalados y a desinstalar de un pc a x pcs. Esto se puede realizar desde dselect y tal vez desde aptitude pero como dselect es viejo y esta casi deprecated pues he decidido hacerme este script que lo único que hace es cambiar el estado deseado de los paquetes. Una vez cambiado todos los estados de todos los paquetes deseados (a veces es algo tedioso) generamos un archivo de texto. Una vez generado ese archivo lo copiamos a los pcs que queremos que sean clones del original. Después le decimos a dpkg que utilice ese archivo y hacemos un aptitude install para que se ejecutaran todos los estados deseados de los paquetes.

¿Como saber el estado deseado de un paquete?
para saber el estado deseado de un paquete tenemos que poner:

dpkg -l | grep -i nombre_paquete

Nos saldrá una lista de paquetes en caso de encontrar coincidencias con una serie de letras asignadas formadas por un par tipo “ii” delante del nombre del paquete. La primera letra en este caso “i” es el estado deseado de el paquete y la segunda letra en este caso tb “i” es el estado actual del paquete.

Bueno una vez teniendo estos conceptos claros ya podemos ejecutar mi script. El propio script te va guiando un poco sobre su propio funcionamiento.

#!/bin/sh

clear
echo "Para usar este script primero tienes que tener instalado sudo."
echo "Para continuar pulse [Enter] para salir Ctrl + c"
read NADA

algo=`ls /var/lib/dpkg/backup_status_* 2>/dev/null`
if [ ! -z "$algo" ]; then
        echo "Ya existe un backup, no se hace nada."
else
        # Backup:
        date1=`date | xargs -n 1 | grep -i : | sed "s/:/_/g"`
        sudo cp /var/lib/dpkg/status /var/lib/dpkg/backup_status_$date1
fi

function ejecucion (){

# Busqueda:
clear
echo -n "Escriba el nombre del paquete a buscar: "
read busqueda1

# Chequeo de resultados si es uno o son multiples los paquetes consultados y actuar en funcion a:
multy=`cat -n /var/lib/dpkg/status | grep -i "Package:" | grep -i $busqueda1 | wc -l`

if [ ! "$multy" = "1" ]; then 

	echo "[numero] [tipo] [nombre]"
	cat -n /var/lib/dpkg/status | grep -i "Package:" | grep -i $busqueda1

	echo ""
	echo -n "Escriba el [NUMERO!] correspondiente del paquete que desea cambiar su estado: "
	read inline
	let inline=inline+1

	clear
	name_pack=`cat /var/lib/dpkg/status | head -n $inline | tail -n 2 | head -1 | xargs -n 1 2>/dev/null | tail -n 1`
	echo "El estado actual del paquete ($name_pack) es: "
	cat -n /var/lib/dpkg/status | head -n $inline | tail -n 1
	echo ""
        echo -n "Para continuar pulse [Enter] para salir Ctrl + c "
        read NADA
        clear
	num_interes=`cat -n /var/lib/dpkg/status | grep -i Package: | grep -i $busqueda1 | xargs -n 1 2>/dev/null | head -n 1`
        let num_interes=num_interes+1
        cat /var/lib/dpkg/status | head -n $inline | tail -n 1 > /tmp/status_script.txt
        estado1=`cat /tmp/status_script.txt | xargs -n 1 2>/dev/null | head -n 2 | tail -n 1`
        echo -n "Escriba el nuevo estado deseado (purge, deinstall, install) para el paquete ($name_pack): "
        read estado2

	# Confeccionar el nuevo listado:
	let num_interes=num_interes-1
	total_lines=`cat /var/lib/dpkg/status | wc -l`
	let inline=inline-1
	cat /var/lib/dpkg/status | head -n $inline > /tmp/part1.txt
	let inline=inline+1
	estado_real=`cat /tmp/status_script.txt | xargs -n 1 2>/dev/null | head -n 4 | tail -n 1`
	echo "Status: $estado2 ok $estado_real" >> /tmp/part1.txt
	resto=`expr $total_lines - $inline`
        cat /var/lib/dpkg/status | tail -n $resto  >> /tmp/part1.txt
	sudo rm -f /var/lib/dpkg/status
	sudo mv /tmp/part1.txt /var/lib/dpkg/status
	let num_interes=num_interes+1

        clear
        echo "El estado fue cambiado de ($estado1) a ($estado2)  para el paquete ($name_pack): "
        cat -n /var/lib/dpkg/status | grep "$inline" | grep "Status:" | head -n 1
        echo ""
        echo "Cambios completados con exito [ok]"

else
	num_interes=`cat -n /var/lib/dpkg/status | grep -i Package: | grep -i $busqueda1 | xargs -n 1 2>/dev/null | head -n 1`
	let num_interes=num_interes+1
	inline=`cat -n /var/lib/dpkg/status | head -n $num_interes | tail -n 1 | xargs -n 1 2>/dev/null | head -n 1`
        let inline=inline+

	clear
	name_pack=`cat /var/lib/dpkg/status | head -n $inline | tail -n 2 | head -1 | xargs -n 1 2>/dev/null | tail -n 1`
        echo "El estado actual del paquete ($name_pack) es: "
	cat -n /var/lib/dpkg/status | head -n $inline | tail -n 1
	echo -n "Para continuar pulse [Enter] para salir Ctrl + c "
	read NADA
	clear
	cat /var/lib/dpkg/status | head -n $inline | tail -n 1 > /tmp/status_script.txt
	estado1=`cat /tmp/status_script.txt | xargs -n 1 2>/dev/null | head -n 2 | tail -n 1`
	echo -n "Escriba el nuevo estado deseado (purge, deinstall, install) para el paquete ($name_pack): "
	read estado2

	# Confeccionar el nuevo listado:
        let num_interes=num_interes-1
        let inline=inline-1
        total_lines=`cat /var/lib/dpkg/status | wc -l`
	resto=`expr $total_lines - $inline`
        cat /var/lib/dpkg/status | head -n $inline > /tmp/part1.txt
        let inline=inline+1
        estado_real=`cat /tmp/status_script.txt | xargs -n 1 2>/dev/null | head -n 4 | tail -n 1`
        echo "Status: $estado2 ok $estado_real" >> /tmp/part1.txt
        resto=`expr $total_lines - $inline`
        cat /var/lib/dpkg/status | tail -n $resto  >> /tmp/part1.txt
        sudo rm -f /var/lib/dpkg/status
        sudo mv /tmp/part1.txt /var/lib/dpkg/status
	let num_interes=num_interes+1	

	clear
	echo "El estado fue cambiado de ($estado1) a ($estado2) para el paquete ($name_pack): "
	cat -n /var/lib/dpkg/status | grep "$inline" | grep "Status:" | head -n 1
	echo ""
	echo "Cambios completados con exito [ok]"

fi

}

status=0
while [ ! "$status" = "1" ]; do

	ejecucion

        echo "¿Desea exportar la configuacion?, se creara un archivo llamado status_customized.conf"
        echo "Este archivo viene bien para clonar pcs"
        echo -n "¿Exportar configuracion? (si/No): "
        read consulta1

        if [ "$consulta1" = "si" ]; then
        sudo dpkg --get-selections > status_customized.conf
        clear
        echo "status_customized.conf generated [ok]"
        echo ""
        echo "NOTA: Para clonar un pc:"
        echo "sudo dpkg --set-selections < status_customized.conf"
        echo "sudo aptitude install"
        else
        ls >/dev/null
        fi
	echo -n "Si desea salir del script pulse 1 para continuar pulse [Enter] "
	read salida
	status=$salida

done

Escribe un comentario

XHTML: Puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>