#!/usr/bin/env python # Get needed modules import sys import yaml import webbrowser import subprocess from os import path from functools import partial from PyQt5.QtCore import QTimer from PyQt5.QtGui import * from PyQt5.QtWidgets import * # Available Updates holders avail = "" outputList = "" # Use config.yml file to allow for compatibility with # most terminal emulators possible, custom timer duration and icons if path.exists(path.expanduser("~/.config/systrayupdater/config.yml")): config = path.expanduser("~/.config/systrayupdater/config.yml") else: config = '/etc/systrayupdater/config.yml' try: f = open(config) except FileNotFoundError: print("No config file found\n") sys.exit(1) conf = yaml.load(f,yaml.FullLoader) term = str(conf['terminal']) opt = str(conf['option']) wait = int(conf['timer']) * 60000 icn = str(conf['icon']) f.close() iconDir = '/usr/share/icons/systrayupdater/' match icn: case "white": icon = QIcon(path.join(iconDir,'arch-white-symbolic-24.svg')) case "blue": icon = QIcon(path.join(iconDir,'arch-blue-symbolic-24.svg')) case "red": icon = QIcon(path.join(iconDir,'arch-red-symbolic-24.svg')) case "green": icon = QIcon(path.join(iconDir,'arch-green-symbolic-24.svg')) case "purple": icon = QIcon(path.join(iconDir,'arch-purple-symbolic-24.svg')) case "yellow": icon = QIcon(path.join(iconDir,'arch-yellow-symbolic-24.svg')) case "black": icon = QIcon(path.join(iconDir,'arch-black-symbolic-24.svg')) case "gray": icon = QIcon(path.join(iconDir,'arch-gray-symbolic-24.svg')) case _: icon = QIcon(path.join(path.expanduser("~/.config/systrayupdater/"),icn)) # Run checkupdates command # Populates the available updates and count # Sets the menu options, list and count in proper spots def count(): cmd = ['checkupdates'] p1 = subprocess.Popen(cmd,stdout=subprocess.PIPE) global outputList outputList = ((p1.communicate()[0]).decode()).rstrip('\n') outputCount = len(outputList.splitlines()) if outputCount == 0: tray.setVisible(False) else: menu.clear() menu.addAction(readNews) menu.addAction(runUpdate) menu.addAction(quit) for i in outputList.splitlines(): menu.addAction(i, partial(infos, i)) global avail avail = str(outputCount)+" Updates" tray.setToolTip(avail) tray.setVisible(True) # Read the News def news(): url = 'https://archlinux.org/news/' webbrowser.open_new_tab(url) # Get pkg info def infos(pkgString): pkg = pkgString.split(' ') url = 'https://archlinux.org/packages/?q='+ pkg[0] webbrowser.open_new_tab(url) # Run system update def update(): cmd = [ term, opt, 'sudo', 'pacman', '-Syu' ] subprocess.Popen(cmd) count() # Create an app surface app = QApplication([]) app.setQuitOnLastWindowClosed(False) # Set up timer updateTimer = QTimer() updateTimer.timeout.connect(count) updateTimer.singleShot(1,count) # Initially populate available updates updateTimer.start(wait) # Creating the menu/options menu = QMenu() runUpdate = QAction("Run Update") readNews = QAction("Read the News") quit = QAction("Quit") runUpdate.triggered.connect(update) readNews.triggered.connect(news) quit.triggered.connect(app.quit) # Create applet and place menu in it tray = QSystemTrayIcon() tray.setIcon(icon) tray.setVisible(True) tray.setContextMenu(menu) app.exec_()