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