Conteúdo:
- Ideias gerais
- Fonte de script
- Sugestões adicionais
1. Ideias gerais:
É possível inibir o logout da sessão do Unity ou Gnome via dbus
- um barramento de comunicação entre processos que permite a execução de determinadas ações como root em nome do usuário comum. Nos meus testes, parece que o logout é strong em Unity; Isso significa que a inibição durará apenas alguns segundos, mas é o suficiente para executarmos um comando de desligamento. O bloqueio de inibição também é interrompido quando o usuário clica na opção "Logout" na caixa de diálogo de logout
Oscriptabaixofazexatamenteisso.Eleexecutaduasfunçõessimultaneamente.UmafunçãoaguardaaexibiçãodoChromee,emseguida,odesaparecimentoeoencerramentodosprocessosdoChrome.Aoutrafunçãoinibe ologoutatéqueobloqueiosejaquebrado,eumavezqueobloqueioéquebrado,elechamaafunçãoshutdown.
Estescriptdeveseradicionadocomoaplicativodeinicialização.Comovocêdeveusá-loparacadausuáriodasuaempresa,sugirocolocaroarquivo.desktop
dessecódigonapasta/etc/xdg/autostart
.Dessaforma,eleseráexecutadoparatodososusuáriosautomaticamente
2.Fontedescript
Eletambémestádisponívelem
/usr/bin/inhibit_logout.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Author: Serg Kolo,<[email protected]>
# Date: September 28, 2016
# Purpose: Monitoring script that shutsdown
# system if logout occurs or chrome exits
# Written for: http://askubuntu.com/q/828524/295286
from gi.repository import Gdk
import dbus
import os
import threading
import subprocess
def get_dbus(bus_type,obj,path,interface,method,*argv):
if bus_type == "session":
bus = dbus.SessionBus()
if bus_type == "system":
bus = dbus.SystemBus()
proxy = bus.get_object(obj,path)
method = proxy.get_dbus_method(method,interface)
if argv:
return method(*argv)
else:
return method()
def shutdown():
''' Wrapper for dbus Shutdown method '''
get_dbus('session',
'com.canonical.Unity',
'/com/canonical/Unity/Session',
'com.canonical.Unity.Session',
'Shutdown',None)
def is_inhibited():
''' wrapper for IsInhibited dbus method'''
return get_dbus('session',
'org.gnome.SessionManager',
'/org/gnome/SessionManager',
'org.gnome.SessionManager',
'IsInhibited',
1)
def is_chrome_running():
'''checks output of pgrep for
any chrome processes'''
try:
null=open(os.devnull,'w')
subprocess.check_call(['pgrep','-f','chrome'],stdout=null,stderr=null)
except subprocess.CalledProcessError:
return False
else:
return True
def inhibit_logout():
''' Inhibits log out temporarily so that we have
enough time to shutdown '''
# pretend we are root window
# and inhibit logout on our behalf
root_window_xid = int(Gdk.Screen.get_default().get_root_window().get_xid())
get_dbus('session',
'org.gnome.SessionManager',
'/org/gnome/SessionManager',
'org.gnome.SessionManager',
'Inhibit',
'root_window',
root_window_xid,
'TEST REASON',
1)
# once the inhibitor is removed, shutdown
while is_inhibited():
pass
shutdown()
def capture_chrome():
# wait for chrome to start
while not is_chrome_running():
pass
# start waiting till it exits
while is_chrome_running():
pass
# once chrome exits, shutdown
shutdown()
def main():
''' program entry point'''
threading.Thread(target=inhibit_logout).start()
threading.Thread(target=capture_chrome).start()
if __name__ == '__main__':
main()
/etc/xdg/autostart/inhibit_logout.desktop
[Desktop Entry]
Type=Application
Name=Logout Inhibitor
Exec=/usr/bin/inhibit_logout.py
OnlyShowIn=GNOME;Unity;
Terminal=false
3. Sugestão adicional:
Para impedir que o usuário efetue logout e interrompa explicitamente o bloqueio do inibidor, use
gsettings set com.canonical.indicator.session suppress-logout-menuitem true
Isso removerá a opção de logout, mas não removerá o atalho Ctrl + Alt + Del para o logout. Considere removê-lo também