master
joey 2006-03-11 00:40:34 +00:00
parent b2d0a940d8
commit 2aaab7db29
7 changed files with 121 additions and 18 deletions

View File

@ -1,5 +1,5 @@
all:
./ikiwiki doc html --wikiname="ikiwiki" --verbose --offline
./ikiwiki doc html --wikiname="ikiwiki" --verbose --nosvn
clean:
rm -rf html

View File

@ -8,3 +8,5 @@
show as just Baz there.
* If I try to do a web commit, to a svn+ssh repo, it fails with
"Host key verification failed."
I think that the setuid isn't fully taking; it should be running as me,
but commit log shows www-data. So maybe it has the wrong username?

View File

@ -32,6 +32,8 @@ unchanged by ikiwiki as it builds your wiki. So you can check in an image,
program, or other special file and link to it from your wiki pages.
ikiwiki also supports making one page that is a [[SubPage]] of another.
[[Setup]] has a tutorial for setting up ikiwki.
[[TODO]] lists things that need to be added to ikiwiki before most people
would consider it a full-fledged wiki.

View File

@ -1,23 +1,23 @@
The best way to run ikiwiki in a [[Subversion]] post-commit hook is using
a wrapper, which can be generated using `ikiwiki --gen-wrapper`.
a wrapper, which can be generated using `ikiwiki --wrapper`.
First, set up the subversion checkout that ikiwiki will update and compile
into your wiki at each subversion commit. Run ikiwiki a few times by hand
to get a feel for it. Now, generate the wrapper by adding "--gen-wrapper"
to get a feel for it. Now, generate the wrapper by adding "--wrapper"
to whatever command line you've been using to run ikiwiki. For example:
~/wiki-checkout> ikiwiki . ~/public_html/wiki
~/wiki-checkout> ikiwiki . ~/public_html/wiki --gen-wrapper
~/wiki-checkout> ikiwiki . ~/public_html/wiki --wrapper
successfully generated ikiwiki-wrap
The generated wrapper is a C program that is designed to safely be made
suid if necessary. It's hardcoded to run ikiwiki with the settings
specified when you ran --gen-wrapper, and can only be used to update and
specified when you ran --wrapper, and can only be used to update and
compile that one checkout into the specified html directory.
Now, put the wrapper somewhere convenient, and create a post-commit hook
script in your subversion repository for the wiki. All the post-commit
hook has to do is run ikiwiki-wrap (with no parameters).
hook has to do is run the wrapper (with no parameters).
Depending on your Subversion setup, the post-commit hook might end up
getting called by users who have write access to subversion, but not to

68
doc/setup.mdwn 100644
View File

@ -0,0 +1,68 @@
So you want to set up your own wiki using ikiwiki? This turorial will walk
you through setting up a wiki that is stored in [[Subversion]] and that has
optional support for commits from the web.
1. [[Install]] ikiwiki.
apt-get install ikiwiki
2. Create the subversion repository for your wiki.
svnadmin create /svn/wikirepo
svn mkdir file:///svn/wikirepo/trunk -m create
3. Check out the repository to make the working copy that ikiwiki will use.
svn co file:///svn/wikirepo/trunk ~/wikiwc
4. Create some files them into subversion.
echo "Welcome to my empty wiki." > ~/wikiwc/index.mdwn
echo "Feel free to edit this page" > ~/wikiwc/sandbox.mdwn
svn add ~/wikiwc/*.mdwn
svn commit ~/wikiwc -m add
5. Build your wiki for the first time.
ikiwiki --verbose ~/wikiwc/ ~/public_html/wiki/ \
--url=http://host/~you/wiki/
Replace the url with the right url to your wiki. You should now
be able to visit the url and see your page that you created earlier.
6. Repeat steps 4 and 5 as desired, editing or adding pages and rebuilding
the wiki. You can play around with other ikiwiki parameters such as
--wikiname too. Get conformatble with its command line.
7. Set up a Subversion [[post-commit]] hook to automatically rebuild your
wiki when you commit to it.
ikiwiki ~/wikiwc/ ~/public_html/wiki/ \
--url=http://host/~you/wiki/ --wrapper
mv ikiwiki-wrap /svn/wikirepo/hooks/post-commit
8. Set up a [[CGI]] to allow editing the wiki from the web.
ikiwiki ~/wikiwc/ ~/public_html/wiki/ \
--url=http://host/~you/wiki/ --wrapper --cgi
chmod 6755 ikiwiki-wrap
mv wrapper ~/public_html/wiki/ikiwki.cgi
Note that this assumes that your web server will run CGI scripts from
your public_html directory. You might need to put it somewhere else
depending on your web server configuration.
9. Add links to the CGI to all the pages in your wiki, and update your
post-commit hook to add such links when updating the wiki in the
future. Note the use of the [[WrapperParamsTrick]].
ikiwiki $(/svn/wikirepo/hooks/post-commit --params) --rebuild
ikiwiki $(/svn/wikirepo/hooks/post-commit --params) \
--cgiurl=http://host/~you/wiki/ikiwiki.cgi \
--wrapper
mv ikiwiki-wrap /svn/wikirepo/hooks/post-commit
Be sure to change the cgiurl to the actual url to the wiki.cgi you
installed in step 9.
10. Enjoy your new wiki!

View File

@ -0,0 +1,20 @@
ikiwiki --wrapper can be used to generate a wrapper
program that runs ikiwiki with the specified parameters. This is used for
[[post-commit]] hooks, [[CGI]], etc, both for convenience and because these
things often need suid wrapper scripts to make ikiwiki run as the right
user.
The generated wrapper is a binary program. What if you want to regenerate
it with different parameters, or just run ikiwiki like it would but with
some parameter changed? To easily accomomplish this, the wrappers all
support being run with --params, which causes them to print out the
parameters they run ikiwiki with.
You can use this trick to regenerate a wrapper, adding or changing a
parameter:
ikiwiki $(./ikiwiki-wrap --params) --wikiname="newname" --wrapper
Or just to run ikiwiki like the wrapper would, and add a parameter:
ikiwiki $(./ikiwiki-wrap --params) --rebuild

35
ikiwiki
View File

@ -497,13 +497,19 @@ sub gen_wrapper ($$) {
if (! -x $this) {
error("$this doesn't seem to be executable");
}
my $call=qq{"$this", "$this", "$srcdir", "$destdir", "--wikiname=$wikiname"};
$call.=', "--verbose"' if $verbose;
$call.=', "--rebuild"' if $rebuild;
$call.=', "--nosvn"' if !$svn;
$call.=', "--cgi"' if $cgi;
$call.=', "--url='.$url.'"' if $url;
my @params=($srcdir, $destdir, "--wikiname=$wikiname");
push @params, "--verbose" if $verbose;
push @params, "--rebuild" if $rebuild;
push @params, "--nosvn" if !$svn;
push @params, "--cgi" if $cgi;
push @params, "--url=$url" if $url;
my $params=join(" ", @params);
my $call='';
foreach my $p ($this, $this, @params) {
$call.=qq{"$p", };
}
$call.="NULL";
my @envsave;
push @envsave, qw{REMOTE_ADDR QUERY_STRING REQUEST_METHOD REQUEST_URI
@ -511,8 +517,8 @@ sub gen_wrapper ($$) {
my $envsave="";
foreach my $var (@envsave) {
$envsave.=<<"EOF"
if ((s=getenv("$var")))
asprintf(&newenviron[i++], "%s=%s", "$var", s);
if ((s=getenv("$var")))
asprintf(&newenviron[i++], "%s=%s", "$var", s);
EOF
}
@ -527,17 +533,22 @@ EOF
extern char **environ;
int main (void) {
int main (int argc, char **argv) {
/* Sanitize environment. */
char *s;
char *newenviron[$#envsave+3];
int i=0;
$envsave;
$envsave
newenviron[i++]="HOME=$ENV{HOME}";
newenviron[i]=NULL;
environ=newenviron;
execl($call, NULL);
if (argc == 2 && strcmp(argv[1], "--params") == 0) {
printf("$params\\n");
exit(0);
}
execl($call);
perror("failed to run $this");
exit(1);
}