全部博文(1144)
分类: LINUX
2009-12-09 12:04:41
#!/usr/local/bin/perl # # to fix vpopmail vpasswd files when an admin compiled with MD5 support, # when his operating system lacked MD5 support (SMACK!). # # will only work if vpopmail was compiled with clear text password option. # use strict; my %paths; my ($uid,$gid) = (getpwnam('vpopmail'))[2,3]; open(A, '/var/qmail/users/assign') || die "cannot open assign: $!\n"; while(){ if(/^\+[^:]+-:([^:]+):\d+:\d+:([^:]+):/){ if((-f "$2/vpasswd") && (! -l $2)){ $paths{$1} = $2; } } } close A; my @set = ('A'..'Z', 'a'..'z', '0'..'9', '.', '/'); # as per Tom Collins' documentation srand(time() ^($$ + ($$ << 15))); my @a = grep {/[a-zA-Z0-9\.\/]/} map {chr($_)} (0..256); while(my($domain,$dir) = each %paths){ print "working on $domain\n"; open(V, "${dir}/vpasswd") || die "cannot open $dir/vpasswd: $!\n"; open(N, ">${dir}/vpasswd.tmp") || die "cannot write to $dir/vpasswd.tmp: $!\n"; my $n=0; while(){ chomp(my $line = $_); $n++; if($line =~ /^([^:]+):([^:]+):(\d+):(\d+):([^:]*):([^:]+):([^:]+):(.+)$/){ my ($user,$oldcrypt,$id,$gid,$comment,$maildir,$quota,$clear) = ($1,$2,$3,$4,$5,$6,$7,$8); my $salt = $a[ rand(@a) ] . $a[ rand(@a) ]; my $newcrypt = crypt($clear,$salt); die "error while generating crypt\n" unless($newcrypt); # perl doesnt like s/${oldcrypt}/${newcrypt}/ if oldcrypt has a $ in it # and escaping is just ugly print N "${user}:${newcrypt}:${id}:${gid}:${comment}:${maildir}:${quota}:${clear}\n"; }else{ print "unknown syntax in file (line $n)\n"; print N "${line}\n"; } } close N; close V; if(rename("${dir}/vpasswd.tmp","${dir}/vpasswd")){ if(chown($uid,$gid,"${dir}/vpasswd")){ chmod(0600,"${dir}/vpasswd") || warn "could not chmod $dir/vpasswd: $!\n"; }else{ warn "could not chown $dir/vpasswd: $!\n"; } unlink("${dir}/vpasswd.cdb") || warn "cannot delete $dir/vpasswd.cdb: $!\n"; }else{ warn "cannot rename $dir/vpasswd.tmp: $!\n"; } }