Viewing file: proxmox.py (2.98 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
# Copyright (C) 2024 ORNESS/Ditrit Drien Breton <drien.breton@orness.com>
# This file is part of the sos project: https://github.com/sosreport/sos # # This copyrighted material is made available to anyone wishing to use, # modify, copy, or redistribute it subject to the terms and conditions of # version 2 of the GNU General Public License. # # See the LICENSE file in the source distribution for further information. import json
from sos.report.plugins import Plugin, DebianPlugin, PluginOpt
class Proxmox(Plugin, DebianPlugin): """ This plugin will capture information about the system's Proxmox Virtualization Environment.
It will collect information about the cluster, nodes, pools and storage from the Proxmox API. """ short_desc = 'Proxmox cluster information'
plugin_name = 'proxmox' packages = ('proxmox-ve',)
option_list = [ PluginOpt('output_formats', desc='List of output formats to use ' 'for the commands separated by ":".', default='text', ), ]
def setup(self): output_formats = self.get_option('output_formats').split(':')
commands = [ 'cluster/resources', 'cluster/config/nodes', 'cluster/options', 'nodes/:id/status', 'nodes/:id/storage', 'nodes/:id/network', 'pools', 'storage', 'storage/:sid', 'cluster/ceph/status', 'cluster/ceph/metadata', 'cluster/ceph/flags', ]
cmd_paths = []
for command in commands: cmd_paths.extend(self.build_cmd_paths(command))
self.add_cmd_output([ f"pvesh get {cmd} {'--noborder' if format == 'text' else ''} " f"--output-format {format}" for cmd in cmd_paths for format in output_formats ])
def build_cmd_paths(self, base_path): """ Build command paths, replacing dynamic attributes with data from the API
:param base_path: The base path to build from :type base_path: str
:return: A list of paths """ parts = base_path.split('/') paths = []
id_index = next((i for i, part in enumerate(parts) if part.startswith(':')), None)
if id_index is not None: path = "/".join(parts[:id_index]) trailing_path = "/".join(parts[id_index + 1:])
results = self.exec_cmd(f'pvesh ls {path} --output-format json')
if results["status"] == 0: children = json.loads(results["output"]) for child in children: paths.extend( self.build_cmd_paths( f"{path}/{child['name']}/{trailing_path}" ) )
else: paths.append('/'.join(parts)) return paths
# vim: set et ts=4 sw=4 :
|