Remove the archaic Executable type

Since it was virually no different from one, this has been replaced by a String.

Additionally, the interpreter for start scripts can now be changed from cmd.exe to git bash on windows systems by using the `bash` or `sh` commands.
This commit is contained in:
ME1312 2019-01-04 16:51:58 -05:00
parent eafacf75c3
commit 1845e9d8f9
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
16 changed files with 130 additions and 209 deletions

View File

@ -1,75 +1,30 @@
package net.ME1312.SubServers.Bungee.Host;
import net.ME1312.SubServers.Bungee.Library.Util;
import java.io.File;
import java.io.Serializable;
/**
* Executable Variable Class
* Executable String Handler Class
*/
@SuppressWarnings("serial")
public class Executable implements Serializable {
private boolean isFile;
private File File;
private String Str;
public class Executable {
private Executable() {}
/**
* New Executable
* Format a command to be executed
*
* @param exe Executable String or File Path
* @param gitbash Git Bash location (optional)
* @param exec Executable String
* @return
*/
public Executable(String exe) {
if (Util.isNull(exe)) throw new NullPointerException();
if (new File(exe).exists()) {
isFile = true;
File = new File(exe);
Str = exe;
public static String[] parse(String gitbash, String exec) {
String[] cmd;
if (System.getProperty("os.name").toLowerCase().indexOf("win") >= 0) {
if (gitbash != null && (exec.startsWith("bash ") || exec.startsWith("sh ")))
exec = "\"" + gitbash + ((gitbash.endsWith(File.separator))?"":File.separator) + "bin" + File.separatorChar + "sh.exe\" -lic \"" +
exec.replace("\\", "/\\").replace("\"", "\\\"").replace("^", "^^").replace("%", "^%").replace("&", "^&").replace("<", "^<").replace(">", "^>").replace("|", "^|") + "\"";
cmd = new String[]{"cmd.exe", "/q", "/c", '"'+exec+'"'};
} else {
isFile = false;
File = null;
Str = exe;
cmd = new String[]{"sh", "-lic", exec};
}
return cmd;
}
/**
* New Executable
*
* @param path File Path
*/
public Executable(File path) {
if (Util.isNull(path)) throw new NullPointerException();
isFile = true;
File = path;
Str = path.toString();
}
@Override
public String toString() {
String String;
if (isFile) {
String = File.toString();
} else {
String = Str;
}
return String;
}
/**
* Check if the Executable String is a file
*
* @return File Status
*/
public boolean isFile() {
return isFile;
}
/**
* Get Executable File
*
* @return File or Null if Executable isn't a file
*/
public File toFile() {
return File;
}
}

View File

@ -2,7 +2,6 @@ package net.ME1312.SubServers.Bungee.Host.External;
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
import net.ME1312.SubServers.Bungee.Host.Executable;
import net.ME1312.SubServers.Bungee.Host.Host;
import net.ME1312.SubServers.Bungee.Host.SubCreator;
import net.ME1312.SubServers.Bungee.Host.SubServer;
@ -144,7 +143,7 @@ public class ExternalHost extends Host implements ClientHandler {
}
@Override
public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!");
SubServer server = new ExternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
SubAddServerEvent event = new SubAddServerEvent(player, this, server);

View File

@ -110,7 +110,7 @@ public class ExternalSubCreator extends SubCreator {
server.setAll(config);
SubServer subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), fport, server.getColoredString("Motd", '&'), server.getBoolean("Log"), server.getRawString("Directory"),
new Executable(server.getRawString("Executable")), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted"));
server.getRawString("Executable"), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted"));
if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display"));
for (String group : server.getStringList("Group")) subserver.addGroup(group);
SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(server.getRawString("Stop-Action").toUpperCase().replace('-', '_').replace(' ', '_')), null);

View File

@ -28,7 +28,7 @@ public class ExternalSubServer extends SubServerContainer {
private boolean enabled;
private Container<Boolean> log;
private String dir;
protected Executable exec;
protected String exec;
private String stopcmd;
private StopAction stopaction;
private LinkedList<LoggedCommand> history;
@ -52,7 +52,7 @@ public class ExternalSubServer extends SubServerContainer {
* @param restricted Restricted Status
* @throws InvalidServerException
*/
public ExternalSubServer(ExternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
public ExternalSubServer(ExternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
super(host, name, port, motd, hidden, restricted);
if (Util.isNull(host, name, enabled, port, motd, log, stopcmd, hidden, restricted)) throw new NullPointerException();
this.host = host;
@ -319,7 +319,7 @@ public class ExternalSubServer extends SubServerContainer {
case "exec":
if (value.isString() && host.removeSubServer(player, getName())) {
waitFor(() -> host.getSubServer(getName()), null);
SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), new Executable(value.asRawString()), getStopCommand(), isHidden(), isRestricted());
SubServer server = host.addSubServer(player, getName(), isEnabled(), getAddress().getPort(), getMotd(), isLogging(), getPath(), value.asRawString(), getStopCommand(), isHidden(), isRestricted());
if (server != null) {
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Executable", value.asRawString());
@ -506,7 +506,7 @@ public class ExternalSubServer extends SubServerContainer {
}
@Override
public Executable getExecutable() {
public String getExecutable() {
return exec;
}

View File

@ -241,14 +241,14 @@ public abstract class Host implements ExtraDataHandler {
* @param motd Motd of the Server
* @param log Logging Status
* @param directory Directory
* @param executable Executable
* @param executable Executable String
* @param stopcmd Command to Stop the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @return The SubServer
* @throws InvalidServerException
*/
public abstract SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException;
public abstract SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException;
/**
* Adds a SubServer
@ -259,14 +259,14 @@ public abstract class Host implements ExtraDataHandler {
* @param motd Motd of the Server
* @param log Logging Status
* @param directory Directory
* @param executable Executable
* @param executable Executable String
* @param stopcmd Command to Stop the Server
* @param hidden if the server should be hidden from players
* @param restricted Players will need a permission to join if true
* @return The SubServer
* @throws InvalidServerException
*/
public SubServer addSubServer(String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
public SubServer addSubServer(String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
return addSubServer(null, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
}

View File

@ -3,7 +3,6 @@ package net.ME1312.SubServers.Bungee.Host.Internal;
import com.dosse.upnp.UPnP;
import net.ME1312.SubServers.Bungee.Event.SubAddServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubRemoveServerEvent;
import net.ME1312.SubServers.Bungee.Host.Executable;
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.SubServers.Bungee.Host.Host;
@ -98,7 +97,7 @@ public class InternalHost extends Host {
}
@Override
public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
public SubServer addSubServer(UUID player, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
if (plugin.api.getServers().keySet().contains(name.toLowerCase())) throw new InvalidServerException("A Server already exists with this name!");
SubServer server = new InternalSubServer(this, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted);
SubAddServerEvent event = new SubAddServerEvent(player, this, server);

View File

@ -58,6 +58,7 @@ public class InternalSubCreator extends SubCreator {
private YAMLSection build(File dir, ServerTemplate template, List<ServerTemplate> history) throws SubCreatorException {
YAMLSection server = new YAMLSection();
Version version = this.version;
List<String> args = new LinkedList<String>();
boolean error = false;
if (history.contains(template)) throw new IllegalStateException("Template Import loop detected");
history.add(template);
@ -81,28 +82,34 @@ public class InternalSubCreator extends SubCreator {
try {
System.out.println(name + File.separator + "Creator > Loading Template: " + template.getDisplayName());
Util.copyDirectory(template.getDirectory(), dir);
if (template.getType() == ServerType.FORGE || template.getType() == ServerType.SPONGE) {
System.out.println(name + File.separator + "Creator > Searching Versions...");
YAMLSection spversionmanifest = new YAMLSection(new Gson().fromJson("{\"versions\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://dl-api.spongepowered.org/v1/org.spongepowered/sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "/downloads?type=stable&minecraft=" + version).openStream(), Charset.forName("UTF-8")))) + '}', Map.class));
switch (template.getType()) {
case SPONGE:
case FORGE:
System.out.println(name + File.separator + "Creator > Searching Versions...");
YAMLSection spversionmanifest = new YAMLSection(new Gson().fromJson("{\"versions\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://dl-api.spongepowered.org/v1/org.spongepowered/sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "/downloads?type=stable&minecraft=" + version).openStream(), Charset.forName("UTF-8")))) + '}', Map.class));
YAMLSection spprofile = null;
Version spversion = null;
for (YAMLSection profile : spversionmanifest.getSectionList("versions")) {
if (profile.getSection("dependencies").getRawString("minecraft").equalsIgnoreCase(version.toString()) && (spversion == null || new Version(profile.getRawString("version")).compareTo(spversion) >= 0)) {
spprofile = profile;
spversion = new Version(profile.getRawString("version"));
YAMLSection spprofile = null;
Version spversion = null;
for (YAMLSection profile : spversionmanifest.getSectionList("versions")) {
if (profile.getSection("dependencies").getRawString("minecraft").equalsIgnoreCase(version.toString()) && (spversion == null || new Version(profile.getRawString("version")).compareTo(spversion) >= 0)) {
spprofile = profile;
spversion = new Version(profile.getRawString("version"));
}
}
}
if (spversion == null)
throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString());
System.out.println(name + File.separator + "Creator > Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"');
if (spversion == null)
throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString());
System.out.println(name + File.separator + "Creator > Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"');
if (template.getType() == ServerType.FORGE) {
Version mcfversion = new Version(spprofile.getSection("dependencies").getRawString("minecraft") + '-' + spprofile.getSection("dependencies").getRawString("forge"));
System.out.println(name + File.separator + "Creator > Found \"forge-" + mcfversion.toString() + '"');
if (template.getType() == ServerType.FORGE) {
Version mcfversion = new Version(spprofile.getSection("dependencies").getRawString("minecraft") + '-' + spprofile.getSection("dependencies").getRawString("forge"));
System.out.println(name + File.separator + "Creator > Found \"forge-" + mcfversion.toString() + '"');
version = new Version(mcfversion.toString() + " " + spversion.toString());
} else version = new Version(spversion.toString());
args.add(mcfversion.toString());
}
args.add(spversion.toString());
break;
default:
args.add(version.toString());
}
} catch (Exception e) {
e.printStackTrace();
@ -113,15 +120,15 @@ public class InternalSubCreator extends SubCreator {
if (template.getBuildOptions().getBoolean("Use-Cache", true)) {
cache = new UniversalFile(host.plugin.dir, "SubServers:Cache:Templates:" + template.getName());
cache.mkdirs();
args.add('\"' + cache.toString().replace(File.separatorChar, '/') + '\"');
} else {
cache = null;
}
String command = "bash " + template.getBuildOptions().getRawString("Shell-Location") + ' ' + version.toString() + ((cache == null)?"":" \""+cache.toString().replace(File.separatorChar, '/')+'\"');
if (System.getProperty("os.name").toLowerCase().indexOf("win") >= 0) {
String bash = InternalSubCreator.this.gitBash + ((InternalSubCreator.this.gitBash.endsWith(File.separator))?"":File.separator) + "bin" + File.separatorChar + "sh.exe";
command = "cmd.exe /c \"\"" + bash + "\" --login -i -c \"" + command.replace("\"", "\\\"") + "\"\"";
} else if (template.getBuildOptions().contains("Permission")) {
String command = "bash \"" + template.getBuildOptions().getRawString("Shell-Location") + '\"';
for (String arg : args) command += ' ' + arg;
if (System.getProperty("os.name").toLowerCase().indexOf("win") < 0 && template.getBuildOptions().contains("Permission")) {
try {
Process process = Runtime.getRuntime().exec("chmod " + template.getBuildOptions().getRawString("Permission") + ' ' + template.getBuildOptions().getRawString("Shell-Location"), null, dir);
Thread.sleep(500);
@ -136,7 +143,7 @@ public class InternalSubCreator extends SubCreator {
try {
System.out.println(name + File.separator + "Creator > Launching " + template.getBuildOptions().getRawString("Shell-Location"));
process = Runtime.getRuntime().exec(command, null, dir);
process = Runtime.getRuntime().exec(Executable.parse(gitBash, command), null, dir);
log.log.set(host.plugin.config.get().getSection("Settings").getBoolean("Log-Creator"));
log.file = new File(dir, "SubCreator-" + template.getName() + "-" + version.toString().replace(" ", "@") + ".log");
log.process = process;
@ -210,7 +217,7 @@ public class InternalSubCreator extends SubCreator {
server.setAll(config);
SubServer subserver = host.addSubServer(player, name, server.getBoolean("Enabled"), port, server.getColoredString("Motd", '&'), server.getBoolean("Log"), server.getRawString("Directory"),
new Executable(server.getRawString("Executable")), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted"));
server.getRawString("Executable"), server.getRawString("Stop-Command"), server.getBoolean("Hidden"), server.getBoolean("Restricted"));
if (server.getString("Display").length() > 0) subserver.setDisplayName(server.getString("Display"));
for (String group : server.getStringList("Group")) subserver.addGroup(group);
SubServer.StopAction action = Util.getDespiteException(() -> SubServer.StopAction.valueOf(server.getRawString("Stop-Action").toUpperCase().replace('-', '_').replace(' ', '_')), null);
@ -266,6 +273,7 @@ public class InternalSubCreator extends SubCreator {
if (Util.isNull(host, gitBash)) throw new NullPointerException();
this.host = host;
this.gitBash = (System.getenv("ProgramFiles(x86)") == null)?Pattern.compile("%(ProgramFiles)\\(x86\\)%", Pattern.CASE_INSENSITIVE).matcher(gitBash).replaceAll("%$1%"):gitBash;
if (this.gitBash.endsWith(File.pathSeparator)) this.gitBash = this.gitBash.substring(0, this.gitBash.length() - 1);
this.thread = new TreeMap<String, CreatorTask>();
reload();
}

View File

@ -31,7 +31,7 @@ public class InternalSubServer extends SubServerContainer {
private Container<Boolean> log;
private String dir;
private File directory;
private Executable executable;
private String executable;
private String stopcmd;
private StopAction stopaction;
private LinkedList<LoggedCommand> history;
@ -58,7 +58,7 @@ public class InternalSubServer extends SubServerContainer {
* @param restricted Restricted Status
* @throws InvalidServerException
*/
public InternalSubServer(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, Executable executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
public InternalSubServer(InternalHost host, String name, boolean enabled, int port, String motd, boolean log, String directory, String executable, String stopcmd, boolean hidden, boolean restricted) throws InvalidServerException {
super(host, name, port, motd, hidden, restricted);
if (Util.isNull(host, name, enabled, port, motd, log, directory, executable, stopcmd, hidden, restricted)) throw new NullPointerException();
this.host = host;
@ -118,7 +118,7 @@ public class InternalSubServer extends SubServerContainer {
private void run() {
allowrestart = true;
try {
process = Runtime.getRuntime().exec(executable.toString(), null, directory);
process = Runtime.getRuntime().exec(Executable.parse(host.getCreator().getBashDirectory(), executable), null, directory);
System.out.println("SubServers > Now starting " + getName());
logger.process = process;
logger.start();
@ -394,7 +394,7 @@ public class InternalSubServer extends SubServerContainer {
stop(player);
waitFor();
}
executable = new Executable(value.asRawString());
executable = value.asRawString();
if (this.host.plugin.config.get().getSection("Servers").getKeys().contains(getName())) {
this.host.plugin.config.get().getSection("Servers").getSection(getName()).set("Executable", value.asRawString());
this.host.plugin.config.save();
@ -570,7 +570,7 @@ public class InternalSubServer extends SubServerContainer {
}
@Override
public Executable getExecutable() {
public String getExecutable() {
return executable;
}

View File

@ -274,7 +274,7 @@ public interface SubServer extends Server {
*
* @return Executable String
*/
Executable getExecutable();
String getExecutable();
/**
* Grab the Command to Stop the Server

View File

@ -124,7 +124,7 @@ public abstract class SubServerController {
}
@Override
public Executable getExecutable() {
public String getExecutable() {
return SubServerController.this.getExecutable();
}
@ -323,7 +323,7 @@ public abstract class SubServerController {
*
* @return Executable String
*/
public abstract Executable getExecutable();
public abstract String getExecutable();
/**
* Grab the Command to Stop the Server

View File

@ -1,6 +1,5 @@
package net.ME1312.SubServers.Bungee.Network.Packet;
import net.ME1312.SubServers.Bungee.Host.Executable;
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
import net.ME1312.SubServers.Bungee.Library.Callback;
import net.ME1312.SubServers.Bungee.Library.Util;
@ -22,7 +21,7 @@ public class PacketExAddServer implements PacketIn, PacketOut {
private int port;
private boolean log;
private String directory;
private Executable executable;
private String executable;
private String stopcmd;
private UUID running;
private String id;
@ -42,7 +41,7 @@ public class PacketExAddServer implements PacketIn, PacketOut {
* @param executable Executable
*/
@SafeVarargs
public PacketExAddServer(String name, boolean enabled, int port, boolean log, String directory, Executable executable, String stopcmd, UUID running, Callback<YAMLSection>... callback) {
public PacketExAddServer(String name, boolean enabled, int port, boolean log, String directory, String executable, String stopcmd, UUID running, Callback<YAMLSection>... callback) {
if (Util.isNull(name, enabled, log, directory, executable, callback)) throw new NullPointerException();
this.name = name;
this.enabled = enabled;
@ -66,7 +65,7 @@ public class PacketExAddServer implements PacketIn, PacketOut {
server.set("port", port);
server.set("log", log);
server.set("dir", directory);
server.set("exec", executable.toString());
server.set("exec", executable);
server.set("stopcmd", stopcmd);
if (running != null) server.set("running", running.toString());
data.set("server", server);

View File

@ -419,7 +419,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
edits.set("log", config.get().getSection("Servers").getSection(name).getBoolean("Log"));
if (!config.get().getSection("Servers").getSection(name).getRawString("Directory").equals(server.getPath()))
edits.set("dir", config.get().getSection("Servers").getSection(name).getRawString("Directory"));
if (!new Executable(config.get().getSection("Servers").getSection(name).getRawString("Executable")).toString().equals(server.getExecutable().toString()))
if (!config.get().getSection("Servers").getSection(name).getRawString("Executable").equals(server.getExecutable()))
edits.set("exec", config.get().getSection("Servers").getSection(name).getRawString("Executable"));
if (!config.get().getSection("Servers").getSection(name).getRawString("Stop-Command").equals(server.getStopCommand()))
edits.set("stop-cmd", config.get().getSection("Servers").getSection(name).getRawString("Stop-Command"));
@ -441,12 +441,12 @@ public final class SubPlugin extends BungeeCord implements Listener {
!config.get().getSection("Servers").getSection(name).getString("Host").equalsIgnoreCase(server.getHost().getName()) ||
config.get().getSection("Servers").getSection(name).getInt("Port") != server.getAddress().getPort() ||
!config.get().getSection("Servers").getSection(name).getRawString("Directory").equals(server.getPath()) ||
!new Executable(config.get().getSection("Servers").getSection(name).getRawString("Executable")).toString().equals(server.getExecutable().toString())
!config.get().getSection("Servers").getSection(name).getRawString("Executable").equals(server.getExecutable())
) {
if (server != null) server.getHost().forceRemoveSubServer(name);
server = this.hosts.get(config.get().getSection("Servers").getSection(name).getString("Host").toLowerCase()).addSubServer(name, config.get().getSection("Servers").getSection(name).getBoolean("Enabled"),
config.get().getSection("Servers").getSection(name).getInt("Port"), config.get().getSection("Servers").getSection(name).getColoredString("Motd", '&'), config.get().getSection("Servers").getSection(name).getBoolean("Log"),
config.get().getSection("Servers").getSection(name).getRawString("Directory"), new Executable(config.get().getSection("Servers").getSection(name).getRawString("Executable")), config.get().getSection("Servers").getSection(name).getRawString("Stop-Command"),
config.get().getSection("Servers").getSection(name).getRawString("Directory"), config.get().getSection("Servers").getSection(name).getRawString("Executable"), config.get().getSection("Servers").getSection(name).getRawString("Stop-Command"),
config.get().getSection("Servers").getSection(name).getBoolean("Hidden"), config.get().getSection("Servers").getSection(name).getBoolean("Restricted"));
} else { // Server doesn't need to reset
if (config.get().getSection("Servers").getSection(name).getBoolean("Enabled") != server.isEnabled())

View File

@ -1,75 +1,30 @@
package net.ME1312.SubServers.Host.Executable;
import net.ME1312.Galaxi.Library.Util;
import java.io.File;
import java.io.Serializable;
/**
* Executable Variable Class
* Executable String Handler Class
*/
@SuppressWarnings("serial")
public class Executable implements Serializable {
private boolean isFile;
private File File;
private String Str;
public class Executable {
private Executable() {}
/**
* New Executable
* Format a command to be executed
*
* @param exe Executable String or File Path
* @param gitbash Git Bash location (optional)
* @param exec Executable String
* @return
*/
public Executable(String exe) {
if (Util.isNull(exe)) throw new NullPointerException();
if (new File(exe).exists()) {
isFile = true;
File = new File(exe);
Str = exe;
public static String[] parse(String gitbash, String exec) {
String[] cmd;
if (System.getProperty("os.name").toLowerCase().indexOf("win") >= 0) {
if (gitbash != null && (exec.startsWith("bash ") || exec.startsWith("sh ")))
exec = "\"" + gitbash + ((gitbash.endsWith(File.separator))?"":File.separator) + "bin" + File.separatorChar + "sh.exe\" -lic \"" +
exec.replace("\\", "/\\").replace("\"", "\\\"").replace("^", "^^").replace("%", "^%").replace("&", "^&").replace("<", "^<").replace(">", "^>").replace("|", "^|") + "\"";
cmd = new String[]{"cmd.exe", "/q", "/c", '"'+exec+'"'};
} else {
isFile = false;
File = null;
Str = exe;
cmd = new String[]{"sh", "-lic", exec};
}
return cmd;
}
/**
* New Executable
*
* @param path File Path
*/
public Executable(File path) {
if (Util.isNull(path)) throw new NullPointerException();
isFile = true;
File = path;
Str = path.toString();
}
@Override
public String toString() {
String String;
if (isFile) {
String = File.toString();
} else {
String = Str;
}
return String;
}
/**
* Check if the Executable String is a file
*
* @return File Status
*/
public boolean isFile() {
return isFile;
}
/**
* Get Executable File
*
* @return File or Null if Executable isn't a file
*/
public File toFile() {
return File;
}
}

View File

@ -202,6 +202,7 @@ public class SubCreator {
private YAMLSection build(File dir, ServerTemplate template, List<ServerTemplate> history) throws SubCreatorException {
YAMLSection server = new YAMLSection();
Version version = this.version;
List<String> args = new LinkedList<String>();
boolean error = false;
if (history.contains(template)) throw new IllegalStateException("Template Import loop detected");
history.add(template);
@ -228,31 +229,37 @@ public class SubCreator {
log.logger.info.println("Loading Template: " + template.getDisplayName());
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Loading Template: " + template.getDisplayName()));
Util.copyDirectory(template.getDirectory(), dir);
if (template.getType() == ServerType.FORGE || template.getType() == ServerType.SPONGE) {
log.logger.info.println("Searching Versions...");
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Searching Versions..."));
YAMLSection spversionmanifest = new YAMLSection(new JSONObject("{\"versions\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://dl-api.spongepowered.org/v1/org.spongepowered/sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "/downloads?type=stable&minecraft=" + version).openStream(), Charset.forName("UTF-8")))) + '}'));
switch (template.getType()) {
case SPONGE:
case FORGE:
log.logger.info.println("Searching Versions...");
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Searching Versions..."));
YAMLSection spversionmanifest = new YAMLSection(new JSONObject("{\"versions\":" + Util.readAll(new BufferedReader(new InputStreamReader(new URL("https://dl-api.spongepowered.org/v1/org.spongepowered/sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "/downloads?type=stable&minecraft=" + version).openStream(), Charset.forName("UTF-8")))) + '}'));
YAMLSection spprofile = null;
Version spversion = null;
for (YAMLSection profile : spversionmanifest.getSectionList("versions")) {
if (profile.getSection("dependencies").getRawString("minecraft").equalsIgnoreCase(version.toString()) && (spversion == null || new Version(profile.getRawString("version")).compareTo(spversion) >= 0)) {
spprofile = profile;
spversion = new Version(profile.getRawString("version"));
YAMLSection spprofile = null;
Version spversion = null;
for (YAMLSection profile : spversionmanifest.getSectionList("versions")) {
if (profile.getSection("dependencies").getRawString("minecraft").equalsIgnoreCase(version.toString()) && (spversion == null || new Version(profile.getRawString("version")).compareTo(spversion) >= 0)) {
spprofile = profile;
spversion = new Version(profile.getRawString("version"));
}
}
}
if (spversion == null)
throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString());
log.logger.info.println("Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"');
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'));
if (spversion == null)
throw new InvalidServerException("Cannot find Sponge version for Minecraft " + version.toString());
log.logger.info.println("Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"');
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Found \"sponge" + ((template.getType() == ServerType.FORGE)?"forge":"vanilla") + "-" + spversion.toString() + '"'));
if (template.getType() == ServerType.FORGE) {
Version mcfversion = new Version(spprofile.getSection("dependencies").getRawString("minecraft") + '-' + spprofile.getSection("dependencies").getRawString("forge"));
log.logger.info.println("Found \"forge-" + mcfversion.toString() + '"');
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Found \"forge-" + mcfversion.toString() + '"'));
if (template.getType() == ServerType.FORGE) {
Version mcfversion = new Version(spprofile.getSection("dependencies").getRawString("minecraft") + '-' + spprofile.getSection("dependencies").getRawString("forge"));
log.logger.info.println("Found \"forge-" + mcfversion.toString() + '"');
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Found \"forge-" + mcfversion.toString() + '"'));
version = new Version(mcfversion.toString() + " " + spversion.toString());
} else version = new Version(spversion.toString());
args.add(mcfversion.toString());
}
args.add(spversion.toString());
break;
default:
args.add(version.toString());
}
} catch (Exception e) {
log.logger.error.println(e);
@ -263,15 +270,15 @@ public class SubCreator {
if (template.getBuildOptions().getBoolean("Use-Cache", true)) {
cache = new UniversalFile(GalaxiEngine.getInstance().getRuntimeDirectory(), "Cache:Templates:" + template.getName());
cache.mkdirs();
args.add("\"" + cache.toString().replace(File.separatorChar, '/') + '\"');
} else {
cache = null;
}
String command = "bash " + template.getBuildOptions().getRawString("Shell-Location") + ' ' + version.toString() + ((cache == null)?"":" \""+cache.toString().replace(File.separatorChar, '/')+'\"');
if (System.getProperty("os.name").toLowerCase().indexOf("win") >= 0) {
String bash = host.host.getRawString("Git-Bash") + ((host.host.getRawString("Git-Bash").endsWith(File.separator))?"":File.separator) + "bin" + File.separatorChar + "sh.exe";
command = "cmd.exe /c \"\"" + bash + "\" --login -i -c \"" + command.replace("\"", "\\\"") + "\"\"";
} else if (template.getBuildOptions().contains("Permission")) {
String command = "bash \"" + template.getBuildOptions().getRawString("Shell-Location") + '\"';
for (String arg : args) command += ' ' + arg;
if (System.getProperty("os.name").toLowerCase().indexOf("win") < 0 && template.getBuildOptions().contains("Permission")) {
try {
Process process = Runtime.getRuntime().exec("chmod " + template.getBuildOptions().getRawString("Permission") + ' ' + template.getBuildOptions().getRawString("Shell-Location"), null, dir);
Thread.sleep(500);
@ -289,7 +296,7 @@ public class SubCreator {
try {
log.logger.info.println("Launching " + template.getBuildOptions().getRawString("Shell-Location"));
host.subdata.sendPacket(new PacketOutExLogMessage(address, "Launching " + template.getBuildOptions().getRawString("Shell-Location")));
process = Runtime.getRuntime().exec(command, null, dir);
process = Runtime.getRuntime().exec(Executable.parse(host.host.getRawString("Git-Bash"), command), null, dir);
log.file = new File(dir, "SubCreator-" + template.getName() + "-" + version.toString().replace(" ", "@") + ".log");
log.process = process;
log.start();

View File

@ -26,7 +26,7 @@ public class SubServer {
private Container<Boolean> log;
private String dir;
private File directory;
private Executable executable;
private String executable;
private Process process;
private SubLogger logger;
private Thread thread;
@ -47,7 +47,7 @@ public class SubServer {
* @param stopcmd Stop Command
* @throws InvalidServerException
*/
public SubServer(ExHost host, String name, boolean enabled, int port, boolean log, String directory, Executable executable, String stopcmd) throws InvalidServerException {
public SubServer(ExHost host, String name, boolean enabled, int port, boolean log, String directory, String executable, String stopcmd) throws InvalidServerException {
if (Util.isNull(host, name, enabled, log, directory, executable)) throw new NullPointerException();
this.host = host;
this.name = name;
@ -107,7 +107,7 @@ public class SubServer {
boolean falsestart = true;
allowrestart = true;
try {
process = Runtime.getRuntime().exec(executable.toString(), null, directory);
process = Runtime.getRuntime().exec(Executable.parse(host.host.getRawString("Git-Bash"), executable), null, directory);
falsestart = false;
host.log.info.println("Now starting " + name);
logger.process = process;

View File

@ -5,7 +5,6 @@ import net.ME1312.Galaxi.Library.Config.YAMLSection;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.Util;
import net.ME1312.Galaxi.Library.Version.Version;
import net.ME1312.SubServers.Host.Executable.Executable;
import net.ME1312.SubServers.Host.Executable.SubServer;
import net.ME1312.SubServers.Host.Network.PacketIn;
import net.ME1312.SubServers.Host.Network.PacketOut;
@ -71,7 +70,7 @@ public class PacketExAddServer implements PacketIn, PacketOut {
host.subdata.sendPacket(new PacketExAddServer(0, "Server Already Added", (data.contains("id"))?data.getRawString("id"):null));
} else {
SubServer server = new SubServer(host, data.getSection("server").getRawString("name"), data.getSection("server").getBoolean("enabled"), data.getSection("server").getInt("port"), data.getSection("server").getBoolean("log"),
data.getSection("server").getRawString("dir"), new Executable(data.getSection("server").getRawString("exec")), data.getSection("server").getRawString("stopcmd"));
data.getSection("server").getRawString("dir"), data.getSection("server").getRawString("exec"), data.getSection("server").getRawString("stopcmd"));
host.servers.put(data.getSection("server").getRawString("name").toLowerCase(), server);
if (UPnP.isUPnPAvailable() && host.config.get().getSection("Settings").getSection("UPnP", new YAMLSection()).getBoolean("Forward-Servers", false)) UPnP.openPortTCP(server.getPort());
log.info.println("Added SubServer: " + data.getSection("server").getRawString("name"));