Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 7.21 KB | None | 0 0
  1. package fs::remote::smb; # $Id: smb.pm 258615 2009-07-27 06:26:03Z pterjan $
  2.  
  3.  
  4.  
  5.  
  6. use common;
  7. use fs::mount_options;
  8. use fs::remote;
  9.  
  10.  
  11. our @ISA = 'fs::remote';
  12.  
  13. sub to_fstab_entry {
  14.     my ($class, $e) = @_;
  15.     my $part = $class->to_fstab_entry_raw($e, 'cifs');
  16.     if ($e->{server}{username}) {
  17.     my ($options, $unknown) = fs::mount_options::unpack($part);
  18.     $options->{"$_="} = $e->{server}{$_} foreach qw(username password domain);
  19.     fs::mount_options::pack($part, $options, $unknown);
  20.     }
  21.     $part;
  22. }
  23. sub from_dev {
  24.     my ($_class, $dev) = @_;
  25.     $dev =~ m|//(.*?)/(.*)|;
  26. }
  27. sub to_dev_raw {
  28.     my ($_class, $server, $name) = @_;
  29.     '//' . $server . '/' . $name;
  30. }
  31.  
  32. sub check {
  33.     my ($_class, $in) = @_;
  34.     $in->do_pkgs->ensure_binary_is_installed('samba-client', 'nmblookup');
  35. }
  36.  
  37. sub smbclient {
  38.     my ($server) = @_;
  39.     my $name  = $server->{name} || $server->{ip};
  40.     my $ip    = $server->{ip} ? "-I $server->{ip}" : '';
  41.     my $group = $server->{group} ? qq( -W "$server->{group}") : '';
  42.  
  43.     my $U = $server->{username} ? sprintf("%s/%s%%%s", @$server{'domain', 'username', 'password'}) : '%';
  44.     my %h;
  45.     foreach (`smbclient -g -U "$U" -L "$name" $ip$group 2>/dev/null`) {
  46.     if (my ($type, $v1, $v2) = /(.*)\|(.*)\|(.*)/) {
  47.         push @{$h{$type}}, [ $v1, $v2 ];
  48.     } elsif (/^Error returning browse list/) {
  49.         push @{$h{Error}}, $_;
  50.     }
  51.     }
  52.     \%h;
  53. }
  54.  
  55. sub find_servers {
  56.  
  57. #début modif
  58.     my (undef, @l2) = `nmblookup "*"; nmblookup -M -- -`;
  59.     s/\s.*\n// foreach @l2; #ne garde que le premier mot de chaque élément
  60.     require network::network;
  61.     my @servers2 = grep { network::network::is_ip($_) } @l2; #ne garde que les IPs de la liste
  62.     return unless @servers2; # sortie si aucun serveur trouvé
  63.     my %servers2;
  64.     $servers2{$_}{ip} = $_ foreach @servers2; #table de hachage: élimine les doubles
  65.     my $ip2;
  66.     foreach (`nmblookup -A @servers2`) { # liste des services de tous les serveurs détectés
  67.       my $nb2 = /^Looking up status of (\S+)/ .. /^$/ or next;  # utilise la variable par défaut
  68.       if ($nb2 == 1) {
  69.         $ip2 = $1; # variable 1 de la substitution: adresse contenue dans 'Looking up ...'
  70.       } elsif (/<00>/) {
  71.         $servers2{$ip2}{/<GROUP>/ ? 'group' : 'name'} ||= lc first(/(\S+)/); # il s'agit d'un nom de GROUP ou d'hôte ?
  72.       }
  73.     }
  74.        
  75.     my @groupes, %groupes;
  76.     foreach (%servers2){
  77.     print "defaut: $_ \n";
  78.     print "servers2 ip2 group: ", $servers2{$_}{'group'}, "\n";
  79.     $groupes{$servers2{$_}{'group'}}{'group'} = $servers2{$_}{'group'};
  80.     }
  81.     push @groupes, $groupes{$_}{'group'} foreach %groupes;
  82.     print "groupes: @groupes \n";
  83.  
  84.     my (undef, @l) = `nmblookup "*"; nmblookup @groupes; nmblookup -M -- -`;
  85. #fin modif
  86.  
  87.  
  88. #    my (undef, @l) = `nmblookup "*"; nmblookup -M -- -`;
  89.     s/\s.*\n// foreach @l;
  90.     require network::network;
  91.     my @servers = grep { network::network::is_ip($_) } @l;
  92.     return unless @servers;
  93.     my %servers;
  94.     $servers{$_}{ip} = $_ foreach @servers;
  95.     my ($ip, $browse);
  96.     foreach (`nmblookup -A @servers`) {
  97.     my $nb = /^Looking up status of (\S+)/ .. /^$/ or next;
  98.     if ($nb == 1) {
  99.         $ip = $1;
  100.     } elsif (/<00>/) {
  101.         $servers{$ip}{/<GROUP>/ ? 'group' : 'name'} ||= lc first(/(\S+)/);
  102.     } elsif (/__MSBROWSE__/) {
  103.         $browse ||= $servers{$ip};
  104.     }
  105.     }
  106.     if ($browse) {
  107.     my %l;
  108.     my $workgroups = smbclient($browse)->{Workgroup} || [];
  109.     foreach (@$workgroups) {
  110.         my ($group, $name) = map { lc($_) } @$_;
  111.  
  112.         # already done
  113.         next if any { $group eq $_->{group} } values %servers;
  114.  
  115.         $l{$name} = $group;
  116.     }
  117.     if (my @l = keys %l) {
  118.         foreach (`nmblookup @l`) {
  119.         $servers{$1} = { name => $2, group => $l{$2} } if /(\S+)\s+([^<]+)<00>/;
  120.         }
  121.     }
  122.     }
  123.     values %servers;
  124. }
  125.  
  126. sub find_exports {
  127.     my ($_class, $server) = @_;
  128.     my @l;
  129.  
  130.     my $browse = smbclient($server);
  131.     if (my $err = find { /NT_STATUS_/ } @{$browse->{Error} || []}) {
  132.     die $err;
  133.     }
  134.     foreach (@{$browse->{Disk} || []}) {
  135.     my ($name, $comment) = @$_;
  136.     push @l, { name => $name, type => 'Disk', comment => $comment, server => $server }
  137.       if $name !~ /\$$/ && $name !~ /netlogon|NETLOGON|SYSVOL/;
  138.     }
  139.     @l;
  140. }
  141.  
  142. sub authentications_available {
  143.     my ($server) = @_;
  144.     map { if_(/^auth.\Q$server->{name}.\E(.*)/, $1) } all("/etc/samba");
  145. }
  146.  
  147. sub to_credentials {
  148.     my ($server_name, $username) = @_;
  149.     $username or die 'to_credentials';
  150.     "/etc/samba/auth.$server_name.$username";
  151. }
  152.  
  153. sub fstab_entry_to_credentials {
  154.     my ($part) = @_;    
  155.  
  156.     my ($server_name) = fs::remote::smb->from_dev($part->{device}) or return;
  157.  
  158.     my ($options, $unknown) = fs::mount_options::unpack($part);
  159.     $options->{'username='} && $options->{'password='} or return;
  160.     my %h = map { $_ => delete $options->{"$_="} } qw(username password);
  161.     $h{file} = $options->{'credentials='} = to_credentials($server_name, $h{username});
  162.     fs::mount_options::pack_($part, $options, $unknown), \%h;
  163. }
  164.  
  165. sub remove_bad_credentials {
  166.     my ($server) = @_;
  167.     unlink to_credentials($server->{name}, $server->{username});
  168. }
  169.  
  170. sub save_credentials {
  171.     my ($credentials) = @_;
  172.     my $file = $credentials->{file};
  173.     output_with_perm("$::prefix$file", 0640, map { "$_=$credentials->{$_}\n" } qw(username password));
  174. }
  175.  
  176.  
  177. sub read_credentials_raw {
  178.     my ($file) = @_;
  179.     my %h = map { /(.*?)\s*=\s*(.*)/ } cat_("$::prefix$file");
  180.     \%h;
  181. }
  182.  
  183. sub read_credentials {
  184.     my ($server, $username) = @_;
  185.     put_in_hash($server, read_credentials_raw(to_credentials($server->{name}, $username)));
  186. }
  187.  
  188.  
  189. sub write_smb_conf {
  190.     my ($domain) = @_;
  191.  
  192.     #- was going to just have a canned config in samba-winbind
  193.     #- and replace the domain, but sylvestre/buchan did not bless it yet
  194.  
  195.     my $f = "$::prefix/etc/samba/smb.conf";
  196.     rename $f, "$f.orig";
  197.     output($f, "
  198. [global]
  199.     workgroup = $domain  
  200.     server string = Samba Server %v
  201.     security = domain  
  202.     encrypt passwords = Yes
  203.     password server = *
  204.     log file = /var/log/samba/log.%m
  205.     max log size = 50
  206.     socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
  207.     unix charset = ISO8859-15
  208.     os level = 18
  209.     local master = No
  210.     dns proxy = No
  211.     idmap uid = 10000-20000
  212.     idmap gid = 10000-20000
  213.     winbind separator = +
  214.     template homedir = /home/%D/%U
  215.     template shell = /bin/bash
  216.     winbind use default domain = yes
  217. ");
  218. }
  219.  
  220. sub write_smb_ads_conf {
  221.     my ($domain, $realm) = @_;
  222.  
  223.     #- was going to just have a canned config in samba-winbind
  224.     #- and replace the domain, but sylvestre/buchan did not bless it yet
  225.  
  226.     my $f = "$::prefix/etc/samba/smb.conf";
  227.     rename $f, "$f.orig";
  228.     output($f, "
  229. [global]
  230.        workgroup = $domain
  231.        realm  = $realm
  232.        server string = Samba Member %v
  233.        security = ads
  234.        encrypt passwords = Yes
  235.        password server = *
  236.        log file = /var/log/samba/log.%m
  237.        max log size = 50
  238.        socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
  239.        os level = 18
  240.        local master = No
  241.        dns proxy = No
  242.        winbind uid = 10000-20000
  243.        winbind gid = 10000-20000
  244.        winbind separator = +
  245.        template homedir = /home/%D/%U
  246.        template shell = /bin/bash
  247.        winbind use default domain = yes
  248. ");
  249. }
  250. 1;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement