diff options
-rw-r--r-- | sos/report/plugins/proxmox.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/sos/report/plugins/proxmox.py b/sos/report/plugins/proxmox.py new file mode 100644 index 00000000..63db3199 --- /dev/null +++ b/sos/report/plugins/proxmox.py @@ -0,0 +1,101 @@ +# 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 : |