| /* |
| * This file is part of the QuickServer library |
| * Copyright (C) QuickServer.org |
| * |
| * Use, modification, copying and distribution of this software is subject to |
| * the terms and conditions of the GNU Lesser General Public License. |
| * You should have received a copy of the GNU LGP License along with this |
| * library; if not, you can download a copy from <http://www.quickserver.org/>. |
| * |
| * For questions, suggestions, bug-reports, enhancement-requests etc. |
| * visit http://www.quickserver.org |
| * |
| */ |
| |
| package org.quickserver.net.qsadmin; |
| |
| import java.net.*; |
| import java.io.*; |
| import java.text.Format; |
| import java.text.SimpleDateFormat; |
| import java.util.StringTokenizer; |
| |
| import org.quickserver.net.server.ClientCommandHandler; |
| import org.quickserver.net.server.ClientEventHandler; |
| import org.quickserver.net.server.ClientHandler; |
| import org.quickserver.net.server.QuickServer; |
| import org.quickserver.net.AppException; |
| |
| import java.util.logging.*; |
| |
| import org.quickserver.util.*; |
| import org.quickserver.util.pool.thread.*; |
| import java.util.*; |
| import org.quickserver.util.pool.*; |
| import org.apache.commons.pool.ObjectPool; |
| import org.quickserver.net.server.ClientIdentifier; |
| |
| /** |
| * ClientCommandHandler for QSAdminServer. |
| * <p> |
| * = Protocol =<br> |
| * Each response starts with a status. |
| * <ul> |
| * <li>+OK = Success |
| * <li>-ERR = Failed |
| * </ul> |
| * If response if one lined then it follows the status. |
| * Else You will get "info follows" as the first line |
| * followed by with many lines of response ending by a |
| * dot in a line by itself. i.e., <CR><LF>.<CR><LF><br> |
| * Command supported are give below .. [ Note: <<target>> = server|self ] |
| * <br> <br> |
| * <table align="center" border=1> |
| * <tr><th>Command</th><th>Param</th><th>Effect</th></tr> |
| * <tr><td>start</td><td><<target>></td><td>Starts target.</td></tr> |
| * <tr><td>stop</td><td><<target>></td><td>Stops target.</td></tr> |
| * <tr><td>restart</td><td><<target>></td><td>=stop+start command</td></tr> |
| * <tr><td>shutdown</td><td> </td><td>Stops server and self. </td></tr> |
| * <tr><td>kill or exit</td><td> </td><td>Stops server and self and kill all threads. </td></tr> |
| * <tr><td>info</td><td><<target>></td><td>Information about target.</td></tr> |
| * <tr><td>noclient</td><td><<target>></td><td>No Client connected to the target.</td></tr> |
| * <tr><td>running</td><td><<target>></td><td>Checks if target is running.</td></tr> |
| * <tr><td>get</td><td><<target>> maxClient</td><td>Gets max no of client for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> port</td><td>Gets port for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> maxAuthTryMsg</td><td>Gets maxAuthTryMsg for the target. </td></tr> |
| * <tr><td>get</td><td><<target>> clientCommandHandler</td><td>Gets ClientCommandHandler class for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> clientAuthenticationHandler</td><td>Gets ClientAuthenticationHandler class for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> clientData</td><td>Gets ClientData class for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> timeout</td><td>Gets timeout set for clients for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> maxClient <<value>></td><td>Sets max no of client for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> port <<value>></td><td>Sets port for the target.*</td></tr> |
| * <tr><td>set</td><td><<target>> maxAuthTryMsg <<value>></td><td>Sets maxAuthTryMsg for the target. *</td></tr> |
| * <tr><td>set</td><td><<target>> clientCommandHandler <<value>></td><td>Sets ClientCommandHandler class for the target. *</td></tr> |
| * <tr><td>set</td><td><<target>> clientAuthenticationHandler <<value>></td><td>Sets ClientAuthenticationHandler class for the target. *</td></tr> |
| * <tr><td>set</td><td><<target>> clientData <<value>></td><td>Sets ClientData class for the target. *</td></tr> |
| * <tr><td>set</td><td><<target>> timeout <<value>></td><td>Sets timeout set for clients for the target. *</td></tr> |
| * <tr><td>version</td><td> </td><td>Gets the version of the QuickServer library used.</td></tr> |
| * <tr><td>quit</td><td> </td><td>Close session.</td></tr> |
| * <tr><td colspan=3>New Command in v1.2 </td></tr> |
| * <tr><td>get</td><td>self plugin</td><td>Gets pluggable command handler for QsAdminServer. *</td></tr> |
| * <tr><td>set</td><td>self plugin <<full class name>></td><td>Sets Pluggable command handler for QsAdminServer. *</td></tr> |
| * <tr><td colspan=3>New Command in v1.3 </td></tr> |
| * <tr><td>suspendService</td><td><<target>></td><td>Suspends target.</td></tr> |
| * <tr><td>resumeService</td><td><<target>></td><td>Resume target.</td></tr> |
| * <tr><td>get</td><td><<target>> maxAuthTry</td><td>Gets maxAuthTry for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> maxAuthTry</td><td>Sets maxAuthTry for the target.*</td></tr> |
| * <tr><td>get</td><td><<target>> clientObjectHandler</td><td>Gets ClientObjectHandler class for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> clientObjectHandler</td><td>Sets ClientObjectHandler class for the target.*</td></tr> |
| * <tr><td>get</td><td><<target>> timeoutMsg</td><td>Gets timeout Message for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> timeoutMsg</td><td>Sets timeout Message for the target.*</td></tr> |
| * <tr><td>get</td><td><<target>> serviceState</td><td>Gets Service State for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> consoleLoggingFormatter</td><td>Sets consoleLoggingFormatter for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> consoleLoggingFormatter</td><td>Sets consoleLoggingFormatter for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> consoleLoggingLevel</td><td>Sets consoleLoggingLevel for the target. <br> |
| * <tr><td>set</td><td><<target>> consoleLoggingLevel</td><td>Sets consoleLoggingLevel for the target. <br> |
| * [<code>SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST<code>]</td></tr> |
| * <tr><td>set</td><td><<target>> maxClientMsg</td><td>Sets maxClientMsg for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> maxClientMsg</td><td>Gets maxClientMsg for the target.</td></tr> |
| * <tr><td colspan=3>New Command in v1.3.1 </td></tr> |
| * <tr><td>set</td><td><<target>> loggingLevel</td><td>Sets LoggingLevel for the target. <br> |
| * [<code>SEVERE|WARNING|INFO|CONFIG|FINE|FINER|FINEST<code>]</td></tr> |
| * <tr><td colspan=3>New Command in v1.3.2 </td></tr> |
| * <tr><td>memoryInfo</td><td> </td><td>Memory Information {Total:Used:Max}</td></tr> |
| * <tr><td>set</td><td><<target>> communicationLogging</td><td>Sets communication logging flag for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> communicationLogging</td><td>Gets communication logging flag for the target.</td></tr> |
| |
| * <tr><td>set</td><td><<target>> objectPoolConfig-maxActive</td><td>Sets maxActive of objectPoolConfig for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> objectPoolConfig-maxActive</td><td>Gets maxActive of objectPoolConfig for the target.</td></tr> |
| |
| * <tr><td>set</td><td><<target>> objectPoolConfig-maxIdle</td><td>Sets maxIdle of objectPoolConfig for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> objectPoolConfig-maxIdle</td><td>Gets maxIdle of objectPoolConfig for the target.</td></tr> |
| * |
| * <tr><td colspan=3>New Command in v1.4.5 </td></tr> |
| * <tr><td>all-pool-info</td><td><<target>></td><td>Gives stats of all pools for the target.</td></tr> |
| * <tr><td>client-thread-pool-dump</td><td><<target>></td><td>Gives dump of all threads in pool for the target.</td></tr> |
| * <tr><td>start</td><td><<console>></td><td>Starts console shell.</td></tr> |
| * <tr><td>stop</td><td><<console>></td><td>Stops console shell.</td></tr> |
| * |
| * <tr><td colspan=3>New Command in v1.4.6 </td></tr> |
| * <tr><td>client-handler-pool-dump</td><td><<target>></td><td>Gives dump of all ClientHandler in pool for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> clientEventHandler</td><td>Gets ClientEventHandler class for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> clientEventHandler <<value>></td><td>Sets ClientEventHandler class for the target. *</td></tr> |
| * <tr><td>get</td><td><<target>> clientWriteHandler</td><td>Gets ClientWriteHandler class for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> clientWriteHandler <<value>></td><td>Sets ClientWriteHandler class for the target. *</td></tr> |
| * <tr><td>get</td><td><<target>> clientExtendedEventHandler</td><td>Gets ClientExtendedEventHandler class for the target.</td></tr> |
| * <tr><td>set</td><td><<target>> clientExtendedEventHandler <<value>></td><td>Sets ClientExtendedEventHandler class for the target. *</td></tr> |
| * <tr><td>set</td><td><<target>> objectPoolConfig-initSize</td><td>Sets initSize of objectPoolConfig for the target.</td></tr> |
| * <tr><td>get</td><td><<target>> objectPoolConfig-initSize</td><td>Gets initSize of objectPoolConfig for the target.</td></tr> |
| * <tr><td colspan=3>New Command in v2.0.0 </td></tr> |
| * <tr><td>kill-clients-all</td><td><<target>></td><td>Kill all ClientHandler/Client in pool for the target.</td></tr> |
| * <tr><td>kill-client-with</td><td><<target>> <<search term>></td><td>Kill all ClientHandler/Client in pool for the target which has the search term n toString (check client-handler-pool-dump command for the format).</td></tr> |
| * |
| * <tr><td>jvm</td><td>dumpJmapHisto file</td><td>Dump JMAP to file</td></tr> |
| * <tr><td>jvm</td><td>dumpJmapHisto log</td><td>Dump JMAP to jdk log</td></tr> |
| * <tr><td>jvm</td><td>dumpJStack file</td><td>Dump JStack to file</td></tr> |
| * <tr><td>jvm</td><td>dumpJStack log</td><td>Dump JStack to jdk log</td></tr> |
| * <tr><td>jvm</td><td>threadDump file</td><td>Take thread dump to file</td></tr> |
| * <tr><td>jvm</td><td>threadDump log</td><td>Take thread dump to jdk log</td></tr> |
| * <tr><td>jvm</td><td>dumpHeap</td><td>Dump Heap to file</td></tr> |
| * |
| * <tr><td colspan=3>* = Take effect after a restart command.<br> |
| * value if set null then key will be set to <code>null</code> |
| * </td></tr> |
| * </table> |
| * <br>Note: |
| * <ul> |
| * <li>Stopping the QuickServer will not disconnect any client connect to it, since |
| * client connections are handled by different thread. |
| * <li><code>restart</code> and <code>start</code> response just indicate only |
| * if command was sent. Do check the state of the target using |
| * <code>running</code> command to see if server was started successful. |
| * <li>Demo code examples\EchoServer shows the use of QsAdminServer to control itself. |
| * </ul> |
| * Eg: <br> |
| * <BLOCKQUOTE> |
| * noClient server<br> |
| * noClient self<br> |
| * get server maxClient<br> |
| * set server maxClient 10 |
| * </BLOCKQUOTE> |
| * </p> |
| * @since 1.1 |
| */ |
| public class CommandHandler implements ClientCommandHandler, ClientEventHandler { |
| private static Logger logger = Logger.getLogger(CommandHandler.class.getName()); |
| |
| private static Format formatter = new SimpleDateFormat("yyyyMMdd_HHmmss"); |
| |
| private static File getFile(String name, String ext) { |
| StringBuilder sb = new StringBuilder("./"); |
| |
| File logDir = new File("./log/"); |
| if(logDir.exists()==false) { |
| logDir.mkdirs(); |
| } |
| if(logDir.canWrite()) { |
| sb.append("log/"); |
| } |
| |
| sb.append(name); |
| sb.append("_"); |
| sb.append(formatter.format(new Date())); |
| |
| sb.append(ext); |
| |
| return new File(sb.toString()); |
| } |
| |
| private CommandPlugin plugin; |
| private Runtime runtime; |
| StringBuilder temp = new StringBuilder(); |
| |
| //-- ClientEventHandler |
| public void gotConnected(ClientHandler handler) |
| throws SocketTimeoutException, IOException { |
| logger.log(Level.FINE, "Connection opened : {0}", handler.getHostAddress()); |
| |
| handler.sendClientMsg("+OK +++++++++++++++++++++++++++++++++"); |
| handler.sendClientMsg("+OK Welcome to QsAdminServer v 1.0 "); |
| handler.sendClientMsg("+OK +++++++++++++++++++++++++++++++++"); |
| |
| //v.2 |
| if(plugin==null || runtime==null) { |
| plugin = (CommandPlugin) |
| handler.getServer().getStoreObjects()[1]; |
| //v1.3.2 |
| runtime = Runtime.getRuntime(); |
| } |
| } |
| |
| public void lostConnection(ClientHandler handler) |
| throws IOException { |
| logger.log(Level.FINE, "Connection lost : {0}", handler.getHostAddress()); |
| } |
| public void closingConnection(ClientHandler handler) |
| throws IOException { |
| logger.log(Level.FINE, "Connection closing : {0}", handler.getHostAddress()); |
| } |
| //-- ClientEventHandler |
| |
| public void handleCommand(ClientHandler handler, String command) |
| throws SocketTimeoutException, IOException { |
| if(command==null || command.trim().equals("")) { |
| handler.sendClientMsg("-ERR No command"); |
| return; |
| } |
| |
| //v1.2 - plugin |
| if( plugin != null && plugin.handleCommand(handler,command) ) { |
| logger.fine("Handled by plugin."); |
| return; |
| } |
| QSAdminServer adminServer = (QSAdminServer) |
| handler.getServer().getStoreObjects()[2]; |
| |
| StringTokenizer st = new StringTokenizer(command," "); |
| String cmd = null; |
| cmd = st.nextToken().toLowerCase(); |
| String param[] = new String[st.countTokens()]; |
| |
| QuickServer target = null; |
| for (int i=0;st.hasMoreTokens();i++) { |
| param[i] = st.nextToken(); |
| } |
| |
| if(command.equals("start console")) { /*v1.4.5*/ |
| QSAdminShell.getInstance( |
| (QuickServer) handler.getServer().getStoreObjects()[0], null); |
| handler.sendClientMsg("+OK QSAdminShell is started."); |
| return; |
| } else if(command.equals("stop console")) { /*v1.4.5*/ |
| QSAdminShell shell = QSAdminShell.getInstance(null, null); |
| if(shell!=null) { |
| try { |
| shell.stopShell(); |
| } catch(Exception err) { |
| handler.sendClientMsg("-ERR Error stopping QSAdminShell: "+err); |
| } |
| handler.sendClientMsg("+OK QSAdminShell is stopped."); |
| } else { |
| handler.sendClientMsg("-ERR QSAdminShell is not running."); |
| } |
| return; |
| } else if(cmd.equals("jvm")) {/*2.0.0*/ |
| /* |
| jvm dumpHeap |
| jvm dumpJmapHisto file |
| jvm dumpJmapHisto log |
| jvm threadDump file |
| jvm threadDump log |
| jvm dumpJStack file |
| jvm dumpJStack log |
| */ |
| |
| if(param.length==0) { |
| handler.sendClientMsg("-ERR "+"Use jvm help"); |
| return; |
| } |
| |
| if(param[0].equals("dumpHeap")) { |
| File file = getFile("dumpHeap", ".bin"); |
| JvmUtil.dumpHeap(file.getAbsolutePath(), true); |
| handler.sendClientMsg("+OK File "+file.getAbsolutePath()); |
| } else if(param[0].equals("dumpJmapHisto")) { |
| if(param.length < 2)/*dumpJmapHisto file*/ { |
| handler.sendClientMsg("-ERR "+"insufficient param"); |
| return; |
| } |
| |
| if(param[1].equals("file")) { |
| File file = getFile("dumpJmapHisto", ".txt"); |
| |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg("Starting.. "); |
| |
| JvmUtil.dumpJmapHisto(file.getAbsolutePath()); |
| |
| handler.sendClientMsg("Done - File "+file.getAbsolutePath()); |
| handler.sendClientMsg("."); |
| } else if(param[1].equals("log")) { |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg("Starting.. "); |
| |
| JvmUtil.dumpJmapHistoToLog(); |
| |
| handler.sendClientMsg("Done - Dumped to jdk log file"); |
| handler.sendClientMsg("."); |
| } else { |
| handler.sendClientMsg("-ERR "+"bad param"); |
| return; |
| } |
| } else if(param[0].equals("threadDump")) { |
| if(param.length < 2)/*threadDump file*/ { |
| handler.sendClientMsg("-ERR "+"insufficient param"); |
| return; |
| } |
| |
| if(param[1].equals("file")) { |
| File file = getFile("threadDump", ".txt"); |
| |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg("Starting.. "); |
| |
| JvmUtil.threadDump(file.getAbsolutePath()); |
| |
| handler.sendClientMsg("Done - File "+file.getAbsolutePath()); |
| handler.sendClientMsg("."); |
| } else if(param[1].equals("log")) { |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg("Starting.. "); |
| |
| JvmUtil.threadDumpToLog(); |
| |
| handler.sendClientMsg("Done - Dumped to jdk log file"); |
| handler.sendClientMsg("."); |
| } else { |
| handler.sendClientMsg("-ERR "+"bad param"); |
| return; |
| } |
| } else if(param[0].equals("dumpJStack")) { |
| if(param.length < 2)/*dumpJStack file*/ { |
| handler.sendClientMsg("-ERR "+"insufficient param"); |
| return; |
| } |
| |
| if(param[1].equals("file")) { |
| File file = getFile("dumpJStack", ".txt"); |
| |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg("Starting.. "); |
| |
| JvmUtil.dumpJStack(file.getAbsolutePath()); |
| |
| handler.sendClientMsg("Done - File "+file.getAbsolutePath()); |
| handler.sendClientMsg("."); |
| } else if(param[1].equals("log")) { |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg("Starting.. "); |
| |
| JvmUtil.dumpJStackToLog(); |
| |
| handler.sendClientMsg("Done - Dumped to jdk log file"); |
| handler.sendClientMsg("."); |
| } else { |
| handler.sendClientMsg("-ERR "+"bad param"); |
| return; |
| } |
| } else if(param[0].equals("help")) { |
| handler.sendClientMsg("+OK info follows"); |
| |
| handler.sendClientMsg("jvm dumpJmapHisto file"); |
| handler.sendClientMsg("jvm dumpJStack file"); |
| |
| handler.sendClientMsg(" "); |
| |
| handler.sendClientMsg("jvm threadDump file"); |
| handler.sendClientMsg("jvm dumpHeap"); |
| |
| handler.sendClientMsg(" "); |
| |
| handler.sendClientMsg("jvm threadDump log"); |
| handler.sendClientMsg("jvm dumpJmapHisto log"); |
| handler.sendClientMsg("jvm dumpJStack log"); |
| |
| handler.sendClientMsg("."); |
| return; |
| } else { |
| handler.sendClientMsg("-ERR "+"bad param use jvm help"); |
| } |
| return; |
| } |
| |
| if(param.length > 0) { |
| if( param[0].equals("server") ) |
| target = (QuickServer) handler.getServer().getStoreObjects()[0]; |
| else if( param[0].equals("self") ) |
| target = handler.getServer(); |
| else { |
| handler.sendClientMsg("-ERR Bad <<target>> : "+param[0]); |
| return; |
| } |
| } |
| |
| if(cmd.equals("help")) { |
| handler.sendClientMsg("+OK info follows"+"\r\n"+ |
| "Refer Api Docs for org.quickserver.net.qsadmin.CommandHandler"); |
| handler.sendClientMsg("."); |
| return; |
| } else if(cmd.equals("quit")) { |
| handler.sendClientMsg("+OK Bye ;-)"); |
| handler.closeConnection(); |
| return; |
| } else if(cmd.equals("shutdown")) { |
| try { |
| QuickServer controlServer = |
| (QuickServer) handler.getServer().getStoreObjects()[0]; |
| if(controlServer!=null && controlServer.isClosed()==false) { |
| controlServer.stopServer(); |
| } |
| if(handler.getServer()!=null && handler.getServer().isClosed()==false) { |
| handler.getServer().stopServer(); |
| } |
| |
| QSAdminShell shell = QSAdminShell.getInstance(null, null); |
| if(shell!=null) { |
| try { |
| shell.stopShell(); |
| } catch(Exception err) { |
| logger.warning("Error stoping shell: "+err); |
| } |
| } |
| |
| handler.sendClientMsg("+OK Done"); |
| } catch (AppException e) { |
| handler.sendClientMsg("-ERR "+e); |
| } |
| return; |
| } else if(cmd.equals("version")) { |
| handler.sendClientMsg("+OK "+QuickServer.getVersion()); |
| return; |
| } else if(cmd.equals("kill") || cmd.equals("exit")) /*v1.3,v1.3.2*/{ |
| StringBuilder errBuf = new StringBuilder(); |
| QuickServer controlServer = |
| (QuickServer) handler.getServer().getStoreObjects()[0]; |
| int exitCode = 0; |
| |
| if(param.length!=0) { |
| try { |
| exitCode = Integer.parseInt(param[0]); |
| } catch(Exception nfe) {/*ignore*/} |
| } |
| |
| try { |
| if(controlServer!=null && controlServer.isClosed()==false) { |
| try { |
| controlServer.stopServer(); |
| } catch(AppException ae) { |
| errBuf.append(ae.toString()); |
| } |
| } |
| if(handler.getServer()!=null && handler.getServer().isClosed()==false) { |
| try { |
| handler.getServer().stopServer(); |
| } catch(AppException ae) { |
| errBuf.append(ae.toString()); |
| } |
| } |
| |
| QSAdminShell shell = QSAdminShell.getInstance(null, null); |
| if(shell!=null) { |
| try { |
| shell.stopShell(); |
| } catch(Exception err) { |
| errBuf.append(err.toString()); |
| } |
| } |
| |
| if(errBuf.length()==0) |
| handler.sendClientMsg("+OK Done"); |
| else |
| handler.sendClientMsg("+OK Done, Errors: "+errBuf.toString()); |
| } catch (Exception e) { |
| handler.sendClientMsg("-ERR Exception : "+e+"\r\n"+errBuf.toString()); |
| if(exitCode==0) exitCode = 1; |
| } finally { |
| try { |
| if(controlServer!=null) |
| controlServer.closeAllPools(); |
| if(handler.getServer()!=null) |
| handler.getServer().closeAllPools(); |
| } catch(Exception er) { |
| logger.warning("Error closing pools: "+er); |
| } |
| System.exit(exitCode); |
| } |
| return; |
| } else if(cmd.equals("memoryinfo")) { /*v1.3.2*/ |
| //Padding : Total:Used:Max |
| float totalMemory = (float) runtime.totalMemory(); |
| float usedMemory = totalMemory - (float) runtime.freeMemory(); |
| float maxMemory = (float) runtime.maxMemory(); |
| handler.sendClientMsg("+OK "+totalMemory+":"+usedMemory+":"+maxMemory); |
| return; |
| } else if(cmd.equals("systeminfo")) { /*v1.4.5*/ |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg(MyString.getSystemInfo(target.getVersion())); |
| handler.sendClientMsg("."); |
| return; |
| } else if(param.length==0) { |
| handler.sendClientMsg("-ERR Bad Command or No Param : ->"+cmd+"<-"); |
| return; |
| } |
| |
| if(cmd.equals("start")) { |
| try { |
| target.startServer(); |
| handler.sendClientMsg("+OK Server Started"); |
| } catch (AppException e) { |
| handler.sendClientMsg("-ERR "+e); |
| } |
| return; |
| } else if(cmd.equals("stop")) { |
| try { |
| target.stopServer(); |
| handler.sendClientMsg("+OK Server Stopped"); |
| } catch (AppException e) { |
| handler.sendClientMsg("-ERR "+e); |
| } |
| return; |
| } else if(cmd.equals("restart")) { |
| try { |
| target.stopServer(); |
| target.startServer(); |
| handler.sendClientMsg("+OK Server Restarted"); |
| } catch (AppException e) { |
| handler.sendClientMsg("-ERR "+e); |
| } |
| return; |
| } else if(cmd.equals("info")) { |
| handler.sendClientMsg("+OK info follows"); |
| handler.sendClientMsg(""+target); |
| handler.sendClientMsg("Running : "+!target.isClosed()); |
| handler.sendClientMsg("PID : "+QuickServer.getPID()); |
| handler.sendClientMsg("Max Client Allowed : "+target.getMaxConnection() ); |
| handler.sendClientMsg("No Client Connected : "+target.getClientCount() ); |
| if(target.isRunningSecure()==true) { |
| handler.sendClientMsg("Running in secure mode : "+ |
| target.getSecure().getProtocol() ); |
| } else { |
| handler.sendClientMsg("Running in non-secure mode"); |
| } |
| handler.sendClientMsg("Server Mode : "+target.getBasicConfig().getServerMode()); |
| handler.sendClientMsg("QuickServer v : "+QuickServer.getVersion()); |
| handler.sendClientMsg("Uptime : "+target.getUptime()); |
| handler.sendClientMsg("."); |
| return; |
| } else if(cmd.equals("noclient")) { |
| handler.sendClientMsg("+OK "+target.getClientCount() ); |
| return; |
| } else if(cmd.equals("running")) { |
| handler.sendClientMsg("+OK "+!target.isClosed() ); |
| return; |
| } else if(cmd.equals("suspendservice")) { |
| handler.sendClientMsg("+OK "+target.suspendService() ); |
| return; |
| } else if(cmd.equals("resumeservice")) { |
| handler.sendClientMsg("+OK "+target.resumeService() ); |
| return; |
| } else if(cmd.equals("client-thread-pool-info")) /*v1.3.2*/{ |
| temp.setLength(0);//used:idle |
| if(PoolHelper.isPoolOpen(target.getClientPool().getObjectPool())==true) { |
| temp.append(target.getClientPool().getNumActive()); |
| temp.append(':'); |
| temp.append(target.getClientPool().getNumIdle()); |
| } else { |
| temp.append("0:0"); |
| } |
| handler.sendClientMsg("+OK "+temp.toString() ); |
| return; |
| } else if(cmd.equals("client-thread-pool-dump")) /*v1.4.5*/{ |
| if(PoolHelper.isPoolOpen(target.getClientPool().getObjectPool())==true) { |
| handler.sendClientMsg("+OK info follows"); |
| ClientThread ct = null; |
| synchronized(target.getClientPool().getObjectToSynchronize()) { |
| Iterator iterator = target.getClientPool().getAllClientThread(); |
| while(iterator.hasNext()) { |
| ct = (ClientThread)iterator.next(); |
| handler.sendClientMsg(ct.toString()); |
| } |
| } |
| handler.sendClientMsg("."); |
| } else { |
| handler.sendClientMsg("-ERR Pool Closed"); |
| } |
| return; |
| } else if(cmd.equals("client-handler-pool-dump")) /*v1.4.6*/{ |
| |
| ObjectPool objectPool = target.getClientHandlerPool(); |
| |
| if(PoolHelper.isPoolOpen(objectPool)==true) { |
| if(QSObjectPool.class.isInstance(objectPool)==false) { |
| handler.sendClientMsg("-ERR System Error!"); |
| } |
| |
| ClientIdentifier clientIdentifier = target.getClientIdentifier(); |
| ClientHandler foundClientHandler = null; |
| synchronized(clientIdentifier.getObjectToSynchronize()) { |
| Iterator iterator = clientIdentifier.findAllClient(); |
| handler.sendClientMsg("+OK info follows"); |
| while(iterator.hasNext()) { |
| foundClientHandler = (ClientHandler) iterator.next(); |
| handler.sendClientMsg(foundClientHandler.info()); |
| } |
| } |
| handler.sendClientMsg("."); |
| } else { |
| handler.sendClientMsg("-ERR Pool Closed"); |
| } |
| return; |
| } else if(cmd.equals("client-data-pool-info")) /*v1.3.2*/{ |
| temp.setLength(0);//used:idle |
| if(target.getClientDataPool()!=null) { |
| if(PoolHelper.isPoolOpen(target.getClientDataPool())==true) { |
| temp.append(target.getClientDataPool().getNumActive()); |
| temp.append(':'); |
| temp.append(target.getClientDataPool().getNumIdle()); |
| handler.sendClientMsg("+OK "+temp.toString() ); |
| } else { |
| handler.sendClientMsg("-ERR Client Data Pool Closed"); |
| } |
| } else { |
| handler.sendClientMsg("-ERR No Client Data Pool"); |
| } |
| return; |
| } else if(cmd.equals("byte-buffer-pool-info")) /*v1.4.6*/{ |
| temp.setLength(0);//used:idle |
| if(target.getByteBufferPool()!=null) { |
| if(PoolHelper.isPoolOpen(target.getByteBufferPool())==true) { |
| temp.append(target.getByteBufferPool().getNumActive()); |
| temp.append(':'); |
| temp.append(target.getByteBufferPool().getNumIdle()); |
| handler.sendClientMsg("+OK "+temp.toString() ); |
| } else { |
| handler.sendClientMsg("-ERR ByteBuffer Pool Closed"); |
| } |
| } else { |
| handler.sendClientMsg("-ERR No ByteBuffer Pool"); |
| } |
| return; |
| } else if(cmd.equals("all-pool-info")) /*v1.4.5*/{ |
| handler.sendClientMsg("+OK info follows"); |
| temp.setLength(0);//used:idle |
| |
| if(PoolHelper.isPoolOpen(target.getClientPool().getObjectPool())==true) { |
| temp.append("Client Thread Pool - "); |
| temp.append("Num Active: "); |
| temp.append(target.getClientPool().getNumActive()); |
| temp.append(", Num Idle: "); |
| temp.append(target.getClientPool().getNumIdle()); |
| temp.append(", Max Idle: "); |
| temp.append(target.getClientPool().getPoolConfig().getMaxIdle()); |
| temp.append(", Max Active: "); |
| temp.append(target.getClientPool().getPoolConfig().getMaxActive()); |
| } else { |
| temp.append("Byte Buffer Pool - Closed"); |
| } |
| handler.sendClientMsg(temp.toString()); |
| temp.setLength(0); |
| |
| if(PoolHelper.isPoolOpen(target.getClientHandlerPool())==true) { |
| temp.append("Client Handler Pool - "); |
| temp.append("Num Active: "); |
| temp.append(target.getClientHandlerPool().getNumActive()); |
| temp.append(", Num Idle: "); |
| temp.append(target.getClientHandlerPool().getNumIdle()); |
| temp.append(", Max Idle: "); |
| temp.append(target.getBasicConfig().getObjectPoolConfig().getClientHandlerObjectPoolConfig().getMaxIdle()); |
| temp.append(", Max Active: "); |
| temp.append(target.getBasicConfig().getObjectPoolConfig().getClientHandlerObjectPoolConfig().getMaxActive()); |
| } else { |
| temp.append("Client Handler Pool - Closed"); |
| } |
| handler.sendClientMsg(temp.toString()); |
| temp.setLength(0); |
| |
| if(target.getByteBufferPool()!=null) { |
| if(PoolHelper.isPoolOpen(target.getByteBufferPool())==true) { |
| temp.append("ByteBuffer Pool - "); |
| temp.append("Num Active: "); |
| temp.append(target.getByteBufferPool().getNumActive()); |
| temp.append(", Num Idle: "); |
| temp.append(target.getByteBufferPool().getNumIdle()); |
| temp.append(", Max Idle: "); |
| temp.append(target.getBasicConfig().getObjectPoolConfig().getByteBufferObjectPoolConfig().getMaxIdle()); |
| temp.append(", Max Active: "); |
| temp.append(target.getBasicConfig().getObjectPoolConfig().getByteBufferObjectPoolConfig().getMaxActive()); |
| } else { |
| temp.append("Byte Buffer Pool - Closed"); |
| } |
| } else { |
| temp.append("Byte Buffer Pool - Not Used"); |
| } |
| handler.sendClientMsg(temp.toString()); |
| temp.setLength(0); |
| |
| if(target.getClientDataPool()!=null) { |
| if(PoolHelper.isPoolOpen(target.getClientDataPool())==true) { |
| temp.append("Client Data Pool - "); |
| temp.append("Num Active: "); |
| temp.append(target.getClientDataPool().getNumActive()); |
| temp.append(", Num Idle: "); |
| temp.append(target.getClientDataPool().getNumIdle()); |
| temp.append(", Max Idle: "); |
| temp.append(target.getBasicConfig().getObjectPoolConfig().getClientDataObjectPoolConfig().getMaxIdle()); |
| temp.append(", Max Active: "); |
| temp.append(target.getBasicConfig().getObjectPoolConfig().getClientDataObjectPoolConfig().getMaxActive()); |
| } else { |
| temp.append("Client Data Pool - Closed"); |
| } |
| } else { |
| temp.append("Client Data Pool - Not Used"); |
| } |
| handler.sendClientMsg(temp.toString()); |
| temp.setLength(0); |
| |
| handler.sendClientMsg("."); |
| return; |
| } else if(cmd.equals("set")) { |
| if(param.length < 3)/*target,key,value*/ { |
| handler.sendClientMsg("-ERR "+"insufficient param"); |
| return; |
| } |
| if(param[2].equals("null")) |
| param[2]=null; |
| try { |
| if(param[1].equals("maxClient")) { |
| long no = Long.parseLong(param[2]); |
| target.setMaxConnection(no); |
| } else if(param[1].equals("maxClientMsg")) { |
| target.setMaxConnectionMsg(param[2]); |
| } else if(param[1].equals("port")) { |
| long no = Long.parseLong(param[2]); |
| target.setPort((int)no); |
| } else if(param[1].equals("port")) { |
| long no = Long.parseLong(param[2]); |
| target.setPort((int)no); |
| } else if(param[1].equals("maxAuthTry")) { |
| int no = Integer.parseInt(param[2]); |
| target.setMaxAuthTry(no); |
| } else if(param[1].equals("maxAuthTryMsg")) { |
| target.setMaxAuthTryMsg(param[2]); |
| } else if(param[1].equals("clientEventHandler")) { /*v1.4.6*/ |
| target.setClientEventHandler(param[2]); |
| } else if(param[1].equals("clientCommandHandler")) { |
| target.setClientCommandHandler(param[2]); |
| } else if(param[1].equals("clientWriteHandler")) { /*v1.4.6*/ |
| target.setClientWriteHandler(param[2]); |
| } else if(param[1].equals("clientObjectHandler")) { |
| target.setClientObjectHandler(param[2]); /*v1.3*/ |
| } else if(param[1].equals("clientAuthenticationHandler")) { |
| target.setClientAuthenticationHandler(param[2]); |
| } else if(param[1].equals("clientData")) { |
| target.setClientData(param[2]); |
| } else if(param[1].equals("clientExtendedEventHandler")) { /*v1.4.6*/ |
| target.setClientExtendedEventHandler(param[2]); |
| } else if(param[1].equals("timeout")) { |
| long no = Long.parseLong(param[2]); |
| target.setTimeout((int)no); |
| } else if(param[1].equals("timeoutMsg")) { |
| target.setTimeoutMsg(param[2]); /* v1.3 */ |
| } else if(param[1].equals("plugin")) /* v1.2*/{ |
| if(param[0].equals("self")) { |
| try { |
| adminServer.setCommandPlugin(param[2]); |
| } catch(Exception e) { |
| handler.sendClientMsg("-ERR not set : "+e); |
| return; |
| } |
| } else { |
| handler.sendClientMsg("-ERR Bad target : "+param[0]+" self is only allowed."); |
| return; |
| } |
| } else if(param[1].equals("consoleLoggingFormatter")) { |
| target.setConsoleLoggingFormatter(param[2]); /* v1.3 */ |
| } else if(param[1].equals("consoleLoggingLevel")) { /* v1.3 */ |
| if(param[2].endsWith("SEVERE")) |
| target.setConsoleLoggingLevel(Level.SEVERE); |
| else if(param[2].endsWith("WARNING")) |
| target.setConsoleLoggingLevel(Level.WARNING); |
| else if(param[2].endsWith("INFO")) |
| target.setConsoleLoggingLevel(Level.INFO); |
| else if(param[2].endsWith("CONFIG")) |
| target.setConsoleLoggingLevel(Level.CONFIG); |
| else if(param[2].endsWith("FINE")) |
| target.setConsoleLoggingLevel(Level.FINE); |
| else if(param[2].endsWith("FINER")) |
| target.setConsoleLoggingLevel(Level.FINER); |
| else if(param[2].endsWith("FINEST")) |
| target.setConsoleLoggingLevel(Level.FINEST); |
| else if(param[2].endsWith("ALL")) |
| target.setConsoleLoggingLevel(Level.ALL); |
| else if(param[2].endsWith("OFF")) |
| target.setConsoleLoggingLevel(Level.OFF); |
| else { |
| handler.sendClientMsg("-ERR Bad Level "+param[2]); |
| return; |
| } |
| } else if(param[1].equals("loggingLevel")) { /* v1.3.1 */ |
| if(param[2].endsWith("SEVERE")) |
| target.setLoggingLevel(Level.SEVERE); |
| else if(param[2].endsWith("WARNING")) |
| target.setLoggingLevel(Level.WARNING); |
| else if(param[2].endsWith("INFO")) |
| target.setLoggingLevel(Level.INFO); |
| else if(param[2].endsWith("CONFIG")) |
| target.setLoggingLevel(Level.CONFIG); |
| else if(param[2].endsWith("FINE")) |
| target.setLoggingLevel(Level.FINE); |
| else if(param[2].endsWith("FINER")) |
| target.setLoggingLevel(Level.FINER); |
| else if(param[2].endsWith("FINEST")) |
| target.setLoggingLevel(Level.FINEST); |
| else if(param[2].endsWith("ALL")) |
| target.setLoggingLevel(Level.ALL); |
| else if(param[2].endsWith("OFF")) |
| target.setLoggingLevel(Level.OFF); |
| else { |
| handler.sendClientMsg("-ERR Bad Level "+param[2]); |
| return; |
| } |
| } else if(param[1].equals("communicationLogging")) { |
| if(param[2].equals("true"))/* v1.3.2 */ |
| target.setCommunicationLogging(true); |
| else |
| target.setCommunicationLogging(false); |
| } else if(param[1].equals("objectPoolConfig-maxActive")) { |
| int no = Integer.parseInt(param[2]); |
| target.getConfig().getObjectPoolConfig().setMaxActive(no); |
| } else if(param[1].equals("objectPoolConfig-maxIdle")) { |
| int no = Integer.parseInt(param[2]); |
| target.getConfig().getObjectPoolConfig().setMaxIdle(no); |
| } else if(param[1].equals("objectPoolConfig-initSize")) { |
| int no = Integer.parseInt(param[2]); |
| target.getConfig().getObjectPoolConfig().setInitSize(no); |
| } else { |
| handler.sendClientMsg("-ERR Bad Set Key : "+param[1]); |
| return; |
| } |
| handler.sendClientMsg("+OK Set"); |
| } catch(Exception e) { |
| handler.sendClientMsg("-ERR "+e); |
| } |
| return; |
| } else if(cmd.equals("get")) { |
| if(param.length < 2)/*target,key*/ { |
| handler.sendClientMsg("-ERR "+"insufficient param"); |
| return; |
| } |
| try { |
| if(param[1].equals("maxClient")) { |
| long no = target.getMaxConnection(); |
| handler.sendClientMsg("+OK "+no); |
| } else if(param[1].equals("maxClientMsg")) { |
| String msg = target.getMaxConnectionMsg(); |
| msg = MyString.replaceAll(msg, "\n", "\\n"); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("port")) { |
| long no = target.getPort(); |
| handler.sendClientMsg("+OK "+no); |
| } else if(param[1].equals("maxAuthTry")) { |
| int no = target.getMaxAuthTry(); |
| handler.sendClientMsg("+OK "+no); |
| } else if(param[1].equals("maxAuthTryMsg")) { |
| String msg=target.getMaxAuthTryMsg(); |
| msg = MyString.replaceAll(msg, "\n", "\\n"); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("clientEventHandler")) { /*v1.4.6*/ |
| String msg=target.getClientEventHandler(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("clientCommandHandler")) { |
| String msg=target.getClientCommandHandler(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("clientWriteHandler")) { /*v1.4.6*/ |
| String msg=target.getClientWriteHandler(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("clientObjectHandler")) { |
| String msg=target.getClientObjectHandler(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("clientAuthenticationHandler")) { |
| String msg=target.getClientAuthenticationHandler(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("clientData")) { |
| String msg=target.getClientData(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("clientExtendedEventHandler")) { /*v1.4.6*/ |
| String msg=target.getClientExtendedEventHandler(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("timeout")) { |
| String msg=""+target.getTimeout(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("timeoutMsg")) { |
| String msg=""+target.getTimeoutMsg(); |
| msg = MyString.replaceAll(msg, "\n", "\\n"); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("plugin")) /* v1.2*/{ |
| if(param[0].equals("self")) { |
| String msg = adminServer.getCommandPlugin(); |
| handler.sendClientMsg("+OK "+msg); |
| } else { |
| handler.sendClientMsg("-ERR Bad target : "+param[0]+" self is only allowed."); |
| } |
| } else if(param[1].equals("consoleLoggingFormatter")) { |
| String msg=""+target.getConsoleLoggingFormatter(); /* v1.3 */ |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("consoleLoggingLevel")) { /* v1.3 */ |
| String msg=""+target.getConsoleLoggingLevel(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("serviceState")) { |
| int state=target.getServiceState(); /*v1.3*/ |
| if(state==org.quickserver.net.Service.INIT) |
| handler.sendClientMsg("+OK INIT"); |
| else if(state==org.quickserver.net.Service.RUNNING) |
| handler.sendClientMsg("+OK RUNNING"); |
| else if(state==org.quickserver.net.Service.STOPPED) |
| handler.sendClientMsg("+OK STOPPED"); |
| else if(state==org.quickserver.net.Service.SUSPENDED) |
| handler.sendClientMsg("+OK SUSPENDED"); |
| else |
| handler.sendClientMsg("+OK UNKNOWN"); |
| } else if(param[1].equals("communicationLogging")) { |
| String msg=""+target.getCommunicationLogging(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("objectPoolConfig-maxActive")) { |
| String msg=""+target.getConfig().getObjectPoolConfig().getMaxActive(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("objectPoolConfig-maxIdle")) { |
| String msg=""+target.getConfig().getObjectPoolConfig().getMaxIdle(); |
| handler.sendClientMsg("+OK "+msg); |
| } else if(param[1].equals("objectPoolConfig-initSize")) { |
| String msg=""+target.getConfig().getObjectPoolConfig().getInitSize(); |
| handler.sendClientMsg("+OK "+msg); |
| } else { |
| handler.sendClientMsg("-ERR Bad Get Key : "+param[1]); |
| } |
| } catch(Exception e) { |
| handler.sendClientMsg("-ERR "+e); |
| } |
| return; |
| } else if(cmd.equals("kill-clients-all")) /*v2.0.0*/{ |
| |
| ObjectPool objectPool = target.getClientHandlerPool(); |
| |
| if(PoolHelper.isPoolOpen(objectPool)==true) { |
| if(QSObjectPool.class.isInstance(objectPool)==false) { |
| handler.sendClientMsg("-ERR System Error!"); |
| } |
| |
| ClientIdentifier clientIdentifier = target.getClientIdentifier(); |
| ClientHandler foundClientHandler = null; |
| synchronized(clientIdentifier.getObjectToSynchronize()) { |
| Iterator iterator = clientIdentifier.findAllClient(); |
| handler.sendClientMsg("+OK closing"); |
| int count = 0; |
| int found = 0; |
| while(iterator.hasNext()) { |
| foundClientHandler = (ClientHandler) iterator.next(); |
| found++; |
| if(foundClientHandler.isClosed()==false) { |
| foundClientHandler.closeConnection(); |
| count ++; |
| } |
| } |
| handler.sendClientMsg("Count Found: "+found); |
| handler.sendClientMsg("Count Closed: "+count); |
| } |
| handler.sendClientMsg("."); |
| } else { |
| handler.sendClientMsg("-ERR Closing"); |
| } |
| return; |
| } else if(cmd.equals("kill-client-with")) /*v2.0.0*/{ |
| |
| if(param.length < 2)/*target,search*/ { |
| handler.sendClientMsg("-ERR "+"insufficient param"); |
| return; |
| } |
| String search = param[1]; |
| |
| ObjectPool objectPool = target.getClientHandlerPool(); |
| |
| if(PoolHelper.isPoolOpen(objectPool)==true) { |
| if(QSObjectPool.class.isInstance(objectPool)==false) { |
| handler.sendClientMsg("-ERR System Error!"); |
| } |
| |
| ClientIdentifier clientIdentifier = target.getClientIdentifier(); |
| ClientHandler foundClientHandler = null; |
| synchronized(clientIdentifier.getObjectToSynchronize()) { |
| Iterator iterator = clientIdentifier.findAllClient(); |
| handler.sendClientMsg("+OK closing"); |
| int count = 0; |
| int found = 0; |
| while(iterator.hasNext()) { |
| foundClientHandler = (ClientHandler) iterator.next(); |
| if(foundClientHandler.toString().indexOf(search)!=-1) { |
| found++; |
| if(foundClientHandler.isClosed()==false) { |
| foundClientHandler.closeConnection(); |
| count ++; |
| } |
| } |
| } |
| handler.sendClientMsg("Count Found: "+found); |
| handler.sendClientMsg("Count Closed: "+count); |
| } |
| handler.sendClientMsg("."); |
| } else { |
| handler.sendClientMsg("-ERR Closing"); |
| } |
| return; |
| } else { |
| handler.sendClientMsg("-ERR Bad Command : "+cmd); |
| } |
| return; |
| } |
| } |