|

Programa para liberar Debian de componentes privativos

Comparto Crealib Libersys, la herramienta que desarollé para eliminar componentes privativos en sistemas Debian y Devuan.

Selector de paquetes a desinstalar

Un sistema verdaderamente libre en Debian y Devuan

Comparto Crealib Libersys, una herramienta que desarrollé como autor de Quirinux, una distribución que incluye una gran cantidad de controladores preinstalados, ya que está pensada para funcionar en modo live en la mayor cantidad de equipos posibles. Creé esta aplicación para brindar a los usuarios que prefieren un sistema completamente libre la posibilidad de eliminarlos de forma simple, segura y reversible en Debian, Devuan y distribuciones derivadas.

Crealib Libersys, automatiza el proceso de deinstalación de controladores privativos utilizando por debajo la herramienta vrms.

Pero además, pensando en la seguridad del usuario, Libersys incluye un sistema de restauración offline, que permite volver a instalar los programas eliminados sin necesidad de conexión a internet.


¿Cómo se instala Libersys:

1. Descargar el paquete .deb desde el repositorio oficial de Quirinux

wget https://repo.quirinux.org/pool/main/c/crealib-libersys/crealib-libersys_1.0.3_all.deb

2. Con permisos de administrador, instalamos el paquete que hemos descargado

apt install ./crealib-libersys_1.0.3_all.deb

Una vez instalado, el sistema incorpora automáticamente dos nuevos comandos: libre y notanlibre


¿Cómo se usa Libersys?

1. Para analizar el sistema y eliminar los componentes privativos detectados ejecutamos el comando:

libre

Este comando utiliza vrms para localizar el software no libre y los muestra en una lista de selección en la que podremos optar por desinstalar todos o sólo los que no necesitemos.

Si en algún momento necesitas restaurar los programas eliminados, sin conectarte a internet, puedes hacerlo con:

notanlibre

De esta manera, el proceso es seguro, reversible y transparente para el usuario.


Nota importante sobre el kernel

Crealib Libersys libera los paquetes instalados, aunque mantiene el kernel actual del sistema. Para quienes buscan una limpieza completamente coherente con el software 100% libre, recomiendo instalar un núcleo GNU Linux-libre desde:

http://linux-libre.fsfla.org/pub/linux-libre/releases/


Agradecimientos

Quiero agradecer especialmente a Riky Linux, por las sugerencias realizadas en su canal Gnuxero, que ayudaron a mejorar este proyecto: https://fediverse.tv/w/dfkDrxL2DU5rSTGhiRCJDP


Capturas de pantalla

Código fuente



#!/bin/bash
# ===============================================================================
# Nombre:            Crealib Libersys - Comando "libre"
# Autor:             Charlie Martinez® 
# Licencia:          https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
# Utilidad:          Desinstalar componentes privativos de un sistema GNU/Linux
# Distro:            Quirinux 2.x (Devuan 5, Devuan 6, Debian 12, Debian 13)
# ===============================================================================
# Ejecutar con permisos de administrador
# ===============================================================================

FOLDER_NONFREE="/opt/libersys"
FILE_LIST="$FOLDER_NONFREE/list"
FOLDER_DEBS="$FOLDER_NONFREE/debs"
FOLDER_UNINSTALLED="$FOLDER_NONFREE/desinstalados"
SELECCION=""

