Created
July 16, 2012 05:19
-
-
Save nealmcb/3120773 to your computer and use it in GitHub Desktop.
Track and print out the apps and clients that are inhibiting Gnome session actions like log out, user switching, suspending or idle/dpms/screensaver, under Linux.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
""" | |
Print out the apps and clients that are inhibiting session actions like log out, user switching, suspending or idle. | |
%InsertOptionParserUsage% | |
Example: | |
track_session_inhibitors & | |
Todo: | |
Remember info about inhibitors and clients, for display when the are removed | |
describe flags with mnemonics. Consider using bitstring package: | |
http://packages.python.org/bitstring/walkthrough.html | |
Flags: | |
1: Inhibit logging out | |
2: Inhibit user switching | |
4: Inhibit suspending the session or computer | |
8: Inhibit the session being marked as idle | |
References: | |
http://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Inhibitor | |
http://www.devtech.com/inhibitapplet | |
""" | |
import sys | |
import traceback | |
from gi.repository import GObject | |
import dbus | |
import dbus.mainloop.glib | |
import pynotify | |
import logging | |
__author__ = "Neal McBurnett <http://neal.mcburnett.org/>" | |
__version__ = "0.1.0" | |
__date__ = "2012-07-12" | |
__copyright__ = "Copyright (c) 2012 Neal McBurnett" | |
__license__ = "GPL v3" | |
def inhibitor_dump(inhibitor_id): | |
status = "%s " % inhibitor_id | |
inhibitor = bus.get_object('org.gnome.SessionManager', inhibitor_id) | |
interface = inhibitor.Introspect() | |
# import pdb; pdb.set_trace() # to figure out if there is anything to show for InhibitorRemoved | |
if interface.count("org.gnome.SessionManager.Inhibitor") > 0: | |
try: | |
clientId = inhibitor.GetClientId() | |
except dbus.exceptions.DBusException, e: | |
clientId = "(null)" | |
status += "flags=%x, x11id=%d: %s \"%s\" %s" % (inhibitor.GetFlags(), inhibitor.GetToplevelXid(), inhibitor.GetAppId(), inhibitor.GetReason(), clientId) | |
else: | |
status += "(null)" | |
if len(sys.argv) <= 1: | |
n = pynotify.Notification ("SessionManager Inhibitor Watch", status) | |
n.show () | |
return status | |
def client_dump(client_id): | |
status = "%s " % client_id | |
client = bus.get_object('org.gnome.SessionManager', client_id) | |
interface = client.Introspect() | |
# import pdb; pdb.set_trace() # to debug | |
if interface.count("org.gnome.SessionManager.Client") > 0: | |
# print client.GetAll('org.gnome.SessionManager') # why does this always fail with UnknownMethod: Method "GetAll" with signature "s" on interface "(null)"? | |
try: | |
# Why does this always fail? | |
clientId = client.GetClientId() | |
except dbus.exceptions.DBusException, e: | |
clientId = "(null)" | |
#logging.exception("Exception with GetClientId") | |
status += "process=%d: %s \"%s\" %s" % (client.GetUnixProcessId(), client.GetAppId(), client.GetStatus(), clientId) | |
else: | |
status += "(null)" | |
if len(sys.argv) <= 1: | |
n = pynotify.Notification ("SessionManager Client Watch", status) | |
n.show () | |
return status | |
def session_inhibitor_signal_handler(id): | |
logging.info(inhibitor_dump(id)) | |
def session_client_signal_handler(id): | |
logging.info(client_dump(id)) | |
if __name__ == '__main__': | |
if len(sys.argv) >1: | |
# for now treat any argument as a request to just print current inhibitors and clients to stdout, and then exit | |
logfile = None | |
else: | |
logfile = "/var/log/session_inhibitors" | |
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s\t%(message)s', filename = logfile, filemode='a' ) | |
logging.info("Start find_session_inhibitors") | |
if not pynotify.init ("summary-body"): | |
logging.error("pynotify.init failed") | |
sys.exit (1) | |
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) | |
bus = dbus.SessionBus() | |
proxy = bus.get_object('org.gnome.SessionManager','/org/gnome/SessionManager') | |
blockers = proxy.GetInhibitors() | |
for objectpath in blockers: | |
logging.info(inhibitor_dump(objectpath)) | |
clients = proxy.GetClients() | |
for objectpath in clients: | |
logging.info(client_dump(objectpath)) | |
if len(sys.argv) >1: | |
sys.exit(0) | |
bus.add_signal_receiver(session_inhibitor_signal_handler, "InhibitorAdded", "org.gnome.SessionManager") | |
bus.add_signal_receiver(session_inhibitor_signal_handler, "InhibitorRemoved", "org.gnome.SessionManager") | |
bus.add_signal_receiver(session_client_signal_handler, "ClientAdded", "org.gnome.SessionManager") | |
bus.add_signal_receiver(session_client_signal_handler, "ClientRemoved", "org.gnome.SessionManager") | |
logging.info("Start listening for signals") | |
mainloop = GObject.MainLoop() | |
mainloop.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment