diff --git a/build.gradle b/build.gradle index 9fb3123..08cd0ce 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,11 @@ buildscript { } } +repositories { + maven { url 'https://prok.pw/repo' } + jcenter() +} + tasks.whenTaskAdded { if (it.name.startsWith('publish')) it.dependsOn 'preparePublication' } @@ -35,15 +40,6 @@ minecraft { mainClass = 'cpw.mods.fml.relauncher.ServerLaunchWrapper' tweakClass = 'cpw.mods.fml.common.launcher.FMLTweaker' installerVersion = "1.4" - subprojects { - repositories { - mavenCentral() - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } - } - } srgExtra "PK: org/bukkit/craftbukkit org/bukkit/craftbukkit/v1_7_R4" } @@ -98,70 +94,148 @@ launch4j { jreMinVersion = '1.6.0' } -tasks.packageUniversal { - classifier = 'server' - manifest.attributes([ +configurations { + compile.extendsFrom exported + libraries + bootstrap +} + +dependencies { + bootstrap 'pw.prok:KBootstrap:0.0.9+' + + libraries 'net.minecraft:launchwrapper:1.11' + libraries 'org.ow2.asm:asm-all:5.0.3' + libraries 'com.typesafe.akka:akka-actor_2.11:2.3.3' + libraries 'com.typesafe:config:1.2.1' + libraries 'org.scala-lang:scala-actors-migration_2.11:1.1.0' + libraries 'org.scala-lang:scala-compiler:2.11.1' + libraries 'org.scala-lang.plugins:scala-continuations-library_2.11:1.0.2' + libraries 'org.scala-lang.plugins:scala-continuations-plugin_2.11.1:1.0.2' + libraries 'org.scala-lang:scala-library:2.11.1' + libraries 'org.scala-lang:scala-parser-combinators_2.11:1.0.1' + libraries 'org.scala-lang:scala-reflect:2.11.1' + libraries 'org.scala-lang:scala-swing_2.11:1.0.1' + libraries 'org.scala-lang:scala-xml_2.11:1.0.2' + libraries 'net.sf.jopt-simple:jopt-simple:4.5' + libraries 'lzma:lzma:0.0.1' + libraries 'net.sf.jopt-simple:jopt-simple:4.5' + libraries 'org.yaml:snakeyaml:1.9' + libraries 'commons-lang:commons-lang:2.6' + libraries 'org.avaje:ebean:2.7.3' + libraries 'jline:jline:2.6' + libraries 'net.md-5:SpecialSource:1.7-SNAPSHOT' + libraries 'net.sourceforge.argo:argo:2.25' + libraries 'org.fusesource.jansi:jansi:1.8' + libraries 'com.googlecode.json-simple:json-simple:1.1' + libraries 'org.xerial:sqlite-jdbc:3.7.2' + libraries 'mysql:mysql-connector-java:5.1.14' + libraries 'javax.persistence:persistence-api:1.0.2' + libraries 'net.minecraft:server:1.7.10' + libraries 'pw.prok:KImagine:0.1.12@jar' + libraries 'org.apache.httpcomponents:httpclient:4.4.1' +} + +packageUniversal { + from { configurations.exported.collect { it.isDirectory() ? it : zipTree(it) } } +} + +def String repeat(String string, int times) { + StringBuilder builder = new StringBuilder(string.length() * times) + times.times { builder.append(string) } + builder as String +} + +def generateClasspath(boolean legacy = false) { + def classpath = '' + configurations.libraries.resolvedConfiguration.resolvedArtifacts.collect { it.moduleVersion.id }.each { + def jar = "${it.group.replace('.', '/')}/${it.name}/${it.version}/${it.name}-${it.version}.jar" + classpath += " ${legacy ? 'libraries/' : repeat('../', (group as String).split('\\.').length + 2)}${jar}" + } + return classpath.trim() +} + +def generateManifest(boolean legacy = false) { + [ 'KCauldron-Git-Branch' : gitInfo('branch'), 'KCauldron-Git-Hash' : gitInfo('fullHash'), 'KCauldron-Version' : project.version, 'KCauldron-Channel' : project.name, + 'KCauldron-Legacy' : legacy, 'Implementation-Vendor' : 'Prototik', 'Implementation-Title' : project.name, 'Implementation-Version': project.version, - 'Forge-Version' : '10.13.3.1448', 'Specification-Vendor' : 'Bukkit Team', 'Specification-Title' : 'Bukkit', - 'Specification-Version' : '1.7.10-R0.1-SNAPSHOT' - ]) + 'Specification-Version' : '1.7.10-R0.1-SNAPSHOT', + 'Forge-Version' : '10.13.3.1448', + 'TweakClass' : 'cpw.mods.fml.common.launcher.FMLTweaker', + 'Main-Class' : 'cpw.mods.fml.relauncher.ServerLaunchWrapper', + 'Class-Path' : generateClasspath(legacy) + ] +} + +tasks.packageUniversal { + classifier = 'server' + setManifest {} + manifest.attributes(generateManifest(true)) +} + +task jar(type: Jar, dependsOn: packageUniversal) { + destinationDir file("${buildDir}/distributions") + from zipTree(tasks.packageUniversal.archivePath) + manifest.attributes(generateManifest()) } tasks.createChangelog.onlyIf { false } +tasks.packageInstaller.onlyIf { false } task packageChangelog(type: CreateChangelog) { onlyIf { project.hasProperty('officialBuild') } classifier = 'changelog' extension = 'txt' - oldChangelogUrl = "https://prok.pw/repo/${project.group.replace('.','/')}/${project.name}/${buildInfo('version')}/${project.name}-${buildInfo('version')}-changelog.txt" + oldChangelogUrl = "https://prok.pw/repo/${project.group.replace('.', '/')}/${project.name}/${buildInfo('version')}/${project.name}-${buildInfo('version')}-changelog.txt" hash = gitInfo('hash') message = gitInfo('message') version = project.version } -task installBundle(type: InstallBundle, dependsOn: packageInstaller) { - installer packageInstaller.archivePath +task installBundle(type: InstallBundle, dependsOn: packageUniversal) { + serverJar tasks.jar.archivePath + bootstrapClasspath configurations.bootstrap + bootstrapMain 'pw.prok.bootstrap.Main' } task packageBundle(type: Zip, dependsOn: installBundle) { onlyIf { project.hasProperty('officialBuild') } classifier = 'bundle' - from packageInstaller - from packageUniversal - from fileTree(installBundle.installLocation, { - include 'libraries/**' - include 'minecraft_server.*.jar' - }) + from fileTree(installBundle.installLocation) } -task signJars(type: Sign, dependsOn: [packageUniversal, packageInstaller, packageChangelog, packageBundle]) { - sign packageInstaller +task signJars(type: Sign, dependsOn: [packageUniversal, packageChangelog, packageBundle, jar, 'generatePomFileForMavenPublication']) { sign packageUniversal sign packageChangelog sign packageBundle + sign jar } -task preparePublication(dependsOn: signJars) {} +task signPom(type: Sign, dependsOn: 'generatePomFileForMavenPublication') { + outputs.upToDateWhen { false } + sign file("${buildDir}/publications/maven/pom-default.xml") +} + +task preparePublication(dependsOn: [signJars, signPom]) {} def getSignatureFiles = { def allFiles = project.tasks.signJars.signatureFiles.collect { it } def signedServer = allFiles.find { it.name.contains('-server') } - def signedInstaller = allFiles.find { it.name.contains('-installer') } def signedChangelog = allFiles.find { it.name.contains('-changelog') } def signedBundle = allFiles.find { it.name.contains('-bundle') } + def signedJar = (allFiles - [signedServer, signedChangelog, signedBundle])[0] return [ [archive: signedServer, classifier: 'server', extension: 'jar.asc'], - [archive: signedInstaller, classifier: 'installer', extension: 'jar.asc'], [archive: signedChangelog, classifier: 'changelog', extension: 'txt.asc'], - [archive: signedBundle, classifier: 'bundle', extension: 'jar.asc'] + [archive: signedBundle, classifier: 'bundle', extension: 'jar.asc'], + [archive: signedJar, classifier: null, extension: 'jar.asc'] ] } @@ -186,13 +260,17 @@ publishing { } } artifact packageUniversal - artifact packageInstaller artifact packageChangelog artifact packageBundle + artifact jar } } } +tasks.buildPackages { + dependsOn packageUniversal, packageChangelog, packageBundle, jar +} + tasks.generateProjectCauldron << { def file = new File('eclipse/cauldron/build.gradle') file.append(''' @@ -202,27 +280,12 @@ repositories { } } dependencies { - compile 'pw.prok:KImagine:0.1.12+@jar' - compile 'org.apache.httpcomponents:httpclient:4.4.1' -} ''') -} - -configurations { - compile.extendsFrom exported -} - -repositories { - maven { - url 'https://prok.pw/repo' + configurations.libraries.resolvedConfiguration.resolvedArtifacts.collect { it.moduleVersion.id }.each { module -> + if (['net.minecraft:server:', 'org.ow2.asm:asm-all'].findAll {(module as String).startsWith it}.size() > 0) { + return + } + file.append(" compile '${module}'\n") } -} - -dependencies { - exported 'pw.prok:KImagine:0.1.12+@jar' - exported 'org.apache.httpcomponents:httpclient:4.4.1' -} - -packageUniversal { - from { configurations.exported.collect { it.isDirectory() ? it : zipTree(it) } } + file.append('}') } diff --git a/buildSrc/src/main/groovy/kcauldron/InstallBundle.groovy b/buildSrc/src/main/groovy/kcauldron/InstallBundle.groovy index 9a65cf5..3ac75aa 100644 --- a/buildSrc/src/main/groovy/kcauldron/InstallBundle.groovy +++ b/buildSrc/src/main/groovy/kcauldron/InstallBundle.groovy @@ -2,14 +2,26 @@ package kcauldron import org.gradle.api.DefaultTask import org.gradle.api.GradleException -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.OutputDirectory -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.incremental.IncrementalTaskInputs +import org.gradle.api.file.ConfigurableFileCollection +import org.gradle.api.tasks.* class InstallBundle extends DefaultTask { @InputFile - def File installer + def File serverJar + + @InputFiles + def ConfigurableFileCollection bootstrapClasspath + + @Input + def String bootstrapMain + + InstallBundle() { + bootstrapClasspath = project.files() + } + + def bootstrapClasspath(Object... args) { + bootstrapClasspath.from args + } @OutputDirectory def File getInstallLocation() { @@ -20,14 +32,40 @@ class InstallBundle extends DefaultTask { def install() { installLocation.deleteDir() installLocation.mkdirs() + new File(installLocation, "README.txt").withWriter { + def String jarPath = 'bin/' << (project.group as String).replace('.', File.separator) << File.separator << project.name << File.separator << project.version << File.separator << project.name << '-' << project.version << '.jar' + + it << '''KCauldron installation guide + +# Understanding this bundle +You're reading this guide because you're using deprecated installation method +If you want use easier & safer method please read about KBootstrap at https://prok.pw/KBootstrap + +# Installation and usage +1. Unpack this zip into server directory +2. Use following line to start the server: + java -jar ''' + it << jarPath + it << ''' +3. That's end, enjoy + +# Why I should use KBootstrap? +1. Easiest server installation +2. Built-in libraries management +3. Update & run server in one line +4. Ability to not read this boring guide +5. What else? +If you are not yet convinced and want to use bundles instead KBootstrap... Meh, this is your choice. +''' + } + def cp = bootstrapClasspath for (int i = 0; i < 3; i++) { - def result = project.javaexec { + def result = project.javaexec { it -> workingDir installLocation - classpath installer - main 'net.minecraftforge.installer.SimpleInstaller' - args '--installServer' - standardOutput new NopOutputStream() - errorOutput new NopOutputStream() + classpath cp + main bootstrapMain + args '--serverDir', installLocation.canonicalPath, + '--installServer', serverJar.canonicalFile } if (result.exitValue == 0) return } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ff286c4..583fab1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri May 08 13:12:57 KRAT 2015 +#Tue Jun 16 17:21:00 KRAT 2015 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip diff --git a/src/main/java/kcauldron/KCauldron.java b/src/main/java/kcauldron/KCauldron.java index 7ce2921..5c2fdd5 100644 --- a/src/main/java/kcauldron/KCauldron.java +++ b/src/main/java/kcauldron/KCauldron.java @@ -34,13 +34,17 @@ public class KCauldron { sCurrentVersion = version; sBranch = manifest.getProperty("KCauldron-Branch"); sChannel = manifest.getProperty("KCauldron-Channel"); + break; } manifest.clear(); } } catch (Exception e) { e.printStackTrace(); } - + String home = System.getenv("KCAULDRON_HOME"); + if (home != null) { + sServerLocation = new File(home); + } } private static String sCurrentVersion; diff --git a/src/main/java/kcauldron/KCauldronCommand.java b/src/main/java/kcauldron/KCauldronCommand.java index 94663e5..3220557 100644 --- a/src/main/java/kcauldron/KCauldronCommand.java +++ b/src/main/java/kcauldron/KCauldronCommand.java @@ -62,8 +62,8 @@ public class KCauldronCommand extends Command { if (!testPermission(sender, CHECK)) return true; sender.sendMessage(ChatColor.GREEN + "Initiated version check..."); - new KVersionRetriever(new CommandSenderUpdateCallback(sender), - false); + KVersionRetriever.startServer(new CommandSenderUpdateCallback( + sender), false); } else if ("update".equals(action)) { KCauldronUpdater.initUpdate(sender, args.length > 1 ? args[1] : null); diff --git a/src/main/java/kcauldron/KCauldronConfig.java b/src/main/java/kcauldron/KCauldronConfig.java index 2cdea4e..05d207c 100644 --- a/src/main/java/kcauldron/KCauldronConfig.java +++ b/src/main/java/kcauldron/KCauldronConfig.java @@ -13,18 +13,14 @@ public class KCauldronConfig extends ConfigBase { true, "Enable KCauldron command"); public BoolSetting updatecheckerEnable = new BoolSetting(this, "updatechecker.enable", true, "Enable KCauldron update checker"); - public BoolSetting updatecheckerDeleteOld = new BoolSetting(this, - "updatechecker.deleteOld", true, "Delete old version after update"); public StringSetting updatecheckerSymlinks = new StringSetting(this, - "updatechecker.symlinks", "", "(Re)create symlinks after update"); + "updatechecker.symlinks", "KCauldron.jar", "(Re)create symlinks after update"); public BoolSetting updatecheckerAutoinstall = new BoolSetting(this, "updatechecker.autoinstall", false, "Install updates without confirming"); public BoolSetting updatecheckerAutorestart = new BoolSetting(this, "updatechecker.autorestart", false, "Restart server after updating without confirming (set restart script in spigot.yml)"); public BoolSetting updatecheckerQuite = new BoolSetting(this, "updatechecker.quite", false, "Print less info during update"); - public StringSetting updatecheckerInstallAs = new StringSetting(this, - "updatechecker.installAs", "", "Install new version with specified name"); public BoolSetting loggingMaterialInjection = new BoolSetting(this, "logging.materialInjection", false, "Log material injection event"); @@ -33,12 +29,10 @@ public class KCauldronConfig extends ConfigBase { super("kcauldron.yml", "kc"); register(commandEnable); register(updatecheckerEnable); - register(updatecheckerDeleteOld); register(updatecheckerSymlinks); register(updatecheckerAutoinstall); register(updatecheckerAutorestart); register(updatecheckerQuite); - register(updatecheckerInstallAs); register(loggingMaterialInjection); load(); } diff --git a/src/main/java/kcauldron/updater/CommandSenderUpdateCallback.java b/src/main/java/kcauldron/updater/CommandSenderUpdateCallback.java index e0d66d1..5ae0ffd 100644 --- a/src/main/java/kcauldron/updater/CommandSenderUpdateCallback.java +++ b/src/main/java/kcauldron/updater/CommandSenderUpdateCallback.java @@ -3,6 +3,7 @@ package kcauldron.updater; import java.lang.ref.Reference; import java.lang.ref.WeakReference; +import kcauldron.KCauldron; import kcauldron.updater.KVersionRetriever.IVersionCheckCallback; import org.bukkit.ChatColor; @@ -14,38 +15,39 @@ public class CommandSenderUpdateCallback implements IVersionCheckCallback { public CommandSenderUpdateCallback(CommandSender sender) { mSender = new WeakReference(sender); } - + protected CommandSender getSender() { return mSender.get(); } @Override - public void upToDate(String version) { + public void upToDate() { CommandSender sender = mSender.get(); if (sender != null) { sender.sendMessage(ChatColor.GREEN - + "Running version of KCauldron is up-to-date: " + version); + + "Running version of KCauldron is up-to-date: " + + KCauldron.getCurrentVersion()); } - DefaultUpdateCallback.INSTANCE.upToDate(version); + DefaultUpdateCallback.INSTANCE.upToDate(); } @Override - public void newVersion(String currentVersion, String newVersion) { + public void newVersion(String newVersion) { CommandSender sender = mSender.get(); if (sender != null) { - newVersion(sender, currentVersion, newVersion); + newVersion(sender, KCauldron.getCurrentVersion(), newVersion); } - DefaultUpdateCallback.INSTANCE.newVersion(currentVersion, newVersion); + DefaultUpdateCallback.INSTANCE.newVersion(newVersion); } - public static void newVersion(CommandSender sender, String currentVersion, String newVersion) { + public static void newVersion(CommandSender sender, String currentVersion, + String newVersion) { sender.sendMessage(new String[] { ChatColor.YELLOW + "Found new version of KCauldron: " + newVersion, ChatColor.YELLOW + "Current is " + currentVersion, - ChatColor.YELLOW + "Type '" + ChatColor.BLUE - + "/kc update" + ChatColor.YELLOW - + "' to update" }); + ChatColor.YELLOW + "Type '" + ChatColor.BLUE + "/kc update" + + ChatColor.YELLOW + "' to update" }); } @Override diff --git a/src/main/java/kcauldron/updater/DefaultUpdateCallback.java b/src/main/java/kcauldron/updater/DefaultUpdateCallback.java index 485f989..0913ac3 100644 --- a/src/main/java/kcauldron/updater/DefaultUpdateCallback.java +++ b/src/main/java/kcauldron/updater/DefaultUpdateCallback.java @@ -41,15 +41,15 @@ public class DefaultUpdateCallback implements IVersionCheckCallback { } @Override - public void upToDate(String version) { + public void upToDate() { mHasUpdate = false; - mCurrentVersion = version; + mCurrentVersion = KCauldron.getCurrentVersion(); mNewVersion = null; } @Override - public void newVersion(String currentVersion, String newVersion) { - mCurrentVersion = currentVersion; + public void newVersion(String newVersion) { + mCurrentVersion = KCauldron.getCurrentVersion(); mNewVersion = newVersion; if (!mHasUpdate) { Bukkit.getConsoleSender().sendMessage( diff --git a/src/main/java/kcauldron/updater/KCauldronUpdater.java b/src/main/java/kcauldron/updater/KCauldronUpdater.java index 52ec042..1621aea 100644 --- a/src/main/java/kcauldron/updater/KCauldronUpdater.java +++ b/src/main/java/kcauldron/updater/KCauldronUpdater.java @@ -1,10 +1,14 @@ package kcauldron.updater; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; +import java.util.ArrayList; +import java.util.List; import kcauldron.KCauldron; +import kcauldron.updater.KVersionRetriever.IVersionCheckCallback; import net.minecraft.server.MinecraftServer; import org.apache.http.HttpResponse; @@ -15,9 +19,9 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; -import com.google.common.base.Splitter; +import com.google.common.base.Joiner; -public class KCauldronUpdater implements Runnable { +public class KCauldronUpdater implements Runnable, IVersionCheckCallback { private static final class LatestVersionCallback extends CommandSenderUpdateCallback { public LatestVersionCallback(CommandSender sender) { @@ -25,17 +29,17 @@ public class KCauldronUpdater implements Runnable { } @Override - public void newVersion(String currentVersion, String newVersion) { + public void newVersion(String newVersion) { startUpdate(getSender(), newVersion); } @Override - public void upToDate(String version) { + public void upToDate() { KCauldron.sUpdateInProgress = false; CommandSender sender = getSender(); if (sender != null) { sender.sendMessage(ChatColor.DARK_PURPLE + "Current version (" - + version + ") is up to date"); + + KCauldron.getCurrentVersion() + ") is up to date"); } } @@ -56,7 +60,8 @@ public class KCauldronUpdater implements Runnable { if (version == null) { sender.sendMessage(ChatColor.DARK_PURPLE + "Fetching latest version..."); - new KVersionRetriever(new LatestVersionCallback(sender), false); + KVersionRetriever.startServer(new LatestVersionCallback(sender), + false); } else { startUpdate(sender, version); } @@ -85,78 +90,66 @@ public class KCauldronUpdater implements Runnable { @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"); + } + + @Override + public void upToDate() { + + } + + @Override + public void newVersion(String kbootstrapVersion) { boolean quite = MinecraftServer.kcauldronConfig.updatecheckerQuite .getValue(); try { - MinecraftServer server = MinecraftServer.getServer(); - final String filename = KCauldron.getChannel() + "-" + mVersion - + "-server.jar"; - File path = KCauldron.getServerLocation(); - File newPath = new File(path.getParentFile(), - getInstallAs(filename)); - if (mSender != null) { - if (!quite) { - mSender.sendMessage(ChatColor.DARK_PURPLE - + "Current version is located in " + ChatColor.GOLD - + path.getAbsolutePath()); - mSender.sendMessage(ChatColor.DARK_PURPLE - + "Installing new version in " + ChatColor.GOLD - + newPath.getAbsolutePath()); - } - if (newPath.exists()) { - Bukkit.getConsoleSender().sendMessage( - "ERROR: Install location already exists: " - + newPath.getAbsolutePath()); - mSender.sendMessage(ChatColor.RED - + "ERROR: Install location already exists"); - return; - } - if (!quite) { - mSender.sendMessage(ChatColor.DARK_PURPLE - + "Downloading new version..."); - } - } - HttpUriRequest request = RequestBuilder - .get() - .setUri("https://prok.pw/repo/pw/prok/" - + KCauldron.getChannel() + "/" + mVersion + "/" - + filename) - .addParameter("hostname", server.getHostname()) - .addParameter("port", "" + server.getPort()).build(); - HttpResponse response = HttpClientBuilder.create() - .setUserAgent("KCauldron Updater").build().execute(request); - if (response.getStatusLine().getStatusCode() != 200) { - throw new IllegalStateException( - "Could not download new version"); - } - InputStream is = response.getEntity().getContent(); - Files.copy(is, newPath.toPath()); - if (mSender != null && !quite) { + if (!quite) { mSender.sendMessage(ChatColor.DARK_PURPLE - + "Download completed"); + + "Downloading KBootstrap " + kbootstrapVersion + "..."); } - makeSymlinks(newPath); - if (MinecraftServer.kcauldronConfig.updatecheckerDeleteOld - .getValue()) { - if (mSender != null && !quite) { - mSender.sendMessage(ChatColor.DARK_PURPLE - + "Mark old version for deletion"); - } - path.deleteOnExit(); - if (KCauldron.sNewServerLocation != null) { - KCauldron.sNewServerLocation.deleteOnExit(); - } + File kbootstrap = File.createTempFile("kbootstrap", + String.valueOf(System.currentTimeMillis())); + download("https://prok.pw/repo/pw/prok/KBootstrap/" + + kbootstrapVersion + "/KBootstrap-" + kbootstrapVersion + + "-app.jar", kbootstrap); + if (!quite) { + mSender.sendMessage(ChatColor.DARK_PURPLE + + "Installing KCauldron " + mVersion + + " via KBootstrap " + kbootstrapVersion + "..."); } - if (mSender != null) { - mSender.sendMessage(ChatColor.DARK_PURPLE + "Update completed"); - } - KCauldron.sNewServerLocation = newPath; - KCauldron.sNewServerVersion = mVersion; - if (MinecraftServer.kcauldronConfig.updatecheckerAutorestart.getValue()) { - if (mSender != null) { - mSender.sendMessage(ChatColor.DARK_RED + "Initiate server restart"); - } - KCauldron.restart(); + + String javahome = System.getProperty("java.home"); + String javapath = javahome + "/bin/java"; + + List command = new ArrayList(); + command.add(javapath); + command.add("-jar"); + command.add(kbootstrap.getCanonicalPath()); + command.add("--serverDir"); + command.add(KCauldron.getServerLocation().getCanonicalPath()); + command.add("--installKCauldron"); + command.add(mVersion); + command.add("--serverSymlinks"); + command.add(MinecraftServer.kcauldronConfig.updatecheckerSymlinks + .getValue()); + + 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) { @@ -171,35 +164,29 @@ public class KCauldronUpdater implements Runnable { } } - private String getInstallAs(String filename) { - String path = MinecraftServer.kcauldronConfig.updatecheckerInstallAs - .getValue().trim(); - if (path.length() > 0) { - return path.replace("%version%", mVersion); - } - return filename; + @Override + public void error(Throwable t) { + KCauldron.sUpdateInProgress = false; + t.printStackTrace(); } - private void makeSymlinks(File newPath) { - try { - for (String symlink : Splitter.on(File.pathSeparatorChar).split( - MinecraftServer.kcauldronConfig.updatecheckerSymlinks - .getValue())) { - symlink = symlink.trim(); - if (symlink.length() == 0) - continue; - File symlinkPath = new File(symlink); - if (mSender != null - && !MinecraftServer.kcauldronConfig.updatecheckerQuite - .getValue()) { - mSender.sendMessage(ChatColor.RED + "Create symlink " - + ChatColor.GOLD + symlinkPath.getAbsolutePath()); - } - Files.deleteIfExists(symlinkPath.toPath()); - Files.createSymbolicLink(symlinkPath.toPath(), newPath.toPath()); - } - } catch (Exception e) { - + 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(); + HttpResponse response = HttpClientBuilder.create() + .setUserAgent("KCauldron Updater").build().execute(request); + if (response.getStatusLine().getStatusCode() != 200) { + throw new IllegalStateException("Could not download " + url); } + InputStream is = response.getEntity().getContent(); + Files.copy(is, destination.toPath()); + is.close(); } } diff --git a/src/main/java/kcauldron/updater/KVersionRetriever.java b/src/main/java/kcauldron/updater/KVersionRetriever.java index 8302423..09f05a0 100644 --- a/src/main/java/kcauldron/updater/KVersionRetriever.java +++ b/src/main/java/kcauldron/updater/KVersionRetriever.java @@ -18,33 +18,42 @@ public class KVersionRetriever implements Runnable, UncaughtExceptionHandler { private static final boolean DEBUG; private static final KLog sLogger; private static final JSONParser sParser; - private static final String sCurrentVersion; private static MinecraftServer sServer; static { DEBUG = false; sLogger = KLog.get(KVersionRetriever.class.getSimpleName()); - sCurrentVersion = KCauldron.getCurrentVersion(); sParser = new JSONParser(); } public static void init(MinecraftServer server) { sServer = server; if (MinecraftServer.kcauldronConfig.updatecheckerEnable.getValue()) { - new KVersionRetriever(DefaultUpdateCallback.INSTANCE, true); + startServer(DefaultUpdateCallback.INSTANCE, true); } } + public static void startServer(IVersionCheckCallback callback, boolean loop) { + new KVersionRetriever(callback, loop, true, "pw.prok",KCauldron.getChannel()); + } + private final IVersionCheckCallback mCallback; private final boolean mLoop; private final Thread mThread; + private final String mGroup; + private final String mName; + private final boolean mUpToDateSupport; - public KVersionRetriever(IVersionCheckCallback callback, boolean loop) { + public KVersionRetriever(IVersionCheckCallback callback, boolean loop, + boolean upToDateSupport, String group, String name) { if (DEBUG) sLogger.info("Created new version retrivier"); mCallback = callback; mLoop = loop; + mUpToDateSupport = upToDateSupport; + mGroup = group; + mName = name; mThread = new Thread(this); mThread.setName("KCauldron version retrievier"); mThread.setPriority(Thread.MIN_PRIORITY); @@ -68,13 +77,9 @@ public class KVersionRetriever implements Runnable, UncaughtExceptionHandler { } private void check() { - if (DEBUG) - sLogger.info("Requesting for new version..."); try { - HttpUriRequest request = RequestBuilder - .get() - .setUri("https://prok.pw/version/pw.prok/" - + KCauldron.getChannel()) + HttpUriRequest request = RequestBuilder.get() + .setUri("https://prok.pw/version/" + mGroup + "/" + mName) .addParameter("hostname", sServer.getHostname()) .addParameter("port", "" + sServer.getPort()).build(); HttpResponse response = HttpClientBuilder.create() @@ -83,14 +88,11 @@ public class KVersionRetriever implements Runnable, UncaughtExceptionHandler { JSONObject json = (JSONObject) sParser.parse(new InputStreamReader( response.getEntity().getContent())); String version = (String) json.get("version"); - if (DEBUG) { - sLogger.info("Got the latest version: %s", version); - sLogger.info("Current version is %s", sCurrentVersion); - } - if (!sCurrentVersion.equals(version)) { - mCallback.newVersion(sCurrentVersion, version); + if (!mUpToDateSupport + || !KCauldron.getCurrentVersion().equals(version)) { + mCallback.newVersion(version); } else { - mCallback.upToDate(version); + mCallback.upToDate(); } } catch (Exception e) { uncaughtException(null, e); @@ -106,9 +108,9 @@ public class KVersionRetriever implements Runnable, UncaughtExceptionHandler { } public interface IVersionCheckCallback { - void upToDate(String version); + void upToDate(); - void newVersion(String currentVersion, String newVersion); + void newVersion(String newVersion); void error(Throwable t); }