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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.17 - (hide annotations) (download)
Fri May 7 07:51:28 2004 UTC (20 years ago) by wakaba
Branch: MAIN
Changes since 1.16: +2 -2 lines
Path resolving bug fixed

1 wakaba 1.13 =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 w 1.1 use strict;
22 wakaba 1.6
23 wakaba 1.13 ## 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 wakaba 1.6 }
28 wakaba 1.13 use Message::Util::Error;
29 wakaba 1.6
30 wakaba 1.15 use Message::Util::QName::General [q<ExpandedURI>], {
31 wakaba 1.16 'log' => q<http://suika.fam.cx/~wakaba/-temp/2004/05/01/reqlog#>,
32 wakaba 1.15 'media-type' => q<http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#>,
33     };
34    
35 wakaba 1.14 BEGIN {
36     if ($main::ENV{REQUEST_URI} =~ /\#/) {
37     require SuikaWiki::Output::HTTP;
38     my $out = SuikaWiki::Output::HTTP->new;
39     $out->{status_code} = 401;
40     $out->{status_phrase} = q<Request-URI MUST NOT have Fragment Identifier>;
41     $out->{entity}->{media_type} = q<text/html>;
42     $out->{entity}->{charset} = q<iso-8859-1>;
43     $out->{entity}->{language} = [q<en>];
44     $out->{entity}->{body_is_octet_stream} = 1;
45     my $ua = $main::ENV{HTTP_USER_AGENT};
46     for ($ua) {
47     s/&/&amp;/g; s/</&lt;/g; s/([^\x20-\x7E])/sprintf '&#x%02X;', ord $1/ge;
48     };
49     $out->{entity}->{body} = qq<
50     <!DOCTYPE html SYSTEM>
51     <title>401 Bad Request-URI</title>
52     <h1>Bad Request-URI</h1>
53     <p>Your Request-URI has fragment identifier but it is not allowed here.
54     It might be a bug of your user agent ($ua). Please contact to the UA
55     vendor.</p>
56     >;
57     $out->output (output => 'http-cgi');
58     exit;
59     }
60     }
61    
62 wakaba 1.13 push our @Config, sub ($) {
63     my $WIKI = shift;
64 wakaba 1.16 use FindBin q($Bin);
65     use File::Spec;
66 wakaba 1.13
67     ## -- Filesystem path mapping
68     for (
69 wakaba 1.14 [db__cache__dir => q"./wikidata/cache/"],
70     [db__cache_struct__file => q"./wikidata/cache/struct.db"],
71 wakaba 1.13 [db__content__dir => q"./wikidata/page/"],
72     [db__content__error_log => q"./wikidata/log/db-content.log"],
73     [db__bdb__home_dir => q"./wikidata/lock/"],
74     [db__bdb__log_dir => q"./wikidata/log/bdb/"],
75     [db__bdb__log_file => q"./wikidata/log/bdb.log"],
76     [db__bdb__temp_dir => q"./wikidata/lock/"],
77     [db__lock__dir => q"./wikidata/lock/"],
78     [db__lock__log_file => q"./wikidata/log/lock.log"],
79     [db__log__dir => q"./wikidata/log/"],
80 wakaba 1.16 [db__request_log__dir => q"./wikidata/rlog/"],
81 wakaba 1.13 [db__temp__dir => q"./wikidata/lock/"],
82     [namazu__index_dir => q"/var/namazu/index/suikawiki"],
83     ) {
84     ## On system that does not set current directory as main script
85     ## directory, you should specify it instead of using "abs_path".
86 wakaba 1.17 $WIKI->{config}->{path_to}->{$_->[0]} = File::Spec->rel2abs ($_->[1], $Bin);
87 wakaba 1.13 }
88    
89     ## -- Namazu URI Mapping (See SuikaWiki:SuikaWiki//Namazu) --
90     $WIKI->{config}->{nmz__uri_to_uri} = sub {
91     my ($nmzuri, %opt) = @_;
92     if ($nmzuri =~ s!^\Q$opt{o}->{wiki}->{config}->{path_to}->{db__content__dir}\E/*!!o) {
93     $nmzuri =~ s/\.txt$//;
94     return $opt{o}->{wiki}->uri_reference
95     (page => $opt{o}->{wiki}->name ([
96     map {s/([0-9A-F][0-9A-F])/pack 'C', hex $1/ge; $_}
97     split m!\.ns/!, $nmzuri
98     ]), base => 1);
99     } else {
100     $nmzuri =~ s<^/home/wakaba/public_html/([^.]+)><http://suika.fam.cx/~wakaba/$1>;
101     return ($nmzuri, $nmzuri);
102     }
103     };
104    
105     ## -- WikiPlugin
106     push @{$WIKI->{event}->{plugin_manager_loaded}}, sub {
107     my $wiki = shift;
108    
109     ## Installed plugin modules
110     $wiki->{plugin}->load_directory (qw(
111     lib/SuikaWiki/Plugin/
112     misc/plugins/
113     misc/plugins/form/
114     misc/plugins/format/
115     misc/plugins/link/
116     misc/plugins/view/
117     ));
118    
119     ## Configuration file as pseudo-plugin module
120     require 'wikidata/config.ph';
121     };
122    
123     ## -- WikiDatabase: Mapping logical to physical
124     push @{$WIKI->{event}->{database_loaded}}, sub {
125     my $wiki = shift;
126    
127     ## Main content
128     $wiki->{db}->_set_prop_db (content => {-db_open => sub {
129 wakaba 1.14 require SuikaWiki::DB::FileSystem::LeafFile;
130     SuikaWiki::DB::FileSystem::LeafFile->new
131     (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
132     directory_suffix => '.ns',
133     file_suffix => '.txt',
134     root_key => $wiki->{config}->{page}->{Default},
135 wakaba 1.15 -lock => $wiki->{var}->{db}->{lock_prop}->('content_prop'));
136     }, -db_close => sub {
137     my %opt = @_;
138     $opt{prop_info}->{-db}->close;
139     delete $opt{prop_info}->{-db};
140     }});
141    
142     ## Properties
143     $wiki->{db}->_set_prop_db (content_prop => {-db_open => sub {
144     require SuikaWiki::DB::FileSystem::LeafProp;
145     SuikaWiki::DB::FileSystem::LeafProp->new
146     (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
147     directory_suffix => '.ns',
148     file_suffix => '.prop',
149     root_key => $wiki->{config}->{page}->{Default},
150 wakaba 1.13 -lock => $wiki->{var}->{db}->{lock_prop}->('content'));
151     }, -db_close => sub {
152     my %opt = @_;
153     $opt{prop_info}->{-db}->close;
154     delete $opt{prop_info}->{-db};
155     }});
156    
157     ## Last modified
158     $wiki->{db}->_set_prop_db (lastmodified => {-db_open => sub {
159     require SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09;
160     SuikaWiki::DB::FileSystem::SuikaWikiMetaInfo09->new
161     (directory => $wiki->{config}->{path_to}->{db__content__dir},
162     -lock => $wiki->{var}->{db}->{lock_prop}->('lastmodified'));
163     }, -prop => 'last_modified', -db_close => sub {
164     my %opt = @_;
165     $opt{prop_info}->{-db}->close;
166     delete $opt{prop_info}->{-db};
167     }});
168    
169     ## Cache DBs
170     require SuikaWiki::DB::FileSystem::SuikaWikiCache09;
171     my $cachedb = SuikaWiki::DB::FileSystem::SuikaWikiCache09->new
172     (directory => $wiki->{config}->{path_to}->{db__cache__dir},
173     expires => 86400 * 3, removes => 86400 * 3); # 3 days
174     $wiki->{db}->_set_prop_db (m__search_result =>
175     {-db => $cachedb, -prop => 'search_result', -db_close => sub {
176     my %opt = @_;
177     $opt{prop_info}->{-db}->close;
178     delete $opt{prop_info}->{-db};
179     }});
180     $wiki->{db}->_set_prop_db (wpp__headsummary =>
181     {-db => $cachedb, -prop => 'headsummary', -db_close => sub {
182     my %opt = @_;
183     $opt{prop_info}->{-db}->close;
184     delete $opt{prop_info}->{-db};
185     }});
186     $wiki->{db}->_set_prop_db (ref__item_template =>
187     {-db => $cachedb, -prop => 'refereritem', -db_close => sub {
188     my %opt = @_;
189     $opt{prop_info}->{-db}->close;
190     delete $opt{prop_info}->{-db};
191     }});
192    
193     ## Berkely DB Environment Preparation
194     use BerkeleyDB;
195     my $bdbenv = new BerkeleyDB::Env
196     -Home => $wiki->{config}->{path_to}->{db__bdb__home_dir},
197     -Config => {
198     DB_DATA_DIR => $wiki->{config}->{path_to}->{db__content__dir},
199     DB_LOG_DIR => $wiki->{config}->{path_to}->{db__bdb__log_dir},
200     DB_TMP_DIR => $wiki->{config}->{path_to}->{db__bdb__temp_dir},
201     },
202     -ErrFile => $wiki->{config}->{path_to}->{db__bdb__log_file},
203     -Flags => DB_CREATE | DB_INIT_LOCK | DB_INIT_LOG | DB_INIT_MPOOL,
204     -Verbose => $wiki->{config}->{debug}->{db};
205    
206     $wiki->{db}->_set_prop_db (content__structured => {-db_open => sub {
207     require SuikaWiki::DB::Hash;
208     new SuikaWiki::DB::Hash constructor => sub {
209     use MLDBM qw(BerkeleyDB::Hash);# Storable);
210     tie my %mldb, 'MLDBM',
211     -Filename => $wiki->{config}->{path_to}
212     ->{db__cache_struct__file},
213     -Env => $bdbenv,
214     -Flags => DB_CREATE,
215     -Mode => 0644;
216     \%mldb;
217     };
218     }});
219    
220     ## Referer Database (See Referer plugin module)
221     $wiki->{db}->_set_prop_db (referer => {-db_open => sub {
222 wakaba 1.14 require SuikaWiki::DB::FileSystem::Count;
223     SuikaWiki::DB::FileSystem::Count->new
224     (base_directory => $wiki->{config}->{path_to}->{db__content__dir},
225     directory_suffix => '.ns',
226     file_suffix => '.ref',
227     root_key => $wiki->{config}->{page}->{Default},
228     auto_mkdir => 0,
229     -lock => $wiki->{var}->{db}->{lock_prop}->('referer'));
230     }, -db_close => sub {
231     my %opt = @_;
232     $opt{prop_info}->{-db}->close;
233     delete $opt{prop_info}->{-db};
234 wakaba 1.13 }});
235    
236     ## HTTP Request Logging Database (See RequestLog plugin module)
237     $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
238 wakaba 1.16 require SuikaWiki::DB::FileSystem::Count;
239     SuikaWiki::DB::FileSystem::Count->new
240     (base_directory => $wiki->{config}->{path_to}->{db__request_log__dir},
241     directory_suffix => '.ns',
242     file_suffix => '.rlog',
243     root_key => $wiki->{config}->{page}->{Default},
244     auto_mkdir => 1);
245     }, -db_close => sub {
246     my %opt = @_;
247     $opt{prop_info}->{-db}->close;
248     delete $opt{prop_info}->{-db};
249 wakaba 1.13 }});
250    
251     ## Additional WikiDB properties should be defined here
252     # ...
253     };
254    
255     push @{$WIKI->{event}->{input_close}}, sub {
256     my ($wiki, $event) = @_;
257     try {
258     SuikaWiki::Plugin->module_package ('RequestLog')
259     ->http_request_log (wiki => $wiki,
260     prop => 'log__http_request');
261     } catch SuikaWiki::Plugin::error with {
262     my $err = shift;
263     $err->raise unless $err->{-type} eq 'PLUGIN_NOT_FOUND';
264     };
265     };
266    
267     ## -- WikiName of special purpose WikiPages
268     $WIKI->{config}->{page} = {
269     Default => $WIKI->name ([qw/HomePage/]),
270     InterWikiName => $WIKI->name ([qw/Wiki InterWikiName/]),
271     NewPageTemplate => $WIKI->name ([qw/Wiki NewPageTemplate/]),
272     'StyleSheetList(text/html)' => $WIKI->name ([qw<Wiki Style List text/html>]),
273 wakaba 1.16 ExpandedURI q<log:root> => $WIKI->name ([]),
274 wakaba 1.13 };
275    
276     ## -- WikiNamespace constants
277     $WIKI->{config}->{name}->{space} = {
278     separator => '//',
279     separator_reg => qr#\s*//\s*#,
280     self => '.',
281     parent => '..',
282     root => '//',
283     };
284    
285     ## -- Default character codes
286     $WIKI->{config}->{charset} = {
287     ## Internal code - MUST be ASCII + 8bit coding scheme
288     internal => 'euc-jp',
289     ## Default output code
290     output => 'iso-2022-jp',
291     ## "query" part in URI reference
292     uri_query => '', # auto-detected
293     uri_query_encode => 'euc-jp', ## For compatibility w/ SuikaWiki 2
294     uri_param => '', # auto-detected
295     uri_param_encode => 'euc-jp', ## For compatibility w/ SuikaWiki 2
296     ## PATH_INFO part in URI reference
297     uri_path_info => 'x-utf-8-10646', ## Reserved for future use
298     ## Fragment identifier in URI reference
299     uri_fragment => 'x-punycode', ## Reserved for possible future use
300     };
301 wakaba 1.15
302     ## -- User option for media types
303     $WIKI->{config}->{ExpandedURI q<media-type:accept-media-type>} = {
304     q<IMT:text/css##> => 1,
305     q<IMT:text/plain##> => 1,
306     q<IMT:text/x-suikawiki;version="0.9"##> => 1,
307     q<IMT:application/x.suikawiki.config;version="2.0"##> => 1,
308     };
309 wakaba 1.13
310     ## -- Expires duration templates
311     $WIKI->{config}->{entity}->{expires} = {
312     edit => {delta => 60},
313     view => {delta => 2*3600},
314     list => {delta => 60},
315     lm_flaged => {delta => 30*24*3600},
316     stylesheet => {delta => 30*24*3600},
317     error => {delta => 60},
318     };
319    
320     ## -- Debug mode
321     $WIKI->{config}->{debug} = {
322     general => 0,
323     db => 0,
324     format => 0,
325     view => 0,
326     };
327 wakaba 1.11
328 wakaba 1.8 };
329 w 1.1
330 wakaba 1.13 =head1 SEE ALSO
331 wakaba 1.6
332 wakaba 1.13 C<lib/suikawiki.pl>, C<wiki.cgi>,
333     <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SuikaWiki>,
334     <http://suika.fam.cx/~wakaba/-temp/wiki/wiki?SWHCS>
335 wakaba 1.6
336     =head1 LICENSE
337    
338 wakaba 1.13 Copyright 2003-2004 Wakaba <w@suika.fam.cx>. All rights reserved.
339 wakaba 1.6
340     This program is free software; you can redistribute it and/or
341     modify it under the same terms as Perl itself.
342    
343     =cut
344    
345 wakaba 1.17 1; # $Date: 2004/05/01 03:55:28 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24