Skip to content

Commit a578856

Browse files
authored
handle version locked packages (#112)
* handle version locked packages in agent * show info for version locked packages
1 parent 4471205 commit a578856

2 files changed

Lines changed: 33 additions & 8 deletions

File tree

  • mkp/local
    • lib/python3/cmk_addons/plugins/yum/agent_based
    • share/check_mk/agents/plugins

mkp/local/lib/python3/cmk_addons/plugins/yum/agent_based/yum.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
class Section(NamedTuple):
5858
reboot_required: Optional[bool]
5959
packages: int = -1
60+
locked_packages_list: Optional[str] = None
6061
security_packages: int = -1
6162
security_packages_list: Optional[str] = None
6263
last_update_timestamp: int = -1
@@ -75,11 +76,14 @@ def yum_parse(string_table: List[List[str]]) -> Section:
7576
pass
7677

7778
packages = None
79+
locked_packages_list = None
7880
security_packages = None
7981
security_packages_list = None
8082
last_update_timestamp = None
8183
try:
8284
packages = int(string_table[1][0])
85+
if len(string_table[1]) > 1:
86+
locked_packages_list = " ".join(string_table[1][1:])
8387
security_packages = int(string_table[2][0])
8488
if len(string_table[2]) > 1:
8589
security_packages_list = string_table[2][1]
@@ -90,6 +94,7 @@ def yum_parse(string_table: List[List[str]]) -> Section:
9094
return Section(
9195
reboot_required,
9296
packages,
97+
locked_packages_list,
9398
security_packages,
9499
security_packages_list,
95100
last_update_timestamp)
@@ -118,9 +123,17 @@ def check_yum(params: Dict[str, object], section: Section):
118123

119124
# === Normal Updates ===
120125
if section.packages < 0:
121-
yield Result(state=State.UNKNOWN, summary="No package information available")
126+
state = State.UNKNOWN
127+
if section.locked_packages_list:
128+
summary=f"No package information available ({section.locked_packages_list})"
129+
else:
130+
summary="No package information available"
122131
elif section.packages == 0 and section.security_packages == 0:
123-
yield Result(state=State.OK, summary="All packages are up to date")
132+
state = State.OK
133+
if section.locked_packages_list:
134+
summary=f"All packages are up to date ({section.locked_packages_list})"
135+
else:
136+
summary="All packages are up to date"
124137
yield Metric(name="normal_updates", value=0)
125138
else:
126139
mode, levels = params.get("normal")
@@ -134,8 +147,12 @@ def check_yum(params: Dict[str, object], section: Section):
134147
state = State.OK
135148
else:
136149
state = State.OK
137-
yield Result(state=state, summary=f"{section.packages} normal updates available")
150+
if section.locked_packages_list:
151+
summary=f"{section.packages} normal updates available ({section.locked_packages_list})"
152+
else:
153+
summary=f"{section.packages} normal updates available"
138154
yield Metric(name="normal_updates", value=section.packages)
155+
yield Result(state=state, summary=summary)
139156

140157
# === Security Updates ===
141158
if section.security_packages >= 0:

mkp/local/share/check_mk/agents/plugins/yum

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,17 +169,25 @@ then
169169

170170
# Count available updates - different commands for different package managers
171171
if [ "$PKG_MGR" = "dnf5" ]; then
172-
LOCKEDRE=$(dnf5 versionlock list | grep -o -P '(?<=^Package name: ).+' | tr '\n' '|' | sed 's/|/\\.|/g; s/|$//')
173-
UPDATES=$(timeout 25s dnf5 list --upgrades 2>/dev/null | grep -E "^[a-zA-Z]" | tail -n +2 | grep -v -P "$LOCKEDRE" | wc -l || echo "-1")
172+
LOCKED=$(dnf5 versionlock list | grep -o -P '(?<=^Package name: ).+' | tr '\n' ' ')
173+
if [[ -n "$LOCKED" ]]; then
174+
LOCKED="version locked: $LOCKED"
175+
LOCKEDNR=$(dnf5 versionlock list | grep -c -o -P '(?<=^Package name: ).+')
176+
else
177+
let LOCKEDNR=0
178+
fi
179+
UPDATES=$(timeout 25s dnf5 list --upgrades 2>/dev/null | grep -E "^[a-zA-Z]" | tail -n +2 | wc -l || echo "-1")
180+
let UPDATES=UPDATES-LOCKEDNR
174181
else
182+
LOCKED=""
175183
UPDATES=$(timeout 25s $PKG_MGR -C --noplugins --quiet list updates 2>/dev/null | grep "\." | cut -d' ' -f1 | wc -l || echo "-1")
176184
fi
177185

178186
# Check for security updates if supported
179187
if [ $SECURITY_SUPPORTED -eq 1 ]; then
180188
if [ "$PKG_MGR" = "dnf5" ]; then
181189
# dnf5 uses different command for security updates
182-
SECURITY_OUTPUT=$(timeout 25s dnf5 -C --quiet check-upgrade --security 2>/dev/null)
190+
SECURITY_OUTPUT=$(timeout 25s dnf5 -C --quiet check-upgrade --security 2>/dev/null | grep -v 'No security updates needed, but')
183191
SECURITY_UPDATES=$(echo "$SECURITY_OUTPUT" | grep -E "^[a-zA-Z0-9]" | wc -l || echo "-1")
184192
SECURITY_UPDATES_LIST=$(echo "$SECURITY_OUTPUT" | grep -E "^[a-zA-Z0-9]" | awk '{print $1}' | sed 's/\.[^.]*$//' | paste -sd, -)
185193
else
@@ -227,7 +235,7 @@ then
227235
fi
228236

229237
echo "$BOOT_REQUIRED"
230-
echo "$UPDATES"
238+
echo "$UPDATES $LOCKED"
231239
echo "$SECURITY_UPDATES $SECURITY_UPDATES_LIST"
232240
echo "$LAST_UPDATE_TIMESTAMP"
233241

@@ -245,7 +253,7 @@ then
245253
if [ -f "$CACHE_RESULT_CHECK" ] || [ ! -L "$CACHE_RESULT_CHECK" ]
246254
then
247255
echo "$BOOT_REQUIRED" > "$CACHE_RESULT_CHECK"
248-
echo "$UPDATES" >> "$CACHE_RESULT_CHECK"
256+
echo "$UPDATES $LOCKED" >> "$CACHE_RESULT_CHECK"
249257
echo "$SECURITY_UPDATES $SECURITY_UPDATES_LIST" >> "$CACHE_RESULT_CHECK"
250258
echo "$LAST_UPDATE_TIMESTAMP" >> "$CACHE_RESULT_CHECK"
251259
else

0 commit comments

Comments
 (0)