From a00355ad4c1f100bf3177433992f2550cc0314fb Mon Sep 17 00:00:00 2001 From: illustris Date: Mon, 16 Oct 2023 15:35:57 +0530 Subject: [PATCH] fix netdev regex --- src/pvecommon/__init__.py | 15 +++++++++++++++ src/pvemon/__init__.py | 21 ++++++--------------- src/qmblock/__init__.py | 13 +++---------- 3 files changed, 24 insertions(+), 25 deletions(-) create mode 100644 src/pvecommon/__init__.py diff --git a/src/pvecommon/__init__.py b/src/pvecommon/__init__.py new file mode 100644 index 0000000..70f7c5c --- /dev/null +++ b/src/pvecommon/__init__.py @@ -0,0 +1,15 @@ +import pexpect + +global_qm_timeout = 10 + +def qm_term_cmd(vm_id, cmd, timeout=global_qm_timeout): + child = pexpect.spawn(f'qm monitor {vm_id}') + try: + child.expect('qm>', timeout=timeout) + child.sendline(cmd) + child.expect('qm>', timeout=timeout) + raw_output = child.before.decode('utf-8').strip() + finally: + child.close() + + return raw_output diff --git a/src/pvemon/__init__.py b/src/pvemon/__init__.py index b61a7bd..6417c4d 100644 --- a/src/pvemon/__init__.py +++ b/src/pvemon/__init__.py @@ -14,6 +14,7 @@ import cProfile from concurrent.futures import ThreadPoolExecutor from threading import Lock +import pvecommon import qmblock DEFAULT_PORT = 9116 @@ -77,25 +78,13 @@ def get_memory_info(pid): def extract_nic_info_from_monitor(vm_id): - child = pexpect.spawn(f'qm monitor {vm_id}') - - # Wait for the QEMU monitor prompt - child.expect('qm>', timeout=10) - - # Execute 'info network' - child.sendline('info network') - - # Wait for the prompt again - child.expect('qm>', timeout=10) - - # Parse the output - raw_output = child.before.decode('utf-8').strip() - child.close() + raw_output = pvecommon.qm_term_cmd(vm_id, 'info network') + nic_info_list = re.findall(r'(net\d+:.*?)(?=(net\d+:|$))', raw_output, re.S) nics_map = {} - for netdev, cfg in [x.strip().split(": ") for x in re.findall(r'[^\n]*(net\d+:[^\n]*)\n', raw_output, re.S)]: + for netdev, cfg in [x.strip().split(": ") for x in re.findall(r'(net\d+:.*?)(?:\r{0,2}\n|(?=\s*\\ net\d+:)|$)', raw_output, re.S)]: for cfg_pair in cfg.split(","): if cfg_pair=='': continue @@ -209,6 +198,7 @@ def main(): parser.add_argument('--metrics-prefix', type=str, default=DEFAULT_PREFIX, help='_ will be prepended to each metric name') parser.add_argument('--loglevel', type=str, default='INFO', help='Set log level (DEBUG, INFO, WARNING, ERROR, CRITICAL)') parser.add_argument('--profile', type=str, default='false', help='collect metrics once, and print profiling stats') + parser.add_argument('--qm-terminal-timeout', type=int, default=10, help='timeout for qm terminal commands') args = parser.parse_args() @@ -219,6 +209,7 @@ def main(): global prefix prefix = args.metrics_prefix + pvecommon.global_qm_timeout = args.qm_terminal_timeout for name, description, labels in gauge_settings: gauge_dict[name] = Gauge(f"{prefix}_{name}", description, labels) diff --git a/src/qmblock/__init__.py b/src/qmblock/__init__.py index f34505c..5836139 100644 --- a/src/qmblock/__init__.py +++ b/src/qmblock/__init__.py @@ -2,6 +2,8 @@ import pexpect import re import os +import pvecommon + def get_device(disk_path): try: return os.readlink(disk_path).split('/')[-1] @@ -9,16 +11,7 @@ def get_device(disk_path): return None def extract_disk_info_from_monitor(vm_id): - child = pexpect.spawn(f'qm monitor {vm_id}') - # Wait for the QEMU monitor prompt - child.expect('qm>', timeout=10) - # Execute 'info block' - child.sendline('info block') - # Wait for the prompt again - child.expect('qm>', timeout=10) - # Parse the output - raw_output = child.before.decode('utf-8').strip() - child.close() + raw_output = pvecommon.qm_term_cmd(vm_id, 'info block') disks_map = {} disks = [x.strip() for x in raw_output.split("drive-")[1:]] for disk in disks: