/[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.6 by wakaba, Mon Mar 29 03:23:15 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               -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
101          }, -db_close => sub {
102            my %opt = @_;
103            $opt{prop_info}->{-db}->close;
104            delete $opt{prop_info}->{-db};
105          }});
106          
107          ## Last modified
108          $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
109            require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
110            SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
111              (directory => $wiki->{config}->{path_to}->{db__content__dir},
112               -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
113          }, -prop => 'last_modified', -db_close => sub {
114            my %opt = @_;
115            $opt{prop_info}->{-db}->close;
116            delete $opt{prop_info}->{-db};
117          }});
118          
119          ## Cache DBs
120          require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
121          my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
122                (directory => $wiki->{config}->{path_to}->{db__cache__dir},
123                 expires => 86400 * 3, removes => 86400 * 3); # 3 days
124          $wiki->{db}->_set_prop_db (m__search_result =>
125            {-db => $cachedb, -prop => 'search_result', -db_close => sub {
126              my %opt = @_;
127              $opt{prop_info}->{-db}->close;
128              delete $opt{prop_info}->{-db};
129            }});
130          $wiki->{db}->_set_prop_db (wpp__headsummary =>
131            {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
132              my %opt = @_;
133              $opt{prop_info}->{-db}->close;
134              delete $opt{prop_info}->{-db};
135            }});
136          $wiki->{db}->_set_prop_db (ref__item_template =>
137            {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
138              my %opt = @_;
139              $opt{prop_info}->{-db}->close;
140              delete $opt{prop_info}->{-db};
141            }});
142    
143          ## Berkely DB Environment Preparation
144          use BerkeleyDB;
145          my $bdbenv = new BerkeleyDB::Env
146             -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir},
147             -Config => {
148               DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir},
149               DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir},
150               DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir},
151             },
152             -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file},
153             -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL,
154             -Verbose => $wiki->{config}->{debug}->{db};
155    
156          $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub {
157            require SuikaWiki::DB::Hash;
158            new SuikaWiki::DB::Hash constructor => sub {
159              use MLDBM qw(BerkeleyDB::Hash);# Storable);
160              tie my %mldb, 'MLDBM',
161                            -Filename => $wiki->{config}->{path_to}
162                                              ->{db__cache_struct__file},
163                            -Env => $bdbenv,
164                            -Flags => DB_CREATE,
165                            -Mode => 0644;
166              \%mldb;
167           };
168          }});
169          
170          ## Referer Database (See Referer plugin module)
171          $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
172            require SuikaWiki::DB::Hash;
173            new SuikaWiki::DB::Hash constructor => sub {
174              tie my %db, 'BerkeleyDB::Hash',
175                            -Filename => 'referer.db',
176                            -Env => $bdbenv,
177                            -Flags => DB_CREATE,
178                            -Mode => 0644;
179              \%db;
180           };
181          }});
182    
183          ## HTTP Request Logging Database (See RequestLog plugin module)
184          $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
185            require SuikaWiki::DB::Hash;
186            new SuikaWiki::DB::Hash constructor => sub {
187              tie my %db, 'BerkeleyDB::Hash',
188                            -Filename => 'http-request-log.db',
189                            -Env => $bdbenv,
190                            -Flags => DB_CREATE,
191                            -Mode => 0644;
192              \%db;
193           };
194          }});
195          
196          ## Additional WikiDB properties should be defined here
197          # ...    
198      };
199    
200      push @{$WIKI->{event}->{input_close}}, sub {
201        my ($wiki, $event) = @_;
202        try {
203          SuikaWiki::Plugin->module_package ('Referer')
204                         ->add_referer (wiki => $wiki,
205                                        uri => $wiki->{input}->meta_variable
206                                                 ('HTTP_REFERER'));
207        } catch SuikaWiki::Plugin::error with {
208          my $err = shift;
209          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
210        };
211        try {
212          SuikaWiki::Plugin->module_package ('RequestLog')
213                         ->http_request_log (wiki => $wiki,
214                                             prop => 'log__http_request');
215        } catch SuikaWiki::Plugin::error with {
216          my $err = shift;
217          $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
218        };
219      };
220    
221      ## -- WikiName of special purpose WikiPages
222      $WIKI->{config}->{page} = {
223        Default         => $WIKI->name ([qw/HomePage/]),
224        InterWikiName   => $WIKI->name ([qw/Wiki InterWikiName/]),
225        NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
226        'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
227      };
228      
229      ## -- WikiNamespace constants
230      $WIKI->{config}->{name}->{space} = {
231        separator => '//',
232        separator_reg => qr#\s*//\s*#,
233        self => '.',
234        parent => '..',
235      };
236      
237      ## -- Default character codes
238      $WIKI->{config}->{charset} = {
239        ## Internal code - MUST be ASCII + 8bit coding scheme
240          internal => 'euc-jp',
241        ## Default output code
242          output => 'iso-2022-jp',
243        ## "query" part in URI reference
244          uri_query => '', # auto-detected
245          uri_query_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
246          uri_param => '', # auto-detected
247          uri_param_encode => 'euc-jp',     ## For compatibility w/ SuikaWiki 2
248        ## PATH_INFO part in URI reference
249          uri_path_info => 'x-utf-8-10646', ## Reserved for future use
250        ## Fragment identifier in URI reference
251          uri_fragment => 'x-punycode',     ## Reserved for possible future use
252      };
253      
254      ## -- Expires duration templates
255      $WIKI->{config}->{entity}->{expires} = {
256        edit      => {delta => 60},
257        view      => {delta => 2*3600},
258        lm_flaged => {delta => 30*24*3600},
259        stylesheet => {delta => 30*24*3600},
260        error     => {delta => 60},
261      };
262    
263      ## -- Debug mode
264      $WIKI->{config}->{debug} = {
265        general => 0,
266        db => 0,
267        format => 0,
268        view => 0,
269      };
270    
 ## 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;));  
271  };  };
272    
273  =head1 NAME  =head1 SEE ALSO
274    
275  suikawiki-config.ph --- SuikaWiki: site configuration script  C<lib/suikawiki.pl>, C<wiki.cgi>,
276    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
277    <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
278    
279  =head1 LICENSE  =head1 LICENSE
280    
281  Copyright 2003 Wakaba <w@suika.fam.cx>  Copyright 2003-2004 Wakaba <w@suika.fam.cx>.  All rights reserved.
282    
283  This program is free software; you can redistribute it and/or  This program is free software; you can redistribute it and/or
284  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.6

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24