Skip to content

Commit afffeb5

Browse files
committed
omd rm: Report terminated processes
`omd stop` will already report some processes, which could not be killed. However, the actual condition of `omd rm` to fail is different, since it cares for all site user processes. `omd` will now report the processes causing the removal to fail. CMK-31410 Change-Id: I73a7fb6d2d27049ed46ee0656c8bf2d159b38079 (cherry picked from commit d3fcdfd)
1 parent 6747ce8 commit afffeb5

3 files changed

Lines changed: 28 additions & 22 deletions

File tree

omd/packages/omd/omdlib/main.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,12 @@
111111
from omdlib.type_defs import Config, Replacements, Skeleton
112112
from omdlib.update import get_conflict_mode_update, get_edition, ManageUpdate, PreFlight
113113
from omdlib.update_check import check_update_possible, prepare_conflict_resolution
114-
from omdlib.user_processes import kill_site_user_processes, terminate_site_user_processes
114+
from omdlib.user_processes import (
115+
descriptions_of_processes,
116+
kill_site_user_processes,
117+
site_user_processes,
118+
terminate_site_user_processes,
119+
)
115120
from omdlib.users_and_groups import (
116121
find_processes_of_user,
117122
group_exists,
@@ -120,7 +125,6 @@
120125
popen_as_site_user,
121126
run_as_site_user,
122127
user_id,
123-
user_logged_in,
124128
user_verify,
125129
useradd,
126130
userdel,
@@ -2001,9 +2005,19 @@ def _main_rm(
20012005
reuse = "reuse" in options
20022006
kill = "kill" in options
20032007

2004-
if user_logged_in(site_name):
2008+
if remaining_processes := site_user_processes(site_name):
20052009
if not kill:
2006-
sys.exit("User '%s' still logged in or running processes." % site_name)
2010+
if descriptions := list(descriptions_of_processes(remaining_processes)):
2011+
sys.exit(
2012+
"\n".join(
2013+
[
2014+
f"User '{site_name}' still logged in or running processes.",
2015+
*descriptions,
2016+
]
2017+
)
2018+
)
2019+
# The process vanished in the meantime. Technically, still an error but without the
2020+
# description we might as well do what the user asked for.
20072021
else:
20082022
kill_site_user_processes(site_name, global_opts.verbose)
20092023

omd/packages/omd/omdlib/user_processes.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def terminate_site_user_processes(username: str, verbose: bool) -> None:
2323
the current OMD call terminate.
2424
"""
2525

26-
processes = _site_user_processes(username)
26+
processes = site_user_processes(username) - set(_get_current_and_parent_processes())
2727
if not processes:
2828
return
2929

@@ -32,7 +32,7 @@ def terminate_site_user_processes(username: str, verbose: bool) -> None:
3232
timeout_at = time.time() + 5
3333
sent_terminate = False
3434
while processes and time.time() < timeout_at:
35-
for process in processes[:]:
35+
for process in list(processes):
3636
try:
3737
if not sent_terminate:
3838
if verbose:
@@ -49,7 +49,7 @@ def terminate_site_user_processes(username: str, verbose: bool) -> None:
4949
sent_terminate = True
5050
time.sleep(0.1)
5151

52-
if remaining_processes_descriptions := list(_descriptions_of_remaining_processes(processes)):
52+
if remaining_processes_descriptions := list(descriptions_of_processes(processes)):
5353
sys.exit(
5454
"\n".join(
5555
[
@@ -63,10 +63,10 @@ def terminate_site_user_processes(username: str, verbose: bool) -> None:
6363

6464

6565
def kill_site_user_processes(username: str, verbose: bool) -> None:
66-
processes = _site_user_processes(username)
66+
processes = site_user_processes(username) - set(_get_current_and_parent_processes())
6767
tries = 5
6868
while tries > 0 and processes:
69-
for process in processes[:]:
69+
for process in list(processes):
7070
try:
7171
if verbose:
7272
sys.stdout.write(f"Killing process {process.pid}...")
@@ -79,7 +79,7 @@ def kill_site_user_processes(username: str, verbose: bool) -> None:
7979
time.sleep(1)
8080
tries -= 1
8181

82-
if remaining_processes_descriptions := list(_descriptions_of_remaining_processes(processes)):
82+
if remaining_processes_descriptions := list(descriptions_of_processes(processes)):
8383
sys.exit(
8484
"\n".join(
8585
[
@@ -90,7 +90,7 @@ def kill_site_user_processes(username: str, verbose: bool) -> None:
9090
)
9191

9292

93-
def _descriptions_of_remaining_processes(
93+
def descriptions_of_processes(
9494
remaining_processes: Iterable[psutil.Process],
9595
) -> Generator[str]:
9696
for process in remaining_processes:
@@ -108,9 +108,8 @@ def _get_current_and_parent_processes() -> list[psutil.Process]:
108108
return processes
109109

110110

111-
def _site_user_processes(username: str) -> list[psutil.Process]:
112-
"""Return list of all running site user processes (that are not excluded)"""
113-
exclude = set(_get_current_and_parent_processes())
111+
def site_user_processes(username: str) -> set[psutil.Process]:
112+
"""Return list of all running site user processes"""
114113
processes_of_site_user = set()
115114
for process in psutil.process_iter():
116115
try:
@@ -119,4 +118,4 @@ def _site_user_processes(username: str) -> list[psutil.Process]:
119118
continue
120119
if process_owner == username:
121120
processes_of_site_user.add(process)
122-
return list(processes_of_site_user - exclude)
121+
return processes_of_site_user

omd/packages/omd/omdlib/users_and_groups.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
from collections.abc import Sequence
1212
from typing import IO, Literal, overload, TYPE_CHECKING
1313

14-
import psutil
15-
1614
if TYPE_CHECKING:
1715
from omdlib.contexts import SiteContext
1816
from omdlib.version_info import VersionInfo
@@ -171,11 +169,6 @@ def group_id(name: str) -> int:
171169
return grp.getgrnam(name).gr_gid
172170

173171

174-
def user_logged_in(name: str) -> bool:
175-
"""Check if processes of named user are existing"""
176-
return any(p for p in psutil.process_iter() if p.username() == name)
177-
178-
179172
def user_verify(
180173
version_info: "VersionInfo", site: "SiteContext", allow_populated: bool = False
181174
) -> bool:

0 commit comments

Comments
 (0)