SO - Instalación Debian 12 con script de instalación (julio de 2023)


Índice:

      Leer antes de empezar

      Enlaces

      0) Notas posteriores a la instalación

         Sincronización de la hora del sistema

      a) Antes de empezar

         Configurar el script de instalación

         Script: Tareas previas a la instalación

         Script: Copia de seguridad de HOME

      b) Instalación

         ¿Cómo crear un USB con la live ISO?

         Distribución de los discos duros

      c) Tras la instalación

         Script: Tareas posteriores a la instalación

         Configuraciones

         Copia de documentación y archivos

         Configurar trabajos de mantenimiento y backup de la información

         Instalar aplicaciones manualmente

         Aplicaciones al inicio (Crontab)

      d) información adicional

         Instalar y Configurar Flatpak

         Configurar fstab

         Impresoras

         Incluir usuario en el grupo sudo (*)

         Configurar FireFox

      e) Scrip de instalación de Debian 12



Leer antes de empezar  ⮴  

IMPORTANTE: Después de actualizar / Reinstalar, no realizar una sincronización

hasta haber finalizado de configurar correctamente el equipo.

Si la hacemos antes de la cuenta, el sincronizador eliminará

archivos/carpetas que no encuentre en la nueva instalación.


Leer el apartado Notas tras la instalación


Portátil Thosiba:

F12     -> Boot Menú

F2      -> Bios Setup


Portátil HP

ESC     -> Menú


Hacer una prueba de instalación en una máquina virtual y ver la forma en la

realiza la distribución del disco duro.


Enlaces  ⮴  

Debian images: installer images, live images, cloud images

Old Debian releases on CD/DVD


0) Notas posteriores a la instalación  ⮴  

En este apartado se recogen notas a tener en cuenta en futuras instalaciones.


Sincronización de la hora del sistema  ⮴  

La hora del equipo es la de la BIOS, para tener la certeza de que la hora es

la correcta conviene que sea actualizada desde un servidor.

Para ello se utiliza el NTP (Network Time Protocol) que mantiene la hora del

sistema sincronizada con la hora real.

Instalación


PENDIENTE DE ESTUDIO



a) Antes de empezar  ⮴  

Configurar el script de instalación  ⮴  

    g_app_version="4.05"

    g_app_fecha="28/06/23"

    g_app_so="Debian 12"


    # Carpeta donde se almacenan mis scripts

    g_folder_scripts_origen="/home/juanp/script_juanp/myscript"

    g_folder_scripts_destino="/script_juanp/myscript"


    # Lugar donde se realizará la copia de seguridad de HOME

    g_destino_backup_home="/mnt/wd/juanp/backup_home_seguridad"


    # Directorio de las aplicaciones AppImage

    g_folder_appimage="$HOME/AppImage"


    # Carpeta en la que se realizará la copia de la información.

    g_folder_copy="/home/juanp/temporal/20230624_debian_12"


    # Carpeta $HOME - Para pruebas de se puede poner otra carpeta

    g_folder_home="$HOME"

    #g_folder_home="/home/juanp/Linux/instalaciones/provi"


    # Autofirma

    # https://www.dnielectronico.es/PortalDNIe/PRF1_Cons02.action?pag=REF_1112

    g_libpkcs11_dnie="./firma_electronica/libpkcs11-dnie_1.6.8_amd64.deb"

    # https://firmaelectronica.gob.es/Home/Descargas.htm

    g_autofirma="./firma_electronica/AutoFirma_1_8_2.deb"  


Script: Tareas previas a la instalación  ⮴  

Ejecutar el script de instalación y seleccionar la opción de tareas previas

a la instalación.

Copiar la información guardada en g_folder_copy en un USB que se usará tras

la instalación del SO.


Script: Copia de seguridad de HOME  ⮴  

Ejecutar el script de instalación y seleccionar la opción de copia de segu-

ridad de la carpeta personal.

La copia se realizará en en NAS WD, en la ubicación indicada en

      g_destino_backup_home


b) Instalación  ⮴  

Para realizar la instalación se una imagen live híbrida con gnome.

Imagen ISO híbrida Debian con Gnome"


¿Cómo crear un USB con la live ISO?  ⮴  

Con Fedora Media Writer (flatpak) / Raspberry Pi Imager


Distribución de los discos duros  ⮴  

Iniciar el equipo con el USB Live de Debian, instalar gparted y realizar la

partición del disco adecuada. Para ello tener en cuenta:


.- La recopilación de información se guarda de forma automática la infoma-

ción de los discos duros generadas por los comandos siguientes un archivo.


          lsblk -f -m

          df -h

Archivo: ./discos/info_discos.txt


.- La proporcionada por GParted.


.- La obtenida durante la prueba de instalación en una máquina virtual


Emplear de flatpak ha incrementado el uso del raíz (/) por lo que se va incre-

mentar el espacio disponible pasa a 80 GB.


En el caso de que no se vaya a modificar el tamaño de /home puede ser recomen-

dable eliminar todas las carpetas ocultas (que tienen información de configu-

ración) y usarla durante la instalación sin formatearla; de esta forma no ha-

bría que hacer la copia del backup de /home.


IMPORTANTE: Hacer una copia en el disco duro portátil del /home


c) Tras la instalación  ⮴  

Script: Tareas posteriores a la instalación  ⮴  

Ejecutar el script de instalación y seleccionar la opción de tareas posterio-

res a la instalación.


Configuraciones  ⮴  

.- Revisar configuración Contraseñas - SeaHorse

Comprobar que los permisos de $HOME/.gnupg sean los correctos. El script

debería haberlo hecho.

Si no es así:

          chown -R $(whoami) ~/.gnupg/

          find ~/.gnupg -type f -exec chmod 600 {} \;

          find ~/.gnupg -type d -exec chmod 700 {} \;


.- Configurar escritorio


..- Configurar el tema: Retoques - Apariencia

...- Activar botón minimizar


..- Nautilus preferencias

...- Abrir elementos con una sola pulsación

...- Listas: Tipo detallado tras el tamaño

...- Tabulador 2 - Espacios


..- Configurar extensiones:

...- Dash to dock

...- Todo.txt(Lista de tareas sincronizadas con el movil)

Ubicación archivo de tareas: /home/juanp/Dropbox/Tareas


..- Configurar aplicaciones .desktop

Los archivos se habrán copiado en ~/.local/share/applications/

Hay que revisar en los scripts que el archivo que se ejecute sea

accesible y al igual que el icono.


..- Configurar atajos de teclado

...- Configuración - Teclado

Abrir Terminal - Crtl + T - gnome-terminal


..- Configurar avatar usuario


.- Revisar funcionamiento de rclone.

Sincronizar desde la nube.


.- Revisar configuración de FireFox


.- Revisar configuración del cortafuegos: gufw


.- Configurar Editor

Según imagen de configuración guardadas.


.- Configurar Transmission

Copiar del backup la carpeta $HOME/.config/transmission


.- Firma digital

Ver "guia_instalar_firma_electronica.txt"

Para comprobar el funcionamiento de Autofirma en el navegador:

https://www.sededgsfp.gob.es/es/Paginas/TestAutofirma.aspx


.- Configurar impresoras desde el panel de control.

Hacer la búsqueda con las IP de las impresoras.

Impresora ML-1865W      - 00:15:99:81:1B:C2 - 192.168.0.159 (fija)

Impresora HP 4130e  - 14:CB:19:F2:4B:52 - 192.168.0.45

(Ver información adicional - impresoras)


.- Comprobar funcionamiento scaner

El scaner HP 4130e no funciona la primera vez, probar de nuevo y ver

si hay varios disponibles.


.- Configurar cuentas online


.- Configurar Wifi


.- Configurar y restaurar Evolution


.- Configurar VsCodium

BashIDE

ShellCheck

Spanish Language

Better Shell Syntax


.- Configurar Shotwell

Comprobar que están copiadas la fotografías, la cache y la base de da-

tos. Lo último debería haberse realizado desde el script de instalación.

Iniciar la aplicación y dejarla que trabaje, tarda un rato.


.- Configurar Calibre


Copia de documentación y archivos  ⮴  

Recuperar la información.


Configurar trabajos de mantenimiento y backup de la información  ⮴  

.- Configurar trabajos de copias de seguridad


