Merge branch 'collectd-4.4' into collectd-4.5
[collectd.git] / contrib / cussh.pl
index 6da2856..ee4c893 100755 (executable)
@@ -57,10 +57,12 @@ use Collectd::Unixsock();
        my $sock = Collectd::Unixsock->new($path);
 
        my $cmds = {
+               HELP    => \&cmd_help,
                PUTVAL  => \&putval,
                GETVAL  => \&getval,
                FLUSH   => \&flush,
                LISTVAL => \&listval,
+               PUTNOTIF => \&putnotif,
        };
 
        if (! $sock) {
@@ -113,7 +115,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));
@@ -122,8 +124,8 @@ 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;
 }
 
@@ -150,6 +152,26 @@ sub putid {
 
 =over 4
 
+=item B<HELP>
+
+=cut
+
+sub cmd_help {
+       print <<HELP;
+Available commands:
+  HELP
+  PUTVAL
+  GETVAL
+  FLUSH
+  LISTVAL
+  PUTNOTIF
+
+See the embedded Perldoc documentation for details. To do that, run:
+  perldoc $0
+HELP
+       return 1;
+} # cmd_help
+
 =item B<GETVAL> I<Identifier>
 
 =cut
@@ -223,6 +245,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;
@@ -261,6 +292,29 @@ sub listval {
        return 1;
 }
 
+=item B<PUTNOTIF> [[B<severity>=I<$severity>] [B<message>=I<$message>] [ ...]]
+
+=cut
+
+sub putnotif {
+       my $sock = shift || return;
+       my $line = shift || return;
+
+       my (%values) = ();
+       foreach my $i (split m/ /, $line) {
+               my($key,$val) = split m/=/, $i, 2;
+               if ($key && $val) {
+                       $values{$key} = $val;
+               }
+               else {
+                       $values{'message'} .= ' '.$key;
+               }
+       }
+       $values{'time'} ||= time();
+       my(@tmp) = %values;
+       return $sock->putnotif(%values);
+}
+
 =back
 
 These commands follow the exact same syntax as described in