Search in sources :

Example 1 with IspResponse

use of com.maxmind.geoip2.model.IspResponse in project nifi by apache.

the class ISPEnrichIP method onTrigger.

@Override
public void onTrigger(final ProcessContext context, final ProcessSession session) throws ProcessException {
    FlowFile flowFile = session.get();
    if (flowFile == null) {
        return;
    }
    final DatabaseReader dbReader = databaseReaderRef.get();
    final String ipAttributeName = context.getProperty(IP_ADDRESS_ATTRIBUTE).evaluateAttributeExpressions(flowFile).getValue();
    final String ipAttributeValue = flowFile.getAttribute(ipAttributeName);
    if (StringUtils.isEmpty(ipAttributeName)) {
        session.transfer(flowFile, REL_NOT_FOUND);
        getLogger().warn("FlowFile '{}' attribute '{}' was empty. Routing to failure", new Object[] { flowFile, IP_ADDRESS_ATTRIBUTE.getDisplayName() });
        return;
    }
    InetAddress inetAddress = null;
    IspResponse response = null;
    try {
        inetAddress = InetAddress.getByName(ipAttributeValue);
    } catch (final IOException ioe) {
        session.transfer(flowFile, REL_NOT_FOUND);
        getLogger().warn("Could not resolve the IP for value '{}', contained within the attribute '{}' in " + "FlowFile '{}'. This is usually caused by issue resolving the appropriate DNS record or " + "providing the processor with an invalid IP address ", new Object[] { ipAttributeValue, IP_ADDRESS_ATTRIBUTE.getDisplayName(), flowFile }, ioe);
        return;
    }
    final StopWatch stopWatch = new StopWatch(true);
    try {
        response = dbReader.isp(inetAddress);
        stopWatch.stop();
    } catch (final IOException | GeoIp2Exception ex) {
        // Note IOException is captured again as dbReader also makes InetAddress.getByName() calls.
        // Most name or IP resolutions failure should have been triggered in the try loop above but
        // environmental conditions may trigger errors during the second resolution as well.
        session.transfer(flowFile, REL_NOT_FOUND);
        getLogger().warn("Failure while trying to find enrichment data for {} due to {}", new Object[] { flowFile, ex }, ex);
        return;
    }
    if (response == null) {
        session.transfer(flowFile, REL_NOT_FOUND);
        return;
    }
    final Map<String, String> attrs = new HashMap<>();
    attrs.put(new StringBuilder(ipAttributeName).append(".isp.lookup.micros").toString(), String.valueOf(stopWatch.getDuration(TimeUnit.MICROSECONDS)));
    // seem like good option to "final int asn ..." as with the other returned data.
    if (!(response.getAutonomousSystemNumber() == null)) {
        attrs.put(new StringBuilder(ipAttributeName).append(".isp.asn").toString(), String.valueOf(response.getAutonomousSystemNumber()));
    }
    final String asnOrg = response.getAutonomousSystemOrganization();
    if (asnOrg != null) {
        attrs.put(new StringBuilder(ipAttributeName).append(".isp.asn.organization").toString(), asnOrg);
    }
    final String ispName = response.getIsp();
    if (ispName != null) {
        attrs.put(new StringBuilder(ipAttributeName).append(".isp.name").toString(), ispName);
    }
    final String organisation = response.getOrganization();
    if (organisation != null) {
        attrs.put(new StringBuilder(ipAttributeName).append(".isp.organization").toString(), organisation);
    }
    flowFile = session.putAllAttributes(flowFile, attrs);
    session.transfer(flowFile, REL_FOUND);
}
Also used : FlowFile(org.apache.nifi.flowfile.FlowFile) HashMap(java.util.HashMap) IOException(java.io.IOException) GeoIp2Exception(com.maxmind.geoip2.exception.GeoIp2Exception) StopWatch(org.apache.nifi.util.StopWatch) IspResponse(com.maxmind.geoip2.model.IspResponse) DatabaseReader(org.apache.nifi.processors.maxmind.DatabaseReader) InetAddress(java.net.InetAddress)

