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;
- }
+ }
}