#include "sysinfo.h"
#include <log4cxx/logger.h>
#include "qlog4cxx.h"
using namespace log4cxx;
using namespace log4cxx::helpers;
LoggerPtr siLogger(Logger::getLogger("fbgui.sysinfo"));
// ------------------------------------------------------------------------------------------------
/**
* 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) {
if (infoName == QString("mbserial"))
return getMainboardSerial();
else if (infoName == QString("usb"))
return getUsbVendorIdProductIdSerialNumber();
else if (infoName == QString("mac"))
return getMACAddress();
/* unknown code */
LOG4CXX_DEBUG(siLogger, "unknown requested");
return "info_error";
}
const QString SysInfo::getMACAddress() {
// Returns MAC address of eth0 for now
LOG4CXX_DEBUG(siLogger, "Requesting MAC of: " << gInterfaceName << " ...");
QNetworkInterface qni = QNetworkInterface::interfaceFromName(gInterfaceName);
if (!qni.isValid()) {
LOG4CXX_DEBUG(siLogger, "No valid interface with name: " << gInterfaceName);
return "";
}
return qni.hardwareAddress();
}
// -----------------------------------------------------------------------------------------------
// 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() {
LOG4CXX_DEBUG(siLogger, "Requesting Mainboard Serial...");
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);
if (out.endsWith("\n"))
out.chop(1);
}
}
LOG4CXX_DEBUG(siLogger, "Mainboard Serial: " + out);
return out;
}
LOG4CXX_DEBUG(siLogger, "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 = "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) {
LOG4CXX_DEBUG(siLogger, tag + "failed to initialise libusb");
return "error";
}
cnt = libusb_get_device_list(ctx, &devs); //get the list of devices
if (cnt < 0) {
LOG4CXX_DEBUG(siLogger, tag + "Get Device Error"); //there was an error
}
LOG4CXX_DEBUG(siLogger, 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_config_descriptor *config;
int cr = 1;
cr = libusb_get_config_descriptor(dev, 1, &config);
if (cr < 0) {
LOG4CXX_DEBUG(siLogger, "Couldn't open config desc, code: " << cr);
}
//LOG4CXX_DEBUG(siLogger, "bmAttribute: " << config->bmAttributes);
libusb_device_descriptor desc;
int re = libusb_get_device_descriptor(dev, &desc);
if (re < 0) {
LOG4CXX_DEBUG(siLogger, tag + "failed to get device descriptor");
return "error";
}
infos.insert("vendorId", desc.idVendor);
//LOG4CXX_DEBUG(siLogger, "idVendor: " << infos.value("vendorId").toString());
infos.insert("productId", desc.idProduct);
unsigned char string[256];
libusb_device_handle *handle;
re = libusb_open(dev, &handle);
if (re != 0) {
LOG4CXX_DEBUG(siLogger, 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) {
LOG4CXX_DEBUG(siLogger, tag + "failed to get SerialNumber");
return "error";
}
//LOG4CXX_DEBUG(siLogger, "SN: " << string);
infos.insert("serialnumber", QString((const char *) string));
re = libusb_get_string_descriptor_ascii(handle, desc.iProduct, string,
sizeof(string));
if (re < 0) {
LOG4CXX_DEBUG(siLogger, 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) {
LOG4CXX_DEBUG(siLogger, tag + "failed to get Product");
return "error";
}
infos.insert("manuacturer", QString((const char *) string));
list << infos;
/*
for (int i = 0; i < list.size(); ++i) {
LOG4CXX_DEBUG(siLogger, "list: " << list[i].toString());
}*/
libusb_close(handle);
}
libusb_free_device_list(devs, 1); //free the list, unref the devices in it
libusb_exit(ctx); //close the session
}