| Author | Dave Jarvis <email> |
|---|---|
| Date | 2013-02-28 17:39:30 GMT-0800 |
| Commit | bdcaad1ab99310b0c0ab6b1a465a31f9f55078d8 |
| +------------------------------------ | ||
| +* JExpect v1.0 | ||
| +* Copyright (C) 2000 by Dave Jarvis | ||
| +* Documentation v1.0b | ||
| +------------------------------------ | ||
| + | ||
| +JExpect allows a client to send information to a server via Telnet. | ||
| +It's intention is to automate ASCII text-based communications between | ||
| +a client and server, using a very simple command set. | ||
| + | ||
| +The command set is given to the client via standard input. The first | ||
| +line must be of the form "HOSTNAME PORT", to tell the client where to | ||
| +connect. Each line thereafter must be a JExpect command, detailed in | ||
| +the next section. | ||
| + | ||
| +------------------------------------ | ||
| +* Command Set | ||
| +------------------------------------ | ||
| + | ||
| +Command names are case-insensitive. | ||
| + | ||
| +EXPECT <text> | ||
| + | ||
| +Pauses JExpect until particular text has been read from the server. | ||
| +The comparison is case-sensitive, found anywhere on the line (e.g., | ||
| +PassWord will match "PassWord:" as well as "Your PassWord, please", but | ||
| +not "password:"). JExpect will not time out if the expected text | ||
| +never arrives; it will wait indefinitely. | ||
| + | ||
| +SEND <text> | ||
| + | ||
| +Sends information to the host machine. This is the default command, so | ||
| +specifying "SEND" isn't absolutely required, although it makes scripts | ||
| +easier to read (and is required if sending leading whitespace; trailing | ||
| +whitespace is discarded). | ||
| + | ||
| +QUIT | ||
| + | ||
| +Ends the JExpect session, closing the connection between client and server. | ||
| + | ||
| +------------------------------------ | ||
| +* Example Session | ||
| +------------------------------------ | ||
| + | ||
| +The following example remotely logs into a shell (via Telnet), executes | ||
| +a command, then closes the connection. | ||
| + | ||
| + java ca.dj.jexpect.JExpect | ||
| + localhost 23 | ||
| + expect login | ||
| + send username | ||
| + expect password | ||
| + send userpass | ||
| + expect $ | ||
| + who | grep username >> /tmp/somefile.log | ||
| + expect $ | ||
| + quit | ||
| + | ||
| +Note the final "expect $" before the "quit" command. This makes sure | ||
| +that the command fully executes, presuming the shell prompt contains | ||
| +a "$" symbol somewhere on the line. | ||
| + | ||
| +------------------------------------ | ||
| +* Copyright | ||
| +------------------------------------ | ||
| +This program is free software; you can redistribute it and/or | ||
| +modify it under the terms of the GNU General Public License | ||
| +as published by the Free Software Foundation; either version 2 | ||
| +of the License, or (at your option) any later version. | ||
| + | ||
| +This program is distributed in the hope that it will be useful, | ||
| +but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| +GNU General Public License for more details. | ||
| + | ||
| +You should have received a copy of the GNU General Public License | ||
| +along with this program; if not, write to: | ||
| + | ||
| + The Free Software Foundation, Inc., | ||
| + 59 Temple Place - Suite 330 | ||
| + Boston, MA 02111-1307 | ||
| + USA | ||
| + | ||
| +-fin- | ||
| +/* | ||
| + * Copyright (C) 2000 by Dave Jarvis. | ||
| + * | ||
| + * This program is free software; you can redistribute it and/or | ||
| + * modify it under the terms of the GNU General Public License | ||
| + * as published by the Free Software Foundation; either version 2 | ||
| + * of the License, or (at your option) any later version. | ||
| + * | ||
| + * This program is distributed in the hope that it will be useful, | ||
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| + * GNU General Public License for more details. | ||
| + * | ||
| + * You should have received a copy of the GNU General Public License | ||
| + * along with this program; if not, write to: | ||
| + * | ||
| + * The Free Software Foundation, Inc., | ||
| + * 59 Temple Place - Suite 330 | ||
| + * Boston, MA 02111-1307 | ||
| + * USA | ||
| + */ | ||
| + | ||
| +package ca.dj.jexpect; | ||
| + | ||
| +import java.io.BufferedInputStream; | ||
| +import java.io.BufferedOutputStream; | ||
| +import java.io.BufferedReader; | ||
| +import java.io.InputStreamReader; | ||
| +import java.io.IOException; | ||
| + | ||
| +import java.net.Socket; | ||
| + | ||
| +import ca.dj.jexpect.telnet.*; | ||
| + | ||
| +/** | ||
| + * Controls reading in from Standard Input and writing out to a socket. | ||
| + */ | ||
| +public class JExpect | ||
| +{ | ||
| + // Commands JExpect understands. | ||
| + // | ||
| + private final static String SEND_CMD = "SEND"; | ||
| + private final static String EXPECT_CMD = "EXPECT"; | ||
| + private final static String QUIT_CMD = "QUIT"; | ||
| + | ||
| + private final static String CRLF = "\r\n"; | ||
| + | ||
| + /** | ||
| + * Exits with error level 2 if improper arguments are used.<BR> | ||
| + * Exits with error level 1 if any error occured during session.<BR> | ||
| + * Exits with error level 0 if all went well.<BR> | ||
| + */ | ||
| + public static void main( String args[] ) | ||
| + { | ||
| + // The program doesn't use any arguments. | ||
| + // | ||
| + if( args.length > 0 ) | ||
| + showUsage(); | ||
| + | ||
| + try | ||
| + { | ||
| + // For reading lines from standard input. | ||
| + // | ||
| + BufferedReader br = new BufferedReader( | ||
| + new InputStreamReader( System.in ) ); | ||
| + | ||
| + TelnetProtocol tp = establishConnection( br.readLine().trim() ); | ||
| + runScript( br, tp ); | ||
| + tp.close(); | ||
| + } | ||
| + catch( Exception e ) | ||
| + { | ||
| + System.exit( 1 ); | ||
| + } | ||
| + | ||
| + System.exit( 0 ); | ||
| + } | ||
| + | ||
| + /** | ||
| + * Starts the ball rolling; given a host name and port number as a single | ||
| + * string, this method opens up a connection to and begins communicating | ||
| + * with the host. Exits with error level 1 if the host does not | ||
| + * understand the Telnet protocol. | ||
| + * | ||
| + * @param br - The space-separated host name and port number. | ||
| + * @return The TelnetProtocol used for communicating. | ||
| + */ | ||
| + private static TelnetProtocol establishConnection( String host ) | ||
| + throws Exception | ||
| + { | ||
| + int spaceIndex = host.indexOf( ' ' ); | ||
| + | ||
| + if( spaceIndex == -1 ) | ||
| + showUsage(); | ||
| + | ||
| + String hostName = host.substring( 0, spaceIndex ); | ||
| + int hostPort = | ||
| + Integer.parseInt( host.substring( spaceIndex + 1, host.length() ) ); | ||
| + | ||
| + TelnetState ts = new TelnetState( new Socket( hostName, hostPort ) ); | ||
| + TelnetProtocol tp = new TelnetProtocol( ts ); | ||
| + | ||
| + if( !ts.isReady() ) | ||
| + System.exit( 1 ); | ||
| + | ||
| + return tp; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Given an input stream (BufferedReader) and an instance of | ||
| + * TelnetProtocol, this method runs the script specified by the input | ||
| + * stream. | ||
| + * | ||
| + * @param br - The input stream containing the script. | ||
| + * @param tp - The basic communications protocol. | ||
| + */ | ||
| + private static void runScript( BufferedReader br, TelnetProtocol tp ) | ||
| + throws Exception | ||
| + { | ||
| + String command = null; | ||
| + | ||
| + int spaceIndex = 0; | ||
| + | ||
| + while( true ) | ||
| + { | ||
| + String toParse = br.readLine().trim(); | ||
| + | ||
| + if( toParse.equalsIgnoreCase( QUIT_CMD ) ) | ||
| + break; | ||
| + | ||
| + // Default command. | ||
| + // | ||
| + if( (spaceIndex = toParse.indexOf( ' ' )) == -1 ) | ||
| + command = SEND_CMD; | ||
| + else | ||
| + { | ||
| + command = toParse.substring( 0, spaceIndex ); | ||
| + toParse = toParse.substring( spaceIndex + 1, toParse.length() ); | ||
| + } | ||
| + | ||
| + if( command.equalsIgnoreCase( SEND_CMD ) ) | ||
| + send( tp, toParse + CRLF ); | ||
| + else if( command.equalsIgnoreCase( EXPECT_CMD ) ) | ||
| + expect( tp, toParse.trim() ); | ||
| + } | ||
| + } | ||
| + | ||
| + /** | ||
| + * Sends a line of text from the client to the host. | ||
| + * | ||
| + * @param tp - The basic communication transport class | ||
| + * @param toSend - The text to send to the host. | ||
| + */ | ||
| + private static void send( TelnetProtocol tp, String toSend ) | ||
| + throws IOException | ||
| + { | ||
| + tp.writeString( toSend ); | ||
| + } | ||
| + | ||
| + /** | ||
| + * Waits for a specific piece of text from the host. | ||
| + * | ||
| + * @param tp - The basic communication transport class | ||
| + * @param toExpect - The text the host is expected to send. | ||
| + */ | ||
| + private static void expect( TelnetProtocol tp, String toExpect ) | ||
| + throws IOException | ||
| + { | ||
| + String text = null; | ||
| + | ||
| + do | ||
| + { | ||
| + text = tp.readText(); | ||
| + } | ||
| + while( text.indexOf( toExpect ) == -1 ); | ||
| + } | ||
| + | ||
| + /** | ||
| + * Useful stuff, no really ... Exits with error level 2. | ||
| + */ | ||
| + private static void showUsage() | ||
| + { | ||
| + System.out.println( "JExpect v1.0" ); | ||
| + System.out.println( "Copyright (C) 2000 by Dave Jarvis" ); | ||
| + System.out.println( "Please read README for information about JExpect." ); | ||
| + System.exit( 2 ); | ||
| + } | ||
| +} | ||
| +/* | ||
| + * Copyright (C) 2000 by Dave Jarvis (dj@joot.com). | ||
| + * | ||
| + * This program is free software; you can redistribute it and/or | ||
| + * modify it under the terms of the GNU General Public License | ||
| + * as published by the Free Software Foundation; either version 2 | ||
| + * of the License, or (at your option) any later version. | ||
| + * | ||
| + * This program is distributed in the hope that it will be useful, | ||
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| + * GNU General Public License for more details. | ||
| + * | ||
| + * You should have received a copy of the GNU General Public License | ||
| + * along with this program; if not, write to: | ||
| + * | ||
| + * The Free Software Foundation, Inc., | ||
| + * 59 Temple Place - Suite 330 | ||
| + * Boston, MA 02111-1307 | ||
| + * USA | ||
| + */ | ||
| + | ||
| +package ca.dj.jexpect.telnet; | ||
| + | ||
| +import java.io.*; | ||
| +import java.net.*; | ||
| + | ||
| +/** | ||
| + * This handles the basic Telnet protocol. It is tightly coupled with | ||
| + * the TelnetState class. Note that this isn't a full implementation | ||
| + * of the Telnet protocol, but rather a bare bones implementation. | ||
| + */ | ||
| +public class TelnetProtocol | ||
| +{ | ||
| + protected final static int IAC = 255; // Interpret As Command ... | ||
| + | ||
| + // Format: IAC<[WILL|WONT|DO|DONT<option code>]|[IAC/IP|AYT|BRK|NOP|AO]> | ||
| + // | ||
| + public final static byte DONT = (byte)254; // You are not to use this option. | ||
| + public final static byte DO = (byte)253; // Please do this option? | ||
| + public final static byte WONT = (byte)252; // I won't do that option. | ||
| + public final static byte WILL = (byte)251; // I will do that option. | ||
| + | ||
| + public final static byte SB = (byte)250; // Subnegotiation of option XYZ | ||
| + public final static byte GA = (byte)249; // Go Ahead | ||
| + public final static byte EL = (byte)248; // Erase Line | ||
| + public final static byte EC = (byte)247; // Erase Character | ||
| + public final static byte AYT = (byte)246; // Are You There? Huh? Are ya'? | ||
| + public final static byte AO = (byte)245; // Abort Output | ||
| + public final static byte IP = (byte)244; // Interrupt Process | ||
| + public final static byte BRK = (byte)243; // Break, duh | ||
| + public final static byte DM = (byte)242; // Data Mark | ||
| + public final static byte NOP = (byte)241; // No Operation | ||
| + public final static byte SE = (byte)240; // End Subnegotiation parameters | ||
| + public final static byte EOR = (byte)239; // End of Record | ||
| + | ||
| + // The TELOPT_ codes for WILL/WONT/DO/DONT commands | ||
| + // | ||
| + public final static byte TELOPT_SGA = (byte)3; // Suppress Go Ahead | ||
| + | ||
| + // Instead of creating this array each time, create it once and modify | ||
| + // the values of its last two indices (command and option). | ||
| + // | ||
| + protected byte SEND_OPT[] = { (byte)IAC, (byte)0, (byte)0 }; | ||
| + | ||
| + private TelnetState myState = null; | ||
| + | ||
| + protected TelnetProtocol() { } | ||
| + | ||
| + public TelnetProtocol( TelnetState tState ) | ||
| + { | ||
| + setTelnetState( tState ); | ||
| + if( !initTelnet() ) | ||
| + tState.notReady(); | ||
| + } | ||
| + | ||
| + protected void setTelnetState( TelnetState tState ) | ||
| + { | ||
| + myState = tState; | ||
| + } | ||
| + | ||
| + protected TelnetState getTelnetState() | ||
| + { | ||
| + return myState; | ||
| + } | ||
| + | ||
| + protected void sendOpt( byte command, byte opt, BufferedOutputStream os ) | ||
| + throws IOException | ||
| + { | ||
| + SEND_OPT[1] = command; | ||
| + SEND_OPT[2] = opt; | ||
| + writeBytes( SEND_OPT, os ); | ||
| + } | ||
| + | ||
| + protected void willOpt( byte opt, BufferedOutputStream os ) | ||
| + throws IOException | ||
| + { | ||
| + sendOpt( WILL, opt, os ); | ||
| + } | ||
| + | ||
| + protected void wontOpt( byte opt, BufferedOutputStream os ) | ||
| + throws IOException | ||
| + { | ||
| + sendOpt( WONT, opt, os ); | ||
| + } | ||
| + | ||
| + protected void doOpt( byte opt, BufferedOutputStream os ) | ||
| + throws IOException | ||
| + { | ||
| + sendOpt( DO, opt, os ); | ||
| + } | ||
| + | ||
| + protected void dontOpt( byte opt, BufferedOutputStream os ) | ||
| + throws IOException | ||
| + { | ||
| + sendOpt( DONT, opt, os ); | ||
| + } | ||
| + | ||
| + protected void iacOpt( byte opt, BufferedOutputStream outStream ) | ||
| + throws IOException | ||
| + { | ||
| + byte[] SEND_IAC_OPT = { (byte)IAC, opt }; | ||
| + writeBytes( SEND_IAC_OPT, outStream ); | ||
| + } | ||
| + | ||
| + protected void writeBytes( byte toWrite[], OutputStream outStream ) | ||
| + throws IOException | ||
| + { | ||
| + outStream.write( toWrite, 0, toWrite.length ); | ||
| + outStream.flush(); | ||
| + } | ||
| + | ||
| + /** | ||
| + * Parses Telnet codes from the input stream. | ||
| + * | ||
| + * @return false - the connection closed. | ||
| + */ | ||
| + protected boolean parse() | ||
| + throws IOException | ||
| + { | ||
| + TelnetState tState = getTelnetState(); | ||
| + BufferedInputStream is = tState.getInStream(); | ||
| + int byteRead = 0, | ||
| + command = 0, | ||
| + option = 0; | ||
| + | ||
| + // Only need to parse if we have something to read ... | ||
| + // | ||
| + if( bytesAvailable() == 0 ) | ||
| + return true; | ||
| + | ||
| + // Mark the stream at this point; if the next character isn't | ||
| + // IAC, then we have nothing to parse. | ||
| + // | ||
| + is.mark( 1 ); | ||
| + if( (byteRead = is.read()) == -1 ) return false; | ||
| + | ||
| + // While there are Telnet codes to parse ... | ||
| + // | ||
| + while( byteRead == IAC ) | ||
| + { | ||
| + // Read the character following the IAC character: | ||
| + // DO/DONT/WILL/WONT/IAC/IP/etc. | ||
| + // | ||
| + if( (command = is.read()) == -1 ) return false; | ||
| + | ||
| + // Now figure out what it was we were/weren't supposed to do. | ||
| + // | ||
| + switch( (byte)command ) | ||
| + { | ||
| + // We won't do what was requested, unless it was SGA. | ||
| + // | ||
| + case DO: | ||
| + if( (option = is.read()) == -1 ) return false; | ||
| + | ||
| + if( option == TELOPT_SGA ) | ||
| + willOpt( (byte)option, tState.getOutStream() ); | ||
| + else | ||
| + wontOpt( (byte)option, tState.getOutStream() ); | ||
| + break; | ||
| + | ||
| + // We won't do that ... honest! | ||
| + // | ||
| + case DONT: | ||
| + if( (option = is.read()) == -1 ) return false; | ||
| + wontOpt( (byte)option, tState.getOutStream() ); | ||
| + break; | ||
| + | ||
| + // Tell the server to go right ahead and do what it will. | ||
| + // | ||
| + case WILL: | ||
| + if( (option = is.read()) == -1 ) return false; | ||
| + doOpt( (byte)option, tState.getOutStream() ); | ||
| + break; | ||
| + | ||
| + // Tell the server it doesn't have to do what it won't. | ||
| + // | ||
| + case WONT: | ||
| + if( (option = is.read()) == -1 ) return false; | ||
| + dontOpt( (byte)option, tState.getOutStream() ); | ||
| + break; | ||
| + | ||
| + // Request to interrupt process. | ||
| + // | ||
| + case IP: | ||
| + return false; | ||
| + | ||
| + // An IAC followed by an IAC indicates that the data | ||
| + // stream contains a single IAC character; reset the | ||
| + // stream to the marked position so it can be read by | ||
| + // something else. | ||
| + // | ||
| + case (byte)IAC: | ||
| + is.reset(); | ||
| + return true; | ||
| + | ||
| + // Otherwise, we don't know what to do! | ||
| + // | ||
| + default: | ||
| + return true; | ||
| + } | ||
| + | ||
| + // If there's nothing more to read, then we've hit the end of the | ||
| + // Telnet commands (for now). | ||
| + // | ||
| + if( is.available() == 0 ) return true; | ||
| + | ||
| + // The next character could be another IAC character, so mark the | ||
| + // stream in case it isn't. | ||
| + // | ||
| + is.mark( 1 ); | ||
| + | ||
| + // Read the next character -- if it is an IAC character, everything | ||
| + // is fine. | ||
| + // | ||
| + if( (byteRead = is.read()) == -1 ) return false; | ||
| + } | ||
| + | ||
| + // The next character wasn't an IAC character, so reset the stream | ||
| + // for somebody else to handle the next character. | ||
| + // | ||
| + is.reset(); | ||
| + return true; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Initializes the Telnet session (suppresses Go Ahead). | ||
| + * | ||
| + * @return false - the connection closed. | ||
| + */ | ||
| + public synchronized boolean initTelnet() | ||
| + { | ||
| + try | ||
| + { | ||
| + // Tell the remote side to suppress Go Ahead | ||
| + // | ||
| + doOpt( TELOPT_SGA, getTelnetState().getOutStream() ); | ||
| + if( !parse() ) return false; | ||
| + | ||
| + // Let the remote side know we will suppress Go Ahead | ||
| + // | ||
| + willOpt( TELOPT_SGA, getTelnetState().getOutStream() ); | ||
| + if( !parse() ) return false; | ||
| + } | ||
| + catch( Exception e ) | ||
| + { | ||
| + return false; | ||
| + } | ||
| + | ||
| + return true; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Reads a byte from the input stream. | ||
| + * | ||
| + * @return The next non-Telnet command character from the stream. | ||
| + */ | ||
| + public byte readByte() | ||
| + throws IOException | ||
| + { | ||
| + // Parse any Telnet codes. | ||
| + // | ||
| + parse(); | ||
| + | ||
| + // Read the byte following any Telnet codes, then return it. | ||
| + // | ||
| + int byteRead = getTelnetState().getInStream().read(); | ||
| + if( byteRead == -1 ) throw new IOException(); | ||
| + return (byte)byteRead; | ||
| + } | ||
| + | ||
| + /** | ||
| + * @return The number of bytes available to be read ... | ||
| + */ | ||
| + private int bytesAvailable() | ||
| + throws IOException | ||
| + { | ||
| + return getTelnetState().getInStream().available(); | ||
| + } | ||
| + | ||
| + // Only used by "readText()" | ||
| + // | ||
| + private StringBuffer myStringBuffer = new StringBuffer(); | ||
| + | ||
| + /** | ||
| + * Used to read text from the input stream, without having to worry about | ||
| + * the Telnet protocol. | ||
| + * | ||
| + * @return A CR/LF terminated string of characters | ||
| + * @return A non-CR/LF terminated string of characters when no more data | ||
| + * is available | ||
| + * @return "" on any error | ||
| + */ | ||
| + public synchronized String readText() | ||
| + throws IOException | ||
| + { | ||
| + myStringBuffer.setLength( 0 ); | ||
| + int byteRead = readByte(); | ||
| + | ||
| + while( (byteRead != 0x0A) && (byteRead != -1) ) | ||
| + { | ||
| + myStringBuffer.append( (char)byteRead ); | ||
| + | ||
| + // If the number of bytes available is zero, just return whatever | ||
| + // was found to this point. | ||
| + // | ||
| + if( bytesAvailable() == 0 ) | ||
| + return myStringBuffer.toString(); | ||
| + | ||
| + byteRead = readByte(); | ||
| + } | ||
| + | ||
| + if( byteRead == -1 ) | ||
| + return ""; | ||
| + | ||
| + myStringBuffer.append( "\r\n" ); | ||
| + return myStringBuffer.toString(); | ||
| + } | ||
| + | ||
| + // Only used by "writeString( String )" | ||
| + // | ||
| + private BufferedWriter myBufferedWriter = null; | ||
| + | ||
| + /** | ||
| + * Writes a string of characters to the output stream. | ||
| + * | ||
| + * @param s - A CR/LF or LF-terminated string | ||
| + */ | ||
| + public void writeString( String s ) | ||
| + throws IOException | ||
| + { | ||
| + // Lazy initialization, as "myBufferedWriter" is only used here. | ||
| + // | ||
| + if( myBufferedWriter == null ) | ||
| + myBufferedWriter = new BufferedWriter( | ||
| + new OutputStreamWriter( getTelnetState().getOutStream() ) ); | ||
| + | ||
| + myBufferedWriter.write( s, 0, s.length() ); | ||
| + myBufferedWriter.flush(); | ||
| + } | ||
| + | ||
| + public void close() | ||
| + throws IOException | ||
| + { | ||
| + getTelnetState().close(); | ||
| + } | ||
| +} | ||
| +/* | ||
| + * Copyright (C) 2000 by Dave Jarvis (dj@joot.com). | ||
| + * | ||
| + * This program is free software; you can redistribute it and/or | ||
| + * modify it under the terms of the GNU General Public License | ||
| + * as published by the Free Software Foundation; either version 2 | ||
| + * of the License, or (at your option) any later version. | ||
| + * | ||
| + * This program is distributed in the hope that it will be useful, | ||
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| + * GNU General Public License for more details. | ||
| + * | ||
| + * You should have received a copy of the GNU General Public License | ||
| + * along with this program; if not, write to: | ||
| + * | ||
| + * The Free Software Foundation, Inc., | ||
| + * 59 Temple Place - Suite 330 | ||
| + * Boston, MA 02111-1307 | ||
| + * USA | ||
| + */ | ||
| + | ||
| +package ca.dj.jexpect.telnet; | ||
| + | ||
| +import java.io.BufferedInputStream; | ||
| +import java.io.BufferedOutputStream; | ||
| +import java.io.IOException; | ||
| + | ||
| +import java.net.Socket; | ||
| + | ||
| +/** | ||
| + * This class contains information used by the TelnetProtocol class. | ||
| + */ | ||
| +public class TelnetState | ||
| +{ | ||
| + private Socket mySocket = null; | ||
| + private BufferedInputStream myBis = null; | ||
| + private BufferedOutputStream myBos = null; | ||
| + | ||
| + // Ready for doing the Telnet protocol, by default. | ||
| + // | ||
| + private boolean amReady = true; | ||
| + | ||
| + /** | ||
| + * @param s - The socket whose in/out streams are supposed to conform to | ||
| + * the Telnet protocol. | ||
| + */ | ||
| + public TelnetState( Socket s ) | ||
| + { | ||
| + mySocket = s; | ||
| + | ||
| + try | ||
| + { | ||
| + myBis = new BufferedInputStream( s.getInputStream() ); | ||
| + myBos = new BufferedOutputStream( s.getOutputStream() );; | ||
| + } | ||
| + catch( Exception e ) | ||
| + { | ||
| + notReady(); | ||
| + } | ||
| + } | ||
| + | ||
| + public BufferedInputStream getInStream() | ||
| + { | ||
| + return myBis; | ||
| + } | ||
| + | ||
| + public BufferedOutputStream getOutStream() | ||
| + { | ||
| + return myBos; | ||
| + } | ||
| + | ||
| + public boolean isReady() | ||
| + { | ||
| + return amReady; | ||
| + } | ||
| + | ||
| + /** | ||
| + * Once not ready, everything must start a-fresh. | ||
| + */ | ||
| + protected void notReady() | ||
| + { | ||
| + amReady = false; | ||
| + } | ||
| + | ||
| + protected void close() | ||
| + throws IOException | ||
| + { | ||
| + mySocket.close(); | ||
| + } | ||
| +} | ||
| + GNU GENERAL PUBLIC LICENSE | ||
| + Version 2, June 1991 | ||
| + | ||
| + Copyright (C) 1989, 1991 Free Software Foundation, Inc. | ||
| + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| + Everyone is permitted to copy and distribute verbatim copies | ||
| + of this license document, but changing it is not allowed. | ||
| + | ||
| + Preamble | ||
| + | ||
| + The licenses for most software are designed to take away your | ||
| +freedom to share and change it. By contrast, the GNU General Public | ||
| +License is intended to guarantee your freedom to share and change free | ||
| +software--to make sure the software is free for all its users. This | ||
| +General Public License applies to most of the Free Software | ||
| +Foundation's software and to any other program whose authors commit to | ||
| +using it. (Some other Free Software Foundation software is covered by | ||
| +the GNU Library General Public License instead.) You can apply it to | ||
| +your programs, too. | ||
| + | ||
| + When we speak of free software, we are referring to freedom, not | ||
| +price. Our General Public Licenses are designed to make sure that you | ||
| +have the freedom to distribute copies of free software (and charge for | ||
| +this service if you wish), that you receive source code or can get it | ||
| +if you want it, that you can change the software or use pieces of it | ||
| +in new free programs; and that you know you can do these things. | ||
| + | ||
| + To protect your rights, we need to make restrictions that forbid | ||
| +anyone to deny you these rights or to ask you to surrender the rights. | ||
| +These restrictions translate to certain responsibilities for you if you | ||
| +distribute copies of the software, or if you modify it. | ||
| + | ||
| + For example, if you distribute copies of such a program, whether | ||
| +gratis or for a fee, you must give the recipients all the rights that | ||
| +you have. You must make sure that they, too, receive or can get the | ||
| +source code. And you must show them these terms so they know their | ||
| +rights. | ||
| + | ||
| + We protect your rights with two steps: (1) copyright the software, and | ||
| +(2) offer you this license which gives you legal permission to copy, | ||
| +distribute and/or modify the software. | ||
| + | ||
| + Also, for each author's protection and ours, we want to make certain | ||
| +that everyone understands that there is no warranty for this free | ||
| +software. If the software is modified by someone else and passed on, we | ||
| +want its recipients to know that what they have is not the original, so | ||
| +that any problems introduced by others will not reflect on the original | ||
| +authors' reputations. | ||
| + | ||
| + Finally, any free program is threatened constantly by software | ||
| +patents. We wish to avoid the danger that redistributors of a free | ||
| +program will individually obtain patent licenses, in effect making the | ||
| +program proprietary. To prevent this, we have made it clear that any | ||
| +patent must be licensed for everyone's free use or not licensed at all. | ||
| + | ||
| + The precise terms and conditions for copying, distribution and | ||
| +modification follow. | ||
| + | ||
| + GNU GENERAL PUBLIC LICENSE | ||
| + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||
| + | ||
| + 0. This License applies to any program or other work which contains | ||
| +a notice placed by the copyright holder saying it may be distributed | ||
| +under the terms of this General Public License. The "Program", below, | ||
| +refers to any such program or work, and a "work based on the Program" | ||
| +means either the Program or any derivative work under copyright law: | ||
| +that is to say, a work containing the Program or a portion of it, | ||
| +either verbatim or with modifications and/or translated into another | ||
| +language. (Hereinafter, translation is included without limitation in | ||
| +the term "modification".) Each licensee is addressed as "you". | ||
| + | ||
| +Activities other than copying, distribution and modification are not | ||
| +covered by this License; they are outside its scope. The act of | ||
| +running the Program is not restricted, and the output from the Program | ||
| +is covered only if its contents constitute a work based on the | ||
| +Program (independent of having been made by running the Program). | ||
| +Whether that is true depends on what the Program does. | ||
| + | ||
| + 1. You may copy and distribute verbatim copies of the Program's | ||
| +source code as you receive it, in any medium, provided that you | ||
| +conspicuously and appropriately publish on each copy an appropriate | ||
| +copyright notice and disclaimer of warranty; keep intact all the | ||
| +notices that refer to this License and to the absence of any warranty; | ||
| +and give any other recipients of the Program a copy of this License | ||
| +along with the Program. | ||
| + | ||
| +You may charge a fee for the physical act of transferring a copy, and | ||
| +you may at your option offer warranty protection in exchange for a fee. | ||
| + | ||
| + 2. You may modify your copy or copies of the Program or any portion | ||
| +of it, thus forming a work based on the Program, and copy and | ||
| +distribute such modifications or work under the terms of Section 1 | ||
| +above, provided that you also meet all of these conditions: | ||
| + | ||
| + a) You must cause the modified files to carry prominent notices | ||
| + stating that you changed the files and the date of any change. | ||
| + | ||
| + b) You must cause any work that you distribute or publish, that in | ||
| + whole or in part contains or is derived from the Program or any | ||
| + part thereof, to be licensed as a whole at no charge to all third | ||
| + parties under the terms of this License. | ||
| + | ||
| + c) If the modified program normally reads commands interactively | ||
| + when run, you must cause it, when started running for such | ||
| + interactive use in the most ordinary way, to print or display an | ||
| + announcement including an appropriate copyright notice and a | ||
| + notice that there is no warranty (or else, saying that you provide | ||
| + a warranty) and that users may redistribute the program under | ||
| + these conditions, and telling the user how to view a copy of this | ||
| + License. (Exception: if the Program itself is interactive but | ||
| + does not normally print such an announcement, your work based on | ||
| + the Program is not required to print an announcement.) | ||
| + | ||
| +These requirements apply to the modified work as a whole. If | ||
| +identifiable sections of that work are not derived from the Program, | ||
| +and can be reasonably considered independent and separate works in | ||
| +themselves, then this License, and its terms, do not apply to those | ||
| +sections when you distribute them as separate works. But when you | ||
| +distribute the same sections as part of a whole which is a work based | ||
| +on the Program, the distribution of the whole must be on the terms of | ||
| +this License, whose permissions for other licensees extend to the | ||
| +entire whole, and thus to each and every part regardless of who wrote it. | ||
| + | ||
| +Thus, it is not the intent of this section to claim rights or contest | ||
| +your rights to work written entirely by you; rather, the intent is to | ||
| +exercise the right to control the distribution of derivative or | ||
| +collective works based on the Program. | ||
| + | ||
| +In addition, mere aggregation of another work not based on the Program | ||
| +with the Program (or with a work based on the Program) on a volume of | ||
| +a storage or distribution medium does not bring the other work under | ||
| +the scope of this License. | ||
| + | ||
| + 3. You may copy and distribute the Program (or a work based on it, | ||
| +under Section 2) in object code or executable form under the terms of | ||
| +Sections 1 and 2 above provided that you also do one of the following: | ||
| + | ||
| + a) Accompany it with the complete corresponding machine-readable | ||
| + source code, which must be distributed under the terms of Sections | ||
| + 1 and 2 above on a medium customarily used for software interchange; or, | ||
| + | ||
| + b) Accompany it with a written offer, valid for at least three | ||
| + years, to give any third party, for a charge no more than your | ||
| + cost of physically performing source distribution, a complete | ||
| + machine-readable copy of the corresponding source code, to be | ||
| + distributed under the terms of Sections 1 and 2 above on a medium | ||
| + customarily used for software interchange; or, | ||
| + | ||
| + c) Accompany it with the information you received as to the offer | ||
| + to distribute corresponding source code. (This alternative is | ||
| + allowed only for noncommercial distribution and only if you | ||
| + received the program in object code or executable form with such | ||
| + an offer, in accord with Subsection b above.) | ||
| + | ||
| +The source code for a work means the preferred form of the work for | ||
| +making modifications to it. For an executable work, complete source | ||
| +code means all the source code for all modules it contains, plus any | ||
| +associated interface definition files, plus the scripts used to | ||
| +control compilation and installation of the executable. However, as a | ||
| +special exception, the source code distributed need not include | ||
| +anything that is normally distributed (in either source or binary | ||
| +form) with the major components (compiler, kernel, and so on) of the | ||
| +operating system on which the executable runs, unless that component | ||
| +itself accompanies the executable. | ||
| + | ||
| +If distribution of executable or object code is made by offering | ||
| +access to copy from a designated place, then offering equivalent | ||
| +access to copy the source code from the same place counts as | ||
| +distribution of the source code, even though third parties are not | ||
| +compelled to copy the source along with the object code. | ||
| + | ||
| + 4. You may not copy, modify, sublicense, or distribute the Program | ||
| +except as expressly provided under this License. Any attempt | ||
| +otherwise to copy, modify, sublicense or distribute the Program is | ||
| +void, and will automatically terminate your rights under this License. | ||
| +However, parties who have received copies, or rights, from you under | ||
| +this License will not have their licenses terminated so long as such | ||
| +parties remain in full compliance. | ||
| + | ||
| + 5. You are not required to accept this License, since you have not | ||
| +signed it. However, nothing else grants you permission to modify or | ||
| +distribute the Program or its derivative works. These actions are | ||
| +prohibited by law if you do not accept this License. Therefore, by | ||
| +modifying or distributing the Program (or any work based on the | ||
| +Program), you indicate your acceptance of this License to do so, and | ||
| +all its terms and conditions for copying, distributing or modifying | ||
| +the Program or works based on it. | ||
| + | ||
| + 6. Each time you redistribute the Program (or any work based on the | ||
| +Program), the recipient automatically receives a license from the | ||
| +original licensor to copy, distribute or modify the Program subject to | ||
| +these terms and conditions. You may not impose any further | ||
| +restrictions on the recipients' exercise of the rights granted herein. | ||
| +You are not responsible for enforcing compliance by third parties to | ||
| +this License. | ||
| + | ||
| + 7. If, as a consequence of a court judgment or allegation of patent | ||
| +infringement or for any other reason (not limited to patent issues), | ||
| +conditions are imposed on you (whether by court order, agreement or | ||
| +otherwise) that contradict the conditions of this License, they do not | ||
| +excuse you from the conditions of this License. If you cannot | ||
| +distribute so as to satisfy simultaneously your obligations under this | ||
| +License and any other pertinent obligations, then as a consequence you | ||
| +may not distribute the Program at all. For example, if a patent | ||
| +license would not permit royalty-free redistribution of the Program by | ||
| +all those who receive copies directly or indirectly through you, then | ||
| +the only way you could satisfy both it and this License would be to | ||
| +refrain entirely from distribution of the Program. | ||
| + | ||
| +If any portion of this section is held invalid or unenforceable under | ||
| +any particular circumstance, the balance of the section is intended to | ||
| +apply and the section as a whole is intended to apply in other | ||
| +circumstances. | ||
| + | ||
| +It is not the purpose of this section to induce you to infringe any | ||
| +patents or other property right claims or to contest validity of any | ||
| +such claims; this section has the sole purpose of protecting the | ||
| +integrity of the free software distribution system, which is | ||
| +implemented by public license practices. Many people have made | ||
| +generous contributions to the wide range of software distributed | ||
| +through that system in reliance on consistent application of that | ||
| +system; it is up to the author/donor to decide if he or she is willing | ||
| +to distribute software through any other system and a licensee cannot | ||
| +impose that choice. | ||
| + | ||
| +This section is intended to make thoroughly clear what is believed to | ||
| +be a consequence of the rest of this License. | ||
| + | ||
| + 8. If the distribution and/or use of the Program is restricted in | ||
| +certain countries either by patents or by copyrighted interfaces, the | ||
| +original copyright holder who places the Program under this License | ||
| +may add an explicit geographical distribution limitation excluding | ||
| +those countries, so that distribution is permitted only in or among | ||
| +countries not thus excluded. In such case, this License incorporates | ||
| +the limitation as if written in the body of this License. | ||
| + | ||
| + 9. The Free Software Foundation may publish revised and/or new versions | ||
| +of the General Public License from time to time. Such new versions will | ||
| +be similar in spirit to the present version, but may differ in detail to | ||
| +address new problems or concerns. | ||
| + | ||
| +Each version is given a distinguishing version number. If the Program | ||
| +specifies a version number of this License which applies to it and "any | ||
| +later version", you have the option of following the terms and conditions | ||
| +either of that version or of any later version published by the Free | ||
| +Software Foundation. If the Program does not specify a version number of | ||
| +this License, you may choose any version ever published by the Free Software | ||
| +Foundation. | ||
| + | ||
| + 10. If you wish to incorporate parts of the Program into other free | ||
| +programs whose distribution conditions are different, write to the author | ||
| +to ask for permission. For software which is copyrighted by the Free | ||
| +Software Foundation, write to the Free Software Foundation; we sometimes | ||
| +make exceptions for this. Our decision will be guided by the two goals | ||
| +of preserving the free status of all derivatives of our free software and | ||
| +of promoting the sharing and reuse of software generally. | ||
| + | ||
| + NO WARRANTY | ||
| + | ||
| + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | ||
| +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | ||
| +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | ||
| +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | ||
| +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
| +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | ||
| +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | ||
| +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | ||
| +REPAIR OR CORRECTION. | ||
| + | ||
| + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | ||
| +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | ||
| +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | ||
| +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | ||
| +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | ||
| +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | ||
| +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | ||
| +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | ||
| +POSSIBILITY OF SUCH DAMAGES. | ||
| + | ||
| + END OF TERMS AND CONDITIONS | ||
| + | ||
| + How to Apply These Terms to Your New Programs | ||
| + | ||
| + If you develop a new program, and you want it to be of the greatest | ||
| +possible use to the public, the best way to achieve this is to make it | ||
| +free software which everyone can redistribute and change under these terms. | ||
| + | ||
| + To do so, attach the following notices to the program. It is safest | ||
| +to attach them to the start of each source file to most effectively | ||
| +convey the exclusion of warranty; and each file should have at least | ||
| +the "copyright" line and a pointer to where the full notice is found. | ||
| + | ||
| + <one line to give the program's name and a brief idea of what it does.> | ||
| + Copyright (C) 19yy <name of author> | ||
| + | ||
| + This program is free software; you can redistribute it and/or modify | ||
| + it under the terms of the GNU General Public License as published by | ||
| + the Free Software Foundation; either version 2 of the License, or | ||
| + (at your option) any later version. | ||
| + | ||
| + This program is distributed in the hope that it will be useful, | ||
| + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| + GNU General Public License for more details. | ||
| + | ||
| + You should have received a copy of the GNU General Public License | ||
| + along with this program; if not, write to the Free Software | ||
| + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| + | ||
| + | ||
| +Also add information on how to contact you by electronic and paper mail. | ||
| + | ||
| +If the program is interactive, make it output a short notice like this | ||
| +when it starts in an interactive mode: | ||
| + | ||
| + Gnomovision version 69, Copyright (C) 19yy name of author | ||
| + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | ||
| + This is free software, and you are welcome to redistribute it | ||
| + under certain conditions; type `show c' for details. | ||
| + | ||
| +The hypothetical commands `show w' and `show c' should show the appropriate | ||
| +parts of the General Public License. Of course, the commands you use may | ||
| +be called something other than `show w' and `show c'; they could even be | ||
| +mouse-clicks or menu items--whatever suits your program. | ||
| + | ||
| +You should also get your employer (if you work as a programmer) or your | ||
| +school, if any, to sign a "copyright disclaimer" for the program, if | ||
| +necessary. Here is a sample; alter the names: | ||
| + | ||
| + Yoyodyne, Inc., hereby disclaims all copyright interest in the program | ||
| + `Gnomovision' (which makes passes at compilers) written by James Hacker. | ||
| + | ||
| + <signature of Ty Coon>, 1 April 1989 | ||
| + Ty Coon, President of Vice | ||
| + | ||
| +This General Public License does not permit incorporating your program into | ||
| +proprietary programs. If your program is a subroutine library, you may | ||
| +consider it more useful to permit linking proprietary applications with the | ||
| +library. If this is what you want to do, use the GNU Library General | ||
| +Public License instead of this License. | ||
| Delta | 1070 lines added, 0 lines removed, 1070-line increase |
|---|