diff options
Diffstat (limited to 'perl-install/network/smb.pm')
| -rw-r--r-- | perl-install/network/smb.pm | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/perl-install/network/smb.pm b/perl-install/network/smb.pm index 27a6a4186..57eba8234 100644 --- a/perl-install/network/smb.pm +++ b/perl-install/network/smb.pm @@ -15,9 +15,9 @@ sub to_fstab_entry { my ($class, $e) = @_; my $part = $class->to_fstab_entry_raw($e, 'smbfs'); if ($e->{server}{username}) { - my ($options, $unknown) = fs::mount_options_unpack($part); + my ($options, $unknown) = fs::mount_options::unpack($part); $options->{"$_="} = $e->{server}{$_} foreach qw(username password domain); - fs::mount_options_pack($part, $options, $unknown); + fs::mount_options::pack($part, $options, $unknown); } $part; } @@ -32,7 +32,7 @@ sub to_dev_raw { sub check { my ($_class, $in) = @_; - $in->do_pkgs->ensure_is_installed('samba-client', '/usr/bin/nmblookup'); + $in->do_pkgs->ensure_binary_is_installed('samba-client', 'nmblookup'); } sub smbclient { @@ -42,7 +42,15 @@ sub smbclient { my $group = $server->{group} ? " -W $server->{group}" : ''; my $U = $server->{username} ? sprintf("%s/%s%%%s", @$server{'domain', 'username', 'password'}) : '%'; - `smbclient -U $U -L $name $ip$group 2>/dev/null`; + my %h; + foreach (`smbclient -g -U $U -L $name $ip$group 2>/dev/null`) { + if (my ($type, $v1, $v2) = /(.*)\|(.*)\|(.*)/) { + push @{$h{$type}}, [ $v1, $v2 ]; + } elsif (/^Error returning browse list/) { + push @{$h{Error}}, $_; + } + } + \%h; } sub find_servers { @@ -64,10 +72,9 @@ sub find_servers { } if ($browse) { my %l; - foreach (smbclient($browse)) { - my $nb = /^\s*Workgroup/ .. /^$/; - $nb > 2 or next; - my ($group, $name) = split(' ', lc($_)); + my $workgroups = smbclient($browse)->{Workgroup} || []; + foreach (@$workgroups) { + my ($group, $name) = map { lc($_) } @$_; # already done next if any { $group eq $_->{group} } values %servers; @@ -87,15 +94,14 @@ sub find_exports { my ($_class, $server) = @_; my @l; - foreach (smbclient($server)) { - chomp; - s/^\t//; - /NT_STATUS_/ and die $_; - my ($name, $type, $comment) = unpack "A15 A10 A*", $_; - if (($name eq '---------' && $type eq '----' && $comment eq '-------') .. /^$/) { - push @l, { name => $name, type => $type, comment => $comment, server => $server } - if $type eq 'Disk' && $name !~ /\$$/ && $name !~ /NETLOGON|SYSVOL/; - } + my $browse = smbclient($server); + if (my $err = find { /NT_STATUS_/ } @{$browse->{Error} || []}) { + die $err; + } + foreach (@{$browse->{Disk} || []}) { + my ($name, $comment) = @$_; + push @l, { name => $name, type => 'Disk', comment => $comment, server => $server } + if $name !~ /\$$/ && $name !~ /netlogon|NETLOGON|SYSVOL/; } @l; } @@ -116,11 +122,11 @@ sub fstab_entry_to_credentials { my ($server_name) = network::smb->from_dev($part->{device}) or return; - my ($options, $unknown) = fs::mount_options_unpack($part); + my ($options, $unknown) = fs::mount_options::unpack($part); $options->{'username='} && $options->{'password='} or return; my %h = map { $_ => delete $options->{"$_="} } qw(username domain password); $h{file} = $options->{'credentials='} = to_credentials($server_name, $h{username}); - fs::mount_options_pack_($part, $options, $unknown), \%h; + fs::mount_options::pack_($part, $options, $unknown), \%h; } sub remove_bad_credentials { @@ -165,12 +171,12 @@ sub write_smb_conf { log file = /var/log/samba/log.%m max log size = 50 socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 - character set = ISO8859-15 + unix charset = ISO8859-15 os level = 18 local master = No dns proxy = No - winbind uid = 10000-20000 - winbind gid = 10000-20000 + idmap uid = 10000-20000 + idmap gid = 10000-20000 winbind separator = + template homedir = /home/%D/%U template shell = /bin/bash @@ -179,7 +185,7 @@ sub write_smb_conf { } sub write_smb_ads_conf { - my ($domain,$realm) = @_; + my ($domain, $realm) = @_; #- was going to just have a canned config in samba-winbind #- and replace the domain, but sylvestre/buchan didn't bless it yet |
