From 676db036f84edfbfd447d18c4ea04e91cdc5b46e Mon Sep 17 00:00:00 2001 From: ori agranat Date: Sat, 22 Feb 2020 21:38:17 +0200 Subject: [PATCH] initial work --- chameleon-server/chameleon-vision.iml | 1 + chameleon-server/pom.xml | 5 + .../network/LinuxNetworking.java | 145 +++++++++++------- 3 files changed, 97 insertions(+), 54 deletions(-) diff --git a/chameleon-server/chameleon-vision.iml b/chameleon-server/chameleon-vision.iml index e863282a1..41084fba0 100644 --- a/chameleon-server/chameleon-vision.iml +++ b/chameleon-server/chameleon-vision.iml @@ -36,6 +36,7 @@ + diff --git a/chameleon-server/pom.xml b/chameleon-server/pom.xml index d02cdfc4e..bdc1ad0a9 100644 --- a/chameleon-server/pom.xml +++ b/chameleon-server/pom.xml @@ -86,6 +86,11 @@ commons-math3 3.6.1 + + commons-io + commons-io + RELEASE + org.msgpack msgpack-core diff --git a/chameleon-server/src/main/java/com/chameleonvision/network/LinuxNetworking.java b/chameleon-server/src/main/java/com/chameleonvision/network/LinuxNetworking.java index 42998a9a0..a2ddca8e3 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/network/LinuxNetworking.java +++ b/chameleon-server/src/main/java/com/chameleonvision/network/LinuxNetworking.java @@ -1,73 +1,110 @@ package com.chameleonvision.network; +import io.javalin.core.util.FileUtil; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.reflect.FieldUtils; + +import java.io.File; import java.io.IOException; import java.net.SocketException; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class LinuxNetworking extends SysNetworking { - @Override - public boolean setDHCP() { - String[] clearArgs = { "addr", "flush", "dev", networkInterface.name }; - try { - int clearRetCode = shell.execute("ip", clearArgs); - int dhcpRetCode = shell.execute("dhclient", networkInterface.name); - return clearRetCode == 0 && dhcpRetCode == 0; - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } + @Override + public boolean setDHCP() { + File interfaces = new File("/etc/network/interfaces"); + try { + List lines = FileUtils.readLines(interfaces, StandardCharsets.UTF_8); + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + if (line.contains("iface " + networkInterface.name)) { + line = "iface " + networkInterface.name + "inet dhcp"; + lines.set(i, line); + List rLines = new ArrayList<>(); + for (var j = i; j < lines.size(); j++) { + String tmp = lines.get(j); + if (tmp.contains("address") || tmp.contains("netmask") || tmp.contains("gateway")) { + rLines.add(j); + } + if (tmp.contains("iface")) { + break; + } + } + for (Integer rLine : rLines) { + lines.remove(rLine.intValue()); + } + FileUtils.writeLines(interfaces, lines); + Process p = Runtime.getRuntime().exec("systemctl restart network"); + p.waitFor(); + return true; + } + } + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } - @Override - public boolean setHostname(String newHostname) { - String[] setHostnameArgs = { "set-hostname", newHostname }; - try { - var setHostnameRetCode = shell.execute("hostnamectl", setHostnameArgs); - return setHostnameRetCode == 0; - } catch(Exception e) { - e.printStackTrace(); - return false; - } - } + return false; + } - @Override - public boolean setStatic(String ipAddress, String netmask, String gateway, String broadcast) { - try { - String[] clearArgs = { "addr", "flush", "dev", networkInterface.name }; - String[] setIPArgs = { "addr", "add", String.format("%s/%s", ipAddress, netmask), "broadcast", broadcast, "dev", networkInterface.name }; - String[] setGatewayArgs = { "route", "replace", "default", "via", gateway, "dev", networkInterface.name }; + @Override + public boolean setHostname(String newHostname) { + String[] setHostnameArgs = {"set-hostname", newHostname}; + try { + var setHostnameRetCode = shell.execute("hostnamectl", setHostnameArgs); + return setHostnameRetCode == 0; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } - int clearRetCode = shell.execute("ip", clearArgs); - int setIPRetCode = shell.execute("ip", setIPArgs); - int setGatewayRetCode = shell.execute("ip", setGatewayArgs); + @Override + public boolean setStatic(String ipAddress, String netmask, String gateway, String broadcast) { + File interfaces = new File("/etc/network/interfaces"); + try { + List lines = FileUtils.readLines(interfaces, StandardCharsets.UTF_8); + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + if (line.contains("iface " + networkInterface.name)) { + line = "iface " + networkInterface.name + "inet static"; + lines.set(i, line); + lines.add(i + 1, "address " + ipAddress); + lines.add(i + 2, "netmask " + netmask); + lines.add(i + 2, "gateway " + gateway); + FileUtils.writeLines(interfaces, lines); + Process p = Runtime.getRuntime().exec("systemctl restart network"); + p.waitFor(); + return true; + } + } + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + return false; + } - return clearRetCode == 0 && setIPRetCode == 0 && setGatewayRetCode == 0; - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - @Override - public List getNetworkInterfaces() throws SocketException { - List netInterfaces; - try { - netInterfaces = Collections.list(java.net.NetworkInterface.getNetworkInterfaces()); - } catch (SocketException e) { - return null; - } + @Override + public List getNetworkInterfaces() throws SocketException { + List netInterfaces; + try { + netInterfaces = Collections.list(java.net.NetworkInterface.getNetworkInterfaces()); + } catch (SocketException e) { + return null; + } - List goodInterfaces = new ArrayList<>(); + List goodInterfaces = new ArrayList<>(); - for (var netInterface : netInterfaces) { - if (netInterface.getDisplayName().contains("lo")) continue; - if (!netInterface.isUp()) continue; - goodInterfaces.add(netInterface); - } - return goodInterfaces; + for (var netInterface : netInterfaces) { + if (netInterface.getDisplayName().contains("lo")) continue; + if (!netInterface.isUp()) continue; + goodInterfaces.add(netInterface); + } + return goodInterfaces; - } + } }