74 lines
2.0 KiB
Python
Executable File
74 lines
2.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# MIT licensed
|
|
# Copyright (c) 2020,2022 lilydjwg <lilydjwg@gmail.com>, et al.
|
|
|
|
'''
|
|
A simple wrapper to show desktop notifications while running nvchecker.
|
|
'''
|
|
|
|
import os
|
|
import subprocess
|
|
import json
|
|
|
|
import gi
|
|
try:
|
|
gi.require_version('Notify', '0.8')
|
|
except ValueError:
|
|
gi.require_version('Notify', '0.7')
|
|
from gi.repository import Notify
|
|
|
|
def get_args():
|
|
import argparse
|
|
parser = argparse.ArgumentParser(description='show desktop notifications while running nvchecker')
|
|
parser.add_argument('-c', '--file',
|
|
metavar='FILE', type=str,
|
|
help='software version configuration file if not default')
|
|
parser.add_argument('-k', '--keyfile',
|
|
metavar='FILE', type=str,
|
|
help='use specified keyfile (override the one in configuration file)')
|
|
parser.add_argument('-t', '--tries', default=1, type=int, metavar='N',
|
|
help='try N times when network errors occur')
|
|
parser.add_argument('--failures', action='store_true',
|
|
help='exit with code 3 if failures / errors happen during checking')
|
|
|
|
return parser.parse_args()
|
|
|
|
def main():
|
|
args = get_args()
|
|
|
|
Notify.init('nvchecker')
|
|
notif = Notify.Notification()
|
|
updates = []
|
|
|
|
rfd, wfd = os.pipe()
|
|
cmd = [
|
|
'nvchecker', '--logger', 'both', '--json-log-fd', str(wfd),
|
|
]
|
|
if args.file:
|
|
cmd.extend(['-c', args.file])
|
|
if args.keyfile:
|
|
cmd.extend(['-k', args.keyfile])
|
|
if args.tries:
|
|
cmd.extend(['-t', str(args.tries)])
|
|
if args.failures:
|
|
cmd.append('--failures')
|
|
|
|
process = subprocess.Popen(cmd, pass_fds=(wfd,))
|
|
os.close(wfd)
|
|
|
|
output = os.fdopen(rfd)
|
|
for l in output:
|
|
j = json.loads(l)
|
|
event = j['event']
|
|
if event == 'updated':
|
|
updates.append('%(name)s updated to version %(version)s' % j)
|
|
notif.update('nvchecker', '\n'.join(updates))
|
|
notif.show()
|
|
|
|
ret = process.wait()
|
|
if ret != 0:
|
|
raise subprocess.CalledProcessError(ret, cmd)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|