diff options
Diffstat (limited to 'AdduserCommon.pm')
-rw-r--r-- | AdduserCommon.pm | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/AdduserCommon.pm b/AdduserCommon.pm new file mode 100644 index 0000000..e329bba --- /dev/null +++ b/AdduserCommon.pm @@ -0,0 +1,225 @@ +use vars qw(@EXPORT $VAR1); + + +# Common functions that are used in adduser and deluser +# Copyright (C) 2000 Roland Bauerschmidt <rb@debian.org> + +# Most of the functions are adopted from the original adduser +# Copyright (C) 1997, 1998, 1999 Guy Maor <maor@debian.org> +# Copyright (C) 1995 Ted Hajek <tedhajek@boombox.micro.umn.edu> +# Ian A. Murdock <imurdock@gnu.ai.mit.edu> +# + +@EXPORT = qw(invalidate_nscd gtx dief warnf read_config get_users_groups get_group_members s_print s_printf systemcall); + +sub invalidate_nscd { + # Check if we need to do make -C /var/yp for NIS + my $nisconfig; + if(-f "/etc/default/nis") { + $nisconfig = "/etc/default/nis"; + } elsif(-f "/etc/init.d/nis") { + $nisconfig = "/etc/init.d/nis"; + } + # find out whether a local ypserv is running + # We can ditch any rpcinfo error since if the portmapper is nonfunctional, + # we couldn't connect to ypserv anyway. If this assumption is invalid, + # please file a bug and suggest a better way. + if(defined($nisconfig) && -f "/var/yp/Makefile" && + -x "/usr/sbin/rpcinfo" && grep(/ypserv/, qx{/usr/sbin/rpcinfo -p 2>/dev/null})) { + open(NISCONFIG, "<$nisconfig"); + if(grep(/^NISSERVER=master/, <NISCONFIG>)) { + system("make", "-C", "/var/yp"); + } + close(NISCONFIG); + } + + # Check if we need to invalidate the NSCD cache + my $nscd = &which('nscd',1); + # this function replaces startnscd and stopnscd (closes: #54726) + # We are ignoring any error messages given by nscd here since we + # cannot expect the nscd maintainer and upstream to document their + # interfaces. See #330929. + if(defined($nscd) && -x $nscd) + { + my $table = shift; + if ($table) + { + system ($nscd, "-i", $table); + } + else + { + # otherwise we invalidate passwd and group table + system ($nscd, "-i", "passwd"); + system ($nscd, "-i", "group"); + } + } +} + +sub gtx { + return gettext( shift ); +} + +sub dief { + my ($form,@argu)=@_; + printf STDERR sprintf(gtx("%s: %s"), $0, $form), @argu; + exit 1; +} + +sub warnf { + my ($form,@argu)=@_; + printf STDERR sprintf(gtx("%s: %s"), $0, $form), @argu; +} + +# parse the configuration file +# parameters: +# -- filename of the configuration file +# -- a hash for the configuration data +sub read_config { + my ($conf_file, $configref) = @_; + my ($var, $lcvar, $val); + + if (! -f $conf_file) { + warnf gtx("`%s' does not exist. Using defaults.\n"),$conf_file if $verbose; + return; + } + + open (CONF, $conf_file) || dief ("%s: `%s'\n",$conf_file,$!); + while (<CONF>) { + chomp; + next if /^#/ || /^\s*$/; + + if ((($var, $val) = /^\s*([_a-zA-Z0-9]+)\s*=\s*(.*)/) != 2) { + warnf gtx("Couldn't parse `%s', line %d.\n"),$conf_file,$.; + next; + } + $lcvar = lc $var; + if (!defined($configref->{$lcvar})) { + warnf gtx("Unknown variable `%s' at `%s', line %d.\n"),$var,$conf_file,$.; + next; + } + + $val =~ s/^"(.*)"$/$1/; + $val =~ s/^'(.*)'$/$1/; + + $configref->{$lcvar} = $val; + } + + close CONF || die "$!"; +} + +# return a user's groups +sub get_users_groups { + my($user) = @_; + my($name,$members,@groups); + setgrent; + while (($name,$members) = (getgrent)[0,3]) { + for (split(/ /, $members)) { + if ($user eq $_) { + push @groups, $name; + last; + } + } + } + endgrent; + @groups; +} + +# return a group's members +sub get_group_members + { + my $group = shift; + my @members; + foreach (split(/ /, (getgrnam($group))[3])) { + if (getpwuid(getpwnam($_)) eq $_ ) { + push @members, $_; + } + } + return @members; + } + +sub s_print +{ + print join(" ",@_) + if($verbose); +} + +sub s_printf +{ + printf @_ + if($verbose); +} + +sub d_printf +{ + printf @_ + if((defined($verbose) && $verbose > 1) || (defined($debugging) && $debugging == 1)); +} + +sub systemcall { + my $c = join(' ', @_); + print ("$c\n") if $verbose==2; + if (system(@_)) { + dief (gtx("`%s' returned error code %d. Exiting.\n"), $c, $?>>8) + if ($?>>8); + dief (gtx("`%s' exited from signal %d. Exiting.\n"), $c, $?&255); + } +} + +sub which { + my ($progname, $nonfatal) = @_ ; + for my $dir (split /:/, $ENV{"PATH"}) { + if (-x "$dir/$progname" ) { + return "$dir/$progname"; + } + } + dief(gtx("Could not find program named `%s' in \$PATH.\n"), $progname) unless ($nonfatal); + return 0; +} + + +# preseed the configuration variables +# then read the config file /etc/adduser and overwrite the data hardcoded here +sub preseed_config { + my ($conflistref, $configref) = @_; + $configref->{"system"} = 0; + $configref->{"only_if_empty"} = 0; + $configref->{"remove_home"} = 0; + $configref->{"home"} = ""; + $configref->{"remove_all_files"} = 0; + $configref->{"backup"} = 0; + $configref->{"backup_to"} = "."; + $configref->{"dshell"} = "/bin/bash"; + $configref->{"first_system_uid"} = 100; + $configref->{"last_system_uid"} = 999; + $configref->{"first_uid"} = 1000; + $configref->{"last_uid"} = 59999; + $configref->{"first_system_gid"} = 100; + $configref->{"last_system_gid"} = 999; + $configref->{"first_gid"} = 1000; + $configref->{"last_gid"} = 59999; + $configref->{"dhome"} = "/home"; + $configref->{"skel"} = "/etc/skel"; + $configref->{"usergroups"} = "yes"; + $configref->{"users_gid"} = "100"; + $configref->{"grouphomes"} = "no"; + $configref->{"letterhomes"} = "no"; + $configref->{"quotauser"} = ""; + $configref->{"dir_mode"} = "0755"; + $configref->{"setgid_home"} = "no"; + $configref->{"no_del_paths"} = "^/$ ^/lost+found/.* ^/media/.* ^/mnt/.* ^/etc/.* ^/bin/.* ^/boot/.* ^/dev/.* ^/lib/.* ^/proc/.* ^/root/.* ^/sbin/.* ^/tmp/.* ^/sys/.* ^/srv/.* ^/opt/.* ^/initrd/.* ^/usr/.* ^/var/.*"; + $configref->{"name_regex"} = "^[a-z][-a-z0-9_]*\$"; + $configref->{"exclude_fstypes"} = "(proc|sysfs|usbfs|devpts|tmpfs)"; + $configref->{"skel_ignore_regex"} = "dpkg-(old|new|dist)\$"; + $configref->{"extra_groups"} = "dialout cdrom floppy audio video plugdev users"; + $configref->{"add_extra_groups"} = 0; + + foreach( @$conflistref ) { + read_config($_,$configref); + } +} + +# Local Variables: +# mode:cperl +# End: + +#vim:set ai et sts=4 sw=4 tw=0: |