1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
package ProFTPD::Tests::Modules::mod_statsd::mgmt;
use strict;
use IO::Handle;
use Socket;
require Exporter;
our @ISA = qw(Exporter);
our @ADMIN = qw(
delete_statsd_info
get_statsd_info
statsd_mgmt
);
our @EXPORT_OK = (@ADMIN);
our %EXPORT_TAGS = (
admin => [@ADMIN],
);
sub statsd_mgmt {
my $port = $ENV{STATSD_MGMT_PORT};
my $opts = {
PeerHost => '127.0.0.1',
PeerPort => $port,
Proto => 'tcp',
Type => SOCK_STREAM,
Timeout => 3
};
my $client = IO::Socket::INET->new(%$opts);
unless ($client) {
croak("Can't connect to 127.0.0.1:$port: $!");
}
return $client;
}
sub statsd_cmd {
my $statsd = shift;
my $cmd = shift;
if ($ENV{TEST_DEBUG}) {
print STDERR "# Sending command: $cmd\n";
}
$statsd->print("$cmd\n");
$statsd->flush();
my $resp = '';
while (my $line = <$statsd>) {
chomp($line);
if ($ENV{TEST_DEBUG}) {
print STDERR "# Received response: '$line'\n";
}
last if $line eq 'END';
$resp .= $line;
}
return $resp;
}
sub delete_statsd_info {
my $statsd = statsd_mgmt();
my $cmd = "delcounters command.*";
statsd_cmd($statsd, $cmd);
$cmd = "deltimers command.*";
statsd_cmd($statsd, $cmd);
$cmd = "delgauges connections";
statsd_cmd($statsd, $cmd);
$statsd->close();
return 1;
}
sub get_statsd_info {
my $cmd = shift;
my $statsd = statsd_mgmt();
my $json = statsd_cmd($statsd, $cmd);
$statsd->close();
# statsd gives us (badly formatted) JSON; decode it into Perl.
$json =~ s/ (\S+): / '\1': /g;
$json =~ s/'{1,2}/\"/g;
if ($ENV{TEST_JSON}) {
print STDERR "# Received JSON: '$json'\n";
}
require JSON;
JSON->import(qw(decode_json));
my $info = decode_json($json);
return $info;
}
1;
|