1 package Collectd::Unixsock;
6 use Carp (qw(cluck confess));
8 use Regexp::Common (qw(number));
15 my $sock = IO::Socket::UNIX->new (Type => SOCK_STREAM, Peer => $path);
18 cluck ("Cannot open UNIX-socket $path: $!");
24 sub _create_identifier
31 if (!$args->{'host'} || !$args->{'plugin'} || !$args->{'type'})
33 cluck ("Need `host', `plugin' and `type'");
37 $host = $args->{'host'};
38 $plugin = $args->{'plugin'};
39 $plugin .= '-' . $args->{'plugin_instance'} if ($args->{'plugin_instance'});
40 $type = $args->{'type'};
41 $type .= '-' . $args->{'type_instance'} if ($args->{'type_instance'});
43 return ("$host/$plugin/$type");
44 } # _create_identifier
49 my $path = @_ ? shift : '/var/run/collectd-unixsock';
50 my $sock = _create_socket ($path) or return;
66 my $fh = $obj->{'sock'} or confess;
72 $identifier = _create_identifier (\%args) or return;
74 $msg = "GETVAL $identifier\n";
75 send ($fh, $msg, 0) or confess ("send: $!");
78 recv ($fh, $msg, 1024, 0) or confess ("recv: $!");
80 ($status, $msg) = split (' ', $msg, 2);
83 $obj->{'error'} = $msg;
87 for (split (' ', $msg))
90 if ($entry =~ m/^(\w+)=($RE{num}{real})$/)
92 $ret->{$1} = 0.0 + $2;
105 my $fh = $obj->{'sock'} or confess;
110 $identifier = _create_identifier (\%args) or return;
111 if (!$args{'values'})
113 cluck ("Need argument `values'");
117 if (!ref ($args{'values'}))
119 $values = $args{'values'};
123 my $time = $args{'time'} ? $args{'time'} : time ();
124 $values = join (':', $time, map { defined ($_) ? $_ : 'U' } (@{$args{'values'}}));
127 $msg = "PUTVAL $identifier $values\n";
128 send ($fh, $msg, 0) or confess ("send: $!");
130 recv ($fh, $msg, 1024, 0) or confess ("recv: $!");
132 ($status, $msg) = split (' ', $msg, 2);
133 return (1) if ($status == 0);
135 $obj->{'error'} = $msg;
144 close ($obj->{'sock'});
145 delete ($obj->{'sock'});