home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.muug.mb.ca
/
2014.06.ftp.muug.mb.ca.tar
/
ftp.muug.mb.ca
/
pub
/
src
/
gopher
/
gopher1.01
/
misc
/
Logging
/
glog.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-06-22
|
5KB
|
246 lines
/*** glog.c -- analysis tool for Unix gopherd logs ***/
/***
*** Usage : glog < logfile > reportfile
***/
/*** Description: glog munges through a Unix gopherd log and extracts
*** important looking statistics. It catalogs all hosts that have connected
*** to the gopherd during the logging period and sorts them according to the
*** number of accesses. It does the same for each directory and file accessed,
*** and ranks them according to popularity.
***/
/***
*** by: Chuck Shotton - U of Texas Health Science Center - Houston,
*** Office of Academic Computing
*** cshotton@oac.hsc.uth.tmc.edu
*** 6/17/92
***/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef THINK_C
#include <console.h>
#endif
#define GLOG_VERSION "Gopher Log Analyzer v.1.0\n"
typedef struct node_rec {
char data[64];
int hits;
struct node_rec *left, *right;
} NODE_REC;
typedef NODE_REC *NODE_PTR;
/*******************************/
NODE_PTR hosts, docs;
char day[4], month[4], date[3], hours[9], year[5], pid[6],
hostname[64], message1[12], message2[20], path[64];
char start_date[20], stop_date[20];
/*******************************/
main(argc, argv)
int argc;
char **argv;
{
char line[256];
#ifdef THINK_C
argc = ccommand(&argv);
#endif
printf(GLOG_VERSION);
Initialize();
/*process the first line here to get the date info*/
fgets(line, 256, stdin);
ProcessLine(line);
sprintf(start_date, "%s %s, %s", month, date, year);
while (!feof(stdin)) {
fgets(line, 256, stdin);
ProcessLine(line);
}
sprintf(stop_date, "%s %s, %s", month, date, year);
ShowStats();
exit(0);
}
/*******************************/
Initialize()
{
hosts = docs = NULL;
}
/*******************************/
/* Read a line from the log file, parse it up, and insert the */
/* info into the appropriate tables. */
ProcessLine(line)
char *line;
{
int i;
path[0]='\0';
i = sscanf(line, "%s %s %s %s %s %s %s : %s %s %s\n",
day, month, date, hours, year, pid, hostname,
message1, message2, path);
Insert(&hosts, hostname);
if (!strncmp(message1, "Root", 4))
Insert(&docs, "Root Connections");
else
Insert(&docs, path);
}
/*******************************/
/* Insert "str" into the appropriate symbol table. Increment the */
/* number of hits if the "str" is already present. */
Insert(tree, str)
NODE_PTR *tree;
char *str;
{
NODE_PTR temp;
int i;
if (*tree == NULL) {
temp = (NODE_PTR) malloc(sizeof(NODE_REC));
if (temp) {
temp->left = temp->right = NULL;
temp->hits = 1;
strcpy (temp->data, str);
*tree = temp;
}
else
printf("Memory error\n");
}
else {
i=strcmp(str, (*tree)->data);
if (i > 0)
Insert(&((*tree)->right), str);
else if (i<0)
Insert(&((*tree)->left), str);
else
(*tree)->hits += 1;
}
}
/*******************************/
int total_hits, total_nodes;
NODE_PTR by_num;
/*******************************/
/* Dump out the contents of the given symbol table and sort by */
/* number of "hits" on the fly. */
DumpTree(tree)
NODE_PTR tree;
{
if (tree == NULL)
return;
else {
DumpTree(tree->left);
printf("%-50.50s %5d\n", tree->data, tree->hits);
total_hits += tree->hits;
total_nodes++;
InsertByNum(tree);
DumpTree(tree->right);
}
}
/*******************************/
DumpStats(tree)
NODE_PTR tree;
{
total_hits = 0;
total_nodes= 0;
by_num = NULL;
DumpTree(tree);
}
/*******************************/
/* Turn a tree node into an element in a linked list */
InsertByNum(node)
NODE_PTR node;
{
NODE_PTR temp, temp2;
if (by_num == NULL) {
by_num = node;
node->left == NULL;
}
else {
temp = by_num;
temp2 = temp->left;
if (node->hits >= temp->hits) {
node->left = temp;
by_num = node;
}
else {
while (temp2 != NULL) {
if (node->hits > temp2->hits) {
temp->left = node;
node->left = temp2;
return;
}
else {
temp = temp2;
temp2 = temp->left;
}
}
temp->left = node;
node->left = NULL;
}
}
}
/*******************************/
/* Dump out the linked list contents */
DumpByNum(tree)
NODE_PTR tree;
{
while (tree != NULL) {
printf("%-50.50s %5d (%0.2f%%)\n", tree->data, tree->hits,
(float) tree->hits/(float) total_hits);
tree = tree->left;
}
}
/*******************************/
/* Show all the stats gleaned from the log file */
ShowStats()
{
printf("Report Period: %s to %s\n", start_date, stop_date);
printf("\nAll Hosts:\n-----------------------------\n");
DumpStats(hosts);
printf("\nMost Active Hosts:\n-----------------------------\n");
DumpByNum(by_num);
printf("------------------------\n");
printf("Total Hosts: %d\n", total_nodes);
printf("Total Connections: %d\n", total_hits);
printf("\nAll Data Accesses:\n-----------------------------\n");
DumpStats(docs);
printf("\nMost Popular Data:\n-----------------------------\n");
DumpByNum(by_num);
printf("------------------------\n");
printf("Total Data Accesses: %d\n", total_hits);
}