useradd script

You can hack this if you want - no warrenties come with it of course.

1/2 half of code:


#!/u/bin/perl
#    This is a script to add users to the passwd / shadow files.  It
# prompts for a first name, middle inital and last name.  A username
# is generated from the first inital, middle inital, and lastname.
# This username can be changed.  After a username has been selected
# the passwd file is scaned to see if the user already exists.  If the
# username exists then the user is prompted to change the username.
#   Once a valid username is chosen, the passwd file is scaned to find
# the next free userid.  This userid must be greater than the $minuid
# variable.  The entry is added to the passwd and shadow files, the
# home direcrory is created and 'make passwd' is done.
#
# $Revision: 1.5 $

#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
# These values are changable.  Set them to the configuration
#  of enviroment.

#This is the NIS domain name.
chomp ($domain = `/bin/domainname`);

# This file contains a log of the accounts and passwords for the 
# created users.  Look here for the passwords.
$PASSWD_FILE="/var/nis/bin/PASS.OUT";

# This is the shell to give the user
$shell="/bin/ksh";

# This is the location of the homedir.  This is where to make it.
# the homedir passwd entry is set to /home/$username
$homedir='/toast1/home/home/';

# The location of the source files.
$NISfiles="/var/nis/$domain/masters";

# This is the salt used when crypting the password
$SALT="qtzjk24s1";

# Command to make the passwd files
$MAKE = "cd /var/nis/$domain ; /u/bin/make passwd";

# location of the cvs (version control system) executable
$CVS = "/u/bin/cvs -n";

#default location of CVS
$CVSROOT = "/adm/cvs/cvsroot";

#First UID to start with
$FIRST_UID = 1500;



#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

###############################################################
# let the coding begin
###############################################################

BEGIN {
        print ("\n\nNIS account creation utility\n\n\n");
}

#Check and make sure everything is cool with CVS before we start
#&check_cvs if ( -f $CVS);


# reads passwd file and assigns it to PASS file handle.  
# takes each line in PASS filehandle and assigns each line to an individual
# element in array passwd.

open PASS, "<$NISfiles/passwd" or die "can't open $NISfiles/passwd";
while (<PASS>) {

        chomp;

        #skip comments and whitespace
        next if (/^\s*#/ or /^\s*$/);

        # get the fields in the passwd entry
        ($uname,$x,$uid,$gid,$gecos,$home,$shell)  = split ':', $_;

        # trying to be careful
        if ($uname eq "") { die "ERROR: bad line in passwd:\n$_\n\n" }

        # check for duplicate uids and unames
        if ( $passwd {$uid} ) {
                die "ERROR: duplicate entries for UID $uid \n$passwd{$uid} \n$_ 
\nPlease correct error before using adduser.\n\n";

        } elsif ($uname2uid {$uname}) {
                die "ERROR: duplicate entries for $uname \n $passwd{$uname2uid{$
uname}} \n $_ \nPlease correct this error before using adduser.\n\n";
        }

        # key the passwd list on uid. used to sort the file by uid
        $passwd {$uid} = $_;

        # store an indexed list of unames used to detect duplicate unames
        $uname2uid {$uname} = $uid;

}
close PASS;

open SHADOW, "<$NISfiles/shadow" or die "can't open shadow in $NISfiles";
while (<SHADOW>) {

        chomp;

        # skip comments and whitespace
        next if (/^\s*#/ or /^\s*$/);

        # get the fields in the shadow entry
        ($uname) = split /:/, $_;

        # die if no passwd entry exists for uname 
        unless ( $uname2uid {$uname}) 
                { die "ERROR: User $uname exists in shadow but not in passwd fil
e.\nPlease correct this error before using adduser.\n\n" }

        # key the shadow list on uid by converting uname to uid
        $uid = $uname2uid {$uname};

        # error if uid not in passwd file
        unless ($uid) {
            die "ERROR: user $uname in shadow but not in passwd.  This error may
 also be caused by having a valid passwd entry with uid equal to zero.  This pro
gram does not support uid = 0 since it was designed for use with NIS.\nPlease co
rrect this error.\n\n";
        }

        # check for duplicate shadow entries
        if ($shadow {$uid})
            { die "ERROR: duplicate shadow entry for $uname\n$shadow{$uid}\n$_\n
\n" }

        # finally store the shadow entry in a hash ordered by username.
        $shadow {$uname2uid {$uname}} = $_;
}
close SHADOW;

# check for users in passwd but not in shadow
for $uid (keys %passwd) {

    unless ($shadow {$uid}) 
        { die "This user is missing a shadow entry:\n$passwd{$uid}" }

}

#init rand number generator
srand(time|$$);

########################
### Begin Loop that allows mutiple accounts to be added at once
#########