Kanla::Plugin::Banner(3) Useful functions for banner-based plugins

SYNOPSIS


use Kanla::Plugin;
use Kanla::Plugin::Banner;
sub run {
banner_connect(
host => 'irc.twice-irc.de',
default_service => 'ircd',
cb => sub {
my ($handle, $timeout) = @_;
$handle->push_write("NICK kanla\r\n");
$handle->push_write("USER kanla kanla kanla :kanla\r\n");
my @read_line;
@read_line = (
line => sub {
my ($handle, $line) = @_;
if ($line !~ /^:[^ ]+ 001 /) {
$handle->push_read(@read_line);
return;
}
# We successfully signed on.
undef $timeout;
$handle->push_write("QUIT\r\n");
banner_disconnect($handle);
});
$handle->push_read(@read_line);
});
}

METHODS

banner_connect

Connects to the given address (parsed by "AnyEvent::Socket"'s parse_hostport) using the configured address families.

The caller provides a callback, which will be called after the connection was established. In case there was an error (DNS name could not be resolved, connection was refused/timed out, etc.), the callback will NOT be called, but an alert will be signaled.

The callback will be called with an "AnyEvent::Handle" and an "AnyEvent" timer (timeouts).

The timeout is initialized to the configured value (plugin configuration) or 20s if left unconfigured.

This example connects to one of Google's SMTP servers and waits for the SMTP greeting. It does not resolve MX records, but that's not the point of the example:

    banner_connect(
        host => 'aspmx.l.google.com',
        default_service => 'smtp',
        cb => sub {
            my ($handle, $timeout) = @_;
            $handle->push_read(line => sub {
                my ($handle, $line) = @_;
                undef $timeout;
                if ($line !~ /^220 /) {
                    signal_error('critical', 'Invalid greeting');
                }
            });
        });

banner_disconnect($handle)

Properly disconnects the specified "AnyEvent::Handle".