Mensaje personalizado (editable) para cada usuario después de iniciar sesión

11

La computadora está siendo utilizada por tres usuarios (+1 administrador) y utilizan el inicio de sesión de la unidad. Los tres usuarios vienen, usan la computadora y cierran sesión. Tengo que dar algunas instrucciones, noticias y detalles cada vez que inician sesión.

Quiero tener una utilidad / herramienta donde pueda escribir un mensaje personalizado para cada usuario. El último mensaje se mostraría en el escritorio (para cada usuario) (con la fecha de mi última edición) durante unos 10-15 segundos. Una copia del texto también estará disponible (para el usuario) en algún lugar con todos los mensajes y fechas como un registro.

ingrese la descripción de la imagen aquí

* El administrador tiene acceso SSH al sistema.

No estoy seguro de si esto es posible (¡y es posible que esté buscando demasiado!).

ankit7540
fuente
Se puede hacer. ¿Cuál es tu versión específica de Ubuntu? ¿Están bien las ventanas emergentes? ¿O preferiría el texto en pantalla como muestra su ejemplo?
Sergiy Kolodyazhnyy
Ejecutando 14.04 LTS y no hay planes para actualizar en el corto plazo. Las ventanas emergentes / notificaciones están bien si permanecen durante unos segundos (~ 10-15 segundos)
ankit7540
Implementé un script rápido, publiqué una respuesta. Permite crear un archivo y ese archivo coincidirá con cada usuario. Avíseme qué otra funcionalidad desea que agregue allí, y en caso de que necesite alguna otra aclaración. El guión no es elegante, sino bastante estable.
Sergiy Kolodyazhnyy
Hola @ ankit7540 publicó mi respuesta, en la primera "edición", olvidé mencionar para hacer que el script sea ejecutable, pero eso podría ser obvio :)
Jacob Vlijm
Gracias por sus esfuerzos @Serg: Me gusta el enfoque, déjenme probar y responder.
ankit7540

Respuestas:

11

Puede hacerlo en la siguiente configuración, que producirá una ventana semitransparente, que se mantendrá durante un tiempo arbitrario:

  1. Cree en un (cualquier) directorio, en el que cada uno de los usuarios tenga al menos permisos de lectura , para cada usuario, un archivo de mensaje, exactamente con el nombre de usuario de cada usuario (nombre de inicio de sesión), sin extensión, por ejemplo

    jacob
    

    Agregue texto al archivo como su mensaje. Si agrega un nuevo mensaje, comience con ###, el script mostrará automáticamente el último mensaje. El texto puede contener lo que quiera, se verá exactamente como lo puso en el archivo.

    • El último mensaje se copiará latest_message.txten el directorio de inicio del usuario como referencia.

    • Tal como está, la ventana permanecerá durante 15 segundos, pero puede establecerla en cualquier valor, incluso hacer que dependa automáticamente de la longitud del texto.


    Un archivo de ejemplo podría verse así:

    Vraag:
    Een aap op een fiets, hoe vind je zoiets?
    
    Opdracht:
    Geef antwoord op de vraag!
    
    ###
    Vraag:
    Hoe is de koffie vandaag?
    
    Opdracht:
    Zet het zelf even als het niet te drinken is!
    

    El mensaje entonces se vería así:

    ingrese la descripción de la imagen aquí

  2. Copie la secuencia de comandos a continuación en un archivo vacío, edite en la sección principal de la secuencia de comandos la ruta a la carpeta en la que almacena los mensajes de los usuarios. Guarde el script como show_personalmessageen (p. Ej.) /usr/local/bin(Que debería estar en $PATH y hacerlo ejecutable (!) (Sin extensión)

    #!/usr/bin/env python3
    import subprocess
    import os
    import gi
    gi.require_version('Gtk', '3.0')
    from gi.repository import GObject, Gtk, Gdk, Pango
    from threading import Thread
    import time
    import getpass
    
    # --- set the path to the message files below, filename = username
    filedir = "/home/jacob/Bureaublad"
    # --- set the time to show the window below
    showtime = 15
    # ---
    
    # don't change anything below
    user = getpass.getuser()
    currmessage = os.environ["HOME"]+"/latest_message.txt"
    f = filedir+"/"+user
    text = "Welcome "+user+"\n\n"+open(f).read().split("###")[-1]
    open(currmessage, "wt").write(text)
    
    class Splash(Gtk.Window):
    
        def __init__(self):
            Gtk.Window.__init__(self, title="splashtitle")
            maingrid = Gtk.Grid()
            self.add(maingrid)
            maingrid.set_border_width(80)
            # set text for the spash window
            label = Gtk.Label(text)
            label.modify_font(Pango.FontDescription('Ubuntu 12'))
            maingrid.attach(label, 0, 0, 1, 1)
            self.stop = Thread(target=self.close_window)
            self.stop.start()
    
        def close_window(self):
            time.sleep(showtime)
            Gtk.main_quit()
    
    def splashwindow():
        window = Splash()
        window.set_decorated(False)
        window.set_resizable(False)
        window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
        window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("grey"))
        window.set_opacity(0.8)
        window.set_position(Gtk.WindowPosition.CENTER)
        window.show_all()
        GObject.threads_init()
        Gtk.main()
    
    splashwindow()
  3. Crea un lanzador en /etc/xdg/autostart

    [Desktop Entry]
    Type=Application
    Name=Splash 
    Exec=/bin/bash -c "sleep 10 && show_personalmessage"
    

    La suspensión 10 es para asegurarse de que el escritorio esté "listo" para abrir la ventana.

