99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
#!/usr/bin/env python
 | 
						|
 | 
						|
# Get needed modules
 | 
						|
import yaml
 | 
						|
import webbrowser
 | 
						|
import subprocess
 | 
						|
from os import path
 | 
						|
from time import sleep
 | 
						|
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 icon / timer duration
 | 
						|
with open(path.expanduser("~/.config/systrayupdater/systrayupdater.yml")) as f:
 | 
						|
    conf = yaml.load(f, yaml.FullLoader)
 | 
						|
    term = str(conf['terminal'])
 | 
						|
    opt = str(conf['option'])
 | 
						|
    wait = int(conf['timer']) * 60000
 | 
						|
    icn = path.join(path.expanduser("~/.config/systrayupdater/"), str(conf['icon']))
 | 
						|
    f.close()
 | 
						|
 | 
						|
# Run checkupdates command
 | 
						|
# Populates the available updates and count
 | 
						|
# Sets the 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:
 | 
						|
        tray.setVisible(True)
 | 
						|
        menu.clear()
 | 
						|
        menu.addAction(runUpdate)
 | 
						|
        menu.addAction(readNews)
 | 
						|
        menu.addAction(quit)
 | 
						|
        for i in outputList.splitlines():
 | 
						|
            menu.addAction(i, partial(infos, i))
 | 
						|
        global avail
 | 
						|
        avail = str(outputCount)+" Updates"
 | 
						|
        tray.setToolTip(avail)
 | 
						|
 | 
						|
# Read the News
 | 
						|
# Get pkg info
 | 
						|
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 updatehttps://archlinux.org/packages/?q='+ pkg[0]
 | 
						|
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)
 | 
						|
 | 
						|
# Adding items to the tray
 | 
						|
tray = QSystemTrayIcon()
 | 
						|
icon = QIcon(icn)
 | 
						|
tray.setIcon(icon)
 | 
						|
tray.setToolTip(avail)
 | 
						|
tray.setVisible(True)
 | 
						|
 | 
						|
# 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)
 | 
						|
 | 
						|
# Place the menu in the System Tray
 | 
						|
tray.setContextMenu(menu)
 | 
						|
 | 
						|
app.exec_()
 |