📄 telnetgateway.java
字号:
/*------------------------------------------------------------------------------Name: TelnetGateway.javaProject: xmlBlaster.orgCopyright: xmlBlaster.org, see xmlBlaster-LICENSE fileComment: Main manager class for administrative commands------------------------------------------------------------------------------*/package org.xmlBlaster.engine.admin.extern;import java.util.logging.Logger;import java.util.logging.Level;import org.xmlBlaster.util.XmlBlasterException;import org.xmlBlaster.engine.ServerScope;import org.xmlBlaster.engine.admin.CommandManager;import org.xmlBlaster.engine.admin.I_ExternGateway;import org.xmlBlaster.engine.admin.SetReturn;import org.xmlBlaster.engine.qos.AddressServer;import org.xmlBlaster.engine.qos.ConnectQosServer;import org.xmlBlaster.engine.qos.ConnectReturnQosServer;import org.xmlBlaster.util.Global;import org.xmlBlaster.util.MsgUnit;import org.xmlBlaster.util.Timestamp;import org.xmlBlaster.util.I_Timeout;import org.xmlBlaster.util.def.ErrorCode;import org.xmlBlaster.util.key.QueryKeyData;import remotecons.RemoteServer;import remotecons.ifc.CommandHandlerIfc;import remotecons.wttools.ConnectionServer;import java.util.LinkedList;import java.util.StringTokenizer;import java.util.Iterator;import java.util.Set;import java.util.HashSet;import java.io.IOException;/** * The gateway from outside telnet connections to inside CommandManager. * <p /> * @author xmlBlaster@marcelruff.info * @since 0.79f * @see <a href="http://www.xmlBlaster.org/xmlBlaster/doc/requirements/admin.telnet.html">admin.telnet requirement</a> * @see <a href="http://www.xmlBlaster.org/xmlBlaster/doc/requirements/admin.commands.html">admin.commands requirement</a> */public final class TelnetGateway implements CommandHandlerIfc, I_ExternGateway, I_Timeout{ private String ME; private ServerScope glob; private static Logger log = Logger.getLogger(TelnetGateway.class.getName()); private CommandManager commandManager; private int port; private RemoteServer rs; private final String CRLF = "\r\n"; private static int instanceCounter = 0; private boolean isShutdown = true; private boolean isLogin = false; private ConnectReturnQosServer connectRetQos; private String loginName = ""; private String sessionId; private Set telnetInstancesSet; private Timestamp timerKey; private long sessionTimeout = 3600000L; // autologout after 1 hour private ConnectionServer connectionServer; private AddressServer addressServer; private String lastCommand = ""; /** * Default port to access xmlBlaster with telnet for administration (2702). */ public static final int TELNET_PORT = 2702; public TelnetGateway() { instanceCounter++; } /** * Creates the remote console server. * <p /> * Is called by CommandManager on startup * @return true if started and active */ public boolean initialize(ServerScope glob, CommandManager commandManager) throws XmlBlasterException { initializeVariables(glob, commandManager, true); return initListener(); } /** * @param isBootstrap The first instance has no timer set * @return true if started and active */ private boolean initializeVariables(ServerScope glob, CommandManager commandManager, boolean isBootstrap) { this.glob = glob; this.ME = "TelnetGateway" + instanceCounter + this.glob.getLogPrefixDashed(); this.telnetInstancesSet = new HashSet(); this.commandManager = commandManager; this.sessionTimeout = glob.getProperty().get("admin.remoteconsole.sessionTimeout", sessionTimeout); this.sessionTimeout = glob.getProperty().get("admin.remoteconsole.sessionTimeout[" + glob.getId() + "]", sessionTimeout); this.port = glob.getProperty().get("admin.remoteconsole.port", TELNET_PORT); // 0 == off this.port = glob.getProperty().get("admin.remoteconsole.port[" + glob.getId() + "]", this.port); if (this.port <= 1000) { if (log.isLoggable(Level.FINE)) log.fine("No telnet gateway configured, port=" + port + " try '-admin.remoteconsole.port " + TELNET_PORT + "' if you want one"); return false; } if (!isBootstrap) { // Ignore the first bootstrap instance if (sessionTimeout > 0L) { log.info("New connection from telnet client accepted, session timeout is " + Timestamp.millisToNice(sessionTimeout)); timerKey = glob.getTelnetSessionTimer().addTimeoutListener(this, sessionTimeout, null); } else log.info("Session for " + loginName + " lasts forever, requested expiry timer was 0"); } return true; } // Hack into remotecons to allow shutdown (marcel) public void register(remotecons.wttools.ConnectionServer server) { this.connectionServer = server; } private void stopTimer() { if (this.timerKey != null && glob.hasTelnetSessionTimer()) { this.glob.getTelnetSessionTimer().removeTimeoutListener(this.timerKey); this.timerKey = null; } } protected void finalize() { stopTimer(); disconnect(); } /** * We are notified when this session expires. * @param userData You get bounced back your userData which you passed * with Timeout.addTimeoutListener() */ public final void timeout(Object userData) { synchronized (this) { timerKey = null; if (isLogin) log.warning("Session timeout " + Timestamp.millisToNice(sessionTimeout) + " for telnet client " + loginName + " occurred, autologout."); else log.warning("Session timeout " + Timestamp.millisToNice(sessionTimeout) + " for not authorized telnet client occurred, autologout."); } //disconnect(); This happens automatically in Authenticate.java at the same time connectRetQos = null; if (connectionServer != null) connectionServer.shutdown(); // Hack into remotecons to allow shutdown (marcel) } private synchronized void disconnect() { if (isLogin) { if (connectRetQos != null) { try { glob.getAuthenticate().disconnect(this.addressServer, connectRetQos.getSecretSessionId(), null); } catch (org.xmlBlaster.util.XmlBlasterException e) { log.warning(e.getMessage()); } log.info("Logout of '" + loginName + "', telnet connection destroyed"); connectRetQos = null; } else log.info("Connection from not authorized telnet client destroyed"); } isLogin = false; } private boolean initListener() throws XmlBlasterException { if (this.port > 1000) { createRemoteConsole(port); log.info("Started remote console server for administration, try 'telnet " + glob.getLocalIP() + " " + port + "' to access it and type 'help'."); return true; } if (log.isLoggable(Level.FINE)) log.fine("No telnet gateway configured, port=" + port + " try '-admin.remoteconsole.port " + TELNET_PORT + "' if you want one"); return false; } /** * Creates a server which is accessible with telnet. * This allows you to access xmlBlaster and query for example the free memory: * <pre> * telnet 192.168.1.2 2702 * mem * </pre> * Enter 'help' for all available commands. */ private void createRemoteConsole(int port) throws XmlBlasterException { if (port > 1000) { rs = new RemoteServer(); rs.setServer_port(port); rs.setAs_daemon(true); LinkedList ll = new LinkedList(); ll.add(this); try { rs.initialize(ll); } catch (IOException e) { //e.printStackTrace(); if (log.isLoggable(Level.FINE)) log.fine("Initializing of remote console on port=" + port + " failed:" + e.toString()); throw new XmlBlasterException(glob, ErrorCode.INTERNAL_UNKNOWN, ME, "Initializing of remote telnet console on port=" + port + " failed:" + e.toString()); } } } /** * Enforced by "remotecons.CommandHandlerIfc" */ public String handleCommand(String cmd) { try { if (cmd == null || cmd.length() < 1) { lastCommand = ""; return getErrorText("Ignoring your empty command."); } cmd = cmd.trim(); if (cmd.length() < 1) { lastCommand = ""; return getErrorText("Ignoring your empty command."); } if (cmd.equalsIgnoreCase("quit")) { lastCommand = ""; stopTimer(); disconnect(); return null; // handled by internal Handler } // Commands without login: if (cmd.equalsIgnoreCase("time")) { lastCommand = cmd; return ""+new java.util.Date()+CRLF; } if (cmd.toUpperCase().startsWith("MEM")) { lastCommand = cmd; Runtime rt = Runtime.getRuntime(); return ""+rt.totalMemory()+"/"+rt.freeMemory()+CRLF; } StringTokenizer st = new StringTokenizer(cmd, " "); if (!st.hasMoreTokens()) { lastCommand = cmd; return getErrorText("Ignoring your empty command."); } String cmdType = st.nextToken(); cmdType = cmdType.trim(); if (!st.hasMoreTokens()) { if (cmdType.equalsIgnoreCase("GET") || cmdType.equalsIgnoreCase("SET") ||
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -