#!/usr/bin/perl
+# back-end trigger server for CouchDB monitoring changes feed:
+#
# http://wiki.apache.org/couchdb/HTTP_database_API#Changes
+#
+# implements state machine using document which you cen put with:
+#
+# curl -X PUT http://localhost:5984/monitor/df -d '{"trigger":{"command":"df -P","format":"table"}}'
+#
+# DEFAULT TRIGGER EXECUTE SHELL COMMANDS. IT IS NOT SECURE IF YOUR COUCHDB ISN'T SECURE!
use warnings;
use strict;
use Mojo::Client;
use Mojo::JSON;
+use Time::HiRes qw(time);
my $url = 'http://localhost:5984/monitor';
+
+sub _trigger {
+ my $trigger = $_[0]->{trigger};
+ if ( my $command = $trigger->{command} ) {
+ # FIXME SECURITY HOLE
+ my $output = $trigger->{output} = `$command`;
+
+ $trigger->{output} =
+ [ map { [ split (/\s+/,$_) ] } split(/\n/,$output) ]
+ if $trigger->{format} =~ m/table/i;
+ }
+ return $trigger;
+}
+
my $seq = 0;
my $client = Mojo::Client->new;
} else {
my $res = $tx->res->json;
$change->{doc}->{_rev} = $res->{rev};
- debug "TRIGGER execute ", $change->{doc};
- # FIXME trigger logic?
+ debug "TRIGGER execute ", $change->{doc};
+ _trigger( $change->{doc} );
- push @{ $trigger->{active} }, time(); # timestamp step
+ push @{ $trigger->{active} }, time(), 0; # last timestamp
$client->put( "$url/$id" => $json->encode( $change->{doc} ) => sub {
my ($client,$tx) = @_;