..- Comprobar funcionamiento backup a WD NAS

inc_rsync.sh: Activar el modo Simulación


..- Configurar Respaldos / Deja-dup


.- Añadir linea(s) a crontab


Instalar aplicaciones manualmente  ⮴  

.- Virtualbox:

..- Descargar el paquete y VM VirtualBox Extension Pack

link=https://www.virtualbox.org/

..- Instalación:

            sudo dpkg -i virtualbox-6.1_6.1.32-149290~Debian~bullseye_amd64.deb

Si la instalación no se completa por problemas de dependencia:

            sudo apt-get -f install

Y volver a instalar el paquete

Iniciar VirtualBox e instalar VM VirtualBox Extension Pack

Archivo - Herramientas - Extension Pack Manager - Add (+)


.- Instalar Autofirma:

Ver "SO - Guía instalación Firma digital"


Aplicaciones al inicio (Crontab)  ⮴  

Incluir en crontab (sudo crontab -e) las líneas que ha guardado en el USB el

script de instalación.


../datos/crontab/crontab.txt


IMPORTANTE: Después de actualizar / Reinstalar : No realizar una sincroniza-

ción hasta haber finalizado de configurar correctamente el

equipo.

Si la hacemos antes de la cuenta, el sincronizador eliminará ar-

chivos/carpetas que no encuentre en la nueva instalación.


d) información adicional  ⮴  

Instalar y Configurar Flatpak  ⮴  

Información:

Debian Quick Setup

Getting Started


      sudo apt install flatpak;

      sudo apt install gnome-software-plugin-flatpak;

      sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

Reiniciar


Configurar fstab  ⮴  

La configuración se realiza desde el script de instalación.


Lo siguiente es información para hacerlo manualmente.


Archivo: /etc/fstab


Instalar cifs-utils, necesario para montar carpetas del NAS WD:

      sudo apt install cifs-utils


.- Crear en /mnt las carpetas donde se montarán las carpetas

..- HDD: Disco duro mecánico

...- /mnt/hdd

..- Remotas

...- NAS-WD

....- juanp          NAS-WD: /mnt/wd/juanp

....- multimedia     NAS-WD: /mnt/wd/multimedia

....- marisa         NAS-WD: /mnt/wd/marisa


El conjunto de comandos necesarios sería el siguiente:

        sudo mkdir /mnt/hdd &&

        sudo chown juanp:juanp  /mnt/hdd &&

        sudo chmod 770  /mnt/hdd &&

        sudo mkdir /mnt/wd &&

        sudo mkdir /mnt/wd/juanp &&

        sudo mkdir /mnt/wd/multimedia &&

        sudo mkdir /mnt/wd/marisa &&

        sudo chown -R juanp:juanp /mnt/wd &&

        sudo chmod -R 770  /mnt/wd 


.- En /etc/fstab incluir las líneas necesaria para montar estas carpetas


Crear una copia de seguridad del fstab

          cp /etc/fstab /home/juanp/Documentos/fstab_org


Copiar el archivo que contiene las credenciales para acceder al NAS WD guar-

dado previamente:

          sudo cp .credenciales /root


Obtener el UUID del HDD que se va a montar en /mn/hdd, para obtener el UUID

de los discos del sistema se usa:

          sudo blkid


Abrir la copia del fstab que se ha guardado y copiar lo necesario al fstab

del sistema. Son las líneas necesarias para montar algunas carpetas del NAS WD.


           # Disco WD - /juanp

          //192.168.0.158/juanp /mnt/wd/juanp cifs credentials=/root/.credenciales,gid=juanp,uid=juanp,iocharset=utf8,rw


          # Disco WD - /multimedia

          //192.168.0.158/Multimedia /mnt/wd/multimedia cifs credentials=/root/.credenciales,gid=juanp,uid=juanp,iocharset=utf8,rw


          # Disco WD - /marisa

          //192.168.0.158/marisa /mnt/wd/marisa cifs credentials=/root/.credenciales,gid=juanp,uid=juanp,iocharset=utf8,rw       


Editar fstab:

          sudo nano /etc/fstab


Para probar si se hace bien usar:

            sudo umount -a

            sudo mount -a


Cerrar y abrir sesión.


Impresoras  ⮴  

Instalar, si no se ha hecho ya, CUPS (sudo apt-get install cups)

Necesita reiniciar.


Buscar las impresoras desde el menú de impresoras.


Una vez instalada seleccionar en configuración - Detalles de impresora

los controladores adecuados.


Si no se encuentra instalar los controladores descargados.


..- Instalación de la impresora ML1865W:


Descargar samsung Controlador para impresora.

Controlador ML1665W

(Los últimos usados están en : /home/juanp/Documentos/Imp_ML1865W))


Descomprimir (OJO: en un disco con sistema de archivos linux, no

FAT32, FAT 16 o NTFS, porque entonces los script no tiene permisos

de ejecución y fallan)

      sudo sh install.sh

Acuerdo de licencia: Yes (Aparce tras el apartado 10)

Yes to configure firwall


Encender impresora


Menú impresora -> Añadir impresora


..- Instalación de la impresora/scaner HP 4130e


Para configurar la conexión con el rotuer usar la aplicación de android

HP Smart


MAC impresora: 14:CB:19:F2:4B:52


Manual HP4130e


Incluir usuario en el grupo sudo (*)  ⮴  

      sudo su

      sudo usermod -a -G sudo juanp

      groups juanp

El último comando se emplea para comprobar que está incluido.


(*) Command not found (Orden no encontrada ) con «su» en Debian  10 ‘buster'

Información


En función del tipo de instalación que se realice nos podemos encontrar en

dos situaciones distintas.


Al hacerla con el instalador normal, crea un usuario normal y luego el root

para el que pide la contraseña. En este caso hay que incluir al usuario en

el grupo sudo (0-1).


Cuando se hace con un live CD y se realiza desde el nuevo SO iniciado con

el live CD, crea un usuario y lo incluye en el grupo sudo, pero no solicita

contraseña para el root. Al no tener la certeza de cómo configura al root,

se le pone contraseña al usuario root (0-2).


() Incluir usuario en el grupo sudo:


Iniciar sesión en el terminal con: su -  (ojo con guión *)

          su -

Ejecutar:

          usermod -a -G sudo juanp

Reiniciar

Ver los grupos de un usuario:

          cat /etc/group | grep juanp | cut -d: -f1

          groups juanp

Ver los grupos

          cut -d : -f 1 /etc/group

Añadir usuario al grupo sudo

          usermod -a -G sudo juanp


* El guión tiene dos efectos:

1) cambia del directorio actual al directorio de inicio del nuevo

usuario (por ejemplo, a / root en el caso del usuario root)

iniciando sesión como ese usuario

2) cambia las variables ambientales a las del nuevo usuario según

lo dicte su ~ / .bashrc. Es decir, si el primer argumento para

su es un guión, el directorio y el entorno actuales cambiarán a

lo que se esperaría si el nuevo usuario hubiera iniciado sesión

en una nueva sesión (en lugar de simplemente asumir una sesión

existente).


() Poner contraseña al usuario root (su)


Entrar como root (superusuario)

          sudo su

Se nos pedirá la contraseña de usuario, que es la misma que usamos pa-

ra iniciar sesión en el equipo.

De esta forma estaremos conectados como root.

Si queremos podemos dar una contraseña al usuario root utilizando:

          sudo passwd root

Salimos del superusuario con el comando:

          exit


Configurar FireFox  ⮴  

Configuración Nueva


.- Si se hubiera iniciado previamente, eliminar la configuración local.

/home/juan/.mozilla

.- Desconectar la red.

.- Iniciar FireFox

.- about:config

..- privacy.trackingprotection.enabled (Rastreo)

(Esta habría que verlo)

..- browser.privatebrowsing.autostart (Privada)

.- Buscador: DuckDuckGo

..- Preferencias - Search - Default Search Engine

.- Cerrar Firefox - Concectar red - Iniciar FireFox

.- Cambiar Idioma:

..- Preferencias - Language

..- Preferencias - Buscador

.- Activar el Modo solo-HTTPS en todas las ventanas (sustituye a HTTPS

Everywhere)

.- Activar DoH (DNS sobre HTTPS)

