1
0
.dotfiles/home/bin/pyupdatesd

170 lines
4.7 KiB
Python
Executable File

#!/usr/bin/env python2
"""
pyupdatesd: A simple yum update checker.
This script will watch for available yum updates and show a Gtk2 tray icon and
notification pop-up when updates become available.
This is intended for desktop environments like XFCE that don't have a native
PackageKit update watcher.
Set this script to run on session startup, and it will check for updates every
15 minutes (by default; this is configurable in the source code).
This software is open domain and may be freely modified and distributed.
Requires: pygtk2
Usage: pyupdatesd [--display :0.0 --help --debug --testing]
--Kirsle
http://sh.kirsle.net
"""
################################################################################
# Configuration Section Begins Here #
################################################################################
c = dict(
# The title to be shown on the pop-up and the icon tooltip.
title = "Updates Available",
# The message to be shown in the pop-up.
message = "There are updates available to install.",
# Icon to use in the system tray and pop-up.
icon = "/usr/share/icons/gnome/32x32/status/software-update-available.png",
# Frequency to check for available updates.
interval = 900, # 15 minutes
# Command to run to check for available updates, and the expected status
# code that indicates updates are available.
yumcheck = "/usr/bin/dnf check-update",
# Path to notify-send (set to None if you don't want notifications)
notify = "/usr/bin/notify-send",
# Command to run for your graphical updater (i.e. yumex, gpk-update-viewer)
yumgui = "/usr/bin/yumex --update-only",
)
################################################################################
# Configuration Section Ends Here #
################################################################################
import gtk
import gobject
import getopt
import sys
import os
import commands
import subprocess
from time import time
# Command-line options.
try:
options, remainder = getopt.getopt(sys.argv[1:], 'hdt', [
'debug',
'help',
'testing',
'display='
])
except:
print("Unrecognized options given, try " + sys.argv[0] + " --help")
exit(1)
debug = False
testing = False
def say(*message):
if debug:
print(' '.join(map(lambda x: str(x), message)))
def usage():
print("Usage: " + sys.argv[0] + " [--display :0.0 --help --debug --testing]")
print("Use --testing to force the script to show the notification icon.")
exit(1)
# Parse the options
for opt in options:
if opt[0] == '--debug':
debug = True
say("Debug mode activated")
elif opt[0] == '--display' or opt[0] == '-d':
os.environ["DISPLAY"] = opt[1]
say("Set environment $DISPLAY to", opt[1])
elif opt[0] == '--testing' or opt[0] == '-t':
testing = True
debug = True
say("Testing the notification applet")
elif opt[0] == '--help' or opt[0] == '-h':
usage()
def do_updates():
"""Show your graphical update manager."""
subprocess.call(c['yumgui'], shell=True)
def onClick(widget):
"""Event handler for the tray icon being clicked."""
widget.set_visible(False)
gobject.timeout_add(1, do_updates)
def show_notify():
subprocess.call([c['notify'],
'-a', __name__,
'-i', c['icon'],
c['message'],
])
tray = gtk.StatusIcon()
tray.set_from_file(c['icon'])
tray.set_title(c['title'])
tray.set_tooltip(c['title'])
tray.set_visible(False)
tray.connect('activate', onClick)
next_check = int(time()) # First check is immediately on startup
say("First check:", next_check)
def main_loop():
# Time to check?
global next_check
if int(time()) >= next_check:
status, output = commands.getstatusoutput(c['yumcheck'])
status = status >> 8
say("Executed command:", c['yumcheck'])
say("Result status:", status)
say("Command output:")
say(output)
if testing:
say("Test mode: force the result to show available updates")
status = 100
# Updates?
if status == 100:
say("Result status indicates updates are available!")
if tray.get_visible() == False:
say("Show the notification pop-up")
# Only show notification the first time.
show_notify()
tray.set_visible(True)
elif tray.get_visible() == True and status == 0:
# Updates have disappeared behind our back!
tray.set_visible(False)
next_check = int(time()) + c['interval']
gobject.timeout_add(1000, main_loop)
gobject.timeout_add(1000, main_loop)
gtk.main()
# vim:expandtab