From f9f9e62f4c52104ea3379f560b1fe0f1cc28da11 Mon Sep 17 00:00:00 2001 From: Travis Wellman Date: Mon, 2 Apr 2012 18:16:23 -0700 Subject: [PATCH] Reject or accept matching a set of IP addresses. --- .gitignore | 7 ++ .../deciderules/IpAddressSetDecideRule.java | 87 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 .gitignore create mode 100644 modules/src/main/java/org/archive/modules/deciderules/IpAddressSetDecideRule.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..53618d72 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.class +bin +commons/target +dist/target +engine/target +modules/target +hq/target diff --git a/modules/src/main/java/org/archive/modules/deciderules/IpAddressSetDecideRule.java b/modules/src/main/java/org/archive/modules/deciderules/IpAddressSetDecideRule.java new file mode 100644 index 00000000..61a7a905 --- /dev/null +++ b/modules/src/main/java/org/archive/modules/deciderules/IpAddressSetDecideRule.java @@ -0,0 +1,87 @@ +package org.archive.modules.deciderules; + +import static org.archive.modules.CoreAttributeConstants.A_DNS_SERVER_IP_LABEL; + +import java.net.InetAddress; +import java.util.Collections; +import java.util.Set; + +import org.archive.modules.CrawlURI; +import org.archive.modules.net.CrawlHost; +import org.archive.modules.net.ServerCache; +import org.springframework.beans.factory.annotation.Autowired; + +/** + *
+ * <bean class="org.archive.modules.deciderules.IpAddressSetDecideRule">
+ *  <property name="ipAddresses">
+ *   <set>
+ *    <value>127.0.0.1</value>
+ *    <value>69.89.27.209</value>
+ *   </set>
+ *  </property>
+ *  <property name='decision' value='REJECT' />
+ * </bean>
+ * 
+ * + * @contributor Travis Wellman + */ + +class IpAddressSetDecideRule extends PredicatedDecideRule { + +// private static final Logger LOGGER = Logger.getLogger(IpAddressSetDecideRule.class.getCanonicalName()); + private static final long serialVersionUID = -3670434739183271441L; + private Set ipAddresses; + + /** + * @return the addresses being matched + */ + public Set getIpAddresses() { + return Collections.unmodifiableSet(ipAddresses); + } + + /** + * @param ipAddresses the addresses to match + */ + public void setIpAddresses(Set ipAddresses) { + this.ipAddresses = ipAddresses; + } + + @Override + protected boolean evaluate(CrawlURI curi) { + String hostAddress = getHostAddress(curi); + System.out.println("hostAddress for "+ curi +" "+ hostAddress); + return hostAddress != null && + ipAddresses.contains(hostAddress.intern()); + } + + transient protected ServerCache serverCache; + public ServerCache getServerCache() { + return this.serverCache; + } + @Autowired + public void setServerCache(ServerCache serverCache) { + this.serverCache = serverCache; + } + + /** + * from WriterPoolProcessor + * + * @param curi CrawlURI + * @return String of IP address + */ + protected String getHostAddress(CrawlURI curi) { + // special handling for DNS URIs: want address of DNS server + if (curi.getUURI().getScheme().toLowerCase().equals("dns")) { + return (String)curi.getData().get(A_DNS_SERVER_IP_LABEL); + } + // otherwise, host referenced in URI + // TODO:FIXME: have fetcher insert exact IP contacted into curi, + // use that rather than inferred by CrawlHost lookup + CrawlHost crlh = getServerCache().getHostFor(curi.getUURI()); + if (crlh == null) { return null; } + InetAddress inetadd = crlh.getIP(); + if (inetadd == null) { return null; } + return inetadd.getHostAddress(); + } +}