Python: Code Snippets - System Information
Friday 21st July 2017 3:16am
This is script displays system information including:
- Software
- CPU
- Memory
- Storage
- Network
- Previous Networks
- Network Devices
To run this script copy the code below and save to a file called system_info.py
system_info.py:
#!/usr/bin/env python
from urllib2 import urlopen
from collections import namedtuple
from subprocess import Popen, PIPE
import socket
import fcntl
import struct
import platform
import getpass
import os
import sys
import subprocess
class SystemInfo():
# ## Software Information ## #
# Get hostname
def get_hostname(self):
return socket.gethostname()
def get_platform_info(self):
os_platform = platform.platform()
distname, dist_version, id = platform.linux_distribution()
system, node, release, version, machine, processor = platform.uname()
return (os_platform,
distname,
dist_version,
id,
system,
node,
release,
version,
machine,
processor)
# Get username
def get_username(self):
return getpass.getuser()
# Is current user root
def _is_user_root(self):
if os.geteuid() == 0:
return True
else:
return False
# ## CPU Information ## #
# Get CPU info
def get_cpu_info(self):
_ntuple_CPUinfo = namedtuple('CPU', 'model hardware revision \
serial cores temp')
try:
return _ntuple_CPUinfo(self.get_cpu_model(),
self.get_cpu_hardware(),
self.get_cpu_revision(),
self.get_cpu_serial(),
self.get_cpu_cores(),
self.get_cpu_temp())
except:
return 'Error: Unable to get cpu information :('
# Get CPU items
def _get_cpu_item(self, item, ini_value):
temp = ini_value
try:
f = open('/proc/cpuinfo', 'r')
for line in f:
if line[0:len(item)] == item:
item_value = line[len(item)+3:]
f.close()
except:
item_value = 'Error: Unable to get %s :(' % item
return item_value.strip()
# Get CPU Serial Number
def get_cpu_serial(self):
return self._get_cpu_item('Serial', '0000000000000000')
# Get Model Name
def get_cpu_model(self):
return self._get_cpu_item('model name', '')
# Get Hardware
def get_cpu_hardware(self):
return self._get_cpu_item('Hardware', '')
# Get Revision
def get_cpu_revision(self):
return self._get_cpu_item('Revision', '')
# Return CPU temperature as a character string
def get_cpu_temp(self):
res = os.popen('vcgencmd measure_temp').readline()
return(res.replace("temp=", "").replace("'C\n", ""))
# Get number of cpu cores
def get_cpu_cores(self):
# Linux, Unix and MacOS:
if hasattr(os, "sysconf"):
if "SC_NPROCESSORS_ONLN" in os.sysconf_names:
# Linux and Unix:
ncpus = os.sysconf("SC_NPROCESSORS_ONLN")
if isinstance(ncpus, int) and ncpus > 0:
return ncpus
else: # OSX:
return int(os.popen2("sysctl -n hw.ncpu")[1].read())
# ## Hard Disk Informtion ## #
# Get Hard Drive Devices
def get_devices(self, path):
return next(os.walk(path))[1]
# Get hard drive usage
def disk_usage(self, path):
_ntuple_diskusage = namedtuple('usage', 'path total used free')
st = os.statvfs(path)
free = st.f_bavail * st.f_frsize
total = st.f_blocks * st.f_frsize
used = (st.f_blocks - st.f_bfree) * st.f_frsize
return _ntuple_diskusage(path, total, used, free)
# Get hard drive(s) info
def get_disk_info(self):
devices = []
for device in self.get_devices("/media/"):
devices.append(self.disk_usage("/media/" + device + "/"))
devices.append(self.disk_usage("/root/"))
return devices
# ## Memory Informtion ## #
# Get memory info
def get_ram_info(self):
_ntuple_RAMinfo = namedtuple('RAM', 'total used free')
p = os.popen('free')
i = 0
while i < 3:
i += 1
line = p.readline()
if i == 2:
total = line.split()[1]
used = line.split()[2]
free = int(total) - int(used)
return _ntuple_RAMinfo(total, used, free)
# ## Network Informtion ## #
# Get list of network settings
def get_network_settings(self):
_ntuple_LANinfo = namedtuple('LAN', 'ssid psk proto')
ssid = ''
psk = ''
proto = ''
settings = []
if os.path.exists('/var/lib/connman'):
for network in next(os.walk('/var/lib/connman'))[1]:
settings.append((network, ''))
file = open('/var/lib/connman/%s/settings' % network, 'r')
for line in file:
settings.append((line[:line.find('=')],
line[line.find('=')+1:].replace('\n',
'')))
file.close()
settings.append(('', ''))
elif os.path.exists('/etc/wpa_supplicant/wpa_supplicant.conf'):
file = open('/etc/wpa_supplicant/wpa_supplicant.conf', 'r')
for line in file:
settings.append((line[:line.find('=')].strip(),
line[line.find('=')+1:].replace('\n',
'')))
file.close()
else:
return 'Error getting Network Settings!'
return settings
# Get list of networks
def get_networks_info(self):
try:
lst = []
tabs = ''
for name, value in self.get_network_settings():
if name != value:
if value != '':
if len(name) < 8:
tabs = "\t\t\t"
elif len(name) > 13:
tabs = "\t"
else:
tabs = "\t\t"
lst.append('\t\t %s:%s%s\n' % (name, tabs, value))
else:
lst.append('\t\t%s\n\n' % name)
return lst
except:
return 'Error getting Networks!'
# Get the WAN IP address
def get_wan_ip_addr(self):
try:
return urlopen('http://ip.42.pl/raw').read()
except:
return 'Error getting WAN IP Address!'
# Get LAN IP address for either etho or wlan
def get_lan_ip_addr(self, ifname):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
except:
return 'Error! Unable to get LAN IP address :('
# Get default gateway
def get_default_gateway(self):
with open("/proc/net/route") as fh:
for line in fh:
fields = line.strip().split()
if fields[1] != '00000000' or not int(fields[3], 16) and 2:
continue
return socket.inet_ntoa(struct.pack("<L", int(fields[2], 16)))
# Get whois response
def get_whois(self, ip):
results = []
if self.is_tool_installed('whois') is False:
if self._is_user_root():
self.install_tool('whois')
else:
return results
desc = ['netname:', 'descr:', 'country:', 'role:']
p = os.popen('whois ' + ip)
for line in p:
for item in desc:
if line[0:len(item)] == item:
results.append(line[len(item):].strip())
return results
# Check tool is installed
def is_tool_installed(self, name):
try:
devnull = open(os.devnull)
subprocess.Popen([name],
stdout=devnull,
stderr=devnull).communicate()
except OSError as e:
if e.errno == os.errno.ENOENT:
return False
return True
# Install Whois
def install_tool(self, name):
os.popen('sudo apt-get install -y -qq %s' % name, 'w', 1)
# Discover other devices on the network
def get_arp_info(self):
import re
devices = []
pid = Popen(["arp"], stdout=PIPE)
s = pid.communicate()[0]
for item in s.split('\n'):
devices.append("%s" % item.strip())
return devices
# Get complete system information
def get_system_info(self):
try:
root_user = self._is_user_root()
arp_info = self.get_arp_info()
cpu_info = self.get_cpu_info()
disk_info = self.get_disk_info()
ram_info = self.get_ram_info()
networks_info = self.get_networks_info()
whois_info = self.get_whois(self.get_wan_ip_addr())
disk_info_txt = '\nStorage:'
networks_info_txt = ''
arp_info_txt = '\nNetwork Devices:\n'
if root_user:
networks_info_txt = '\nPrevious Networks:\n'
hostname = self.get_hostname()
username = self.get_username()
(os_platform,
distname,
dist_version,
id,
system,
node,
release,
version,
machine,
processor) = self.get_platform_info()
for item in disk_info:
disk_info_txt = disk_info_txt + '\
\n\t\t Path: %s\n \
Total: %sGB\n \
Used: %sGB\n \
Free: %sGB\n' % (
item.path,
item.total / (1024**3),
item.used / (1024**3),
item.free / (1024**3))
if root_user:
for network in networks_info:
networks_info_txt = networks_info_txt + network
for device in arp_info:
arp_info_txt = arp_info_txt + '\t\t%s\n' % device
return '\nSoftware:\n \
Username: %s\n \
Hostname: %s\n \
Platform: %s\n \
Distribution: %s\n \
Dist. Version: %s\n \
System: %s\n \
Node: %s\n \
Release: %s\n \
Version: %s\n \
Machine: %s\n \
Processor: %s\n \
\nCPU:\n \
Model: %s\n \
Cores: %s\n \
Temp: %s\n \
Hardware: %s\n \
Revision: %s\n \
Serial number: %s\n \
\nMemory:\n \
Total: %sMB\n \
Used: %sMB\n \
Free: %sMB\n \
%s \
\nNetwork:\n \
LAN IP Address:\n \
\teth0: %s\n \
\twlan0: %s\n \
Gateway IP Address: %s\n \
WAN IP Address: %s\n \
Whois:\n \
\tnetname: %s\n \
\trole: %s\n \
\tdescr: %s\n \
\tcountry: %s\n \
%s \
%s' % (
username,
hostname,
os_platform,
distname,
dist_version,
system,
node,
release,
version,
machine,
processor,
cpu_info.model,
cpu_info.cores,
cpu_info.temp,
cpu_info.hardware,
cpu_info.revision,
cpu_info.serial,
int(ram_info.total) / 1024,
int(ram_info.used) / 1024,
int(ram_info.free) / 1024,
disk_info_txt,
self.get_lan_ip_addr('eth0'),
self.get_lan_ip_addr('wlan0'),
self.get_default_gateway(),
self.get_wan_ip_addr(),
whois_info[0],
whois_info[3],
whois_info[1],
whois_info[2],
networks_info_txt,
arp_info_txt)
except:
return 'Error! Unable to get system informtaion :('
# Check if running stand-alone or imported
if __name__ == '__main__':
import system_info
si = SystemInfo()
info = si.get_system_info()
print info
Output:
sudo python system_info.py
Software:
Username: root
Hostname: prb-glow
Plantform: Linux-4.9.35+-armv6l-with-debian-8.0
Distribution: debian
Dist. Version: 8.0
System: Linux
Node: prb-glow
Release: 4.9.35+
Version: #1014 Fri Jun 30 14:34:49 BST 2017
Machine: armv61
Processor:
CPU:
Model: ARMv6-compatible processor rev 7 (v61)
Cores: 1
Temp: 41.2
Hardware: BCM2835
Revision: 9000c1
Serial Number: 0000000009f23301
Memory:
Total: 370MB
Used: 46MB
Free: 324MB
Storage:
Path: /root/
Total: 7GB
Used: 1GB
Free: 5GB
Network:
LAN IP Address:
eth0: Error! Unable to get LAN IP Address : (
wlan0: 192.168.1.29
Gateway IP Address: 192.168.1.1
WAN IP Address: 82.27.170.62
Whois:
netname: VMCBBUK
role: Virgin Media Network Management Centre
descr: NORTHFIELDS
country: GB
Previous Networks:
ctrl_interface: DIR=/var/run/wpa_supplicant GROUP=netdev
update_config: 1
network {
ssid: "PRB WLAN"
psk: "PASSWORD HERE"
proto: WPA2
key_mgmt: WPA-PSK
}
Network Devices:
Address HWtype HWAddress Flags Mask Iface
192.168.1.10 ether b8:27:eb:5c:57:ff C wlan0
192.168.1.17 ether 00:16:ea:5c:c6:10 C wlan0
192.168.1.1 ether a0:21:b7:23:46:b3 C wlan0
192.168.1.11 ether b8:27:eb:ad:c0:01 C wlan0
