From: Stefan Pampel Date: Sun, 21 Nov 2010 18:44:44 +0000 (+0100) Subject: Initial import of python components. X-Git-Tag: v0.2~13^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5b1919aeb44ea8dee1bcf65fcad4028639503907;p=oddments%2Ffireinfo.git Initial import of python components. --- diff --git a/fireinfo/cpu.py b/fireinfo/cpu.py new file mode 100644 index 0000000..267f634 --- /dev/null +++ b/fireinfo/cpu.py @@ -0,0 +1,69 @@ +#!/usr/bin/python + +import _fireinfo + + +class CPU(object): + __info = _fireinfo.cpuinfo() + + @property + def bogomips(self): + return float(self.__info["bogomips"]) + + @property + def model(self): + return int(self.__info["model"]) + + @property + def vendor(self): + return self.__info["vendor"] + + @property + def stepping(self): + return int(self.__info["stepping"]) + + @property + def flags(self): + return self.__info["flags"].split() + + @property + def speed(self): + mhz = float(self.__info["mhz"]) + return round(mhz) + + @property + def modes(self): + return self.__info.get("modes", []) + + @property + def hypervisor(self): + return self.__info["hypervisor"] + + @property + def virtype(self): + return self.__info["virtype"] + + @property + def family(self): + return int(self.__info["family"]) + + @property + def count(self): + return int(self.__info["ncpus"]) + + + +if __name__ == "__main__": + c = CPU(0) + + print "Vendor:", c.vendor + print "Model:", c.model + print "Stepping:", c.stepping + print "Flags:", c.flags + print "Bogomips:", c.bogomips + print "Speed:", c.speed + print "Modes:", c.modes + print "Hypervisor:", c.hypervisor + print "Virtype:", c.virtype + print "Family:", c.family + print "Count:", c.count diff --git a/fireinfo/device.py b/fireinfo/device.py new file mode 100644 index 0000000..9724f6d --- /dev/null +++ b/fireinfo/device.py @@ -0,0 +1,57 @@ +import os +import string + + +class Device(object): + def __init__(self, path): + self.path=path + self._uevent={} + with open(os.path.join(path, "uevent")) as f: + for line in f.readlines(): + key, val = line.split("=") + self._uevent[key]=val.rstrip().lower() + + @property + def driver(self): + return self._uevent.get("DRIVER", None) + + +class PCIDevice(Device): + subsystem = "pci" + + @property + def model(self): + return self._uevent['PCI_ID'].split(":")[1] + + @property + def vendor(self): + return self._uevent['PCI_ID'].split(":")[0] + + @property + def deviceclass(self): + return self._uevent['PCI_CLASS'] + + +class USBDevice(Device): + subsystem = "usb" + + def pad(self, s): + while len(s) < 4: + s = "0"+s + return s + + + @property + def vendor(self): + return self.pad(self._uevent['PRODUCT'].split("/")[0]) + + @property + def model(self): + return self.pad(self._uevent['PRODUCT'].split("/")[1]) + + @property + def deviceclass(self): + return self._uevent.get("INTERFACE", None) + + + diff --git a/fireinfo/system.py b/fireinfo/system.py new file mode 100644 index 0000000..724b328 --- /dev/null +++ b/fireinfo/system.py @@ -0,0 +1,140 @@ +#!/usr/bin/python + + +import json +import os +import string + +import cpu +import device + +class System(object): + + def __init__(self): + # find all devices + self.devices = [] + self.scan() + self.cpu = cpu.CPU() + + def profile(self): + p = { + "public_id" : self.public_id, + "private_id" : self.private_id, + + "arch" : self.arch, + "language" : self.language, + "release" : self.release, + "memory" : self.memory, + "kernel" : self.kernel, + "root_size" : self.root_size, + "devices" : [], + + } + + for device in self.devices: + p["devices"].append({ + "subsystem" : device.subsystem.lower(), + "vendor" : device.vendor.lower(), + "model" : device.model.lower(), + "deviceclass" : device.deviceclass + }) + + p["cpu"] = { + "vendor" : self.cpu.vendor, + "model" : self.cpu.model, + "stepping" : self.cpu.stepping, + "flags" : self.cpu.flags, + "bogomips" : self.cpu.bogomips, + "speed" : self.cpu.speed, + "modes" : self.cpu.modes, + "hypervisor" : self.cpu.hypervisor, + "virtype" : self.cpu.virtype, + "family" : self.cpu.family, + "count" : self.cpu.count + } + + return json.dumps(p) + + + @property + def arch(self): + return os.uname()[4] + + @property + def public_id(self): + return "0"*40 + + @property + def private_id(self): + return "1"*40 + + @property + def language(self): + with open("/var/ipfire/main/settings", "r") as f: + for line in f.readlines(): + key, val = line.split("=", 1) + if key=="LANGUAGE": + return val.strip() + + @property + def release(self): + with open("/etc/system-release", "r") as f: + return f.read().strip() + + @property + def memory(self): + with open("/proc/meminfo", "r") as f: + firstline = f.readline().strip() + return firstline.split()[1] + + @property + def kernel(self): + return os.uname()[2] + + @property + def root_disk(self): + with open("/etc/mtab", "r") as f: + dev, mountpoint, rest = f.readline().split(" ",2) + if mountpoint == "/": + dev = dev[5:] + # cut off all digits at end of string + while dev[-1] in string.digits: + dev = dev[:-1] + return dev + + @property + def root_size(self): + path="/sys/block/%s/size" %self.root_disk + if not os.path.exists(path): + return + with open(path, "r") as f: + return int(f.readline())*512/1024 + + def scan(self): + toscan = (("/sys/bus/pci/devices", device.PCIDevice), + ("/sys/bus/usb/devices", device.USBDevice)) + for path, cls in toscan: + dirlist = os.listdir(path) + for dir in dirlist: + self.devices.append(cls(os.path.join(path, dir))) + + + + + +if __name__ == "__main__": + s=System() + print s.arch + print s.language + print s.release + print s.memory + print s.kernel + print s.root_disk + print s.root_size + print "------------\n", s.devices, "\n------------\n" + print s.profile() + + import urllib2 + import urllib + r = urllib2.Request("http://192.168.10.101:9001/send/%s" %s.public_id, data = urllib.urlencode({"profile" : s.profile()})) + urllib2.urlopen(r) \ No newline at end of file