#!/bin/perl #
############################################################################## # Counter script # Compiled by Jerzy Sobczyk J.Sobczyk@ia.pw.edu.pl # Created on: 1996.4.26 Last modified on: 1997.10.14 # Script source: http://www.ia.pw.edu.pl/js/counter/hits # # Based on: # Counter Script Version 1.1.1 # Created by Matt Wright mattw@misha.net # Created on: 10/27/95 Last Modified on: 1/11/96 # Scripts Archive: http://www.worldwidemart.com/scripts/ # and: # WWWCount Text Version (Requires Server Side Includes) Version 1.0 # Created by Matt Wright mattw@worldwidemart.com # Created on: 3/14/96 Last Modified on: 3/14/96 ############################################################################## # Define Variables #system "echo aqq `date`>>/tmp/wrr"; # Data Dir is the directory on your server that you store files in. $data_dir = "/public/www/data"; # Count Dir is the directory on your server that you wish to store the # count files in. Each page that has the counter on it will have it's own # file. $count_dir = "/public/www/counts"; # Default Font Dir is the directory on the server containing fonts # for digits used to display counts and dates. $def_font_dir = "/public/www/data/digits"; # Valid-Referer allows you to limit servers that can use your counter # program. It is suggested that you put in your base domain (similar to # myself using worldwidemart.com) and the IP address of your server (mine # being 206.31.72.203) @valid_referer = ('www.ia.pw.edu.pl','148.81.31.1'); ############################################################################## require 'cgi-lib.pl'; &ReadParse( *args ); ####################################################################### # Define Variables ### FILE AND DIRECTORY LOCATIONS, REFERERS ### $flyprog = "/usr/local/bin/fly -q"; $fly_temp = "/tmp/fly_temp.txt.$$"; $bad_referer_img = "http://www.ia.pw.edu.pl/img/bad_referer.gif"; ### IMAGE SETTINGS ### if (exists $args{ 'transparent' }) { $tp = $args{ 'transparent' }; } else { $tp = "X"; } if (exists $args{ 'inter' }) { $il = $args{ 'inter' }; } else { $il = "1"; } if (exists $args{ 'farmewidth' }) { $farme_width = $args{ 'farmewidth' }; } else { $frame_width = "0"; } if (exists $args{ 'frame_color' }) { $frame_color = $args{ 'frame_color' }; } else { $frame_color = "0,0,0"; } # Done ####################################################################### if (exists $args{ 'mode' }) { $mode = $args{ 'mode' }; } else { $mode = 'count'; } if (exists $args{ 'text' }) { $text = $args{ 'text' }; } else { $text = ''; } $font_dir = $args{ 'font' }; if ( "$font_dir" =~ /^-/ ) { } elsif ( "$font_dir" ne "" && -d $font_dir ) { $digit_dir = $font_dir; } elsif ( "$font_dir" ne "" && -d "$def_font_dir/$font_dir" ) { $digit_dir = "$def_font_dir/$font_dir"; } else { $digit_dir = "$def_font_dir/default"; } $count_page = "$ENV{'HTTP_REFERER'}"; if ($count_page =~ /\/$/) { chop($count_page); } $count_page =~ s/\//_/g; &check_referer; if (-e "$count_dir/$count_page") { open(COUNT,"$count_dir/$count_page"); $line =; chop($line) if $line =~ /\n$/; close(COUNT); ($date,$count) = split(/\|\|/,$line); if (($date ne "") && ($date !~ /\./)) { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($date); $mon++; $date = "19$year.$mon.$mday"; } } else { &create; # &error('page_not_found'); } if ($mode eq 'reset') { $count=0; ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $mon++; $date = "19$year.$mon.$mday"; open(COUNT,">$count_dir/$count_page") || &error('could_not_increment'); print COUNT "$date\|\|$count"; close(COUNT); } if ($mode eq 'count') { $count++; open(COUNT,">$count_dir/$count_page") || &error('could_not_increment'); print COUNT "$date\|\|$count"; close(COUNT); } if ($mode eq 'modified') { $_ = "$ENV{'HTTP_REFERER'}"; s/http:\/\/[^\/]*\///; s/Pl-[^\/]*\///; # Remove polish character conversions s/~([^\/]*)/~\1/; if (/^\~/) { s/~//; s/\/.*//; ($a_name,$a_pass,$a_uid,$a_gid,$a_quot,$a_comm,$a_gcos,$a_dir,$a_sh)=getpwnam($_); $_="$a_dir/.homepage"; } s/^([^\/])/\/public\/www\/data\/\1/; ($dev,$ino,$mod,$nlink,$uid,$gid,$rdev,$size,$atime,$date,$ctime,$blksiz,$blks) = stat( $_ ); ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($date); $mon++; $date = "19$year.$mon.$mday"; &show_gif( $date ); } elsif ($mode eq 'date') { # ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($date); # $mon++; # $date = "19$year.$mon.$mday"; &show_gif( $date ); } elsif ($mode eq 'text') { &show_gif( $text ); } else { &show_gif( $count ); } sub create { ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); $mon++; $date = "19$year.$mon.$mday"; $count = "0"; open(COUNT,">$count_dir/$count_page") || &error('count_not_created'); print COUNT "$date\|\|$count"; close(COUNT); } sub error { $error = shift(@_); if ($error eq 'page_not_found') { print "[WWWCount Fatal Error: This Page Not Found\; Auto-Create Option Disabled]"; } elsif ($error eq 'bad_referer_or_uri') { print "[WWWCount Fatal Error: This Page Not In Valid Referer or URI]"; } elsif ($error eq 'count_not_created') { print "[WWWCount Fatal Error: Could Not Write to File $count_dir/$count_page]"; } elsif ($error eq 'could_not_increment') { print "[WWWCount Fatal Error: Could Not Increment Counter]"; } exit; } sub show_gif { local($value)=@_; local($val)=$value; # Determine Length of Counter Number $num = $length = length($value); # Set Individual Counter Numbers Into Associative Array while ($num > 0) { $CHAR{$num} = chop($value); $num--; } if ($font_dir !~ /^-/) { open(FIL, "$digit_dir/sizes"); while ( ) { split; @_[0] =~ s/\.gif//; $widths{@_[0]} = @_[1]; $heights{@_[0]} = @_[2]; } close(FIL); } else { if ($font_dir eq "-tiny") { $widths{ "0"} = 5; $heights{"0"} = 8; } elsif ($font_dir eq "-small") { $widths{ "0"} = 6; $heights{"0"} = 9; } elsif ($font_dir eq "-medium") { $widths{ "0"} = 7; $heights{"0"} = 11; } elsif ($font_dir eq "-large") { $widths{ "0"} = 8; $heights{"0"} = 16; } elsif ($font_dir eq "-giant") { $widths{ "0"} = 9; $heights{"0"} = 12; } foreach $i ("1", "2", "3", "4", "5", "6", "7", "8", "9", "dot", "colon") { $widths{ $i} = $widths{ "0"}; $heights{$i} = $heights{"0"}; } } # Determine the Height and Width of the Image $img_width = 0; $img_height = 0; $j = 1; while ($j <= $length) { if ($CHAR{$j} eq ".") { $img_width = $img_width + $widths{"dot"}; $img_height = ($img_height > $heights{"dot"}) ? $img_height : $heights{"dot"}; } elsif ($CHAR{$j} eq ":") { $img_width = $img_width + $widths{"colon"}; $img_height = ($img_height > $heights{"colon"}) ? $img_height : $heights{"colon"}; } elsif ($CHAR{$j} eq "a" && $CHAR{$j+1} eq "m" && -f "$digit_dir/am.gif") { $img_width = $img_width + $widths{"am"}; $img_height = ($img_height > $heights{"am"}) ? $img_height : $heights{"am"}; } elsif ($CHAR{$j} eq "p" && $CHAR{$j+1} eq "m" && -f "$digit_dir/pm.gif") { $img_width = $img_width + $widths{"pm"}; $img_height = ($img_height > $heights{"pm"}) ? $img_height : $heights{"pm"}; } else { $img_width = $img_width + $widths{$CHAR{$j}}; $img_height = ($img_height > $heights{"$CHAR{$j}"}) ? $img_height : $heights{"$CHAR{$j}"}; } $j++; } $img_width = $img_width + ($frame_width * 2); $img_height = $img_height + ($frame_width * 2); # Open the In-File for Commands open(FLY,">$fly_temp") || die "Can't Open In File For FLY Commands: $!\n"; # Create New Counter Image print FLY "new\n"; print FLY "size $img_width,$img_height\n"; # If User Wants Frame, Print Commands to the In-File &make_frame; if ($font_dir =~ /^-/) { $font_dir =~ s/^-//; print FLY "fill 1,1,255,255,255\n"; print FLY "string 0,0,0,$insert_width,$insert_height,$font_dir,$val\n"; } else { # Copy Individual Counter Images Commands to In-File $j = 1; while ($j <= $length) { if ($CHAR{$j} eq ".") { print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir/dot\.gif\n"; $insert_width = ($insert_width + $widths{"dot"}); } elsif ($CHAR{$j} eq ":") { print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir/colon\.gif\n"; $insert_width = ($insert_width + $widths{"colon"}); } elsif ($CHAR{$j} eq "a" && $CHAR{$j+1} eq "m" && -f "$digit_dir/am.gif") { print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir/am\.gif\n"; $insert_width = ($insert_width + $widths{"am"}); $j++; } elsif ($CHAR{$j} eq "p" && $CHAR{$j+1} eq "m" && -f "$digit_dir/pm.gif") { print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir/pm\.gif\n"; $insert_width = ($insert_width + $widths{"pm"}); $j++; } else { print FLY "copy $insert_width,$insert_height,-1,-1,-1,-1,$digit_dir/$CHAR{$j}\.gif\n"; $insert_width = ($insert_width + $widths{$CHAR{$j}}); } $j++; } } # If they want a color transparent, make it transparent if ($tp ne "X" && $tp =~ /.*,.*,.*/) { print FLY "transparent $tp\n"; } # If they want the image interlaced, make it interlaced if ($il == 1) { print FLY "interlace\n"; } # Close FLY close(FLY); $output = `$flyprog -i $fly_temp`; print "Content-type: image/gif\n\n"; print "$output"; # Remove Temp File unlink($fly_temp); } sub make_frame { $insert_width = $insert_height = $frame_width; $insert_frame = 0; while ($insert_frame < $frame_width) { $current_width = ($img_width - $insert_frame); $current_height = ($img_height - $insert_frame); print FLY "line 0,$insert_frame,$img_width,$insert_frame,$frame_color\n"; print FLY "line $insert_frame,0,$insert_frame,$img_height,$frame_color\n"; print FLY "line $current_width,0,$current_width,$img_height,$frame_color\n"; print FLY "line $current_height,0,$current_height,$img_width,$frame_color\n"; $insert_frame++; } } sub check_referer { if (@valid_referer && $ENV{'HTTP_REFERER'}) { foreach $referer (@valid_referer) { if ($ENV{'HTTP_REFERER'} =~ /$referer/) { $ref = 1; last; } } } else { $ref = 0; } if ($ref != 1) { print "Location: $bad_referer_img\n\n"; if ($uselog == 1) { open(LOG,">>$error_log") || die "Can't Open User Error Log: $!\n"; print LOG "$error: $ENV{'REMOTE_HOST'} [$date] $ENV{'HTTP_REFERER'} - $ENV{'HTTP_USER_AGENT'}\n"; close(LOG); } exit; } } #