logresolve.c revision 0b4b04d8621478ba59f0a6ba2950ddc02ab92b58
0066eddda7203f6345b56f77d146a759298dc635gryzor/* Copyright 1999-2005 The Apache Software Foundation or its licensors, as
0066eddda7203f6345b56f77d146a759298dc635gryzor * applicable.
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd * Licensed under the Apache License, Version 2.0 (the "License");
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd * you may not use this file except in compliance with the License.
0066eddda7203f6345b56f77d146a759298dc635gryzor * You may obtain a copy of the License at
96ad5d81ee4a2cc66a4ae19893efc8aa6d06fae7jailletc * Unless required by applicable law or agreed to in writing, software
0066eddda7203f6345b56f77d146a759298dc635gryzor * distributed under the License is distributed on an "AS IS" BASIS,
0066eddda7203f6345b56f77d146a759298dc635gryzor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen * See the License for the specific language governing permissions and
2e545ce2450a9953665f701bb05350f0d3f26275nd * limitations under the License.
0066eddda7203f6345b56f77d146a759298dc635gryzor * logresolve 2.0
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen * Tom Rathborne - tomr uunet.ca - http://www.uunet.ca/~tomr/
3f08db06526d6901aa08c110b5bc7dde6bc39905nd * UUNET Canada, April 16, 1995
0066eddda7203f6345b56f77d146a759298dc635gryzor * Rewritten by David Robinson. (drtr ast.cam.ac.uk)
0066eddda7203f6345b56f77d146a759298dc635gryzor * Rewritten again, and ported to APR by Colm MacCarthaigh
0066eddda7203f6345b56f77d146a759298dc635gryzor * Usage: logresolve [-s filename] [-c] < access_log > new_log
0066eddda7203f6345b56f77d146a759298dc635gryzor * Arguments:
0066eddda7203f6345b56f77d146a759298dc635gryzor * -s filename name of a file to record statistics
0066eddda7203f6345b56f77d146a759298dc635gryzor * -c check the DNS for a matching A record for the host.
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung * Notes: (For historical interest)
0066eddda7203f6345b56f77d146a759298dc635gryzor * To generate meaningful statistics from an HTTPD log file, it's good
0066eddda7203f6345b56f77d146a759298dc635gryzor * to have the domain name of each machine that accessed your site, but
0066eddda7203f6345b56f77d146a759298dc635gryzor * doing this on the fly can slow HTTPD down.
0066eddda7203f6345b56f77d146a759298dc635gryzor * Compiling NCSA HTTPD with the -DMINIMAL_DNS flag turns IP#->hostname
0066eddda7203f6345b56f77d146a759298dc635gryzor * resolution off. Before running your stats program, just run your log
0066eddda7203f6345b56f77d146a759298dc635gryzor * file through this program (logresolve) and all of your IP numbers will
0066eddda7203f6345b56f77d146a759298dc635gryzor * be resolved into hostnames (where possible).
0066eddda7203f6345b56f77d146a759298dc635gryzor * logresolve takes an HTTPD access log (in the COMMON log file format,
0066eddda7203f6345b56f77d146a759298dc635gryzor * or any other format that has the IP number/domain name as the first
0066eddda7203f6345b56f77d146a759298dc635gryzor * field for that matter), and outputs the same file with all of the
0066eddda7203f6345b56f77d146a759298dc635gryzor * domain names looked up. Where no domain name can be found, the IP
0066eddda7203f6345b56f77d146a759298dc635gryzor * number is left in.
01f52ba6a87aa39d3873a441369828875c471823trawick * To minimize impact on your nameserver, logresolve has its very own
01f52ba6a87aa39d3873a441369828875c471823trawick * internal hash-table cache. This means that each IP number will only
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar * be looked up the first time it is found in the log file.
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar * The -c option causes logresolve to apply the same check as httpd
0066eddda7203f6345b56f77d146a759298dc635gryzor * compiled with -DMAXIMUM_DNS; after finding the hostname from the IP
0066eddda7203f6345b56f77d146a759298dc635gryzor * address, it looks up the IP addresses for the hostname and checks
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh * that one of these matches the original address.
01f52ba6a87aa39d3873a441369828875c471823trawick/* Statistics */
20f499565e77defe9dab24dd85c02f38a1175855ndstatic int cachehits = 0;
01f52ba6a87aa39d3873a441369828875c471823trawickstatic int cachesize = 0;
01f52ba6a87aa39d3873a441369828875c471823trawickstatic int entries = 0;
01f52ba6a87aa39d3873a441369828875c471823trawickstatic int resolves = 0;
01f52ba6a87aa39d3873a441369828875c471823trawickstatic int withname = 0;
01f52ba6a87aa39d3873a441369828875c471823trawickstatic int doublefailed = 0;
01f52ba6a87aa39d3873a441369828875c471823trawickstatic int noreverse = 0;
01f52ba6a87aa39d3873a441369828875c471823trawick * prints various statistics to output
01f52ba6a87aa39d3873a441369828875c471823trawick apr_file_printf(output, "logresolve Statistics:" NL);
0066eddda7203f6345b56f77d146a759298dc635gryzor apr_file_printf(output, " With name : %d" NL, withname);
0066eddda7203f6345b56f77d146a759298dc635gryzor apr_file_printf(output, " Resolves : %d" NL, resolves);
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh apr_file_printf(output, " - Double lookup failed : %d" NL,
0d0ba3a410038e179b695446bb149cce6264e0abnd apr_file_printf(output, "Cache hits : %d" NL, cachehits);
0d0ba3a410038e179b695446bb149cce6264e0abnd apr_file_printf(output, "Cache size : %d" NL, cachesize);
0d0ba3a410038e179b695446bb149cce6264e0abnd * usage info
727872d18412fc021f03969b8641810d8896820bhumbedoohstatic void usage(void)
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh "%s -- Resolve IP-addresses to hostnames in Apache log files." NL
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd " -c Perform double lookups when resolving IP addresses." NL,
apr_getopt_t * o;
const char * arg;
char opt;
char * space;
char * hostname;
char * inbuffer;
char * outbuffer;
int doublelookups = 0;
if (argc) {
usage();
switch (opt) {
if (doublelookups) {
usage();
if (stats) {
usage();
entries++;
withname++;
if (hostname) {
cachehits++;
withname++;
resolves++;
cachesize++;
noreverse++;
if (doublelookups) {
0, pool);
doublefailed++;
if (stats) {