-
-
Notifications
You must be signed in to change notification settings - Fork 261
/
fedora_updates.py
100 lines (81 loc) · 2.89 KB
/
fedora_updates.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
"""
Display number of pending updates for Fedora Linux.
This will display a count of how many `dnf` updates are waiting
to be installed. Additionally check for update security notices.
Configuration parameters:
cache_timeout: How often we refresh this module in seconds
(default 600)
check_security: Check for security updates
(default True)
format: Display format to use
(default 'DNF: {updates}')
Format placeholders:
{updates} number of pending dnf updates
Color options:
color_bad: Security notice
color_degraded: Upgrade available
color_good: No upgrades needed
@author tobes
@license BSD
SAMPLE OUTPUT
{'color': '#FFFF00', 'full_text': 'DNF: 14'}
"""
import re
import subprocess
class Py3status:
""" """
# available configuration parameters
cache_timeout = 600
check_security = True
format = "DNF: {updates}"
def post_config_hook(self):
self._reg_ex_sec = re.compile(r"\d+(?=\s+Security)")
self._reg_ex_pkg = re.compile(b"^\\S+\\.", re.M)
self._first = True
self._updates = 0
self._security_notice = False
def fedora_updates(self):
if self._first:
self._first = False
response = {
"cached_until": self.py3.time_in(0),
"full_text": self.py3.safe_format(self.format, {"updates": "?"}),
}
return response
output, error = subprocess.Popen(
["dnf", "check-update"], stdout=subprocess.PIPE, stderr=subprocess.PIPE
).communicate()
updates = len(self._reg_ex_pkg.findall(output))
if updates == 0:
color = self.py3.COLOR_GOOD
self._updates = 0
self._security_notice = False
else:
if self._updates > updates:
# we have installed some updates so re-check security
self._security_notice = False
if self.check_security and not self._security_notice and self._updates != updates:
output, error = subprocess.Popen(
["dnf", "updateinfo"],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
).communicate()
notices = str(output)
self._security_notice = len(self._reg_ex_sec.findall(notices))
self._updates = updates
if self.check_security and self._security_notice:
color = self.py3.COLOR_BAD
else:
color = self.py3.COLOR_DEGRADED
response = {
"cached_until": self.py3.time_in(self.cache_timeout),
"color": color,
"full_text": self.py3.safe_format(self.format, {"updates": updates}),
}
return response
if __name__ == "__main__":
"""
Run module in test mode.
"""
from py3status.module_test import module_test
module_test(Py3status)