aggregate: Write timestamp next aggregation can happen to .ikiwiki/aggregatetime, to allow for more sophisticated cron jobs.

master
Joey Hess 2010-07-06 13:57:17 -04:00
parent 7e3fb8b8a2
commit 2dd0c177a6
3 changed files with 30 additions and 5 deletions

View File

@ -298,7 +298,7 @@ sub loadstate () {
return if $state_loaded; return if $state_loaded;
$state_loaded=1; $state_loaded=1;
if (-e "$config{wikistatedir}/aggregate") { if (-e "$config{wikistatedir}/aggregate") {
open(IN, "$config{wikistatedir}/aggregate") || open(IN, "<", "$config{wikistatedir}/aggregate") ||
die "$config{wikistatedir}/aggregate: $!"; die "$config{wikistatedir}/aggregate: $!";
while (<IN>) { while (<IN>) {
$_=IkiWiki::possibly_foolish_untaint($_); $_=IkiWiki::possibly_foolish_untaint($_);
@ -335,7 +335,7 @@ sub savestate () {
garbage_collect(); garbage_collect();
my $newfile="$config{wikistatedir}/aggregate.new"; my $newfile="$config{wikistatedir}/aggregate.new";
my $cleanup = sub { unlink($newfile) }; my $cleanup = sub { unlink($newfile) };
open (OUT, ">$newfile") || error("open $newfile: $!", $cleanup); open (OUT, ">", $newfile) || error("open $newfile: $!", $cleanup);
foreach my $data (values %feeds, values %guids) { foreach my $data (values %feeds, values %guids) {
my @line; my @line;
foreach my $field (keys %$data) { foreach my $field (keys %$data) {
@ -356,6 +356,20 @@ sub savestate () {
close OUT || error("save $newfile: $!", $cleanup); close OUT || error("save $newfile: $!", $cleanup);
rename($newfile, "$config{wikistatedir}/aggregate") || rename($newfile, "$config{wikistatedir}/aggregate") ||
error("rename $newfile: $!", $cleanup); error("rename $newfile: $!", $cleanup);
my $timestamp=undef;
foreach my $feed (keys %feeds) {
my $t=$feeds{$feed}->{lastupdate}+$feeds{$feed}->{updateinterval};
if (! defined $timestamp || $timestamp > $t) {
$timestamp=$t;
}
}
$newfile=~s/\.new$/time/;
open (OUT, ">", $newfile) || error("open $newfile: $!", $cleanup);
if (defined $timestamp) {
print OUT $timestamp."\n";
}
close OUT || error("save $newfile: $!", $cleanup);
} }
sub garbage_collect () { sub garbage_collect () {

2
debian/changelog vendored
View File

@ -3,6 +3,8 @@ ikiwiki (3.20100705) UNRELEASED; urgency=low
* img: Add a margin around images displayed by this directive. * img: Add a margin around images displayed by this directive.
* comments: Added commentmoderation directive for easy linking to the * comments: Added commentmoderation directive for easy linking to the
comment moderation queue. comment moderation queue.
* aggregate: Write timestamp next aggregation can happen to
.ikiwiki/aggregatetime, to allow for more sophisticated cron jobs.
-- Joey Hess <joeyh@debian.org> Mon, 05 Jul 2010 13:59:42 -0400 -- Joey Hess <joeyh@debian.org> Mon, 05 Jul 2010 13:59:42 -0400

View File

@ -5,9 +5,13 @@ This plugin allows content from other feeds to be aggregated into the
wiki. To specify feeds to aggregate, use the wiki. To specify feeds to aggregate, use the
[[ikiwiki/directive/aggregate]] [[ikiwiki/directive]]. [[ikiwiki/directive/aggregate]] [[ikiwiki/directive]].
The [[meta]] and [[tag]] plugins are also recommended. Either the ## requirements
[[htmltidy]] or [[htmlbalance]] plugin is suggested, since feeds can easily
contain html problems, some of which these plugins can fix. The [[meta]] and [[tag]] plugins are also recommended to be used with this
one. Either the [[htmltidy]] or [[htmlbalance]] plugin is suggested, since
feeds can easily contain html problems, some of which these plugins can fix.
## triggering aggregation
You will need to run ikiwiki periodically from a cron job, passing it the You will need to run ikiwiki periodically from a cron job, passing it the
--aggregate parameter, to make it check for new posts. Here's an example --aggregate parameter, to make it check for new posts. Here's an example
@ -15,6 +19,11 @@ crontab entry:
*/15 * * * * ikiwiki --setup my.wiki --aggregate --refresh */15 * * * * ikiwiki --setup my.wiki --aggregate --refresh
The plugin updates a file `.ikiwiki/aggregatetime` with the unix time stamp
when the next aggregation run could occur. (The file may be empty, if no
aggregation is required.) This can be integrated into more complex cron
jobs or systems to trigger aggregation only when needed.
Alternatively, you can allow `ikiwiki.cgi` to trigger the aggregation. You Alternatively, you can allow `ikiwiki.cgi` to trigger the aggregation. You
should only need this if for some reason you cannot use cron, and instead should only need this if for some reason you cannot use cron, and instead
want to use a service such as [WebCron](http://webcron.org). To enable want to use a service such as [WebCron](http://webcron.org). To enable