aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java397
1 files changed, 397 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java
new file mode 100644
index 00000000..82625fa7
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/taskdefs/optional/net/TelnetTask.java
@@ -0,0 +1,397 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.tools.ant.taskdefs.optional.net;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Calendar;
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.apache.commons.net.telnet.TelnetClient;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/**
+ * Automates the telnet protocol.
+ *
+ */
+
+public class TelnetTask extends Task {
+ private static final int WAIT_INTERVAL = 250;
+ private static final int TELNET_PORT = 23;
+
+ /**
+ * The userid to login with, if automated login is used
+ */
+ private String userid = null;
+
+ /**
+ * The password to login with, if automated login is used
+ */
+ private String password = null;
+
+ /**
+ * The server to connect to.
+ */
+ private String server = null;
+
+ /**
+ * The tcp port to connect to.
+ */
+ private int port = TELNET_PORT;
+
+ /**
+ * The list of read/write commands for this session
+ */
+ private Vector telnetTasks = new Vector();
+
+ /**
+ * If true, adds a CR to beginning of login script
+ */
+ private boolean addCarriageReturn = false;
+
+ /**
+ * Default time allowed for waiting for a valid response
+ * for all child reads. A value of 0 means no limit.
+ */
+ private Integer defaultTimeout = null;
+
+ /**
+ * Verify that all parameters are included.
+ * Connect and possibly login
+ * Iterate through the list of Reads and writes
+ * @throws BuildException on error
+ */
+ public void execute() throws BuildException {
+ /** A server name is required to continue */
+ if (server == null) {
+ throw new BuildException("No Server Specified");
+ }
+ /** A userid and password must appear together
+ * if they appear. They are not required.
+ */
+ if (userid == null && password != null) {
+ throw new BuildException("No Userid Specified");
+ }
+ if (password == null && userid != null) {
+ throw new BuildException("No Password Specified");
+ }
+
+ /** Create the telnet client object */
+ AntTelnetClient telnet = null;
+ try {
+ telnet = new AntTelnetClient();
+ try {
+ telnet.connect(server, port);
+ } catch (IOException e) {
+ throw new BuildException("Can't connect to " + server);
+ }
+ /** Login if userid and password were specified */
+ if (userid != null && password != null) {
+ login(telnet);
+ }
+ /** Process each sub command */
+ Enumeration tasksToRun = telnetTasks.elements();
+ while (tasksToRun != null && tasksToRun.hasMoreElements()) {
+ TelnetSubTask task = (TelnetSubTask) tasksToRun.nextElement();
+ if (task instanceof TelnetRead && defaultTimeout != null) {
+ ((TelnetRead) task).setDefaultTimeout(defaultTimeout);
+ }
+ task.execute(telnet);
+ }
+ } finally {
+ if (telnet != null && telnet.isConnected()) {
+ try {
+ telnet.disconnect();
+ } catch (IOException e) {
+ throw new BuildException("Error disconnecting from "
+ + server);
+ }
+ }
+ }
+ }
+
+ /**
+ * Process a 'typical' login. If it differs, use the read
+ * and write tasks explicitly
+ */
+ private void login(AntTelnetClient telnet) {
+ if (addCarriageReturn) {
+ telnet.sendString("\n", true);
+ }
+ telnet.waitForString("ogin:");
+ telnet.sendString(userid, true);
+ telnet.waitForString("assword:");
+ telnet.sendString(password, false);
+ }
+
+ /**
+ * Set the the login id to use on the server;
+ * required if <tt>password</tt> is set.
+ * @param u a <code>String</code> value
+ */
+ public void setUserid(String u) {
+ this.userid = u;
+ }
+
+ /**
+ * Set the the login password to use
+ * required if <tt>userid</tt> is set.
+ * @param p a <code>String</code> value
+ */
+ public void setPassword(String p) {
+ this.password = p;
+ }
+
+ /**
+ * Set the hostname or address of the remote server.
+ * @param m a <code>String</code> value
+ */
+ public void setServer(String m) {
+ this.server = m;
+ }
+
+ /**
+ * Set the tcp port to connect to; default is 23.
+ * @param p an <code>int</code> value
+ */
+ public void setPort(int p) {
+ this.port = p;
+ }
+
+ /**
+ * send a carriage return after connecting; optional, defaults to false.
+ * @param b a <code>boolean</code> value
+ */
+ public void setInitialCR(boolean b) {
+ this.addCarriageReturn = b;
+ }
+
+ /**
+ * set a default timeout in seconds to wait for a response,
+ * zero means forever (the default)
+ * @param i an <code>Integer</code> value
+ */
+ public void setTimeout(Integer i) {
+ this.defaultTimeout = i;
+ }
+
+ /**
+ * A string to wait for from the server.
+ * A subTask &lt;read&gt; tag was found. Create the object,
+ * Save it in our list, and return it.
+ * @return a read telnet sub task
+ */
+
+ public TelnetSubTask createRead() {
+ TelnetSubTask task = (TelnetSubTask) new TelnetRead();
+ telnetTasks.addElement(task);
+ return task;
+ }
+
+ /**
+ * Add text to send to the server
+ * A subTask &lt;write&gt; tag was found. Create the object,
+ * Save it in our list, and return it.
+ * @return a write telnet sub task
+ */
+ public TelnetSubTask createWrite() {
+ TelnetSubTask task = (TelnetSubTask) new TelnetWrite();
+ telnetTasks.addElement(task);
+ return task;
+ }
+
+ /**
+ * This class is the parent of the Read and Write tasks.
+ * It handles the common attributes for both.
+ */
+ public class TelnetSubTask {
+ // CheckStyle:VisibilityModifier OFF - bc
+ protected String taskString = "";
+ // CheckStyle:VisibilityModifier ON
+ /**
+ * Execute the subtask.
+ * @param telnet the client
+ * @throws BuildException always as it is not allowed to instantiate this object
+ */
+ public void execute(AntTelnetClient telnet)
+ throws BuildException {
+ throw new BuildException("Shouldn't be able instantiate a SubTask directly");
+ }
+
+ /**
+ * the message as nested text
+ * @param s the nested text
+ */
+ public void addText(String s) {
+ setString(getProject().replaceProperties(s));
+ }
+
+ /**
+ * the message as an attribute
+ * @param s a <code>String</code> value
+ */
+ public void setString(String s) {
+ taskString += s;
+ }
+ }
+
+ /**
+ * Sends text to the connected server
+ */
+ public class TelnetWrite extends TelnetSubTask {
+ private boolean echoString = true;
+ /**
+ * Execute the write task.
+ * @param telnet the task to use
+ * @throws BuildException on error
+ */
+ public void execute(AntTelnetClient telnet)
+ throws BuildException {
+ telnet.sendString(taskString, echoString);
+ }
+
+ /**
+ * Whether or not the message should be echoed to the log.
+ * Defaults to <code>true</code>.
+ * @param b a <code>boolean</code> value
+ */
+ public void setEcho(boolean b) {
+ echoString = b;
+ }
+ }
+
+ /**
+ * Reads the output from the connected server
+ * until the required string is found or we time out.
+ */
+ public class TelnetRead extends TelnetSubTask {
+ private Integer timeout = null;
+ /**
+ * Execute the read task.
+ * @param telnet the task to use
+ * @throws BuildException on error
+ */
+ public void execute(AntTelnetClient telnet)
+ throws BuildException {
+ telnet.waitForString(taskString, timeout);
+ }
+ /**
+ * a timeout value that overrides any task wide timeout.
+ * @param i an <code>Integer</code> value
+ */
+ public void setTimeout(Integer i) {
+ this.timeout = i;
+ }
+
+ /**
+ * Sets the default timeout if none has been set already
+ * @param defaultTimeout an <code>Integer</code> value
+ * @ant.attribute ignore="true"
+ */
+ public void setDefaultTimeout(Integer defaultTimeout) {
+ if (timeout == null) {
+ timeout = defaultTimeout;
+ }
+ }
+ }
+
+ /**
+ * This class handles the abstraction of the telnet protocol.
+ * Currently it is a wrapper around <a
+ * href="http://jakarta.apache.org/commons/net/index.html">Jakarta
+ * Commons Net</a>.
+ */
+ public class AntTelnetClient extends TelnetClient {
+ /**
+ * Read from the telnet session until the string we are
+ * waiting for is found
+ * @param s The string to wait on
+ */
+ public void waitForString(String s) {
+ waitForString(s, null);
+ }
+
+ /**
+ * Read from the telnet session until the string we are
+ * waiting for is found or the timeout has been reached
+ * @param s The string to wait on
+ * @param timeout The maximum number of seconds to wait
+ */
+ public void waitForString(String s, Integer timeout) {
+ InputStream is = this.getInputStream();
+ try {
+ StringBuffer sb = new StringBuffer();
+ int windowStart = -s.length();
+ if (timeout == null || timeout.intValue() == 0) {
+ while (windowStart < 0
+ || !sb.substring(windowStart).equals(s)) {
+ sb.append((char) is.read());
+ windowStart++;
+ }
+ } else {
+ Calendar endTime = Calendar.getInstance();
+ endTime.add(Calendar.SECOND, timeout.intValue());
+ while (windowStart < 0
+ || !sb.substring(windowStart).equals(s)) {
+ while (Calendar.getInstance().before(endTime)
+ && is.available() == 0) {
+ Thread.sleep(WAIT_INTERVAL);
+ }
+ if (is.available() == 0) {
+ log("Read before running into timeout: "
+ + sb.toString(), Project.MSG_DEBUG);
+ throw new BuildException(
+ "Response timed-out waiting for \"" + s + '\"',
+ getLocation());
+ }
+ sb.append((char) is.read());
+ windowStart++;
+ }
+ }
+ log(sb.toString(), Project.MSG_INFO);
+ } catch (BuildException be) {
+ throw be;
+ } catch (Exception e) {
+ throw new BuildException(e, getLocation());
+ }
+ }
+
+ /**
+ * Write this string to the telnet session.
+ * @param s the string to write
+ * @param echoString if true log the string sent
+ */
+ public void sendString(String s, boolean echoString) {
+ OutputStream os = this.getOutputStream();
+ try {
+ os.write((s + "\n").getBytes());
+ if (echoString) {
+ log(s, Project.MSG_INFO);
+ }
+ os.flush();
+ } catch (Exception e) {
+ throw new BuildException(e, getLocation());
+ }
+ }
+ }
+}