NAME
   Passwd::Unix

SYNOPSIS
           use Passwd::Unix;

           my $pu = Passwd::Unix->new();
           my $err = $pu->user("example", $pu->encpass("my_secret"), $pu->maxuid + 1, 10,
                                                   "My User", "/home/example", "/bin/bash" );
           $pu->passwd("example", $pu->encpass("newsecret"));
           foreach my $user ($pu->users) {
                   print "Username: $user\nFull Name: ", $pu->gecos($user), "\n\n";
           }
           my $uid = $pu->uid('example');
           $pu->del("example");

           # or

           use Passwd::Unix qw(check_sanity reset encpass passwd_file shadow_file
                                   group_file backup warnings del del_user uid gid gecos
                                   home shell passwd rename maxgid maxuid exists_user
                                   exists_group user users users_from_shadow del_group
                                   group groups groups_from_gshadow);

           my $err = user( "example", encpass("my_secret"), $pu->maxuid + 1, 10,
                                           "My User", "/home/example", "/bin/bash" );
           passwd("example",encpass("newsecret"));
           foreach my $user (users()) {
                   print "Username: $user\nFull Name: ", gecos($user), "\n\n";
           }
           my $uid = uid('example');
           del("example");

ABSTRACT
   Passwd::Unix provides an abstract object-oriented and function interface
   to standard Unix files, such as /etc/passwd, /etc/shadow, /etc/group.
   Additionaly this module provides environment to testing new software,
   without using system critical files in /etc/dir.

DESCRIPTION
   The Passwd::Unix module provides an abstract interface to /etc/passwd,
   /etc/shadow and /etc/group format files. It is inspired by
   Unix::PasswdFile module (that one does not handle /etc/shadow file, what
   is necessary in modern systems like Sun Solaris 10 or Linux).

SUBROUTINES/METHODS
   new( [ param0 = 1, param1 => 0... ] )>
       Constructor. Possible parameters are:

       passwd - path to passwd file; default "/etc/passwd"
       shadow - path to shadow file; default "/etc/shadow"
       group - path to group file; default "/etc/group"
       gshadow - path to gshadow file if any; default "/etc/gshadow"
       umask - umask for creating files; default 0022 (standard for UNIX
       and Linux systems)
       backup - boolean; if set to 1, backup will be made; default 1
       warnings - boolean; if set to 1, important warnings will be
       displayed; default 0

   check_sanity()
       This method check if environment is sane. I.e. if users in *shadow*
       and in *passwd* are the same. This method is invoked in constructor.

   del( USERNAME0, USERNAME1... )
       This method is an alias for "del_user". It's for transition only.

   del_user( USERNAME0, USERNAME1... )
       This method will delete the list of users. It has no effect if the
       supplied users do not exist.

   del_group( GROUPNAME0, GROUPNAME1... )
       This method will delete the list of groups. It has no effect if the
       supplied groups do not exist.

   encpass( PASSWORD )
       This method will encrypt plain text into unix style MD5 password.

   gecos( USERNAME [,GECOS] )
       Read or modify a user's GECOS string (typically their full name).
       Returns the result of operation (1 or "undef") if GECOS was
       specified. Otherwhise returns the GECOS.

   gid( USERNAME [,GID] )
       Read or modify a user's GID. Returns the result of operation (TRUE
       or FALSE) if GID was specified otherwhise returns the GID.

   home( USERNAME [,HOMEDIR] )
       Read or modify a user's home directory. Returns the result of
       operation (1 or "undef") if HOMEDIR was specified otherwhise returns
       the HOMEDIR.

   maxuid( )
       This method returns the maximum UID in use by all users.

   maxgid( )
       This method returns the maximum GID in use by all groups.

   unused_uid( [MINUID] [,MAXUID] )
       This method returns the first unused UID in a given range. The
       default MINUID is 0. The default MAXUID is maximal integer value
       (computed from $Config{ intsize } ).

   unused_gid( [MINGID] [,MAXGID] )
       This method returns the first unused GID in a given range. The
       default MINGID is 0. The default MAXGID is maximal integer value
       (computed from $Config{ intsize } ).

   passwd( USERNAME [,PASSWD] )
       Read or modify a user's password. If you have a plaintext password,
       use the encpass method to encrypt it before passing it to this
       method. Returns the result of operation (1 or "undef") if PASSWD was
       specified. Otherwhise returns the PASSWD.

   rename( OLDNAME, NEWNAME )
       This method changes the username for a user. If NEWNAME corresponds
       to an existing user, that user will be overwritten. It returns FALSE
       on failure and TRUE on success.

   shell( USERNAME [,SHELL] )
       Read or modify a user's shell. Returns the result of operation (TRUE
       or FALSE) if SHELL was specified otherwhise returns the SHELL.

   uid( USERNAME [,UID] )
       Read or modify a user's UID. Returns the result of operation (TRUE
       or FALSE) if UID was specified otherwhise returns the UID.

   user( USERNAME [,PASSWD, UID, GID, GECOS, HOMEDIR, SHELL] )
       This method can add, modify, or return information about a user.
       Supplied with a single username parameter, it will return a six
       element list consisting of (PASSWORD, UID, GID, GECOS, HOMEDIR,
       SHELL), or undef if no such user exists. If you supply all seven
       parameters, the named user will be created or modified if it already
       exists.

   group( GROUPNAME [,GID, ARRAYREF] )
       This method can add, modify, or return information about a group.
       Supplied with a single groupname parameter, it will return a two
       element list consisting of (GID, ARRAYREF), where ARRAYREF is a ref
       to array consisting names of users in this GROUP. It will return
       undef and ref to empty array ("undef, [ ]") if no such group exists.
       If you supply all three parameters, the named group will be created
       or modified if it already exists.

   users()
       This method returns a list of all existing usernames.

   users_from_shadow()
       This method returns a list of all existing usernames in a shadow
       file.

   groups()
       This method returns a list of all existing groups.

   groups_from_gshadow()
       This method returns a list of all existing groups in a gshadow file.

   exists_user(USERNAME)
       This method checks if specified user exists. It returns TRUE or
       FALSE.

   exists_group(GROUPNAME)
       This method checks if specified group exists. It returns TRUE or
       FALSE.

   default_umask([UMASK])
       This method, if called with an argument, sets default umask for this
       module (not Your program!). Otherwise returns the current UMASK.
       Probably You don't want to change this.

   passwd_file([PATH])
       This method, if called with an argument, sets path to the *passwd*
       file. Otherwise returns the current PATH.

   shadow_file([PATH])
       This method, if called with an argument, sets path to the *shadow*
       file. Otherwise returns the current PATH.

   group_file([PATH])
       This method, if called with an argument, sets path to the *group*
       file. Otherwise returns the current PATH.

   gshadow_file([PATH])
       This method, if called with an argument, sets path to the *gshadow*
       file. Otherwise returns the current PATH.

   reset()
       This method sets paths to files *passwd*, *shadow*, *group* to the
       default values.

   error()
       This method returns the last error (even if "warnings" is disabled).

DEPENDENCIES
   Struct::Compare
   Crypt::PasswdMD5

INCOMPATIBILITIES
   None known.

BUGS AND LIMITATIONS
   None. I hope.

THANKS
   Thanks to Christian Kuelker for suggestions and reporting some bugs :-).
   Thanks to Steven Haryanto for suggestions.
   Thanks to Jonas Genannt for suggestions as well as supplying relevant
   patch!
   BIG THANKS to Lopes Victor for reporting some bugs and his exact
   sugesstions :-)
   Thanks to Foudil BRÉTEL for some remarks, suggestions as well as
   supplying relevant patch!
   BIG thanks to Artem Russakovskii for reporting a bug.

AUTHOR
   Strzelecki Lukasz <[email protected]>

LICENCE AND COPYRIGHT
   This program is free software; you can redistribute it and/or modify it
   under the same terms as Perl itself.

   See http://www.perl.com/perl/misc/Artistic.html