Mensagem personalizada (editável) para cada usuário após o login


11

O computador está sendo usado por três usuários (+1 administrador) e eles usam o logon de unidade. Os três usuários vêm, usam o computador e fazem logout. Eu tenho que dar algumas instruções, notícias e detalhes sempre que eles entrarem.

Quero ter um utilitário / ferramenta onde possa digitar uma mensagem personalizada para cada usuário. A mensagem mais recente será exibida na área de trabalho (para cada usuário) (com data da minha última edição) por 10 a 15 segundos. Uma cópia do texto também estará disponível (para o usuário) em algum lugar com todas as mensagens e datas como um log.

insira a descrição da imagem aqui

* Admin tem acesso SSH ao sistema.

Não tenho certeza se isso é possível (e talvez eu esteja procurando demais!).


Pode ser feito. Qual é a sua versão direcionada do Ubuntu? Os pop-ups estão ok? Ou você prefere o texto na tela como mostra o seu exemplo?
Sergiy Kolodyazhnyy 14/05

Executando o 14.04 LTS e não há planos para atualizar tão cedo. Popups / notificação são muito bem se ficar por alguns segundos (~ 10-15 seg)
ankit7540

Eu implementei um script rápido, postei uma resposta. Permite criar um arquivo e esse arquivo será correspondido a cada usuário. Deixe-me saber que outra funcionalidade você gostaria que eu adicionasse lá e, caso precise de outros esclarecimentos. O script não é chique, mas bastante estável.
Sergiy Kolodyazhnyy

Oi @ ankit7540 postou a minha resposta, na primeira "edição", esqueci de mencionar para fazer o script executável, mas que pode ser :) óbvio
Jacob Vlijm

Obrigado por seus esforços @Serg: Eu gosto da abordagem, deixe-me testar e responder.
Ankit7540 14/05

Respostas:


11

Você pode fazer isso na configuração a seguir, que produzirá uma janela semitransparente, permanecendo por um tempo arbitrário:

  1. Criar em um (qualquer) anuário, em que cada um dos usuários , pelo menos, tem ler permissões, para cada usuário um arquivo de mensagem, exatamente com o nome de usuário de cada usuário (log no nome), sem extensão, por exemplo,

    jacob
    

    Adicione texto ao arquivo como sua mensagem. Se você adicionar uma nova mensagem, comece com ###, o script exibirá automaticamente a última mensagem. O texto pode conter qualquer coisa que você quiser, será exatamente como você o colocou no arquivo.

    • A mensagem mais recente será copiada latest_message.txtpara o diretório inicial do usuário para referência.

    • Como é, a janela permanecerá por 15 segundos, mas você pode defini-la com qualquer valor, e até depender automaticamente do tamanho do texto.


    Um arquivo de exemplo pode se parecer com:

    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!
    

    A mensagem seria assim:

    insira a descrição da imagem aqui

  2. Copie o script abaixo em um arquivo vazio, edite na seção principal do script o caminho para a pasta na qual você armazena as mensagens dos usuários. Salve o script como show_personalmessageem (por exemplo) /usr/local/bin(que deve estar dentro $PATH e o torne executável (!) (Sem extensão)

    #!/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. Crie um iniciador no /etc/xdg/autostart

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

    O sono 10 é para garantir que a área de trabalho esteja "pronta" para abrir a janela.

Explicação

  • Iniciadores em /etc/xdg/autostartcomandos de execução para cada usuário no logon.
  • O iniciador, em seguida, executa a janela (chamada pelo comando show_personalmessage), que procura a mensagem personalizada no diretório que você definiu. Além disso. A mensagem mais recente é copiada para o diretório inicial do usuário.
  • Se necessário, o caminho para a mensagem pode ser alterado e até ser tornado específico ao usuário, usando o getpass-module, para que o script (janela) procure um arquivo nomeado específico do usuário em um diretório. Mencione se isso seria necessário.

Além disso

A janela (Gtk)

  • pode ficar abaixo de tudo, como se fosse parte do plano de fundo
  • pode ser feito ficar por dentro de tudo
  • pode ser fechado

etc etc...


EDITAR

Para economizar tempo escrevendo mensagens, conforme discutido no bate-papo , abaixo de uma versão do script na qual você pode incluir algumas seções "permanentes":

  • premsg, que deve estar logo abaixo de "Bem-vindo usuário x", e o corpo da sua mensagem, e
  • postmsg, que é a parte inferior da sua mensagem.

Ambas as seções podem ser definidas como nenhuma, apenas configurando ""como um valor.

insira a descrição da imagem aqui

O script

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

Obviamente, assim como o corpo da mensagem , você pode alterar o script para ler as mensagens anteriores e posteriores de um arquivo, o que torna ainda mais conveniente a manutenção. Fez assim, por razões de simplicidade na resposta.


Tentou. Funciona muito bem. Olhando para o código, eu entendo como alterar o tempo de permanência. Uma pergunta: e se eu não tiver acesso SSH à casa do usuário (mas apenas à minha casa)?
Ankit7540 14/05

Você (ou eu) pode definir qualquer caminho, mas precisamos usá-lo getpasspara fazer com que cada usuário solicite automaticamente o arquivo nomeado. Que caminho você teria em mente? Deve ser um caminho ao qual cada usuário tenha acesso de leitura. Espere, editar vontade em um minuto ...
Jacob Vlijm

@ ankit7540 editou-o no script (e na explicação).
Jacob Vlijm

@ ankit7540 Ah, vejo sua primeira linha: "Bem-vindo, usuário ..." Isso é importante para você? é apenas uma linha no código, se for.
Jacob Vlijm

Sobre essa linha "Welcome $ user", você pode me dizer aqui e eu posso adicioná-lo no script. Além disso, considere que o usuário tem uma pasta /home/message,. Seria bom para copiar o texto da mensagem recente (concatenar etc ..) em um arquivo fixo (para referência)
ankit7540

6

O script abaixo permite que o administrador armazene mensagens personalizadas no formulário username_mm_dd_yyyy.txtno diretório definido pelo administrador. Os nomes de usuários são determinados automaticamente e comparados com o nome do arquivo e a data do arquivo a ser exibido.

O script também pode ter uma .desktopentrada que deve ser colocada no /etc/xdg/autostartdiretório Isso fará com que o script seja exibido para cada usuário. Como alternativa, você pode colocar o .desktoparquivo no diretório de cada usuário ~/.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

Abaixo, você pode ver uma pequena demonstração do script em ação. Eu criei o arquivo no formato especificado na minha /tmppasta

insira a descrição da imagem aqui


Desculpe por esperar. Funciona super bem. Gosto dos botões 'Cancelar' e 'OK'. Usei-o com a entrada .desktop e funciona perfeitamente!
Ankit7540

@ ankit7540 Que bom que você gostou. Algum recurso adicional que você gostaria que eu adicionasse?
Sergiy Kolodyazhnyy

Considere que o usuário tem uma pasta /home/message. Seria bom copiar o arquivo de mensagens recentes e mantê-lo como referência.
Ankit7540 14/05

@ ankit7540 pode ser feito. É apenas uma questão de adicionar uma linha com o cpcomando, o primeiro argumento é a cópia do administrador e o segundo argumento, /home/$( _get_username )/messages/$FILE.txteu preciso dormir, mas posso adicioná-lo pela manhã. É apenas uma linha.
Sergiy Kolodyazhnyy

E se você quiser concatenar o arquivo que apenascat $FILE >> /home/$( _get_username )/messages/Log_of_all_messages. txt
Sergiy Kolodyazhnyy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.