function _menu_lista() {
    clear
    while :; do
        local opciones=("DESINSTALAR TODOS" "" off)
        for comp in "${componentes[@]}"; do
            opciones+=("$comp" "" off)
        done

        SELECCION=$(dialog \
            --backtitle "Crealib Libersys v1.0 - Comando 'libre' by Charlie Martínez®" \
            --separate-output --checklist "Selecciona componentes a desinstalar (BARRA ESPACIADORA)" 20 60 10 "${opciones[@]}" \
             \
            2>&1 >/dev/tty)

        # Si el usuario elige "Cancelar", sale del script
        local dialog_exit_code=$?
        [ $dialog_exit_code -eq 1 ] && return 1

        # Si no se seleccionaron componentes, muestra un mensaje y vuelve a mostrar el menú
        if [ -z "$SELECCION" ]; then
            dialog --msgbox "No se seleccionaron componentes." 20 60
            continue
        fi

        # Verifica si se seleccionó "DESINSTALAR TODOS"
        if [[ "$SELECCION" == *"DESINSTALAR TODOS"* ]]; then
            SELECCION="${componentes[*]}"
        fi

        # Muestra la lista de programas seleccionados y confirma la desinstalación
        clear
        dialog --backtitle "Crealib Libersys v1.0 - Comando 'libre' by Charlie Martínez®" \
            --yesno "Se van a desinstalar los siguientes elementos:\n\n$SELECCION" 20 60 \
            

        # Si el usuario elige "Aceptar", retorna 0
        [ $? -eq 0 ] && return 0
    done
}

function _despedida() {
    
    clear
    echo 'Gracias por utilizar Crealib Libersys - Comando "notanlibre"'
    echo 'Incluido en quirinux-terminal-tools'
    echo '-------------------------------------------------------'
    echo 'Licencia GPLv2 | Autor: Charlie Martínez'
    echo 'Contacto: cmartinez@quirinux.org'
    echo ''
	exit 1
}

# Verifica si el usuario tiene permisos de administrador

if [ "$EUID" -ne 0 ]; then
    echo ''
    echo "Este script debe ejecutarse con permisos de root."
    echo 'Puedes intentarlo con "sudo" tuusuario, "sudo su" o "su root".'
    echo ''
    exit 1
fi

# Verifica si está instalado dialog
if ! command -v dialog &>/dev/null; then
    echo "El programa 'dialog' es necesario para ejecutar este script."
    echo "¿Deseas instalarlo? (1) Aceptar (2) Cancelar"
    read -r choice

    case $choice in
        1)
               apt-get update
               apt-get install -y dialog
            ;;
        *)
			_despedida
            ;;
    esac
fi

# Continúa la ejecución utilizando la interfaz dialog

# Verifica si está instalado vrms
if ! command -v vrms &>/dev/null; then
    clear
    dialog --title "REQUISITO NECESARIO" \
        --yesno "El programa 'vrms' es necesario para ejecutar este script.\n¿Deseas instalarlo?" 10 50

    # Si el usuario elige Sí, instala vrms. Si elige No, sale del script.
    case $? in
    0)
        apt-get update
        apt-get install -y vrms
        ;;
    *)
        _despedida
        ;;
    esac
fi

# Muestra la información sobre la utilidad del programa
clear
dialog --backtitle "Crealib Libersys v1.0 - Comando 'libre' by Charlie Martínez®" \
    --title 'Comando "libre"' \
    --msgbox '\nEste programa sirve para detectar y desinstalar componentes privativos.\nSiempre podrás volver a instalarlos con el comando "notanlibre".' 10 40 \
    

# Verifica si existe FILE_NONFREE y si no existe lo crea
if [ ! -e $FOLDER_NONFREE ]; then
    mkdir $FOLDER_NONFREE
fi

# Verifica si existe el fichero LISTA y si no existe lo crea
if [ ! -e $FILE_LIST ]; then
    touch $FILE_LIST
fi

# Crea la carpeta para almacenar paquetes desinstalados
if [ ! -e $FOLDER_UNINSTALLED ]; then
    mkdir $FOLDER_UNINSTALLED
fi

# Obtener la salida de vrms y almacenarla en una variable
clear
vrms_output=$(vrms)

# Excluir la línea de texto "Non-free" y todo desde la línea que contiene "Contrib packages"
nonfree_packages=$(echo "$vrms_output" | sed -n '/Non-free packages installed on/,/Contrib packages/ {/Non-free\|Contrib packages/!p}')

