/[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.13 by wakaba, Thu Apr 1 04:53:58 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
   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";  
 };  
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;
22    
23      ## These lines should be removed after utf8 support
24      BEGIN {
25        $Message::Util::Formatter::Base::Token = qr/[\w._+\x80-\xFF-]+/;
26        require Message::Util::Formatter::Base;
27      }
28      use Message::Util::Error;
29    
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         [namazu__index_dir       => q"/var/namazu/index/suikawiki"],
49      ) {
50        ## On system that does not set current directory as main script
51        ## directory, you should specify it instead of using "abs_path".
52        $WIKI->{config}->{path_to}->{$_->[0]} = abs_path $_->[1];
53      }
54      
55      ## -- Namazu URI Mapping (See SuikaWiki:SuikaWiki//Namazu) --
56      $WIKI->{config}->{nmz__uri_to_uri} = sub {
57        my ($nmzuri, %opt) = @_;
58        if ($nmzuri =~ s!^\Q$opt{o}->{wiki}->{config}->{path_to}->{db__content__dir}\E/*!!o) {
59          $nmzuri =~ s/\.txt$//;
60          return $opt{o}->{wiki}->uri_reference
61                          (page => $opt{o}->{wiki}->name ([
62            map {s/([0-9A-F][0-9A-F])/pack 'C', hex $1/ge; $_}
63            split m!\.ns/!, $nmzuri
64          ]), base => 1);
65        } else {
66          $nmzuri =~ s<^/home/wakaba/public_html/([^.]+)><http://suika.fam.cx/~wakaba/$1>;
67          return ($nmzuri, $nmzuri);
68        }
69      };
70    
71      ## -- WikiPlugin
72      push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {
73        my $wiki = shift;
74        
75        ## Installed plugin modules
76        $wiki->{plugin}->load_directory (qw(
77          lib/SuikaWiki/Plugin/
78          misc/plugins/
79          misc/plugins/form/
80          misc/plugins/format/
81          misc/plugins/link/
82          misc/plugins/view/
83        ));
84    
85        ## Configuration file as pseudo-plugin module
86        require 'wikidata/config.ph';
87      };
88    
89      ## -- WikiDatabase: Mapping logical to physical
90      push @{$WIKI->{event}->{database_loaded}}, sub {
91          my $wiki = shift;
92          
93          ## Main content
94          $wiki->{db}->_set_prop_db (content => {-db_open => sub {
95            require SuikaWiki::DB::FileSystem::YukiWikiDBNS;
96            SuikaWiki::DB::FileSystem::YukiWikiDBNS->new
97              (directory => $wiki->{config}->{path_to}->{db__content__dir},
98               logfile   => $wiki->{config}->{path_to}->{db__content__error_log},
99               suffix    => '.txt',
100               root_key  => $wiki->{config}->{page}->{Default},
101               -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
102          }, -db_close => sub {
103            my %opt = @_;
104            $opt{prop_info}->{-db}->close;
105            delete $opt{prop_info}->{-db};
106          }});
107          
108          ## Last modified
109          $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
110            require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
111            SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
112              (directory => $wiki->{config}->{path_to}->{db__content__dir},
113               -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
114          }, -prop => 'last_modified', -db_close => sub {
115            my %opt = @_;
116            $opt{prop_info}->{-db}->close;
117            delete $opt{prop_info}->{-db};
118          }});
119          
120          ## Cache DBs
121          require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
122          my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
123                (directory => $wiki->{config}->{path_to}->{db__cache__dir},
124                 expires => 86400 * 3, removes => 86400 * 3); # 3 days
125          $wiki->{db}->_set_prop_db (m__search_result =>
126            {-db => $cachedb, -prop => 'search_result', -db_close => sub {
127              my %opt = @_;
128              $opt{prop_info}->{-db}->close;
129              delete $opt{prop_info}->{-db};
130            }});
131          $wiki->{db}->_set_prop_db (wpp__headsummary =>
132            {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
133              my %opt = @_;
134              $opt{prop_info}->{-db}->close;
135              delete $opt{prop_info}->{-db};
136            }});
137          $wiki->{db}->_set_prop_db (ref__item_template =>
138            {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
139              my %opt = @_;
140              $opt{prop_info}->{-db}->close;
141              delete $opt{prop_info}->{-db};
142            }});
143    
144          ## Berkely DB Environment Preparation
145          use BerkeleyDB;
146          my $bdbenv = new BerkeleyDB::Env
147             -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir},
148             -Config => {
149               DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir},
150               DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir},
151               DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir},
152             },
153             -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file},
154             -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL,
155             -Verbose => $wiki->{config}->{debug}->{db};
156    
157          $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub {
158            require SuikaWiki::DB::Hash;
159            new SuikaWiki::DB::Hash constructor => sub {
160              use MLDBM qw(BerkeleyDB::Hash);# Storable);
161              tie my %mldb, 'MLDBM',
162                            -Filename => $wiki->{config}->{path_to}
163                                              ->{db__cache_struct__file},
164                            -Env => $bdbenv,
165                            -Flags => DB_CREATE,
166                            -Mode => 0644;
167              \%mldb;
168           };
169          }});
170          
171          ## Referer Database (See Referer plugin module)
172          $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
173            require SuikaWiki::DB::Hash;
174            new SuikaWiki::DB::Hash constructor => sub {
175              tie my %db, 'BerkeleyDB::Hash',
176                            -Filename => 'referer.db',
177                            -Env => $bdbenv,
178                            -Flags => DB_CREATE,
179                            -Mode => 0644;
180              \%db;
181           };
182          }});
183    
184          ## HTTP Request Logging Database (See RequestLog plugin module)
185          $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
186            require SuikaWiki::DB::Hash;
187            new SuikaWiki::DB::Hash constructor => sub {
188              tie my %db, 'BerkeleyDB::Hash',
189                            -Filename => 'http-request-log.db',
190                            -Env => $bdbenv,
191                            -Flags => DB_CREATE,
192                            -Mode => 0644;
193              \%db;
194           };
195          }});
196          
197          ## Additional WikiDB properties should be defined here
198          # ...    
199      };
200    
201      push @{$WIKI->{event}->{input_close}}, sub {
202        my ($wiki, $event) = @_;
203        try {
204          SuikaWiki::Plugin->module_package ('Referer')
205                         ->add_referer (wiki => $wiki,
206                                        uri => $wiki->{input}->meta_variable
207                                                 ('HTTP_REFERER'));
208        } catch SuikaWiki::Plugin::error with {
209          my $err = shift;
210          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
211        };
212        try {
213          SuikaWiki::Plugin->module_package ('RequestLog')
214                         ->http_request_log (wiki => $wiki,
215                                             prop => 'log__http_request');
216        } catch SuikaWiki::Plugin::error with {
217          my $err = shift;
218          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
219        };
220      };
221    
222      ## -- WikiName of special purpose WikiPages
223      $WIKI->{config}->{page} = {
224        Default         => $WIKI->name ([qw/HomePage/]),
225        InterWikiName   => $WIKI->name ([qw/Wiki InterWikiName/]),
226        NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
227        'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
228      };
229      
230      ## -- WikiNamespace constants
231      $WIKI->{config}->{name}->{space} = {
232        separator => '//',
233        separator_reg => qr#\s*//\s*#,
234        self => '.',
235        parent => '..',
236        root => '//',
237      };
238      
239      ## -- Default character codes
240      $WIKI->{config}->{charset} = {
241        ## Internal code - MUST be ASCII + 8bit coding scheme
242          internal => 'euc-jp',
243        ## Default output code
244          output => 'iso-2022-jp',
245        ## "query" part in URI reference
246          uri_query => '', # auto-detected
247          uri_query_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
248          uri_param => '', # auto-detected
249          uri_param_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
250        ## PATH_INFO part in URI reference
251          uri_path_info => 'x-utf-8-10646', ## Reserved for future use
252        ## Fragment identifier in URI reference
253          uri_fragment => 'x-punycode',     ## Reserved for possible future use
254      };
255      
256      ## -- Expires duration templates
257      $WIKI->{config}->{entity}->{expires} = {
258        edit      => {delta => 60},
259        view      => {delta => 2*3600},
260        list      => {delta => 60},
261        lm_flaged => {delta => 30*24*3600},
262        stylesheet => {delta => 30*24*3600},
263        error     => {delta => 60},
264      };
265    
266      ## -- Debug mode
267      $WIKI->{config}->{debug} = {
268        general => 0,
269        db => 0,
270        format => 0,
271        view => 0,
272      };
273    
 ## 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;));  
274  };  };
275    
276  =head1 NAME  =head1 SEE ALSO
277    
278  suikawiki-config.ph --- SuikaWiki: site configuration script  C<lib/suikawiki.pl>, C<wiki.cgi>,
279    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
280    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
281    
282  =head1 LICENSE  =head1 LICENSE
283    
284  Copyright 2003 Wakaba <w@suika.fam.cx>  Copyright 2003-2004 Wakaba <w@suika.fam.cx>.  All rights reserved.
285    
286  This program is free software; you can redistribute it and/or  This program is free software; you can redistribute it and/or
287  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.13

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24