| 1 |
17 |
dpavlin |
#!/usr/bin/perl -w |
| 2 |
|
|
|
| 3 |
|
|
use strict; |
| 4 |
|
|
|
| 5 |
|
|
my %passwd_here; |
| 6 |
|
|
my %passwd_new; |
| 7 |
|
|
|
| 8 |
|
|
my $local_users = 0; |
| 9 |
|
|
my $new_users = 0; |
| 10 |
|
|
my $new_aliases = 0; |
| 11 |
|
|
|
| 12 |
|
|
open(PI,"/etc/passwd") || die "can't open current passwd: $!"; |
| 13 |
|
|
while(<PI>) { |
| 14 |
|
|
chomp; |
| 15 |
|
|
my ($login,$passwd,$uid,$gid,$gecos,$rest) = split(/:/,$_,6); |
| 16 |
|
|
if (defined $passwd_here{$login}) { |
| 17 |
|
|
print "user $login ($gecos) is listed twice in local passwd"; |
| 18 |
|
|
} else { |
| 19 |
|
|
$passwd_here{$login}=$gecos; |
| 20 |
|
|
$local_users++; |
| 21 |
|
|
} |
| 22 |
|
|
} |
| 23 |
|
|
close(PI); |
| 24 |
|
|
|
| 25 |
|
|
open(PO,"> passwd.new") || die "can't open passwd.new: $!"; |
| 26 |
|
|
open(SO,"> shadow.new") || die "can't open shadow.new: $!"; |
| 27 |
|
|
|
| 28 |
|
|
open(PI,"passwd") || die "can't open input passwd: $!"; |
| 29 |
|
|
while(<PI>) { |
| 30 |
|
|
chomp; |
| 31 |
|
|
my ($login,$passwd,$uid,$gid,$gecos,$rest) = split(/:/,$_,6); |
| 32 |
|
|
|
| 33 |
|
|
$uid += 10000; # all new uid's will be > 10000 |
| 34 |
|
|
|
| 35 |
|
|
if ($passwd_here{$login}) { |
| 36 |
|
|
print "user $login ($gecos) allready exists in local passwd, skipping...\n"; |
| 37 |
|
|
} else { |
| 38 |
|
|
# create home, imapd need it! |
| 39 |
|
|
my $home = "/var/webmail/home/$login"; |
| 40 |
|
|
mkdir $home || die "can't create home dir $home: $!"; |
| 41 |
|
|
chmod 0777,$home || die "can't chmod home $home to 777: $!"; |
| 42 |
|
|
|
| 43 |
|
|
# /bin/true must be in /etc/shells or most services won't work! |
| 44 |
|
|
print PO "$login:x:$uid:100:$gecos:$home:/bin/true\n"; |
| 45 |
|
|
print SO "$login:$passwd:12110:0:99999:7:::\n"; |
| 46 |
|
|
$passwd_new{$login}=$gecos; |
| 47 |
|
|
$new_users++; |
| 48 |
|
|
} |
| 49 |
|
|
} |
| 50 |
|
|
close(PI); |
| 51 |
|
|
close(PO); |
| 52 |
|
|
|
| 53 |
|
|
open(AI,"aliases") || die "can't open aliases: $!"; |
| 54 |
|
|
open(AO,"> aliases.new") || die "can't open aliases.new: $!"; |
| 55 |
|
|
while(<AI>) { |
| 56 |
|
|
chomp; |
| 57 |
|
|
next if (/^\s*$/ || /^\s*#/); |
| 58 |
|
|
my ($alias,$account) = split(/\s*:\s*/,$_,2); |
| 59 |
|
|
if ($passwd_new{$account}) { |
| 60 |
|
|
print AO "$alias:\t$account\n"; |
| 61 |
|
|
$new_aliases++; |
| 62 |
|
|
} else { |
| 63 |
|
|
# this will try to expand users on the right |
| 64 |
|
|
# it might be overkill, but hey! it might help also... |
| 65 |
|
|
if ($account =~ /,/) { |
| 66 |
|
|
my $all_local = 1; |
| 67 |
|
|
foreach my $login (split(/\s*,\s*/,$account)) { |
| 68 |
|
|
$all_local = 0 if (! $passwd_new{$login}); |
| 69 |
|
|
} |
| 70 |
|
|
if ($all_local) { |
| 71 |
|
|
print AO "$alias\t$account\n"; |
| 72 |
|
|
$new_aliases++; |
| 73 |
|
|
} else { |
| 74 |
|
|
# debug, verbose, remove... |
| 75 |
|
|
#print "skip: $alias -> $account\n"; |
| 76 |
|
|
} |
| 77 |
|
|
} |
| 78 |
|
|
} |
| 79 |
|
|
} |
| 80 |
|
|
close(AI); |
| 81 |
|
|
close(AO); |
| 82 |
|
|
|
| 83 |
|
|
print "local users: $local_users\n"; |
| 84 |
|
|
print "new users: $new_users\n"; |
| 85 |
|
|
print "new aliases: $new_aliases\n"; |