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&amp;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;