summaryrefslogtreecommitdiffstats
path: root/AdduserCommon.pm
diff options
context:
space:
mode:
Diffstat (limited to 'AdduserCommon.pm')
-rw-r--r--AdduserCommon.pm225
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: