Message personnalisé (modifiable) pour chaque utilisateur après la connexion

11

L'ordinateur est utilisé par trois utilisateurs (+1 administrateur) et ils utilisent la connexion unitaire. Les trois utilisateurs viennent, utilisent l'ordinateur et se déconnectent. Je dois donner des instructions, des nouvelles et des détails chaque fois qu'ils se connectent.

Je veux avoir un utilitaire / outil où je peux taper un message personnalisé à chaque utilisateur. Le dernier message serait alors affiché sur le bureau (pour chaque utilisateur) (avec la date de ma dernière modification) pendant 10 à 15 secondes. Une copie du texte sera également disponible (pour l'utilisateur) quelque part avec tous les messages et les dates comme un journal.

entrez la description de l'image ici

* L'administrateur a un accès SSH au système.

Je ne sais pas si c'est possible (et peut-être que j'en cherche trop!).

ankit7540
la source
Peut être fait. Quelle est votre version ciblée d'Ubuntu? Les popups sont-ils corrects? Ou vous préférez le texte à l'écran comme le montre votre exemple?
Sergiy Kolodyazhnyy
Exécution de 14.04 LTS et aucune mise à niveau n'est prévue pour bientôt. Les fenêtres contextuelles / notifications sont correctes si elles restent pendant quelques secondes (~ 10-15 sec)
ankit7540
J'ai implémenté un script rapide, publié une réponse. Il permet de créer un fichier et ce fichier sera adapté à chaque utilisateur. Faites-moi savoir quelles autres fonctionnalités vous voudriez que j'ajoute là-bas, et au cas où vous auriez besoin d'autres éclaircissements. Le script n'est pas sophistiqué, mais assez stable.
Sergiy Kolodyazhnyy
Salut @ ankit7540 a posté ma réponse, dans la première "édition", a oublié de mentionner de rendre le script exécutable, mais cela pourrait être évident :)
Jacob Vlijm
Merci pour vos efforts @Serg: J'aime l'approche, laissez-moi tester et répondre.
ankit7540

Réponses:

11

Vous pouvez le faire dans la configuration suivante, qui produira une fenêtre semi-transparente, en restant pendant un temps arbitraire:

  1. Créer dans un répertoire (n'importe lequel), dans lequel chacun des utilisateurs au moins a des autorisations de lecture , pour chaque utilisateur un fichier de messages, exactement nommé d'après le nom d'utilisateur de chaque utilisateur (nom de connexion), sans extension, par exemple

    jacob
    

    Ajoutez du texte au fichier comme message. Si vous ajoutez un nouveau message, commencez par ###, le script affichera alors automatiquement le dernier message. Le texte peut contenir tout ce que vous aimez, il ressemblera exactement à ce que vous avez mis dans le fichier.

    • Le dernier message sera copié dans latest_message.txtle répertoire personnel de l'utilisateur pour référence.

    • En l'état, la fenêtre restera pendant 15 secondes, mais vous pouvez la régler sur n'importe quelle valeur, même la faire dépendre automatiquement de la longueur du texte.


    Un exemple de fichier pourrait ressembler à:

    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!
    

    Le message ressemblerait alors à:

    entrez la description de l'image ici

  2. Copiez le script ci-dessous dans un fichier vide, modifiez dans la section head de votre script le chemin d'accès au dossier dans lequel vous stockez les messages des utilisateurs. Enregistrez le script sous show_personalmessage(par exemple) /usr/local/bin(qui devrait être dans $PATH et rendez-le exécutable (!) (Pas d'extension)

    #!/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. Créer un lanceur dans /etc/xdg/autostart

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

    Le sommeil 10 est de s'assurer que le bureau est «prêt» à ouvrir la fenêtre.

Explication

  • Lanceurs dans les /etc/xdg/autostartcommandes d'exécution pour chaque utilisateur connecté.
  • Le lanceur exécute ensuite la fenêtre (appelée par la commande show_personalmessage), qui recherche le message personnalisé dans le répertoire que vous avez défini. Aditionellement. Le message le plus récent est copié dans le répertoire personnel de l'utilisateur.
  • Si nécessaire, le chemin d'accès au message peut être modifié, voire rendu spécifique à l'utilisateur en utilisant le getpass-module, afin que le script (fenêtre) recherche un fichier nommé spécifique à l'utilisateur dans un répertoire. Veuillez indiquer si cela serait nécessaire.