Explicación

  • Lanzadores en /etc/xdg/autostartcomandos de ejecución para cada usuario al iniciar sesión.
  • Luego, el iniciador ejecuta la ventana (llamada por el comando show_personalmessage), que busca el mensaje personalizado en el directorio que definió. Adicionalmente. El mensaje más reciente se copia en el directorio de inicio del usuario.
  • Si es necesario, la ruta al mensaje puede modificarse, incluso puede hacerse específica para el usuario utilizando el getpassmódulo -m, de modo que el script (ventana) busque un archivo con nombre específico para el usuario en un directorio. Mencione si eso sería necesario.

Adicionalmente

La ventana (Gtk)

  • se puede hacer que permanezca debajo de todo, como si fuera parte del fondo
  • se puede hacer estar al tanto de todo
  • se puede cerrar

etcétera etcétera...


EDITAR

Para ahorrar tiempo escribiendo mensajes, como se discutió en el chat , debajo de una versión del script en la que puede incluir algunas secciones "permanentes":

  • premsg, que debe estar justo debajo de "Bienvenido usuario x", y el cuerpo de su mensaje, y
  • postmsg, que aparece como la sección inferior de su mensaje.

Ambas secciones se pueden establecer en none, solo estableciéndolas ""como un valor.

ingrese la descripción de la imagen aquí

La secuencia de comandos

#!/usr/bin/env python3
import subprocess
import os
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import GObject, Gtk, Gdk, Pango
from threading import Thread
import time
import getpass

# --- set the path to the message files below, filename = username
filedir = "/path/to/message_directory"
# --- set the time to show the window below
showtime = 15
# --- set pre-message below. set premessage = "" for no pre-message
premsg = """We assume you read all 3782 instruction pages on how to use
Ubuntu before you push any button on this computer.
""" 
# --- set post-message below. set postmessage = "" for no post-message
postmsg = """Before you go to sleep tonight, make sure to brush your
teeth for at least half an hour
"""

# --- don't change anything below
user = getpass.getuser()
currmessage = os.environ["HOME"]+"/latest_message.txt"
f = filedir+"/"+user

text = "Welcome "+user+"\n\n"+premsg+"\n"+open(f).read().split("###")[-1]+"\n"+postmsg

open(currmessage, "wt").write(text)

class Splash(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="splashtitle")
        maingrid = Gtk.Grid()
        self.add(maingrid)
        maingrid.set_border_width(80)
        # set text for the spash window
        label = Gtk.Label(text)
        label.modify_font(Pango.FontDescription('Ubuntu 12'))
        maingrid.attach(label, 0, 0, 1, 1)
        self.stop = Thread(target=self.close_window)
        self.stop.start()

    def close_window(self):
        time.sleep(showtime)
        Gtk.main_quit()

