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>