From dec99e036a466fbdba2faa17002707b920933db3 Mon Sep 17 00:00:00 2001 From: Christian Poessinger Date: Sun, 7 Jun 2020 22:49:02 +0200 Subject: op-mode: T2558: version: split out CPU info Instead of using "show version" as catch-all command for information rather add "show system cpu" op-mode command which is analogous to "show system memory" which deals with RAM. --- op-mode-definitions/show-system.xml | 6 +++ python/vyos/version.py | 28 +----------- src/op_mode/show_cpu.py | 61 +++++++++++++++++++++++++ src/op_mode/show_version.py | 73 ++++++++++++++++++++++++++++++ src/op_mode/version.py | 88 ------------------------------------- 5 files changed, 142 insertions(+), 114 deletions(-) create mode 100755 src/op_mode/show_cpu.py create mode 100755 src/op_mode/show_version.py delete mode 100755 src/op_mode/version.py diff --git a/op-mode-definitions/show-system.xml b/op-mode-definitions/show-system.xml index b7f56ae20..a39d9b481 100644 --- a/op-mode-definitions/show-system.xml +++ b/op-mode-definitions/show-system.xml @@ -49,6 +49,12 @@ + + + Show CPU information + + ${vyos_op_scripts_dir}/show_cpu.py + Checks overall system integrity diff --git a/python/vyos/version.py b/python/vyos/version.py index f5eac5a58..871bb0f1b 100644 --- a/python/vyos/version.py +++ b/python/vyos/version.py @@ -1,4 +1,4 @@ -# Copyright 2017 VyOS maintainers and contributors +# Copyright 2017-2020 VyOS maintainers and contributors # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public @@ -31,8 +31,6 @@ Example of the version data dict:: import os import json -import logging - import vyos.defaults from vyos.util import read_file @@ -43,7 +41,7 @@ from vyos.util import DEVNULL version_file = os.path.join(vyos.defaults.directories['data'], 'version.json') - + def get_version_data(fname=version_file): """ @@ -77,28 +75,6 @@ def get_full_version_data(fname=version_file): # Get system architecture (well, kernel architecture rather) version_data['system_arch'], _ = popen('uname -m', stderr=DEVNULL) - cpu_json,code = popen('lscpu -J',stderr=DEVNULL) - - cpu = {} - if code == 0: - cpu_info = json.loads(cpu_json) - if len(cpu_info) > 0 and 'lscpu' in cpu_info: - for prop in cpu_info['lscpu']: - if (prop['field'].find('Thread(s)') > -1): cpu['threads'] = prop['data'] - if (prop['field'].find('Core(s)')) > -1: cpu['cores'] = prop['data'] - if (prop['field'].find('Socket(s)')) > -1: cpu['sockets'] = prop['data'] - if (prop['field'].find('CPU(s):')) > -1: cpu['cpus'] = prop['data'] - if (prop['field'].find('CPU MHz')) > -1: cpu['mhz'] = prop['data'] - if (prop['field'].find('CPU min MHz')) > -1: cpu['mhz_min'] = prop['data'] - if (prop['field'].find('CPU max MHz')) > -1: cpu['mhz_max'] = prop['data'] - if (prop['field'].find('Vendor ID')) > -1: cpu['vendor'] = prop['data'] - if (prop['field'].find('Model name')) > -1: cpu['model'] = prop['data'] - - if len(cpu) > 0: - version_data['cpu'] = cpu - - - hypervisor,code = popen('hvinfo', stderr=DEVNULL) if code == 1: # hvinfo returns 1 if it cannot detect any hypervisor diff --git a/src/op_mode/show_cpu.py b/src/op_mode/show_cpu.py new file mode 100755 index 000000000..0a540da1d --- /dev/null +++ b/src/op_mode/show_cpu.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2016-2020 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import json + +from jinja2 import Template +from sys import exit +from vyos.util import popen, DEVNULL + +OUT_TMPL_SRC = """ +{%- if cpu -%} +{% if 'vendor' in cpu %}CPU Vendor: {{cpu.vendor}}{%- endif %} +{% if 'model' in cpu %}Model: {{cpu.model}}{%- endif %} +{% if 'cpus' in cpu %}Total CPUs: {{cpu.cpus}}{%- endif %} +{% if 'sockets' in cpu %}Sockets: {{cpu.sockets}}{%- endif %} +{% if 'cores' in cpu %}Cores: {{cpu.cores}}{%- endif %} +{% if 'threads' in cpu %}Threads: {{cpu.threads}}{%- endif %} +{% if 'mhz' in cpu %}Current MHz: {{cpu.mhz}}{%- endif %} +{% if 'mhz_min' in cpu %}Minimum MHz: {{cpu.mhz_min}}{%- endif %} +{% if 'mhz_max' in cpu %}Maximum MHz: {{cpu.mhz_max}}{%- endif %} +{% endif %} +""" + +cpu = {} +cpu_json, code = popen('lscpu -J', stderr=DEVNULL) + +if code == 0: + cpu_info = json.loads(cpu_json) + if len(cpu_info) > 0 and 'lscpu' in cpu_info: + for prop in cpu_info['lscpu']: + if (prop['field'].find('Thread(s)') > -1): cpu['threads'] = prop['data'] + if (prop['field'].find('Core(s)')) > -1: cpu['cores'] = prop['data'] + if (prop['field'].find('Socket(s)')) > -1: cpu['sockets'] = prop['data'] + if (prop['field'].find('CPU(s):')) > -1: cpu['cpus'] = prop['data'] + if (prop['field'].find('CPU MHz')) > -1: cpu['mhz'] = prop['data'] + if (prop['field'].find('CPU min MHz')) > -1: cpu['mhz_min'] = prop['data'] + if (prop['field'].find('CPU max MHz')) > -1: cpu['mhz_max'] = prop['data'] + if (prop['field'].find('Vendor ID')) > -1: cpu['vendor'] = prop['data'] + if (prop['field'].find('Model name')) > -1: cpu['model'] = prop['data'] + +if len(cpu) > 0: + tmp = { 'cpu':cpu } + tmpl = Template(OUT_TMPL_SRC) + print(tmpl.render(tmp)) + exit(0) +else: + print('CPU information could not be determined\n') + exit(1) diff --git a/src/op_mode/show_version.py b/src/op_mode/show_version.py new file mode 100755 index 000000000..d0d5c6785 --- /dev/null +++ b/src/op_mode/show_version.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +# +# Copyright (C) 2016-2020 VyOS maintainers and contributors +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 or later as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# Purpose: +# Displays image version and system information. +# Used by the "run show version" command. + +import argparse +import vyos.version +import vyos.limericks + +from jinja2 import Template +from sys import exit +from vyos.util import call + +parser = argparse.ArgumentParser() +parser.add_argument("-a", "--all", action="store_true", help="Include individual package versions") +parser.add_argument("-f", "--funny", action="store_true", help="Add something funny to the output") +parser.add_argument("-j", "--json", action="store_true", help="Produce JSON output") + +version_output_tmpl = """ +Version: VyOS {{version}} +Release Train: {{release_train}} + +Built by: {{built_by}} +Built on: {{built_on}} +Build UUID: {{build_uuid}} +Build Commit ID: {{build_git}} + +Architecture: {{system_arch}} +Boot via: {{boot_via}} +System type: {{system_type}} + +Hardware vendor: {{hardware_vendor}} +Hardware model: {{hardware_model}} +Hardware S/N: {{hardware_serial}} +Hardware UUID: {{hardware_uuid}} + +Copyright: VyOS maintainers and contributors +""" + +if __name__ == '__main__': + args = parser.parse_args() + + version_data = vyos.version.get_full_version_data() + + if args.json: + import json + print(json.dumps(version_data)) + exit(0) + + tmpl = Template(version_output_tmpl) + print(tmpl.render(version_data)) + + if args.all: + print("Package versions:") + call("dpkg -l") + + if args.funny: + print(vyos.limericks.get_random()) diff --git a/src/op_mode/version.py b/src/op_mode/version.py deleted file mode 100755 index 160aa9f26..000000000 --- a/src/op_mode/version.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -# -# Copyright (C) 2016-2020 VyOS maintainers and contributors -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License version 2 or later as -# published by the Free Software Foundation. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -# -# Purpose: -# Displays image version and system information. -# Used by the "run show version" command. - -import sys -import argparse -import json -import jinja2 - -import vyos.version -import vyos.limericks - -from vyos.util import call - -parser = argparse.ArgumentParser() -parser.add_argument("-a", "--all", action="store_true", help="Include individual package versions") -parser.add_argument("-f", "--funny", action="store_true", help="Add something funny to the output") -parser.add_argument("-j", "--json", action="store_true", help="Produce JSON output") - -version_output_tmpl = """ -Version: VyOS {{version}} -Release Train: {{release_train}} - -Built by: {{built_by}} -Built on: {{built_on}} -Build UUID: {{build_uuid}} -Build Commit ID: {{build_git}} - -Architecture: {{system_arch}} -Boot via: {{boot_via}} -System type: {{system_type}} -{% if cpu %} - -{% if 'vendor' in cpu %}CPU Vendor: {{cpu.vendor}}{% endif %} -{% if 'model' in cpu %}Model: {{cpu.model}}{% endif %} -{% if 'cpus' in cpu %}Total CPUs: {{cpu.cpus}}{% endif %} -{% if 'sockets' in cpu %}Sockets: {{cpu.sockets}}{% endif %} -{% if 'cores' in cpu %}Cores: {{cpu.cores}}{% endif %} -{% if 'threads' in cpu %}Threads: {{cpu.threads}}{% endif %} -{% if 'mhz' in cpu %}Current MHz: {{cpu.mhz}}{% endif %} -{% if 'mhz_min' in cpu %}Minimum MHz: {{cpu.mhz_min}}{% endif %} -{% if 'mhz_max' in cpu %}Maximum MHz: {{cpu.mhz_max}}{% endif %} -{% endif %} - -Hardware vendor: {{hardware_vendor}} -Hardware model: {{hardware_model}} -Hardware S/N: {{hardware_serial}} -Hardware UUID: {{hardware_uuid}} - -Copyright: VyOS maintainers and contributors -""" - -if __name__ == '__main__': - args = parser.parse_args() - - version_data = vyos.version.get_full_version_data() - - if args.json: - print(json.dumps(version_data)) - sys.exit(0) - - tmpl = jinja2.Template(version_output_tmpl) - print(tmpl.render(version_data)) - - #print(version_output_tmpl.format(**version_data).strip()) - - if args.all: - print("Package versions:") - call("dpkg -l") - - if args.funny: - print(vyos.limericks.get_random()) -- cgit v1.2.3