// -*- mode:doc -*- ;
// vim: set syntax=asciidoc:

[[makeuser-syntax]]
== Makeusers syntax documentation

The syntax to create users is inspired by the makedev syntax, above, but
is specific to Buildroot.

The syntax for adding a user is a space-separated list of fields, one
user per line; the fields are:

|=================================================================
|username |uid |group |gid |password |home |shell |groups |comment
|=================================================================

Where:

- +username+ is the desired user name (aka login name) for the user.
  It can not be +root+, and must be unique. If set to +-+, then just a
  group will be created.
- +uid+ is the desired UID for the user. It must be unique, and not
  +0+. If set to +-1+ or +-2+, then a unique UID will be computed by
  Buildroot, with +-1+ denoting a system UID from [100...999] and +-2+
  denoting a user UID from [1000...1999]. 
- +group+ is the desired name for the user's main group. It can not
  be +root+. If the group does not exist, it will be created.
- +gid+ is the desired GID for the user's main group. It must be unique,
  and not +0+. If set to +-1+ or +-2+, and the group does not already
  exist, then a unique GID will be computed by Buildroot, with +-1+
  denoting a system GID from [100...999] and +-2+ denoting a user GID
  from [1000...1999]. 
- +password+ is the crypt(3)-encoded password. If prefixed with +!+,
  then login is disabled. If prefixed with +=+, then it is interpreted
  as clear-text, and will be crypt-encoded (using MD5). If prefixed with
  +!=+, then the password will be crypt-encoded (using MD5) and login
  will be disabled. If set to +*+, then login is not allowed. If set to 
  +-+, then no password value will be set.
- +home+ is the desired home directory for the user. If set to '-', no
  home directory will be created, and the user's home will be +/+.
  Explicitly setting +home+ to +/+ is not allowed.
- +shell+ is the desired shell for the user. If set to +-+, then
  +/bin/false+ is set as the user's shell.
- +groups+ is the comma-separated list of additional groups the user
  should be part of. If set to +-+, then the user will be a member of
  no additional group. Missing groups will be created with an arbitrary
  +gid+.
- +comment+ (aka https://en.wikipedia.org/wiki/Gecos_field[GECOS]
  field) is an almost-free-form text.

There are a few restrictions on the content of each field:

* except for +comment+, all fields are mandatory.
* except for +comment+, fields may not contain spaces.
* no field may contain a colon (+:+).

If +home+ is not +-+, then the home directory, and all files below,
will belong to the user and its main group.

Examples:

----
foo -1 bar -1 !=blabla /home/foo /bin/sh alpha,bravo Foo user
----

This will create this user:

- +username+ (aka login name) is: +foo+
- +uid+ is computed by Buildroot
- main +group+ is: +bar+
- main group +gid+ is computed by Buildroot
- clear-text +password+ is: +blabla+, will be crypt(3)-encoded, and login is disabled.
- +home+ is: +/home/foo+
- +shell+ is: +/bin/sh+
- +foo+ is also a member of +groups+: +alpha+ and +bravo+
- +comment+ is: +Foo user+

----
test 8000 wheel -1 = - /bin/sh - Test user
----

This will create this user:

- +username+ (aka login name) is: +test+
- +uid+ is : +8000+
- main +group+ is: +wheel+
- main group +gid+ is computed by Buildroot, and will use the value defined in the rootfs skeleton
- +password+ is empty (aka no password).
- +home+ is +/+ but will not belong to +test+
- +shell+ is: +/bin/sh+
- +test+ is not a member of any additional +groups+
- +comment+ is: +Test user+


=== Caveat with automatic UIDs and GIDs

When updating buildroot or when packages are added or removed to/from
the configuration, it is possible that the automatic UIDs and GIDs are
changed. This can be a problem if persistent files were created with
that user or group: after upgrade, they will suddenly have a different
owner.

Therefore, it is advisable to perpetuate the automatic IDs. This can be
done by adding a users table with the generated IDs. It is only needed
to do this for UIDs that actually create persistent files, e.g. database.
