X-Git-Url: http://git.rot13.org/?p=angular-mojolicious.git;a=blobdiff_plain;f=couchdb-trigger.pl;h=873beeece38e6e3f13fb60665f4391c50a0c97f4;hp=5f02e0f6f127a63fc9d5ef28b6fefdb23eb337a7;hb=7a00de959d5462d5a52ab35fcd49b71f2ef83936;hpb=e0608bf780e9255ba95776b3cfc38703035fba90 diff --git a/couchdb-trigger.pl b/couchdb-trigger.pl index 5f02e0f..873beee 100755 --- a/couchdb-trigger.pl +++ b/couchdb-trigger.pl @@ -1,6 +1,14 @@ #!/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; @@ -9,8 +17,17 @@ use lib 'common/mojo/lib'; use Mojo::Client; use Mojo::JSON; +use Time::HiRes qw(time); +use Data::Dump qw(dump); + +my ( $url, $trigger_path ) = @ARGV; + +$url ||= 'http://localhost:5984/monitor'; +$trigger_path ||= 'trigger/shell.pm' ; + +sub commit { warn "# commit ignored\n"; } +require $trigger_path if -e $trigger_path; -my $url = 'http://localhost:5984/monitor'; my $seq = 0; my $client = Mojo::Client->new; @@ -54,11 +71,11 @@ while( ! $error ) { debug 'change' => $change; - if ( my $trigger = $change->{doc}->{trigger} ) { - if ( exists $trigger->{active} ) { + if ( filter($change) ) { + if ( exists $change->{doc}->{trigger}->{active} ) { debug 'trigger.active', $change->{doc}->{trigger}->{active}; } else { - $trigger->{active} = [ time() ]; + $change->{doc}->{trigger}->{active} = [ time() ]; debug 'TRIGGER start PUT ', $change->{doc}; $client->put( "$url/$id" => $json->encode( $change->{doc} ) => sub { @@ -72,11 +89,11 @@ while( ! $error ) { } 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 ); - push @{ $trigger->{active} }, time(); # timestamp step + push @{ $change->{doc}->{trigger}->{active} }, time(), 0; # last timestamp $client->put( "$url/$id" => $json->encode( $change->{doc} ) => sub { my ($client,$tx) = @_; @@ -98,6 +115,8 @@ while( ! $error ) { } + commit; + }); $client->start($tx);