created and maintained by tokd
YukiWikiModifiedVersion
以前使っていたスクリプトをYukiWiki 2.1.3 からの差分の形で公開します.
HowToSetUpYukiWikiAtNifty で触れた以外の主な変更点は以下の通り.
- CGI 名を明示しなくてもアクセスできるように,wiki.cgi から index.cgi に改名(40行目と62行目)
- 一覧のページに凍結済みかどうかを表示(256行目~258行目)
- 編集のページは検索エンジンに収集されないように変更(419行目~421行目)
- YukiWikiTrackback用メニューを追加(442行目~443行目)
- 凍結してもコメントは追加できるように変更(1135行目~1139行目)
- アクセスの履歴をコンバインドログ形式(CLF:Combined Log Format)互換フォーマットでログに記録する。ファイルサイズが一定以上になったらログローテーションを行う(1348行目、1408行目~1442行目)。
予め空のアクセスログをアップロードしておく。パーミッションは touched.txt と同様(quote site chmod 666 access.log)。本格的な解析を analog や Webalizer で行うことも可能だが、そこまで高機能なものはいらないので YukiWikiAccessAnalysis の自作スクリプトを使っている。
*** wiki.cgi Thu Jul 06 08:16:12 2006 --- index.cgi Sun Jul 30 07:59:26 2006 *************** *** 1,4 **** ! #!/usr/bin/perl #!perl # # wiki.cgi - This is YukiWiki, yet another Wiki clone. --- 1,4 ---- ! #!/usr/local/bin/perl #!perl # # wiki.cgi - This is YukiWiki, yet another Wiki clone. *************** *** 22,28 **** use Yuki::PluginManager; require 'jcode.pl'; # use Jcode; ! use Fcntl; # Check if the server can use 'AnyDBM_File' or not. # eval 'use AnyDBM_File'; # my $error_AnyDBM_File = $@; --- 22,28 ---- use Yuki::PluginManager; require 'jcode.pl'; # use Jcode; ! # use Fcntl; # Check if the server can use 'AnyDBM_File' or not. # eval 'use AnyDBM_File'; # my $error_AnyDBM_File = $@; *************** *** 31,44 **** # # You MUST modify following '$modifier_...' variables. # ! my $modifier_mail = 'hyuki@hyuki.com'; ! my $modifier_url = 'http://www.hyuki.com/'; ! my $modifier_name = 'Hiroshi Yuki'; my $modifier_dir_data = '.'; # Your data directory (not URL, but DIRECTORY). ! my $modifier_url_data = '.'; # Your data URL (not DIRECTORY, but URL). my $modifier_rss_title = "YukiWiki $version"; ! my $modifier_rss_link = 'http://www.hyuki.com/yukiwiki/wiki.cgi'; ! my $modifier_rss_about = 'http://www.hyuki.com/yukiwiki/rss.xml'; my $modifier_rss_description = 'This is YukiWiki, yet another Wiki clone'; my $modifier_rss_timezone = '+09:00'; ############################## --- 31,44 ---- # # You MUST modify following '$modifier_...' variables. # ! my $modifier_mail = ''; ! my $modifier_url = 'http://hpcgi2.nifty.com/tokd/'; ! my $modifier_name = 'tokd'; my $modifier_dir_data = '.'; # Your data directory (not URL, but DIRECTORY). ! my $modifier_url_data = 'http://homepage2.nifty.com/tokd'; # Your data URL (not DIRECTORY, but URL). my $modifier_rss_title = "YukiWiki $version"; ! my $modifier_rss_link = 'http://hpcgi2.nifty.com/tokd/index.cgi'; ! my $modifier_rss_about = 'http://homepage2.nifty.com/tokd/rss.xml'; my $modifier_rss_description = 'This is YukiWiki, yet another Wiki clone'; my $modifier_rss_timezone = '+09:00'; ############################## *************** *** 58,65 **** my $file_FrontPage = "$modifier_dir_data/frontpage.txt"; my $file_conflict = "$modifier_dir_data/conflict.txt"; my $file_format = "$modifier_dir_data/format.txt"; ! my $file_rss = "$modifier_dir_data/rss.xml"; ! my $url_cgi = 'wiki.cgi'; my $url_stylesheet = "$modifier_url_data/wiki.css"; my $icontag = qq(<img src="$modifier_url_data/icon40x40.gif" alt="*" width="40" height="40" />); my $maxrecent = 50; --- 58,65 ---- my $file_FrontPage = "$modifier_dir_data/frontpage.txt"; my $file_conflict = "$modifier_dir_data/conflict.txt"; my $file_format = "$modifier_dir_data/format.txt"; ! my $file_rss = "../homepage/rss.xml"; ! my $url_cgi = 'index.cgi'; my $url_stylesheet = "$modifier_url_data/wiki.css"; my $icontag = qq(<img src="$modifier_url_data/icon40x40.gif" alt="*" width="40" height="40" />); my $maxrecent = 50; *************** *** 253,260 **** print qq(<ul>); foreach my $page (sort keys %database) { if (&is_editable($page)) { ! print qq(<li><a href="$url_cgi?@{[&encode($page)]}">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}</li>); ! # print qq(<li>@{[&get_info($page, $info_IsFrozen)]}</li>); # print qq(<li>@{[0 + &is_frozen($page)]}</li>); } } --- 253,261 ---- print qq(<ul>); foreach my $page (sort keys %database) { if (&is_editable($page)) { ! print qq(<li><a href="$url_cgi?@{[&encode($page)]}">@{[&escape($page)]}</a>@{[&escape(&get_subjectline($page))]}); ! print qq(<font color="#ff0000"><i>[editable]</i></font>) if &get_info($page, $info_IsFrozen) == 0; ! print qq(</li>); # print qq(<li>@{[0 + &is_frozen($page)]}</li>); } } *************** *** 415,420 **** --- 416,424 ---- <head> <meta http-equiv="Content-Language" content="$lang"> <meta http-equiv="Content-Type" content="text/html; charset=$charset"> + EOD + print qq( <meta name="robots" content="noindex, nofollow">\n) if ($form{mycmd} =~ /^(edit|adminedit)$/); + print <<"EOD"; <title>$escapedpage @{[&escape(&get_subjectline($page))]}</title> <link rel="index" href="$url_cgi?$IndexPage"> <link rev="made" href="mailto:$modifier_mail"> *************** *** 435,440 **** --- 439,446 ---- ? qq(<a href="$url_cgi?mycmd=diff&mypage=$cookedpage">$resource{diffbutton}</a> | ) : qq() ]} + <a href="trackback.cgi?mypage=$cookedpage">Trackback(admin only)</a> | + <a href="trackgo.cgi">Trackback Ping URL</a> | <a href="$url_cgi?$CreatePage">$resource{createbutton}</a> | <a href="$url_cgi?$IndexPage">$resource{indexbutton}</a> | <a href="$modifier_rss_about">$resource{rssbutton}</a> | *************** *** 822,829 **** dbmopen(%database, $dataname, 0666) or &print_error("(dbmopen) $dataname"); dbmopen(%infobase, $infoname, 0666) or &print_error("(dbmopen) $infoname"); } elsif ($modifier_dbtype eq 'AnyDBM_File') { ! tie(%database, "AnyDBM_File", $dataname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $dataname"); ! tie(%infobase, "AnyDBM_File", $infoname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $infoname"); } else { tie(%database, "Yuki::YukiWikiDB", $dataname) or &print_error("(tie Yuki::YukiWikiDB) $dataname"); tie(%infobase, "Yuki::YukiWikiDB", $infoname) or &print_error("(tie Yuki::YukiWikiDB) $infoname"); --- 828,835 ---- dbmopen(%database, $dataname, 0666) or &print_error("(dbmopen) $dataname"); dbmopen(%infobase, $infoname, 0666) or &print_error("(dbmopen) $infoname"); } elsif ($modifier_dbtype eq 'AnyDBM_File') { ! # tie(%database, "AnyDBM_File", $dataname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $dataname"); ! # tie(%infobase, "AnyDBM_File", $infoname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $infoname"); } else { tie(%database, "Yuki::YukiWikiDB", $dataname) or &print_error("(tie Yuki::YukiWikiDB) $dataname"); tie(%infobase, "Yuki::YukiWikiDB", $infoname) or &print_error("(tie Yuki::YukiWikiDB) $infoname"); *************** *** 847,853 **** if ($modifier_dbtype eq 'dbmopen') { dbmopen(%diffbase, $diffname, 0666) or &print_error("(dbmopen) $diffname"); } elsif ($modifier_dbtype eq 'AnyDBM_File') { ! tie(%diffbase, "AnyDBM_File", $diffname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $diffname"); } else { tie(%diffbase, "Yuki::YukiWikiDB", $diffname) or &print_error("(tie Yuki::YukiWikiDB) $diffname"); } --- 853,859 ---- if ($modifier_dbtype eq 'dbmopen') { dbmopen(%diffbase, $diffname, 0666) or &print_error("(dbmopen) $diffname"); } elsif ($modifier_dbtype eq 'AnyDBM_File') { ! # tie(%diffbase, "AnyDBM_File", $diffname, O_RDWR|O_CREAT, 0666) or &print_error("(tie AnyDBM_File) $diffname"); } else { tie(%diffbase, "Yuki::YukiWikiDB", $diffname) or &print_error("(tie Yuki::YukiWikiDB) $diffname"); } *************** *** 1126,1131 **** --- 1132,1142 ---- if (not $isfrozen and not $willbefrozen) { # You need no check. return 0; + } elsif ($isfrozen and $form{mycmd} eq 'comment') { + # keep frozen + $form{myfrozen} = 1; + # Comment is always allowed. + return 0; } elsif (valid_password($form{mypassword})) { # You are admin. return 0; *************** *** 1334,1339 **** --- 1345,1351 ---- # Initialize plugins. sub init_plugin { $plugin_manager = new Yuki::PluginManager($plugin_context, $modifier_dir_plugin); + &append_access_log; } sub print_plugin_log { *************** *** 1391,1396 **** --- 1403,1444 ---- open(FILE, "> $file_rss") or &print_error("($file_rss)"); print FILE $rss->as_string; close(FILE); + } + + sub append_access_log { + if (($form{mycmd} =~ /^(read|FrontPage)$/ and $ENV{'HTTP_REFERER'}) or + ($form{mycmd} eq 'write' and $ENV{'HTTP_REFERER'} !~ /^$modifier_url$url_cgi\?mycmd=adminedit/) or + ($form{mycmd} =~ /^(search|comment)$/)) { + my (@month) = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); + my ($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time); + $year += 1900; + $mon = $month[$mon]; + $day = "0$day" if $day < 10; + $hour = "0$hour" if $hour < 10; + $min = "0$min" if $min < 10; + $sec = "0$sec" if $sec < 10; + + my $kw = "&$form{mymsg}" if ($form{mycmd} eq 'search'); + + my $accesslog = "$modifier_dir_data/access.log"; + if (-s $accesslog > 64 * 1024) { + my $backup = "$modifier_dir_data/access." . $year . $mon . $day . $hour . $min . $sec; + open(ACCESSOLD, ">$backup"); + open(ACCESS, $accesslog); + flock(ACCESS, 2); + while (<ACCESS>) { + print ACCESSOLD; + } + close(ACCESS); + close(ACCESSOLD); + open(ACCESS, ">$accesslog"); + } else { + open(ACCESS, ">>$accesslog"); + } + flock(ACCESS, 2); + print ACCESS qq($ENV{'REMOTE_ADDR'} - - [$day/$mon/$year:$hour:$min:$sec +0900] "GET /$form{mypage}?$form{mycmd}$kw HTTP/1.0" 200 - "$ENV{'HTTP_REFERER'}" -\n); + close(ACCESS); + } } 1;