170 lines
4.7 KiB
Python
Executable File
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
|