Antes de fazer o login, você deve me responder estas perguntas 3?

22

Eu tenho dois filhos que amam tanto o Ubuntu, que não estão fazendo o dever de matemática. Então, no espírito do Monty Python, eu gostaria de apresentá-los com algo como:

"Pare. Quem cruzar a ponte da morte deve responder-me estas perguntas três, antes do outro lado ele vê."

no login.

Eles precisariam resolver alguns problemas de matemática antes de poderem fazer o login.

Minha pergunta é: esse tipo de coisa pode ser feito?

    
por user187493 26.08.2013 / 19:15

2 respostas

30

O seguinte é testado com o Ubuntu 13.04 e o sistema Python, usando ligações Gtk (PyGobject).

Aqui está um caminho um pouco sujo e precisa de mais investigação:

Resumo

  • Adicione um arquivo .desktop em /usr/share/xsessions , nomearemos custom

  • Adicione um arquivo .xsession ao usuário em questão (seus filhos) e nomearemos o usuário como kid

  • Crie o aplicativo GUI do Python para o enigma matemático e execute-o em .xsession , nomearemos como puzzle.py

Detalhes

  • sudo vi /usr/share/xsessions/custom.desktop

Adicione o seguinte no arquivo:

[Desktop Entry]
Name=Custom
Comment=This session logs you into your managed desktop environment
Exec=/etc/X11/Xsession
X-Ubuntu-Gettext-Domain=gnome-session-3.0
  • vi /home/kid/.xsession

Adicione o seguinte no arquivo:

#!/bin/bash
lightdm &
exec /home/kid/puzzle.py
  • vi /home/kid/puzzle.py

Adicione o seguinte no arquivo:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import subprocess
import random
from gi.repository import Gtk


#----------------------------------------------------------------------
class PuzzleWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Math Puzzle", resizable=False)

        super(PuzzleWindow, self).set_position(Gtk.WindowPosition.CENTER)
        super(PuzzleWindow, self).maximize()

        self.a_number = random.randint(1, 5)
        self.b_number = random.randint(1, 5)
        self.result = self.a_number + self.b_number

        self.vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=5)

        self.label = Gtk.Label("What is the sum of the numbers bellow?")
        self.number_label = Gtk.Label("{num_a} + {num_b}".format(
            num_a=self.a_number, num_b=self.b_number))

        self.entry = Gtk.Entry()
        self.button = Gtk.Button(label="Check answer!")
        self.button.connect("clicked", self.on_button_clicked)

        self.vbox.pack_start(self.label, True, True, 0)
        self.vbox.pack_start(self.number_label, True, True, 0)
        self.vbox.pack_start(self.entry, True, True, 0)
        self.vbox.pack_start(self.button, True, True, 0)
        self.add(self.vbox)

    def on_button_clicked(self, widget):

        if int(self.entry.get_text()) == self.result:
            subprocess.call("unity &", shell=True)
        else:
            self.label.set_text("Wrong answer, try again.")
#----------------------------------------------------------------------
def main():
    """Application's entry point"""
    win = PuzzleWindow()
    win.connect("delete-event", Gtk.main_quit)
    win.show_all()
    Gtk.main()

if __name__ == "__main__":
    main()

Resultados:

  • Se você sair, na tela de login, você verá uma nova sessão chamada Personalizada.
  • Ao escolher a sessão personalizada e após o login bem-sucedido, você será apresentado por uma pequena janela PyGtk (usando o pygobject) solicitando um quebra-cabeça de matemática. Não haverá barra superior, ativador e o restante dos widgets de área de trabalho padrão:

  • Se você responder corretamente, o Unity carregará ...

Ele precisa de mais pesquisas, mas espero que ajude como ponto de partida.

    
por Stef K 27.08.2013 / 01:01
3

Isso pode ser feito, mas exigiria muito conhecimento técnico. A maneira mais simples de fazer isso, escrevendo um script que é executado como root que:

  • muda a (s) senha (s) automaticamente para a resposta de uma determinada pergunta,
  • muda o papel de parede da área de trabalho para mostrar a pergunta que está tentando responder

Você provavelmente precisará manter a lista de problemas matemáticos em um arquivo de texto (ou banco de dados) e usar as ferramentas de linha de comando imagemagick para adicionar o texto do problema ao papel de parede da área de trabalho. Use cron para agendar esse script para ser executado de vez em quando (diariamente?).

Obter a tela de login para solicitar 3 perguntas diferentes exigiria um lote de hacking personalizado e provavelmente envolveria a substituição de grandes partes do sistema, por isso não é recomendável. Até mesmo o script "simples" acima requer muita habilidade e conhecimento e pode potencialmente quebrar seu sistema se for feito errado.

    
por ImaginaryRobots 26.08.2013 / 19:50