PortState(3pm) | User Contributed Perl Documentation | PortState(3pm) |
NAME¶
IO::Socket::PortState - Perl extension for checking the open or closed status of a port.
SYNOPSIS¶
use strict; use warnings; use IO::Socket::PortState qw(check_ports); my %porthash = ( ... ); check_ports($host,$timeout,\%porthash); for my $proto (keys %porthash) { for(keys %{ $porthash{$proto} }) { print "$proto $_ is not open ($porthash{$proto}->{$_}->{name}) if !$porthash{$proto}->{$_}->{open}; } }
DESCRIPTION¶
You can use it to check if a port is open or closed for a given host and protocol.
EXPORT¶
None by default. But you can export check_ports();
check_ports()¶
This function tests your \%porthash and sets a protocol/port's open and note keys (see \%porthash below for details).
By default it determines if "open" is 1 or 0 if the IO::Socket::INET object is defined or not. For protocols not supported by IO::Socket::INET or for custom tests (IE open just to specific hosts, closed because activley blocked, service is down, etc) use \&handler (see \&handler below)
check_ports($host,$timeout,\%porthash,\&handler);
Called in void contect it modifies the hashref given. Otherwise it returns a new hash ref which is usefull for looping through the same \%porthash for multiple hosts:
my %porthash = ( ... ); for(@hosts) { my $host_hr = check_ports($_,$timeout,\%porthash); print "Report for $_\n"; # do something with $host_hr }
vs void context:
my %porthash = ( ... ); check_ports($host,$timeout,\%porthash); # now %porthash has been directly changed
\%porthash¶
This hash is a bit complex by necessity. (but its not so bad ;p)
The keys are the protocol (tcp, udp, ...) as can be used by IO::Socket::INET->new()'s "Proto" option (or whatever is valid for your custom \&handler
The values are a hashref. In this hashref the keys are the numeric ports and the valuse are a hashref.
This hashref has only one key "name" whose value can be an arbitrary label for your use and once run it sets "open" to 1 or 0 and "note" to "builtin()" so you knwo how "open" was figured.
my %check = ( tcp => { 80 => { name => 'Apache', }, 443 => { name => 'SSL Apache', }, }, udp => { 53 => { name => 'DNS' }, 465 => { name => 'smtp tls/ssl' }, }, );
\&handler¶
Here is an example handler function you can use as a road map:
sub handler { my($ent_hr,$host,$port,$proto,$timeout) = @_; # use $host, $port, $protocol, and $timeout to determine what you want however you like here # at a minimum do these two: $ent_hr->{open} = ???; # do what you like to set its open status to 1 or 0 $ent_hr->{note} = 'my handler()'; # set any other info you wanted here also... if(!$ent_hr->{open}) { $ent_hr->{closed_reason} = ???; # do what you like to set details about why its not open (blocked, not running, etc) } }
HOW TO EXPAND ON IO::Socket::PortState¶
This module's life came around as a result of wanting to monitor specific ports on several servers, specifically servers running cPanel (<http://cpanel.net/>). To make it easier to do that and provide a model to make it easier for anyone to create a module that is "server specific" I've created IO::Socket::PortState::cPanel
If you want to do the same thing please use it as a guide, all you would need to do is change the hashrefs and package specific info and voila its all set :)
If you do use IO::Socket::PortState::cPanel as a model (and I hope you do so that using any IO::Socket::PortState::* module will have a specific consistent use) please reference it in the POD of your module as outlined in the POD of IO::Socket::PortState::cPanel.
AUTHOR¶
Daniel Muey, <http://drmuey.com/cpan_contact.pl>
COPYRIGHT AND LICENSE¶
Copyright 2005 by Daniel Muey
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
2022-06-16 | perl v5.34.0 |