Compartir la gestión de paquetes mediante pkgsync | Algo de Linux

sábado, 14 de diciembre de 2013

Compartir la gestión de paquetes mediante pkgsync

Como ya hemos visto en el post anterior (http://enavas.blogspot.com.es/2013/12/gestion-de-paquetes-mediante-pkgsync.html), pkgsync es de lo más útil para mantener uniformidad en el software que tenemos instalado en nuestras máquinas, pero además, nos facilita la instalación de software de una manera muy sencilla si gestionamos el archivo /etc/pkgsync/musthave. ¿Por qué? Simplemente porque con poner el nombre de los paquetes que queramos instalar, pkgsync se va encargar de instalarlos él mismo.

El problema que tenemos en nuestro sistema es que el fichero /etc/pkgsync/musthave no lo gestionamos los administradores de los centros. ¿Y qué conlleva ésto? Bueno, pues básicamente dos cosas:

Primero: Que la instalación de software es un poco más incómoda para nosotros, porque tenemos que poner el nombre del paquete a instalar en el archivo /etc/pkgsync/mayhave de las máquinas, y luego, hacer una tarea puppet que lo instale.
Segundo: Que el proceso de instalación de software no sea todo lo eficiente que podría ser. ¿Y por qué? 
  • Porque puede coincidir que se estén instalando paquetes mediante pkgsync y al mismo tiempo se ejecuten tareas de puppet que instalan software. En cuyo caso, en ese momento, todas esas tareas fallarán porque el sistema de gestión de paquetes estará ocupado mediante pkgsync.
  • O puede que suceda justo lo contrario: Que se estén ejecutando tareas de puppet que instalan software mientras se lanza pkgsync, en cuyo caso, la instalación de software mediante pkgsync va a fallar porque porque el sistema de gestión de paquetes estará ocupado mediante las tareas puppet.

Para solucionar ambos problemas he modificado pkgsync de manera que se sigan gestionando los archivos musthave, mayhave y maynothave como hasta ahora, pero que yo pueda tener también mis propios ficheros musthave.ies, mayhave.ies y maynothave.ies, de tal manera que, cuando se ejecute pkgsync, se fusionen del siguiente modo:
  • musthave + musthave.ies > musthave.all 
  • mayhave + mayhave.ies > mayhave.all 
  • maynothave + maynothave.ies > maynothave.all 
Así, yo podré instalar fácilmente nuevos paquetes con tan sólo añadirlos al archivo musthave.ies y no tendré que hacer tareas de instalación de paquetes, con lo que evitaré el problema de eficiencia que comentaba.

#! /bin/bash
#
# pkgsync - Automated package synchronization tool
# 2004-2007 Steinar H. Gunderson <sgunderson bigfoot.com>.
# Modificado: 11/12/2013 Esteban M. Navas Martín <algodelinux gmail.com>
#
# Permite fusionar los archivos musthave, maynothave y mayhave gestionados
# por la sección de administración de sistemas con los archivos
# musthave.ies, maynothave.ies y mayhave.ies gestionados por el administrador
# informático del centro, fusionándolos en los siguientes archivos:
# musthave.all, maynothave.all y mayhave.all
# Con ésto facilitamos una gestión compartida
#
# Licensed under the GNU GPL version 2, as publicshed by the FSF;
# see /usr/share/common-licenses/GPL-2 on Debian systems or visit
# www.fsf.org.
#

set -e
set -o noglob
export DEBIAN_FRONTEND=noninteractive
export VERSION=1.21

if [ ! -r /etc/pkgsync/musthave -o \
     ! -r /etc/pkgsync/mayhave -o \
     ! -r /etc/pkgsync/maynothave ]; then
 echo Error: Missing files in /etc/pkgsync. Aborting.
 echo 
 echo Please see /usr/share/doc/pkgsync/README.Debian for information on 
 echo configuring pkgsync.
 
 exit 1
fi

print_help () {
 echo "pkgsync $VERSION"
 echo "Automated package synchronization tool"
 echo ""
 echo "Usage: pkgsync [OPTIONS]"
 echo "Recognized options:"
 echo "  -h, --help           display this help and exit"
 echo "  -k, --keep-unused    don't remove unused packages"
 echo "  -s, --simulate       don't do anything, just print out what would have happened"
 echo "  -d, --dpkg-glob      use dpkg's globbing (deprecated)"
 echo "  -a, --aptitude-glob  use aptitude's globbing (default, recommended)"
 echo ""
 echo "Complete documentation can be found in /usr/share/doc/pkgsync/README.Debian."
}

# Largely adapted from /usr/lib/getopt/parse.bash
parse_options () {
 TEMP=`getopt -o hksad --long help,keep-unused,simulate,dpkg-glob,aptitude-glob -n 'pkgsync' -- "$@"`
 eval set -- "$TEMP"

 APTITUDE_ARGS="-y -q -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold"
 GLOB_STYLE="aptitude"

 while :; do
  case "$1" in
   -s|--simulate)
    APTITUDE_ARGS="$APTITUDE_ARGS -s"
    shift
    ;;
   -k|--keep-unused)
    APTITUDE_ARGS="$APTITUDE_ARGS -o Aptitude::Delete-Unused=false"
    shift
    ;;
   -d|--dpkg-glob)
    GLOB_STYLE="dpkg"
    shift
    ;;
   -a|--aptitude-glob)
    GLOB_STYLE="aptitude"
    shift
    ;;
   -h|--help)
    print_help
    exit 0
    ;;
   --)
    shift
    break
    ;;
   *)
    echo "Internal error: doesn't recognize argument '$1'"
    exit 1
    ;;
  esac
 done
}
readpkgs () {
 grep -vE '^#' "$1" | grep -vE '^\s*$' || true
}
getpkgs () {
 IFS="
"
 for pkg in $( readpkgs $1 ); do
  # if the line starts with "debtags:", it's a debtags expression,
  # so run it through debtags.
  if echo "$pkg" | grep -Eq '^debtags:'; then
   if ! [ "$USE_DEBTAGS" ]; then
    echo Error: "debtags:" line encountered, but debtags is not installed. Stopping.
    exit 1
   fi
   PATTERN=$( echo "$pkg" | cut -d: -f2- )
   debtags grep "$PATTERN" | tagcoll copy | cut -d: -f1
  else
   # if the line is "meta:current-kernel", use the kernel package
   # for the currently running kernel, if it exists
   if [ "$pkg" = "meta:current-kernel" ]; then
    KVERS=$( uname -r )
    if [ "$GLOB_STYLE" = "dpkg" ]; then
     dpkg-query --showformat '${Package}\n' -W "*-image-$KVERS" 2>/dev/null || true
    else
     aptitude -F '%p' search ".*-image-$KVERS" | sed "s/ \+$//" 2>/dev/null || true
    fi
   else
    # if there's a wildcard in this, push it through dpkg/aptitude
    # to glob. if not, just print it out.
    if [ "$GLOB_STYLE" = "dpkg" ]; then
     if echo "$pkg" | grep -Eq '[][*?]'; then
      dpkg-query --showformat '${Package}\n' -W "$pkg" 2>/dev/null || true
     else
      echo "$pkg"
     fi
    else
     if echo "$pkg" | grep -Eq '[][*?()|~]'; then
      aptitude -F '%p' search "$pkg" | sed "s/ \+$//" 2>/dev/null || true
     else
      echo "$pkg"
     fi
    fi
   fi
  fi
 done
}
run_aptitude () {
 echo RUNNING: aptitude $APTITUDE_ARGS "$@"
 aptitude $APTITUDE_ARGS "$@" 
}
run_debtags () {
 if [ "$USE_DEBTAGS" ]; then
  echo RUNNING: debtags "$@"
  debtags "$@" 
 fi
}

