Merge branch 'collectd-4.4'
[collectd.git] / contrib / cussh.pl
index c19c3f3..2ec6308 100755 (executable)
@@ -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
@@ -57,9 +57,11 @@ use Collectd::Unixsock();
        my $sock = Collectd::Unixsock->new($path);
 
        my $cmds = {
-               PUTVAL => \&putval,
-               GETVAL => \&getval,
-               FLUSH  => \&flush,
+               HELP    => \&cmd_help,
+               PUTVAL  => \&putval,
+               GETVAL  => \&getval,
+               FLUSH   => \&flush,
+               LISTVAL => \&listval,
        };
 
        if (! $sock) {
@@ -67,7 +69,7 @@ use Collectd::Unixsock();
                exit 1;
        }
 
-       print "cussh version 0.2, 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";
@@ -76,9 +78,13 @@ use Collectd::Unixsock();
                print "cussh> ";
                my $line = <STDIN>;
 
-               last if ((! $line) || ($line =~ m/^quit$/i));
+               last if (! $line);
 
-               my ($cmd) = $line =~ m/^(\w+)\s+/;
+               chomp $line;
+
+               last if ($line =~ m/^quit$/i);
+
+               my ($cmd) = $line =~ m/^(\w+)\s*/;
                $line = $';
 
                next if (! $cmd);
@@ -108,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));
@@ -117,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<GETVAL> I<Identifier>
+=item B<HELP>
 
-=item B<PUTVAL> I<Identifier> I<Valuelist>
+=cut
 
-These commands follow the exact same syntax as described in
-L<collectd-unixsock(5)>.
+sub cmd_help {
+       print <<HELP;
+Available commands:
+  HELP
+  PUTVAL
+  GETVAL
+  FLUSH
+  LISTVAL
+
+See the embedded Perldoc documentation for details. To do that, run:
+  perldoc $0
+HELP
+       return 1;
+} # cmd_help
+
+=item B<GETVAL> I<Identifier>
 
 =cut
 
@@ -147,9 +186,13 @@ sub putval {
        }
 
        my ($time, @values) = split m/:/, $line;
-       return $sock->putval(%$id, $time, \@values);
+       return $sock->putval(%$id, time => $time, values => \@values);
 }
 
+=item B<PUTVAL> I<Identifier> I<Valuelist>
+
+=cut
+
 sub getval {
        my $sock = shift || return;
        my $line = shift || return;
@@ -163,7 +206,10 @@ sub getval {
 
        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";
@@ -171,6 +217,10 @@ sub getval {
        return 1;
 }
 
+=item B<FLUSH> [B<timeout>=I<$timeout>] [B<plugin>=I<$plugin>[ ...]]
+
+=cut
+
 sub flush {
        my $sock = shift || return;
        my $line = shift;
@@ -193,6 +243,15 @@ sub flush {
                        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;
@@ -209,6 +268,33 @@ sub flush {
        return 1;
 }
 
+=item B<LISTVAL>
+
+=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<collectd-unixsock(5)>.
+
 =head1 SEE ALSO
 
 L<collectd(1)>, L<collectd-unisock(5)>