blob: 6a9e04841d8039c15a751d9082370154cc9a0cb5 [file] [log] [blame]
/*
* 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.drill.exec.udfs;
import io.netty.buffer.DrillBuf;
import org.apache.drill.exec.expr.DrillSimpleFunc;
import org.apache.drill.exec.expr.annotations.FunctionTemplate;
import org.apache.drill.exec.expr.annotations.Output;
import org.apache.drill.exec.expr.annotations.Param;
import org.apache.drill.exec.expr.annotations.Workspace;
import org.apache.drill.exec.expr.holders.NullableVarCharHolder;
import org.apache.drill.exec.expr.holders.VarCharHolder;
import org.apache.drill.exec.vector.complex.writer.BaseWriter;
import javax.inject.Inject;
public class DNSFunctions {
private DNSFunctions() {
}
/* This function gets the host name associated with an IP address */
@FunctionTemplate(names = {"get_host_name", "getHostName", "reverse_ip_lookup"},
scope = FunctionTemplate.FunctionScope.SIMPLE,
nulls = FunctionTemplate.NullHandling.NULL_IF_NULL)
public static class ReverseIPLookup implements DrillSimpleFunc {
@Param
VarCharHolder ipaddress;
@Output
VarCharHolder out;
@Inject
DrillBuf buffer;
@Override
public void setup() {
}
@Override
public void eval() {
String ipString = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(ipaddress.start, ipaddress.end, ipaddress.buffer);
String hostname = "";
try {
java.net.InetAddress address = java.net.InetAddress.getByName(ipString);
hostname = address.getHostName();
} catch (java.net.UnknownHostException e) {
hostname = "Unknown host";
}
out.buffer = buffer;
out.start = 0;
out.end = hostname.getBytes().length;
buffer.setBytes(0, hostname.getBytes());
}
}
/* This function takes a host name and returns the IP address associated with that host, and "Unknown if there is an error */
@FunctionTemplate(names = {"get_host_address", "getHostAddress", "host_lookup", "hostLookup"},
scope = FunctionTemplate.FunctionScope.SIMPLE,
nulls = FunctionTemplate.NullHandling.NULL_IF_NULL)
public static class HostLookup implements DrillSimpleFunc {
@Param
VarCharHolder hostname;
@Output
VarCharHolder out;
@Inject
DrillBuf buffer;
@Override
public void setup() {
}
@Override
public void eval() {
String host = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(hostname.start, hostname.end, hostname.buffer);
String result = "";
try {
java.net.Inet4Address ip = (java.net.Inet4Address) java.net.Inet4Address.getByName(host);
result = ip.getHostAddress();
} catch (Exception e) {
result = "Unknown";
}
out.buffer = buffer;
out.start = 0;
out.end = result.getBytes().length;
buffer.setBytes(0, result.getBytes());
}
}
/* This function performs a complete DNS lookup */
@FunctionTemplate(names = {"dns_lookup", "dnsLookup", "dns"}, scope = FunctionTemplate.FunctionScope.SIMPLE)
public static class DNSLookupFunctionWithNull implements DrillSimpleFunc {
@Param
NullableVarCharHolder rawDomainName;
@Output
BaseWriter.ComplexWriter out;
@Inject
DrillBuf buffer;
@Override
public void setup() {
// no op
}
@Override
public void eval() {
if (rawDomainName.isSet == 0) {
org.apache.drill.exec.vector.complex.writer.BaseWriter.ListWriter listWriter = out.rootAsList();
org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter rowMapWriter = listWriter.map();
listWriter.startList();
rowMapWriter.start();
rowMapWriter.end();
listWriter.endList();
return;
}
try {
String domainName = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(rawDomainName.start, rawDomainName.end, rawDomainName.buffer);
org.apache.drill.exec.udfs.DNSUtils.getDNS(domainName, out, buffer);
} catch (Exception e) {
org.apache.drill.exec.vector.complex.writer.BaseWriter.ListWriter listWriter = out.rootAsList();
org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter rowMapWriter = listWriter.map();
listWriter.startList();
rowMapWriter.start();
rowMapWriter.end();
listWriter.endList();
}
}
}
@FunctionTemplate(names = {"dns_lookup", "dnsLookup", "dns"}, scope = FunctionTemplate.FunctionScope.SIMPLE)
public static class DNSLookupFunctionWithResolver implements DrillSimpleFunc {
@Param
NullableVarCharHolder rawDomainName;
@Param(constant = true)
VarCharHolder resolverHolder;
@Output
BaseWriter.ComplexWriter out;
@Workspace
String resolver;
@Inject
DrillBuf buffer;
@Override
public void setup() {
resolver = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(resolverHolder.start, resolverHolder.end, resolverHolder.buffer);
}
@Override
public void eval() {
if (rawDomainName.isSet == 0) {
org.apache.drill.exec.vector.complex.writer.BaseWriter.ListWriter listWriter = out.rootAsList();
org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter rowMapWriter = listWriter.map();
listWriter.startList();
rowMapWriter.start();
rowMapWriter.end();
listWriter.endList();
return;
}
try {
String domainName = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(rawDomainName.start, rawDomainName.end, rawDomainName.buffer);
org.apache.drill.exec.udfs.DNSUtils.getDNS(domainName, resolver, out, buffer);
} catch (Exception e) {
org.apache.drill.exec.vector.complex.writer.BaseWriter.ListWriter listWriter = out.rootAsList();
org.apache.drill.exec.vector.complex.writer.BaseWriter.MapWriter rowMapWriter = listWriter.map();
listWriter.startList();
rowMapWriter.start();
rowMapWriter.end();
listWriter.endList();
}
}
}
@FunctionTemplate(names = {"whois"},
scope = FunctionTemplate.FunctionScope.SIMPLE)
public static class WhoIsFunction implements DrillSimpleFunc {
@Param
NullableVarCharHolder rawDomainName;
@Output
BaseWriter.ComplexWriter out;
@Inject
DrillBuf buffer;
@Override
public void setup() {
// No op
}
@Override
public void eval() {
String domain = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(rawDomainName.start, rawDomainName.end, rawDomainName.buffer);
org.apache.drill.exec.udfs.DNSUtils.whois(domain, out, buffer);
}
}
@FunctionTemplate(names = {"whois"}, scope = FunctionTemplate.FunctionScope.SIMPLE)
public static class WhoIsFunctionWithNonDefaultServer implements DrillSimpleFunc {
@Param
NullableVarCharHolder rawDomainName;
@Param(constant = true)
VarCharHolder serverHolder;
@Output
BaseWriter.ComplexWriter out;
@Inject
DrillBuf buffer;
@Override
public void setup() {
// No op
}
@Override
public void eval() {
String domain = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(rawDomainName.start, rawDomainName.end, rawDomainName.buffer);
String server = org.apache.drill.exec.expr.fn.impl.StringFunctionHelpers.toStringFromUTF8(serverHolder.start, serverHolder.end, serverHolder.buffer);
org.apache.drill.exec.udfs.DNSUtils.whois(domain, server, out, buffer);
}
}
}