Example 2 with IspResponse

use of com.maxmind.geoip2.model.IspResponse in project nifi by apache.

the class TestISPEnrichIP method successfulMaxMindResponseShouldFlowToFoundRelationship.

@Test
public void successfulMaxMindResponseShouldFlowToFoundRelationship() throws Exception {
    testRunner.setProperty(ISPEnrichIP.GEO_DATABASE_FILE, "./");
    testRunner.setProperty(ISPEnrichIP.IP_ADDRESS_ATTRIBUTE, "ip");
    final IspResponse ispResponse = getIspResponse();
    when(databaseReader.isp(InetAddress.getByName("1.2.3.4"))).thenReturn(ispResponse);
    final Map<String, String> attributes = new HashMap<>();
    attributes.put("ip", "1.2.3.4");
    testRunner.enqueue(new byte[0], attributes);
    testRunner.run();
    List<MockFlowFile> notFound = testRunner.getFlowFilesForRelationship(ISPEnrichIP.REL_NOT_FOUND);
    List<MockFlowFile> found = testRunner.getFlowFilesForRelationship(ISPEnrichIP.REL_FOUND);
    assertEquals(0, notFound.size());
    assertEquals(1, found.size());
    FlowFile finishedFound = found.get(0);
    assertNotNull(finishedFound.getAttribute("ip.isp.lookup.micros"));
    assertEquals("Apache NiFi - Test ISP", finishedFound.getAttribute("ip.isp.name"));
    assertEquals("Apache NiFi - Test Organization", finishedFound.getAttribute("ip.isp.organization"));
    assertEquals("1337", finishedFound.getAttribute("ip.isp.asn"));
    assertEquals("Apache NiFi - Test Chocolate", finishedFound.getAttribute("ip.isp.asn.organization"));
}
Also used : MockFlowFile(org.apache.nifi.util.MockFlowFile) IspResponse(com.maxmind.geoip2.model.IspResponse) FlowFile(org.apache.nifi.flowfile.FlowFile) MockFlowFile(org.apache.nifi.util.MockFlowFile) HashMap(java.util.HashMap) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 3 with IspResponse

use of com.maxmind.geoip2.model.IspResponse in project nifi by apache.

the class TestISPEnrichIP method successfulMaxMindResponseShouldFlowToFoundRelationshipWhenAsnIsNotSet.

@Test
public void successfulMaxMindResponseShouldFlowToFoundRelationshipWhenAsnIsNotSet() throws Exception {
    testRunner.setProperty(ISPEnrichIP.GEO_DATABASE_FILE, "./");
    testRunner.setProperty(ISPEnrichIP.IP_ADDRESS_ATTRIBUTE, "ip");
    final IspResponse ispResponse = getIspResponseWithoutASNDetail();
    when(databaseReader.isp(InetAddress.getByName("1.2.3.4"))).thenReturn(ispResponse);
    final Map<String, String> attributes = new HashMap<>();
    attributes.put("ip", "1.2.3.4");
    testRunner.enqueue(new byte[0], attributes);
    testRunner.run();
    List<MockFlowFile> notFound = testRunner.getFlowFilesForRelationship(ISPEnrichIP.REL_NOT_FOUND);
    List<MockFlowFile> found = testRunner.getFlowFilesForRelationship(ISPEnrichIP.REL_FOUND);
    assertEquals(0, notFound.size());
    assertEquals(1, found.size());
    FlowFile finishedFound = found.get(0);
    assertNotNull(finishedFound.getAttribute("ip.isp.lookup.micros"));
    assertNotNull(finishedFound.getAttribute("ip.isp.lookup.micros"));
    assertEquals("Apache NiFi - Test ISP", finishedFound.getAttribute("ip.isp.name"));
    assertEquals("Apache NiFi - Test Organization", finishedFound.getAttribute("ip.isp.organization"));
    assertNull(finishedFound.getAttribute("ip.isp.asn"));
    assertNull(finishedFound.getAttribute("ip.isp.asn.organization"));
}
Also used : MockFlowFile(org.apache.nifi.util.MockFlowFile) IspResponse(com.maxmind.geoip2.model.IspResponse) FlowFile(org.apache.nifi.flowfile.FlowFile) MockFlowFile(org.apache.nifi.util.MockFlowFile) HashMap(java.util.HashMap) PrepareForTest(org.powermock.core.classloader.annotations.PrepareForTest) Test(org.junit.Test)

