use vars qw(@EXPORT $VAR1); # Common functions that are used in adduser and deluser # Copyright (C) 2000 Roland Bauerschmidt # Most of the functions are adopted from the original adduser # Copyright (C) 1997, 1998, 1999 Guy Maor # Copyright (C) 1995 Ted Hajek # Ian A. Murdock # @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/, )) { 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 () { 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: