AWS-Lambda
view release on metacpan or search on metacpan
examples/cgi/WwwCounter/wwwcount.cgi view on Meta::CPAN
parseArguments();
# ãã¹ãã¢ã¼ãã§ããã°ãã¹ããå¼ã³åºã
if ($g_mode eq "test") {
test();
exit(0);
}
# ããã¯ãããã
doLock();
# ã«ã¦ã³ã¿ã¼ãèªã¿ã ã
$count = readCount();
# æçµã¢ã¯ã»ã¹æ¥ãèªã¿ã ã
$last_access_date = readLastAccessDate();
# 仿¥ã®æ¥ä»ã¨æå»ãå¾ã
($now_date, $now_time) = getCurrentDateAndTime();
# æ¥ä»ãç°ãªããã¤ã¾ãã仿¥åãã¦ã®ã¢ã¯ã»ã¹ã§ããã°
if ($last_access_date ne $now_date) {
# ã¬ãã¼ãã¡ã¼ã«ãéä¿¡ãã
sendReportMail($last_access_date);
# ã¢ã¯ã»ã¹ãã°ãã¯ãªã¢ãã
clearAccessLog();
# 仿¥ã®æ¥ä»ãæ¥ä»ãã°ãã¡ã¤ã«ã«æ¸ãåºã
saveLastAccessDate($now_date);
}
# åä¸IPããã®ã¢ã¯ã»ã¹ã¯ã«ã¦ã³ãã¢ããããªãã¢ã¼ãã®å ´åã
# ã«ã¦ã³ãã¢ãããããå¦ãã確èªããã
$do_countup = checkCountup();
# ã«ã¦ã³ãã¢ããããå ´å
if ($do_countup) {
# ã«ã¦ã³ã¿ã¼ãã¤ã³ã¯ãªã¡ã³ããã
$count++;
# ã«ã¦ã³ã¿ã¼ãè¨é²ãã
saveCount($count);
# ã¢ã¯ã»ã¹ãã°ãè¨é²ãã
saveAccessLog($count, $now_time);
}
# CGIã®çµæã¨ãã¦ã«ã¦ã³ã¿ã¼ãæ¸ãåºã
outputCounter($count);
# ããã¯ãè§£æ¾ãã
unlockLock();
}
#
# 弿°ãè§£éãã
#
sub parseArguments {
my(@argv) = split(/\+/, $ENV{'QUERY_STRING'});
for (my $i = 0; $i <= $#argv; $i++) {
# ãã¹ãã¢ã¼ã
if ($argv[$i] eq "test") {
$g_mode = "test";
# ããã¹ãã¢ã¼ã
} elsif ($argv[$i] eq "text") {
$g_mode = "text";
# GIFã¢ã¼ã
} elsif ($argv[$i] eq "gif") {
$g_mode = "gif";
# é ãã«ã¦ã³ã¿ã¼ã¢ã¼ã
} elsif ($argv[$i] eq "hide") {
$g_mode = "hide";
$g_gif_file = $argv[++$i];
if (!($g_gif_file =~ /\.gif$/i)) {
exit(1);
}
if ($g_gif_file =~ /[<>|&]/) {
exit(1);
}
# ã«ã¦ã³ã¿ã¼å
} elsif ($argv[$i] eq "name") {
$g_counter_name = $argv[++$i];
if ($g_counter_name !~ /^[a-zA-Z0-9]+$/) {
exit(1);
}
$g_file_count = "$g_counter_name" . ".cnt";
$g_file_date = "$g_counter_name" . ".dat";
$g_file_access = "$g_counter_name" . ".acc";
$g_file_lock = "$g_lock_dir/$g_counter_name" . ".loc";
# ãªã³ã¯å
} elsif ($argv[$i] eq "ref") {
$g_referer = $argv[++$i];
}
}
}
#
# ã«ã¦ã³ã¿ã¼ãã¡ã¤ã«ããã«ã¦ã³ã¿ã¼å¤ãèªã¿åºãã
#
sub readCount {
my($count) = 0;
local(*IN);
if (open(IN, "< $g_file_count")) {
$count = <IN>;
close(IN);
}
return $count;
}
#
# ã«ã¦ã³ã¿ãã«ã¦ã³ã¿ãã¡ã¤ã«ã«æ¸ãæ»ã
#
sub saveCount {
my($count) = @_;
if (open(OUT, "> $g_file_count")) {
print(OUT "$count");
close(OUT);
}
}
#
# æ¥ä»ãã¡ã¤ã«ããæçµã¢ã¯ã»ã¹æ¥ä»ãèªã¿åºãã
#
sub readLastAccessDate {
my $last_access_date;
if (open(IN, "< $g_file_date")) {
$last_access_date = <IN>;
close(IN);
} else {
$last_access_date = "";
}
return $last_access_date;
}
#
# 仿¥ã®æ¥ä»ãæ¥ä»ãã¡ã¤ã«ã«æ¸ãåºã
#
sub saveLastAccessDate {
my($now_date) = @_;
open(OUT, "> $g_file_date");
print(OUT "$now_date");
close(OUT);
}
#
# 仿¥ã®æ¥ä»ãå¾ã
#
sub getCurrentDateAndTime {
my($sec, $min, $hour, $mday, $mon, $year) = localtime(time());
my($now_date) = sprintf("%04d/%02d/%02d", 1900 + $year, $mon + 1, $mday);
my($now_time) = sprintf("%02d:%02d:%02d", $hour, $min, $sec);
return $now_date, $now_time;
}
#
# ã¢ã¯ã»ã¹ãã°ãåæåãã
#
sub clearAccessLog {
open(OUT, "> $g_file_access");
close(OUT);
}
#
# ã¢ã¯ã»ã¹ãã°ãè¨é²ãã
#
sub saveAccessLog {
my($count, $now_time) = @_;
my($addr, $host, $referer);
local(*OUT);
open(OUT, ">> $g_file_access");
# ã«ã¦ã³ã
print(OUT "COUNT = [ $count ]\n");
# æå»
print(OUT "TIME = [ $now_time ]\n");
# IPã¢ãã¬ã¹
$addr = $ENV{'REMOTE_ADDR'};
print(OUT "ADDR = [ $addr ]\n");
# ãã¹ãå
$host = $ENV{'REMOTE_HOST'};
if ($g_addr_to_host && (($host eq "") || ($host eq $addr))) {
$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
}
if (($host ne "") && ($host ne $addr)) {
print(OUT "HOST = [ $host ]\n");
}
# ã¨ã¼ã¸ã§ã³ãå
print(OUT "AGENT = [ $ENV{'HTTP_USER_AGENT'} ]\n");
# ãªã³ã¯å
(SSI)
$referer = $ENV{'HTTP_REFERER'};
if (($g_mode eq "text") && ($referer ne "")) {
if ($g_decode_url) {
$referer =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
}
print(OUT "REFER = [ $referer ]\n");
}
# ãªã³ã¯å
(CGI)
$g_referer =~ s/\\//g;
if ($g_referer && (!$g_my_url || ($g_referer !~ /$g_my_url/))) {
if ($g_decode_url) {
$g_referer =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
}
print(OUT "FROM = [ $g_referer ]\n");
}
print(OUT "\n");
close(OUT);
}
#
# ã¢ã¯ã»ã¹ãã°ãã¡ã¼ã«ã§éä¿¡ãã
#
sub sendReportMail {
my($last_access_date) = @_;
my($access_count);
local(*IN, *OUT);
if ($g_mailto eq "") {
return;
}
# ã¢ã¯ã»ã¹ä»¶æ°ãèªã¿åã
open(IN, "< $g_file_access");
$access_count = 0;
while (<IN>) {
if (/^COUNT/) {
$access_count++;
}
}
close(IN);
# ã¬ãã¼ãã¡ã¼ã«ãéä¿¡ãã
open(OUT, "| $g_sendmail -t -i");
print OUT "To: $g_mailto\n";
if ($g_mailfrom eq "") {
print OUT "From: $g_counter_name\n";
} else {
print OUT "From: $g_mailfrom\n";
}
print OUT "Subject: ACCESS $last_access_date $access_count\n";
print OUT "\n";
if ($g_report_detail) {
open(IN, "< $g_file_access");
while (<IN>) {
print OUT $_;
}
close(IN);
} else {
print OUT "Access = $access_count\n";
}
close(OUT);
}
#
# ã«ã¦ã³ãã¢ãããããå¦ãã夿ãã
# ãã§ã«åã¢ãã¬ã¹ããã®ã¢ã¯ã»ã¹ãããã°ã«ã¦ã³ãã¢ããããªã
#
sub checkCountup {
my($do_countup) = 1;
local(*IN);
if ($g_address_check) {
open(IN, "$g_file_access");
while (<IN>) {
if ($_ eq "ADDR = [ $ENV{'REMOTE_ADDR'} ]\n") {
$do_countup = 0;
last;
}
}
close(IN);
}
return $do_countup;
}
#
# CGIã¹ã¯ãªããã®çµæã¨ãã¦ã«ã¦ã³ã¿ã¼ãæ¸ãåºã
#
sub outputCounter {
my($count) = @_;
my($count_str, @files, $size, $n, $buf);
# ã«ã¦ã³ã¿ã¼æåå(ä¾:000123)ãå¾ã
if ($g_figure != 0) {
$count_str = sprintf(sprintf("%%0%dld", $g_figure), $count);
} else {
$count_str = sprintf("%ld", $count);
}
# ããã¹ãã¢ã¼ã
if ($g_mode eq "text") {
printf("Content-type: text/html\n");
printf("\n");
printf("$count_str\n");
# GIFã¢ã¼ã
} elsif ($g_mode eq "gif") {
printf("Content-type: image/gif\n");
printf("\n");
@files = ();
for (my $i = 0; $i < length($count_str); $i++) {
$n = substr($count_str, $i, 1);
push(@files, "$n.gif");
}
require "./gifcat.pl";
binmode(STDOUT);
print gifcat'gifcat(@files);
# é ãã«ã¦ã³ã¿ã¼ã¢ã¼ã
} elsif ($g_mode eq "hide") {
printf("Content-type: image/gif\n");
printf("\n");
$size = -s $g_gif_file;
open(IN, $g_gif_file);
binmode(IN);
binmode(STDOUT);
read(IN, $buf, $size);
print $buf;
close(IN);
}
}
#
# ããã¯ãå¾ã
#
sub doLock {
my($mtime);
if ($g_lock_flag) {
for (my $i = 1; $i <= 6; $i++) {
if (mkdir("$g_file_lock", 0755)) {
# ããã¯æåãæ¬¡ã®å¦çã¸ã
last;
} elsif ($i == 1) {
# 10å以ä¸å¤ãããã¯ãã¡ã¤ã«ã¯åé¤ããã
($mtime) = (stat($g_file_lock))[9];
if ($mtime < time() - 600) {
rmdir($g_file_lock);
}
} elsif ($i < 6) {
# ããã¯å¤±æã1ç§å¾
ã£ã¦åãã©ã¤ã
sleep(1);
} else {
# ä½åº¦ãã£ã¦ãããã¯å¤±æããããããã
exit(1);
}
}
}
# éä¸ã§çµäºãã¦ãããã¯ãã¡ã¤ã«ãæ®ããªãããã«ãã
sub sigexit { rmdir($g_file_lock); exit(0); }
$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "sigexit";
}
#
# ããã¯ãéæ¾ãã
#
sub unlockLock {
if ($g_lock_flag) {
rmdir($g_file_lock);
}
}
#
# CGIã使ç¨ã§ããããã¹ããè¡ãã
#
sub test {
print "Content-type: text/html\n";
print "\n";
print "<!doctype html>\n";
print "<html>\n";
print "<head>\n";
print "<meta charset='utf-8'>\n";
print "<title>Test</title>\n";
print "</head>\n";
print "<body>\n";
print "<p>OK. CGIã¹ã¯ãªããã¯æ£å¸¸ã«åãã¦ãã¾ãã</p>\n";
if ($g_mailto ne "") {
if (! -f $g_sendmail) {
print "<p>ERROR: $g_sendmail ãåå¨ãã¾ããã</p>\n";
}
}
if (!-d $g_lock_dir) {
print "<p>ERROR: $g_lock_dir ãã©ã«ããããã¾ããã</p>\n";
}
if (-d $g_file_lock) {
print "<p>ERROR: $g_file_lock ãæ®ã£ã¦ãã¾ãã</p>\n";
}
if (! -r $g_file_count) {
print "<p>ERROR: $g_file_count ãåå¨ãã¾ããã</p>\n";
} elsif (! -w $g_file_count) {
print "<p>ERROR: $g_file_count ãæ¸ãè¾¼ã¿å¯è½ã§ã¯ããã¾ããã</p>\n";
}
if (! -r $g_file_date) {
print "<p>ERROR: $g_file_date ãåå¨ãã¾ããã</p>\n";
} elsif (! -w $g_file_date) {
print "<p>ERROR: $g_file_date ãæ¸ãè¾¼ã¿å¯è½ã§ã¯ããã¾ããã</p>\n";
}
if (! -r $g_file_access) {
print "<p>ERROR: $g_file_access ãåå¨ãã¾ããã</p>\n";
} elsif (! -w $g_file_access) {
print "<p>ERROR: $g_file_access ãæ¸ãè¾¼ã¿å¯è½ã§ã¯ããã¾ããã</p>\n";
}
if (($g_chdir ne "") && (! -d $g_chdir)) {
print "<p>ERROR: $g_chdir ãåå¨ãã¾ããã</p>\n";
}
print "</body>\n";
print "</html>\n";
}
( run in 0.585 second using v1.01-cache-2.11-cpan-99c4e6809bf )