AWS-Lambda
view release on metacpan or search on metacpan
examples/cgi/WwwCounter/wwwcount.cgi view on Meta::CPAN
#!/usr/bin/env perl
use strict;
#==================================================================
# åç§°ï¼ WwwCount 4.0
# ä½è
ï¼ æç«ã
# ææ°çå
¥æå
ï¼ https://www.tohoho-web.com/wwwsoft.htm
# åãæ±ãï¼ ããªã¼ã½ãããå©ç¨/æ¹é /åé
å¸å¯è½ã確èªã¡ã¼ã«ä¸è¦ã
# è使¨©ï¼Copyright (C) 1996-2021 æç«ã
#==================================================================
#==================================================================
# 使ãããï¼
#==================================================================
# (æ¸å¼1) wwwcount.cgi?test
# CGIã使ç¨ã§ããããã¹ããè¡ãã
#
# (æ¸å¼2) wwwcount.cgi?text
# ã«ã¦ã³ãã¢ãããè¡ããã«ã¦ã³ã¿ãããã¹ãã§è¡¨ç¤ºããã
#
# (æ¸å¼3) wwwcount.cgi?gif
# ã«ã¦ã³ãã¢ãããè¡ããã«ã¦ã³ã¿ãGIFã§è¡¨ç¤ºããã
#
# (æ¸å¼4) wwwcount.cgi?hide+xxx.gif
# ã«ã¦ã³ãã¢ãããè¡ããxxx.gifã表示ããã
#
# (ãªãã·ã§ã³) wwwcount.cgi?(ç¥)+name+counter2
# è¤æ°ã«ã¦ã³ã¿ã¼ãè¨ç½®ããå ´åã«ã«ã¦ã³ã¿ã¼åãæå®ããã
#
# (ãªãã·ã§ã³) wwwcount.cgi?(ç¥)+ref+xxxxxx
# ãªã³ã¯å
æ
å ±ãã«ã¦ã³ã¿ã¼ã«ä¼ãã
#==================================================================
# ã«ã¹ã¿ãã¤ãºï¼
#==================================================================
# â
ãã®ãã¡ã¤ã«ã® 1è¡ç®ã®ã#!/usr/local/bin/perlãã perl ã®ãã¹
# åã«ãããã¦é©åã«æ¸ãæãã¦ãã ããããã¹åãåããªãå ´åã¯ã
# ãããã¤ãããµã¼ãã¼ç®¡çè
ã«åãåããã¦ãã ããã#! ã®åã«ã¯
# 空è¡ãã¹ãã¼ã¹æåãå
¥ããªãããã«ãã¦ãã ãããï¼å¿
é ï¼
# â
Windows NT ã§ IIS ã使ç¨ããå ´åã¯ãwwwcount.cgi ãã¤ã³ã¹ãã¼
# ã«ããã¦ãããã©ã«ãåã 'C:/HomePage/cgi-bin' ãªã©ã®ããã«æ
# å®ãã¦ãã ãããï¼å¿
é ï¼
my $g_chdir = '';
# â
SSIã®ããã¹ãã¢ã¼ãã§ä½¿ç¨ããå ´åã¯ã$g_mode = "text"; ã¨ãã¦ã
# ã ãããï¼å¿
é ï¼
my $g_mode = "";
# â
è¡¨ç¤ºæ¡æ°ãä¾ãã°5æ¡ã«æå®ããå ´åã¯ã$g_figure = 5;ãã®ããã«æ
# å®ãã¦ãã ããã0 ãæå®ããã¨æ¡æ°èªå調æ´ã«ãªãã¾ãã
my $g_figure = 6;
# â
ãã¡ã¤ã«ããã¯æ©è½ããªã³ã«ããå ´å㯠1 ãããªãã«ããå ´å㯠0
# ãæå®ãã¦ãã ãããé常㯠1 ã§ããã§ãããã
my $g_lock_flag = 1;
# â
åã¢ãã¬ã¹ãã§ãã¯æ©è½ããªã³ã«ããå ´å㯠1 ãæå®ãã¦ãã ããã
# åãæ¥ã«åã IP ã¢ãã¬ã¹ããã®ã¢ã¯ã»ã¹ãã«ã¦ã³ãã¢ããããªã
# ãªãã¾ãã
my $g_address_check = 0;
# â
çç¥æã®ã«ã¦ã³ã¿ã¼åãæå®ãã¾ããã«ã¦ã³ã¿ã¼å㯠*.cnt ã *.dat
# ãªã©ã®ãã¡ã¤ã«åã«å¯¾å¿ãã¦ãã¾ãã
my $g_counter_name = "wwwcount";
# â
ã¬ãã¼ãæ©è½ã使ãå ´åã¯ã$g_mailto = 'admin@example.com';ãã®
# ããã«èªåã®ã¡ã¼ã«ã¢ãã¬ã¹ãè¨å®ãã¦ãã ããããµã¼ãã¼ã§
# sendmailã³ãã³ãããµãã¼ãããã¦ããå¿
è¦ãããã¾ãã
# ã¬ãã¼ãæ©è½ã使ç¨ããªãå ´åã¯ç©ºæå('')ãæå®ãã¦ãã ããã
my $g_mailto = '';
# â
ã¬ãã¼ãæ©è½ã®éä¿¡å
ã¡ã¼ã«ã¢ãã¬ã¹ï¼é常ã¯èªåã®ã¢ãã¬ã¹ï¼ã
# æå®ãã¦ãã ãããçç¥æã¯ã«ã¦ã³ã¿åã«ãªãã¾ããããããã¤ã
examples/cgi/WwwCounter/wwwcount.cgi view on Meta::CPAN
my $g_addr_to_host = 0;
# â
ã¬ãã¼ãæ©è½ã«ããã¦ãã$g_my_url = 'http://www.yyy.zzz/';ãã¨ã
# ãã¨ããã®ã¢ãã¬ã¹ã«ããããããµã¤ãããã® FROM ã¯è¡¨ç¤ºããªããª
# ãã¾ãã
my $g_my_url = '';
# â
ã¬ãã¼ãæ©è½ã§ã%7E ãªã©ã®ã¨ã³ã³ã¼ãæåããã³ã¼ããã¦è¨é²ãã
# å ´å㯠1 ãããã®ã¾ã¾è¨é²ããå ´å㯠0 ãæå®ãã¦ãã ããã
my $g_decode_url = 1;
my $count_dir = $ENV{WWWCOUNT_DIR} // ".";
# â
ããã¯ãã¡ã¤ã«ã使ãããã©ã«ãåãæå®ãã¾ãã
my $g_lock_dir = "$count_dir/lock";
#==================================================================
# ãã®ä»å¤æ°
#==================================================================
# é ãã«ã¦ã³ã¿ã¼ã§è¡¨ç¤ºããGIFãã¡ã¤ã«å
my $g_gif_file = "";
# ã¢ã¯ã»ã¹å
æ
å ±
my $g_referer = "";
# ã«ã¦ã³ã¿ã¼ãã¡ã¤ã«å(*.cnt)
my $g_file_count = "$count_dir/${g_counter_name}.cnt";
# æçµã¢ã¯ã»ã¹æ¥è¨é²ãã¡ã¤ã«å(*.dat)
my $g_file_date = "$count_dir/${g_counter_name}.dat";
# ã¢ã¯ã»ã¹æ
å ±è¨é²ãã¡ã¤ã«å(*.acc)
my $g_file_access = "$count_dir/${g_counter_name}.acc";
# ããã¯ãã¡ã¤ã«å(*.loc)
my $g_file_lock = "${g_lock_dir}/${g_counter_name}.loc";
#==================================================================
# å¦çé¨ï¼
#==================================================================
#
# ã¡ã¤ã³ã«ã¼ãã³
#
{
my($count, $last_access_date, $now_date, $now_time, $do_countup);
# ç°å¢å¤æ°TZãæ¥æ¬æéã«è¨å®ãã
$ENV{'TZ'} = "JST-9";
# ã«ã¬ã³ããã©ã«ãã夿´ããã
if ($g_chdir ne "") {
chdir($g_chdir);
}
# 弿°ãè§£éãã
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");
examples/cgi/WwwCounter/wwwcount.cgi view on Meta::CPAN
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.822 second using v1.01-cache-2.11-cpan-39bf76dae61 )