From 08f6032344e060bd54285c449b2c1e99ad8d1591 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Mon, 22 Nov 2010 22:11:46 +0100 Subject: [PATCH] execute shell commands with trigger --- couchdb-trigger.pl | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/couchdb-trigger.pl b/couchdb-trigger.pl index 5f02e0f..d39f007 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,23 @@ use lib 'common/mojo/lib'; 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; @@ -72,11 +95,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->{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) = @_; -- 2.20.1