def splashwindow():
    window = Splash()
    window.set_decorated(False)
    window.set_resizable(False)
    window.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(0,0,0,1))
    window.modify_fg(Gtk.StateFlags.NORMAL, Gdk.color_parse("white"))
    window.set_opacity(0.8)
    window.set_position(Gtk.WindowPosition.CENTER)
    window.show_all()
    GObject.threads_init()
    Gtk.main()

splashwindow()

Nota

Por supuesto, al igual que el cuerpo del mensaje , puede modificar el script para leer los mensajes previos y posteriores de un archivo, lo que hace que sea aún más conveniente mantenerlo. Lo hizo así, por razones de simplicidad en la respuesta.

Jacob Vlijm
fuente
Intentó. Funciona muy bien Mirando el código, entiendo cómo cambiar el tiempo que permanece. Una pregunta: ¿Qué sucede si no tengo acceso SSH a la casa del usuario (pero solo a mi casa)?
ankit7540
Usted (o yo) puede establecer cualquier ruta, pero debemos hacer que se use getpasspara que cada usuario solicite atómicamente el archivo con nombre. ¿Qué camino tendrías en mente? Debe ser una ruta a la que cada usuario tenga acceso de lectura. Espera, lo
editaré
@ ankit7540 lo editó en el script (y en la explicación).
Jacob Vlijm
@ ankit7540 Ah, te veo en la primera línea: "Bienvenido usuario ..." ¿Eso es importante para ti? es solo una línea en el código si es así.
Jacob Vlijm
Sobre esa línea "Bienvenido $ usuario", solo puede decirme aquí y puedo agregarla en el script. Además, considere usuario tiene una carpeta, /home/message. Sería bueno copiar el texto del mensaje reciente (catenate, etc.) en un archivo fijo (para referencia)
ankit7540
6

El siguiente script permite al administrador almacenar mensajes personalizados en forma username_mm_dd_yyyy.txten un directorio definido por el administrador. Los nombres de usuario se determinan automáticamente y se comparan con el nombre de archivo y la fecha del archivo que se mostrará.

El script también puede tener una .desktopentrada que se colocará en el /etc/xdg/autostartdirectorio. Eso hará que el script se muestre para cada usuario. Alternativamente, puede colocar el .desktoparchivo en el ~/.config/autostartdirectorio de cada usuario individual .

#!/bin/bash
_get_username()
{
  qdbus  com.canonical.Unity  \
        /com/canonical/Unity/Session \
        com.canonical.Unity.Session.UserName
}

_get_date()
{
  date +%m_%d_%Y
}

_show_error()
{
  MESSAGE="Can't read the file or file doesn't exist. Contact the admin for assistance"

  zenity --error --title="Ooops, something went wrong!" --text="$MESSAGE"
}

main()
{
  # replace this with the actual directory 
  # that you want to use for storing messages
  MESSAGES_DIRECTORY="/tmp"

  # file name is made up of username_mm_dd_yyyy
  FILE="$MESSAGES_DIRECTORY"/"$( _get_username )"_"$( _get_date )".txt
  echo "$FILE"
  if [ -r "$FILE"   ] ; then
     zenity --text-info  --title="Welcome, $( _get_username )" --filename="$FILE"
  else
     _show_error
  fi
}

main

A continuación puede ver una pequeña demostración del script en acción. He creado el archivo en el formato especificado en mi /tmpcarpeta

ingrese la descripción de la imagen aquí

Sergiy Kolodyazhnyy
fuente
Lamento haberte hecho esperar. Funciona super bien. Me gustan los botones 'Cancelar' y 'Aceptar'. Lo utilicé con la entrada .desktop y funciona perfecto.
ankit7540
@ ankit7540 Me alegra que te guste. ¿Alguna característica adicional que quieras que agregue?
Sergiy Kolodyazhnyy
Considere usuario tiene una carpeta, /home/message. Sería bueno copiar el archivo de mensaje reciente y guardarlo allí como referencia.
ankit7540
@ ankit7540 se puede hacer. Es simplemente una cuestión de agregar una línea con cpcomando, el primer argumento es la copia del administrador y el segundo argumento /home/$( _get_username )/messages/$FILE.txtque necesito para dormir, pero puedo agregar eso por la mañana. Es solo una línea.
Sergiy Kolodyazhnyy
Y si quieres catear el archivo, eso es solocat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Sergiy Kolodyazhnyy