diff options
Diffstat (limited to 'proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/device/linuxtools/network/telnet/TelnetWrapper.java')
-rw-r--r-- | proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/device/linuxtools/network/telnet/TelnetWrapper.java | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/device/linuxtools/network/telnet/TelnetWrapper.java b/proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/device/linuxtools/network/telnet/TelnetWrapper.java new file mode 100644 index 0000000000..fbb3f2ff3d --- /dev/null +++ b/proctools/plugins/org.eclipse.sequoyah.device.linuxtools/src/org/eclipse/sequoyah/device/linuxtools/network/telnet/TelnetWrapper.java @@ -0,0 +1,235 @@ +/******************************************************************************** + * Copyright (c) 2008 Motorola Inc. All rights reserved. + * This program and the accompanying materials are made available under the terms + * of the Eclipse Public License v1.0 which accompanies this distribution, and is + * available at http://www.eclipse.org/legal/epl-v10.html + * + * Initial Contributor: + * Otavio Ferranti (Motorola) + * + * Contributors: + * Otavio Ferranti - Eldorado Research Institute - Bug 255255 [tml][proctools] Add extension points + ********************************************************************************/ + +package org.eclipse.sequoyah.device.linuxtools.network.telnet; + +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.util.HashMap; + +import org.apache.commons.net.telnet.EchoOptionHandler; +import org.apache.commons.net.telnet.InvalidTelnetOptionException; +import org.apache.commons.net.telnet.SuppressGAOptionHandler; +import org.apache.commons.net.telnet.TelnetClient; +import org.apache.commons.net.telnet.TerminalTypeOptionHandler; +import org.eclipse.sequoyah.device.linuxtools.network.IConstants.OperationCode; + +/** + * @author Ot�vio Ferranti + */ +public class TelnetWrapper { + + final public String PROMPT = "[###]:"; //$NON-NLS-1$ + final private String[] LOGIN_TOKENS = {"login:", //$NON-NLS-1$ + "Login:"}; //$NON-NLS-1$ + final private String[] PASSWORD_TOKENS = {"password:", //$NON-NLS-1$ + "Password:"}; //$NON-NLS-1$ + final private String[] LOGIN_FAILED_TOKENS = {"Login incorrect", //$NON-NLS-1$ + "Access denied"}; //$NON-NLS-1$ + final private String CHANGE_PROMPT = "export PS1='[\\043\\043\\043]:'\n"; //$NON-NLS-1$ + + // private ILogger logger = null; + private TelnetClient client = null; + private InputStream inStream = null; + private PrintStream outStream = null; + private StringBuffer lastResponse = null; + private int maxResponseDataLength = 1024; + + private int MAX_LENGTH_PASSWORD_TOKENS = 32; + private int MAX_LENGTH_LOGIN_FAILED = 32; + private int MAX_LENGTH_LOGIN_INITSCREEN = 2048; + private int MAX_LENGTH_CHANGE_PROMPT = 128; + + /** + * Constructor + */ + public TelnetWrapper() { + if (null == this.client) { + this.client = new TelnetClient(); + try { + this.client.addOptionHandler(new TerminalTypeOptionHandler( + "VT100", false, false, true, false)); //$NON-NLS-1$ + this.client.addOptionHandler(new SuppressGAOptionHandler( + true, true, true, true)); + this.client.addOptionHandler(new EchoOptionHandler( + false, false, false, false)); + } catch (InvalidTelnetOptionException itoe) { } + // logger = LinuxToolsPlugin.getLogger(); + } + } + + /* (non-Javadoc) + * @see org.eclipse.sequoyah.device.linuxtools.network.IConnectionWrapper#connect(java.lang.String, int) + */ + public OperationCode connect(String host, int port) throws IOException { + OperationCode retVal; + + this.client.connect(host, port); + + inStream = client.getInputStream(); + outStream = new PrintStream (client.getOutputStream()); + + // sendData(user+"\n"); + if(null == readUntilTokens(LOGIN_TOKENS)) { + retVal = OperationCode.SUCCESS; + } else { + retVal = OperationCode.LOGIN_REQUIRED; + } + return retVal; + } + + /* (non-Javadoc) + * @see org.eclipse.sequoyah.device.linuxtools.network.IConnectionWrapper#disconnect() + */ + public void disconnect() throws IOException { + if (null != client) { + client.disconnect(); + // System.out.println("Connection closed ..."); + } + } + + /* (non-Javadoc) + * @see org.eclipse.sequoyah.device.linuxtools.network.IConnectionWrapper#login(java.lang.String, java.lang.String) + */ + public OperationCode login(String user, String password) throws IOException { + OperationCode retVal = OperationCode.UNEXPECTED_RESULT; + + sendData(user+"\n"); //$NON-NLS-1$ + setResponseLength(MAX_LENGTH_PASSWORD_TOKENS); + if (null != readUntilTokens(PASSWORD_TOKENS)) { + sendData(password+"\n"); //$NON-NLS-1$ + + setResponseLength(MAX_LENGTH_LOGIN_FAILED); + if (null != readUntilTokens(LOGIN_FAILED_TOKENS)) { + if(null != readUntilTokens(LOGIN_TOKENS)) { + retVal = OperationCode.LOGIN_FAILED; + } else { + retVal = OperationCode.UNEXPECTED_RESULT; + } + return retVal; + } else { + setResponseLength(MAX_LENGTH_LOGIN_INITSCREEN); + int toBeSkipped = inStream.available(); + inStream.skip(toBeSkipped); + } + } + try { + Thread.sleep (2000); + } catch (InterruptedException ite) { + + } + setResponseLength(MAX_LENGTH_CHANGE_PROMPT); + sendData(CHANGE_PROMPT); + if (null != readUntilTokens(PROMPT)) { + retVal = OperationCode.SUCCESS; + } + return retVal; + } + + /* (non-Javadoc) + * @see org.eclipse.sequoyah.device.linuxtools.network.IConnectionWrapper#getLastResponde() + */ + public StringBuffer getLastResponde() { + return lastResponse; + } + + /* (non-Javadoc) + * @see org.eclipse.sequoyah.device.linuxtools.network.IConnectionWrapper#sendCommand(java.lang.String) + */ + public String sendCommand(String command) throws IOException { + sendData (command); + return readUntilTokens (PROMPT); + } + + /* (non-Javadoc) + * @see org.eclipse.sequoyah.device.linuxtools.network.IConnectionWrapper#sendData(java.lang.String) + */ + public void sendData(String out) { + if (null != outStream) { + outStream.print(out); + outStream.flush(); + } + } + + /* (non-Javadoc) + * @see org.eclipse.sequoyah.device.linuxtools.network.IConnectionWrapper#setResponseLength(int) + */ + public void setResponseLength(int maxLength) { + maxResponseDataLength = maxLength; + } + + /** + * @param token + * @return + * @throws IOException + */ + private String readUntilTokens(String token)throws IOException { + return readUntilTokens(new String[] {token}); + } + + /** + * @param tokenArray + * @return + * @throws IOException + */ + private String readUntilTokens(final String []tokenArray) throws IOException { + String matchedString = null; + boolean tokenFound = false; + StringBuffer readData = new StringBuffer(); + + HashMap<String,Integer> hashMap = new HashMap<String,Integer>(); + + for (int i = 0; i < tokenArray.length; i++) { + hashMap.put(tokenArray[i], new Integer(0)); + } + + for (int i = 0; i < this.maxResponseDataLength; i++) { + + int aux = inStream.read(); + + char ch = 0; + if (aux == 0 || aux == 1) { + continue; + } else { + ch = (char) aux; + } + readData.append(ch); + + // if (ch != 1 && ch != 0) + // logger.info(ch); + + for (int j = 0; j < tokenArray.length; j++) { + String token = tokenArray[j]; + Integer rank = hashMap.get(token); + if (ch == token.charAt(rank)) { + rank ++; + if (rank >= token.length()) { + // MATCHED + readData.setLength(readData.length() - token.length()); + matchedString = token; + tokenFound = true; + } + } else { + rank = 0; + } + hashMap.put(token, rank); + } + if (tokenFound) { + break; + } + } + this.lastResponse = readData; + return matchedString; + } +} |