/[pub]/suikawiki/wikidata/suikawiki-config.ph
Suika

Diff of /suikawiki/wikidata/suikawiki-config.ph

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.12.4.2 by wakaba, Sun Nov 9 02:49:12 2003 UTC revision 1.12.4.3 by wakaba, Sat Mar 13 06:34:19 2004 UTC
# Line 1  Line 1 
1  use strict;  =head1 NAME
2    
3  ## URI (or part of URI) of Wiki CGI itself and its external addons  suikawiki-config.ph - SuikaWiki: Configuration for SuikaWiki HTTP CGI Driver
         ## Note: If your Wiki CGI URI is <http://foo.example/path/to/wiki.cgi>,  
         ##              cookie-path: /path/to/  
         ##              script-short-name: wiki.cgi  
         ##       URI parts MUST NOT contains "&" and/or non-URI characters.  
   our %uri = (  
     cookie_path         => '/~wakaba/-temp/wiki/',  
     external_script     => '../wiki/script/',  
     script_short_name   => 'wiki',  
     ## If you use CVS repository of WikiDatabase,  
     cvs_repository      => '/gate/cvs/suikawiki/wikidata/page/',  
   );  
   our $url_cgi; {  
     my $scheme = 'http';  
     $scheme = lc $1 if $main::ENV{SERVER_PROTOCOL} =~ m#([A-Za-z0-9+.%-]+)#;  
     $url_cgi = "$scheme://".($main::ENV{HTTP_HOST} || $main::ENV{SERVER_NAME}.($main::ENV{SERVER_PORT}==80?'':":$main::ENV{SERVER_PORT}"))."$uri{cookie_path}$uri{script_short_name}";  
   }  
   $uri{wiki_abs} = $url_cgi;  
   $uri{wiki} = qq($uri{cookie_path}$uri{script_short_name});      
