diff --git a/api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java b/api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java index 4a7135aa..f754eb41 100644 --- a/api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java +++ b/api/src/main/java/net/md_5/bungee/api/plugin/PluginDescription.java @@ -40,4 +40,8 @@ public class PluginDescription * File we were loaded from. */ private File file = null; + /** + * Optional description. + */ + private String description = null; } diff --git a/proxy/src/main/java/net/md_5/bungee/module/JenkinsModuleSource.java b/proxy/src/main/java/net/md_5/bungee/module/JenkinsModuleSource.java index 0ef1e76d..cbc36e68 100644 --- a/proxy/src/main/java/net/md_5/bungee/module/JenkinsModuleSource.java +++ b/proxy/src/main/java/net/md_5/bungee/module/JenkinsModuleSource.java @@ -4,15 +4,17 @@ import com.google.common.io.ByteStreams; import com.google.common.io.Files; import java.io.IOException; import java.net.URL; +import lombok.Data; import net.md_5.bungee.Util; +@Data public class JenkinsModuleSource implements ModuleSource { @Override public void retrieve(ModuleSpec module, ModuleVersion version) { - System.out.println( "Attempting to Jenkins download module " + module.getName() + "v" + version.getBuild() ); + System.out.println( "Attempting to Jenkins download module " + module.getName() + " v" + version.getBuild() ); try { URL website = new URL( "http://ci.md-5.net/job/BungeeCord/" + version.getBuild() + "/artifact/module/" + module.getName().replace( '_', '-' ) + "/target/" + module.getName() + ".jar" ); diff --git a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java index 84b254e1..6fb3eef4 100644 --- a/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java +++ b/proxy/src/main/java/net/md_5/bungee/module/ModuleManager.java @@ -2,7 +2,12 @@ package net.md_5.bungee.module; import com.google.common.base.Preconditions; import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; import java.io.InputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -11,6 +16,8 @@ import java.util.jar.JarFile; import java.util.logging.Level; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.PluginDescription; +import net.md_5.bungee.util.CaseInsensitiveMap; +import org.yaml.snakeyaml.DumperOptions; import org.yaml.snakeyaml.Yaml; public class ModuleManager @@ -25,47 +32,116 @@ public class ModuleManager public void load(ProxyServer proxy) throws Exception { - ModuleVersion bungeeVersion = ModuleVersion.parse( "git:BungeeCord-Proxy:1.7-SNAPSHOT:\"93cf50b\":792" ); + ModuleVersion bungeeVersion = ModuleVersion.parse( proxy.getVersion() ); + if ( bungeeVersion == null ) + { + System.out.println( "Could detect bungee version. Custom build?" ); + return; + } File moduleDirectory = new File( "modules" ); moduleDirectory.mkdir(); - Map modules = new HashMap<>(); + List modules = new ArrayList<>(); + File configFile = new File( "modules.yml" ); + // Start Yaml + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle( DumperOptions.FlowStyle.BLOCK ); + Yaml yaml = new Yaml( options ); - // TODO: Use filename filter here and in PluginManager - Yaml yaml = new Yaml(); - for ( File file : moduleDirectory.listFiles() ) + Map config; + + configFile.createNewFile(); + try ( InputStream is = new FileInputStream( configFile ) ) { - if ( file.isFile() && file.getName().endsWith( ".jar" ) ) + config = (Map) yaml.load( is ); + } + + if ( config == null ) + { + config = new CaseInsensitiveMap(); + } else + { + config = new CaseInsensitiveMap( config ); + } + // End yaml + + List defaults = new ArrayList<>(); + if ( config.containsKey( "modules" ) ) + { + defaults.addAll( (Collection) config.get( "modules" ) ); + } + int version = ( config.containsKey( "version" ) ) ? (int) config.get( "version" ) : 0; + switch ( version ) + { + case 0: + defaults.add( "jenkins://cmd_alert" ); + defaults.add( "jenkins://cmd_find" ); + defaults.add( "jenkins://cmd_list" ); + defaults.add( "jenkins://cmd_send" ); + defaults.add( "jenkins://cmd_server" ); + } + config.put( "modules", defaults ); + config.put( "version", 1 ); + + try ( FileWriter wr = new FileWriter( configFile ) ) + { + yaml.dump( config, wr ); + } + + for ( String s : (List) config.get( "modules" ) ) + { + URI uri = new URI( s ); + + ModuleSource source = knownSources.get( uri.getScheme() ); + if ( source == null ) { - String moduleName = file.getName().substring( 0, file.getName().length() - 4 ); // 4 = .jar.length() - ModuleSource source = modules.get( moduleName ); - if ( source == null ) - { - System.out.println( "No source for module in file: " + file ); - continue; - } + System.out.println( "Unknown module source: " + s ); + continue; + } + String name = uri.getAuthority(); + if ( name == null ) + { + System.out.println( "Unknown module host: " + s ); + continue; + } - try ( JarFile jar = new JarFile( file ) ) - { - JarEntry pdf = jar.getJarEntry( "plugin.yml" ); - Preconditions.checkNotNull( pdf, "Plugin must have a plugin.yml" ); + ModuleSpec spec = new ModuleSpec( name, new File( moduleDirectory, name + ".jar" ), source ); + modules.add( spec ); + System.out.println( "Discovered module: " + spec ); + } - try ( InputStream in = jar.getInputStream( pdf ) ) - { - PluginDescription desc = yaml.loadAs( in, PluginDescription.class ); - ModuleVersion moduleVersion = ModuleVersion.parse( desc.getVersion() ); - if ( !moduleVersion.equals( bungeeVersion ) ) - { - System.out.println( "Attempting to update plugin from " + moduleVersion + " to " + bungeeVersion ); - source.retrieve( new ModuleSpec( moduleName, file ), bungeeVersion ); - } - } - } catch ( Exception ex ) - { - ProxyServer.getInstance().getLogger().log( Level.WARNING, "Could not check module from file " + file, ex ); - } + for ( ModuleSpec module : modules ) + { + ModuleVersion moduleVersion = ( module.getFile().exists() ) ? getVersion( module.getFile() ) : null; + + if ( !bungeeVersion.equals( moduleVersion ) ) + { + System.out.println( "Attempting to update plugin from " + moduleVersion + " to " + bungeeVersion ); + module.getProvider().retrieve( module, bungeeVersion ); } } + + proxy.getPluginManager().detectPlugins( moduleDirectory ); + } + + private ModuleVersion getVersion(File file) + { + try ( JarFile jar = new JarFile( file ) ) + { + JarEntry pdf = jar.getJarEntry( "plugin.yml" ); + Preconditions.checkNotNull( pdf, "Plugin must have a plugin.yml" ); + + try ( InputStream in = jar.getInputStream( pdf ) ) + { + PluginDescription desc = new Yaml().loadAs( in, PluginDescription.class ); + return ModuleVersion.parse( desc.getVersion() ); + } + } catch ( Exception ex ) + { + ProxyServer.getInstance().getLogger().log( Level.WARNING, "Could not check module from file " + file, ex ); + } + + return null; } } diff --git a/proxy/src/main/java/net/md_5/bungee/module/ModuleSpec.java b/proxy/src/main/java/net/md_5/bungee/module/ModuleSpec.java index 8bde0f1f..ebf6cf67 100644 --- a/proxy/src/main/java/net/md_5/bungee/module/ModuleSpec.java +++ b/proxy/src/main/java/net/md_5/bungee/module/ModuleSpec.java @@ -9,5 +9,5 @@ public class ModuleSpec private final String name; private final File file; - private ModuleSource provider; + private final ModuleSource provider; } diff --git a/proxy/src/main/java/net/md_5/bungee/module/ModuleVersion.java b/proxy/src/main/java/net/md_5/bungee/module/ModuleVersion.java index b1236514..62773c87 100644 --- a/proxy/src/main/java/net/md_5/bungee/module/ModuleVersion.java +++ b/proxy/src/main/java/net/md_5/bungee/module/ModuleVersion.java @@ -16,6 +16,12 @@ public class ModuleVersion { int lastColon = version.lastIndexOf( ':' ); int secondLastColon = version.lastIndexOf( ':', lastColon - 1 ); + + if ( lastColon == -1 || secondLastColon == -1 ) + { + return null; + } + String buildNumber = version.substring( lastColon + 1, version.length() ); String gitCommit = version.substring( secondLastColon + 1, lastColon ).replaceAll( "\"", "" );