/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser 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. */ package org.rhq.core.system; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Collections; import java.util.List; import org.hyperic.sigar.NetFlags; import org.hyperic.sigar.NetInterfaceConfig; /** * Provides information on a network adapater. * * <p>Users of this object should expect possible <code>null</code> values for some of these fields, in the case when * some of the values are unknown or undetectable on the platform. For example, on platforms without native support, the * {@link #getMacAddressString() MAC address} will not be detectable and, since it is unknown, will be <code> * null</code>.</p> * * @author John Mazzitelli */ public class NetworkAdapterInfo { private final String name; private final String displayName; private final String description; private final String macAddress; private final String type; private final OperationState operationalStatus; private final Boolean dhcpEnabled; private final List<InetAddress> dnsServers; private List<InetAddress> unicastAddresses; private List<InetAddress> multicastAddresses; private long flags; public static enum OperationState { UP, DOWN, TESTING, UNKNOWN, DORMANT, NOTPRESENT, LOWERLAYERDOWN } public NetworkAdapterInfo(String name, String displayName, String description, String macAddress, String type, String operationalStatus, Boolean dhcpEnabled, List<InetAddress> dnsServers, List<InetAddress> unicastAddresses, List<InetAddress> multicastAddresses) { this.name = name; this.displayName = displayName; this.description = description; this.macAddress = macAddress; this.type = type; this.operationalStatus = OperationState.valueOf(operationalStatus); this.dhcpEnabled = dhcpEnabled; this.dnsServers = dnsServers; this.unicastAddresses = unicastAddresses; this.multicastAddresses = multicastAddresses; } public NetworkAdapterInfo(NetInterfaceConfig a) { long flags = a.getFlags(); NetworkAdapterInfo.OperationState state = NetworkAdapterInfo.OperationState.UP; if ((flags & NetFlags.IFF_UP) <= 0) { state = NetworkAdapterInfo.OperationState.DOWN; } this.name = a.getName(); this.displayName = a.getName(); this.description = a.getDescription(); this.macAddress = a.getHwaddr(); this.type = a.getType(); this.operationalStatus = state; this.dhcpEnabled = Boolean.FALSE; this.dnsServers = null; // TODO: DNS server addresses? this.flags = a.getFlags(); try { this.unicastAddresses = Collections.singletonList(InetAddress.getByName(a.getAddress())); // TODO: can't sigar give us more than one? } catch (UnknownHostException e) { } try { this.multicastAddresses = Collections.singletonList(InetAddress.getByName(a.getBroadcast())); } catch (UnknownHostException e) { } } public String getName() { return name; } public String getDisplayName() { return displayName; } public String getDescription() { return description; } public String getAllFlags() { return NetFlags.getIfFlagsString(flags); } public String getMacAddressString() { return macAddress; } public byte[] getMacAddressBytes() { if (macAddress == null) { return null; } byte[] bytes = new byte[6]; String[] hex = macAddress.split("(\\:|\\-)"); if (hex.length != 6) { throw new IllegalArgumentException("Invalid MAC address: " + macAddress); } for (int i = 0; i < 6; i++) { try { bytes[i] = (byte) Integer.parseInt(hex[i], 16); } catch (NumberFormatException e) { throw new IllegalArgumentException("Invalid hex digit [" + hex[i] + "] in MAC address: " + macAddress); } } return bytes; } public String getType() { return type; } public OperationState getOperationalStatus() { return operationalStatus; } public Boolean isDhcpEnabled() { return dhcpEnabled; } public List<InetAddress> getDnsServers() { return dnsServers; } public List<InetAddress> getUnicastAddresses() { return unicastAddresses; } public List<InetAddress> getMulticastAddresses() { return multicastAddresses; } @Override public String toString() { StringBuffer s = new StringBuffer("NetworkAdapterInfo: "); s.append("name=[" + this.name); s.append("], display-name=[" + this.displayName); s.append("], description=[" + this.description); s.append("], mac-address=[" + this.macAddress); s.append("], type=[" + this.type); s.append("], operational-status=[" + this.operationalStatus); s.append("], dhcp-enabled=[" + this.dhcpEnabled); s.append("], dns-servers=" + this.dnsServers); s.append(", unicast-addresses=" + this.unicastAddresses); s.append(", multicast-addresses=" + this.multicastAddresses); return s.toString(); } }