aditionellement

La fenêtre (Gtk)

  • peut être fait pour rester en dessous de tout, comme s'il faisait partie de l'arrière-plan
  • peut être fait rester au top de tout
  • peut être fermé

etc...


ÉDITER

Pour gagner du temps à écrire des messages, comme discuté dans le chat , ci-dessous une version du script dans laquelle vous pouvez inclure quelques sections "permanentes":

  • premsg, qui doit se trouver juste en dessous de "Bienvenue utilisateur x" et du corps de votre message, et
  • postmsg, qui vient en bas de votre message.

Les deux sections peuvent être définies sur aucune, simplement en définissant ""une valeur.

entrez la description de l'image ici

Le scénario

#!/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()

Remarque

Bien sûr, tout comme le corps du message , yoy peut modifier le script pour lire les messages avant et après à partir d'un fichier, ce qui le rend encore plus pratique à maintenir. Est-ce que cela a été le cas, pour des raisons de simplicité dans la réponse.

Jacob Vlijm
la source
A essayé. Cela fonctionne très bien. En regardant le code, je comprends comment changer le temps de ses séjours. Une question: que se passe-t-il si je n'ai pas accès SSH au domicile de l'utilisateur (mais uniquement chez moi)?
ankit7540
Vous (ou moi) pouvez définir n'importe quel chemin, mais nous devons l'utiliser getpassensuite pour que chaque utilisateur demande automatiquement le fichier nommé. Quelle voie auriez-vous en tête? Il doit s'agir d'un chemin d'accès auquel chaque utilisateur a accès en lecture. Attendez, modifiera dans une minute ...
Jacob Vlijm
@ ankit7540 l'a édité dans le script (et dans l'explication).
Jacob Vlijm
@ ankit7540 Ah, je vous vois en première ligne: "Bienvenue utilisateur ..." Est-ce important pour vous? est juste une ligne dans le code s'il l'est.
Jacob Vlijm
A propos de cette ligne "Welcome $ user", vous pouvez juste me le dire ici et je peux l'ajouter dans le script. De plus, pensez à l' utilisateur dispose d' un dossier, /home/message. Il serait bon de copier le texte du message récent (caténate etc.) dans un fichier fixe (pour référence)
ankit7540
6

Le script ci-dessous permet à l'administrateur de stocker des messages personnalisés sous forme username_mm_dd_yyyy.txtdans un répertoire défini par l'administrateur. Les noms d'utilisateur sont déterminés automatiquement et mis en correspondance avec le nom de fichier et la date du fichier à afficher.

Le script peut également avoir une .desktopentrée qui doit être placée dans le /etc/xdg/autostartrépertoire. Cela fera que le script sera affiché pour chaque utilisateur. Vous pouvez également placer le .desktopfichier dans le répertoire de chaque utilisateur individuel ~/.config/autostart.

#!/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

Ci-dessous, vous pouvez voir une petite démo du script en action. J'ai créé le fichier au format spécifié dans mon /tmpdossier

entrez la description de l'image ici

Sergiy Kolodyazhnyy
la source
Pardon de te faire attendre. Cela fonctionne super bien. J'aime les boutons «Annuler» et «OK». Je l'ai utilisé avec l'entrée .desktop et cela fonctionne parfaitement!
ankit7540
@ ankit7540 Content que vous l'aimiez. Des fonctionnalités supplémentaires que vous souhaiteriez que j'ajoute?
Sergiy Kolodyazhnyy
Tenez compte utilisateur dispose d' un dossier, /home/message. Il serait bon de copier le fichier de message récent et de le conserver pour référence.
ankit7540
@ ankit7540 peut être fait. Il s'agit simplement d'ajouter une ligne avec la cpcommande, le premier argument est la copie de l'administrateur et le deuxième argument que /home/$( _get_username )/messages/$FILE.txtj'ai besoin de dormir, mais je peux ajouter cela le matin. C'est juste une ligne.
Sergiy Kolodyazhnyy
Et si vous voulez caténer le fichier c'est justecat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Sergiy Kolodyazhnyy