Everything in this tool exists because a shell script was the wrong place for it. Creating four hundred accounts in September, changing a class's passwords before a lesson, or finding out why one student cannot log in — all of it was being done by hand, which is to say by memory, which is to say unreliably.
What it covers
| Task | What it does |
|---|---|
| Users | Create, check and edit attributes, delete. |
| Passwords | Change one, or bulk-change from CSV, with kid-friendly or stronger temporary passwords. |
| Bulk import | Create users from a CSV export of the student information system. |
| Groups | Manage supplementary memberUid groups; bulk add members from CSV. |
| Audit | Check primary gidNumber / posixGroup / memberUid consistency before changing anything. |
| Export | Write users to XLSX, grouped by primary group. |
Home directory styles
Two schemes are supported, because schools outgrow the simple one:
classic_unix—/home/{username}graduation_year_group— school-style staff and class-year paths
The home path can be recomputed from the configured style, which is how a change of policy gets applied to accounts that already exist rather than only to new ones.
The audit is the point
The group audit checks three things that must agree and often do not: the user's primary
gidNumber, the existence of the matching posixGroup, and the
supplementary memberUid entries. When they disagree, the symptom is not an
error message — it is a student who can log in but cannot write to a course share,
or one who appears to own another student's files. Finding that before a change is worth
more than any feature on the list.
Status
Useful, and still site-admin oriented: it assumes you know your suffix, your bind account and what you are doing. The README is explicit about reading the configuration before running it against a live directory, and that advice is worth taking literally — this tool writes.
There is optional Zimbra provisioning output for sites that run it alongside OpenLDAP.
The source, the issues and the history are in the repository.
View on GitHub →