You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by jk...@apache.org on 2009/01/31 15:54:54 UTC
svn commit: r739567 - in /ant/core/trunk: ./ docs/manual/
src/main/org/apache/tools/ant/taskdefs/ src/tests/antunit/taskdefs/
Author: jkf
Date: Sat Jan 31 14:54:54 2009
New Revision: 739567
URL: http://svn.apache.org/viewvc?rev=739567&view=rev
Log:
Adding task to provide host info, requests in bug reports 31164 and 45861.
Added:
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/HostInfo.java
ant/core/trunk/src/tests/antunit/taskdefs/hostinfo-test.xml
Modified:
ant/core/trunk/WHATSNEW
ant/core/trunk/docs/manual/coretasklist.html
ant/core/trunk/docs/manual/tasksoverview.html
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=739567&r1=739566&r2=739567&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Sat Jan 31 14:54:54 2009
@@ -340,6 +340,9 @@
Other changes:
--------------
+ * A HostInfo task was added performing information on hosts, including info on
+ the host ant is running on.
+ Bugzilla reports 45861 and 31164.
* There is now a FileProvider interface for resources that act as a source
of filenames. This should be used by tasks that require resources
Modified: ant/core/trunk/docs/manual/coretasklist.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/coretasklist.html?rev=739567&r1=739566&r2=739567&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/coretasklist.html (original)
+++ ant/core/trunk/docs/manual/coretasklist.html Sat Jan 31 14:54:54 2009
@@ -74,6 +74,7 @@
<a href="CoreTasks/fixcrlf.html">FixCRLF</a><br/>
<a href="CoreTasks/genkey.html">GenKey</a><br/>
<a href="CoreTasks/get.html">Get</a><br/>
+<a href="CoreTasks/hostinfo.html">Hostinfo</a><br/>
<a href="CoreTasks/unpack.html">GUnzip</a><br/>
<a href="CoreTasks/pack.html">GZip</a><br/>
<a href="CoreTasks/import.html">Import</a><br/>
Modified: ant/core/trunk/docs/manual/tasksoverview.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/docs/manual/tasksoverview.html?rev=739567&r1=739566&r2=739567&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/tasksoverview.html (original)
+++ ant/core/trunk/docs/manual/tasksoverview.html Sat Jan 31 14:54:54 2009
@@ -749,6 +749,13 @@
<td nowrap><a href="CoreTasks/genkey.html">GenKey</a></td>
<td><p>Generates a key in keystore.</p></td>
</tr>
+
+
+ <tr valign="top">
+ <td nowrap><a href="CoreTasks/hostinfo.html">HostInfo</a></td>
+ <td><p>Sets properties related to the provided host, or to
+ the host the process is run on.</p></td>
+ </tr>
<tr valign="top">
<td nowrap><a href="CoreTasks/input.html">Input</a></td>
Added: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/HostInfo.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/HostInfo.java?rev=739567&view=auto
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/HostInfo.java (added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/HostInfo.java Sat Jan 31 14:54:54 2009
@@ -0,0 +1,247 @@
+/*
+ * 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;
+
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+
+/**
+ * Sets properties to the host provided, or localhost if no information is
+ * provided. The default properties are NAME, FQDN, ADDR4, ADDR6;
+ *
+ * @since Ant 1.8
+ * @ant.task category="utility"
+ */
+
+
+public class HostInfo extends Task {
+ private static final String DEF_REM_ADDR6 = "::";
+
+ private static final String DEF_REM_ADDR4 = "0.0.0.0";
+
+ private static final String DEF_LOCAL_ADDR6 = "::1";
+
+ private static final String DEF_LOCAL_ADDR4 = "127.0.0.1";
+
+ private static final String DEF_LOCAL_NAME = "localhost";
+ private static final String DEF_DOMAIN = "localdomain";
+
+ private static final String DOMAIN = "DOMAIN";
+
+ private static final String NAME = "NAME";
+
+ private static final String ADDR4 = "ADDR4";
+
+ private static final String ADDR6 = "ADDR6";
+
+ private String prefix = "";
+
+ private String host;
+
+ private InetAddress nameAddr;
+
+ private InetAddress best6;
+
+ private InetAddress best4;
+
+ private List inetAddrs;
+
+ /**
+ * Set a prefix for the properties. If the prefix does not end with a "."
+ * one is automatically added.
+ *
+ * @param aPrefix
+ * the prefix to use.
+ * @since Ant 1.8
+ */
+ public void setPrefix(String aPrefix) {
+ prefix = aPrefix;
+ if (!prefix.endsWith(".")) {
+ prefix += ".";
+ }
+ }
+
+ /**
+ * Set the host to be retrieved.
+ *
+ * @param aHost
+ * the name or the address of the host, data for the local host
+ * will be retrieved if ommited.
+ * @since Ant 1.8
+ */
+ public void setHost(String aHost) {
+ host = aHost;
+ }
+
+ /**
+ * set the properties.
+ *
+ * @throws BuildException
+ * on error.
+ */
+ public void execute() throws BuildException {
+ if (host == null || "".equals(host)) {
+ executeLocal();
+ } else {
+ executeRemote();
+ }
+ }
+
+ private void executeLocal() {
+ try {
+ Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
+ inetAddrs = new LinkedList();
+ while (interfaces.hasMoreElements()) {
+ NetworkInterface currentif = (NetworkInterface) interfaces
+ .nextElement();
+ Enumeration addrs = currentif.getInetAddresses();
+ while (addrs.hasMoreElements())
+ {
+ inetAddrs.add(addrs.nextElement());
+ }
+ }
+ selectAddresses();
+
+ if (nameAddr != null) {
+ setDomainAndName(nameAddr.getCanonicalHostName());
+ } else {
+ setProperty(DOMAIN, DEF_DOMAIN);
+ setProperty(NAME, DEF_LOCAL_NAME);
+ }
+ if (best4 != null) {
+ setProperty(ADDR4, best4.getHostAddress());
+ } else {
+ setProperty(ADDR4, DEF_LOCAL_ADDR4);
+ }
+ if (best6 != null) {
+ setProperty(ADDR6, best6.getHostAddress());
+ } else {
+ setProperty(ADDR6, DEF_LOCAL_ADDR6);
+ }
+ } catch (Exception e) {
+ log("Error retrieving local host information", e, Project.MSG_WARN);
+ setProperty(DOMAIN, DEF_DOMAIN);
+ setProperty(NAME, DEF_LOCAL_NAME);
+ setProperty(ADDR4, DEF_LOCAL_ADDR4);
+ setProperty(ADDR6, DEF_LOCAL_ADDR6);
+ }
+ }
+
+ private void selectAddresses() {
+ Iterator i = inetAddrs.iterator();
+ while (i.hasNext()) {
+ InetAddress current = (InetAddress) i.next();
+ if (!current.isMulticastAddress()) {
+ if (current instanceof Inet4Address) {
+ best4 = selectBestAddress(best4, current);
+ } else if (current instanceof Inet6Address) {
+ best6 = selectBestAddress(best6, current);
+ }
+ }
+ }
+
+ nameAddr = selectBestAddress(best6, best4);
+ }
+
+ private InetAddress selectBestAddress(InetAddress bestSoFar,
+ InetAddress current) {
+ InetAddress best = bestSoFar;
+ if (best == null) {
+ // none selected so far, so this one is better.
+ best = current;
+ } else {
+ if (current.isLoopbackAddress()) {
+ // definitely not better than the previously selected address.
+ } else if (current.isLinkLocalAddress()) {
+ // link local considered better than loopback
+ if (best.isLoopbackAddress()) {
+ best = current;
+ }
+ } else if (current.isSiteLocalAddress()) {
+ // site local considered better than link local (and loopback)
+ if (best.isLoopbackAddress() || best.isLinkLocalAddress()) {
+ best = current;
+ }
+ } else {
+ // current is a global address, and therefore best (at least
+ // equally well)
+ best = current;
+ }
+ }
+ return best;
+ }
+
+ private void executeRemote() {
+ try {
+ inetAddrs = Arrays.asList(InetAddress.getAllByName(host));
+
+ selectAddresses();
+
+ if (nameAddr != null) {
+ setDomainAndName(nameAddr.getCanonicalHostName());
+ } else {
+ setDomainAndName(host);
+ }
+ if (best4 != null) {
+ setProperty(ADDR4, best4.getHostAddress());
+ } else {
+ setProperty(ADDR4, DEF_REM_ADDR4);
+ }
+ if (best6 != null) {
+ setProperty(ADDR6, best6.getHostAddress());
+ } else {
+ setProperty(ADDR6, DEF_REM_ADDR6);
+ }
+ } catch (Exception e) {
+ log("Error retrieving remote host information for host:" + host
+ + ".", e, Project.MSG_WARN);
+ setDomainAndName(host);
+ setProperty(ADDR4, DEF_REM_ADDR4);
+ setProperty(ADDR6, DEF_REM_ADDR6);
+ }
+ }
+
+ private void setDomainAndName(String fqdn)
+ {
+ int idx = fqdn.indexOf('.');
+ if (idx > 0) {
+ setProperty(NAME, fqdn.substring(0, idx));
+ setProperty(DOMAIN, fqdn.substring(idx+1));
+ } else {
+ setProperty(NAME, fqdn);
+ setProperty(DOMAIN, DEF_DOMAIN);
+ }
+ }
+
+ private void setProperty(String name, String value) {
+ getProject().setNewProperty(prefix + name, value);
+ }
+
+}
Modified: ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties?rev=739567&r1=739566&r2=739567&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties Sat Jan 31 14:54:54 2009
@@ -55,6 +55,7 @@
get=org.apache.tools.ant.taskdefs.Get
gunzip=org.apache.tools.ant.taskdefs.GUnzip
gzip=org.apache.tools.ant.taskdefs.GZip
+hostinfo=org.apache.tools.ant.taskdefs.HostInfo
import=org.apache.tools.ant.taskdefs.ImportTask
include=org.apache.tools.ant.taskdefs.ImportTask
input=org.apache.tools.ant.taskdefs.Input
Added: ant/core/trunk/src/tests/antunit/taskdefs/hostinfo-test.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/taskdefs/hostinfo-test.xml?rev=739567&view=auto
==============================================================================
--- ant/core/trunk/src/tests/antunit/taskdefs/hostinfo-test.xml (added)
+++ ant/core/trunk/src/tests/antunit/taskdefs/hostinfo-test.xml Sat Jan 31 14:54:54 2009
@@ -0,0 +1,94 @@
+<?xml version="1.0"?>
+<!--
+ 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.
+-->
+<project name="hostinfo-test" default="antunit"
+ xmlns:au="antlib:org.apache.ant.antunit">
+
+ <import file="../antunit-base.xml" />
+
+ <property name="undef-name" value="nonexistenthost.nonexistentdomain" />
+ <property name="undef-hostname" value="nonexistenthost" />
+ <property name="undef-domainname" value="nonexistentdomain" />
+
+ <property name="undef-ip4" value="0.0.0.0" />
+ <property name="undef-ip6" value="::" />
+
+ <property name="apache-hostname" value="www.apache.org" />
+ <property name="apache-domain" value="apache.org" />
+ <property name="apache-realhost" value="eos" />
+ <property name="apache-ip4" value="140.211.11.130" />
+
+ <property name="xs4all-hostname" value="www.xs4all.nl" />
+ <property name="xs4all-domain" value="xs4all.nl" />
+ <property name="xs4all-realhost" value="www" />
+ <property name="xs4all-ip4" value="194.109.6.92" />
+
+ <target name="setUp">
+ </target>
+
+ <target name="testLocal" depends="setUp">
+ <hostinfo prefix="local" />
+ <!-- Do not know what to expect here, machine dependent -->
+ </target>
+
+ <target name="testApache" depends="setUp">
+ <hostinfo prefix="apache" host="${apache-hostname}"/>
+ <au:assertTrue>
+ <and>
+ <equals arg1="${apache.NAME}" arg2="${apache-realhost}" />
+ <equals arg1="${apache.DOMAIN}" arg2="${apache-domain}" />
+ <equals arg1="${apache.ADDR4}" arg2="${apache-ip4}" />
+ </and>
+ </au:assertTrue>
+ </target>
+
+ <target name="testApacheNoPrefix" depends="setUp">
+ <hostinfo host="${apache-hostname}"/>
+ <au:assertTrue>
+ <and>
+ <equals arg1="${NAME}" arg2="${apache-realhost}" />
+ <equals arg1="${DOMAIN}" arg2="${apache-domain}" />
+ <equals arg1="${ADDR4}" arg2="${apache-ip4}" />
+ </and>
+ </au:assertTrue>
+ </target>
+
+ <target name="testReverse" depends="setUp">
+ <hostinfo prefix="reverse" host="${xs4all-ip4}"/>
+ <au:assertTrue>
+ <and>
+ <equals arg1="${reverse.NAME}" arg2="${xs4all-realhost}" />
+ <equals arg1="${reverse.DOMAIN}" arg2="${xs4all-domain}" />
+ <equals arg1="${reverse.ADDR4}" arg2="${xs4all-ip4}" />
+ </and>
+ </au:assertTrue>
+ </target>
+
+
+ <target name="testUndef" depends="setUp">
+ <hostinfo prefix="undef" host="${undef-name}"/>
+ <au:assertTrue>
+ <and>
+ <equals arg1="${undef.NAME}" arg2="${undef-hostname}" />
+ <equals arg1="${undef.DOMAIN}" arg2="${undef-domainname}" />
+ <equals arg1="${undef.ADDR4}" arg2="${undef-ip4}" />
+ <equals arg1="${undef.ADDR6}" arg2="${undef-ip6}" />
+ </and>
+ </au:assertTrue>
+ </target>
+
+</project>