/******************************************************************************* * Copyright (c) 2011, 2016 Eurotech and/or its affiliates * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Eurotech *******************************************************************************/ package org.eclipse.kura.net.admin.visitor.linux; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.Set; import org.eclipse.kura.KuraException; import org.eclipse.kura.core.net.NetInterfaceAddressConfigImpl; import org.eclipse.kura.core.net.NetworkConfiguration; import org.eclipse.kura.core.net.NetworkConfigurationVisitor; import org.eclipse.kura.core.net.WifiInterfaceAddressConfigImpl; import org.eclipse.kura.linux.net.iptables.LinuxFirewall; import org.eclipse.kura.linux.net.iptables.NATRule; import org.eclipse.kura.net.NetConfig; import org.eclipse.kura.net.NetInterfaceAddressConfig; import org.eclipse.kura.net.NetInterfaceConfig; import org.eclipse.kura.net.NetInterfaceType; import org.eclipse.kura.net.admin.visitor.linux.util.KuranetConfig; import org.eclipse.kura.net.firewall.FirewallAutoNatConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class FirewallAutoNatConfigReader implements NetworkConfigurationVisitor { private static final Logger s_logger = LoggerFactory.getLogger(FirewallAutoNatConfigReader.class); private static FirewallAutoNatConfigReader s_instance; public static FirewallAutoNatConfigReader getInstance() { if (s_instance == null) { s_instance = new FirewallAutoNatConfigReader(); } return s_instance; } @Override public void visit(NetworkConfiguration config) throws KuraException { List<NetInterfaceConfig<? extends NetInterfaceAddressConfig>> netInterfaceConfigs = config .getNetInterfaceConfigs(); for (NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig : netInterfaceConfigs) { getConfig(netInterfaceConfig, KuranetConfig.getProperties()); } } private void getConfig(NetInterfaceConfig<? extends NetInterfaceAddressConfig> netInterfaceConfig, Properties kuraProps) throws KuraException { String interfaceName = netInterfaceConfig.getName(); NetInterfaceType type = netInterfaceConfig.getType(); if (type == NetInterfaceType.ETHERNET || type == NetInterfaceType.WIFI) { s_logger.debug("Getting NAT config for {}", interfaceName); if (kuraProps != null) { s_logger.debug("Getting NAT config from kuraProps"); boolean natEnabled = false; boolean useMasquerade = false; String prop = null; String srcIface = null; String dstIface = null; StringBuilder sb = new StringBuilder().append("net.interface.").append(interfaceName) .append(".config.nat.enabled"); if ((prop = kuraProps.getProperty(sb.toString())) != null) { natEnabled = Boolean.parseBoolean(prop); } sb = new StringBuilder().append("net.interface.").append(interfaceName) .append(".config.nat.masquerade"); if ((prop = kuraProps.getProperty(sb.toString())) != null) { useMasquerade = Boolean.parseBoolean(prop); } sb = new StringBuilder().append("net.interface.").append(interfaceName) .append(".config.nat.src.interface"); if ((prop = kuraProps.getProperty(sb.toString())) != null) { srcIface = prop; } sb = new StringBuilder().append("net.interface.").append(interfaceName) .append(".config.nat.dst.interface"); if ((prop = kuraProps.getProperty(sb.toString())) != null) { dstIface = prop; } if (natEnabled) { FirewallAutoNatConfig natConfig = new FirewallAutoNatConfig(srcIface, dstIface, useMasquerade); List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig .getNetInterfaceAddresses(); if (netInterfaceAddressConfigs == null) { throw KuraException .internalError("NetInterfaceAddress list is null for interface " + interfaceName); } else if (netInterfaceAddressConfigs.size() == 0) { throw KuraException .internalError("NetInterfaceAddress list is empty for interface " + interfaceName); } for (NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) { List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs(); if (netConfigs == null) { netConfigs = new ArrayList<NetConfig>(); if (netInterfaceAddressConfig instanceof NetInterfaceAddressConfigImpl) { ((NetInterfaceAddressConfigImpl) netInterfaceAddressConfig).setNetConfigs(netConfigs); } else if (netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) { ((WifiInterfaceAddressConfigImpl) netInterfaceAddressConfig).setNetConfigs(netConfigs); } } netConfigs.add(natConfig); } } } else { // get it from the firewall file if possible LinuxFirewall firewall = LinuxFirewall.getInstance(); Set<NATRule> natRules = firewall.getAutoNatRules(); if (natRules != null && !natRules.isEmpty()) { Iterator<NATRule> it = natRules.iterator(); while (it.hasNext()) { NATRule rule = it.next(); if (rule.getSourceInterface().equals(interfaceName)) { s_logger.debug("found NAT rule: {}", rule); // this is the one we care about FirewallAutoNatConfig natConfig = new FirewallAutoNatConfig(rule.getSourceInterface(), rule.getDestinationInterface(), rule.isMasquerade()); List<? extends NetInterfaceAddressConfig> netInterfaceAddressConfigs = netInterfaceConfig .getNetInterfaceAddresses(); if (netInterfaceAddressConfigs == null) { throw KuraException.internalError( "NetInterfaceAddress list is null for interface " + interfaceName); } else if (netInterfaceAddressConfigs.size() == 0) { throw KuraException.internalError( "NetInterfaceAddress list is empty for interface " + interfaceName); } for (NetInterfaceAddressConfig netInterfaceAddressConfig : netInterfaceAddressConfigs) { List<NetConfig> netConfigs = netInterfaceAddressConfig.getConfigs(); if (netConfigs == null) { netConfigs = new ArrayList<NetConfig>(); if (netInterfaceAddressConfig instanceof NetInterfaceAddressConfigImpl) { ((NetInterfaceAddressConfigImpl) netInterfaceAddressConfig) .setNetConfigs(netConfigs); } else if (netInterfaceAddressConfig instanceof WifiInterfaceAddressConfigImpl) { ((WifiInterfaceAddressConfigImpl) netInterfaceAddressConfig) .setNetConfigs(netConfigs); } } netConfigs.add(natConfig); } } } } } } } }