On Sat, Feb 07, 2004 at 12:57:45PM -0600, Kenton Brede wrote:

> I've written the following subroutine to snag the next available UID in
> the 700 range from /etc/passwd.  I then use the return value with
> "useradd" to add a new user.
> 
> The subroutine works fine.  If no UID 700 is found it returns 700.
> It then returns the next available UID or adds 1 to the last UID in the 700
> block.    
> 
> Even though it is functional it seems a little clunky to me.  If anyone
> has the time and inclination to point me to changes I could make I
> would appreciate it.
> Thanks,
> Kent
> 
> #!/usr/bin/perl
> use warnings;
> use strict;
> 
> print get_uid() . "\n";
> 
> # Get next available UID in the 700 range
> sub get_uid {
>     # Create array populated by UIDs
>     my $new_uid ||= '700'; # default to 700 if it doesn't exist.

my $new_uid = 700;

>     my @list;
>     while(<DATA>) {
>         my @uids = split(/:/);
>         if ($uids[2] =~ /^7\d\d$/) {
>             push @list, $uids[2];
>         }
>     }
> 
>     @list = sort(@list);
> 
>     # iterate though list snagging the next available UID
>     my $num = '700';
>     foreach my $i (@list) {
>         if ($i > $num) {
>             $new_uid = $num;
>             last;
>         }
>         elsif ($i == $num) {
>             $new_uid = $num + 1;
>         }
>         $num++;
>     }
>     return $new_uid;
> }
> 
> __DATA__
> user1:x:700:101:user1:/dev/null:/bin/false
> user2:x:706:101:user2:/dev/null:/bin/false
> user3:x:707:101:user3:/dev/null:/bin/false
> user4:x:708:101:user4:/dev/null:/bin/false


I'd probably code something like:

  perl -le '$u = 700; $u++ while getpwuid $u; print $u'

perldoc -f getpwuid

-- 
Paul Johnson - [EMAIL PROTECTED]
http://www.pjcj.net

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