The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use Data::Dumper;
close STDERR;
my $browsemaster = shift || 'localhost';
my $file = $ENV{HOME}.'/nethood.pd';

sub dumper {
		my $self = shift;
		open(STOR,">$file") or return;
		print STOR Dumper($self->{net});
		close STOR
}
sub ls_wg {
   map { s/^\s*//;s/\s*$//;$_} split/(?:\s{2,}|\n)/, qx{smbclient -NL $browsemaster | grep -A 1000 'Workgroup            Master' | sed -e 1,2d};
}

sub ls_bm {
   my @a=map { /^\t(.*?)\s{2,}/ ;$1 } split/\n/, qx{smbclient -NL $_[0] | grep -A 1000 'Server               Comment' | grep -B 1000 'Workgroup            Master' | sed -e 1,2d};
   pop@a;
   pop@a;
   @a
}

sub broadcast {
	my $self = shift;
	$self->{net} = {};
	my %ar = ls_wg();
	for my $bm (keys %ar) {
		$bm || next;
		for $host (ls_bm($bm)) {
			$host || next;
			my $ip = get_ip($host);
			$self->{net}{$host} = { shares => [grep {length} ls_sh($host)], ip => $ip};
			dumper($self);
		}
	}
	#map { print "$ar{$_}\n"; map { print "\t$_\n"; map { print "\t\t$_\n" } ls($_) } ls_bm($ar{$_})  } keys %ar;
}

sub ls_sh {
	my $host = shift;
	my @shares;
	open(SMB, "smbclient -NL //$host|") or return;
	my $dead = <SMB>;
	chomp($dead);
	while (length($dead)) {
	      $dead = <SMB>;
	      chomp($dead);
	}
	my $head = <SMB>;
	$dead = <SMB>;
	$head =~ m/^\t(\w+\s+)\w+/;
	my $len = length($1);
	while (<SMB>) {
		chomp;
		last unless length;
		my $share = substr($_, 1, $len);
		$share =~ s{\s+$}{};
		next if $share  =~ /\$$/;
		push @shares, $share;
	}
	close SMB;
	@shares;
}

sub get_ip {
	my $host = shift;
	my $c = qq#smbclient -d 3 -NL //$host 2>&1 | grep 'Connecting to' | awk ' {print \$3 }' | sort -u#;
	my $i = qx{$c};
	chomp($i);
	$i;
}

broadcast({});