#!/ext/user.local/computer/a61/perl/bin/perl #******************** counter.pl ****************************************** # PODIUM Bureau voor educatieve communicatie # Alexander Martens (6/6/1996) # SVK-op Internet #************************************************************************** # counter.pl is een perl5 script gebruik makend van GD.pm voor het tonen # van het aantal bezoekers van de home-page # in data directory (cgi-bin/data) worden de gegevens in de file count.txt # opgeslagen. Het programma maakt gebruik van file-locking middels flock. # Er wordt mbv GD.pm een gif-plaatje gegenereerd dat naar de standaard output # wordt gezonden. # voor het gebruik in html kan de volgende regel opgenomen worden # # bijzonderheden: # - er wordt van een vast aantal digits uitgegaan, de achtergrond is # - transparant. use GD; # flush de i/o buffer meteen $| = 1; #$exclusive_lock = 2; #$unlock_lock = 8; $counter_file = "/cp/htdocs/Netherlands/pavilions/techno/svk/write/count.txt"; $no_visitors = 1; if (! (-e "/cp/htdocs/cgi-bin/Netherlands/svk/LOCAL")) { $lock = 1; } else { $lock = 0; } # kijk eerst of er uberhaupt al een counter-file is if (! (-e $counter_file)) { # nee, dus maak een nieuwe die start op 1 if (open (COUNTER, ">" . $counter_file)) { if ($lock) { flock (COUNTER, $exclusive_lock); } print COUNTER $no_visitors; if ($lock) { flock (COUNTER, $unlock_lock); } close (COUNTER); } else { &return_error (500, "Counter Error", "Cannot create file"); } } else { # er is al een counter-file dus probeer te openen, en op te hogen if (! ((-r $counter_file) && (-w $counter_file)) ) { print "Geen lezen mogelijk\n"; &return_error (500, "Counter Error", "Cannot read or write "); } else { open (COUNTER, "<" . $counter_file); if ($lock) { flock (COUNTER, $exclusive_lock); } $no_visitors = ; if ($lock) { flock (COUNTER, $unlock_lock); } close (COUNTER); $no_visitors++; open (COUNTER, ">" . $counter_file); if ($lock) { flock (COUNTER, $exclusive_lock); } print COUNTER $no_visitors; if ($lock) { flock (COUNTER, $unlock_lock); } close (COUNTER); } } # maak nu het gif-plaatje &graphic_counter(); exit(0); sub return_error { # geef een foutmelding terug local ($status, $keyword, $message) = @_; print "Content-type: text/html", "\n"; print "Status: ", $Status, " ", $keyword, $keyword,"\n\n"; exit(1); } sub graphic_counter { local ($count_length, $font_length, $font_height, $distance, $image_length, $image_height, $image, $background, $digitcolor, $loop, $number, $temp_x, $tot_length); $tot_length = 6; $count_length = length ($no_visitors); $font_length = 8; $font_height = 16; $distance = 3; # bereken de 'grootte' v/h plaatje $image_length = ($tot_length * $font_length) + (($tot_length - 1) * $distance) ; $image_height = $font_height; # initialiseer het plaatje $image = new GD::Image ($image_length, $image_height); # ken de kleuren toe $background = $image->colorAllocate (255, 255, 255); $digitcolor = $image->colorAllocate (0, 0, 0); # zorg nu voor transparant en interlaced $image->transparent($background); $image->interlaced('true'); # toon nu elke keer een karakter $temp_x = $tot_length - $count_length; for ($loop = 0; $loop <= ($count_length - 1); $loop++) { $number = substr ($no_visitors, $loop, 1); $image->char (gdLargeFont, ($font_length * ($loop + $temp_x)) + (($loop + $temp_x) * $distance), 0, $number, $digitcolor ); } print "Content-type: image/gif", "\n\n"; print $image->gif; }