Andrew Gaffney wrote:
> 
> I am writing a Perl script to automatically generate a netlogon.bat file for Samba
> whenever a user logs onto a domain. The only parameter that is passes to it is the
> username. My problem is that different groups get some of the same mappings. What I 
> really
> need to do is filter out duplicate lines in the finished output.

Whenever you want unique values think "hash".


> I tried piping the output
> through 'uniq' but it only filters successive duplicate lines. Anyone have any 
> suggestions?

Your example does not have 'uniq' (or 'sort -u') in it so I am not sure
what you are trying to do.


> #!/usr/bin/perl

use warnings;
use strict;

> my $user = shift;
> my $drives = {F => "NET USE F: \\\\SKYLINE\\SKYLINEF\r\n",
>                H => "NET USE H: \\\\SKYLINE\\SHARE\r\n",
>                I => "NET USE I: \\\\SHIPPING1\\INVENTORY\r\n",
>                M => "NET USE M: \\\\SKYLINE\\SKYLINEM\r\n",
>                S => "NET USE S: \\\\SHIPPING1\\SHOP\r\n",
>                Y => "NET USE Y: \\\\ACCOUNTING\\FLTSCHOOL\r\n",
>                Z => "NET USE Z: \\\\ACCOUNTING\\MAINT\r\n"};

Why not just use a hash instead of a reference to a hash?  The use of
"\r\n" is non-portable, you should use "\015\012" instead.

my $CRLF = "\015\012";

my %drives = (
    F => 'NET USE F: \\SKYLINE\SKYLINEF' . $CRLF,
    H => 'NET USE H: \\SKYLINE\SHARE' . $CRLF,
    I => 'NET USE I: \\SHIPPING1\INVENTORY' . $CRLF,
    M => 'NET USE M: \\SKYLINE\SKYLINEM' . $CRLF,
    S => 'NET USE S: \\SHIPPING1\SHOP' . $CRLF,
    Y => 'NET USE Y: \\ACCOUNTING\FLTSCHOOL' . $CRLF,
    Z => 'NET USE Z: \\ACCOUNTING\MAINT' . $CRLF,
    );


> my $which = {accounting => "F H I M S Y Z", mech => "I M S Z", dispatch => "M",
> instructors => "M"};

You should probably use a hash of arrays for this (so you don't have to
split the string later):

my %which = (
    accounting  => [ qw(F H I M S Y Z) ],
    mech        => [ qw(I M S Z) ],
    dispatch    => [ qw(M) ],
    instructors => [ qw(M) ],
    );


> my $groups = `cat /etc/group | grep ${user} | cut -d ':' -f 1`;

Ick, ick, ick!  Perl provides built-in functions to access /etc/group
and /etc/passwd

perldoc -f getgrnam
perldoc -f getgrgid
perldoc -f getgrent
perldoc -f setgrent
perldoc -f endgrent

perldoc -f getpwnam
perldoc -f getpwuid
perldoc -f getpwent
perldoc -f setpwent
perldoc -f endpwent


> $groups =~ s/\n/\:/sg;
> 
> # Start generating logon script
> #open LOGON, ">/usr/local/samba/netlogon/${user}.bat";
> open LOGON, ">/tmp/${user}.bat";

You should _ALWAYS_ verify that the file opened correctly.

open LOGON, ">/tmp/$user.bat" or die "Cannot open /tmp/$user.bat: $!";


> print LOGON "[EMAIL PROTECTED] OFF\r\n";
> 
> foreach $group (split /:/, $groups) {
>    foreach $drive (split / /, $which->{$group}) {
>      print LOGON $drives->{$drive};
>    }
> }
> 
> close LOGON;



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to