In looking at the code I realized that the last of the HAL depenencies were removed with this patch. So, I'm pushing an updated patch that contains none of the HAL code in it.
Darryl L. Pierce
2010-Apr-26 20:49 UTC
[Ovirt-devel] [PATCH matahari] Created the NetworkDevice agent.
Created a new class to represent network interface devices, named NetworkDeviceAgent. Removed the NICWrapper class, as well as the final vestiges of HAL dependencies. Signed-off-by: Darryl L. Pierce <dpierce at redhat.com> --- configure.ac | 3 - src/Makefile.am | 15 +-- src/hal.cpp | 83 -------------- src/hal.h | 24 ---- src/host.cpp | 26 +++-- src/host.h | 4 +- src/linux_platform.cpp | 70 +++++++++++ src/linux_platform.h | 4 + src/main.cpp | 1 - src/networkdevice.cpp | 49 ++++++++ src/networkdevice.h | 52 +++++++++ src/nic.cpp | 297 ------------------------------------------------ src/nic.h | 95 --------------- src/platform.h | 5 + src/processors.h | 5 + src/schema.xml | 22 +--- 16 files changed, 216 insertions(+), 539 deletions(-) delete mode 100644 src/hal.cpp delete mode 100644 src/hal.h create mode 100644 src/networkdevice.cpp create mode 100644 src/networkdevice.h delete mode 100644 src/nic.cpp delete mode 100644 src/nic.h diff --git a/configure.ac b/configure.ac index c51c23e..6666c95 100644 --- a/configure.ac +++ b/configure.ac @@ -1,6 +1,5 @@ # Process this file with autoconf to produce a configure script. AC_INIT(matahari, 0.0.4) -AC_CONFIG_SRCDIR([src/nic.h]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE @@ -15,8 +14,6 @@ AC_HEADER_STDBOOL AC_TYPE_UINT32_T # Checks for libraries. -PKG_CHECK_MODULES(DBUS, dbus-1 >= 1.2.12) -PKG_CHECK_MODULES(HAL, hal >= 0.5.12) PKG_CHECK_MODULES(LIBVIRT, libvirt >= 0.6.2) PKG_CHECK_MODULES(PCRE, libpcre >= 7.8) PKG_CHECK_MODULES(UDEV, libudev >= 145) diff --git a/src/Makefile.am b/src/Makefile.am index e4f394d..aed9e19 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,14 +1,13 @@ -INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/matahari $(HAL_CFLAGS) $(LIBVIRT_CFLAGS) $(PCRE_CFLAGS) $(UDEV_CFLAGS) +INCLUDES = -I$(top_srcdir)/src/qmf/com/redhat/matahari $(LIBVIRT_CFLAGS) $(PCRE_CFLAGS) $(UDEV_CFLAGS) sbin_PROGRAMS = matahari first = qmf/com/redhat/matahari/Host.cpp generated_file_list = \ - qmf/com/redhat/matahari/ArgsNICIdentify_nic.h \ qmf/com/redhat/matahari/Host.h \ - qmf/com/redhat/matahari/NIC.cpp \ - qmf/com/redhat/matahari/NIC.h \ + qmf/com/redhat/matahari/NetworkDevice.cpp \ + qmf/com/redhat/matahari/NetworkDevice.h \ qmf/com/redhat/matahari/Package.cpp \ qmf/com/redhat/matahari/Package.h \ qmf/com/redhat/matahari/Processors.cpp \ @@ -17,15 +16,13 @@ generated_file_list = \ nodist_matahari_SOURCES = $(generated_file_list) $(first) matahari_SOURCES = \ - hal.cpp \ - hal.h \ host.cpp \ host.h \ linux_platform.cpp \ linux_platform.h \ main.cpp \ - nic.cpp \ - nic.h \ + networkdevice.cpp \ + networkdevice.h \ platform.cpp \ platform.h \ processors.cpp \ @@ -41,6 +38,6 @@ CLEANFILES = $(generated_file_list) $(first) matahari_CPPFLAGS = -fno-strict-aliasing matahari_LDFLAGS = -L/usr/local/lib -matahari_LDADD = -lqmf $(HAL_LIBS) $(LIBVIRT_LIBS) $(PCRE_LIBS) $(UDEV_LIBS) +matahari_LDADD = -lqmf $(LIBVIRT_LIBS) $(PCRE_LIBS) $(UDEV_LIBS) dist_pkgdata_DATA = schema.xml diff --git a/src/hal.cpp b/src/hal.cpp deleted file mode 100644 index 66c1464..0000000 --- a/src/hal.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* hal_support.c - Copyright (C) 2008 Red Hat, Inc. - * Written by Darryl L. Pierce <dpierce at redhat.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. A copy of the GNU General Public License is - * also available at http://www.gnu.org/copyleft/gpl.html. - */ - -#include "hal.h" -#include <cstdio> -#include <stdexcept> - -DBusConnection *dbus_connection; -DBusError dbus_error; - -LibHalContext * -get_hal_ctx(void) -{ - LibHalContext *result = NULL; - - LibHalContext *ctx; - - ctx = libhal_ctx_new(); - if (ctx != NULL) { - dbus_error_init(&dbus_error); - dbus_connection = dbus_bus_get(DBUS_BUS_SYSTEM, &dbus_error); - - if (!dbus_error_is_set(&dbus_error)) { - libhal_ctx_set_dbus_connection(ctx, dbus_connection); - - if (libhal_ctx_init(ctx, &dbus_error)) { - result = ctx; - } else { - fprintf(stderr, - "Failed to initial libhal context: %s : %s\n", - dbus_error.name, dbus_error.message); - } - } else { - fprintf(stderr, "Unable to connect to system bus: %s : %s\n", - dbus_error.name, dbus_error.message); - dbus_error_free(&dbus_error); - } - } else { - fprintf(stderr, "Unable to initialize HAL context.\n"); - } - - return result; -} - -void put_hal_ctx(LibHalContext *hal_ctx) -{ - libhal_ctx_shutdown(hal_ctx, NULL); - libhal_ctx_free(hal_ctx); -} - -char* get_uuid(LibHalContext *hal_ctx) -{ - const char *udi = "/org/freedesktop/Hal/devices/computer"; - const char *key = "system.hardware.uuid"; - char *value = NULL; - - int type = libhal_device_get_property_type(hal_ctx, udi, key, &dbus_error); - if (type == LIBHAL_PROPERTY_TYPE_STRING) { - value = libhal_device_get_property_string(hal_ctx, - udi, - key, - &dbus_error); - } - if (!value) - throw std::runtime_error("Unable to get host UUID"); - return value; -} diff --git a/src/hal.h b/src/hal.h deleted file mode 100644 index 03dd909..0000000 --- a/src/hal.h +++ /dev/null @@ -1,24 +0,0 @@ -/* hal.h - Copyright (C) 2009 Red Hat, Inc. - * Written by Arjun Roy <arroy at redhat.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. A copy of the GNU General Public License is - * also available at http://www.gnu.org/copyleft/gpl.html. - */ - -#include <hal/libhal.h> - -LibHalContext *get_hal_ctx(void); -void put_hal_ctx(LibHalContext *hal_ctx); -char* get_uuid(LibHalContext *hal_ctx); diff --git a/src/host.cpp b/src/host.cpp index 11c5a8f..34d4550 100644 --- a/src/host.cpp +++ b/src/host.cpp @@ -25,6 +25,7 @@ #include <sys/utsname.h> #include "host.h" +#include "platform.h" #include "qmf/com/redhat/matahari/Host.h" using namespace qpid::management; @@ -41,6 +42,14 @@ HostAgent::setup(ManagementAgent* agent) // discover the aspects of the host processors.setup(agent, this); + networkdevices = Platform::instance()->get_network_devices(); + + for(vector<NetworkDeviceAgent>::iterator iter = networkdevices.begin(); + iter != networkdevices.end(); + iter++) + { + iter->setup(agent, this); + } struct utsname details; string uuid = "Unknown"; @@ -94,20 +103,17 @@ HostAgent::setup(ManagementAgent* agent) management_object->set_arch(architecture); management_object->set_memory(memory); management_object->set_beeping(beeping); - - NICWrapper::fillNICInfo(this->nics, agent); - - // setup the nic objects - for(vector<NICWrapper*>::iterator iter = nics.begin(); - iter != nics.end(); - iter++) - { - (*iter)->setupQMFObject(agent, this); - } } void HostAgent::update(void) { processors.update(); + + for(vector<NetworkDeviceAgent>::iterator iter = networkdevices.begin(); + iter != networkdevices.end(); + iter++) + { + iter->update(); + } } diff --git a/src/host.h b/src/host.h index ba5a1ed..d2da776 100644 --- a/src/host.h +++ b/src/host.h @@ -26,7 +26,7 @@ #include "qmf/com/redhat/matahari/Host.h" -#include "nic.h" +#include "networkdevice.h" #include "processors.h" using namespace qpid::management; @@ -39,7 +39,7 @@ class HostAgent : public Manageable private: qmf::com::redhat::matahari::Host* management_object; ProcessorsAgent processors; - vector<NICWrapper*> nics; + vector<NetworkDeviceAgent> networkdevices; public: HostAgent() {} diff --git a/src/linux_platform.cpp b/src/linux_platform.cpp index 26418f5..fbcfdb9 100644 --- a/src/linux_platform.cpp +++ b/src/linux_platform.cpp @@ -18,9 +18,14 @@ */ #include <fstream> +#include <iomanip> #include <iostream> +#include <dirent.h> +#include <net/if.h> #include <pcre.h> #include <stdexcept> +#include <string.h> +#include <sys/ioctl.h> // TODO remove this wrapper once rhbz#583747 is fixed extern "C" { @@ -115,3 +120,68 @@ LinuxPlatform::get_load_average() const return load_average; } + +vector<NetworkDeviceAgent> +LinuxPlatform::get_network_devices() const +{ + vector<NetworkDeviceAgent> result; + + DIR* entries = opendir("/sys/class/net"); + + if(entries) + { + struct udev* udev = udev_new(); + struct dirent* entry; + + while(entry = (readdir(entries))) + { + string ifname = string(entry->d_name); + if(ifname != "." && ifname != "..") + { + string fullpath = "/sys/class/net/" + ifname; + struct udev_device* device = udev_device_new_from_syspath(udev, + fullpath.c_str()); + + if(udev_device_get_property_value(device, "ID_BUS")) + { + int sock = socket(AF_INET, SOCK_DGRAM, 0); + struct ifreq ifr; + string vendor = string(udev_device_get_property_value(device, "ID_VENDOR_FROM_DATABASE")); + string model = string(udev_device_get_property_value(device, "ID_MODEL_FROM_DATABASE")); + + if(sock >= 0) + { + ifr.ifr_addr.sa_family = AF_INET; + strncpy(ifr.ifr_name, ifname.c_str(), IFNAMSIZ - 1); + + if(!ioctl(sock, SIOCGIFHWADDR, &ifr)) + { + char macaddr[256]; + + sprintf(macaddr, + "%.2X:%.2X:%.2X:%.2X:%.2X:%.2X", + (unsigned char )ifr.ifr_hwaddr.sa_data[0], + (unsigned char )ifr.ifr_hwaddr.sa_data[1], + (unsigned char )ifr.ifr_hwaddr.sa_data[2], + (unsigned char )ifr.ifr_hwaddr.sa_data[3], + (unsigned char )ifr.ifr_hwaddr.sa_data[4], + (unsigned char )ifr.ifr_hwaddr.sa_data[5]); + + result.push_back(NetworkDeviceAgent(ifname, + vendor, + model, + string(macaddr))); + } + } + + udev_device_unref(device); + } + } + } + + udev_unref(udev); + closedir(entries); + } + + return result; +} diff --git a/src/linux_platform.h b/src/linux_platform.h index 13116df..095bc08 100644 --- a/src/linux_platform.h +++ b/src/linux_platform.h @@ -21,7 +21,10 @@ */ #include <string> +#include <vector> + #include "platform.h" +#include "networkdevice.h" class LinuxPlatform : public Platform { @@ -30,6 +33,7 @@ class LinuxPlatform : public Platform virtual ~LinuxPlatform() {} virtual double get_load_average() const; + virtual vector<NetworkDeviceAgent> get_network_devices() const; }; #endif diff --git a/src/main.cpp b/src/main.cpp index 8493864..5ab3ac2 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,7 +31,6 @@ #include <getopt.h> -#include "hal.h" #include "host.h" #include "qmf/com/redhat/matahari/Package.h" diff --git a/src/networkdevice.cpp b/src/networkdevice.cpp new file mode 100644 index 0000000..5e30e33 --- /dev/null +++ b/src/networkdevice.cpp @@ -0,0 +1,49 @@ +/* networkingdevice.cpp - Copyright (C) 2010 Red Hat, Inc. + * Written by Darryl L. Pierce <dpierce at redhat.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. A copy of the GNU General Public License is + * also available at http://www.gnu.org/copyleft/gpl.html. + */ + +#include <qpid/agent/ManagementAgent.h> +#include <qpid/management/Manageable.h> + +#include "networkdevice.h" + +namespace _qmf = qmf::com::redhat::matahari; + +NetworkDeviceAgent::NetworkDeviceAgent(string ifname, string vendor, string model, string macaddr) + :ifname(ifname) + ,vendor(vendor) + ,model(model) + ,macaddr(macaddr) +{} + +void +NetworkDeviceAgent::setup(ManagementAgent* agent, Manageable* parent) +{ + management_object = new _qmf::NetworkDevice(agent, this, parent); + agent->addObject(management_object); + + management_object->set_interface(ifname); + management_object->set_vendor(vendor); + management_object->set_model(model); + management_object->set_mac_address(macaddr); +} + +void +NetworkDeviceAgent::update() const +{ +} diff --git a/src/networkdevice.h b/src/networkdevice.h new file mode 100644 index 0000000..3884b22 --- /dev/null +++ b/src/networkdevice.h @@ -0,0 +1,52 @@ +#ifndef __NETWORKDEVICE_H +#define __NETWORKDEVICE_H + +/* networkdevice.h - Copyright (C) 2010 Red Hat, Inc. + * Written by Darryl L. Pierce <dpierce at redhat.com> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301, USA. A copy of the GNU General Public License is + * also available at http://www.gnu.org/copyleft/gpl.html. + */ + +#include <qpid/management/Manageable.h> + +#include "qmf/com/redhat/matahari/NetworkDevice.h" + +using namespace qpid::management; +using namespace std; + +class NetworkDeviceAgent : public Manageable +{ + private: + qmf::com::redhat::matahari::NetworkDevice* management_object; + + string ifname; + string vendor; + string model; + string macaddr; + + public: + NetworkDeviceAgent(string ifname, string vendor, string model, string macaddr); + virtual ~NetworkDeviceAgent() {} + + string get_mac_address() const { return macaddr; } + + ManagementObject* GetManagementObject(void) const { return management_object; } + + void setup(ManagementAgent* agent, Manageable* parent); + void update() const; +}; + +#endif diff --git a/src/nic.cpp b/src/nic.cpp deleted file mode 100644 index 040ca67..0000000 --- a/src/nic.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* nic.cpp - Copyright (C) 2009 Red Hat, Inc. - * Written by Arjun Roy <arroy at redhat.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. A copy of the GNU General Public License is - * also available at http://www.gnu.org/copyleft/gpl.html. - */ - -#include <iostream> -#include <string> -#include <sstream> -#include <vector> -#include <stdexcept> - -#include <hal/libhal.h> -#include <cstdio> -#include <sys/ioctl.h> -#include <sys/types.h> -#include <sys/socket.h> -#include <linux/types.h> -#include <linux/ethtool.h> -#include <linux/sockios.h> -#include <linux/if.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <errno.h> - -#include "nic.h" -#include "qmf/com/redhat/matahari/NIC.h" -#include "qmf/com/redhat/matahari/ArgsNICIdentify_nic.h" - -using namespace qpid::management; -using namespace std; - -using qpid::management::Manageable; - -namespace _qmf = qmf::com::redhat::matahari; - -extern DBusConnection *dbus_connection; -extern DBusError dbus_error; - -ostream &operator<<(ostream& output, const NICWrapper& nic) { - output << "NIC" << endl; - output << "Interface Name: " << nic.interfaceName << endl; - output << "MAC Address: " << nic.macaddr << endl; - output << "IP Address: " << nic.ipaddr << endl; - output << "Netmask: " << nic.netmask << endl; - output << "Broadcast: " << nic.broadcast << endl; - output << "Bandwidth: " << nic.bandwidth << endl; - return output; -} - -void NICWrapper::setupQMFObject(ManagementAgent *agent, Manageable *parent) -{ - mgmt_object = new _qmf::NIC(agent, this, parent); - agent->addObject(mgmt_object); - syncQMFObject(); -} - -void NICWrapper::cleanupQMFObject(void) -{ - mgmt_object->resourceDestroy(); -} - -void NICWrapper::syncQMFObject(void) -{ - mgmt_object->set_interface(interfaceName); - mgmt_object->set_macaddr(macaddr); - mgmt_object->set_ipaddr(ipaddr); - mgmt_object->set_netmask(netmask); - mgmt_object->set_broadcast(broadcast); - mgmt_object->set_bandwidth(bandwidth); -} - -NICWrapper *NICWrapper::getNIC(ManagementAgent *agent, - LibHalContext *hal_ctx, - char *nic_handle) -{ - // Used to get the data - char *macaddr_c; - char *interface_c; - int sock, ret; - struct ifreq ifr; - struct ethtool_cmd ecmd; - - // The data that we care about - NICWrapper *nic = NULL; - string macaddr; - string interface; - string ipaddr; - string netmask; - string broadcast; - int bandwidth; - - // Grab the MAC Address from libhal - macaddr_c = libhal_device_get_property_string(hal_ctx, - nic_handle, - "net.address", - &dbus_error); - // Or throw an exception if we could not find it. No cleanup yet. - if (!macaddr_c) - throw runtime_error("Could not get mac address for NIC"); - - // Grab the interface name from libhal or return cleanup and fail - interface_c = libhal_device_get_property_string(hal_ctx, - nic_handle, - "net.interface", - &dbus_error); - // Or cleanup the macaddr and return NULL. - if (!interface_c) { - libhal_free_string(macaddr_c); - throw runtime_error("Could not get interface name for nic"); - } - - // Open socket for running ioctls for getting rest of data - sock = socket(AF_INET, SOCK_DGRAM, 0); - if (sock >= 0) { - // Get the IP Address - ifr.ifr_addr.sa_family = AF_INET; - strncpy(ifr.ifr_name, interface_c, IFNAMSIZ - 1); - cout << interface_c << endl; - - ret = ioctl(sock, SIOCGIFADDR, &ifr); - if(ret == 0) { - struct sockaddr_in *addr = (struct sockaddr_in *) &ifr.ifr_addr; - cout << "ip_address = " << inet_ntoa(addr->sin_addr) << endl; - ipaddr = inet_ntoa(addr->sin_addr); - } - else { - perror("SIOCGIFADDR"); - ipaddr = "unable to determine"; - } - // Get the netmask - ret = ioctl(sock, SIOCGIFNETMASK, &ifr); - if(ret == 0 && strcmp("255.255.255.255", - inet_ntoa(((struct sockaddr_in *) &ifr.ifr_addr)->sin_addr))) { - - struct sockaddr_in *addr = (struct sockaddr_in *) &ifr.ifr_addr; - cout << "netmask = " << inet_ntoa(addr->sin_addr) << endl; - netmask = inet_ntoa(addr->sin_addr); - } - else { - perror("SIOCGIFNETMASK"); - netmask = "unable to determine"; - } - // Get the broadcast address - ret = ioctl(sock, SIOCGIFBRDADDR, &ifr); - if(ret == 0) { - struct sockaddr_in *addr = (struct sockaddr_in *) &ifr.ifr_addr; - cout << "broadcast = " << inet_ntoa(addr->sin_addr); - broadcast = inet_ntoa(addr->sin_addr); - } - else { - perror("SIOCGIFBRDADDR"); - broadcast = "unable to determine"; - } - // Get the bandwidth for this NIC - ecmd.cmd = ETHTOOL_GSET; - ifr.ifr_data = (caddr_t)&ecmd; - bandwidth = 10; - - // TODO: Error checking on this ioctl. For now, assume success - ret = ioctl(sock, SIOCETHTOOL, &ifr); - if (1) { - - if (ecmd.supported & SUPPORTED_10000baseT_Full) { - bandwidth = 10000; - } else if (ecmd.supported & SUPPORTED_2500baseX_Full) { - bandwidth = 2500; - } else if (ecmd.supported & (SUPPORTED_1000baseT_Half | - SUPPORTED_1000baseT_Full)) { - bandwidth = 1000; - } else if (ecmd.supported & (SUPPORTED_100baseT_Half | - SUPPORTED_100baseT_Full)) { - bandwidth = 100; - } else if (ecmd.supported & (SUPPORTED_10baseT_Half | - SUPPORTED_10baseT_Full)) { - bandwidth = 10; - } - } - else { - cout << "Unable to determine link speed, defaulting to 10" << endl; - } - // And we're done here - close(sock); - } - else { - /* Couldn't open socket, so cleanup and fail */ - libhal_free_string(interface_c); - libhal_free_string(macaddr_c); - throw runtime_error("Unable to open socket."); - } - // We have all the data. Create the NICWrapper instance - macaddr = macaddr_c; - interface = interface_c; - nic = new NICWrapper(interface, - macaddr, - ipaddr, - netmask, - broadcast, - bandwidth); - - // Free resources and return - libhal_free_string(interface_c); - libhal_free_string(macaddr_c); - return nic; -} - -/** - * void fillNICInfo(vector <NICWrapper*> &nics, - * ManagementAgent *agent, - * LibHalContext *hal_ctx) - * - * Takes in a vector of NICWrapper object pointers and populates it with - * NICs found in the system found by querying dbus and making other system - * calls. - */ -void NICWrapper::fillNICInfo(vector <NICWrapper*> &nics, - ManagementAgent *agent) -{ - LibHalContext* hal_ctx = get_hal_ctx(); - char **net_devices; - int num_results, i; - net_devices = libhal_find_device_by_capability(hal_ctx, - "net.80203", - &num_results, - &dbus_error); - if (!net_devices) - throw runtime_error("Error: Couldn't get NIC devices through libhal."); - - cout << "Found " << num_results << " NICs" << endl; - for (i = 0; i < num_results; i++) { - NICWrapper *nic; - char *nic_handle = net_devices[i]; - // If we couldn't read the info for a nic, free the list of devices - // and throw an error. Any devices added already will be cleaned up - // by the caller. - try { - nic = getNIC(agent, hal_ctx, nic_handle); - } - catch (...) { - libhal_free_string_array(net_devices); - throw; - } - // Add the NIC to our list - nics.push_back(nic); - } - // And we're all done. - libhal_free_string_array(net_devices); -} - -int NICWrapper::identifyNIC(int seconds) -{ - struct ethtool_value edata; - struct ifreq ifr; - int sock, ret; - - edata.cmd = ETHTOOL_PHYS_ID; - edata.data = seconds; // seconds of blink time - - strncpy(ifr.ifr_name, interfaceName.c_str(), IFNAMSIZ - 1); - ifr.ifr_data = (caddr_t)&edata; - - sock = socket(AF_INET, SOCK_DGRAM, 0); - ret = ioctl(sock, SIOCETHTOOL, &ifr); - close(sock); - - if (ret != 0) - ret = errno; - - return ret; -} - -Manageable::status_t -NICWrapper::ManagementMethod(uint32_t methodId, Args& args, string& text) -{ - switch (methodId) { - case _qmf::NIC::METHOD_IDENTIFY_NIC: - _qmf::ArgsNICIdentify_nic& ioArgs = (_qmf::ArgsNICIdentify_nic&) args; - int seconds = ioArgs.i_seconds; - ioArgs.o_ret = identifyNIC(seconds); - return STATUS_OK; - } - - return STATUS_NOT_IMPLEMENTED; -} diff --git a/src/nic.h b/src/nic.h deleted file mode 100644 index e0e5874..0000000 --- a/src/nic.h +++ /dev/null @@ -1,95 +0,0 @@ -/* nic.h - Copyright (C) 2009 Red Hat, Inc. - * Written by Arjun Roy <arroy at redhat.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, - * MA 02110-1301, USA. A copy of the GNU General Public License is - * also available at http://www.gnu.org/copyleft/gpl.html. - */ - -#include <qpid/management/Manageable.h> -#include <qpid/management/ManagementObject.h> -#include <qpid/agent/ManagementAgent.h> - -#include "qmf/com/redhat/matahari/NIC.h" -#include "hal.h" - -using namespace qpid::management; -using namespace std; - -using qpid::management::Manageable; - -class NICWrapper : public Manageable -{ - friend ostream& operator <<(ostream &output, const NICWrapper& nic); - friend class HostWrapper; - - // NIC Parameters - string interfaceName; - string macaddr; - string ipaddr; - string netmask; - string broadcast; - int bandwidth; - - // QMF related fields - ManagementAgent *agent; - qmf::com::redhat::matahari::NIC *mgmt_object; - - // Methods to put up / take down QMF Objects - void cleanupQMFObject(void); - void syncQMFObject(void); - - // Constructors and Destructor are private - NICWrapper() {} - NICWrapper(const NICWrapper&) {} - ~NICWrapper() {} - - NICWrapper(const string &interfaceName__, - const string &macaddr__, - const string &ipaddr__, - const string &netmask__, - const string &broadcast__, - int bandwidth__) { - interfaceName = interfaceName__; - macaddr = macaddr__; - ipaddr = ipaddr__; - netmask = netmask__; - broadcast = broadcast__; - bandwidth = bandwidth__; - } - - static NICWrapper *getNIC(ManagementAgent *agent, - LibHalContext *hal_ctx, - char *nic_handle); - - int identifyNIC(int seconds); -public: - - void setupQMFObject(ManagementAgent *agent, Manageable *parent); - // Factory like method - static void fillNICInfo(vector<NICWrapper*> &nics, - ManagementAgent *agent); - - // QMF Methods - ManagementObject *GetManagementObject(void) const { return mgmt_object; } - status_t ManagementMethod(uint32_t methodId, Args& args, string& text); - - // Field Accessors - const string &getInterfaceName(void) { return interfaceName; } - const string &getMacaddr(void) { return macaddr; } - const string &getIpaddr(void) { return ipaddr; } - const string &getNetmask(void) { return netmask; } - const string &getBroadcast(void) { return broadcast; } - int getBandwidth(void) { return bandwidth; } -}; diff --git a/src/platform.h b/src/platform.h index 514ad20..54fbe37 100644 --- a/src/platform.h +++ b/src/platform.h @@ -21,6 +21,8 @@ */ #include <string> +#include <vector> +#include "networkdevice.h" using namespace std; @@ -57,6 +59,9 @@ class Platform // returns the load average for the platform virtual double get_load_average() const = 0; + + // returns the list of network devices for this platform + virtual vector<NetworkDeviceAgent> get_network_devices() const = 0; }; #endif diff --git a/src/processors.h b/src/processors.h index 17a6a6a..e681453 100644 --- a/src/processors.h +++ b/src/processors.h @@ -1,3 +1,6 @@ +#ifndef __PROCESSORS_H +#define __PROCESSORS_H + /* processor.h - Copyright (C) 2010 Red Hat, Inc. * Written by Darryl L. Pierce <dpierce at redhat.com> * @@ -48,3 +51,5 @@ class ProcessorsAgent : public Manageable // agent methods void update_load_averages(void) const; }; + +#endif diff --git a/src/schema.xml b/src/schema.xml index 890e4ed..206e39b 100644 --- a/src/schema.xml +++ b/src/schema.xml @@ -23,21 +23,13 @@ <statistic name="load_average" type="float" desc="The processing load average." /> </class> - <class name="NIC"> - - <property name="host" type="objId" access="RO" desc="Host that this NIC belongs to" index="y" references="Host" parentRef="y"/> - <property name="macaddr" type="sstr" access="RO" desc="MAC Address" index="y"/> - <property name="interface" type="sstr" access="RO" desc="Interface name"/> - <property name="ipaddr" type="sstr" access="RO" desc="IP Address"/> - <property name="netmask" type="sstr" access="RO" desc="Netmask"/> - <property name="broadcast" type="sstr" access="RO" desc="Broadcast"/> - <property name="bandwidth" type="int32" access="RO" desc="Bandwidth"/> - - <method name="identify_nic" desc="Physically Identify NIC"> - <arg name="seconds" dir="I" type="int32" /> - <arg name="ret" dir="O" type="int32" /> - </method> - + <!-- represents a physical network device --> + <class name="NetworkDevice"> + <property name="host" type="objId" access="RC" desc="The host machine." index="y" references="Host" parentRef="y" /> + <property name="mac_address" type="sstr" access="RO" desc="The device's MAC address" index="y" /> + <property name="vendor" type="sstr" access="RO" desc="The device vendor." /> + <property name="model" type="sstr" access="RO" desc="The device model." /> + <property name="interface" type="sstr" access="RO" desc="The interface name for the device." /> </class> </schema> -- 1.6.6.1
Ian Main
2010-May-04 06:24 UTC
[Ovirt-devel] [Matahari] [PATCH matahari] Created the NetworkDevice agent.
On Mon, 2010-04-26 at 16:49 -0400, Darryl L. Pierce wrote:> Created a new class to represent network interface devices, named > NetworkDeviceAgent. > > Removed the NICWrapper class, as well as the final vestiges of HAL > dependencies. > > Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>ACK