1 #!/usr/bin/perl
2 #
3 # collectd - contrib/cussh.pl
4 # Copyright (C) 2007 Sebastian Harl
5 #
6 # This program is free software; you can redistribute it and/or modify it
7 # under the terms of the GNU General Public License as published by the
8 # Free Software Foundation; only version 2 of the License is applicable.
9 #
10 # This program is distributed in the hope that it will be useful, but
11 # WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 # General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License along
16 # with this program; if not, write to the Free Software Foundation, Inc.,
17 # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18 #
19 # Author:
20 # Sebastian Harl <sh at tokkee.org>
21 #
23 =head1 NAME
25 cussh - collectd UNIX socket shell
27 =head1 SYNOPSIS
29 B<cussh> [I<E<lt>pathE<gt>>]
31 =head1 DESCRIPTION
33 B<collectd>'s unixsock plugin allows external programs to access the values it
34 has collected or received and to submit own values. This is a little
35 interactive frontend for this plugin.
37 =head1 OPTIONS
39 =over 4
41 =item I<E<lt>pathE<gt>>
43 The path to the UNIX socket provided by collectd's unixsock plugin. (Default:
44 F</var/run/collectd-unixsock>)
46 =back
48 =cut
50 use strict;
51 use warnings;
53 use Collectd::Unixsock();
55 { # main
56 my $path = $ARGV[0] || "/var/run/collectd-unixsock";
57 my $sock = Collectd::Unixsock->new($path);
59 if (! $sock) {
60 print STDERR "Unable to connect to $path!\n";
61 exit 1;
62 }
64 print "cussh version 0.1, Copyright (C) 2007 Sebastian Harl\n"
65 . "cussh comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
66 . "and you are welcome to redistribute it under certain conditions.\n"
67 . "See the GNU General Public License 2 for more details.\n\n";
69 while (1) {
70 print "cussh> ";
71 my $line = <STDIN>;
73 last if ((! $line) || ($line =~ m/^quit$/i));
75 my ($cmd) = $line =~ m/^(\w+)\s+/;
76 $line = $';
78 next if (! $cmd);
79 $cmd = uc $cmd;
81 my $f = undef;
82 if ($cmd eq "PUTVAL") {
83 $f = \&putval;
84 }
85 elsif ($cmd eq "GETVAL") {
86 $f = \&getval;
87 }
88 else {
89 print STDERR "ERROR: Unknown command $cmd!\n";
90 next;
91 }
93 if (! $f->($sock, $line)) {
94 print STDERR "ERROR: Command failed!\n";
95 next;
96 }
97 }
99 $sock->destroy();
100 exit 0;
101 }
103 sub getid {
104 my $string = shift || return;
106 print $$string . $/;
107 my ($h, $p, $pi, $t, $ti) =
108 $$string =~ m/^(\w+)\/(\w+)(?:-(\w+))?\/(\w+)(?:-(\w+))?\s+/;
109 $$string = $';
111 return if ((! $h) || (! $p) || (! $t));
113 my %id = ();
115 ($id{'host'}, $id{'plugin'}, $id{'type'}) = ($h, $p, $t);
117 $id{'plugin_instance'} = $pi if ($pi);
118 $id{'type_instance'} = $ti if ($ti);
119 return \%id;
120 }
122 =head1 COMMANDS
124 =over 4
126 =item B<GETVAL> I<Identifier>
128 =item B<PUTVAL> I<Identifier> I<Valuelist>
130 These commands follow the exact same syntax as described in
131 L<collectd-unixsock(5)>.
133 =cut
135 sub putval {
136 my $sock = shift || return;
137 my $line = shift || return;
139 my $id = getid(\$line);
141 return if (! $id);
143 my ($time, @values) = split m/:/, $line;
144 return $sock->putval(%$id, $time, \@values);
145 }
147 sub getval {
148 my $sock = shift || return;
149 my $line = shift || return;
151 my $id = getid(\$line);
153 return if (! $id);
155 my $vals = $sock->getval(%$id);
157 return if (! $vals);
159 foreach my $key (keys %$vals) {
160 print "\t$key: $vals->{$key}\n";
161 }
162 return 1;
163 }
165 =head1 SEE ALSO
167 L<collectd(1)>, L<collectd-unisock(5)>
169 =head1 AUTHOR
171 Written by Sebastian Harl E<lt>sh@tokkee.orgE<gt>.
173 B<collectd> has been written by Florian Forster and others.
175 =head1 COPYRIGHT
177 Copyright (C) 2007 Sebastian Harl.
179 This program is free software; you can redistribute it and/or modify it under
180 the terms of the GNU General Public License as published by the Free Software
181 Foundation; only version 2 of the License is applicable.
183 =cut
185 # vim: set sw=4 ts=4 tw=78 noexpandtab :