Bulk Provisioning
Zmprov Command Files
The zmprov command will accept commands from a file. Just pass the commands in on standard input like this:
zmprov < mydata.zmp
Below are some ways to create a command file from your existing account data.
Passwd File to Zmprov
Following is a perl script to take a passwd file and turn it into a zmprov command file for account provisioning.
#!/usr/bin/perl ################################################################################ # $Id: passwd2zmprov,v 1.1.1.1 2007/01/23 18:04:38 dlbewley Exp $ #------------------------------------------------------------------------------- # 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. # # See Also: # http://wiki.zimbra.com/index.php?title=Bulk_Create # # Usage: # ./passwd2zmprov /etc/passwd > users.zmp # zmprov < users.zmp ################################################################################ my $DOMAIN='hostname.foo.bar'; # zimbra installation domain name my $MIN_UID=500; # skip system accounts like httpd my $MAX_UID=5000; # skip other system accounts like nfsnobody my $PASSWORD='password'; # default password # Zimbra Class Of Service for users my $COS_ID = 'e00000a0-0c00-00d0-000a-000d00afea0a'; # use during testing only #my $COS_ID = `su - zimbra -c 'zmprov gc Default |grep zimbraId:'`; #$COS_ID =~ s/zimbraId:\s*|\s*$//g; while(<>) { chomp; my ($uname,$x,$uid,$gid,$gecos,$dir,$shell) = split(/:/); if (! ($MIN_UID < $uid && $uid < $MAX_UID)) { warn "skipping $uname, $uid not between $MIN_UID and $MAX_UID"; next; } my $date = localtime(time); my ($fullname,$description) = split(/\s*,\s*/,$gecos,2); my ($fname,$initial,$lname) = split(/\s+/,$fullname); if (! $lname) { $lname = $initial; undef $initial; } my $displayname = "$fname $initial $lname"; $displayname =~ s/\s+/ /; print qq{ca $uname\@$DOMAIN "$PASSWORD"\n}; print qq{ma $uname\@$DOMAIN zimbraCOSid "$COS_ID"\n}; print qq{ma $uname\@$DOMAIN givenName "$fname"\n}; print qq{ma $uname\@$DOMAIN sn "$lname"\n}; print qq{ma $uname\@$DOMAIN cn "$uname"\n}; print qq{ma $uname\@$DOMAIN displayName "$displayname"\n}; print qq{ma $uname\@$DOMAIN description "$description"\n}; print qq{ma $uname\@$DOMAIN zimbraNotes "Migrated $date"\n}; print qq{ma $uname\@$DOMAIN zimbraPasswordMustChange TRUE\n}; print qq{\n}; }
To execute:
perl passwd2zmprov < passwd > mydata.zmp
CSV File to Zmprov
Following is a simple perl script to take a CSV file and turn it into the correct zmprov commands
#!/usr/bin/perl # Lookup the valid COS (Class of Service) ID in the interface or like this my $cosid = `su - zimbra -c 'zmprov gc Default |grep zimbraId:'`; $cosid =~ s/zimbraId:\s*|\s*$//g; while (<>) { chomp; # CHANGE ME: To the actual fields you use in your CSV file my ($email, $password, $first, $last) = split(/\,/, $_, 4); my ($uid, $domain) = split(/@/, $email, 2); print qq{ca $uid\@$domain $password\n}; print qq{ma $uid\@$domain zimbraCOSid "$cosid"\n}; print qq{ma $uid\@$domain givenName "$first"\n}; print qq{ma $uid\@$domain sn "$last"\n}; print qq{ma $uid\@$domain cn "$uid"\n}; print qq{ma $uid\@$domain displayName "$first $last"\n}; print qq{ma $uid\@$domain zimbraPasswordMustChange TRUE\n}; print qq{\n}; }
The above is only a starting place, you will need to change other options (eg: the zimbraPasswordMustChange is an example only) and of course how you create and split the input data.
Also, some CSV files may contain quotes you want to remove.
To execute:
perl csv2zmprov < mydata.csv > mydata.zmp