#!/opt/bin/perl # ########################################################################### # # # Tool for adding certain numbers to the UIDs (GIDs) of a passwd-file # # or group-file. # # # ########################################################################### # # # Version 1.0 - Written 19.04.95 by Steffen Beyer # # Version 1.1 - Written 20.04.95 by Steffen Beyer # # Version 1.1.1 - Written 20.04.95 by Steffen Beyer # # Version 1.1.2 - Written 20.04.95 by Steffen Beyer # # # ########################################################################### # # # Copyright (C) 1995 by software design & management GmbH & Co. KG # # # ########################################################################### # # Some important default settings... # $version = 'version 1.1.2'; # $self = $0; # if ($self =~ /^.*\/([^\/]+)$/) { $self = $1; } # $GRP_FILE = '/g/sysadm/etc.group.new'; # $grp_file = $GRP_FILE; # $type_name[1+8] = 'special user'; $type_name[2+8] = 'group user'; $type_name[4+8] = 'normal user'; $type_name[3+8] = 'special group user'; # $type_name[1] = 'special group'; $type_name[2] = 'group with group user'; $type_name[4] = 'normal group'; $type_name[3] = 'special group with group user'; # $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; # # Display usage if tool was called without parameters: # if (@ARGV == 0) { $help = 1; } # # Get and check command line options: # $type = 0; $is_passwd = 0; # while (@ARGV) { $_ = shift; if (/^-p$/) { $is_passwd = 8; } elsif (/^-m$/) { $grp_file = shift; } elsif (/^-m\S+$/) { $grp_file = substr($_,$[+2); } elsif (/^-s$/) { if (($type == 0) || ($type == 2)) { $type += 1; } else { $error = 1; } } elsif (/^-g$/) { if (($type == 0) || ($type == 1)) { $type += 2; } else { $error = 1; } } elsif (/^-n$/) { if ($type) { $error = 1; } else { $type = 4; } } 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 (/^-\?$/) { $help = 1; } elsif (/^-h$/) { $help = 1; } elsif (/^-.*/) { $error = 1; unless (defined $option) { $option = $_; } } else { push(@filename, $_); } } # # Was help requested? # if ($help) { print <<"@@"; Usage: $self [ ]* where is: -hh selects '$site_name{'HH'}' -rat selects '$site_name{'RAT'}' -ffm selects '$site_name{'FFM'}' -bi selects '$site_name{'BI'}' -fi selects '$site_name{'FI'}' (one of these options MUST be specified!) -g selects '$type_name[2+$is_passwd]' -s selects '$type_name[1+$is_passwd]' -n selects '$type_name[4+$is_passwd]' (one of these options MUST be specified!) Note that -s and -g may be combined. No other combinations are allowed. -p is a passwd-file (default: group-file) -m specifies the name of the new group file used for mapping (default is '$GRP_FILE') @@ exit; } # # Unknown option encountered? # if (($error) && (defined $option)) { die "Error: Unknown option '$option' encountered!\n", "Enter '$self -h' for help.\n"; } # # Forbidden combination of user/group selectors encountered? # if (($error) && ($type)) { die "Error: Forbidden combination of user/group selectors encountered!\n", "Enter '$self -h' for help.\n"; } # # No type selected? # unless ($type) { die "Error: No user/group type selected!\nEnter '$self -h' for help.\n"; } # # More than one site selected? # if (($error) && ($site)) { die "Error: Multiple definitions for site encountered!\n", "Enter '$self -h' for help.\n"; } # # No site selected? # unless ($site) { die "Error: No site selected!\nEnter '$self -h' for help.\n"; } # # Is there a filename specified? # if (@filename != 1) { die "Error: You must specify one filename!\nEnter '$self -h' for help.\n"; } # # Extract the filename: # $in_file = $filename[$[]; # # Does the specified file exist? # unless (($in_file ne "") && (-f $in_file)) { die "Error: Can't find file '$in_file'!\n"; } # # Determine mapping for groups: # if ($is_passwd) { unless (($grp_file ne "") && (-f $grp_file)) { die "Error: Can't find new group file '$grp_file'!\n"; } # setgrent; # while (($group,$passwd,$gid) = getgrent) { if ($gid_group{$group} ne "") { die "Error: Group name '$group' is not unique!\n"; } else { $gid_group{$group} = $gid; } } # endgrent; # open(IN_FILE, "<$grp_file") || die "Can't open '$grp_file': $!\n"; # while () { chop; ($group, $passwd, $gid) = split(/:/); if ($gid_group{$group} eq "") { die "Error: No mapping found for group '$group'!\n"; } else { if ($new_gid{$gid_group{$group}} ne "") { if ($new_gid{$gid_group{$group}} != $gid) { die "Error: Mapping for group '$group' is ambiguous!\n"; } else { warn "Warning: Mapping for group '$group' multiply defined!\n"; } } else { $new_gid{$gid_group{$group}} = $gid; } } } # close(IN_FILE); } # # Prepare output filename: # $out_file = "$in_file.$self"; # # Process input file: # open(IN_FILE, "<$in_file") || die "Can't open '$in_file': $!\n"; open(OUT_FILE, ">$out_file") || die "Can't write '$out_file': $!\n"; # while () { chop; undef @field; @field = split(/:/, $_, 10); if ($is_passwd) { if (($field[$[+2] < $site_min{$site}) || ($field[$[+2] > $site_max{$site})) { printf(STDERR "Warning: User '%s' has UID (%d) off range (%d..%d)!\n", $field[$[], $field[$[+2], $site_min{$site}, $site_max{$site}); } if (($field[$[+3] < $site_min{$site}) || ($field[$[+3] > $site_max{$site})) { printf(STDERR "Warning: User '%s' has GID (%d) off range (%d..%d)!\n", $field[$[], $field[$[+3], $site_min{$site}, $site_max{$site}); } if ((($type == 2) || ($type == 3)) && ($field[$[+2] != $field[$[+3])) { printf(STDERR "Warning: User '%s' has UID <> GID (%d <> %d)!\n", $field[$[], $field[$[+2], $field[$[+3]); } if ($new_gid{$field[$[+3]} ne "") { $field[$[+3] = $new_gid{$field[$[+3]}; } else { warn "Error: No mapping found for user '$field[$[]' with GID '$field[$[+3]'!\n"; } if ($type == 1) { $field[$[+2] += $site_special{$site} - $site_min{$site}; } elsif ($type == 2) { $field[$[+2] = $field[$[+3]; } elsif ($type == 3) { $field[$[+2] = $field[$[+3]; } elsif ($type == 4) { $field[$[+2] += $site_normal{$site} - $site_min{$site}; } else { die "Internal programming error!\n"; } } else { if (($field[$[+2] < $site_min{$site}) || ($field[$[+2] > $site_max{$site})) { printf(STDERR "Warning: Group '%s' has GID (%d) off range (%d..%d)!\n", $field[$[], $field[$[+2], $site_min{$site}, $site_max{$site}); } if (($type == 1) || ($type == 3)) { $field[$[+2] += $site_special{$site} - $site_min{$site}; } else { $field[$[+2] += $site_groups{$site} - $site_min{$site}; } } $_ = join(':', @field); print OUT_FILE $_, "\n"; } # close(IN_FILE); close(OUT_FILE); # # Print acknowledgement: # printf("\n'%s' %s\n\n", $self, $version); printf("%s = '%s'\n", ($is_passwd ? "User type " : "Group type"), $type_name[$type + $is_passwd]); printf("Site = '%s'\n", $site_name{$site}); printf("Input file = '%s'\n", $in_file); printf("Output file = '%s'\n\n", $out_file); # # Done. #