Main purpose of this software is to really help UNIX system administrators in those tasks regarding users management.
This is not only a tool, it is a library which can be used in any kind of program. Indeed the command line tool here provided is only a possible use of this library.
Since it is not a numbers crunching nor a real time application, I chose the flexibility and power of a cool interpreted language, Python. Of course Prua library is a Python module.
Prua is a free piece of software licensed under GNU General Public License. Developing infrastructure is hosted by Savannah (project page).
Summary of features and design goals I am currently pursuing:
Here are some plugins:
Some extras:
(FI = fully implemented, MI = mostly implemented, PI = partially implemented, P = planned, W = wished but still not planned)
Hot topic with ice-cold answer: there is not any documentation yet. The command line tool has an integrated help which should be enough for initial use. Please try "prua help".
Some examples of use follows.
<prua> # comment # this is the configuration for prua plugins: prua-ldap, prua-home, prua-file <Backend name="passwd" type="prua-file"> passwd: /etc/passwd group: /etc/group shadow: /etc/shadow gshadow: /etc/gshadow Policy: md5 </Backend> <Backend name="ldap" type="prua-ldap"> Uri: ldap://localhost Binddn: cn=admin,dc=localnet Password: secret Base: dc=localnet Policy: md5 </Backend> <Template name="default" backend="passwd"> uid_min: 1000 uid_max: 29999 gid_min: 1000 gid_max: 29999 # if gid misses, a group with the same name of the user will be created gid: users # base pathname for user home directory home_base: /home shadowMin: 0 shadowMax: 99999 shadowWarning: 10 shadowInactive: 30 shadowExpire: -1 shadowLastChange: 0 <Handler type="prua-home"> Skel: /etc/skel </Handler> </Template> <Template name="shared" type="ldap"> uid_min: 30000 uid_max: 39999 gid_min: 30000 gid_max: 39999 # if gid misses, a group with the same name of the user will be created gid: users home_base: /home/shared shadowMin: 0 shadowMax: 99999 shadowWarning: 10 shadowInactive: 30 shadowExpire: -1 shadowLastChange: 0 <Handler type="prua-home"> Skel: /etc/skel_shared </Handler> </Template></prua>
$ prua help
Usage: prua [prua-options] <subcommand> [options] [args]
Type "prua help <subcommand>" for help on a specific subcommand.
Available subcommands:
addgroup - add a new group
adduser - add a new user
chage - manage user password aging
check - check actual configuration
delgroup - delete a group
deluser - delete a user
help - print detailed help
license - print conditions for copying
modgroup - modify a group
moduser - modify a user
setup - setup actual configuration
$ prua check
manager initialized from file .pruarc...
- templates: default, hi
checking templates...
+ default:
- checking backend...
. opening connection to ldap://localhost... succeeded
. binding as cn=admin,dc=localnet... succeeded
. checking base dc=localnet... succeeded
. checking base ou=People,dc=localnet for users... succeeded
. checking base ou=Group,dc=localnet for groups... failed (No such object)
. closing connection... succeeded
+ hi:
- checking backend...
. opening connection to ldap://localhost... succeeded
. binding as cn=admin,dc=localnet... succeeded
. checking base dc=localnet... succeeded
. checking base ou=People,ou=Prua,dc=localnet for users... failed (No such object)
. checking base ou=Group,ou=Prua,dc=localnet for groups... failed (No such object)
. closing connection... succeeded
$ prua setup default
manager initialized from file .pruarc...
- templates: default, hi
setting up templates...
+ default:
- setting up backend...
. setting up base dc=localnet... failed (Already exists)
. setting up base ou=People,dc=localnet for users... failed (Already exists)
. setting up base ou=Group,dc=localnet for groups... done
$ prua adduser guest
New password:
Re-enter new password:
creating user guest...
$ prua chage -l guest
Minimum: -1
Maximum: -1
Warning: -1
Inactive: -1
Last Change: Never
Password Expires: Never
Password Inactive: Never
Account Expires: Never
$ prua chage -M 100 -W 7 -d 2003-03-31 guest
$ prua chage -l guest
Minimum: -1
Maximum: 100
Warning: 7
Inactive: -1
Last Change: Mar 31, 2003
Password Expires: Jul 09, 2003
Password Inactive: Never
Account Expires: Never
$ ldapsearch -x -b "dc=localnet" -LLL "(uid=guest)"
dn: uid=guest,ou=People,dc=localnet
uid: guest
loginShell: /bin/bash
uidNumber: 2000
gidNumber: 44
gecos: Tux Penguin
sn: Penguin
homeDirectory: /home/prua/guest
givenName: Tux
cn: Tux Penguin
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
shadowWarning: 7
shadowMax: 100
shadowLastChange: 12142
$ python
Python 2.2.3 (#1, Jun 4 2003, 02:54:59)
[GCC 3.3 (Debian)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import prua
>>> manager = prua.init(".pruarc")
manager: loading plugin prua-ldap at prua/plugin/prua-ldap.py...
manager: loading plugin prua-home at prua/plugin/prua-home.py...
manager: loading plugin prua-shell at prua/plugin/prua-shell.py...
>>> users = manager.query_user(username = "guest")
>>> len(users)
1
>>> u = users[0]
>>> print u
template name: default
username: guest
uid: 2000 (2000)
gid: 44 (44)
home: /home/prua/guest (/home/prua/guest)
shell: /bin/bash (/bin/bash)
firsname: Tux (Tux)
lastname: Penguin (Penguin)
gecos: Tux Penguin (Tux Penguin)
email: None (None)
home phone: None (None)
cellular phone: None (None)
shadowMin: None (None)
shadowMax: 100 (100)
shadowWarning: 7 (7)
shadowInactive: None (None)
shadowExpire: None (None)
shadowLastChange: 12142 (12142)
>>> g=manager.new_group("guest")
>>> print g
template name: default
groupname: guest
gid: 2000 (None)
>>> g.commit()
>>> u.gid=g.gid
>>> u.shell="/bin/zsh"
>>> u.firstname="Guest"
>>> u.lastname="User"
>>> u.commit()
$ ldapsearch -x -b "dc=localnet" -LLL "(uid=guest)"
dn: uid=guest,ou=People,dc=localnet
uid: guest
uidNumber: 2000
gidNumber: 2000
gecos: Tux Penguin
homeDirectory: /home/prua/guest
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
shadowWarning: 7
shadowMax: 100
shadowLastChange: 12142
loginShell: /bin/zsh
sn: User
givenName: Guest
cn: Guest User
$
Until now no public releases have been made. Anyway public CVS repository is available for anonymous use.
It is available the prua-devel mailing list where is possible to talk about anything regarding Prua and its evolution. If you prefer, you can contact me directly. Write to Domenico Andreoli.