PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/linkedfs/usr/lib/libDrakX/network/smb.pm

https://bitbucket.org/harakiri/trk
Perl | 217 lines | 180 code | 32 blank | 5 comment | 16 complexity | eb73c5b78391f64b84b70e622b37a30c MD5 | raw file
Possible License(s): GPL-2.0, MIT, LGPL-3.0
  1. package network::smb; # $Id: smb.pm,v 1.30 2005/01/05 10:48:43 prigaux Exp $
  2. use common;
  3. use fs;
  4. use network::network;
  5. use network::smbnfs;
  6. our @ISA = 'network::smbnfs';
  7. sub to_fstab_entry {
  8. my ($class, $e) = @_;
  9. my $part = $class->to_fstab_entry_raw($e, 'smbfs');
  10. if ($e->{server}{username}) {
  11. my ($options, $unknown) = fs::mount_options::unpack($part);
  12. $options->{"$_="} = $e->{server}{$_} foreach qw(username password domain);
  13. fs::mount_options::pack($part, $options, $unknown);
  14. }
  15. $part;
  16. }
  17. sub from_dev {
  18. my ($_class, $dev) = @_;
  19. $dev =~ m|//(.*?)/(.*)|;
  20. }
  21. sub to_dev_raw {
  22. my ($_class, $server, $name) = @_;
  23. '//' . $server . '/' . $name;
  24. }
  25. sub check {
  26. my ($_class, $in) = @_;
  27. $in->do_pkgs->ensure_binary_is_installed('samba-client', 'nmblookup');
  28. }
  29. sub smbclient {
  30. my ($server) = @_;
  31. my $name = $server->{name} || $server->{ip};
  32. my $ip = $server->{ip} ? "-I $server->{ip}" : '';
  33. my $group = $server->{group} ? qq( -W "$server->{group}") : '';
  34. my $U = $server->{username} ? sprintf("%s/%s%%%s", @$server{'domain', 'username', 'password'}) : '%';
  35. my %h;
  36. foreach (`smbclient -g -U "$U" -L "$name" $ip$group 2>/dev/null`) {
  37. if (my ($type, $v1, $v2) = /(.*)\|(.*)\|(.*)/) {
  38. push @{$h{$type}}, [ $v1, $v2 ];
  39. } elsif (/^Error returning browse list/) {
  40. push @{$h{Error}}, $_;
  41. }
  42. }
  43. \%h;
  44. }
  45. sub find_servers {
  46. my (undef, @l) = `nmblookup "*"`;
  47. s/\s.*\n// foreach @l;
  48. my @servers = grep { network::network::is_ip($_) } @l;
  49. my %servers;
  50. $servers{$_}{ip} = $_ foreach @servers;
  51. my ($ip, $browse);
  52. foreach (`nmblookup -A @servers`) {
  53. my $nb = /^Looking up status of (\S+)/ .. /^$/ or next;
  54. if ($nb == 1) {
  55. $ip = $1;
  56. } elsif (/<00>/) {
  57. $servers{$ip}{/<GROUP>/ ? 'group' : 'name'} ||= lc first(/(\S+)/);
  58. } elsif (/__MSBROWSE__/) {
  59. $browse ||= $servers{$ip};
  60. }
  61. }
  62. if ($browse) {
  63. my %l;
  64. my $workgroups = smbclient($browse)->{Workgroup} || [];
  65. foreach (@$workgroups) {
  66. my ($group, $name) = map { lc($_) } @$_;
  67. # already done
  68. next if any { $group eq $_->{group} } values %servers;
  69. $l{$name} = $group;
  70. }
  71. if (my @l = keys %l) {
  72. foreach (`nmblookup @l`) {
  73. $servers{$1} = { name => $2, group => $l{$2} } if /(\S+)\s+([^<]+)<00>/;
  74. }
  75. }
  76. }
  77. values %servers;
  78. }
  79. sub find_exports {
  80. my ($_class, $server) = @_;
  81. my @l;
  82. my $browse = smbclient($server);
  83. if (my $err = find { /NT_STATUS_/ } @{$browse->{Error} || []}) {
  84. die $err;
  85. }
  86. foreach (@{$browse->{Disk} || []}) {
  87. my ($name, $comment) = @$_;
  88. push @l, { name => $name, type => 'Disk', comment => $comment, server => $server }
  89. if $name !~ /\$$/ && $name !~ /netlogon|NETLOGON|SYSVOL/;
  90. }
  91. @l;
  92. }
  93. sub authentications_available {
  94. my ($server) = @_;
  95. map { if_(/^auth.\Q$server->{name}.\E(.*)/, $1) } all("/etc/samba");
  96. }
  97. sub to_credentials {
  98. my ($server_name, $username) = @_;
  99. $username or die 'to_credentials';
  100. "/etc/samba/auth.$server_name.$username";
  101. }
  102. sub fstab_entry_to_credentials {
  103. my ($part) = @_;
  104. my ($server_name) = network::smb->from_dev($part->{device}) or return;
  105. my ($options, $unknown) = fs::mount_options::unpack($part);
  106. $options->{'username='} && $options->{'password='} or return;
  107. my %h = map { $_ => delete $options->{"$_="} } qw(username domain password);
  108. $h{file} = $options->{'credentials='} = to_credentials($server_name, $h{username});
  109. fs::mount_options::pack_($part, $options, $unknown), \%h;
  110. }
  111. sub remove_bad_credentials {
  112. my ($server) = @_;
  113. unlink to_credentials($server->{name}, $server->{username});
  114. }
  115. sub save_credentials {
  116. my ($credentials) = @_;
  117. my $file = $credentials->{file};
  118. output_with_perm("$::prefix$file", 0640, map { "$_ = $credentials->{$_}\n" } qw(username domain password));
  119. }
  120. sub read_credentials_raw {
  121. my ($file) = @_;
  122. my %h = map { /(.*?)\s*=\s*(.*)/ } cat_("$::prefix$file");
  123. \%h;
  124. }
  125. sub read_credentials {
  126. my ($server, $username) = @_;
  127. put_in_hash($server, read_credentials_raw(to_credentials($server->{name}, $username)));
  128. }
  129. sub write_smb_conf {
  130. my ($domain) = @_;
  131. #- was going to just have a canned config in samba-winbind
  132. #- and replace the domain, but sylvestre/buchan did not bless it yet
  133. my $f = "$::prefix/etc/samba/smb.conf";
  134. rename $f, "$f.orig";
  135. output($f, "
  136. [global]
  137. workgroup = $domain
  138. server string = Samba Server %v
  139. security = domain
  140. encrypt passwords = Yes
  141. password server = *
  142. log file = /var/log/samba/log.%m
  143. max log size = 50
  144. socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
  145. unix charset = ISO8859-15
  146. os level = 18
  147. local master = No
  148. dns proxy = No
  149. idmap uid = 10000-20000
  150. idmap gid = 10000-20000
  151. winbind separator = +
  152. template homedir = /home/%D/%U
  153. template shell = /bin/bash
  154. winbind use default domain = yes
  155. ");
  156. }
  157. sub write_smb_ads_conf {
  158. my ($domain, $realm) = @_;
  159. #- was going to just have a canned config in samba-winbind
  160. #- and replace the domain, but sylvestre/buchan did not bless it yet
  161. my $f = "$::prefix/etc/samba/smb.conf";
  162. rename $f, "$f.orig";
  163. output($f, "
  164. [global]
  165. workgroup = $domain
  166. realm = $realm
  167. server string = Samba Member %v
  168. security = ads
  169. encrypt passwords = Yes
  170. password server = *
  171. log file = /var/log/samba/log.%m
  172. max log size = 50
  173. socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
  174. os level = 18
  175. local master = No
  176. dns proxy = No
  177. winbind uid = 10000-20000
  178. winbind gid = 10000-20000
  179. winbind separator = +
  180. template homedir = /home/%D/%U
  181. template shell = /bin/bash
  182. winbind use default domain = yes
  183. ");
  184. }
  185. 1;