Example 4 with IspResponse

use of com.maxmind.geoip2.model.IspResponse in project nifi by apache.

the class IPLookupService method doLookup.

private Optional<Record> doLookup(final DatabaseReader databaseReader, final Map<String, Object> coordinates) throws LookupFailureException, InvalidDatabaseException {
    if (coordinates.get(IP_KEY) == null) {
        return Optional.empty();
    }
    final String ipAddress = coordinates.get(IP_KEY).toString();
    final InetAddress inetAddress;
    try {
        inetAddress = InetAddress.getByName(ipAddress);
    } catch (final IOException ioe) {
        getLogger().warn("Could not resolve the IP for value '{}'. This is usually caused by issue resolving the appropriate DNS record or " + "providing the service with an invalid IP address", new Object[] { coordinates }, ioe);
        return Optional.empty();
    }
    final Record geoRecord;
    if (getProperty(LOOKUP_CITY).asBoolean()) {
        final CityResponse cityResponse;
        try {
            cityResponse = databaseReader.city(inetAddress);
        } catch (final InvalidDatabaseException idbe) {
            throw idbe;
        } catch (final Exception e) {
            throw new LookupFailureException("Failed to lookup City information for IP Address " + inetAddress, e);
        }
        geoRecord = createRecord(cityResponse);
    } else {
        geoRecord = null;
    }
    final Record ispRecord;
    if (getProperty(LOOKUP_ISP).asBoolean()) {
        final IspResponse ispResponse;
        try {
            ispResponse = databaseReader.isp(inetAddress);
        } catch (final InvalidDatabaseException idbe) {
            throw idbe;
        } catch (final Exception e) {
            throw new LookupFailureException("Failed to lookup ISP information for IP Address " + inetAddress, e);
        }
        ispRecord = createRecord(ispResponse);
    } else {
        ispRecord = null;
    }
    final String domainName;
    if (getProperty(LOOKUP_DOMAIN).asBoolean()) {
        final DomainResponse domainResponse;
        try {
            domainResponse = databaseReader.domain(inetAddress);
        } catch (final InvalidDatabaseException idbe) {
            throw idbe;
        } catch (final Exception e) {
            throw new LookupFailureException("Failed to lookup Domain information for IP Address " + inetAddress, e);
        }
        domainName = domainResponse == null ? null : domainResponse.getDomain();
    } else {
        domainName = null;
    }
    final String connectionType;
    if (getProperty(LOOKUP_CONNECTION_TYPE).asBoolean()) {
        final ConnectionTypeResponse connectionTypeResponse;
        try {
            connectionTypeResponse = databaseReader.connectionType(inetAddress);
        } catch (final InvalidDatabaseException idbe) {
            throw idbe;
        } catch (final Exception e) {
            throw new LookupFailureException("Failed to lookup Domain information for IP Address " + inetAddress, e);
        }
        if (connectionTypeResponse == null) {
            connectionType = null;
        } else {
            final ConnectionType type = connectionTypeResponse.getConnectionType();
            connectionType = type == null ? null : type.name();
        }
    } else {
        connectionType = null;
    }
    final Record anonymousIpRecord;
    if (getProperty(LOOKUP_ANONYMOUS_IP_INFO).asBoolean()) {
        final AnonymousIpResponse anonymousIpResponse;
        try {
            anonymousIpResponse = databaseReader.anonymousIp(inetAddress);
        } catch (final InvalidDatabaseException idbe) {
            throw idbe;
        } catch (final Exception e) {
            throw new LookupFailureException("Failed to lookup Anonymous IP Information for IP Address " + inetAddress, e);
        }
        anonymousIpRecord = createRecord(anonymousIpResponse);
    } else {
        anonymousIpRecord = null;
    }
    if (geoRecord == null && ispRecord == null && domainName == null && connectionType == null && anonymousIpRecord == null) {
        return Optional.empty();
    }
    return Optional.ofNullable(createContainerRecord(geoRecord, ispRecord, domainName, connectionType, anonymousIpRecord));
}
Also used : ConnectionType(com.maxmind.geoip2.model.ConnectionTypeResponse.ConnectionType) IOException(java.io.IOException) ConnectionTypeResponse(com.maxmind.geoip2.model.ConnectionTypeResponse) LookupFailureException(org.apache.nifi.lookup.LookupFailureException) InvalidDatabaseException(com.maxmind.db.InvalidDatabaseException) IOException(java.io.IOException) AnonymousIpResponse(com.maxmind.geoip2.model.AnonymousIpResponse) CityResponse(com.maxmind.geoip2.model.CityResponse) LookupFailureException(org.apache.nifi.lookup.LookupFailureException) IspResponse(com.maxmind.geoip2.model.IspResponse) InvalidDatabaseException(com.maxmind.db.InvalidDatabaseException) DomainResponse(com.maxmind.geoip2.model.DomainResponse) Record(org.apache.nifi.serialization.record.Record) MapRecord(org.apache.nifi.serialization.record.MapRecord) InetAddress(java.net.InetAddress)

