validations/image_validator/system.py (74 lines of code) (raw):

import re import json import subprocess import platform import os sysinfo = dict() ''' Libraries used 1. Platform: Used in getting platform and machine related details ''' def get_os_kernel_version(): sysinfo["os"] = ' '.join(platform.linux_distribution()) sysinfo["machine"] = platform.machine() sysinfo["processor"] = platform.processor() sysinfo["kernel"] = platform.release() sysinfo["platform"] = platform.platform() def is_efi_booted(): sysinfo["isEfiBooted"] = os.path.isdir("/sys/firmware/efi") def get_proc_commandline(): sysinfo["procCmdline"] = open('/proc/cmdline').read().strip() def get_command_output(command): return subprocess.Popen([command], stdout=subprocess.PIPE, shell=True) def get_disk_info(): """ fdisk parsing for disk output List of columns: 1. name = Disk name (sda, sdb) 2. labelType = whether it is dos or gpt 3. partitions = list of partitions and its usage in a dict """ disk_json = list() disk_dict = dict() result = get_command_output('/usr/sbin/fdisk -l 2>/dev/null') for line in result.stdout.read().strip().splitlines(): try: line = ' '.join(line.strip().split(' ')) if line.startswith('Disk /'): disk_dict['name'] = line[5:].split(':')[0].split('/')[-1].strip() if line.startswith('Disk label type'): disk_dict['labelType'] = line.split(':')[1].strip() disk_dict['partitions'] = get_partition_information(disk_dict['name']) if 'labelType' in disk_dict.keys() and 'name' in disk_dict.keys(): disk_json.append(disk_dict) disk_dict = dict() except Exception as e: continue sysinfo["disk"] = disk_json def get_partition_information(disk): part_json = list() try: result = get_command_output('/bin/lsblk -o name -n -s -l -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT | grep part') for line in result.stdout.readlines(): info = ' '.join(line.strip().split(' ')).split() if info[0].startswith(disk): part_json.append({'name': info[0].strip(), 'fstype': info[2].strip(), 'mountpoint': info[-1].strip()}) return partition_usage(part_json) except Exception as e: print(e) def partition_usage(part_info): usage = dict() units = {'MB' : 2**20} for part in part_info: try: import shutil part["size"], part["used"], part["free"] = shutil.disk_usage(part["mountpoint"]) except: stats = os.statvfs(part["mountpoint"]) part["free"] = stats.f_bfree * stats.f_bsize part["size"] = stats.f_blocks * stats.f_bsize part["used"] = part["size"] - part["free"] part["size"], part["used"], part["free"] = part["size"]/units['MB'], part["used"]/units['MB'], part["free"]/units['MB'] part["units"] = units return part_info def get_sysinfo(): get_os_kernel_version() is_efi_booted() get_proc_commandline() get_disk_info() if __name__ == "__main__": main() print(json.dumps(sysinfo, indent=4))