#!/opt/bin/perl # ######################################################################### # # # Programm zur Erzeugung einer neuen Passwd- und Group-Datei # # # ######################################################################### # # # Version 1.0 - Written 31.03.95 by Steffen Beyer # # Version 1.0.1 - Written 02.04.95 by Steffen Beyer # # Version 1.0.2 - Written 13.04.95 by Steffen Beyer # # Version 1.1 - Written 15.04.95 by Steffen Beyer # # # ######################################################################### # # # Copyright (C) 1995 by software design & management GmbH & Co. KG # # # ######################################################################### # # Einige wichtige Defaulteinstellungen: # $version = 'Version 1.1'; # $self = $0; # if ($self =~ /^.*\/([^\/]+)$/) { $self = $1; } # $PWD_FILE = '/g/sysadm/etc.passwd.new'; $GRP_FILE = '/g/sysadm/etc.group.new'; # $pwd_file = $PWD_FILE; $grp_file = $GRP_FILE; # $site_name{'HH'} = 'Hamburg'; $site_name{'RAT'} = 'Ratingen'; $site_name{'FFM'} = 'Frankfurt a.M.'; $site_name{'BI'} = 'Muenchen (BI)'; $site_name{'FI'} = 'Muenchen (FI)'; # $site_special{'HH'} = 8000; $site_special{'RAT'} = 7000; $site_special{'FFM'} = 7500; $site_special{'BI'} = 5000; $site_special{'FI'} = 5500; # $site_normal{'HH'} = 13000; $site_normal{'RAT'} = 12000; $site_normal{'FFM'} = 12500; $site_normal{'BI'} = 10000; $site_normal{'FI'} = 10500; # $site_groups{'HH'} = 23000; $site_groups{'RAT'} = 22000; $site_groups{'FFM'} = 22500; $site_groups{'BI'} = 20000; $site_groups{'FI'} = 20500; # $site_min{'HH'} = 0; $site_min{'RAT'} = 0; $site_min{'FFM'} = 0; $site_min{'BI'} = 0; $site_min{'FI'} = 0; # $site_max{'HH'} = 249; $site_max{'RAT'} = 249; $site_max{'FFM'} = 249; $site_max{'BI'} = 499; $site_max{'FI'} = 499; # # Aufruf ohne Parameter ==> Hilfe ausgeben: # if (@ARGV == 0) { $help = 1; } # # Optionen aus der Kommandozeile ueberpruefen und uebernehmen: # while (@ARGV) { $_ = shift; if (/^-p$/) { $pwd_file = shift; } elsif (/^-g$/) { $grp_file = shift; } elsif (/^-p\S+$/) { $pwd_file = substr($_,2); } elsif (/^-g\S+$/) { $grp_file = substr($_,2); } elsif (/^-hh$/) { if ($site) { $error = 1; } else { $site = 'HH'; } } elsif (/^-rat$/) { if ($site) { $error = 1; } else { $site = 'RAT'; } } elsif (/^-ffm$/) { if ($site) { $error = 1; } else { $site = 'FFM'; } } elsif (/^-bi$/) { if ($site) { $error = 1; } else { $site = 'BI'; } } elsif (/^-fi$/) { if ($site) { $error = 1; } else { $site = 'FI'; } } elsif (/^-s$/) { $split = 1; } elsif (/^-\?$/) { $help = 1; } elsif (/^-h$/) { $help = 1; } else { $error = 1; unless (defined $option) { $option = $_; } } } # # Hilfe gewuenscht? # if ($help) { print <<"@@"; Usage: $self [ ]* where is one of the following: -p Explicitly specifies the new passwd file name (default is '$PWD_FILE') -g Explicitly specifies the new group file name (default is '$GRP_FILE') (white space between option letter and file name is optional) -hh Selects site = '$site_name{'HH'}' -rat Selects site = '$site_name{'RAT'}' -ffm Selects site = '$site_name{'FFM'}' -bi Selects site = '$site_name{'BI'}' -fi Selects site = '$site_name{'FI'}' (use of one of the options above is required!) -s Splits new passwd file into 3 files for G, S and N users @@ exit; } # # Unbekannte Option gefunden? # if (($error) && ($option)) { die "Error: Unknown option '$option' encountered!\nEnter '$self -h' for help.\n"; } # # Geschaeftsstelle mehrmals selektiert? # if (($error) && ($site)) { die "Error: Multiple definitions for 'site' encountered!\n"; } # # Keine Geschaeftsstelle selektiert? # unless ($site) { die "Error: No 'site' selected!\nEnter '$self -h' for help.\n"; } # # Aktuelle (alte!) Passwort- und Gruppendatei einlesen (slurp): # setgrent; # while (($group,$passwd,$ggg,$members) = getgrent) { if ($gid_group{$group} ne "") { die "Error: Group name '$group' is not unique!\n"; } if ($group_gid{$ggg} ne "") { $group_gid{$ggg} .= ", " . $group; warn "Warning: Group id '$ggg' is not unique!\n"; } else { $group_gid{$ggg} = $group; } if (($ggg != 0) && ($ggg < $site_min{$site})) { warn "Warning: Group '$group' has GID < min ($ggg < $site_min{$site})!\n"; } if (($ggg != 0) && ($ggg > $site_max{$site})) { warn "Warning: Group '$group' has GID > max ($ggg > $site_max{$site})!\n"; } $members =~ tr/ /,/; $pwd_group{$group} = $passwd; $gid_group{$group} = $ggg; $mem_group{$group} = $members; } # endgrent; # setpwent; # while (($user,$passwd,$uid,$gid,$quota,$comment,$gcos,$dir,$shell) = getpwent) { if ($uid_user{$user} ne "") { die "Error: User name '$user' is not unique!\n"; } if ($user_uid{$uid} ne "") { $user_uid{$uid} .= ", " . $user; warn "Warning: User id '$uid' is not unique!\n"; } else { $user_uid{$uid} = $user; } if ($group_gid{$gid} eq "") { warn "Warning: User '$user' belongs to non-existent group '$gid'!\n"; } if (($uid != 0) && ($uid < $site_min{$site})) { warn "Warning: User '$user' has UID < min ($uid < $site_min{$site})!\n"; } if (($uid != 0) && ($uid > $site_max{$site})) { warn "Warning: User '$user' has UID > max ($uid > $site_max{$site})!\n"; } if (($gid != 0) && ($gid < $site_min{$site})) { warn "Warning: User '$user' has GID < min ($gid < $site_min{$site})!\n"; } if (($gid != 0) && ($gid > $site_max{$site})) { warn "Warning: User '$user' has GID > max ($gid > $site_max{$site})!\n"; } $pwd_user{$user} = $passwd; $uid_user{$user} = $uid; $gid_user{$user} = $gid; # $quo_user{$user} = $quota; # $com_user{$user} = $comment; $gcs_user{$user} = $gcos; $dir_user{$user} = $dir; $shl_user{$user} = $shell; } # endpwent; # # Ausgabe der aktiven Parameter: # printf("\n'%s' %s\n\n", $self, $version); if ($split) { printf("New passwd file name (group users) = '%s.g'\n", $pwd_file); printf("New passwd file name (special users) = '%s.s'\n", $pwd_file); printf("New passwd file name (normal users) = '%s.n'\n", $pwd_file); printf("New group file name = '%s'\n", $grp_file); printf("Site = '%s'\n\n", $site_name{$site}); } else { printf("New passwd file name = '%s'\n", $pwd_file); printf("New group file name = '%s'\n", $grp_file); printf("Site = '%s'\n\n", $site_name{$site}); } # # Neue passwd-Datei ausgeben: # if ($split) { open(PWD, ">$pwd_file.g") || die "Can't open '$pwd_file.g': $!\n"; } else { open(PWD, ">$pwd_file") || die "Can't open '$pwd_file': $!\n"; # print PWD "----------------------------------------------------------------------\n"; print PWD "Gruppen-User:\n"; print PWD "(Alle Nicht-Gruppen-User in die richtige Kategorie verschieben!)\n"; print PWD "----------------------------------------------------------------------\n"; } # foreach $user (sort keys(%uid_user)) { $uid = $uid_user{$user}; $gid = $gid_user{$user}; $ggg = $gid_group{$user}; # # User is considered a group user if he has the same name and gid as the group: # if ( ($uid != 0) && ($gid != 0) && ($ggg ne "") && ($gid == $ggg) ) { if ($uid != $gid) { warn "Warning: Group user '$user' has UID <> GID ($uid <> $gid)!\n"; } undef $found; undef @members; @members = split(/,/, $mem_group{$user}); foreach $member (@members) { if ($user eq $member) { $found = 1; last; } } unless ($found) { warn "Warning: Group user '$user' is not contained in group '$user'!\n"; } $gid += $site_groups{$site} - $site_min{$site}; printf(PWD "%s:%s:%s:%s:%s:%s:%s\n", $user, $pwd_user{$user}, $gid, $gid, $gcs_user{$user}, $dir_user{$user}, $shl_user{$user}); delete $pwd_user{$user}; delete $uid_user{$user}; delete $gid_user{$user}; delete $gcs_user{$user}; delete $dir_user{$user}; delete $shl_user{$user}; } } # if ($split) { close(PWD); open(PWD, ">$pwd_file.s") || die "Can't open '$pwd_file.s': $!\n"; } else { print PWD "----------------------------------------------------------------------\n"; print PWD "Spezielle User (z.B. fuer Gateways etc.):\n"; print PWD "(Alle Normalen User von Hand entfernen!)\n"; print PWD "----------------------------------------------------------------------\n"; } # foreach $user (sort keys(%uid_user)) { $uid = $uid_user{$user}; $gid = $gid_user{$user}; if ($uid != 0) { $uid += $site_special{$site} - $site_min{$site}; } if ($gid != 0) { $gid += $site_groups{$site} - $site_min{$site}; } printf(PWD "%s:%s:%s:%s:%s:%s:%s\n", $user, $pwd_user{$user}, $uid, $gid, $gcs_user{$user}, $dir_user{$user}, $shl_user{$user}); } # if ($split) { close(PWD); open(PWD, ">$pwd_file.n") || die "Can't open '$pwd_file.n': $!\n"; } else { print PWD "----------------------------------------------------------------------\n"; print PWD "Normale User (also alle physischen Personen):\n"; print PWD "(Alle Speziellen User von Hand entfernen!)\n"; print PWD "----------------------------------------------------------------------\n"; } # foreach $user (sort keys(%uid_user)) { $uid = $uid_user{$user}; $gid = $gid_user{$user}; if ($uid != 0) # Sonderfall 'root' bei Speziellen Usern behandelt! { $uid += $site_normal{$site} - $site_min{$site}; if ($gid != 0) { $gid += $site_groups{$site} - $site_min{$site}; } printf(PWD "%s:%s:%s:%s:%s:%s:%s\n", $user, $pwd_user{$user}, $uid, $gid, $gcs_user{$user}, $dir_user{$user}, $shl_user{$user}); } } # close(PWD); # # Neue group-Datei ausgeben: # open(GRP, ">$grp_file") || die "Can't open '$grp_file': $!\n"; # foreach $group (sort keys(%gid_group)) { $ggg = $gid_group{$group}; if ($ggg != 0) { $ggg += $site_groups{$site} - $site_min{$site}; } printf(GRP "%s:%s:%s:%s\n", $group, $pwd_group{$group}, $ggg, $mem_group{$group}); } # close(GRP); # # Fertig: # printf("Done.\n\n"); # # Fertig. #