4    
5  ## Path to modules and databases  =head1 DESCRIPTION
6    use lib 'lib';  
7    push @SuikaWiki::Plugin::plugin_directory, (  This is a configuration file for SuikaWiki Driver for HTTP CGI Script
8          q(lib/SuikaWiki/Plugin/),  (SWHCS).  Basic options such as WikiDB directory mapping and
9          q(misc/plugins/),  special purpose WikiPage names can be customized with this file.
10    );  
11    our %PathTo = (       ## Path to your data, from the main CGI script (NOT from this config script)  More complex customizing, e.g. modifying navigation bar or
12                   CachePrefix            => q(./wikidata/.cache.),  adding new mode, is also possible by config.ph (generated from
13                   TempPrefix             => q(./wikidata/.tmp.),  config.wp2) and WikiPlugin modules.  For more information,
14                   WikiDataBase   => q(./wikidata/page),  see <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>.
                  WikiDatabase           => q(./wikidata/page),  
                  WikiDatabaseErrorLog   => q(./wikidata/log/error.log),  
                  convert                => q(/usr/X11R6/bin/convert),  
   );  
   
 BEGIN {  
   require SuikaWiki::Output::CGICarp;  
   $SuikaWiki::Output::CGICarp::CUSTOM_REASON_TEXT = 'Internal WikiEngine Error';  
   CGI::Carp::set_message (sub {  
     my $msg = shift;  
     print STDOUT <<EOH  
 <!DOCTYPE html SYSTEM>  
 <title>$SuikaWiki::Output::CGICarp::CUSTOM_STATUS_CODE $SuikaWiki::Output::CGICarp::CUSTOM_REASON_TEXT</title>  
 <h1>$SuikaWiki::Output::CGICarp::CUSTOM_REASON_TEXT</h1>  
 <p>$msg</p>  
 EOH  
   });  
 }  
   
 require SuikaWiki::DB::Util::Lock;  
 our $locker = SuikaWiki::DB::Util::Lock->new (-directory => q(./wikidata/lock),  
    -name => 'wikipage',  
    -retry => ($main::ENV{HTTP_USER_AGENT} =~ m#Openbot/3# ? 2 : 20),  
    -timeout => 3000,  
    -error_handler => sub {  
      my ($self, %o) = @_;  
      if ($o{level} eq 'fatal') {  
        open LOG, '>>', $main::PathTo{WikiDatabaseErrorLog};  
          print LOG scalar (gmtime)."\@@{[time]} @{[$$]} {$o{level}}: ", $o{msg}, "\n";  
        close LOG;  
        die $o{msg};  
      }  
    });  
 $locker->lock or do {  
   open LOG, '>>', $main::PathTo{WikiDatabaseErrorLog};  
     print LOG scalar (time), " Can't lock\n";  
   close LOG;  
   print "Status: 423 Locked\n";  
   $SuikaWiki::Output::CGICarp::CUSTOM_STATUS_CODE = 423;  
   die "Can't lock --- already locked; please try again";  
 };  
15    
16    This file is part of SuikaWiki.
17    
18    =cut
19    
20    package wiki::driver::http;
21    use strict;
22    use Message::Util::Error;
23    
24    push our @Config, sub ($) {
25      my $WIKI = shift;
26      use Cwd qw(abs_path);
27      
28      ## -- Filesystem path mapping
29      for (
30         [db__cache__dir          => q"./wikidata/lock/"],
31         [db__cache_struct__file  => q"./wikidata/lock/struct.db"],
32         [db__content__dir        => q"./wikidata/page/"],
33         [db__content__error_log  => q"./wikidata/log/db-content.log"],
34         [db__bdb__home_dir       => q"./wikidata/lock/"],
35         [db__bdb__log_dir        => q"./wikidata/log/bdb/"],
36         [db__bdb__log_file       => q"./wikidata/log/bdb.log"],
37         [db__bdb__temp_dir       => q"./wikidata/lock/"],
38         [db__lock__dir           => q"./wikidata/lock/"],
39         [db__lock__log_file      => q"./wikidata/log/lock.log"],
40         [db__log__dir            => q"./wikidata/log/"],
41         [db__temp__dir           => q"./wikidata/lock/"],
42      ) {
43        ## On system that does not set current directory as main script
44        ## directory, you should specify it instead of using "abs_path".
45        $WIKI->{config}->{path_to}->{$_->[0]} = abs_path $_->[1];
46      }
47    
48      ## -- WikiPlugin
49      push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {
50        my $wiki = shift;
51        
52        ## Installed plugin modules
53        $wiki->{plugin}->load_directory (qw(
54          lib/SuikaWiki/Plugin/
55          misc/plugins/
56          misc/plugins/form/
57          misc/plugins/format/
58          misc/plugins/link/
59          misc/plugins/view/
60        ));
61        
62        ## Configuration file as pseudo-plugin module
63        require 'wikidata/config.ph';
64      };
65    
66      ## -- WikiDatabase: Mapping logical to physical
67      push @{$WIKI->{event}->{database_loaded}}, sub {
68          my $wiki = shift;
69          
70          ## Main content
71          $wiki->{db}->_set_prop_db (content => {-db_open => sub {
72            require SuikaWiki::DB::FileSystem::YukiWikiDBNS;
73            SuikaWiki::DB::FileSystem::YukiWikiDBNS->new
74              (directory => $wiki->{config}->{path_to}->{db__content__dir},
75               logfile   => $wiki->{config}->{path_to}->{db__content__error_log},
76               suffix    => '.txt',
77               -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
78          }, -db_close => sub {
79            my %opt = @_;
80            $opt{prop_info}->{-db}->close;
81            delete $opt{prop_info}->{-db};
82          }});
83          
84          ## Last modified
85          $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
86            require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
87            SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
88              (directory => $wiki->{config}->{path_to}->{db__content__dir},
89               -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
90          }, -prop => 'last_modified', -db_close => sub {
91            my %opt = @_;
92            $opt{prop_info}->{-db}->close;
93            delete $opt{prop_info}->{-db};
94          }});
95          
96          ## Cache DBs
97          require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
98          my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
99                (directory => $wiki->{config}->{path_to}->{db__cache__dir});
100          $wiki->{db}->_set_prop_db (m__search_result =>
101            {-db => $cachedb, -prop => 'search_result', -db_close => sub {
102              my %opt = @_;
103              $opt{prop_info}->{-db}->close;
104              delete $opt{prop_info}->{-db};
105            }});
106          $wiki->{db}->_set_prop_db (wpp__headsummary =>
107            {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
108              my %opt = @_;
109              $opt{prop_info}->{-db}->close;
110              delete $opt{prop_info}->{-db};
111            }});
112          $wiki->{db}->_set_prop_db (ref__item_template =>
113            {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
114              my %opt = @_;
115              $opt{prop_info}->{-db}->close;
116              delete $opt{prop_info}->{-db};
117            }});
118          
119          ## Berkely DB Environment Preparation
120          use BerkeleyDB;
121          my $bdbenv = new BerkeleyDB::Env
122             -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir},
123             -Config => {
124               DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir},
125               DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir},
126               DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir},
127             },
128             -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file},
129             -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL,
130             -Verbose => $wiki->{config}->{debug}->{db};
131    
132          $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub {
133            require SuikaWiki::DB::Hash;
134            new SuikaWiki::DB::Hash constructor => sub {
135              use MLDBM qw(BerkeleyDB::Hash);# Storable);
136              tie my %mldb, 'MLDBM',
137                            -Filename => $wiki->{config}->{path_to}
138                                              ->{db__cache_struct__file},
139                            -Env => $bdbenv,
140                            -Flags => DB_CREATE,
141                            -Mode => 0644;
142              \%mldb;
143           };
144          }});
145          
146          ## Referer Database (See Referer plugin module)
147          $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
148            require SuikaWiki::DB::Hash;
149            new SuikaWiki::DB::Hash constructor => sub {
150              tie my %db, 'BerkeleyDB::Hash',
151                            -Filename => 'referer.db',
152                            -Env => $bdbenv,
153                            -Flags => DB_CREATE,
154                            -Mode => 0644;
155              \%db;
156           };
157          }});
158    
159          ## HTTP Request Logging Database (See RequestLog plugin module)
160          $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
161            require SuikaWiki::DB::Hash;
162            new SuikaWiki::DB::Hash constructor => sub {
163              tie my %db, 'BerkeleyDB::Hash',
164                            -Filename => 'http-request-log.db',
165                            -Env => $bdbenv,
166                            -Flags => DB_CREATE,
167                            -Mode => 0644;
168              \%db;
169           };
170          }});
171          
172          ## Additional WikiDB properties should be defined here
173          # ...    
174      };
175    
176      push @{$WIKI->{event}->{input_close}}, sub {
177        my ($wiki, $event) = @_;
178        try {
179          SuikaWiki::Plugin->module_package ('Referer')
180                         ->add_referer (wiki => $wiki,
181                                        uri => $wiki->{input}->meta_variable
182                                                 ('HTTP_REFERER'));
183        } catch SuikaWiki::Plugin::error with {
184          my $err = shift;
185          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
186        };
187        try {
188          SuikaWiki::Plugin->module_package ('RequestLog')
189                         ->http_request_log (wiki => $wiki,
190                                             prop => 'log__http_request');
191        } catch SuikaWiki::Plugin::error with {
192          my $err = shift;
193          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
194        };
195      };
196    
197      ## -- WikiName of special purpose WikiPages
198      $WIKI->{config}->{page} = {
199        Default         => $WIKI->name ([qw/HomePage/]),
200        InterWikiName   => $WIKI->name ([qw/Wiki InterWikiName/]),
201        NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
202        'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
203      };
204      
205      ## -- WikiNamespace constants
206      $WIKI->{config}->{name}->{space} = {
207        separator => '//',
208        separator_reg => qr#\s*//\s*#,
209        self => '.',
210        parent => '..',
211      };
212      
213      ## -- Default character codes
214      $WIKI->{config}->{charset} = {
215        ## Internal code - MUST be ASCII + 8bit coding scheme
216          internal => 'euc-jp',
217        ## Default output code
218          output => 'iso-2022-jp',
219        ## "query" part in URI reference
220          uri_query => '', # auto-detected
221          uri_query_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
222          uri_param => '', # auto-detected
223          uri_param_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
224        ## PATH_INFO part in URI reference
225          uri_path_info => 'x-utf-8-10646', ## Reserved for future use
226        ## Fragment identifier in URI reference
227          uri_fragment => 'x-punycode',     ## Reserved for possible future use
228      };
229      
230      ## -- Expires duration templates
231      $WIKI->{config}->{entity}->{expires} = {
232        edit      => {delta => 60},
233        view      => {delta => 2*3600},
234        lm_flaged => {delta => 30*24*3600},
235        stylesheet => {delta => 30*24*3600},
236        error     => {delta => 60},
237      };
238    
239      ## -- Debug mode
240      $WIKI->{config}->{debug} = {
241        general => 0,
242        db => 0,
243        format => 0,
244        view => 0,
245      };
246    
 ## Type of WikiPage Database  
   #our $modifier_dbtype = 'AnyDBM_File';  # Fast, not available on some server, page size limited.  
   #our $modifier_dbtype = 'dbmopen';      # Fast, not available on some server, page size limited.  
   #our $modifier_dbtype = 'Yuki::YukiWikiDB';     # Slow, available on all environment.  
   #our $modifier_dbtype = 'Yuki::YukiWikiDB2';     # Slow, available on all environment.  
   our $modifier_dbtype = 'Yuki::YukiWikiDBMeta';     # Slow, available on all environment.  
   our $use_exists = 1; # If you can use 'exists' method for your DB.  
   
 ## Name of Special WikiPage (linked as parts of navigations)  
   our %PageName = (  
     FrontPage   => 'HomePage',  
     IndexPage   => 'IndexPage',  
     InterWikiName       => 'Wiki//InterWikiName',  
     SearchPage  => 'Wiki//Page//Search',  
     CreatePage  => 'Wiki//Page//Create',  
     MenuBar     => 'Wiki//MenuBar',  
     RecentChanges       => 'RecentChanges',  
     RefererDontRecord   => 'Wiki//Referer//IgnoreSite',  
     RefererSiteName     => 'Wiki//Referer//SiteName',  
     ResourceNS  => 'Wiki//Resource//',  
     StyleList   => 'Wiki//Style//List//',  
     UserAgentList       => 'Wiki//UserAgentList',  
     AdminSpecialPage    => "\x11\x11Admin\x11Special\x11Page\x11\x11",  
   );  
   
 ## (Should be reimplemented)  
   our $kanjicode = 'euc';  
   our $lang = 'ja';  
   
 ## Misc. options  
   $SuikaWiki::Plugin::UserAgent::LoggingName = 1;  
         ## Use UA-name log? (require UserAgent plugin module)  
   
 ## Definition of views  
   
 require SuikaWiki::View;  
 SuikaWiki::View->template ('links')->add_line (<<'EOH');  
 %link-wiki(page=>"Wiki//News",rel=>News,class=>wiki,title=>"%res(name=>GoToWikiNewsLink);"p);  
 %link-wiki(page=>"Wiki//Help",rel=>help,class=>wiki,title=>"%res(name=>GoToWikiHelpLink);"p);  
 %link-wiki(page=>"Wiki//Page//License",rel=>copyright,class=>wiki,title=>"%res(name=>GoToWikiPageLicenseLink);"p);  
 EOH  
   
 SuikaWiki::View->template ('navbar')->add_line (<<"EOH");  
 %anchor-wiki(mode=>edit,rel=>edit,class=>wiki-cmd,label=>"%res(name=>EditThisPage);"p,title=>"%res(name=>EditThisPageLong);"p,accesskey=>E,add-param=>{#edit});  
 %anchor-wiki(rel=>view,up_to_date,class=>wiki-cmd,label=>"%res(name=>ViewThisPage);"p,title=>"%res(name=>ViewThisPageLong);"p);  
 %anchor-wiki(page=>{$main::PageName{CreatePage}},class=>wiki,label=>"%res(name=>GoToCreatePage);"p,title=>"%res(name=>GoToCreatePageLong);"p);  
 %anchor-wiki(page=>{$main::PageName{SearchPage}},class=>wiki,label=>"%res(name=>GoToSearchPage);"p,title=>"%res(name=>GoToSearchPageLong);"p);  
 %anchor-wiki(mode=>RandomJump,up-to-date,rel=>lucky,class=>"wiki randomlink",label=>"%res(name=>GoSomewhere);"p,title=>"%res(name=>GoSomewhereLong);"p);  
 %anchor-wiki(page=>{$main::PageName{RecentChanges}},class=>wiki,label=>"%res(name=>GoToRecentChanges);"p,title=>"%res(name=>GoToRecentChangesLong,safe);"p);  
 EOH  
   
 push @{$SuikaWiki::Plugin::On{Load}}, sub {  
   SuikaWiki::View->definition ('read')->property (template => <<'EOH');  
 %html-document(title=>{%res(name=>{View:WebPageTitle});}p,link-meta=>{%predefined-template(name=>links);}p,content=>{  
   %section(level=>1,add-to-toc=>0,type=>body,title=>{%ns-short-page-name;}p,heading,content=>{  
     %section(id=>tools1,class=>tools,add-to-toc=>0,content=>{%predefined-template(name=>navbar);}p);  
     %section(level=>2,id=>read,add-to-toc=>0,content=>{  
       %if-calender(month,true=>{  
         %format(context=>form_input,template=>{%calender;});  
       },false=>{  
         %if-calender(true=>{  
           %format(context=>form_input,template=>{%calender-months;});  
         });  
       });  
       %read(comment);  
     }p);  
     %section(level=>2,id=>children,title=>{%res(name=>{Children:Title});}p,heading,  
     content=>{%page-list(ns=>{%page-name;}p,recursive=>0,type=>both,template=>{%res(name=>{Children:Item});}p);}p);  
     %section(level=>2,id=>see-also,title=>{%res(name=>SeeAlso);}p,heading,content=>{%search-result;}p);  
     %section(level=>2,id=>referer,title=>{%res(name=>Referer);}p,heading,content=>{%referer-list;}p);  
     %section(level=>2,id=>toc,title=>{%res(name=>{TOC:Title});}p,heading,add_to_toc=>0,content=>{%toc(drag);}p);  
     %section(id=>last-modified,add_to_toc=>0,content=>{%res(name=>{LastModified=});%last-modified;}p);  
     %section(class=>tools,add_to_toc=>0,content=>{%predefined-template(name=>navbar);}p);  
     %section(id=>footer,add-to-toc=>0,content=>{%predefined-template(name=>footer);}p);  
   }p);  
 }p);%log-hotness;  
 EOH  
   SuikaWiki::View->definition ('-wrote')->property (template => SuikaWiki::View->definition ('-wrote')->property ('template').q(%log-hotness(weight=>2);));  
   SuikaWiki::View->definition ('WithMenu')->property (template => SuikaWiki::View->definition ('WithMenu')->property ('template').q(%log-hotness;));  
247  };  };
248    
249  =head1 NAME  =head1 SEE ALSO
250    
251  suikawiki-config.ph --- SuikaWiki: site configuration script  C<lib/suikawiki.pl>, C<wiki.cgi>,
252    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
253    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
254    
255  =head1 LICENSE  =head1 LICENSE
256    
257  Copyright 2003 Wakaba <w@suika.fam.cx>  Copyright 2003-2004 Wakaba <w@suika.fam.cx>.  All rights reserved.
258    
259  This program is free software; you can redistribute it and/or  This program is free software; you can redistribute it and/or
260  modify it under the same terms as Perl itself.  modify it under the same terms as Perl itself.

Legend:
Removed from v.1.12.4.2  
changed lines
  Added in v.1.12.4.3

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24