Example 5 with IspResponse

use of com.maxmind.geoip2.model.IspResponse in project XRTB by benmfaul.

the class MMDB method contains.

public boolean contains(String key) {
    try {
        InetAddress ip = InetAddress.getByName(key);
        IspResponse r = reader.isp(ip);
        String test = r.getIsp().toLowerCase();
        if (test.contains("hosting")) {
            return false;
        }
    } catch (Exception error) {
        error.printStackTrace();
    }
    return true;
}
Also used : IspResponse(com.maxmind.geoip2.model.IspResponse) InetAddress(java.net.InetAddress)

Aggregations

IspResponse (com.maxmind.geoip2.model.IspResponse)8 InetAddress (java.net.InetAddress)4 HashMap (java.util.HashMap)4 FlowFile (org.apache.nifi.flowfile.FlowFile)4 MockFlowFile (org.apache.nifi.util.MockFlowFile)3 Test (org.junit.Test)3 PrepareForTest (org.powermock.core.classloader.annotations.PrepareForTest)3 IOException (java.io.IOException)2 InvalidDatabaseException (com.maxmind.db.InvalidDatabaseException)1 GeoIp2Exception (com.maxmind.geoip2.exception.GeoIp2Exception)1 AnonymousIpResponse (com.maxmind.geoip2.model.AnonymousIpResponse)1 CityResponse (com.maxmind.geoip2.model.CityResponse)1 ConnectionTypeResponse (com.maxmind.geoip2.model.ConnectionTypeResponse)1 ConnectionType (com.maxmind.geoip2.model.ConnectionTypeResponse.ConnectionType)1 DomainResponse (com.maxmind.geoip2.model.DomainResponse)1 LookupFailureException (org.apache.nifi.lookup.LookupFailureException)1 DatabaseReader (org.apache.nifi.processors.maxmind.DatabaseReader)1 MapRecord (org.apache.nifi.serialization.record.MapRecord)1 Record (org.apache.nifi.serialization.record.Record)1 StopWatch (org.apache.nifi.util.StopWatch)1