# Almacenar la lista en el archivo FILE_LISTA
echo "$nonfree_packages" | grep -v '^$' | awk '{print $1}' >$FILE_LIST

# Verifica si existe FOLDER_DEBS y si no existe la crea
if [ ! -d $FOLDER_DEBS ]; then
    mkdir $FOLDER_DEBS
fi

# Cambia al directorio FOLDER_DEBS antes de descargar los paquetes
(cd "$FOLDER_DEBS" && while read -r package; do
    apt download "$package"
done <"$FILE_LIST")

# Lee la lista de componentes privativos instalados en un arreglo
componentes=($(awk '{print $1}' "$FILE_LIST"))

# Muestra la lista y confirma la desinstalación
_menu_lista
dialog_exit_code=$?

# Verifica el código de salida del dialog
if [ $dialog_exit_code -eq 1 ]; then
    _despedida
fi

# Muestra el siguiente cuadro de diálogo
clear
dialog --backtitle "Crealib Libersys, comando 'libre' by Charlie Martínez® " \
    --yesno "Algunos componentes como la conexión WiFi podrían dejar de funcionar. ¿Continuar de todas formas?" 10 50 \
    

# Almacena el código de salida en otra variable
continue_exit_code=$?

# Si el usuario elige Sí, desinstala los paquetes seleccionados. Si elige No, sale del script.
if [ $continue_exit_code -eq 0 ]; then
    # Desinstala los paquetes seleccionados
    clear
    for package in $SELECCION; do
        apt-get remove --purge "$package" -y
    done

    # Muestra mensajes de depuración antes del movimiento
    echo "Moviendo paquetes desinstalados a $FOLDER_UNINSTALLED"
    ls "$FOLDER_DEBS"
    ls "$FOLDER_UNINSTALLED"

    # Mueve solo los paquetes desinstalados seleccionados a la carpeta correspondiente
    for package in $SELECCION; do
        mv "$FOLDER_DEBS"/"${package}"_*.deb "$FOLDER_UNINSTALLED"
        echo "Moviendo ${package}_*.deb a $FOLDER_UNINSTALLED"
    done
    # Corrección a bug detectado por Riky Linux, ahora el script borrará la cache. 
    # Probado en Zorín.
    apt autoremove 
    apt-get clean
    # Mensaje de despedida
    clear
    dialog --backtitle 'Crealib Libersys, comando "libre" by Charlie Martínez®' \
        --msgbox "La desinstalación fue exitosa. ¡Ahora tu sistema es más libre que antes!" 10 40 \
        
    clear
else
    # Usuario elige No
    _despedida
fi

Comando «notanlibre»



#!/bin/bash
# ===============================================================================
# Nombre:            Crealib Libersys - Comando "notanlibre"
# Autor:             Charlie Martinez® 
# Licencia:          https://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
# Utilidad:          Desinstalar componentes privativos de un sistema GNU/Linux
# Distro:            Quirinux 2.x - Devuan 5 y 6, Debian 12 y 13
# ===============================================================================
# Ejecutar con permisos de administrador
# ===============================================================================

FOLDER_NONFREE="/opt/libersys"
FOLDER_UNINSTALLED="$FOLDER_NONFREE/desinstalados"
SELECCION=""

