From 1e600e4f7addfab4f5cbb7c563955d43b20c74b5 Mon Sep 17 00:00:00 2001 From: pfilipko1 Date: Mon, 22 May 2023 19:09:44 +0200 Subject: [PATCH 1/5] wittier exe getting --- granulate_utils/golang.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/granulate_utils/golang.py b/granulate_utils/golang.py index 2c9157ca..37f837c5 100644 --- a/granulate_utils/golang.py +++ b/granulate_utils/golang.py @@ -10,7 +10,8 @@ from psutil import NoSuchProcess, Process from granulate_utils.linux.elf import read_elf_symbol, read_elf_va -from granulate_utils.linux.process import is_kernel_thread +from granulate_utils.linux.ns import get_mnt_ns_ancestor +from granulate_utils.linux.process import is_kernel_thread, process_exe def is_golang_process(process: Process) -> bool: @@ -19,7 +20,8 @@ def is_golang_process(process: Process) -> bool: @functools.lru_cache(maxsize=4096) def get_process_golang_version(process: Process) -> Optional[str]: - elf_path = f"/proc/{process.pid}/exe" + exe = process_exe(process) + elf_path = f"/proc/{get_mnt_ns_ancestor(process).pid}/root{exe}" try: symbol_data = read_elf_symbol(elf_path, "runtime.buildVersion", 16) except FileNotFoundError: From 1a0934dc453f68a739b90528664fea6ea2ef299e Mon Sep 17 00:00:00 2001 From: pfilipko1 Date: Sun, 28 May 2023 15:48:38 +0200 Subject: [PATCH 2/5] cache based on start time --- granulate_utils/golang.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/granulate_utils/golang.py b/granulate_utils/golang.py index 37f837c5..ecc66695 100644 --- a/granulate_utils/golang.py +++ b/granulate_utils/golang.py @@ -7,7 +7,7 @@ import struct from typing import Optional -from psutil import NoSuchProcess, Process +from psutil import NoSuchProcess, Process, pids from granulate_utils.linux.elf import read_elf_symbol, read_elf_va from granulate_utils.linux.ns import get_mnt_ns_ancestor @@ -15,12 +15,22 @@ def is_golang_process(process: Process) -> bool: - return not is_kernel_thread(process) and get_process_golang_version(process) is not None + return not is_kernel_thread(process) and get_process_golang_version(process.create_time()) is not None @functools.lru_cache(maxsize=4096) -def get_process_golang_version(process: Process) -> Optional[str]: - exe = process_exe(process) +def get_process_golang_version(process_start_time: float) -> Optional[str]: + process = None + for pid in pids(): + if Process(pid).create_time() == process_start_time: + process = Process(pid) + + if process is None: + raise NoSuchProcess(process_start_time) + try: + exe = process_exe(process) + except: + return None elf_path = f"/proc/{get_mnt_ns_ancestor(process).pid}/root{exe}" try: symbol_data = read_elf_symbol(elf_path, "runtime.buildVersion", 16) From 29cb3bb4e17e233791197f831921eb6f6ccc7f24 Mon Sep 17 00:00:00 2001 From: pfilipko1 Date: Sun, 28 May 2023 16:31:07 +0200 Subject: [PATCH 3/5] too much updates --- granulate_utils/golang.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/granulate_utils/golang.py b/granulate_utils/golang.py index 2c9157ca..ecc66695 100644 --- a/granulate_utils/golang.py +++ b/granulate_utils/golang.py @@ -7,19 +7,31 @@ import struct from typing import Optional -from psutil import NoSuchProcess, Process +from psutil import NoSuchProcess, Process, pids from granulate_utils.linux.elf import read_elf_symbol, read_elf_va -from granulate_utils.linux.process import is_kernel_thread +from granulate_utils.linux.ns import get_mnt_ns_ancestor +from granulate_utils.linux.process import is_kernel_thread, process_exe def is_golang_process(process: Process) -> bool: - return not is_kernel_thread(process) and get_process_golang_version(process) is not None + return not is_kernel_thread(process) and get_process_golang_version(process.create_time()) is not None @functools.lru_cache(maxsize=4096) -def get_process_golang_version(process: Process) -> Optional[str]: - elf_path = f"/proc/{process.pid}/exe" +def get_process_golang_version(process_start_time: float) -> Optional[str]: + process = None + for pid in pids(): + if Process(pid).create_time() == process_start_time: + process = Process(pid) + + if process is None: + raise NoSuchProcess(process_start_time) + try: + exe = process_exe(process) + except: + return None + elf_path = f"/proc/{get_mnt_ns_ancestor(process).pid}/root{exe}" try: symbol_data = read_elf_symbol(elf_path, "runtime.buildVersion", 16) except FileNotFoundError: From d0a15ca1d3e5e25def5488c9b94eb1d9b00c43e7 Mon Sep 17 00:00:00 2001 From: pfilipko1 Date: Mon, 29 May 2023 12:54:37 +0200 Subject: [PATCH 4/5] double caching --- granulate_utils/golang.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/granulate_utils/golang.py b/granulate_utils/golang.py index ecc66695..59ac9333 100644 --- a/granulate_utils/golang.py +++ b/granulate_utils/golang.py @@ -15,30 +15,34 @@ def is_golang_process(process: Process) -> bool: - return not is_kernel_thread(process) and get_process_golang_version(process.create_time()) is not None + return not is_kernel_thread(process) and get_process_golang_version(process) is not None @functools.lru_cache(maxsize=4096) -def get_process_golang_version(process_start_time: float) -> Optional[str]: - process = None - for pid in pids(): - if Process(pid).create_time() == process_start_time: - process = Process(pid) - - if process is None: - raise NoSuchProcess(process_start_time) +def get_process_golang_version(process: Process) -> Optional[str]: try: exe = process_exe(process) except: return None elf_path = f"/proc/{get_mnt_ns_ancestor(process).pid}/root{exe}" + return get_version_hidden_in_exe(elf_path, process.create_time()) + + + +@functools.lru_cache(maxsize=4096) +def get_version_hidden_in_exe(elf_path: str, process_start_time: float) -> Optional[str]: + process = None + for pid in pids(): + if Process(pid).create_time() == process_start_time: + process = Process(pid) + if process is None: + raise NoSuchProcess(process) try: symbol_data = read_elf_symbol(elf_path, "runtime.buildVersion", 16) except FileNotFoundError: raise NoSuchProcess(process.pid) if symbol_data is None: return None - # Declaration of go string type: # type stringStruct struct { # str unsafe.Pointer @@ -52,4 +56,4 @@ def get_process_golang_version(process_start_time: float) -> Optional[str]: if golang_version_bytes is None: return None - return golang_version_bytes.decode() + return golang_version_bytes.decode() \ No newline at end of file From a84922e04b2194fc059d0afcc9382ddd7378571d Mon Sep 17 00:00:00 2001 From: pfilipko1 Date: Mon, 29 May 2023 12:59:04 +0200 Subject: [PATCH 5/5] double caching --- granulate_utils/golang.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/granulate_utils/golang.py b/granulate_utils/golang.py index 59ac9333..9cd33966 100644 --- a/granulate_utils/golang.py +++ b/granulate_utils/golang.py @@ -56,4 +56,4 @@ def get_version_hidden_in_exe(elf_path: str, process_start_time: float) -> Optio if golang_version_bytes is None: return None - return golang_version_bytes.decode() \ No newline at end of file + return golang_version_bytes.decode()