From 9e032bde06a4622a414375aad74e4296528b7b19 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Thu, 28 Feb 2008 18:33:06 +0100 Subject: [PATCH] Collectd::Unixsock, cussh.pl: Added support for the "flush" command. Signed-off-by: Sebastian Harl Signed-off-by: Florian Forster --- bindings/perl/Collectd/Unixsock.pm | 57 +++++++++++++++++++++++++++ contrib/cussh.pl | 63 ++++++++++++++++++++++++++---- 2 files changed, 112 insertions(+), 8 deletions(-) diff --git a/bindings/perl/Collectd/Unixsock.pm b/bindings/perl/Collectd/Unixsock.pm index d3b77d02..3b6fa5d1 100644 --- a/bindings/perl/Collectd/Unixsock.pm +++ b/bindings/perl/Collectd/Unixsock.pm @@ -400,6 +400,63 @@ sub putnotif return; } # putnotif +=item I<$obj>-EB (B =E I<$timeout>, B =E [...]); + +Flush cached data. + +Valid options are: + +=over 4 + +=item B + +If this option is specified, only data older than I<$timeout> seconds is +flushed. + +=item B + +If this option is specified, only the selected plugins will be flushed. + +=back + +=cut + +sub flush +{ + my $obj = shift; + my %args = @_; + + my $fh = $obj->{'sock'} or confess; + + my $status = 0; + my $msg = "FLUSH"; + + if ($args{'timeout'}) + { + $msg .= " timeout=" . $args{'timeout'}; + } + + if ($args{'plugins'}) + { + foreach my $plugin (@{$args{'plugins'}}) + { + $msg .= " plugin=" . $plugin; + } + } + + $msg .= "\n"; + + send ($fh, $msg, 0) or confess ("send: $!"); + $msg = undef; + recv ($fh, $msg, 1024, 0) or confess ("recv: $!"); + + ($status, $msg) = split (' ', $msg, 2); + return (1) if ($status == 0); + + $obj->{'error'} = $msg; + return; +} + =item I<$obj>-Edestroy (); Closes the socket before the object is destroyed. This function is also diff --git a/contrib/cussh.pl b/contrib/cussh.pl index 65c634e0..c19c3f30 100755 --- a/contrib/cussh.pl +++ b/contrib/cussh.pl @@ -56,12 +56,18 @@ use Collectd::Unixsock(); my $path = $ARGV[0] || "/var/run/collectd-unixsock"; my $sock = Collectd::Unixsock->new($path); + my $cmds = { + PUTVAL => \&putval, + GETVAL => \&getval, + FLUSH => \&flush, + }; + if (! $sock) { print STDERR "Unable to connect to $path!\n"; exit 1; } - print "cussh version 0.1, Copyright (C) 2007 Sebastian Harl\n" + print "cussh version 0.2, Copyright (C) 2007 Sebastian Harl\n" . "cussh comes with ABSOLUTELY NO WARRANTY. This is free software,\n" . "and you are welcome to redistribute it under certain conditions.\n" . "See the GNU General Public License 2 for more details.\n\n"; @@ -79,11 +85,8 @@ use Collectd::Unixsock(); $cmd = uc $cmd; my $f = undef; - if ($cmd eq "PUTVAL") { - $f = \&putval; - } - elsif ($cmd eq "GETVAL") { - $f = \&getval; + if (defined $cmds->{$cmd}) { + $f = $cmds->{$cmd}; } else { print STDERR "ERROR: Unknown command $cmd!\n"; @@ -138,7 +141,10 @@ sub putval { my $id = getid(\$line); - return if (! $id); + if (! $id) { + print STDERR $sock->{'error'} . $/; + return; + } my ($time, @values) = split m/:/, $line; return $sock->putval(%$id, $time, \@values); @@ -150,7 +156,10 @@ sub getval { my $id = getid(\$line); - return if (! $id); + if (! $id) { + print STDERR $sock->{'error'} . $/; + return; + } my $vals = $sock->getval(%$id); @@ -162,6 +171,44 @@ sub getval { return 1; } +sub flush { + my $sock = shift || return; + my $line = shift; + + my $res; + + if (! $line) { + $res = $sock->flush(); + } + else { + my %args = (); + + foreach my $i (split m/ /, $line) { + my ($option, $value) = $i =~ m/^([^=]+)=(.+)$/; + next if (! ($option && $value)); + + if ($option eq "plugin") { + push @{$args{"plugins"}}, $value; + } + elsif ($option eq "timeout") { + $args{"timeout"} = $value; + } + else { + print STDERR "Invalid option \"$option\".\n"; + return; + } + } + + $res = $sock->flush(%args); + } + + if (! $res) { + print STDERR $sock->{'error'} . $/; + return; + } + return 1; +} + =head1 SEE ALSO L, L -- 2.30.2