logresolve.c revision 6e252c97a556417cde1cbc948eaf62c39d404a7c
e1e8390280254f7f0580d701e583f670643d4f3fnilgun/* Licensed to the Apache Software Foundation (ASF) under one or more
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * contributor license agreements. See the NOTICE file distributed with
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * this work for additional information regarding copyright ownership.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * The ASF licenses this file to You under the Apache License, Version 2.0
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * (the "License"); you may not use this file except in compliance with
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * the License. You may obtain a copy of the License at
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Unless required by applicable law or agreed to in writing, software
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * distributed under the License is distributed on an "AS IS" BASIS,
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * See the License for the specific language governing permissions and
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * limitations under the License.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * logresolve 2.0
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Tom Rathborne - tomr uunet.ca - http://www.uunet.ca/~tomr/
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * UUNET Canada, April 16, 1995
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Rewritten by David Robinson. (drtr ast.cam.ac.uk)
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Rewritten again, and ported to APR by Colm MacCarthaigh
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Usage: logresolve [-s filename] [-c] < access_log > new_log
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Arguments:
45a544a8bb3fa1f95e5edac9fb3e723e2bb7001drbowen * -s filename name of a file to record statistics
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * -c check the DNS for a matching A record for the host.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Notes: (For historical interest)
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * To generate meaningful statistics from an HTTPD log file, it's good
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * to have the domain name of each machine that accessed your site, but
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * doing this on the fly can slow HTTPD down.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * Compiling NCSA HTTPD with the -DMINIMAL_DNS flag turns IP#->hostname
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * resolution off. Before running your stats program, just run your log
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * file through this program (logresolve) and all of your IP numbers will
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * be resolved into hostnames (where possible).
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * logresolve takes an HTTPD access log (in the COMMON log file format,
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * or any other format that has the IP number/domain name as the first
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * field for that matter), and outputs the same file with all of the
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * domain names looked up. Where no domain name can be found, the IP
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * number is left in.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * To minimize impact on your nameserver, logresolve has its very own
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * internal hash-table cache. This means that each IP number will only
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * be looked up the first time it is found in the log file.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * The -c option causes logresolve to apply the same check as httpd
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * compiled with -DMAXIMUM_DNS; after finding the hostname from the IP
b9f522ae1c0ed2bf3fc4444245bf28b2e2449a65nd * address, it looks up the IP addresses for the hostname and checks
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * that one of these matches the original address.
e1e8390280254f7f0580d701e583f670643d4f3fnilgun/* Statistics */
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int cachehits = 0;
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int cachesize = 0;
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int entries = 0;
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int resolves = 0;
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int withname = 0;
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int doublefailed = 0;
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic int noreverse = 0;
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * prints various statistics to output
e1e8390280254f7f0580d701e583f670643d4f3fnilgun apr_file_printf(output, "logresolve Statistics:" NL);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun apr_file_printf(output, " With name : %d" NL, withname);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun apr_file_printf(output, " Resolves : %d" NL, resolves);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun apr_file_printf(output, " - Double lookup failed : %d" NL,
e1e8390280254f7f0580d701e583f670643d4f3fnilgun apr_file_printf(output, "Cache hits : %d" NL, cachehits);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun apr_file_printf(output, "Cache size : %d" NL, cachesize);
e1e8390280254f7f0580d701e583f670643d4f3fnilgun * usage info
e1e8390280254f7f0580d701e583f670643d4f3fnilgunstatic void usage(void)
e1e8390280254f7f0580d701e583f670643d4f3fnilgun "%s -- Resolve IP-addresses to hostnames in Apache log files." NL
e1e8390280254f7f0580d701e583f670643d4f3fnilgun " -s Record statistics to STATFILE when finished." NL
e1e8390280254f7f0580d701e583f670643d4f3fnilgun " -c Perform double lookups when resolving IP addresses." NL,
e1e8390280254f7f0580d701e583f670643d4f3fnilgun const char * arg;
2704de98885368683621b01c8f8f4e4b01557611takashi if (apr_app_initialize(&argc, &argv, NULL) != APR_SUCCESS) {
e1e8390280254f7f0580d701e583f670643d4f3fnilgun while (1) {
usage();
switch (opt) {
if (doublelookups) {
usage();
if (stats) {
usage();
char *hostname;
char *space;
entries++;
withname++;
if (hostname) {
cachehits++;
withname++;
resolves++;
cachesize++;
noreverse++;
if (doublelookups) {
0, pline);
doublefailed++;
if (stats) {