Ajuste - Configuración de red - Activa DNS sobre HTTPS

Proveedor - Predeterminado (Cloudflare)

.- Activar ESNI

network.dns.echconfig.enabled       -> true

network.dns.use_https_rr_as_altsvc  -> true

ESIN-Mozilla

Acticar DoH y ESNI

.- Reiniciar

.- Extensiones

..- Integración con GNOME Shell (https://extensions.gnome.org/)

..- NoScript

..- Disconnect

.- Cargar marcadores

.- Configurar página de incio

file:///home/juanp/Documentos/personalpage/main.html


Importar perfiles


Este procedimiento se ha comprobado para realizarlo entre la misma versión

del navegador.


.- Copiar los perfiles previamente guardados en la carpeta:

/home/juanp/.mozilla

cp -r "$HOME"/.mozilla/* /destino/...


.- Iniciar FireFox en el nuevo equipo y acceder al gestor de perfiles:

about:profiles


.- Crear tantos perfiles como sea necesario en el equipo destino vincu-

landolos con las correpondientes carpetas de perfiles que se han co-

piado.


e) Scrip de instalación de Debian 12  ⮴  

  #!/bin/bash




  # Información:


    # Copia en el directorio que se indica en la configuración la información y da-

    # tos necesarios para una nueva instalación del Sistema Operativo.

    # Este proceso en parte está automatizado y otra parte requiere que la infor-

    # mación la cree el usuario.



  # Notas:    



    #      .- De los archivos del sistema que se modifiquen, a parte de hacer un

    #         backup -centralizado y numerado- crear una copia del original en el

    #         sitio la primera vez que se va a modificar.



  # Configuración



    # Variables


      g_app_version="4.08"

      g_app_fecha="06/07/23"

      g_app_so="Debian 12"


      # Carpeta donde se almacenan mis scripts

      g_folder_scripts_origen="/home/juanp/script_juanp/myscript"

      g_folder_scripts_destino="/script_juanp/myscript"


      # Lugar donde se realizará la copia de seguridad de HOME

      g_destino_backup_home="/mnt/wd/juanp/backup_home_seguridad"


      # Directorio de las aplicaciones AppImage

      g_folder_appimage="$HOME/AppImage"


      # Carpeta en la que se realizará la copia de la información.

      g_folder_copy="/home/juanp/temporal/20230624_debian_12"


      # Carpeta $HOME - Para pruebas de se puede poner otra carpeta

      g_folder_home="$HOME"

        #g_folder_home="/home/juanp/Linux/instalaciones/provi"


      # Autofirma

      # https://www.dnielectronico.es/PortalDNIe/PRF1_Cons02.action?pag=REF_1112

      g_libpkcs11_dnie="./firma_electronica/libpkcs11-dnie_1.6.8_amd64.deb"

      # https://firmaelectronica.gob.es/Home/Descargas.htm

      g_autofirma="./firma_electronica/AutoFirma_1_8_2.deb"



    # Paquetes de software

      g_file_packages="$(mktemp tmp.XXXXXXXXX)"


        echo "cifs-utils"

        echo "keepassxc"

        echo "synaptic"

        echo "cups"

        echo "gufw"

        echo "rsync"

        echo "exiftool"

        echo "clamtk"

        echo "imagemagick"

        echo "gparted"

        echo "flatpak"

        echo "gnome-software-plugin-flatpak"

        echo "libcupsimage2"

        echo "telegram-desktop"

        echo "rclone"

      } > "$g_file_packages"


        # echo "megatools"

        # echo "davfs2"      


      # Paquetes para la firma digital


        echo "pcsc-tools"

        echo "pcscd"

        echo "pinentry-gtk2"

        echo "libccid"

      } >> "$g_file_packages"



    # Paquetes de software Flatpak

      g_file_packages_flatpak="$(mktemp tmp.XXXXXXXXX)"



        echo "org.gimp.GIMP"

        echo "com.vscodium.codium"

        echo "com.calibre_ebook.calibre"

        echo "org.videolan.VLC"

      } > "$g_file_packages_flatpak"

      #echo "org.darktable.Darktable"



  # Variables globales de gestión interna (no configuración)


    # Número de errores que se han producido

    g_num_error=0


    # Controla si ha llegado a su fin el script; se usa en info_status_error

    g_fin_script=0


    # Archivo log de errores

    g_log_errores=$(mktemp)



  # Funciones auxiliares

    function _info_status_error() {

      if [[ $g_fin_script -eq 0 ]]; then

        echo ""

        echo "ERROR: Se ha producido un error no recuperable."

        echo "       El script se ha interrumpido."

        echo ""

        echo "Errores:"

        cat "$g_log_errores"

      else

        if [[ $g_num_error -gt 0 ]]; then

          echo ""

          if [[ $g_num_error -eq 1 ]]; then

            echo "ATENCIÓN: Se han producido $g_num_error error."

          else

            echo "ATENCIÓN: Se han producido $g_num_error errores."

          fi

          echo ""

          echo "Errores:"

          cat "$g_log_errores"

        else

          echo ""

          echo "OK: No se han producio errores"

          echo ""

        fi

      fi


    function _ini_copia(){

      echo "------------------------------------------------------------------------"

      echo ""

      echo "Copiando:"

      echo "  .- Informacion: $1"

      echo "  .- Destino    : $2"

      echo ""


    function _fin_copia(){

      echo " > OK"


    function _crear_folder(){

      if [[ ! -d $1 ]]; then

        mkdir -p "$1"

        if [[ ! $? = 0 ]]; then

          _error "No se ha podido crear el directorio $1"

          exit 1

        fi

      fi


    function _error(){

      echo "Error: $1"

      echo "Error: $1" >> "$g_log_errores"

      ((g_num_error ++))

      if ! _yes_no "¿Continuar?" ""; then

        exit 1

      fi


    function _yes_no(){

      local l_r=1

      while true; do

        echo ""

        if [[ -n "$2" ]]; then

          echo "$2"

        fi

        read -r -N 1 -p "$1 (Y/N) " yn

        echo " -> $yn"

        case $yn in

          [Yy]* ) l_r=0;break;;

          [Nn]* ) l_r=1;break;;

          * ) echo "La respuesta ha de ser yes o no.";;

        esac

      done

      return $l_r


    function _copy_file() {


      local l_file_origen="$1"

      local l_destino="$2"

      local l_sudo="$3"


      if [[ ! ${l_destino: -1} = "/" ]]; then

        l_origen="$l_destino"/

      fi


      if [[ "$l_sudo" -eq 0 ]] && [[ ! -f "$l_file_origen" ]]; then

        _error "Error no existe el archivo $l_file_origen"

      else

        echo "-----------------------------------------------------------------------------------------"

        echo "Copiando:"

        echo "  .- Archivo: $l_file_origen"

        echo "  .- Destino: $l_destino"

        echo ""

        _crear_folder "$l_destino"

        if [[ "$l_sudo" -eq 0 ]]; then

          if ! cp "$l_file_origen" "$l_destino"; then

            _error "No se ha podido copiar $l_file_origen en $l_destino"

          else

            echo " > OK"

          fi

        else

          if ! sudo cp "$l_file_origen" "$l_destino"; then

            _error "No se ha podido copiar $l_file_origen en $l_destino"

          else

            echo " > OK"

          fi

        fi

      fi


    function _copy_full_folder(){

      # Copia el contenido del origen -no la carpeta en sí misma- en el destino; si

      # no existe el destino lo crea.

      # Tanto destino como origen deben termina en contrabarra.


      local l_origen=$1

      local l_destino=$2


      if [[ ! ${l_origen: -1} = "/" ]]; then

        l_origen="$l_origen"/

      fi

      if [[ ! ${l_destino: -1} = "/" ]]; then

        l_destino="$l_destino"/

      fi


      echo "-----------------------------------------------------------------------------------------"

      echo "Copiando:"

      echo "  .- Directorio: $l_origen"

      echo "  .- Destino   : $l_destino"

      echo ""


      if [[ ! -d "$l_origen" ]]; then

        _error "No existe el directorio [ $l_origen ]"

      else

        _crear_folder "$l_destino"

        # !OJO¡: El asterisco en "$l_origen"* debe estar fuera de las comillas.

        if ! cp -r "$l_origen"* "$l_destino"; then

          _error "No se ha podido copiar $origen en $destino"

        else

          echo " > OK"

        fi

      fi


    function _tar_comprimir(){

      # Comprimir un archivo tar .GZ sin usar la ruta absoluta en la compresion


      # 1 -> Nombre y path del archivo comprimido que se creara.

      # 2 -> Path completo de la carpeta a comprimir.


      _crear_folder "$(dirname "$1")"


      if [[ ! -d "$2" ]]; then

        _error "No existe el directorio $2"

        retrun 1

      else

        echo "-----------------------------------------------------------------------------------------"

        echo "Comprimiendo: "

        echo " .- Origen : $2"

        echo " .- Destino: $1"

        if ! tar -czf "$1" -C"$2" .; then

          _error "No se ha podido crear el archivo tar"

          return 1

        else

          echo " > OK"

          return 0

        fi

      fi


    function _tar_descomprimir(){

      # Descomprimir un archvio tar .GZ indicando el directorio de destino

      # 1 -> Nombre y path del archivo a descomprimir

      # 2 -> Path completo de la carpeta donde se descomprimira.

      _crear_folder "$2"


      if [[ ! -f "$1" ]]; then

        _error "No existe el archivo $2"

        retrun 1

      else

        echo "-----------------------------------------------------------------------------------------"

        echo "Descomprimiendo: "

        echo " .- Origen : $1"

        echo " .- Destino: $2"

        _crear_folder "$2"

        if ! tar -xzf "$1" -C"$2"; then

          _error "No se ha podido descomprimir el archivo tar"

          return 1

        else

          echo " > OK"

          return 0

        fi

      fi


    function _check_installed() {

      dpkg -s $1 &> /dev/null

      if [ $? -eq 0 ]; then

        return 0

      else

        return 1

      fi


    function _mkdir() {

      echo "Creando directorio $1"

      if [[ -d "$1" ]]; then

        echo "Ya existe el directorio: $1"

      else

        if [[ "$2" -eq 1 ]]; then

          if mkdir "$1"; then

            _fin_copia

          else

            _error "No se ha podido crear el directorio $1"

          fi

        else

          if sudo mkdir "$1"; then

            _fin_copia

          else

            _error "No se ha podido crear el directorio $1"

          fi

        fi

      fi



  # Salida del script

    # Esta funcion es la que se invocará al salir del script.

    function _trap_exit(){

      _info_status_error

      rm -f "$g_log_errores"

      rm -f "$g_file_packages"

      rm -f "$g_file_packages_flatpak"


    trap _trap_exit EXIT



  # Procedimientos y funciones


    # Copia de seguridad $HOME

      function _backup_home(){

        echo "-------------------------------------------------------------------------------"

        echo "Backup de $HOME"

        echo ""

        echo "  .- Origen : $HOME"

        echo "  .- Destino: $g_destino_backup_home"

        echo ""


        if _yes_no "¿Realizar simulación de la copia?" ""; then

          _crear_folder "$g_destino_backup_home"

          echo "Simulación: Copia de seguridad de $HOME"

          echo "Se almacena la información de la copia en el archivo simul_copia.txt"

          if ! rsync -avz --dry-run --exclude .cache "$HOME" "$g_destino_backup_home" > simul_copia.txt; then

            _error "La simulación no se ha realizado correctamente."

          else

            echo ""

            echo "Se ha realizado una simulación de la copia de seguridad de home"

          fi

        fi


        if _yes_no "¿Realizar la copia?" ""; then

          _crear_folder "$g_destino_backup_home"

          echo "Iniciada Copia de seguridad de $HOME"

          if ! rsync -avz --exclude .cache "$HOME" "$g_destino_backup_home"; then

            _error "La copia no se ha realizado correctamente"

          else

            echo ""

            echo "Finalizada Copia de seguridad de $HOME"

          fi

        fi

        g_fin_script=1

        exit 0



    # Instalación controladores impresora Samsung ML1865W

      function _instalar_impresora_ML1865() {

        local file_imp


        echo "-------------------------------------------------------------------------------"

        echo "Configuración impresora ML1865W"

        echo ""


        # Comprobar si existe el archivo con los controladores

        file_imp=$(find ./impresoras/uld*)

        if [[ "$file_imp" = "" ]]; then

          _error "No se encuentra el archivo con los controladores en ./impresoras"

        fi


        if _yes_no "¿Instalar y configurar la impresora ML1865W?" ""; then


          # Comprobar que están instalados los paquetes necesarios

            if ! _check_installed cups; then

              _install_pk "cups"

            fi

            if ! _check_installed "libcupsimage2"; then

              _install_pk "libcupsimage2"

            fi


          # Instalación controladores de la impresora

            echo "Instalación controladores impresora Samsung ML1865W"

            if ! _tar_descomprimir "$file_imp" "$HOME"/Documentos/impresoras/ml; then

              _error "No ha podido descomprimirse los controladores impresora Samsung ML1865W"

            fi

            if ! sudo bash "$HOME/Documentos/impresoras/ml/uld/noarch/package_install.sh" "printer-meta"; then

              _error "No se ha instalado correctamente los controladores de la impresora Samsung ML1865W"

            else

              _fin_copia

            fi

            sudo rm -rf "$HOME"/Documentos/impresoras

        fi



    # Configurar fstab


      # Se estructura siguiente:


      # .- NAS-WD

      #     ..- juanp                   NAS-WD: /mnt/wd/juanp

      #     ..- multimedia              NAS-WD: /mnt/wd/multimedia

      #     ..- marisa                  NAS-WD: /mnt/wd/marisa


      # .- NextCloud (NO se configura)

      #     ..- nextcloud_jp/nc_opsone

      #          -> shared02.opsone-cloud.ch    => /mnt/nextcloud_jp/nc_opsone

      #         Este punto no se automonta, será montado y usado por el script de

      #         sincronización /home/juanp/manto/t_sync_nextcloud.sh


      function _config_fstab(){


        local l_backup=""

        local l_file_tmp

        #local l_nextcloud


        l_backup="$(dirname "$0")/backup"


        echo "-------------------------------------------------------------------------------"

        echo "Configuración /etc/fstab"

        echo ""

  if cat /etc/fstab | grep "# Disco WD - /juanp" &> /dev/null;then

         echo "El fstab parece que ya contiene las líneas para configurar los discos externos."

        if _yes_no "¿Listar el contenido de /etc/fstab?" ""; then

  cat /etc/fstab

          fi

        fi


  if _yes_no "¿Configurar /ect/fstab?" ""; then

          # Cuenta nextcloud

          #l_nextcloud=0

          #if _yes_no "¿Configurar la cuenta nextcloud?" ""; then

          #  l_nextcloud=1

          #fi


          # Comprobar que están instalados los paquetes necesarios

            if ! _check_installed cifs-utils; then

              _install_pk "cifs-utils"

            fi

            #          if [[ "$l_nextcloud" -eq 1 ]]; then

            #            if ! _check_installed "davfs2"; then

            #              _install_pk "davfs2"

            #            fi

            #          fi


          # Crear copia de seguridad de fstab

            echo "Creando copia de seguridad de fstab"

            _crear_folder "$l_backup"

            if ! cp /etc/fstab "$l_backup"/fstab.bck; then

              _error "No se ha podido crear la copia de seguridad de fstab"

              exit 1

            else

              _fin_copia

            fi


          # Crear la estructura de directorios y asignarles los permisos correctos.

            echo "Creando estructura de directorios en /mnt y asignando permisos"

            echo " .-  /mnt/wd"

            #if [[ "$l_nextcloud" -eq 1 ]]; then

            #  echo " .-  /mnt/nextcloud_jp"

            #fi


            # WD

          if [[ -d "/mnt/wd" ]]; then

           echo  "  .-El directorio /mnt/wd ya existe"

          else

            _mkdir "/mnt/wd" 0

            _mkdir "/mnt/wd/juanp" 0

            _mkdir "/mnt/wd/multimedia" 0

            _mkdir "/mnt/wd/marisa" 0

            _mkdir "/mnt/wd/invitado" 0

          fi

              if mountpoint -q -- "$/mnt/wd"; then

            echo "Asignando propietario y permisos a /mnt/wd"

            if ! sudo chown -R "$USER":"$USER" /mnt/wd; then

              _error "Asignando propietarios a /mnt/wd"

            elif ! sudo chmod -R 770  /mnt/wd; then

              _error "Asignando permisos a /mnt/wd"

            fi

          else

           echo "  .- /mnt/wd es un punto de montaje"

          fi

              _fin_copia


            # NextCloud

                #              if [[ "$l_nextcloud" -eq 1 ]]; then

                #                _mkdir "/mnt/nextcloud_jp" 0

                #                _mkdir "/mnt/nextcloud_jp/nc_opsone" 0

                #                echo "Asignando propietario y permisos a /mnt/nextcloud_juanp"

                #                if ! sudo chown -R "$USER":"$USER" /mnt/nextcloud_jp; then

                #                  _error "Asignando propietarios a /mnt/nextcloud_jp"

                #                elif ! sudo chmod -R 770  /mnt/nextcloud_jp; then

                #                  _error "Asignando permisos a /mnt/nextcloud_jp"

                #                fi

                #                _fin_copia

                #              fi


          # Añadir las lineas al fstab

          l_file_tmp=$(mktemp)

          cat /etc/fstab > "$l_file_tmp"


          echo ""

          echo "# Disco WD - /juanp"

          echo "//192.168.0.158/juanp  /mnt/wd/juanp      cifs credentials=/root/.credenciales,gid=juanp,uid=juanp,file_mode=0770,dir_mode=0770,iocharset=utf8,rw 0 0"

          echo ""

          echo "# Disco WD - /marisa"

          echo "//192.168.0.158/marisa /mnt/wd/marisa     cifs credentials=/root/.credenciales,gid=juanp,uid=juanp,file_mode=0770,dir_mode=0770,iocharset=utf8,rw 0 0"

          echo ""

          echo "# Disco WD - /multimedia"

          echo "//192.168.0.158/multimedia  /mnt/wd/multimedia cifs credentials=/root/.credenciales,gid=juanp,uid=juanp,file_mode=0770,dir_mode=0770,iocharset=utf8,rw 0 0"

          echo ""

          echo "# Disco WD - /invitado"

          echo "//192.168.0.158/invitado  /mnt/wd/invitado cifs credentials=/root/.credenciales,gid=juanp,uid=juanp,file_mode=0770,dir_mode=0770,iocharset=utf8,rw 0 0"

            #         if [[ "$l_nextcloud" -eq 1 ]]; then

            #           echo ""

            #           echo "# NextCloud opsone"

            #           echo "https://shared02.opsone-cloud.ch/remote.php/dav/files/favoritos.jp@gmail.com/ /mnt/nextcloud_jp/nc_opsone davfs user,rw,noauto 0 0"

            #         fi

          } >> "$l_file_tmp"


          echo "Copiando nuevo /etc/fstab"

          if ! sudo mv "$l_file_tmp" /etc/fstab; then

            rm -f "$l_file_tmp"

            _error "No se ha podido incluir las lineas en /etc/fstab (1)"

            exit 1

          else

            rm -f "$l_file_tmp"

            _fin_copia

          fi


        # Asignando propietario y permisos a /etc/fstab

          echo "Asignando propietario y permisos a /etc/fstab"

          if ! sudo chmod 644 /etc/fstab &&

              sudo chown root:root /etc/fstab; then

                      _error "2 No se ha podido incluir las lineas en /etc/fstab"

            exit 1

          else

            echo "Actualizado /etc/fstab"

            sudo ls -ls /etc/fstab

            _fin_copia

          fi


          # Copiar el archivo de credenciales a /root y asignarle los permisos y propietarios

          # adecuados.

            echo "Copiando y asignando properatio de /.credenciales"

            if ! sudo cp ./datos/fstab/.credenciales /root/.credenciales &&

                  sudo chonw root:root /root/.credenciales; then

              _error "No se ha podido copiar/configurar el archivo de credenciales"

              exit 1

            else

              echo "Configurado archivo de credenciales"

              sudo ls -ls /root/.credenciales

              _fin_copia

            fi


          # Configurar cuenta nextcloud

              #          if [[ "$l_nextcloud" -eq 1 ]]; then

              #            _crear_folder "$HOME"/.davfs2

              #            echo "Copiando y asignando propietario y premisos a secrets"

              #            if ! cp ./datos/nextcloud/davfs2/secrets "$HOME"/.davfs2 &&

              #                chown juanp:juanp "$HOME"/.davfs2/secrets &&

              #                chmod 600 "$HOME"/.davfs2/secrets &&

              #                sudo usermod -aG davfs2 juanp; then

              #              _error "Al configurar la cuenta nextcloud"

              #            else

              #              _fin_copia

              #              echo "Incluyendo en croontab la tarea de sincronizacion"

              #              (crontab -l; echo "@reboot bash $HOME/script/manto/t_sync_nextcloud.sh";) | awk '!x[$0]++'  | crontab -

              #              if [ ! $? -eq 0 ];then

              #                _error "Al incluir linea en crontab"

              #              else

              #              _fin_copia

              #              fi

              #            fi

              #          fi  

          fi



    # Configurar firma digital

      function _configurar_firma_digital(){


        echo "-------------------------------------------------------------------------------"

        echo "Instalación y configuración de la Firma Digital"

        echo ""

        echo "Leer información adicional en SO - Guía instalación Firma digital"

        echo ""


        if _yes_no "¿Instalar y configurar la firma digital?" ""; then


          if [[ ! -f "$g_libpkcs11_dnie" ]]; then

            echo ""

            echo "No se encuentra el archivo $g_libpkcs11_dnie"

            echo "Este archivo es necesario para configurar la firma digital"

            if ! _yes_no "¿Continuar?" ""; then

              exit 1

            fi

          fi

          if [[ ! -f "$g_autofirma" ]]; then

            echo ""

            echo "No se encuentra el archivo $g_autofirma"

            echo "Este archivo es necesario para configurar la firma digital"

            if ! _yes_no "¿Continuar?" ""; then

              exit 1

            fi

          fi


          _install_pk "pcsc-tools"

          _install_pk "pcsc-tools"

          _install_pk "pcscd"

          _install_pk "pinentry-gtk2"

          _install_pk "libccid"


          if ! _check_installed "libpkcs11-dnie"; then

            echo "-------------------------------------------------------------------------------"

            echo "Instalando libpkcs11-dnie"

            echo ""

            if ! sudo dpkg -i "$g_libpkcs11_dnie"; then

              _error "Firma electronica - No se ha instalado correctamente el paquete libpkcs11-dnie"

            else

              _fin_copia

            fi

          fi


          echo "-------------------------------------------------------------------------------"

          echo "Instalando / Configurando Java"

          echo ""

          if ! java -version &> /dev/null; then

            _install_pk "default-jre"

            _install_pk "libnss3-tools"

          else

            java -version

            echo ""

            echo "Es necesario que la versión de java sea la 8 o superior"

            if ! _yes_no "¿Continuar?" ""; then

              echo "Proceso cancelado"

              exit 1

            fi

            _fin_copia

          fi


          echo "-------------------------------------------------------------------------------"

          echo "Instalando AutoFirma"

          echo ""

          if ! _check_installed "autofirma"; then

            if ! sudo dpkg -i "$g_autofirma"; then

              _error "No se ha instalado correctamente AutoFirma"

            else

              _fin_copia

            fi

          else

            echo "AutoFirma ya estaba instalada"

            dpkg -l | grep autofirma

            _fin_copia

          fi


          echo ""

          echo "Sera necesario reiniciar el sistema."

          echo "Tras ello comprobar el funcionamiento:"

          echo " .- Lector: pcsc_scan"

          echo " .- Fima digital -> Ver SO - Guía instalación Firma digital"

          echo ""

          read -n1 -p "Pulsa un tecla para continuar ..."

          echo "->"

        fi



    # Configurar FireFox

      function _configurar_firefox() {

        local l_origen

        local l_destino


        l_origen="./firefox/mozilla.tar.gz"

        l_destino="$HOME/.mozilla"

        echo "-------------------------------------------------------------------------------"

        echo "Configuración de FireFox"

        echo ""

        echo "La versión de FireFox instalada es        : $(firefox -v)"

        echo "La versión de la configuración guardada es: $(cat ./firefox/versionfirefox.txt)"

        echo ""

        if _yes_no "¿Restaurar la configuración guardada previamente?" ""; then

          # backup configuracion original de FireFox

          if [ -d "$HOME"/.mozilla ]; then

            echo "Creando copia de la configuración actual de FireFox ..."

            if ! mv "$HOME"/.mozilla "$HOME"/.mozilla_backup; then

              _error "  No se ha podido crear la copia de la configuración original de FireFox"

            else

              echo "Se ha renombrado $HOME/.mozilla como $HOME/.mozilla_backup"

            fi

          fi

          echo ""

          _tar_descomprimir "$l_origen" "$l_destino"

        else

          echo "Ver archivo de instalación para configurar FireFox"

        fi

        echo ""



    # Instalar aplicaciones AppImage

      function _instalar_apps_appimage() {

        local l_origen

        local l_destino


        l_origen="./appimage"

        l_destino="$g_folder_appimage"

        echo "-------------------------------------------------------------------------------"

        echo "Las aplicaciones AppImage a instalar son las siguientes:"

        echo ""

        ls -1l "$l_origen"

        echo ""

        echo "Se copiarán en: $l_destino"

        echo ""

        if _yes_no "¿Instalar las aplicaciones AppImage?" ""; then

          _copy_full_folder "$l_origen" "$l_destino"

          if ! sudo chmod 770 "$l_destino"/* ;then

            _error "No se han podido asignar los premisos adecaudos a laa AppImages de $l_destino"

          fi

        fi



    # Instalar software flatpak

      function _install_flatpak(){

        echo "-------------------------------------------------------------------------------"

        echo "Instalando $1 ..."

        if ! flatpak install -y "$1" &> /dev/null; then

          echo ""

          _error " en la instalación: flatpak install -y $1"

          echo ""

          exit 1

        fi


      function _install_packages_flatpak(){

        local l_file_packages="$1"

        local l_package=""


        #      local -n l_array=$1

        #      local l_i

        #      for l_i in "${l_array[@]}" ; do

        #        _install_flatpak "$l_i"

        #      done


        while read -r l_package; do

          _install_flatpak "$l_package"

        done < "$l_file_packages"


      function _list_packages_flatpak(){

        local l_file_packages="$1"

        local l_package=""


        #      local -n l_array=$1

        #      local l_i

        #      for l_i in "${l_array[@]}" ; do

        #        echo "$l_i"

        #      done


        while read -r l_package; do

          echo "$l_package"

        done < "$l_file_packages"


      function _instalar_paquetes_flatpak() {

        echo "-------------------------------------------------------------------------------"

        echo "Los paquete de software flatpak a instalar son los siguientes:"

        echo ""

        _list_packages_flatpak $g_file_packages_flatpak

        if _yes_no "¿Instalar paquetes de software de flatpak?" ""; then

          _install_packages_flatpak $g_file_packages_flatpak

        fi



    # Configurar flatpak

      # Requiere la instalación previa de los paquetes:

      #     .- flatpak

      #     .- gnome-software-plugin-flatpak

      function _config_flatpak(){

        echo "-------------------------------------------------------------------------------"

        echo ""

        if _yes_no "¿Configurar flatpak?" ""; then

          if ! sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo; then

            _error "  No se ha configurado flatpak correctamente"

          fi

          _fin_copia

        fi



    # Instalar paquetes de software

      function _install_pk(){

        echo "-------------------------------------------------------------------------------"

        echo "Instalando $1"

        echo ""

        if ! sudo apt -y install "$1"; then

          echo ""

          _error " en la instalción: apt install $1"

          echo ""

          exit 1

        fi



      function _install_packages(){

        local l_file_packages="$1"

        local l_package=""


        #      local -n l_array=$1

        #      local l_i

        #      for l_i in "${l_array[@]}" ; do

        #        _install_pk "$l_i"

        #      done


        while read -r l_package; do

          _install_pk "$l_package"

        done < "$l_file_packages"




      function _list_packages(){

        local l_file_packages="$1"

        local l_package=""


        #      local -n l_array=$1

        #      local l_i

        #      for l_i in "${l_array[@]}" ; do

        #        echo "$l_i"

        #      done


        while read -r l_package; do

          echo "$l_package"

        done < "$l_file_packages"


      function _instalar_paquetes_software(){

        echo "-------------------------------------------------------------------------------"

        echo "Los paquete de software a instalar son los siguientes:"

        echo ""

        _list_packages $g_file_packages

        echo ""

        if _yes_no "¿Instalar paquetes de software?" ""; then

          _install_packages $g_file_packages

        fi



    # Actualizar el Sistema Operativo

      function _update_SO(){

        if _yes_no "¿Iniciar la actualización del Sistema Operativo?" ""; then

          # Actualizar las listas de paquetes de los repositorios

            echo "-------------------------------------------------------------------------------"

            echo "Actualizando las listas de paquetes de los repositorios."

            echo ""

            if ! sudo apt update; then

              echo ""

              _error " en la ejecución de: apt update"

              echo ""

              exit 1

            else

              _fin_copia

            fi


          # Instalar las versiones más recientes de todos los paquetes

            echo "-------------------------------------------------------------------------------"

            echo "Instalando las versiones más recientes de todos los paquetes"

            echo "actualmente instalados en el sistema"

            echo ""

            if ! sudo apt upgrade -y; then

              echo ""

              _error " en la ejecución de: apt upgrade -y"

              echo ""

              exit 1

            else

              _fin_copia

            fi


          # Eliminar paquetes innecesarios."

            echo "-------------------------------------------------------------------------------"

            echo "Eliminando paquetes innecesarios."

            echo ""

            if ! sudo apt autoremove; then

              echo ""

              _error " en la ejecución de: apt autoremove"

              echo ""

              exit 1

            else

              _fin_copia

            fi

          fi



    # Copia de información automática

      function _copia_automatica_datos(){

        local l_origen

        local l_destino

        local l_file

        # Copia de archivos


          # - Copiar este script

            l_destino="$g_folder_copy"

            l_file="$(dirname "$(readlink -f "$0")")/$0"

            _copy_file "$l_file" "$l_destino" 0


          # - Copiar /etc/fstab

            l_destino="$g_folder_copy/datos/fstab"

            l_file="/etc/fstab"

            _copy_file "$l_file" "$l_destino" 0


          # - Copiar /root/.credenciales

            l_destino="$g_folder_copy/datos/fstab"

            l_file="/root/.credenciales"

            _copy_file "$l_file" "$l_destino" 1


          # - Copiar "$HOME"/.bash_history

            l_destino="$g_folder_copy/datos/files"

            l_file="$HOME"/.bash_history

            _copy_file "$l_file" "$l_destino" 0


          # - Copia /.config/user-dirs.dirs

            l_destino="$g_folder_copy/datos/config"

            l_file="$HOME"/.config/user-dirs.dirs

            _copy_file "$l_file" "$l_destino" 0


          # - Copia "$HOME"/.davfs2/secrets

            # Información de configuracion para conectar la cuenta de nextcloud

                #          l_destino="$g_folder_copy/datos/nextcloud/davfs2"

                #          l_file="$HOME"/.davfs2/secrets

                #          _copy_file "$l_file" "$l_destino" 0


          # - Copiar información de crontab

            l_destino="$g_folder_copy/datos/crontab"

            l_file="$HOME/crontab.txt"

            crontab -l > "$l_file"

            _copy_file "$l_file" "$l_destino" 0

            rm "$l_file"


          # - Copia configuración rclone

            l_destino="$g_folder_copy/datos/rclone"

            l_file="$HOME"/.config/rclone/rclone.conf

            _copy_file "$l_file" "$l_destino" 0



        # Copia de directorios

          # -Información de Shotwell

            # Datos Shotwell $HOME/.local/share/shotwell/

              l_destino="$g_folder_copy/datos/shotwell/datos"

              l_origen="$HOME/.local/share/shotwell"

              _copy_full_folder "$l_origen" "$l_destino"


            # Cache Shotwell $HOME/.cache/shotwell/thumbs

              l_destino="$g_folder_copy/datos/shotwell/cache/thumbs.tar.gz"

              l_origen="$HOME/.cache/shotwell/thumbs"

              _tar_comprimir "$l_destino" "$l_origen"


          # - Directorio /.config/autostart

            l_destino="$g_folder_copy/datos/config/autostart"

            l_origen="$HOME/.config/autostart"

            _copy_full_folder "$l_origen" "$l_destino"


          # - Directorio de los archivos de contraseñas de KeePassXC"

            l_destino="$g_folder_copy/datos/keepassxc"

            l_origen="$HOME/Documentos/dock_xc"

            _copy_full_folder "$l_origen" "$l_destino"


          # - Directorio de las contraseñas /home/juanp/.gnupg

            l_destino="$g_folder_copy/datos/gnupg"

            l_origen="$HOME/.gnupg"

            _copy_full_folder "$l_origen" "$l_destino"


          # - Directorio de /home/juanp/.local/share/applications

            l_destino="$g_folder_copy/datos/applications"

            l_origen="$HOME/.local/share/applications"

            _copy_full_folder "$l_origen" "$l_destino"


          # - Directorio aplicaciones AppImage: Tutanota

            l_destino="$g_folder_copy/appimage"

            l_origen="$g_folder_appimage"

            _copy_full_folder "$l_origen" "$l_destino"


        # Directorios con comprimidos TAR

          # - Directorio de los iconos que se están usando

            l_destino="$g_folder_copy/iconos/iconos.tar.gz"

            l_origen="$HOME/.local/share/icons"

            _tar_comprimir "$l_destino" "$l_origen"


          # - Configuración de Transmission

            l_destino="$g_folder_copy/transmission/transmission.tar.gz"

            l_origen="$HOME/.config/transmission"

            _tar_comprimir "$l_destino" "$l_origen"          


          # - Directorio de Scripts

            l_destino="$g_folder_copy/script/scripts.tar.gz"

            l_origen="$g_folder_scripts_origen"

            _tar_comprimir "$l_destino" "$l_origen"


          # Directorio de pagina web personal incluidas las guias

            l_destino="$g_folder_copy/firefox/personalpage.tar.gz"

            l_origen="$HOME/Documentos/personalpage"

            _tar_comprimir "$l_destino" "$l_origen"


          # Información de FireFox ./.mozilla

            l_destino="$g_folder_copy/firefox/mozilla.tar.gz"

            l_origen="$HOME/.mozilla"

            _tar_comprimir "$l_destino" "$l_origen"

            # Guardar la verisión instalada de FireFox

            l_destino="$g_folder_copy/firefox/versionfirefox.txt"

            firefox -v > "$l_destino"



        # Información general

          # Información de los discos duros proporcionada por lsblk -f -m y df -h

            l_destino="$g_folder_copy/discos"

            _crear_folder "$l_destino"

            _ini_copia "Discos" "$l_destino"


              echo "lsblk -f -m"

              echo "-----------"

              echo ""

              if ! lsblk -f -m ;then

                _error " al copiar información en $l_destino"

              fi

              echo ""

              echo ""

              echo ""

              echo "df -h"

              echo "-----------"

              echo ""

              df -h

            } >  "$l_destino/info_discos.txt"

            _fin_copia


          # Información de Crontab

            l_destino="$g_folder_copy/datos/config/crontab"

            _crear_folder "$l_destino"

            _ini_copia "Crontab" "$l_destino"

            if ! crontab -l > "$l_destino/crontab.txt"; then

              _error "No se ha podido copiar la información de Crontal en $l_destino/crontab.txt"

            fi

            _fin_copia





    # Copia de información manual

      function _copia_manual_datos(){

        # Información de FireFox

          l_destino="$g_folder_copy/firefox"

          _crear_folder "$l_destino"

          _ini_copia "FireFox" "$l_destino"

          echo "    ..- Hacer un backup de los marcadores de FireFox y copiarlo en $l_destino"

          echo ""

          if ! _yes_no "¿Continuar?" "";then

            exit 1

          fi


        # Información de Evolution

          l_destino="$g_folder_copy/evolution"

          _crear_folder "$l_destino"

          _ini_copia "Evolution" "$l_destino"

          echo "    ..- Crear copia de respaldo en $l_destino"

          echo "          Archivo - Respaldar datos de Evolution"

          echo ""

          if ! _yes_no "¿Continuar?" "";then

            exit 1

          fi


        # Información de Firma electrónica

          l_destino="$g_folder_copy/firma_electronica"

          _crear_folder "$l_destino"

          _ini_copia "Firma electronica" "$l_destino"

          echo "    ..- Ver en guías linux: SO - Guía instalación Firma digital (Versión 1.05)"

          echo ""

          echo "    Descargar:"

          echo "      ...- Los módulos criptográficos PKCS#11"

          echo "           https://www.dnielectronico.es/PortalDNIe/PRF1_Cons02.action?pag=REF_1112"

          echo "      ...- Ultima versión de la aplicacion autofirma"

          echo "           https://firmaelectronica.gob.es/Home/Descargas.html"

          echo ""

          echo "   Descomprimir el archivo zip de autofiram y tomar nota del paquete deb que se "

          echo "   va a instalar."

          if ! _yes_no "¿Continuar?" "";then

            exit 1

          fi


        # Información controladores impresoras

          l_destino="$g_folder_copy/impresoras"

          _crear_folder "$l_destino"

          _ini_copia "Impresoras" "$l_destino"

          echo "    Descargar:"

          echo "      ...- Samsung ML-1685W"

          echo "           https://support.hp.com/us-en/drivers/selfservice/samsung-ml-1865-laser-printer-series/19134664"

          echo ""

          if ! _yes_no "¿Continuar?" "";then

            exit 1

          fi


        # Información de distribución discos duros

          l_destino="$g_folder_copy/discos"

          _crear_folder "$l_destino"

          _ini_copia "Distribución discos duros" "$l_destino"

          echo "    ..- Copiar captura de pantalla de la distribución de los disco duros con GParted en $l_destino"

          echo ""

          if ! _yes_no "¿Continuar?" "";then

            exit 1

          fi


        # Información de la configuración del editor GEdit

          l_destino="$g_folder_copy/editor"

          _crear_folder "$l_destino"

          _ini_copia "Configuración del editor GEdit" "$l_destino"

          echo "    ..- Copiar captura de pantalla de la configuración de GEdit en $l_destino"

          echo ""

          if ! _yes_no "¿Continuar?" "";then

            exit 1

          fi


        # Información Instalación de VirtualBox

          l_destino="$g_folder_copy/virtualbox"

          _crear_folder "$l_destino"

          _ini_copia "Instalición VirtualBox" "$l_destino"

          echo "    Descargar:"

          echo "      ...- VirtualBox y VM VirtualBox Extension Pack"

          echo "           https://www.virtualbox.org/"

          echo ""

          if ! _yes_no "¿Continuar?" "";then

            exit 1

          fi



    # Restaurar información copiada

      function _restaurar_datos(){


        # Restaurar archivos

          # Archivo "$HOME"/.bash_history

            echo "------------------------------------------------------------------------"

            l_file="./datos/files/.bash_history"

            l_destino="$g_folder_home"

            _copy_file "$l_file" "$l_destino" 0


          # Restaurar configuración rclone

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar configuración de rclone?" ""; then

              l_file="./datos/rclone/rclone.conf"

              l_destino="$g_folder_home/.config/rclone"

              _copy_file "$l_file" "$l_destino" 0

              if ! sudo chown -R "$USER":"$USER" "$l_destino/rclone.conf"; then

                _error "Asignando propietarios a $l_destino/rclone.conf"

              elif ! sudo chmod -R 600  "$l_destino/rclone.conf"; then

                _error "Asignando permisos a $l_destino/rclone.conf"

              fi

              _crear_folder "$HOME/nextcloud"

              _crear_folder "$HOME/dropbox"

            fi  

        # Restaurar directorios

          # Información de Shotwell

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar información de Shotwell?" ""; then

              # Datos Shotwell $HOME/.local/share/shotwell/

                l_origen="./datos/shotwell/datos"

                l_destino="$g_folder_home/.local/share/shotwell"

                _copy_full_folder "$l_origen" "$l_destino"


              # Cache Shotwell $HOME/.cache/shotwell/thumbs

                l_origen="./datos/shotwell/cache/thumbs.tar.gz"

                l_destino="$g_folder_home/.cache/shotwell/thumbs"

                _tar_descomprimir "$l_origen" "$l_destino"

            fi


          # Directorio /.config/autostart

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Copiar a HOME/.config/autostart?" ""; then

              l_origen="./datos/config/autostart"

              l_destino="$g_folder_home/.config/autostart"

              _copy_full_folder "$l_origen" "$l_destino"

            fi


          # Directorio de los archivos de contraseñas de KeePassXC"

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar archivos de contraseñas KeepassXc?" ""; then

              l_origen="./datos/keepassxc"

              l_destino="$g_folder_home/Documentos/dock_xc"

              _copy_full_folder "$l_origen" "$l_destino"

            fi


          # Directorio de las contraseñas /home/juanp/.gnupg

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar las contraseñas de SeaHorser ./gnupg?" ""; then

              echo "------------------------------------------------------------------------"

              l_origen="./datos/gnupg"

              l_destino="$g_folder_home/.gnupg"

              _copy_full_folder "$l_origen" "$l_destino"

              # Asignar propietario a la carpeta /.gnupg y a su contenido

              # Derechos de acceso correctos de la carpeta .gnupg, subcarpetas y contendio:

                if ! chown -R "$USER" "$HOME"/.gnupg/ &&

                     find "$HOME"/.gnupg -type f -exec chmod 600 {} \; &&

                     find "$HOME"/.gnupg -type d -exec chmod 700 {} \; ; then

                  _error "No ha podido asignarse propietario y permisos correctos a $HOME/.gnupg"

                fi

            fi

          # Directorio de /home/juanp/.local/share/applications

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar /.local/share/applications?" ""; then 

              l_origen="./datos/applications"

              l_destino="$g_folder_home/.local/share/applications"

              _copy_full_folder "$l_origen" "$l_destino"

            fi


        # Directorios con comprimidos TAR

          # Directorio de los iconos que se están usando

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar Iconos?" ""; then

              l_origen="./iconos/iconos.tar.gz"

              l_destino="$g_folder_home/.local/share/icons"

              _tar_descomprimir "$l_origen" "$l_destino"

            fi


          # Directorio de Scripts

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar los scripts?" ""; then

              l_origen="./script/scripts.tar.gz"

              l_destino="$g_folder_home$g_folder_scripts_destino"

              _tar_descomprimir "$l_origen" "$l_destino"

              if echo "$PATH" | grep $p &> /dev/null;then

                echo ""

              else


                  echo ""

                  echo "export PATH="'$PATH'":$l_destino"

                } >> "$g_folder_home"/.bashrc

              fi

            fi


          # Directorio configuración Transsmission

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar la configuración de Transmission ?" ""; then

              l_origen="./transmission/transmission.tar.gz"

              l_destino="$g_folder_home$g_folder_scripts_destino"

              _tar_descomprimir "$l_origen" "$l_destino"

            fi

          # Directorio de pagina web personal incluidas las guias

            echo "------------------------------------------------------------------------"

            if _yes_no "¿Restaurar la Página Web Personal?" ""; then

              l_origen="./firefox/personalpage.tar.gz"

              l_destino="$g_folder_home/Documentos/personalpage"

              _tar_descomprimir "$l_origen" "$l_destino"

            fi





  # Menú script

    # Tareas posteriores a la instalación

      function _tareas_posteriores(){

        clear

        echo "-----------------------------------------------------------------------------------------"

        echo ""

        echo " Script de instalación y configuración del Sistema Operativo"

        echo " Sistema Operativo: $g_app_so"  

        echo " Versión script: $g_app_version ($g_app_fecha)"

        echo ""

        echo "-------------------------------------------------------------------------------"

        echo ""

        if [[ ! -d "$g_folder_home" ]]; then

          echo "Error: No existe el directorio $g_folder_home"

          g_fin_script=1

          exit 0

        fi


        if [[ ! "$g_folder_home" = "$HOME" ]]; then

          _error "El directorio donde se instalara la información no es $HOME"

        fi


        if ! _yes_no "¿Iniciar la reatauración de la información en $g_folder_home ?" ""; then

          g_fin_script=1

          exit 0

        fi


        # Actualizar el Sistema operativo

          _update_SO

        # Activar el cortafuegos

          echo "------------------------------------------------------------------------"

          if _yes_no "¿Activar el corta fuegos?" ""; then

          # Comprobar que están instalados los paquetes necesarios

            if ! _check_installed ufw; then

              _install_pk "ufw"

            fi

            if ! sudo ufw enable; then

              _error " al activar el corta fuegos con el cli [sudo ufw enable]"

            else

              _fin_copia

            fi

          fi

        # Instalar los paquetes de software

          _instalar_paquetes_software

        # Restaura información

          _restaurar_datos

        # Configurar FireFox

          _configurar_firefox

        # Configurar la Firma Digital

          _configurar_firma_digital        

        # Configurar flatpak

          _config_flatpak

        # Instalar el software de flatpak

          _instalar_paquetes_flatpak

        # Instalar aplicaciones AppImage

          _instalar_apps_appimage

        # Configurar fstab

          _config_fstab

        # Instalar impresora

          _instalar_impresora_ML1865

        # Finalizar

          echo "-------------------------------------------------------------------------------"

          echo "Proceso finalizado correctamente"

          echo " "

          echo " En ../datos/crontab/crontab.txt se encuentran las líneas a incluir en "

          echo " crontrab cuando se hayan copiado todos los documentos al ordendor."

          echo ""

          echo " ADVERTENCIA: Incluye la línea para ejecutar al inicio la sincronización con el"

          echo "              NAS WD."

          echo "              En el PC ha de estar toda la información, si no la sincronizacón"

          echo "              eliminará toda la que haya en el WD NAS"  

          g_fin_script=1

          exit 0


    # Tareas previas a la instalación

      function _tareas_previas(){

        clear

        echo "-------------------------------------------------------------------------------"

        echo ""

        echo " Script de instalación y configuración del Sistema Operativo"

        echo " Sistema Operativo: $g_app_so"  

        echo " Versión script: $g_app_version ($g_app_fecha)"  

        echo ""

        echo " La copia de la información del SO se realizará en:"

        echo "  >> $g_folder_copy"

        echo "-------------------------------------------------------------------------------"

        echo ""

        # Comprobar si existe el directorio donde se realizará la copia

          if [[ ! -d "$g_folder_copy" ]]; then

            echo " El directorio donde se va a realizar la copia no existe."

            if _yes_no "¿Se crea el directorio?" ""; then

              _crear_folder "$g_folder_copy"

            else

              echo ""

              echo "Error: No existe el directorio $g_folder_copy"

              exit 1

            fi

          fi


        # Tareas previas

          _copia_automatica_datos

          _copia_manual_datos

        # Finalizar

          g_fin_script=1

          exit 0


    # Menú inicial de script

      function _menu_inicial(){

        clear

        echo "-----------------------------------------------------------------------------------------"

        echo ""

        echo " Script de instalación y configuración del Sistema Operativo"

        echo " Sistema Operativo: $g_app_so"  

        echo " Versión script: $g_app_version ($g_app_fecha)"

        echo ""

        echo " 1.- Tareas previas a la instalación."

        echo " 2.- Tareas posteriores a la instalación."

        echo " 3.- Crear copia de seguridad de $HOME."

        echo ""

        read -r -N1 -p "     Selecciona opción [1/2/3] " opcion

        echo ""

        case $opcion in

          "1")

            echo 1

            _tareas_previas


          "2")

          _tareas_posteriores


          "3")

          _backup_home



          echo "Finalizado"

          g_fin_script=1

          exit 0


        esac



  # INICIO DEL SCRIPT

    # Comprobaciones previas

      # Comprobar si el usuario está incluido en grupo sudo

        if cut -d: -f1,4 /etc/group | grep sudo | grep $USER; then

          echo "OK: Usuario $USER está incluido el en grupo sudo"

        else

          echo ""

          echo "  Usuario $USER no está incluido en el grupo sudo."

          echo "  Para incluir a $USER en el grupo sudo (administradores) ejecutar:"

          echo "   su [enter]"

          echo "   sudo usermod -aG sudo $USER"

          echo "   sudo shutdown -r now"

          echo ""

          exit 1

        fi


    # Presentar menú inicial

    _menu_inicial