diff options
Diffstat (limited to 'src/fbgui/sysinfo.cpp')
-rw-r--r-- | src/fbgui/sysinfo.cpp | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/src/fbgui/sysinfo.cpp b/src/fbgui/sysinfo.cpp new file mode 100644 index 0000000..7d6ac92 --- /dev/null +++ b/src/fbgui/sysinfo.cpp @@ -0,0 +1,180 @@ +#include "sysinfo.h" + +// ------------------------------------------------------------------------------------------------ +/** + * A empty constructor. + */ +SysInfo::SysInfo() { +} +// ------------------------------------------------------------------------------------------------ +/** + * A empty destructor. + */ +SysInfo::~SysInfo() { +} +// ------------------------------------------------------------------------------------------------ +/** + * This method returns system informations. + * + * This method returns system informations according to the parameter. + * This method can be called from the JavascriptInterface class with the + * method JavascriptInterface::getSysInfo(const QString& info). + * + * @param infoName + * Is of type QString. Defines which method will be called. Possible values are: + * - mbserial + * - usb + * + * @return QString + * the output of the called method or "info_error" if an error occurred + * (e. g. invalid parameter). + * + * @see JavascriptInterface::getSysInfo(const QString& info) + */ +const QString SysInfo::getInfo(const QString& infoName) { + qxtLog->debug() << "[sysinfo] requested " << infoName; + if (infoName == QString("mbserial")) + return getMainboardSerial(); + else if (infoName == QString("usb")) + return getUsbVendorIdProductIdSerialNumber(); + /* unknown code */ + qxtLog->debug() << "[sysinfo] unknown requested"; + return "info_error"; +} +// ----------------------------------------------------------------------------------------------- +// Mainboard / USB Infos using libsysfs +// ----------------------------------------------------------------------------------------------- +/** + * This method returns the Mainboard Serial Number. + * + * This method returns the Mainboard Serial Number. The mainboard serial + * number is used as part of the data to compute the hardwarehash of the + * client machine. To call this method use the + * SysInfo::getInfo(const QString& infoName) method with + * the parameter "mbserial" + * + * @return QString + * the mainboard serial or "mainboard_serial_error" if an error occurred. + * + * @see fbgui::generatePOSTData() + * @see SysInfo::getInfo(const QString& infoName) + */ +const QString SysInfo::getMainboardSerial() { + QString out = ""; + struct sysfs_class_device *class_device = sysfs_open_class_device("dmi", + "id"); + struct dlist *attrlist = sysfs_get_classdev_attributes(class_device); + struct sysfs_device *device = sysfs_get_classdev_device(class_device); + + if (attrlist != NULL) { + struct sysfs_attribute *attr = NULL; + dlist_for_each_data(attrlist, attr, struct sysfs_attribute) { + QVariantMap a; + if(QString(attr->name) == QString("board_serial")) { + out = QString(attr->value); + } + } + qxtLog->debug() << "[sysinfo] Mainboard Serial: " + out; + return out; + } + qxtLog->debug() + << "[sysinfo] Mainboard Serial: attrlist is null! return: mainboard_serial_error"; + sysfs_close_class_device(class_device); + return "mainboard_serial_error"; +} +// ------------------------------------------------------------------------------------------------ +/** + * This method returns inforamtions about connected usb devices. + * + * This method returns the inforamtions about connected usb devices + * as a json formated string. + * Those informations are: + * - the vendor + * - the vendorID + * - the product + * - the productID + * - the manufacturer + * - the serial number + * To call this method use the SysInfo::getInfo(const QString& infoName) + * method with the parameter "usb" + * + * @return QString + * all above described informations as a json formated string or "error" + * if an error occurred. + * + * @see SysInfo::getInfo(const QString& infoName) + */ +const QString SysInfo::getUsbVendorIdProductIdSerialNumber() { + + QString tag = "[sysinfo] Usb Serial:"; + QString out = ""; + QVariantList list; + + libusb_device **devs; + libusb_context *ctx = NULL; //a libusb session + ssize_t cnt; //holding number of devices in list + int r = 1; + r = libusb_init(&ctx); + if (r < 0) { + qxtLog->debug() << tag + "failed to initialise libusb"; + return "error"; + } + cnt = libusb_get_device_list(ctx, &devs); //get the list of devices + if (cnt < 0) { + qxtLog->debug() << tag + "Get Device Error"; //there was an error + } + qxtLog->debug() << tag + cnt + " Devices in list."; //print total number of usb devices + ssize_t i; //for iterating through the list# + for (i = 0; i < cnt; i++) { + //printdev(devs[i]); //print specs of this device + QVariantMap infos; + libusb_device *dev = devs[i]; + libusb_device_descriptor desc; + int re = libusb_get_device_descriptor(dev, &desc); + if (re < 0) { + qxtLog->debug() << tag + "failed to get device descriptor"; + return "error"; + } + infos.insert("vendorId", desc.idVendor); + infos.insert("productId", desc.idProduct); + unsigned char string[256]; + libusb_device_handle *handle; + re = libusb_open(dev, &handle); + if (re != 0) { + qxtLog->debug() << tag + "failed to get handler / fail to open device"; + return "error"; + } + re = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, + string, sizeof(string)); + if (re < 0) { + qxtLog->debug() << tag + "failed to get SerialNumber"; + return "error"; + } + infos.insert("serialnumber", QString((const char *) string)); + re = libusb_get_string_descriptor_ascii(handle, desc.iProduct, string, + sizeof(string)); + if (re < 0) { + qxtLog->debug() << tag + "failed to get Product"; + return "error"; + } + infos.insert("product", QString((const char *) string)); + re = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, + string, sizeof(string)); + if (re < 0) { + qxtLog->debug() << tag + "failed to get Product"; + return "error"; + } + infos.insert("manuacturer", QString((const char *) string)); + + list << infos; + libusb_close(handle); + } + libusb_free_device_list(devs, 1); //free the list, unref the devices in it + libusb_exit(ctx); //close the session + + /* + QByteArray json = serializer.serialize(list); + qxtLog->debug() << tag + "json object: " + json; + return json; + */ +} |