001 package net.minecraft.network.rcon;
002
003 import java.io.IOException;
004 import java.net.InetAddress;
005 import java.net.ServerSocket;
006 import java.net.Socket;
007 import java.net.SocketTimeoutException;
008 import java.util.HashMap;
009 import java.util.Iterator;
010 import java.util.Map;
011 import java.util.Map.Entry;
012
013 public class RConThreadMain extends RConThreadBase
014 {
015 /** Port RCon is running on */
016 private int rconPort;
017
018 /** Port the server is running on */
019 private int serverPort;
020
021 /** Hostname RCon is running on */
022 private String hostname;
023
024 /** The RCon ServerSocket. */
025 private ServerSocket serverSocket = null;
026
027 /** The RCon password */
028 private String rconPassword;
029
030 /** A map of client addresses to their running Threads */
031 private Map clientThreads;
032
033 public RConThreadMain(IServer par1IServer)
034 {
035 super(par1IServer);
036 this.rconPort = par1IServer.getIntProperty("rcon.port", 0);
037 this.rconPassword = par1IServer.getStringProperty("rcon.password", "");
038 this.hostname = par1IServer.getHostname();
039 this.serverPort = par1IServer.getPort();
040
041 if (0 == this.rconPort)
042 {
043 this.rconPort = this.serverPort + 10;
044 this.logInfo("Setting default rcon port to " + this.rconPort);
045 par1IServer.setProperty("rcon.port", Integer.valueOf(this.rconPort));
046
047 if (0 == this.rconPassword.length())
048 {
049 par1IServer.setProperty("rcon.password", "");
050 }
051
052 par1IServer.saveProperties();
053 }
054
055 if (0 == this.hostname.length())
056 {
057 this.hostname = "0.0.0.0";
058 }
059
060 this.initClientThreadList();
061 this.serverSocket = null;
062 }
063
064 private void initClientThreadList()
065 {
066 this.clientThreads = new HashMap();
067 }
068
069 /**
070 * Cleans up the clientThreads map by removing client Threads that are not running
071 */
072 private void cleanClientThreadsMap()
073 {
074 Iterator var1 = this.clientThreads.entrySet().iterator();
075
076 while (var1.hasNext())
077 {
078 Entry var2 = (Entry)var1.next();
079
080 if (!((RConThreadClient)var2.getValue()).isRunning())
081 {
082 var1.remove();
083 }
084 }
085 }
086
087 public void run()
088 {
089 this.logInfo("RCON running on " + this.hostname + ":" + this.rconPort);
090
091 try
092 {
093 while (this.running)
094 {
095 try
096 {
097 Socket var1 = this.serverSocket.accept();
098 var1.setSoTimeout(500);
099 RConThreadClient var2 = new RConThreadClient(this.server, var1);
100 var2.startThread();
101 this.clientThreads.put(var1.getRemoteSocketAddress(), var2);
102 this.cleanClientThreadsMap();
103 }
104 catch (SocketTimeoutException var7)
105 {
106 this.cleanClientThreadsMap();
107 }
108 catch (IOException var8)
109 {
110 if (this.running)
111 {
112 this.logInfo("IO: " + var8.getMessage());
113 }
114 }
115 }
116 }
117 finally
118 {
119 this.closeServerSocket(this.serverSocket);
120 }
121 }
122
123 /**
124 * Creates a new Thread object from this class and starts running
125 */
126 public void startThread()
127 {
128 if (0 == this.rconPassword.length())
129 {
130 this.logWarning("No rcon password set in \'" + this.server.getSettingsFilename() + "\', rcon disabled!");
131 }
132 else if (0 < this.rconPort && 65535 >= this.rconPort)
133 {
134 if (!this.running)
135 {
136 try
137 {
138 this.serverSocket = new ServerSocket(this.rconPort, 0, InetAddress.getByName(this.hostname));
139 this.serverSocket.setSoTimeout(500);
140 super.startThread();
141 }
142 catch (IOException var2)
143 {
144 this.logWarning("Unable to initialise rcon on " + this.hostname + ":" + this.rconPort + " : " + var2.getMessage());
145 }
146 }
147 }
148 else
149 {
150 this.logWarning("Invalid rcon port " + this.rconPort + " found in \'" + this.server.getSettingsFilename() + "\', rcon disabled!");
151 }
152 }
153 }