/[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 - (show annotations) (download)
Fri May 7 07:51:28 2004 UTC (21 years, 1 month ago) by wakaba
Branch: MAIN
Changes since 1.16: +2 -2 lines
Path resolving bug fixed

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;
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 use Message::Util::QName::General [q<ExpandedURI>], {
31 'log' => q<http://suika.fam.cx/~wakaba/-temp/2004/05/01/reqlog#>,
32 'media-type' => q<http://suika.fam.cx/~wakaba/-temp/2004/04/24/mt#>,
33 };
34
35 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 push our @Config, sub ($) {
63 my $WIKI = shift;
64 use FindBin q($Bin);
65 use File::Spec;
66
67 ## -- Filesystem path mapping
68 for (
69 [db__cache__dir => q"./wikidata/cache/"],
70 [db__cache_struct__file => q"./wikidata/cache/struct.db"],
71 [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 [db__request_log__dir => q"./wikidata/rlog/"],
81 [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 $WIKI->{config}->{path_to}->{$_->[0]} = File::Spec->rel2abs ($_->[1], $Bin);
87 }
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 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 -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 -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 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 }});
235
236 ## HTTP Request Logging Database (See RequestLog plugin module)
237 $wiki->{db}->_set_prop_db (log__http_request => {-db_open => sub {
238 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 }});
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 ExpandedURI q<log:root> => $WIKI->name ([]),
274 };
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
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
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
328 };
329
330 =head1 SEE ALSO
331
332 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
336 =head1 LICENSE
337
338 Copyright 2003-2004 Wakaba <w@suika.fam.cx>. All rights reserved.
339
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 1; # $Date: 2004/05/01 03:55:28 $

admin@suikawiki.org
ViewVC Help
Powered by ViewVC 1.1.24