Skip to content

Instantly share code, notes, and snippets.

@HacKanCuBa
Created April 3, 2017 13:36
Show Gist options
  • Select an option

  • Save HacKanCuBa/bfaa857f4839f99715a99dc8f788de70 to your computer and use it in GitHub Desktop.

Select an option

Save HacKanCuBa/bfaa857f4839f99715a99dc8f788de70 to your computer and use it in GitHub Desktop.

Revisions

  1. HacKanCuBa created this gist Apr 3, 2017.
    256 changes: 256 additions & 0 deletions kernelcleaner.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,256 @@
    #!/bin/bash
    ############################################################
    # Script que elimina todos los kernels salvo el que se
    # encuentra en uso (MODO=1), o salvo el que se encuentra
    # en uso y el anterior (MODO=2).
    #
    # **************************************************************
    # ** NO ME RESPONSABILIZO POR DAÑOS QUE PUDIERAN SER CAUSADOS **
    # ** SEA POR BUEN O MAL USO DE ESTE SCRIPT **
    # **************************************************************
    #
    # by HacKan @ HacKan & CuBa co. 2012, 2013, 2015
    # http://blog.linuxnoblog.com.ar/2015/04/eliminar-kernels-antiguos/
    # http://www.hackan.com.ar/2012/02/bash-script-eliminar-kernels-antiguos/
    # basado en http://www.ubuntubuzz.com/2012/02/script-remove-unused-old-kernel.html
    # visto en http://www.taringa.net/posts/linux/14108602/Script-para-eliminar-kernels-anticuados-de-nuestro-sistema_.html
    #
    # Notas
    # ** Debe ejecutarse como root **
    # La salida de informacion del programa se modifica con
    # los parametros CONSOLA, LOG (syslog) y POPUP (notify-osd).
    # Si los tres son 0, el programa funciona en modo silecioso.
    # Mas informacion en la web.
    #
    # Changelog
    #
    # v4.2
    # - Codigo mejorado ligeramente
    #
    # v4.1
    # - Corregido un bug en la llamada a requisitos()
    #
    # v4.0
    # - Un poco de rediseño
    #
    # v3.2
    # - Agregado modo de prueba (NORUN)
    #
    # v3.1
    # - Corregidos bugs menores
    #
    # v3.0
    # - KernelCleaner1, KernelCleaner2, KernelCleanerC
    # y KernelCleanerG unificados
    # - Opciones seleccionables en script
    #
    # v2.0
    # - Codigo mas prolijo
    # - Gracias Manolo (Envido32) por las sugerencias
    #
    # v1.0
    # - Primera version funcional
    ############################################################

    # Config
    ############################################################
    declare -r VERSION="4.0"
    declare -r TITULO="KernelCleaner"

    # MODO=1 : KernelCleaner1
    # MODO=2 : KernelCleaner2
    declare -ir MODO=2

    # CONSOLA=0 : No muestra mensajes en consola
    # CONSOLA=1 : Muestra mensajes en consola
    declare -ir CONSOLA=1

    # LOG=0 : No guarda mensajes
    # LOG=1 : Guarda mensajes en /var/log/syslog
    # (requiere comando logger)
    declare -i LOG=0

    # POPUP=0 : No muestra mensajes gráficos
    # POPUP=1 : Muestra mensajes gráficos (requiere notify-send)
    declare -i POPUP=0

    # ENCABEZADO=0 : No muestra encabezado
    # ENCABEZADO=1 : Muestra encabezado (solo por consola)
    declare -ir ENCABEZADO=1

    # Config avanzada
    ############################################################
    # NORUN=1 : Modo de prueba o debug, no elimina kernels ni
    # modifica grub/burg
    # NORUN=0 : Modo normal
    declare -ir NORUN=0
    ############################################################

    # Variables internas, no editar
    ############################################################
    declare -ir EXIT_FAILURE=1
    declare -ir EXIT_SUCCESS=0
    declare -i ECODE=0
    declare -r TMPFILE="$(tempfile -p "kc${MODO}-")"
    declare -a KERNELS=( )
    ############################################################

    # Funciones
    ############################################################
    function requisitos {
    # Verifica requisitos, invalida config de usuario
    local -i ERR=0;

    # logger
    logger -V > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    LOG=0
    ERR=1
    fi

    # notify-send
    notify-send -v > /dev/null 2>&1
    if [ $? -ne 0 ]; then
    POPUP=0
    ERR=1
    fi

    return $ERR
    }

    function _econ {
    if [ ${CONSOLA} -eq 1 ]; then
    echo "$@"
    fi
    }

    function _elog {
    if [ ${LOG} -eq 1 ]; then
    logger -t "${TITULO} v${VERSION}" "$@"
    fi
    }

    function _epop {
    if [ ${POPUP} -eq 1 ]; then
    notify-send "${TITULO} v${VERSION}" "$@"
    fi
    }

    function _e {
    _econ "** $*"
    _elog "$@"
    _epop "$@"
    }

    function _ee {
    if [ ${CONSOLA} -eq 1 ]; then
    cat "${TMPFILE}"
    fi
    if [ ${LOG} -eq 1 ]; then
    logger -t "${TITULO} v${VERSION}" < "${TMPFILE}"
    fi
    if [ ${POPUP} -eq 1 ]; then
    xargs -0 notify-send "${TITULO} v${VERSION}" < "${TMPFILE}"
    fi
    }

    function print_header {
    if [ ${ENCABEZADO} -eq 1 ]; then
    # No loggeo encabezado
    _econ
    _econ "KernelCleaner modo ${MODO} v${VERSION} by HacKan & CuBa co."
    _econ "http://www.hackan.com.ar/2012/02/bash-script-eliminar-kernels-antiguos"
    _econ
    _epop "by HacKan & CuBa co.\nhttp://www.hackan.com.ar/2012/02/bash-script-eliminar-kernels-antiguos"
    fi
    }

    function print_mode {
    if [ ${NORUN} -ne 0 ]; then
    _e "ATENCION: Modo de prueba. No se realizan cambios en el sistema"
    fi
    }

    function desinstalar {
    _e "Desinstalando $*..."
    if [ ${NORUN} -eq 0 ]; then
    apt-get -qy remove "$@" >> "${TMPFILE}" 2>&1
    else
    apt-get -qys remove "$@" >> "${TMPFILE}" 2>&1
    fi
    _ee
    _e "Hecho"
    }

    function get_kernel_list {
    if [ ${MODO} -eq 1 ]; then
    # kc1
    ls /boot/ | grep vmlinuz | sed 's@vmlinuz-@linux-image-@g' | grep -v "$(uname -r)"
    else
    #kc2
    ls /boot/ | grep vmlinuz | sed 's@vmlinuz-@linux-image-@g' | sed '$d' | sed '$d'
    fi
    }

    function actualizar_grub {
    _e "Actualizando GRUB..."
    if [ ${NORUN} -eq 0 ]; then
    update-grub >> "${TMPFILE}" 2>&1
    if [ $? -eq 0 ]; then
    _e "GRUB actualizado satifactoriamente"
    else
    _e "Fallo la actualización de GRUB"
    _e "Mas informacion en ${TMPFILE}"
    fi
    fi
    }

    function actualizar_burg {
    burg-probe -V > /dev/null 2>&1
    if [ $? -eq 0 ]; then
    _e "Actualizando BURG..."
    if [ ${NORUN} -eq 0 ]; then
    update-burg >> "${TMPFILE}" 2>&1
    if [ $? -eq 0 ]; then
    _e "BURG actualizado satifactoriamente"
    else
    _e "Fallo la actualización de BURG"
    _e "Mas informacion en ${TMPFILE}"
    fi
    fi
    fi
    }

    ############################################################

    # Programa
    ############################################################
    requisitos
    if [ $? -ne 0 ]; then
    _e "Atencion: Requisitos incumplidos. Algunas caracteristicas podrian no funcionar"
    fi

    print_header
    print_mode

    if [ "$(whoami)" = "root" ]; then
    KERNELS=$(get_kernel_list)
    if [ -n "${KERNELS}" ]; then
    for KERNEL in "${KERNELS[@]}"; do
    desinstalar "$KERNEL" "${KERNEL//image/headers}"
    done
    actualizar_grub
    actualizar_burg
    else
    _e "No hay kernels antiguos que eliminar"
    fi
    ECODE=${EXIT_SUCCESS}
    else
    _e "Usted no es root"
    _e "Ejecute $0 como root"
    ECODE=${EXIT_FAILURE}
    fi

    _e "Terminado"
    exit ${ECODE}
    ############################################################