Dec 07

enable/disable hibernate/suspend pygtk status icon

Tag: pygtkerm @ 12:33 am

Every once in a while my machine runs stuff in the background, like backups, db dumps and whatnot. This obviously causes performance issues at times, but among other things I don’t want to shutdown during these processes.

So I created a simple status icon to warn me if one of those processes were executing so I wouldn’t shutdown the machine, and it also will disable hibernate/suspend.

I figure I’d share it with the world.

#!/usr/bin/env python
import gobject
import gtk
import subprocess
import os
import re
gobject.threads_init()

class DontShutdown:
    def __init__(self, conditions):
        self.suspend_enabled = False
        self.conditions = conditions
        self.icon = gtk.StatusIcon()
        self.icon.set_has_tooltip(True)
        self.icon.set_from_stock(gtk.STOCK_OK)
        self.icon.set_tooltip_text("This is a test")
        
        self.is_xdg = os.environ.has_key('XDG_CURRENT_DESKTOP')
        self.XDG_CURRENT_DESKTOP = ""
        self.INACTIVITY_ON_AC = -1
        self.ps_command = ["/bin/ps","-A","-o","cmd"]

        if self.is_xdg:
            self.XDG_CURRENT_DESKTOP = os.environ['XDG_CURRENT_DESKTOP'].lower()
        self.get_inactive()

        self.check_ps()


    def enable_suspend(self):
        if self.suspend_enabled or not self.is_xdg:
            return

        if self.XDG_CURRENT_DESKTOP == 'unity':
            subprocess.call_checkoutput([
                "dconf", "write",
                "org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-timeout", 
                self.INACTIVITY_ON_AC])
        elif self.XDG_CURRENT_DESKTOP == 'xfce':
            subprocess.call_checkoutput([
                "xfconf-query", "-c", "xfce4-power-manager", "-n", "-p", 
                "/xfce4-power-manager/inactivity-on-ac", "-t", "uint", "-s", 
                self.INACTIVITY_ON_AC])

        self.suspend_enabled = True

    def disable_suspend(self):
        if not self.suspend_enabled or not self.is_xdg:
            return

        if self.XDG_CURRENT_DESKTOP == 'unity':
            subprocess.call_checkoutput([
                "dconf", "write",
                "org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-timeout", 
                "0"])
        elif self.XDG_CURRENT_DESKTOP == 'xfce':
            subprocess.call_checkoutput([
                "xfconf-query", "-c", "xfce4-power-manager", "-n", "-p", 
                "/xfce4-power-manager/inactivity-on-ac", "-t", "uint", "-s", 
                "14"]) # with xfce any number under 15 is considered disabled

        self.suspend_enabled = False

    def get_inactive(self):
        if not self.is_xdg:
            return

        if self.XDG_CURRENT_DESKTOP == 'unity':
            self.INACTIVITY_ON_AC = subprocess.check_output([
                "dconf", "read",
                "/org/gnome/settings-daemon/plugins/power/sleep-inactive-ac-timeout"
                ]).strip()
            if int(self.INACTIVITY_ON_AC) < = 0:
                self.suspend_enabled = False
            else:
                self.suspend_enabled = True

        elif self.XDG_CURRENT_DESKTOP == 'xfce':
            self.INACTIVITY_ON_AC = subprocess.check_output([
                "xfconf-query", "-c", "xfce4-power-manager", "-p",
                "/xfce4-power-manager/inactivity-on-ac"]).strip()
            if int(self.INACTIVITY_ON_AC) <= 14:
                self.suspend_enabled = False
            else:
                self.suspend_enabled = True

    def check_ps(self):
        ps_output = subprocess.check_output(self.ps_command)
        # print ps_output
        msgs = []
        for c in self.conditions:
            if c.has_key("exists"):
                if os.path.exists(c["exists"]):
                    msgs.append(c["msg"])

            if c.has_key("is_running"):
                if not c.has_key("re"):
                    c["re"] = re.compile("("+re.escape(c["is_running"])+")")
                res = c["re"].search(ps_output)
                if res:
                    print "res:",res
                    print "res.groups():",res.groups()
                    msgs.append(c["msg"])

        if not msgs:
            self.icon.set_from_stock(gtk.STOCK_YES)
            msgs.append("Nothing is happening")
        else:
            self.icon.set_from_stock(gtk.STOCK_NO)

        self.icon.set_tooltip_text("\n".join(msgs))
        return True


if __name__ == "__main__":
    conditions = [
        {
            "exists":"/home/erm/.backing_up",
            "msg":"Backup is running."
        },
        {
            "is_running":"/usr/lib/openssh/sftp-server",
            "msg":"SFTP is being used."
        },
        {
            "is_running":"gst-launch-0.10 pulsesrc device=",
            "msg":"Gstreamer is running."
        },
        {
            "is_running":"backup-all-databases.sh",
            "msg":"Backing up databases."
        },
    ]
    dont_shutdown = DontShutdown(conditions)
    gobject.timeout_add(5000, dont_shutdown.check_ps)
    try:
        gtk.main()
    except KeyboardInterrupt:
        pass

Leave a Reply

You must be logged in to post a comment.