|
|
|
@ -27,56 +27,56 @@ import com.google.common.base.Joiner;
|
|
|
|
|
|
|
|
|
|
public class KCauldronUpdater implements Runnable, IVersionCheckCallback { |
|
|
|
|
private static final class LatestVersionCallback extends |
|
|
|
|
CommandSenderUpdateCallback { |
|
|
|
|
public LatestVersionCallback(CommandSender sender) { |
|
|
|
|
super(sender); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void newVersion(String newVersion) { |
|
|
|
|
startUpdate(getSender(), newVersion); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void upToDate() { |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
CommandSender sender = getSender(); |
|
|
|
|
if (sender != null) { |
|
|
|
|
sender.sendMessage(ChatColor.DARK_PURPLE + "Current version (" |
|
|
|
|
+ KCauldron.getCurrentVersion() + ") is up to date"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void error(Throwable t) { |
|
|
|
|
super.error(t); |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
} |
|
|
|
|
CommandSenderUpdateCallback { |
|
|
|
|
public LatestVersionCallback(CommandSender sender) { |
|
|
|
|
super(sender); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void newVersion(String newVersion) { |
|
|
|
|
startUpdate(getSender(), newVersion); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void upToDate() { |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
CommandSender sender = getSender(); |
|
|
|
|
if (sender != null) { |
|
|
|
|
sender.sendMessage(ChatColor.DARK_PURPLE + "Current version (" |
|
|
|
|
+ KCauldron.getCurrentVersion() + ") is up to date"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void error(Throwable t) { |
|
|
|
|
super.error(t); |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public static void initUpdate(CommandSender sender, String version) { |
|
|
|
|
if (KCauldron.sUpdateInProgress) { |
|
|
|
|
sender.sendMessage(ChatColor.RED |
|
|
|
|
+ "Update stopped: another update in progress"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
KCauldron.sUpdateInProgress = true; |
|
|
|
|
if (version == null) { |
|
|
|
|
sender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Fetching latest version..."); |
|
|
|
|
KVersionRetriever.startServer(new LatestVersionCallback(sender), |
|
|
|
|
false); |
|
|
|
|
} else { |
|
|
|
|
startUpdate(sender, version); |
|
|
|
|
} |
|
|
|
|
if (KCauldron.sUpdateInProgress) { |
|
|
|
|
sender.sendMessage(ChatColor.RED |
|
|
|
|
+ "Update stopped: another update in progress"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
KCauldron.sUpdateInProgress = true; |
|
|
|
|
if (version == null) { |
|
|
|
|
sender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Fetching latest version..."); |
|
|
|
|
KVersionRetriever.startServer(new LatestVersionCallback(sender), |
|
|
|
|
false); |
|
|
|
|
} else { |
|
|
|
|
startUpdate(sender, version); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static void startUpdate(CommandSender sender, String version) { |
|
|
|
|
if (sender != null) { |
|
|
|
|
sender.sendMessage(ChatColor.DARK_PURPLE + "Starting update to " |
|
|
|
|
+ version + "..."); |
|
|
|
|
} |
|
|
|
|
new KCauldronUpdater(sender, version); |
|
|
|
|
if (sender != null) { |
|
|
|
|
sender.sendMessage(ChatColor.DARK_PURPLE + "Starting update to " |
|
|
|
|
+ version + "..."); |
|
|
|
|
} |
|
|
|
|
new KCauldronUpdater(sender, version); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private final CommandSender mSender; |
|
|
|
@ -84,21 +84,21 @@ public class KCauldronUpdater implements Runnable, IVersionCheckCallback {
|
|
|
|
|
private final Thread mThread; |
|
|
|
|
|
|
|
|
|
public KCauldronUpdater(CommandSender sender, String version) { |
|
|
|
|
mSender = sender; |
|
|
|
|
mVersion = version; |
|
|
|
|
mThread = new Thread(this); |
|
|
|
|
mThread.setName("KCauldron updater"); |
|
|
|
|
mThread.setPriority(Thread.MIN_PRIORITY); |
|
|
|
|
mThread.start(); |
|
|
|
|
mSender = sender; |
|
|
|
|
mVersion = version; |
|
|
|
|
mThread = new Thread(this); |
|
|
|
|
mThread.setName("KCauldron updater"); |
|
|
|
|
mThread.setPriority(Thread.MIN_PRIORITY); |
|
|
|
|
mThread.start(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void run() { |
|
|
|
|
if (!MinecraftServer.kcauldronConfig.updatecheckerQuite.getValue()) { |
|
|
|
|
mSender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Retrieving latest KBootstrap version..."); |
|
|
|
|
} |
|
|
|
|
new KVersionRetriever(this, false, false, "pw.prok", "KBootstrap"); |
|
|
|
|
if (!MinecraftServer.kcauldronConfig.updatecheckerQuite.getValue()) { |
|
|
|
|
mSender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Retrieving latest KBootstrap version..."); |
|
|
|
|
} |
|
|
|
|
new KVersionRetriever(this, false, false, "pw.prok", "KBootstrap"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@ -108,99 +108,99 @@ public class KCauldronUpdater implements Runnable, IVersionCheckCallback {
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void newVersion(String kbootstrapVersion) { |
|
|
|
|
boolean quite = MinecraftServer.kcauldronConfig.updatecheckerQuite |
|
|
|
|
.getValue(); |
|
|
|
|
try { |
|
|
|
|
if (!quite) { |
|
|
|
|
mSender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Downloading KBootstrap " + kbootstrapVersion + "..."); |
|
|
|
|
} |
|
|
|
|
File kbootstrap = File.createTempFile("kbootstrap", |
|
|
|
|
String.valueOf(System.currentTimeMillis())); |
|
|
|
|
download( |
|
|
|
|
"https://api.prok.pw/repo/blob/pw.prok/KBootstrap/latest/app", |
|
|
|
|
kbootstrap); |
|
|
|
|
if (!quite) { |
|
|
|
|
mSender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Installing KCauldron " + mVersion |
|
|
|
|
+ " via KBootstrap " + kbootstrapVersion + "..."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String javahome = System.getProperty("java.home"); |
|
|
|
|
String javapath = javahome + "/bin/java"; |
|
|
|
|
|
|
|
|
|
List<String> command = new ArrayList<String>(); |
|
|
|
|
command.add(javapath); |
|
|
|
|
command.add("-jar"); |
|
|
|
|
command.add(kbootstrap.getCanonicalPath()); |
|
|
|
|
command.add("--serverDir"); |
|
|
|
|
command.add(KCauldron.getServerHome().getCanonicalPath()); |
|
|
|
|
command.add("--installKCauldron"); |
|
|
|
|
command.add(String.format("%s:%s:%s", KCauldron.getGroup(), KCauldron.getChannel(), mVersion)); |
|
|
|
|
final String[] symlinks = MinecraftServer.kcauldronConfig.updatecheckerSymlinks |
|
|
|
|
.getValue().trim().split(File.pathSeparator); |
|
|
|
|
for (String symlink : symlinks) { |
|
|
|
|
command.add("--serverSymlinks"); |
|
|
|
|
command.add(symlink); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Bukkit.getConsoleSender().sendMessage( |
|
|
|
|
"Starting command: " + Joiner.on(' ').join(command)); |
|
|
|
|
|
|
|
|
|
ProcessBuilder builder = new ProcessBuilder(command); |
|
|
|
|
builder.environment().put("JAVA_HOME", javahome); |
|
|
|
|
switch (builder.start().waitFor()) { |
|
|
|
|
case 0: |
|
|
|
|
mSender.sendMessage(ChatColor.GREEN + "KCauldron " + mVersion |
|
|
|
|
+ " installed"); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
mSender.sendMessage(ChatColor.RED |
|
|
|
|
+ "Failed to install KCauldron " + mVersion); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
if (!quite) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
if (mSender != null) { |
|
|
|
|
mSender.sendMessage(ChatColor.RED + "Failed update to " |
|
|
|
|
+ mVersion); |
|
|
|
|
} |
|
|
|
|
} finally { |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
} |
|
|
|
|
boolean quite = MinecraftServer.kcauldronConfig.updatecheckerQuite |
|
|
|
|
.getValue(); |
|
|
|
|
try { |
|
|
|
|
if (!quite) { |
|
|
|
|
mSender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Downloading KBootstrap " + kbootstrapVersion + "..."); |
|
|
|
|
} |
|
|
|
|
File kbootstrap = File.createTempFile("kbootstrap", |
|
|
|
|
String.valueOf(System.currentTimeMillis())); |
|
|
|
|
download( |
|
|
|
|
"https://api.prok.pw/repo/blob/pw.prok/KBootstrap/latest/app", |
|
|
|
|
kbootstrap); |
|
|
|
|
if (!quite) { |
|
|
|
|
mSender.sendMessage(ChatColor.DARK_PURPLE |
|
|
|
|
+ "Installing KCauldron " + mVersion |
|
|
|
|
+ " via KBootstrap " + kbootstrapVersion + "..."); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String javahome = System.getProperty("java.home"); |
|
|
|
|
String javapath = javahome + "/bin/java"; |
|
|
|
|
|
|
|
|
|
List<String> command = new ArrayList<String>(); |
|
|
|
|
command.add(javapath); |
|
|
|
|
command.add("-jar"); |
|
|
|
|
command.add(kbootstrap.getCanonicalPath()); |
|
|
|
|
command.add("--serverDir"); |
|
|
|
|
command.add(KCauldron.getServerHome().getCanonicalPath()); |
|
|
|
|
command.add("--installKCauldron"); |
|
|
|
|
command.add(String.format("%s:%s:%s", KCauldron.getGroup(), KCauldron.getChannel(), mVersion)); |
|
|
|
|
final String[] symlinks = MinecraftServer.kcauldronConfig.updatecheckerSymlinks |
|
|
|
|
.getValue().trim().split(File.pathSeparator); |
|
|
|
|
for (String symlink : symlinks) { |
|
|
|
|
command.add("--serverSymlinks"); |
|
|
|
|
command.add(symlink); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Bukkit.getConsoleSender().sendMessage( |
|
|
|
|
"Starting command: " + Joiner.on(' ').join(command)); |
|
|
|
|
|
|
|
|
|
ProcessBuilder builder = new ProcessBuilder(command); |
|
|
|
|
builder.environment().put("JAVA_HOME", javahome); |
|
|
|
|
switch (builder.start().waitFor()) { |
|
|
|
|
case 0: |
|
|
|
|
mSender.sendMessage(ChatColor.GREEN + "KCauldron " + mVersion |
|
|
|
|
+ " installed"); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
mSender.sendMessage(ChatColor.RED |
|
|
|
|
+ "Failed to install KCauldron " + mVersion); |
|
|
|
|
} |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
if (!quite) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
if (mSender != null) { |
|
|
|
|
mSender.sendMessage(ChatColor.RED + "Failed update to " |
|
|
|
|
+ mVersion); |
|
|
|
|
} |
|
|
|
|
} finally { |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void error(Throwable t) { |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
t.printStackTrace(); |
|
|
|
|
KCauldron.sUpdateInProgress = false; |
|
|
|
|
t.printStackTrace(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private static void download(String url, File destination) |
|
|
|
|
throws IOException { |
|
|
|
|
HttpUriRequest request = RequestBuilder |
|
|
|
|
.get() |
|
|
|
|
.setUri(url) |
|
|
|
|
.addParameter("hostname", |
|
|
|
|
MinecraftServer.getServer().getHostname()) |
|
|
|
|
.addParameter("port", |
|
|
|
|
String.valueOf(MinecraftServer.getServer().getPort())) |
|
|
|
|
.build(); |
|
|
|
|
CloseableHttpClient client = HttpClientBuilder.create() |
|
|
|
|
.setRedirectStrategy(new LaxRedirectStrategy()) |
|
|
|
|
.setUserAgent("KCauldron Updater").build(); |
|
|
|
|
|
|
|
|
|
HttpResponse response = client.execute(request); |
|
|
|
|
if (response.getStatusLine().getStatusCode() != 200) { |
|
|
|
|
client.close(); |
|
|
|
|
throw new IllegalStateException("Could not download " + url); |
|
|
|
|
} |
|
|
|
|
InputStream is = response.getEntity().getContent(); |
|
|
|
|
OutputStream os = new FileOutputStream(destination); |
|
|
|
|
IOUtils.copy(is, os); |
|
|
|
|
is.close(); |
|
|
|
|
os.close(); |
|
|
|
|
client.close(); |
|
|
|
|
throws IOException { |
|
|
|
|
HttpUriRequest request = RequestBuilder |
|
|
|
|
.get() |
|
|
|
|
.setUri(url) |
|
|
|
|
.addParameter("hostname", |
|
|
|
|
MinecraftServer.getServer().getHostname()) |
|
|
|
|
.addParameter("port", |
|
|
|
|
String.valueOf(MinecraftServer.getServer().getPort())) |
|
|
|
|
.build(); |
|
|
|
|
CloseableHttpClient client = HttpClientBuilder.create() |
|
|
|
|
.setRedirectStrategy(new LaxRedirectStrategy()) |
|
|
|
|
.setUserAgent("KCauldron Updater").build(); |
|
|
|
|
|
|
|
|
|
HttpResponse response = client.execute(request); |
|
|
|
|
if (response.getStatusLine().getStatusCode() != 200) { |
|
|
|
|
client.close(); |
|
|
|
|
throw new IllegalStateException("Could not download " + url); |
|
|
|
|
} |
|
|
|
|
InputStream is = response.getEntity().getContent(); |
|
|
|
|
OutputStream os = new FileOutputStream(destination); |
|
|
|
|
IOUtils.copy(is, os); |
|
|
|
|
is.close(); |
|
|
|
|
os.close(); |
|
|
|
|
client.close(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|