Christoph Biedl wrote... > Upon request of Marc Haber, I'm attaching the latest version of the
diff --git a/AdduserCommon.pm b/AdduserCommon.pm
index d8cf966..21d2195 100644
--- a/AdduserCommon.pm
+++ b/AdduserCommon.pm
@@ -27,6 +27,7 @@ my $lockfile;
'gtx',
'invalidate_nscd',
'read_config',
+ 'read_pool',
's_print',
's_printf',
'systemcall',
@@ -132,6 +133,64 @@ sub read_config {
close CONF || die "$!";
}
+# read names and IDs from a pool file
+# parameters:
+# -- filename of the pool file, or directory containing files
+# -- a hash for the pool data
+sub read_pool {
+ my ($pool_file, $poolref) = @_;
+ my ($name, $id);
+ my %ids = ();
+
+ if (-d $pool_file) {
+ opendir (DIR, $pool_file) or
+ dief gtx("Cannot read directory `%s'"),$pool_file;
+ my @files = readdir (DIR);
+ closedir (DIR);
+ foreach (sort @files) {
+ next if (/^\./);
+ next if (!/\.conf$/);
+ my $file = "$pool_file/$_";
+ next if (! -f $file);
+ read_pool ($file, $poolref);
+ }
+ return;
+ }
+ if (! -f $pool_file) {
+ warnf gtx("`%s' does not exist.\n"),$pool_file if $verbose;
+ return;
+ }
+
+ open (POOL, $pool_file) || dief ("%s: `%s'\n",$pool_file,$!);
+ while (<POOL>) {
+ chomp;
+ next if /^#/ || /^\s*$/;
+
+ ($name, $id, $gecos, $home, $shell) = split (/:/);
+ if (!$name || $name !~ /^([_a-zA-Z0-9-]+)$/ ||
+ !$id || $id !~ /^(\d+)$/) {
+ warnf gtx("Couldn't parse `%s', line %d.\n"),$pool_file,$.;
+ next;
+ }
+ if (defined($poolref->{$name})) {
+ dief gtx("Duplicate name `%s' at `%s', line %d.\n"),$name,$pool_file,$.;
+ }
+ if (defined($ids{$id})) {
+ dief gtx("Duplicate ID `%s' at `%s', line %d.\n"),$id,$pool_file,$.;
+ }
+
+ $poolref->{$name} = {
+ 'id' => $id,
+ 'gecos' => $gecos,
+ 'home' => $home,
+ 'shell' => $shell
+ };
+ }
+
+ close POOL || die "$!";
+}
+
+
# return a user's groups
sub get_users_groups {
my($user) = @_;
@@ -281,7 +340,9 @@ sub preseed_config {
exclude_fstypes => "(proc|sysfs|usbfs|devpts|devtmpfs|devfs|afs)",
skel_ignore_regex => "(dpkg|ucf)-(old|new|dist)\$",
extra_groups => "users",
- add_extra_groups => 0
+ add_extra_groups => 0,
+ uid_pool => "",
+ gid_pool => "",
);
# Initialize to the set of known variables.
diff --git a/adduser b/adduser
index 045b87f..531af4e 100755
--- a/adduser
+++ b/adduser
@@ -116,6 +116,8 @@ my $first_uid = undef;
my $last_uid = undef;
my $dir_mode = undef;
my $perm = undef;
+my %uid_pool;
+my %gid_pool;
our @names;
@@ -237,6 +239,14 @@ $ENV{"DEBUG"} = $verbose;
# preseed configuration data and then read the config file
preseed_config(\@defaults,\%config);
+# read the uid and gid pool
+if ($config{"uid_pool"}) {
+ read_pool ($config{"uid_pool"}, \%uid_pool);
+}
+if ($config{"gid_pool"}) {
+ read_pool ($config{"gid_pool"}, \%gid_pool);
+}
+
&checkname($new_name) if defined $new_name;
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'HUP'} = 'handler';
@@ -293,7 +303,8 @@ if ($action eq "addsysgroup") {
if (!defined($new_gid)) {
$new_gid = &first_avail_gid($config{"first_system_gid"},
- $config{"last_system_gid"});
+ $config{"last_system_gid"},
+ $gid_pool{$new_name}{'id'});
if ($new_gid == -1) {
warnf gtx("No GID is available in the range %d-%d (FIRST_SYS_GID - LAST_SYS_GID).\n"),$config{"first_system_gid"},$config{"last_system_gid"};
dief (gtx("The group `%s' was not created.\n"),$new_name);
@@ -323,7 +334,8 @@ if ($action eq "addgroup") {
if (defined($new_gid) && defined(getgrgid($new_gid)));
if (!defined($new_gid)) {
$new_gid = &first_avail_gid($config{"first_gid"},
- $config{"last_gid"});
+ $config{"last_gid"},
+ $gid_pool{$new_name}{'id'});
if ($new_gid == -1) {
print STDERR "$0: ";
@@ -391,18 +403,21 @@ if ($action eq "addsysuser") {
if (!defined($new_uid) && $make_group_also) {
$new_uid = &first_avail_uid($config{"first_system_uid"},
- $config{"last_system_uid"});
+ $config{"last_system_uid"},
+ $uid_pool{$new_name}{'id'});
if ($new_uid == -1) {
warnf gtx("No UID/GID pair is available in the range %d-%d (FIRST_SYS_UID - LAST_SYS_UID).\n"),$config{"first_system_uid"},$config{"last_system_uid"};
dief (gtx("The user `%s' was not created.\n"),$new_name);
}
$new_gid = &first_avail_gid($config{"first_system_gid"},
- $config{"last_system_gid"});
+ $config{"last_system_gid"},
+ $gid_pool{$new_name}{'id'});
$ingroup_name = $new_name;
}
elsif (!defined($new_uid) && !$make_group_also) {
$new_uid = &first_avail_uid($config{"first_system_uid"},
- $config{"last_system_uid"});
+ $config{"last_system_uid"},
+ $uid_pool{$new_name}{'id'});
if ($new_uid == -1) {
warnf gtx("No UID is available in the range %d-%d (FIRST_SYS_UID - LAST_SYS_UID).\n"),$config{"first_system_uid"},$config{"last_system_uid"};
dief (gtx("The user `%s' was not created.\n"),$new_name);
@@ -431,10 +446,10 @@ if ($action eq "addsysuser") {
printf gtx("Adding new user `%s' (UID %d) with group `%s' ...\n"),$new_name,$new_uid,$ingroup_name
if $verbose;
- $home_dir = $special_home || '/nonexistent';
+ $home_dir = $special_home || $uid_pool{$new_name}{'home'} || '/nonexistent';
$no_create_home = $home_dir =~ /^\/+nonexistent(\/|$)/ ? 1 : $no_create_home;
- $shell = $special_shell || '/usr/sbin/nologin';
+ $shell = $special_shell || $uid_pool{$new_name}{'shell'} || '/usr/sbin/nologin';
$undouser = $new_name;
&systemcall('/usr/sbin/useradd', '-r',
@@ -451,6 +466,8 @@ if ($action eq "addsysuser") {
if (defined($new_gecos)) {
&ch_gecos($new_gecos);
+ } elsif ($uid_pool{$new_name}{'gecos'}) {
+ &ch_gecos($uid_pool{$new_name}{'gecos'});
}
create_homedir(0);
@@ -475,19 +492,22 @@ if ($action eq "adduser") {
if (!defined($new_uid) && $make_group_also) {
$new_uid = &first_avail_uid($first_uid,
- $last_uid);
+ $last_uid,
+ $uid_pool{$new_name}{'id'});
if ($new_uid == -1) {
warnf gtx("No UID/GID pair is available in the range %d-%d (FIRST_UID - LAST_UID).\n"),$first_uid,$last_uid;
dief (gtx("The user `%s' was not created.\n"),$new_name);
}
$new_gid = &first_avail_gid($config{"first_gid"},
- $config{"last_gid"});
+ $config{"last_gid"},
+ $gid_pool{$new_name}{'id'});
$ingroup_name = $new_name;
}
elsif (!defined($new_uid) && !$make_group_also) {
$new_uid = &first_avail_uid($first_uid,
- $last_uid);
+ $last_uid,
+ $uid_pool{$new_name}{'id'});
if ($new_uid == -1) {
warnf gtx("No UID is available in the range %d-%d (FIRST_UID - LAST_UID).\n"),$config{"first_uid"},$config{"last_uid"};
dief (gtx("The user `%s' was not created.\n"),$new_name);
@@ -514,8 +534,8 @@ if ($action eq "adduser") {
printf gtx("Adding new user `%s' (%d) with group `%s' ...\n"),$new_name,$new_uid,$ingroup_name
if $verbose;
- $home_dir = $special_home || &homedir($new_name, $ingroup_name);
- $shell = $special_shell || $config{"dshell"};
+ $home_dir = $special_home || $uid_pool{$new_name}{'home'} || &homedir($new_name, $ingroup_name);
+ $shell = $special_shell || $uid_pool{$new_name}{'shell'} || $config{"dshell"};
$undouser = $new_name;
my $useradd = &which('useradd');
&systemcall($useradd, '-d', $home_dir, '-g', $ingroup_name, '-s',
@@ -568,6 +588,8 @@ if ($action eq "adduser") {
if (defined($new_gecos)) {
&ch_gecos($new_gecos);
+ } elsif ($uid_pool{$new_name}{'gecos'}) {
+ &ch_gecos($uid_pool{$new_name}{'gecos'});
}
else {
my $noexpr = langinfo(NOEXPR());
@@ -914,11 +936,16 @@ sub checkname {
# first_avail_uid: return the first available uid in given range
# parameters:
# min, max: the range
+# pool_id: user id suggested from pool
# return values:
# -1 if no free uid is available
# otherwise the choosen uid
sub first_avail_uid {
- my ($min, $max) = @_;
+ my ($min, $max, $pool_id) = @_;
+ if (defined ($pool_id)) {
+ return $pool_id if (!defined(getpwuid($pool_id)));
+ return -1;
+ }
printf (gtx("Selecting UID from range %d to %d ...\n"),$min,$max) if ($verbose > 1);
my $t = $min;
@@ -932,11 +959,16 @@ sub first_avail_uid {
# first_avail_gid: return the first available gid in given range
# parameters:
# min, max: the range
+# pool_id: group id suggested from pool
# return values:
# -1 if no free gid is available
# otherwise the choosen gid
sub first_avail_gid {
- my ($min, $max) = @_;
+ my ($min, $max, $pool_id) = @_;
+ if (defined ($pool_id)) {
+ return $pool_id if (!defined(getgrgid($pool_id)));
+ return -1;
+ }
printf (gtx("Selecting GID from range %d to %d ...\n"),$min,$max) if ($verbose > 1);
my $t = $min;
diff --git a/adduser.conf b/adduser.conf
index 59c8cd6..7ed3ab6 100644
--- a/adduser.conf
+++ b/adduser.conf
@@ -96,3 +96,11 @@
# check system user and group names also against this regular expression.
#SYS_NAME_REGEX="^[a-z_][-a-z0-9_]*\$?$"
+
+# pool files
+#UID_POOL=/etc/adduser-pool.conf
+#GID_POOL=/etc/adduser-pool.conf
+
+# pool directories
+UID_POOL=/etc/adduser-pool.d/
+GID_POOL=/etc/adduser-pool.d/
signature.asc
Description: PGP signature

