20
20
# Authors: Kyle Fazzari <[email protected] >
21
21
# Daniel Swarbrick <[email protected] >
22
22
23
- import apt
24
- import apt_pkg
23
+ import argparse
25
24
import collections
26
25
import os
26
+ import apt
27
+ import apt_pkg
27
28
from prometheus_client import CollectorRegistry , Gauge , generate_latest
28
29
29
30
_UpgradeInfo = collections .namedtuple ("_UpgradeInfo" , ["labels" , "count" ])
@@ -38,12 +39,12 @@ def _convert_candidates_to_upgrade_infos(candidates):
38
39
)
39
40
changes_dict ["," .join (origins )][candidate .architecture ] += 1
40
41
41
- changes_list = list ()
42
+ changes_list = []
42
43
for origin in sorted (changes_dict .keys ()):
43
44
for arch in sorted (changes_dict [origin ].keys ()):
44
45
changes_list .append (
45
46
_UpgradeInfo (
46
- labels = dict ( origin = origin , arch = arch ) ,
47
+ labels = { " origin" : origin , " arch" : arch } ,
47
48
count = changes_dict [origin ][arch ],
48
49
)
49
50
)
@@ -86,38 +87,50 @@ def _write_autoremove_pending(registry, cache):
86
87
g .set (len (autoremovable_packages ))
87
88
88
89
89
- def _write_cache_timestamps (registry ):
90
+ def _write_cache_timestamps (registry , root_dir ):
90
91
g = Gauge ('apt_package_cache_timestamp_seconds' , "Apt update last run time." , registry = registry )
91
92
apt_pkg .init_config ()
92
93
if apt_pkg .config .find_b ("APT::Periodic::Update-Package-Lists" ):
93
94
# if we run updates automatically with APT::Periodic, we can
94
95
# check this timestamp file
95
- stamp_file = "/ var/lib/apt/periodic/update-success-stamp"
96
+ stamp_file = os . path . join ( root_dir , ' var/lib/apt/periodic/update-success-stamp' )
96
97
else :
97
98
# if not, let's just fallback on the lists directory
98
- stamp_file = '/ var/lib/apt/lists'
99
+ stamp_file = os . path . join ( root_dir , ' var/lib/apt/lists')
99
100
try :
100
101
g .set (os .stat (stamp_file ).st_mtime )
101
102
except OSError :
102
103
pass
103
104
104
105
105
- def _write_reboot_required (registry ):
106
+ def _write_reboot_required (registry , root_dir ):
106
107
g = Gauge ('node_reboot_required' , "Node reboot is required for software updates." ,
107
108
registry = registry )
108
- g .set (int (os .path .isfile ('/ run/reboot-required' )))
109
+ g .set (int (os .path .isfile (os . path . join ( root_dir , ' run/reboot-required') )))
109
110
110
111
111
- def _main ():
112
- cache = apt .cache .Cache ()
113
-
112
+ def generate_metrics (root_dir : str = '/' ) -> bytes :
113
+ cache = apt .cache .Cache (rootdir = root_dir )
114
114
registry = CollectorRegistry ()
115
+
115
116
_write_pending_upgrades (registry , cache )
116
117
_write_held_upgrades (registry , cache )
117
118
_write_autoremove_pending (registry , cache )
118
- _write_cache_timestamps (registry )
119
- _write_reboot_required (registry )
120
- print (generate_latest (registry ).decode (), end = '' )
119
+ _write_cache_timestamps (registry , root_dir )
120
+ _write_reboot_required (registry , root_dir )
121
+
122
+ return generate_latest (registry )
123
+
124
+
125
+ def _main ():
126
+ parser = argparse .ArgumentParser ()
127
+ parser .add_argument ('-r' , '--root-dir' , dest = 'root_dir' , type = str , default = '/' ,
128
+ help = "Set root directory to a different path than /" )
129
+ args = parser .parse_args ()
130
+
131
+ metrics = generate_metrics (args .root_dir )
132
+
133
+ print (metrics .decode (), end = '' )
121
134
122
135
123
136
if __name__ == "__main__" :
0 commit comments