# The beautiful look of hacks in the morning...
filter () { 
 echo "$@" | tr " " "\n" | sort | uniq -c | grep "     2" | cut -c9-
}

parse_options "$@"

# Check if we've got debtags installed
[ -x /usr/bin/debtags ] && USE_DEBTAGS=yes

# Update the package lists
aptitude update
run_debtags update

# Create ies files if they don't exists
test -f /etc/pkgsync/musthave.ies || touch /etc/pkgsync/musthave.ies
test -f /etc/pkgsync/maynothave.ies || touch /etc/pkgsync/maynothave.ies
test -f /etc/pkgsync/mayhave.ies || touch /etc/pkgsync/mayhave.ies

# Merge files 
sort -o /etc/pkgsync/musthave.all /etc/pkgsync/musthave /etc/pkgsync/musthave.ies
sort -o /etc/pkgsync/maynothave.all /etc/pkgsync/maynothave /etc/pkgsync/maynothave.ies
sort -o /etc/pkgsync/mayhave.all /etc/pkgsync/mayhave /etc/pkgsync/mayhave.ies

# Find out what parameters to give to aptitude.
installed=$( dpkg -l | grep '^ii' | cut -c5- | cut '-d ' -f1 )
musthave_install=$( getpkgs /etc/pkgsync/musthave.all | sort -u | sed "s/$/+/" )
maynothave_remove=$( getpkgs /etc/pkgsync/maynothave.all | sort -u | sed "s/$/-/" )
mayhave_marknonauto=$( getpkgs /etc/pkgsync/mayhave.all | sort -u | sed "s/$/\&m/" )
mustormayhave=$( ( getpkgs /etc/pkgsync/musthave.all ; getpkgs /etc/pkgsync/mayhave.all ) | sort -u )
rest_markauto=$( filter $installed $installed $mustormayhave | sed "s/$/\&M/" )

run_aptitude full-upgrade '?upgradable' $musthave_install $maynothave_remove $mayhave_marknonauto $rest_markauto
run_aptitude autoclean

Aquí tenéis el enlace al paquete, por si queréis probarlo: https://copy.com/uCvXJ6cAEXu9

Como siempre, recomiendo leerlo y entender lo que hace antes de aplicarlo.

Publicado por primera vez en http://enavas.blogspot.com.es

No hay comentarios: