add --setup, --wrappermode
authorjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Mon, 13 Mar 2006 18:35:23 +0000 (18:35 +0000)
committerjoey <joey@0fa5a96a-9a0e-0410-b3b2-a0fd24251071>
Mon, 13 Mar 2006 18:35:23 +0000 (18:35 +0000)
allow filename param to --wrapper

doc/bugs.mdwn
doc/setup.mdwn
doc/todo.mdwn
doc/usage.mdwn
ikiwiki
ikiwiki.setup [new file with mode: 0644]

index 72719ba2955c96407438cb6dfb81a9ae167db37b..2c712de6d33b59afe9b9c41a75ccce32eb94ae63 100644 (file)
@@ -27,9 +27,3 @@
   markdown, but that will probably be a bear. I guess the question is how
   common "[[ ]]" is, and maybe we should just provide a way to escape a
   wikilink..
   markdown, but that will probably be a bear. I guess the question is how
   common "[[ ]]" is, and maybe we should just provide a way to escape a
   wikilink..
-
-Fixed bugs:
-
-* RecentChanges is supposed to linkify WikiNames and it does, but only if
-  the user's page exists. It doesn't add a ?link to a noneistant page to
-  aid creating it. (Fixed. -- [[Joey]])
index acb401cfced00cb5106e47f16039710534f909c0..541131cf9a881278f0291024c27e502281e95ed2 100644 (file)
@@ -74,4 +74,4 @@ optional support for commits from the web.
 
                 --historyurl='http://svn.host/trunk/[[]]?root=wiki'
 
 
                 --historyurl='http://svn.host/trunk/[[]]?root=wiki'
 
-11. Enjoy your new wiki! Add yourself to [[IkiWikiUsers]]
\ No newline at end of file
+11. Enjoy your new wiki! Add yourself to [[IkiWikiUsers]]
index 98b98e3f2041784aa4b2890e4ef9e604284afb06..23ade8cbdca65c9fb0359bb44fcd118ecf72f227 100644 (file)
@@ -15,7 +15,7 @@ is built. (As long as all changes to all pages is ok.)
 
 * Should support mail notification of new and changed pages.
 
 
 * Should support mail notification of new and changed pages.
 
-  Hmm, should be easy to implement this.. it runs as a svn post-cookit hook
+  Hmm, should be easy to implement this.. it runs as a svn post-coommit hook
   already, so just look at the userdb, svnlook at what's changed, and send
   mails to people who have subscribed.
 
   already, so just look at the userdb, svnlook at what's changed, and send
   mails to people who have subscribed.
 
@@ -62,6 +62,11 @@ and that includes the date.
 What syntax do other wikis use for this? I'm considering "[[ -- ]]" (with
 spaces removed) as it has a nice nmemonic.
 
 What syntax do other wikis use for this? I'm considering "[[ -- ]]" (with
 spaces removed) as it has a nice nmemonic.
 
+OTOH, adding additional syntax for this would be counter to one of the
+design goals for ikiwiki: keeping as much markup as possible out of the
+wiki and not adding nonstandard markup. And it's not significantly hard to
+type "--[[Joey]]", and as to the date, we do have page history.
+
 ## recentchanges links to commit diffs
 
 Would take a bit more viewcvs integration, let the be a "[diff]" link in
 ## recentchanges links to commit diffs
 
 Would take a bit more viewcvs integration, let the be a "[diff]" link in
index 8f57a15933b2c1f3a8ac927ae068d75da008e7d3..8efb9a63d5d01244172a22248430969039bc54d1 100644 (file)
@@ -6,13 +6,18 @@ ikiwiki - a wiki compiler
 
 ikiwiki [options] source templates destination
 
 
 ikiwiki [options] source templates destination
 
+ikiwiki --setup configfile
+
 # DESCRIPTION
 
 # DESCRIPTION
 
-`ikiwiki` is a wiki compiler. It builds static html pages for a wiki, from `source` in the [[MarkDown]] language, using the specified html `templates` and writes it out to `destination`.
+`ikiwiki` is a wiki compiler. It builds static html pages for a wiki, from
+`source` in the [[MarkDown]] language, using the specified html `templates`
+and writes it out to `destination`.
 
 # OPTIONS
 
 
 # OPTIONS
 
-Note that most options can be shortened to single letters, and boolean flags such as --verbose can be negated with --no-verbose.
+Note that most options can be shortened to single letters, and boolean
+flags such as --verbose can be negated with --no-verbose.
 
 * --wikiname
 
 
 * --wikiname
 
@@ -26,13 +31,22 @@ Note that most options can be shortened to single letters, and boolean flags suc
 
   Force a rebuild of all pages.
 
 
   Force a rebuild of all pages.
 
-* --wrapper
+* --wrapper [file]
+
+  Generate a [[wrapper]] binary that is hardcoded to do action specified by
+  the other options, using the specified input files and `destination`
+  directory. The filename to use for the wrapper is optional.
+
+  The wrapper is designed to be safely made suid and be run by untrusted
+  users, as a [[Subversion]] [[post-commit]] hook, or as a [[CGI]].
 
 
-  Generate a [[wrapper]] binary that is hardcoded to do action specified by the other options, using the specified input files and `destination` directory.
+  Note that the generated wrapper will ignore all command line parameters
+  except for --params, which will make it print out the parameters it would
+  run ikiwiki with.
 
 
-  The wrapper is designed to be safely made suid and be run by untrusted users, as a [[Subversion]] [[post-commit]] hook, or as a [[CGI]].
+* --wrappermode mode
 
 
-  Note that the generated wrapper will ignore all command line parameters except for --params, which will make it print out the parameters it would run ikiwiki with.
+  Specify a mode to chmod the wrapper to after creating it.
 
 * --svn, --nosvn
 
 
 * --svn, --nosvn
 
@@ -71,6 +85,13 @@ Note that most options can be shortened to single letters, and boolean flags suc
   Specifies a rexexp of source files to exclude from processing.
   May be specified multiple times to add to exclude list.
 
   Specifies a rexexp of source files to exclude from processing.
   May be specified multiple times to add to exclude list.
 
+* --setup configfile
+
+  In setup mode, ikiwiki reads the config file, which is really a perl
+  program that can call ikiwiki internal functions. Uses of this are
+  various; one is to automatically generate wrappers for a wiki based on
+  data in a config file.
+
 # AUTHOR
 
 Joey Hess <joey@kitenet.net>
 # AUTHOR
 
 Joey Hess <joey@kitenet.net>
diff --git a/ikiwiki b/ikiwiki
index 361c75c07c0547bb3f01de7f143b4861caa17f21..4e64e4031d0d5996f68d072d4bac06e6a3aa4da4 100755 (executable)
--- a/ikiwiki
+++ b/ikiwiki
@@ -18,23 +18,27 @@ my %config=( #{{{
        wikiname => "wiki",
        default_pageext => ".mdwn",
        cgi => 0,
        wikiname => "wiki",
        default_pageext => ".mdwn",
        cgi => 0,
-       url => "",
-       cgiurl => "",
-       historyurl => "",
        svn => 1,
        svn => 1,
+       url => '',
+       cgiurl => '',
+       historyurl => '',
        anonok => 0,
        rebuild => 0,
        anonok => 0,
        rebuild => 0,
-       wrapper => 0,
+       wrapper => undef,
+       wrappermode => undef,
        srcdir => undef,
        destdir => undef,
        templatedir => undef,
        srcdir => undef,
        destdir => undef,
        templatedir => undef,
+       setup => undef,
 ); #}}}
 
 GetOptions( #{{{
 ); #}}}
 
 GetOptions( #{{{
+       "setup=s" => \$config{setup},
        "wikiname=s" => \$config{wikiname},
        "verbose|v!" => \$config{verbose},
        "rebuild!" => \$config{rebuild},
        "wikiname=s" => \$config{wikiname},
        "verbose|v!" => \$config{verbose},
        "rebuild!" => \$config{rebuild},
-       "wrapper!" => \$config{wrapper},
+       "wrapper=s" => sub { $config{wrapper}=$_[1] ? $_[1] : "ikiwiki-wrap" },
+       "wrappermode=i" => \$config{wrappermode},
        "svn!" => \$config{svn},
        "anonok!" => \$config{anonok},
        "cgi!" => \$config{cgi},
        "svn!" => \$config{svn},
        "anonok!" => \$config{anonok},
        "cgi!" => \$config{cgi},
@@ -46,13 +50,16 @@ GetOptions( #{{{
        },
 ) || usage();
 
        },
 ) || usage();
 
-usage() unless @ARGV == 3;
-$config{srcdir} = possibly_foolish_untaint(shift);
-$config{templatedir} = possibly_foolish_untaint(shift);
-$config{destdir} = possibly_foolish_untaint(shift);
-if ($config{cgi} && ! length $config{url}) {
-       error("Must specify url to wiki with --url when using --cgi");
-} #}}}
+if (! $config{setup}) {
+       usage() unless @ARGV == 3;
+       $config{srcdir} = possibly_foolish_untaint(shift);
+       $config{templatedir} = possibly_foolish_untaint(shift);
+       $config{destdir} = possibly_foolish_untaint(shift);
+       if ($config{cgi} && ! length $config{url}) {
+               error("Must specify url to wiki with --url when using --cgi");
+       }
+}
+#}}}
 
 sub usage { #{{{
        die "usage: ikiwiki [options] source templates dest\n";
 
 sub usage { #{{{
        die "usage: ikiwiki [options] source templates dest\n";
@@ -659,7 +666,8 @@ FILE:               foreach my $file (@files) {
        }
 } #}}}
 
        }
 } #}}}
 
-sub gen_wrapper () { #{{{
+sub gen_wrapper (@) { #{{{
+       my %config=(@_);
        eval q{use Cwd 'abs_path'};
        $config{srcdir}=abs_path($config{srcdir});
        $config{destdir}=abs_path($config{destdir});
        eval q{use Cwd 'abs_path'};
        $config{srcdir}=abs_path($config{srcdir});
        $config{destdir}=abs_path($config{destdir});
@@ -668,6 +676,10 @@ sub gen_wrapper () { #{{{
                error("$this doesn't seem to be executable");
        }
 
                error("$this doesn't seem to be executable");
        }
 
+       if ($config{setup}) {
+               error("cannot create a wrapper that uses a setup file");
+       }
+       
        my @params=($config{srcdir}, $config{templatedir}, $config{destdir},
                "--wikiname=$config{wikiname}");
        push @params, "--verbose" if $config{verbose};
        my @params=($config{srcdir}, $config{templatedir}, $config{destdir},
                "--wikiname=$config{wikiname}");
        push @params, "--verbose" if $config{verbose};
@@ -729,12 +741,15 @@ $envsave
 }
 EOF
        close OUT;
 }
 EOF
        close OUT;
-       if (system("gcc", "ikiwiki-wrap.c", "-o", "ikiwiki-wrap") != 0) {
+       if (system("gcc", "ikiwiki-wrap.c", "-o", possibly_foolish_untaint($config{wrapper})) != 0) {
                error("failed to compile ikiwiki-wrap.c");
        }
        unlink("ikiwiki-wrap.c");
                error("failed to compile ikiwiki-wrap.c");
        }
        unlink("ikiwiki-wrap.c");
-       print "successfully generated ikiwiki-wrap\n";
-       exit 0;
+       if (defined $config{wrappermode} &&
+           ! chmod(oct($config{wrappermode}), possibly_foolish_untaint($config{wrapper}))) {
+               error("chmod $config{wrapper}: $!");
+       }
+       print "successfully generated $config{wrapper}\n";
 } #}}}
                
 sub misctemplate ($$) { #{{{
 } #}}}
                
 sub misctemplate ($$) { #{{{
@@ -1133,8 +1148,25 @@ sub cgi () { #{{{
        }
 } #}}}
 
        }
 } #}}}
 
+sub setup () { # {{{
+       my $setup=possibly_foolish_untaint($config{setup});
+       open (IN, $setup) || error("read $setup: $!\n");
+       local $/=undef;
+       my $code=<IN>;
+       ($code)=$code=~/(.*)/s;
+       close IN;
+       eval $code;
+       error($@) if $@;
+       print "ikiwiki setup complete\n";
+       exit;
+} #}}}
+
 # main {{{
 # main {{{
-gen_wrapper() if $config{wrapper};
+setup() if $config{setup};
+if ($config{wrapper}) {
+       gen_wrapper(%config);
+       exit;
+}
 memoize('pagename');
 memoize('bestlink');
 loadindex() unless $config{rebuild};
 memoize('pagename');
 memoize('bestlink');
 loadindex() unless $config{rebuild};
diff --git a/ikiwiki.setup b/ikiwiki.setup
new file mode 100644 (file)
index 0000000..44c4f31
--- /dev/null
@@ -0,0 +1,39 @@
+#!/usr/bin/perl
+# Configuration file for ikiwiki.
+# Passing this to ikiwiki --setup will make ikiwiki generate tw
+# wrapper programs, one for cgi and one for a subversion post-commit hook.
+#
+# Remember to re-run ikiwiki --setup any time you edit this file.
+
+my %common=(
+       wikiname => "MyWiki",
+
+       # Be sure to customise these..
+       srcdir => "/path/to/source",
+       templatedir => "/path/to/templates",
+       destdir => "/var/www/wiki",
+       url => "http://myhost/wiki",
+       cgiurl => "http://myhost/ikiwiki.cgi",
+       historyurl => "$webdir/cgi-bin/viewcvs?[[]]"
+       
+       # Whether to integrate with svn.
+       svn => 1,
+       svnrepo => "/svn/wiki",
+       
+       # Can anonymous web users edit pages?
+       #anonok => 1,
+);     
+
+gen_wrapper(
+       %common,
+       cgi => 1,
+       wrapper => "$common{destdir}/ikiwiki.cgi",
+       wrappermode => 06755,
+);
+gen_wrapper(
+       %common,
+       # Note that this will overwrite any exsting post-commit hoo
+       # script, which may not be what you want.
+       wrapper => "$common{svnrepo}/hooks/post-commit",
+       wrappermode => 04755,
+) if $common{$svn};