NetworkInfo::Discovery::NetBIOS - NetworkInfo::Discovery extension to find NetBIOS services


NetworkInfo-Discovery-NetBIOS documentation Contained in the NetworkInfo-Discovery-NetBIOS distribution.

Index


Code Index:

NAME

Top

NetworkInfo::Discovery::NetBIOS - NetworkInfo::Discovery extension to find NetBIOS services

VERSION

Top

Version 0.05

SYNOPSIS

Top

    use NetworkInfo::Discovery::NetBIOS;

    my $scanner = new NetworkInfo::Discovery::NetBIOS hosts => [ qw(192.168.0.0/24) ];
    $scanner->do_it;

    for my $host ($scanner->get_interfaces) {
        printf "<%s> NetBios(node:%s zone:%s)\n", $host->{ip}, 
            $host->{netbios}{node}, $host->{netbios}{zone};
    }




DESCRIPTION

Top

This module is an extension to NetworkInfo::Discovery which can find hosts and services using the NetBIOS protocol.

METHODS

Top

new()

Create and return a new object.

Options

  • hosts - expects a scalar or an arrayref of IP addresses in CIDR notation

Example

    # with a scalar argument
    my $scanner = new NetworkInfo::Discovery::NetBIOS hosts => '192.168.0.0/24;

    # with an arrayref
    my $scanner = new NetworkInfo::Discovery::NetBIOS hosts => [ qw(192.168.0.0/24) ];

do_it()

Run the scan.

hosts()

Add hosts or networks to the scan list. Expects addresses in CIDR notation.

Examples

    $scanner->hosts('192.168.4.53');     # add one host
    $scanner->hosts('192.168.5.48/29');  # add a subnet
    $scanner->hosts(qw(192.168.6.0/30 10.0.0.3/28));  # add two subnets

DIAGNOSTICS

Top

Don't know how to deal with a %sref.

(F) hosts() was called with something it can't handle.

SEE ALSO

Top

NetworkInfo::Discovery, Net::NBName

AUTHOR

Top

Sébastien Aperghis-Tramoni, <sebastien@aperghis.net>

BUGS

Top

Please report any bugs or feature requests to bug-networkinfo-discovery-netbios@rt.cpan.org, or through the web interface at http://rt.cpan.org. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

COPYRIGHT & LICENSE

Top


NetworkInfo-Discovery-NetBIOS documentation Contained in the NetworkInfo-Discovery-NetBIOS distribution.
package NetworkInfo::Discovery::NetBIOS;
use strict;
use Carp;
use Net::NBName;
use Net::Netmask;
use NetworkInfo::Discovery::Detect;

{ no strict;
  $VERSION = '0.05';
  @ISA = qw(NetworkInfo::Discovery::Detect);
}

sub new {
    my $class = shift;
    my $self = $class->SUPER::new();
    my %args = @_;
    
    $class = ref($class) || $class;
    bless $self, $class;
    
    # add private fields
    $self->{_hosts_to_scan} = [];
    
    # treat given arguments
    for my $attr (keys %args) {
        $self->$attr($args{$attr}) if $self->can($attr);
    }
    
    return $self
}

sub do_it {
    my $self = shift;
    my @hosts = ();
    my $netbios = new Net::NBName;
    
    for my $host (@{$self->{_hosts_to_scan}}) {
        for my $ip (Net::Netmask->new($host)->enumerate) {
            # trying to find status information on each IP address
            my %host = ();
            my $status = $netbios->node_status($ip);
            
            if($status) {
                $host{ip} = $ip;
                $host{mac} = $status->mac_address;
                $host{netbios} = {};
                
                for my $rr ($status->names) {
                    $host{netbios}{node} = $rr->name if $rr->suffix == 0x00 and $rr->G eq 'UNIQUE';
                    $host{netbios}{zone} = $rr->name if $rr->suffix == 0x00 and $rr->G eq 'GROUP';
                }
                
                push @hosts, { %host };
            }
        }
    }
    
    # add found hosts
    $self->add_interface(@hosts);
    
    # return list of found hosts
    return $self->get_interfaces
}

sub hosts {
    my $self = shift;
    if(ref $_[0] eq 'ARRAY') {
        push @{$self->{_hosts_to_scan}}, @{$_[0]}
    } elsif(ref $_[0]) {
        croak "fatal: Don't know how to deal with a ", lc(ref($_[0])), "ref."
    } else {
        push @{$self->{_hosts_to_scan}}, @_
    }
}

1; # End of NetworkInfo::Discovery::NetBIOS