File : web_summary.bush
#!/usr/local/bin/bush
-- Summarize the Apache server log
pragma annotate( "web_summary" );
pragma annotate( "" );
pragma annotate( "Simple web summary of an Apache server log" );
pragma annotate( "by Ken O. Burtch" );
procedure web_summary is
error_status : constant short_short_integer := 192;
log_path : constant string := directory_operations.format_pathname( "/var/log/httpd" );
log_file_name : constant string := "access_log";
log_file : constant string := log_path & directory_operations.dir_separator & log_file_name;
begin
-- Verify the log directory exists and that the log file is readable
if not files.is_directory( log_path ) then
put( standard_error, source_info.file )
@( standard_error, ": log path is not a directory" );
command_line.set_exit_status( error_status );
return;
end if;
if not files.is_readable_file( log_file ) then
put( standard_error, source_info.file )
@( standard_error, ": log file does not exist or is not readable" );
command_line.set_exit_status( error_status );
return;
end if;
declare
this_month : calendar.month_number := calendar.month( calendar.clock );
current_month : string;
today : string;
month_total_hits : natural;
month_users_hits : natural;
day_total_hits : natural;
day_users_hits : natural;
begin
-- Create today and current_month strings for grepping the log file
-- This may be dependent on your Apache configuration.
today := strings.trim( strings.image( calendar.year( calendar.clock ) ),
trim_end.left );
today := "/" & @;
case this_month is
when 1 => today := "Jan" & @;
when 2 => today := "Feb" & @;
when 3 => today := "Mar" & @;
when 4 => today := "Apr" & @;
when 5 => today := "May" & @;
when 6 => today := "Jun" & @;
when 7 => today := "Jul" & @;
when 8 => today := "Aug" & @;
when 9 => today := "Sep" & @;
when 10 => today := "Oct" & @;
when 11 => today := "Nov" & @;
when 12 => today := "Dec" & @;
when others => put_line( standard_error, "bad month" );
end case;
current_month := today;
today := strings.trim( strings.image( calendar.day( calendar.clock ) ),
trim_end.left ) & "/" & @;
if strings.length( today ) < 11 then
today := "0" & @;
end if;
-- Collect the statistics
--
-- Select only GET lines. Of those lines, select only the current day or
-- month. For uses, examine the first field of the log and count unique
-- visitors.
month_total_hits := numerics.value( `grep GET /var/log/httpd/access_log | grep "$current_month" | wc -l ;` );
month_users_hits := numerics.value( `grep GET /var/log/httpd/access_log | grep "$current_month" | cut -d\ -f 1 | sort -u | wc -l ;` );
day_total_hits := numerics.value( `grep GET /var/log/httpd/access_log | grep "$current_month" | wc -l ;` );
day_users_hits := numerics.value( `grep GET /var/log/httpd/access_log | grep "$current_month" | cut -d\ -f 1 | sort -u | wc -l ;` );
-- Display the report
put_line( "Month to Date - " & current_month );
new_line;
put( "Total hits: " ) @ ( month_total_hits, "ZZZZZZZ" );
new_line;
put( "Total users: " ) @ ( month_users_hits, "ZZZZZZZ" );
new_line;
new_line;
put_line( "Today (so far) - " & today );
new_line;
put( "Total hits: " ) @ ( day_total_hits, "ZZZZZZZ" );
new_line;
put( "Total users: " ) @ ( day_users_hits, "ZZZZZZZ" );
new_line;
end;
command_line.set_exit_status( 0 );
end web_summary;
-- VIM editor formatting instructions -- vim: ft=bush