Ada mail server di lingkungan kampusku yang sudah cukup berumur, menggunakan MTA qmail +vpopmail untuk membuat virtual domain, sebagai pengganti mail server ini adalah zimbra yang lebih powerfull, fitur lengkap dan juga kemudahan untuk menginstall, mengkonfigurasi dan melakukan pemeliharaan, selengkapnya mengenai zimbra bisa di baca di situs resmi zimbra, berikut adalah langkah-langkah yang aku lakukan untuk melakukan konversi database user dan maildir dari vpopmail ke zimbra.
- Ubah database vpopmail semua domain ke database passwd dengan menggunakan perintah berikut: #sudo -s vpopmail /usr/local/vpopmail/bin/vconvert -c -e dan program ini akan membaca database vpopmail yang ada di /usr/local/vpopmail/domains/vpasswd
- Ubah database berformat passwd dengan menggunakan script berikut:
#!/usr/bin/perl
#
# $Id: passwd2zmprov,v 1.2 2008/03/05 05:01:29 phil Exp $
=head1 NAME
passwd2zmprov – create zmprov commands from a passwd file
=head1 SYNOPSIS
usage: passwd2zmprov [options] [[passwd_file] …] > commands.zmp
-help show a brief help message
-man show the full documentation
-domain <domain> [REQUIRED]
-cosid <cos_id> [default "Default COS"]
-password <password> [default ""]
Getting a COS id:
zimbra$ zmprov gc <myCos> | grep ^zimbraId:
Example converting CSV to zmprov commands:
$ ./passwd2zmprov -domain example.moc /etc/passwd > commands.zmp
Example provisioning ZCS accounts as ‘zimbra’ user:
zimbra$ zmprov < commands.zmp
=head1 DESCRIPTION:
Tool to create commands suitable for zmprov from a UNIX passwd file.
We don’t use getpwent etc., because we are likely working on a copy
and not running as root.
See Also:
http://wiki.zimbra.com/index.php?title=Bulk_Create
=cut
use strict;
use warnings;
use File::Basename qw(basename);
use Getopt::Long qw(GetOptions);
use Pod::Usage qw(pod2usage);
my $prog = basename($0);
my ( @err, %option );
GetOptions( \%option, ‘help|?’, ‘man’, ‘domain=s’, ‘cosid=s’, ‘password=s’ )
or pod2usage( -verbose => 0 );
pod2usage( -verbose => 1 ) if ( $option{help} );
pod2usage( -verbose => 2 ) if ( $option{man} );
push( @err, “-domain <domain> is required” )
unless ( $option{domain} );
pod2usage( -verbose => 0, -message => map( “$prog: $_\n”, @err ) )
if (@err);
warn(“$prog: using Default COS\n”) unless ( $option{cos_id} );
warn(“$prog: reading passwd like entries from STDIN\n”) unless (@ARGV);
my $date = localtime();
my $cosid = $option{cosid};
my $domain = $option{domain};
my $password = defined $option{password} ? $option{password} : “”;
my $MIN_UID = 500; # skip system accounts like httpd
my $MAX_UID = 60000; # skip other system accounts like nfsnobody
# sanitize password
$password =~ s/\”/\\\”/g;
while (<>) {
chomp;
next if (/^\s*$/); # skip empty lines
my ( $uname, $x, $uid, $gid, $gecos, $dir, $shell ) = split( /:/, $_, 7 );
if ( $uid < $MIN_UID or $uid > $MAX_UID ) {
warn(“$prog: skip $uname: $uid not between $MIN_UID and $MAX_UID\n”);
next;
}
# assuming gecos format is First [[MI] [Last]], sanitize a little
$gecos =~ s/\”/\\\”/g;
my ( $fullname, $description ) = split( /\s*,\s*/, $gecos, 2 );
my ( $fname, $mname, $lname ) = split( ” “, $fullname, 3 );
unless ( defined($lname) ) {
$lname = $mname;
undef($mname);
}
my $displayname = $fname
. ( defined($mname) ? ” $mname” : “” )
. ( defined($lname) ? ” $lname” : “” );
print(
qq{ca “$uname\@$domain” “$password”},
( defined($cosid) ? qq{ zimbraCOSid “$cosid”} : () ),
( defined($fname) ? qq{ givenName “$fname”} : () ),
( defined($lname) ? qq{ sn “$lname”} : () ),
( defined($uname) ? qq{ cn “$uname”} : () ),
( defined($displayname) ? qq{ displayName “$displayname”} : () ),
( defined($description) ? qq{ description “$description”} : () ),
qq{ zimbraNotes “Migrated $date”},
qq{ zimbraPasswordMustChange TRUE},
qq{\n},
);
}
=head1 HISTORY
2007/01/23, Version 1.0/1.1 Dlbewley
2008/03/04, Version 1.2 Plobbes
=cut
- Gunakan perintah berikut untuk membuat database baru
- perl passwd2zmprov -domain “namadomain” “vpasswdfile” > databaru.zmp
- Hasilnya kurang lebih akan berbentuk seperti ini:
ca “adis@pusat.itb.ac.id” “” givenName “adis” cn “adis” displayName “adis” zimbraNotes “Migrated Thu Jul 9 10:36:40 2009″ zimbraPasswordMustChange TRUE
ca “adiwiyarso@pusat.itb.ac.id” “” givenName “M.” sn “Adiwiyarso” cn “adiwiyarso” displayName “M. Yusuf Adiwiyarso” zimbraNotes “Migrated Thu Jul 9 10:36:40
2009″ zimbraPasswordMustChange TRUE
- Generate database baru di zimbra dengan menggunakan perintah ini, jangan lupa create dahulu domain di server zimbra.
zmprov < databaru.zmp, di layar akan keluar log seperti ini:
prov> dd9ad143-32bf-4c7b-946f-0482abc59c5d
prov> de02cb98-985c-4eb3-bff5-af0fa64d4b25
prov> d1cc9075-4ee8-49e2-a0e7-025b6bd2a84f
prov> d18a58a8-9c54-462f-ae3c-f2ba21546e06
prov> f832f635-cdde-4fb4-bc9b-b821bfa27dcc
prov> d5c9b938-8e3f-4147-9afc-75b40e72cdae
prov> 5b70bacc-a912-4f2e-907a-ab6c6d039929
- Sekarang kita pindahkan password dengan menggunakan script ini:
#!/usr/bin/perl
# Usage: as root # ./shadow2zm.pl /etc/shadow > shadow.zm
#
as zimbra # zmprov < shadow.zm
$domain=”my.domain.com”;
while(<>) {
chomp;
my ($uname,$pass) = split(/:/);
print qq{zmprov ma $uname\@$domain userPassword ‘{crypt}$pass’\n};
print qq{\n};
}
- Jalankan script diatas dengan cara: script “vpasswd” > databaru2.zmp
- Masukan password2 tersebut dengan cara menjalankan file yang sudah tercreate tadi:
./databaru2.zmp
Oh iya jangan lupa menjalankan export path terhadap path binary file zimbra:
PATH=$PATH:/data/myscripts
export PATH
- Selesai, sekarang semua user-user mail telah terpindahkan ke zimbra.
Selamat mencoba