summaryrefslogtreecommitdiffstats
path: root/perl-install/network/smb.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/network/smb.pm')
-rw-r--r--perl-install/network/smb.pm57
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;
+