PortState(3pm)

πŸ“¦
version 0.03 Β· 5 versions
, in debian bookworm, debian trixie, ubuntu noble

🌸 NAME 🌸

IO::Socket::PortState β€” bestie, it's a Perl extension for checking whether a port is open or closed. That's the whole vibe. πŸ’…


✨ SYNOPSIS ✨

okay so here's the whole thing in action, no cap:

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. That's it. That's the job. 🫢

πŸŽ€ EXPORT πŸŽ€

None by default. But you can export check_ports(); if you want her on the guest list.


πŸ’– check_ports() πŸ’–

This function tests your \%porthash and sets a protocol/port's open and note keys (peep \%porthash below for the deets, iykyk).

By default it figures out whether open is 1 or 0 based on whether the IO::Socket::INET object is defined or not. For protocols that IO::Socket::INET doesn't support, or for custom tests (like… open just to specific hosts, closed because it's activley blocked, service is down, etc) β€” use \&handler (scroll down for \&handler bestie):

check_ports($host,$timeout,\%porthash,\&handler);

Called in void context it modifies the hashref you gave it. Otherwise it returns a new hash ref, which is lowkey 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, which is giving in-place makeover:

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. Inside that hashref, the keys are the numeric ports and the valuse are a hashref. (nested hashrefs, she's layered πŸ’…)

This hashref has only one key, name, whose value can be an arbitrary label for your use β€” and once it's run, it sets open to 1 or 0 and note to "builtin()" so you knwo how open was figured out. πŸ•΅οΈβ™€οΈ

my %check = (
   tcp => {
      80 => {
         name => 'Apache',
      },
      443 => {
         name => 'SSL Apache',
      },
   },
   udp => {
      53 => {
         name => 'DNS'
      },
      465 => {
         name => 'smtp tls/ssl'
      },
   },
);

🧚 &handler 🧚

Here's an example handler function you can use as a road map, bestie:

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 whole origin story? It came around because someone wanted to monitor specific ports on several servers β€” specifically servers running cPanel (<http://cpanel.net/>). To make that easier, and to hand everyone a model for building a "server specific" module, IO::Socket::PortState::cPanel was created. iconic behavior fr.

If you want to do the same thing, please use it as a guide β€” all you'd 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 honestly, 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 2005 by Daniel Muey

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


and that's the whole page bestie πŸ’– this one shipped with perl v5.34.0, dated 2022-06-16, living in the PortState(3pm) slot of your manual. slay, go check some ports πŸ’…βœ¨

πŸ“¦ where this page comes from