diff options
Diffstat (limited to 'perl-install/network')
-rw-r--r-- | perl-install/network/smb.pm | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/perl-install/network/smb.pm b/perl-install/network/smb.pm new file mode 100644 index 000000000..d5c128b41 --- /dev/null +++ b/perl-install/network/smb.pm @@ -0,0 +1,57 @@ +package network::smb; + +use common; +use network::network; + +sub check { + my ($in) = @_; + my $f = '/usr/bin/nmblookup'; + -e $f or $in->do_pkgs->install('samba-client'); + -e $f or $in->ask_warn('', "Mandatory package samba-client is missing"), return; + 1; +} + + +sub find_servers() { + my (undef, @l) = `nmblookup "*"`; + s/\s.*\n// foreach @l; + my @servers = grep { network::network::is_ip($_) } @l; + my %servers; + $servers{$_}{ip} = $_ foreach @servers; + my ($ip); + foreach (`nmblookup -A @servers`) { + if (my $nb = /^Looking up status of (\S+)/ .. /^$/) { + if ($nb == 1) { + $ip = $1; + } else { + /<00>/ or next; + $servers{$ip}{/<GROUP>/ ? 'group' : 'name'} ||= lc first(/(\S+)/); + } + } + } + values %servers; +} + +sub find_exports { + my ($server) = @_; + my @l; + my $name = $server->{name} ? " -L $server->{name}" : ''; + my $group = $server->{group} ? " -W $server->{group}" : ''; + + # WARNING: using smbclient -L is ugly. It can't handle more than 15 + # characters shared names + + foreach (`smbclient -U% -L -I $server->{ip}$name$group`) { + chomp; + s/^\t//; + my ($name, $type, $comment) = unpack "A15 A10 A*", $_; + if ($name eq '---------' && $type eq '----' && $comment eq '-------' .. /^$/) { + push @l, { name => $name, type => $type, comment => $comment } + if $type eq 'Disk' && $name ne 'ADMIN$'; + } + } + @l; +} + +1; + |