/*
* Copyright 2011 Future Systems
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/package org.krakenapps.linux.api;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
// CentOS (/etc/sysconfig/network-scripts/devname)
public class EthernetInterface {
private static final String cfgPath = "/etc/sysconfig/network-scripts/";
public enum Bootproto {
None, BOOTP, DHCP
};
private Bootproto bootProto;
private InetAddress broadcast;
private String device;
private InetAddress dhcpHostname;
private InetAddress dns1;
private InetAddress dns2;
private String ethtoolOpts;
private InetAddress gateway;
private String hwAddr;
private InetAddress ipAddr;
private String macAddr;
private String master;
private InetAddress netmask;
private InetAddress network;
private Boolean onBoot;
private Boolean peerDns;
private Boolean slave;
private InetAddress srcAdrr;
private Boolean userCtl;
private List<String> description;
private List<AddressBinding> addressBindings;
public EthernetInterface(String device) throws IOException {
BufferedReader br = null;
String line = null;
if (device.contains(":"))
device = device.substring(0, device.indexOf(":"));
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(new File(cfgPath + "ifcfg-" + device))));
this.description = new ArrayList<String>();
while ((line = br.readLine()) != null) {
if (line.contains("=")) {
String key = line.split("=", 2)[0].trim();
String value = line.split("=", 2)[1].trim();
if (key.equals("BOOTPROTO")) {
if (value.equalsIgnoreCase("none"))
this.bootProto = Bootproto.None;
else if (value.equalsIgnoreCase("bootp"))
this.bootProto = Bootproto.BOOTP;
else if (value.equalsIgnoreCase("dhcp")) {
this.bootProto = Bootproto.DHCP;
this.peerDns = true;
}
} else if (key.equals("BROADCAST"))
this.broadcast = InetAddress.getByName(value);
else if (key.equals("DEVICE"))
this.device = value;
else if (key.equals("DHCP_HOSTNAME"))
this.dhcpHostname = InetAddress.getByName(value);
else if (key.equals("DNS1"))
this.dns1 = InetAddress.getByName(value);
else if (key.equals("DNS2"))
this.dns2 = InetAddress.getByName(value);
else if (key.equals("ETHTOOL_OPTS"))
this.ethtoolOpts = value;
else if (key.equals("GATEWAY"))
this.gateway = InetAddress.getByName(value);
else if (key.equals("HWADDR"))
this.hwAddr = value;
else if (key.equals("IPADDR"))
this.ipAddr = InetAddress.getByName(value);
else if (key.equals("MACADDR"))
this.macAddr = value;
else if (key.equals("MASTER"))
this.master = value;
else if (key.equals("NETMASK"))
this.netmask = InetAddress.getByName(value);
else if (key.equals("NETWORK"))
this.network = InetAddress.getByName(value);
else if (key.equals("ONBOOT"))
this.onBoot = value.equals("yes") ? true : false;
else if (key.equals("PEERDNS"))
this.peerDns = value.equals("yes") ? true : false;
else if (key.equals("SLAVE"))
this.slave = value.equals("yes") ? true : false;
else if (key.equals("SRCADDR"))
this.srcAdrr = InetAddress.getByName(value);
else if (key.equals("USERCTL"))
this.userCtl = value.equals("yes") ? true : false;
} else {
description.add(line);
}
}
} finally {
if (br != null)
br.close();
}
this.addressBindings = new ArrayList<AddressBinding>();
File[] sublist = new File(cfgPath).listFiles();
for (File sub : sublist) {
if (!sub.isFile())
continue;
String filename = sub.getName();
if (!filename.startsWith("ifcfg-" + device) || !filename.contains(":"))
continue;
AddressBinding subAddr = new AddressBinding();
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(sub)));
while ((line = br.readLine()) != null) {
if (line.contains("=")) {
String key = line.split("=", 2)[0].trim();
String value = line.split("=", 2)[1].trim();
if (key.equals("DEVICE"))
subAddr.device = value;
else if (key.equals("IPADDR"))
subAddr.ipAddr = InetAddress.getByName(value);
else if (key.equals("BROADCAST"))
subAddr.broadcast = InetAddress.getByName(value);
else if (key.equals("NETMASK"))
subAddr.netmask = InetAddress.getByName(value);
else
subAddr.description.add(line);
} else
subAddr.description.add(line);
}
} finally {
if (br != null)
br.close();
}
addressBindings.add(subAddr);
}
}
public static List<EthernetInterface> getEthernetInterfaces() throws IOException {
List<EthernetInterface> interfaces = new ArrayList<EthernetInterface>();
String[] filenames = new File(cfgPath).list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return (name.startsWith("ifcfg-") && !name.endsWith(".bak"));
}
});
for (String filename : filenames) {
try {
EthernetInterface eth = new EthernetInterface(filename.substring("ifcfg-".length()));
interfaces.add(eth);
} catch (FileNotFoundException e) {
}
}
return interfaces;
}
public void save() {
PrintStream pStream = null;
try {
pStream = new PrintStream(new File(cfgPath + "ifcfg-" + device));
for (String desc : description)
pStream.println(desc);
if (bootProto != null)
pStream.println("BOOTPROTO=" + bootProto.toString().toLowerCase());
if (broadcast != null)
pStream.println("BROADCAST=" + broadcast.getHostAddress());
pStream.println("DEVICE=" + device);
if (dhcpHostname != null)
pStream.println("DHCP_HOSTNAME=" + dhcpHostname.getHostAddress());
if (dns1 != null) {
pStream.println("DNS1=" + dns1.getHostAddress());
if (dns2 != null)
pStream.println("DNS2=" + dns2.getHostAddress());
}
if (ethtoolOpts != null)
pStream.println("ETHTOOL_OPTS=" + ethtoolOpts);
if (gateway != null)
pStream.println("GATEWAY=" + gateway.getHostAddress());
if (hwAddr != null)
pStream.println("HWADDR=" + hwAddr);
if (ipAddr != null)
pStream.println("IPADDR=" + ipAddr.getHostAddress());
if (macAddr != null)
pStream.println("MACADDR=" + macAddr);
if (master != null)
pStream.println("MASTER=" + master);
if (netmask != null)
pStream.println("NETMASK=" + netmask.getHostAddress());
if (network != null)
pStream.println("NETWORK=" + network.getHostAddress());
if (onBoot != null)
pStream.println("ONBOOT=" + (onBoot ? "yes" : "no"));
if (peerDns != null)
pStream.println("PEERDNS=" + (peerDns ? "yes" : "no"));
if (slave != null)
pStream.println("SLAVE=" + (slave ? "yes" : "no"));
if (srcAdrr != null)
pStream.println("SRCADDR=" + srcAdrr.getHostAddress());
if (userCtl != null)
pStream.println("USERCTL=" + (userCtl ? "yes" : "no"));
pStream.close();
for (AddressBinding sub : addressBindings) {
pStream = new PrintStream(new File(cfgPath + "ifcfg-" + sub.device));
if (sub.ipAddr != null)
pStream.println("IPADDR=" + sub.ipAddr.getHostAddress());
if (sub.broadcast != null)
pStream.println("BROADCAST=" + sub.broadcast.getHostAddress());
if (sub.netmask != null)
pStream.println("NETMASK=" + sub.netmask.getHostAddress());
for (String str : sub.description)
pStream.println(str);
pStream.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public String up() {
return Util.run("ifup " + device);
}
public String down() {
return Util.run("ifdown " + device);
}
public static String restart() {
return Util.run("service network restart");
}
public Bootproto getBootProto() {
return bootProto;
}
public void setBootProto(Bootproto bootProto) {
this.bootProto = bootProto;
}
public InetAddress getBroadcast() {
return broadcast;
}
public void setBroadcast(InetAddress broadcast) {
this.broadcast = broadcast;
}
public String getDevice() {
return device;
}
public InetAddress getDhcpHostname() {
return dhcpHostname;
}
public void setDhcpHostname(InetAddress dhcpHostname) {
this.dhcpHostname = dhcpHostname;
}
public InetAddress getDns1() {
return dns1;
}
public void setDns1(InetAddress dns1) {
this.dns1 = dns1;
}
public InetAddress getDns2() {
return dns2;
}
public void setDns2(InetAddress dns2) {
this.dns2 = dns2;
}
public String getEthtoolOpts() {
return ethtoolOpts;
}
public void setEthtoolOpts(String ethtoolOpts) {
this.ethtoolOpts = ethtoolOpts;
}
public InetAddress getGateway() {
return gateway;
}
public void setGateway(InetAddress gateway) {
this.gateway = gateway;
}
public String getHwAddr() {
return hwAddr;
}
public void setHwAddr(String hwAddr) {
this.hwAddr = hwAddr;
}
public InetAddress getIpAddr() {
return ipAddr;
}
public void setIpAddr(InetAddress ipAddr) {
this.ipAddr = ipAddr;
}
public String getMacAddr() {
return macAddr;
}
public void setMacAddr(String macAddr) {
this.macAddr = macAddr;
}
public String getMaster() {
return master;
}
public void setMaster(String master) {
this.master = master;
}
public InetAddress getNetmask() {
return netmask;
}
public void setNetmask(InetAddress netmask) {
this.netmask = netmask;
}
public InetAddress getNetwork() {
return network;
}
public void setNetwork(InetAddress network) {
this.network = network;
}
public Boolean getOnBoot() {
return onBoot;
}
public void setOnBoot(Boolean onBoot) {
this.onBoot = onBoot;
}
public Boolean getPeerDns() {
return peerDns;
}
public void setPeerDns(Boolean peerDns) {
this.peerDns = peerDns;
}
public Boolean getSlave() {
return slave;
}
public void setSlave(Boolean slave) {
this.slave = slave;
}
public InetAddress getSrcAdrr() {
return srcAdrr;
}
public void setSrcAdrr(InetAddress srcAdrr) {
this.srcAdrr = srcAdrr;
}
public Boolean getUserCtl() {
return userCtl;
}
public void setUserCtl(Boolean userCtl) {
this.userCtl = userCtl;
}
public List<String> getDescription() {
return description;
}
public void setDescription(List<String> description) {
this.description = description;
}
public List<AddressBinding> getAddressBindings() {
return addressBindings;
}
public void addAddressBinding(InetAddress ipAddr) {
int num;
for (num = 0;; num++) {
if (!new File(cfgPath + "ifcfg-" + device + ":" + num).exists())
break;
}
AddressBinding sub = new AddressBinding();
sub.parent = this;
sub.device = device + ":" + num;
sub.ipAddr = ipAddr;
addressBindings.add(sub);
}
public class AddressBinding {
private EthernetInterface parent;
private String device;
private InetAddress ipAddr;
private InetAddress broadcast;
private InetAddress netmask;
private List<String> description;
private AddressBinding() {
this.description = new ArrayList<String>();
}
public String getDevice() {
return device;
}
public InetAddress getIpAddr() {
return ipAddr;
}
public void setIpAddr(InetAddress ipAddr) {
this.ipAddr = ipAddr;
}
public InetAddress getBroadcast() {
return broadcast;
}
public void setBroadcast(InetAddress broadcast) {
this.broadcast = broadcast;
}
public InetAddress getNetmask() {
return netmask;
}
public void setNetmask(InetAddress netmask) {
this.netmask = netmask;
}
public void down() {
parent.addressBindings.remove(this);
new File(cfgPath + "ifcfg-" + device).delete();
}
}
}