package App::MadEye::Plugin::Agent::FTP; use strict; use warnings; use App::MadEye::Plugin::Agent::Base; use Socket qw(IPPROTO_TCP TCP_NODELAY SOL_SOCKET SOCK_STREAM); use IO::Socket::INET; use IO::Select; sub is_dead { my ($self, $host) = @_; my $conf = $self->config->{config}; my $message = $conf->{message} or die "missing message"; my $port = $conf->{port} || 21; my $connect_timeout = $conf->{connect_timeout} || 10; my $select_timeout = $conf->{select_timeout} || 10; my $sock = IO::Socket::INET->new( PeerAddr => $host, PeerPort => $port, Timeout => $connect_timeout, ); unless ($sock) { return "Cannot connect Socket to $host:$port : $!"; } $sock->blocking(0); setsockopt($sock, IPPROTO_TCP, TCP_NODELAY, pack("l", 1)) or die; $sock->autoflush(1); my $select = IO::Select->new; $select->add($sock); my ($can_read,) = $select->can_read($select_timeout); if ($can_read) { my $line = <$sock>; $sock->close; if ($line =~ /$message/) { return; # This server is still alive! } else { return "this ftp server is dead!! : $line"; } } else { $sock->close; return "pure-ftpd connection timeout : $host"; } } 1; __END__ =head1 NAME App::MadEye::Plugin::Agent::FTP - monitoring FTP =head1 SCHEMA type: map mapping: target: type: seq required: yes sequence: - type: str message: required: yes type: str port: required: yes type: int connect_timeout: required: no type: int select_timeout: required: no type: int =head1 AUTHORS Tokuhiro Matsuno =head1 SEE ALSO L