X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=contrib%2Fcussh.pl;h=2ec6308bd90ae130be1de8907cb163139c55de67;hb=150924b271e21387ad1929e2373cc6e0772dc351;hp=65c634e0f8637dc57c34d8812645639b3a7fad13;hpb=27f6db4769cac5727888c327dbbf1b88da4f3ca6;p=collectd.git diff --git a/contrib/cussh.pl b/contrib/cussh.pl index 65c634e0..2ec6308b 100755 --- a/contrib/cussh.pl +++ b/contrib/cussh.pl @@ -1,7 +1,7 @@ #!/usr/bin/perl # # collectd - contrib/cussh.pl -# Copyright (C) 2007 Sebastian Harl +# Copyright (C) 2007-2008 Sebastian Harl # # This program is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -56,12 +56,20 @@ use Collectd::Unixsock(); my $path = $ARGV[0] || "/var/run/collectd-unixsock"; my $sock = Collectd::Unixsock->new($path); + my $cmds = { + HELP => \&cmd_help, + PUTVAL => \&putval, + GETVAL => \&getval, + FLUSH => \&flush, + LISTVAL => \&listval, + }; + 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-2008 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"; @@ -70,20 +78,21 @@ use Collectd::Unixsock(); print "cussh> "; my $line = ; - last if ((! $line) || ($line =~ m/^quit$/i)); + last if (! $line); + + chomp $line; - my ($cmd) = $line =~ m/^(\w+)\s+/; + last if ($line =~ m/^quit$/i); + + my ($cmd) = $line =~ m/^(\w+)\s*/; $line = $'; next if (! $cmd); $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"; @@ -105,7 +114,7 @@ sub getid { print $$string . $/; my ($h, $p, $pi, $t, $ti) = - $$string =~ m/^(\w+)\/(\w+)(?:-(\w+))?\/(\w+)(?:-(\w+))?\s+/; + $$string =~ m#^([^/]+)/([^/-]+)(?:-([^/]+))?/([^/-]+)(?:-([^/]+))?\s*#; $$string = $'; return if ((! $h) || (! $p) || (! $t)); @@ -114,21 +123,54 @@ sub getid { ($id{'host'}, $id{'plugin'}, $id{'type'}) = ($h, $p, $t); - $id{'plugin_instance'} = $pi if ($pi); - $id{'type_instance'} = $ti if ($ti); + $id{'plugin_instance'} = $pi if defined ($pi); + $id{'type_instance'} = $ti if defined ($ti); return \%id; } +sub putid { + my $ident = shift || return; + + my $string; + + $string = $ident->{'host'} . "/" . $ident->{'plugin'}; + + if (defined $ident->{'plugin_instance'}) { + $string .= "-" . $ident->{'plugin_instance'}; + } + + $string .= "/" . $ident->{'type'}; + + if (defined $ident->{'type_instance'}) { + $string .= "-" . $ident->{'type_instance'}; + } + return $string; +} + =head1 COMMANDS =over 4 -=item B I +=item B -=item B I I +=cut -These commands follow the exact same syntax as described in -L. +sub cmd_help { + print < I =cut @@ -138,23 +180,36 @@ 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); + return $sock->putval(%$id, time => $time, values => \@values); } +=item B I I + +=cut + sub getval { my $sock = shift || return; my $line = shift || return; my $id = getid(\$line); - return if (! $id); + if (! $id) { + print STDERR $sock->{'error'} . $/; + return; + } my $vals = $sock->getval(%$id); - return if (! $vals); + if (! $vals) { + print STDERR $sock->{'error'} . $/; + return; + } foreach my $key (keys %$vals) { print "\t$key: $vals->{$key}\n"; @@ -162,6 +217,84 @@ sub getval { return 1; } +=item B [B=I<$timeout>] [B=I<$plugin>[ ...]] + +=cut + +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; + } + elsif ($option eq "identifier") { + my $id = getid (\$value); + if (!$id) + { + print STDERR "Not a valid identifier: \"$value\"\n"; + next; + } + push @{$args{"identifier"}}, $id; + } + else { + print STDERR "Invalid option \"$option\".\n"; + return; + } + } + + $res = $sock->flush(%args); + } + + if (! $res) { + print STDERR $sock->{'error'} . $/; + return; + } + return 1; +} + +=item B + +=cut + +sub listval { + my $sock = shift || return; + + my @res; + + @res = $sock->listval(); + + if (! @res) { + print STDERR $sock->{'error'} . $/; + return; + } + + foreach my $ident (@res) { + print $ident->{'time'} . " " . putid($ident) . $/; + } + return 1; +} + +=back + +These commands follow the exact same syntax as described in +L. + =head1 SEE ALSO L, L