function _menu_lista() {
    clear
    local opciones=()
    for deb_file in "$FOLDER_UNINSTALLED"/*.deb; do
        opciones+=("$(basename "$deb_file")" "" off)
    done

    if [ ${#opciones[@]} -eq 0 ]; then
        dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
            --msgbox "No se detectaron componentes privativos que hayan sido eliminados mediante el uso del comando 'libre'" 10 50
        return 1
    fi

    SELECCION=$(dialog \
        --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
        --separate-output --checklist "Selecciona componentes a reinstalar (BARRA ESPACIADORA)" 20 60 10 "${opciones[@]}" \
        2>&1 >/dev/tty)

    # Si el usuario elige "Cancelar", sale del script
    local dialog_exit_code=$?
    [ $dialog_exit_code -eq 1 ] && return 1

    # Si no se seleccionaron componentes, muestra un mensaje y vuelve a mostrar el menú
    if [ -z "$SELECCION" ]; then
        dialog --msgbox "No se seleccionaron componentes." 20 60
        return 1
    fi

    return 0
}

function _despedida() {
    clear
    echo 'Gracias por utilizar Crealib Libersys - Comando "notanlibre"'
    echo 'Incluido en quirinux-terminal-tools'
    echo '-------------------------------------------------------'
    echo 'Licencia GPLv2 | Autor: Charlie Martínez'
    echo 'Contacto: cmartinez@quirinux.org'
    echo ''
    exit 1
}

# Verifica si el usuario tiene permisos de administrador

if [ "$EUID" -ne 0 ]; then
    echo ''
    echo "Este script debe ejecutarse con permisos de root."
    echo 'Puedes intentarlo con "sudo" tuusuario, "sudo su" o "su root".'
    echo ''
    exit 1
fi

# Verifica si está instalado dialog
if ! command -v dialog &>/dev/null; then
    echo "El programa 'dialog' es necesario para ejecutar este script."
    echo "¿Deseas instalarlo? (1) Aceptar (2) Cancelar"
    read -r choice

    case $choice in
        1)
              apt-get update
              apt-get install -y dialog
            ;;
        *)
            _despedida
            ;;
    esac
fi

# Continúa la ejecución utilizando la interfaz dialog

# Muestra la información sobre la utilidad del programa
clear
dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
    --title 'Comando "notanlibre"' \
    --msgbox '\nEste programa sirve para reinstalar componentes privativos que hayan sido desinstalados con el comando "libre".' 10 50 \

# Verifica si existe FOLDER_UNINSTALLED
if [ ! -d "$FOLDER_UNINSTALLED" ]; then
    dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
        --msgbox "No se detectaron componentes privativos que hayan sido eliminados mediante el uso del comando 'libre'" 10 50
    _despedida
fi

# Verifica si la carpeta FOLDER_UNINSTALLED contiene elementos
if [ -z "$(ls -A "$FOLDER_UNINSTALLED")" ]; then
    dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
        --msgbox "No se detectaron componentes privativos que hayan sido eliminados mediante el uso del comando 'libre'" 10 50
    _despedida
fi

# Muestra la lista y confirma la reinstalación
_menu_lista
dialog_exit_code=$?

# Verifica el código de salida del dialog
if [ $dialog_exit_code -eq 1 ]; then
    _despedida
fi

# Solicita confirmación
clear
dialog --backtitle "Crealib Libersys v1.0 - Comando 'notanlibre' by Charlie Martínez®" \
    --yesno "Se van a reinstalar los siguientes elementos:\n\n$SELECCION" 10 60

# Almacena el código de salida en otra variable
continue_exit_code=$?

# Si el usuario elige Sí, reinstala los paquetes seleccionados. Si elige No, sale del script.
if [ $continue_exit_code -eq 0 ]; then
    # Reinstala los paquetes seleccionados
    clear
    for deb_file in $SELECCION; do
        cd "$FOLDER_UNINSTALLED"
          apt install "./$deb_file" -y
        # Elimina el paquete reinstalado
        rm "$FOLDER_UNINSTALLED/$deb_file"
    done

    # Mensaje de despedida
    clear
    dialog --backtitle 'Crealib Libersys, comando "libre" by Charlie Martínez®' \
        --msgbox "La reinstalación fue exitosa.\nA veces los componentes privativos son necesarios.\nLamentamos que ahora tu sistema sea un poco menos libre que antes :-(" 10 40 \
        
    clear
else
    # Usuario elige No
    _despedida
fi


Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *