The application Oddmuse can be found here: http://www.oddmuse.org/
Odd muse benefits
Oddmuse is a simple wiki written as a stand alone script with very good support for modules.
Because Oddmuse already produces accurate XHTML1 it was an ideal candidate for use in Zaltana - which requires XHTML output.
Formatting
Oddmuse can use any method of formatting as a module. Zaltana uses Creole as it has been done by a group of people together and is very similar to MediaWiki standard.
File format and Database
There is no database. Running with a file based system is the fastest way to run a wiki. Maintenance is lower. Upgrades and Backup is easier. Manual scripts that update files are easier. The system runs faster. There is less memory and context switches per request.
Other Database driven Wikis cope with these limitations by aggressively caching their content. Oddmuse also adds great caching.
The only down side to non-database driven wikis is that they can be slower to do searches on large systems. This is solved by adding an independent search engine. This also has the advantage of being able to search other things or your whole site, rather than just the wiki. It also keeps with a Zaltana philosophy of doing one thing well - so don't build into your Wiki every feature under the sun - let other systems do it for you.
Emerging too is the use of Google AJAX Search to search your site, since it already has a better index than we mostly produce ourselves. Example of this is searching WikiPedia - which is generally easier on Google than internally.
The file format is simple and easy to understand, and keep track of all changes.
Configuration
This is the real win for this wiki. It supports configuration by defaults, environment variables, or config files. At a minimum you only need to tell it the top level directory.
Using Oddmuse on a Dynamic set of Wiki Sites
Can you make Oddmuse dynamically create, manage, maintain and update any number of Wikis from a single install ? YES !
Using an mod_perl Apache2 PerlFixupHandler - you can configure any number of wikis.
In one example I created a wiki for every user on a single host by using part of the URL and checking it in the user admin system: e.g. http://wiki.somedomain.com/user/fred - fred was checked in the LDAP database as existing and allowed to have a wiki. If it didn't exist it was created (e.g. mkdir !) and optionally configured (either ENV set correctly or using the directory/config file).
In another example I wanted to create a wiki for users, customers and class rooms from odd URLs - in this case the user was in the host name. e.g. http://fred.suer.somedomain.com/wiki/ - this was done by using dynamic DNS entries (e.g. *.user IN A 1.2.3.4) and Apache Virtual Domains by DNS and the PerlFixupHandler to check the validity of the entry and create the necessary configuration.
This code and check is so small and fast it works well and would scale to very large systems.
Example Apache Configuration
ScriptAlias /wiki /usr/lib/cgi-bin/wiki.pl
PerlModule Demo::AutoConfig
<Location /wiki>
PerlFixupHandler Jigsaw::AutoConfig
</Location>
Example Apache Module
NOTE: Don't ever really use this in production. It does not handle errors correctly, it allows anyone to create a wiki, it has fragile handling of URLs - it is here as a proof of concept ONLY !
package Jigsaw::AutoConfig;
use mod_perl2 ;
use Apache2::Access ;
use Apache2::Log ;
use Apache2::RequestRec ;
use Apache2::RequestUtil ;
use Apache2::Const -compile => qw(HTTP_UNAUTHORIZED HTTP_INTERNAL_SERVER_ERROR DECLINED HTTP_FORBIDDEN OK REDIRECT) ;
use Apache2::URI ();
use URI::Escape;
use Carp;
use strict;
use warnings;
sub handler {
my $r = shift;
# Poor URI management needs fixing
my @uri = split(m|/|, $r->uri);
shift @uri if (!$uri[0]);
if ($uri[0] eq "user") {
my $user = $uri[1];
$user =~ s/[^A-Za-z0-9\.\-\_]//g;
if (($user ne $uri[2]) || !$user || ($user eq "")) {
print STDERR "Invalid user specified $uri[2]\n";
return Apache2::Const::HTTP_FORBIDDEN;
}
my $dir = "/var/www/user/$user";
if (!-d $dir) {
# Make the directory
mkdir $dir;
# Optionally create $dir/config
}
# Set the directory
$r->subprocess_env('WikiDataDir' => $dir);
# Now strip the data (might be able to avoid this)
my $pi = join('/', splice(@uri, 2));
$r->path_info($pi);
return Apache2::Const::OK;
}
print STDERR "Unsupported wiki type\n";
return Apache2::Const::HTTP_FORBIDDEN;
}
1;
