Skip to content

Funcionamiento interno

Almudena Garcia edited this page May 4, 2018 · 7 revisions

La aplicación, de forma interna, realiza lo siguiente:

  1. Al instalar la aplicación:

    • Los scripts se copiarán al directorio /usr/bin/pendrive-reminder
      • Si la versión de polkit es inferior a la 0.106, también se copiará el fichero pkla de polkit
      • Si la versión de polkit es igual o superior a la 0.106, también se copiará el cliente dbus
    • Las reglas udev se copiarán a /etc/udev/rules.d
    • En polkit >= 0.106, se copiará la regla polkit a /usr/share/polkit-1/rules.d/
  2. Al conectar el pendrive (o cualquier otro dispositivo de almacenamiento USB), una regla udev lanza el script usbdevinserted.sh.

    Este script realizará las siguientes acciones:

    • Obtiene el identificador del pendrive (mediante la variable $DEVPATH), y lo escribe en el fichero testigo (ubicado en /tmp/usbdevinfo), creándolo en caso de no existir. Este fichero testigo nos servirá para saber si existe algún pendrive conectado en el equipo. Si, posteriormente, se conecta otro dispositivo de almacenamiento USB, su identificador se añadirá a dicho fichero testigo.

    • Si la versión de polkit es inferior a la 0.106, copia el fichero pkla al directorio /usr/share/polkit-1/rules.d/, para activar el bloqueo del apagado

    • Si la versión de polkit es igual o superior a la 0.106, lanza un cliente dbus, que será usado para mostrar una notificación al usuario al abrir el menú de apagado.

      • Lanza un cliente por cada usuario que tenga una sesión gráfica activa
      • Copia los pid de los clientes dbus en un fichero (ubicado en /tmp/pid_dbus), para poder matar los procesos posteriormente
    • Muestra una notificación a todos los usuarios que tengan iniciada una sesión gráfica

  3. Al desconectar cualquier dispositivo USB, una segunda regla udev lanza el script usbdevgone.sh.

    Este script realiza las siguientes acciones:

    • Obtiene el identificador del dispositivo, mediante la variable $DEVPATH
    • Mediante una expresión regular, busca el identificador dentro del fichero testigo
      • Si existe, lo borra
    • Si, después de borrar el identificador, el fichero testigo se queda vacío, borra el fichero.
    • Si el fichero no existe:
      • Si la versión de polkit es inferior a la 0.106, borra el fichero pkla para desactivar el bloqueo de apagado.
      • Si la versión de polkit es igual o superior a la 0.106, mata todos los clientes dbus iniciados anteriormente.
    • Muestra una notificación a todos los usuarios con una sesión gráfica activa
  4. Si el usuario pulsa el botón de apagar mientras el pendrive está conectado, una regla polkit bloqueará el apagado. Para conseguir esto, se procederá de dos maneras diferentes, según la versión de polkit existente en el sistema:

    • Polkit < 0.106:

      • El fichero pkla, insertado anteriormente por usbdevinserted.sh, bloqueará el apagado
    • Polkit >= 0.106:

      • El fichero de reglas ejecutará una función javascript, que realizará las siguientes acciones, mediante un bloque try-catch:
        • En el bloque try:
          • Ejecutar el script check_pendrive.sh, que comprobará la existencia del fichero testigo
            • Si existe, devuelve 1 (error)
            • Si no existe, devuelve 0 (correcto)
          • Si el script devuelve 0, continúa el bloque try, que autoriza el apagado
          • Si el script devuelve 1, salta al bloque catch
        • En el bloque catch:
          • Llama al script send_notify.sh, que enviará la señal al cliente dbus
            • El cliente dbus recibe la señal y muestra la notificación por pantalla
          • Deniega la autorización del apagado
Clone this wiki locally