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.pm52
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