/[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 by wakaba, Sun Oct 5 11:57:09 2003 UTC revision 1.12.4.4 by wakaba, Sat Mar 13 13:16:59 2004 UTC
# Line 1  Line 1 
1    =head1 NAME
2    
3    suikawiki-config.ph - SuikaWiki: Configuration for SuikaWiki HTTP CGI Driver
4    
5    =head1 DESCRIPTION
6    
7    This is a configuration file for SuikaWiki Driver for HTTP CGI Script
8    (SWHCS).  Basic options such as WikiDB directory mapping and
9    special purpose WikiPage names can be customized with this file.
10    
11    More complex customizing, e.g. modifying navigation bar or
12    adding new mode, is also possible by config.ph (generated from
13    config.wp2) and WikiPlugin modules.  For more information,
14    see <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>.
15    
16    This file is part of SuikaWiki.
17    
18    =cut
19    
20    package wiki::driver::http;
21  use strict;  use strict;
22    
23  ## URI (or part of URI) of Wiki CGI itself and its external addons    ## These lines should be removed after utf8 support
24          ## Note: If your Wiki CGI URI is <http://foo.example/path/to/wiki.cgi>,    BEGIN {
25          ##              cookie-path: /path/to/      $Message::Util::Formatter::Base::Token = qr/[\w._+\x80-\xFF-]+/;
26          ##              script-short-name: wiki.cgi      require Message::Util::Formatter::Base;
         ##       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}";  
27    }    }
   $uri{wiki_abs} = $url_cgi;  
   $uri{wiki} = qq($uri{cookie_path}$uri{script_short_name});      
   
 ## Path to modules and databases  
   push @main::INC, 'lib';  
   push @SuikaWiki::Plugin::plugin_directory, (  
         q(lib/SuikaWiki/Plugin/),  
         q(misc/plugins/),  
   );  
   our %PathTo = (       ## Path to your data, from the main CGI script (NOT from this config script)  
                  CachePrefix            => q(./wikidata/.cache.),  
                  TempPrefix             => q(./wikidata/.tmp.),  
                  WikiDataBase   => q(./wikidata/page),  
                  WikiDatabase           => q(./wikidata/page),  
                  WikiDatabaseErrorLog   => q(./wikidata/log/error.log),  
                  convert                => q(/usr/X11R6/bin/convert),  
   );  
   
 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 : 80),  
    -timeout => 300,                                          
    -error_handler => sub {  
      my ($self, %o) = @_;  
        open LOG, '>>', $main::PathTo{WikiDatabaseErrorLog};  
          print LOG scalar (gmtime)."\@@{[time]} @{[$$]} {$o{level}}: ", $o{msg}, "\n";  
        close LOG;  
      if ($o{level} eq 'fatal') {  
        die $o{msg};  
      }  
    });  
 $locker->lock or do {  
   open LOG, '>>', $main::PathTo{WikiDatabaseErrorLog};  
     print LOG scalar (time), " Can't lock\n";  
   close LOG;  
   die "Can't lock";  
 };  
28    
29    use Message::Util::Error;
30    push our @Config, sub ($) {
31      my $WIKI = shift;
32      use Cwd qw(abs_path);
33      
34      ## -- Filesystem path mapping
35      for (
36         [db__cache__dir          => q"./wikidata/lock/"],
37         [db__cache_struct__file  => q"./wikidata/lock/struct.db"],
38         [db__content__dir        => q"./wikidata/page/"],
39         [db__content__error_log  => q"./wikidata/log/db-content.log"],
40         [db__bdb__home_dir       => q"./wikidata/lock/"],
41         [db__bdb__log_dir        => q"./wikidata/log/bdb/"],
42         [db__bdb__log_file       => q"./wikidata/log/bdb.log"],
43         [db__bdb__temp_dir       => q"./wikidata/lock/"],
44         [db__lock__dir           => q"./wikidata/lock/"],
45         [db__lock__log_file      => q"./wikidata/log/lock.log"],
46         [db__log__dir            => q"./wikidata/log/"],
47         [db__temp__dir           => q"./wikidata/lock/"],
48      ) {
49        ## On system that does not set current directory as main script
50        ## directory, you should specify it instead of using "abs_path".
51        $WIKI->{config}->{path_to}->{$_->[0]} = abs_path $_->[1];
52      }
53    
54      ## -- WikiPlugin
55      push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {
56        my $wiki = shift;
57        
58        ## Installed plugin modules
59        $wiki->{plugin}->load_directory (qw(
60          lib/SuikaWiki/Plugin/
61          misc/plugins/
62          misc/plugins/form/
63          misc/plugins/format/
64          misc/plugins/link/
65          misc/plugins/view/
66        ));
67    
68        ## Configuration file as pseudo-plugin module
69        require 'wikidata/config.ph';
70      };
71    
72      ## -- WikiDatabase: Mapping logical to physical
73      push @{$WIKI->{event}->{database_loaded}}, sub {
74          my $wiki = shift;
75          
76          ## Main content
77          $wiki->{db}->_set_prop_db (content => {-db_open => sub {
78            require SuikaWiki::DB::FileSystem::YukiWikiDBNS;
79            SuikaWiki::DB::FileSystem::YukiWikiDBNS->new
80              (directory => $wiki->{config}->{path_to}->{db__content__dir},
81               logfile   => $wiki->{config}->{path_to}->{db__content__error_log},
82               suffix    => '.txt',
83               -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
84          }, -db_close => sub {
85            my %opt = @_;
86            $opt{prop_info}->{-db}->close;
87            delete $opt{prop_info}->{-db};
88          }});
89          
90          ## Last modified
91          $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
92            require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
93            SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
94              (directory => $wiki->{config}->{path_to}->{db__content__dir},
95               -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
96          }, -prop => 'last_modified', -db_close => sub {
97            my %opt = @_;
98            $opt{prop_info}->{-db}->close;
99            delete $opt{prop_info}->{-db};
100          }});
101          
102          ## Cache DBs
103          require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
104          my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
105                (directory => $wiki->{config}->{path_to}->{db__cache__dir});
106          $wiki->{db}->_set_prop_db (m__search_result =>
107            {-db => $cachedb, -prop => 'search_result', -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 (wpp__headsummary =>
113            {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
114              my %opt = @_;
115              $opt{prop_info}->{-db}->close;
116              delete $opt{prop_info}->{-db};
117            }});
118          $wiki->{db}->_set_prop_db (ref__item_template =>
119            {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
120              my %opt = @_;
121              $opt{prop_info}->{-db}->close;
122              delete $opt{prop_info}->{-db};
123            }});
124    
125          ## Berkely DB Environment Preparation
126          use BerkeleyDB;
127          my $bdbenv = new BerkeleyDB::Env
128             -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir},
129             -Config => {
130               DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir},
131               DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir},
132               DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir},
133             },
134             -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file},
135             -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL,
136             -Verbose => $wiki->{config}->{debug}->{db};
137    
138          $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub {
139            require SuikaWiki::DB::Hash;
140            new SuikaWiki::DB::Hash constructor => sub {
141              use MLDBM qw(BerkeleyDB::Hash);# Storable);
142              tie my %mldb, 'MLDBM',
143                            -Filename => $wiki->{config}->{path_to}
144                                              ->{db__cache_struct__file},
145                            -Env => $bdbenv,
146                            -Flags => DB_CREATE,
147                            -Mode => 0644;
148              \%mldb;
149           };
150          }});
151          
152          ## Referer Database (See Referer plugin module)
153          $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
154            require SuikaWiki::DB::Hash;
155            new SuikaWiki::DB::Hash constructor => sub {
156              tie my %db, 'BerkeleyDB::Hash',
157                            -Filename => 'referer.db',
158                            -Env => $bdbenv,
159                            -Flags => DB_CREATE,
160                            -Mode => 0644;
161              \%db;
162           };
163          }});
164    
165          ## HTTP Request Logging Database (See RequestLog plugin module)
166          $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
167            require SuikaWiki::DB::Hash;
168            new SuikaWiki::DB::Hash constructor => sub {
169              tie my %db, 'BerkeleyDB::Hash',
170                            -Filename => 'http-request-log.db',
171                            -Env => $bdbenv,
172                            -Flags => DB_CREATE,
173                            -Mode => 0644;
174              \%db;
175           };
176          }});
177          
178          ## Additional WikiDB properties should be defined here
179          # ...    
180      };
181    
182      push @{$WIKI->{event}->{input_close}}, sub {
183        my ($wiki, $event) = @_;
184        try {
185          SuikaWiki::Plugin->module_package ('Referer')
186                         ->add_referer (wiki => $wiki,
187                                        uri => $wiki->{input}->meta_variable
188                                                 ('HTTP_REFERER'));
189        } catch SuikaWiki::Plugin::error with {
190          my $err = shift;
191          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
192        };
193        try {
194          SuikaWiki::Plugin->module_package ('RequestLog')
195                         ->http_request_log (wiki => $wiki,
196                                             prop => 'log__http_request');
197        } catch SuikaWiki::Plugin::error with {
198          my $err = shift;
199          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
200        };
201      };
202    
203      ## -- WikiName of special purpose WikiPages
204      $WIKI->{config}->{page} = {
205        Default         => $WIKI->name ([qw/HomePage/]),
206        InterWikiName   => $WIKI->name ([qw/Wiki InterWikiName/]),
207        NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
208        'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
209      };
210      
211      ## -- WikiNamespace constants
212      $WIKI->{config}->{name}->{space} = {
213        separator => '//',
214        separator_reg => qr#\s*//\s*#,
215        self => '.',
216        parent => '..',
217      };
218      
219      ## -- Default character codes
220      $WIKI->{config}->{charset} = {
221        ## Internal code - MUST be ASCII + 8bit coding scheme
222          internal => 'euc-jp',
223        ## Default output code
224          output => 'iso-2022-jp',
225        ## "query" part in URI reference
226          uri_query => '', # auto-detected
227          uri_query_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
228          uri_param => '', # auto-detected
229          uri_param_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
230        ## PATH_INFO part in URI reference
231          uri_path_info => 'x-utf-8-10646', ## Reserved for future use
232        ## Fragment identifier in URI reference
233          uri_fragment => 'x-punycode',     ## Reserved for possible future use
234      };
235      
236      ## -- Expires duration templates
237      $WIKI->{config}->{entity}->{expires} = {
238        edit      => {delta => 60},
239        view      => {delta => 2*3600},
240        lm_flaged => {delta => 30*24*3600},
241        stylesheet => {delta => 30*24*3600},
242        error     => {delta => 60},
243      };
244    
245      ## -- Debug mode
246      $WIKI->{config}->{debug} = {
247        general => 0,
248        db => 0,
249        format => 0,
250        view => 0,
251      };
252    
 ## 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;));  
253  };  };
254    
255  =head1 NAME  =head1 SEE ALSO
256    
257  suikawiki-config.ph --- SuikaWiki: site configuration script  C<lib/suikawiki.pl>, C<wiki.cgi>,
258    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
259    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
260    
261  =head1 LICENSE  =head1 LICENSE
262    
263  Copyright 2003 Wakaba <w@suika.fam.cx>  Copyright 2003-2004 Wakaba <w@suika.fam.cx>.  All rights reserved.
264    
265  This program is free software; you can redistribute it and/or  This program is free software; you can redistribute it and/or
266  modify it under the same terms as Perl itself.  modify it under the same terms as Perl itself.

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.12.4.4

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24