Just in case anyone else runs into this, I wrote a little Perl script 
that parses out /var/qmail/users/assign to fetch a list of domains that 
are active on the mail server. Then, for each domain it goes out and 
fetches the vpasswd file and feeds its contents into a SQL database. It 
works quite nicely.


use strict;
use DBI;

my $host = 'localhost';
my $user = 'vpopmail';
my $password = 'secret';
my $db   = 'vpopmail';
my $domainfile="/var/qmail/users/assign";

my @connect = ("dbi:mysql:database=$db:host=$host", $user, $password);
my $dbh = DBI->connect(@connect);
warn "@connect" unless $dbh;

my @domainlist = get_domainlist( $domainfile );

foreach my $file ( @domainlist ) {
         #print "$file->{'dom'} \t $file->{'dir'} \n";
   add_users( $file->{'dir'}, $file->{'dom'} );

print "All done.\n\n";

## Subdomains

sub get_domainlist {
         my @domainlist;
         print "Reading in the file $_[0]...";
         open ( DOMAINLIST, $_[0] )  || die "couldn't open $_[0]: $!\n";
                 my @lines = <DOMAINLIST>;
         close (DOMAINLIST) || die "couldn't close $_[0]: $!\n";
         print "done.\n\n";
         print "Extracting the list of domains...";
         my $row = "0";
         foreach my $line ( @lines ) {
                 my @fields = split(":", $line);
                 my %domain = (
                         dir  => "$fields[4]/vpasswd",
                         dom  => "$fields[1]"
                 $domainlist[$row] = \%domain;
         print "done.\n\n.";
         return @domainlist;

sub add_users {
         if ( -e $_[0] ) {
            open ( USERLIST, $_[0] ) || warn "couldn't open $_[0]: $!\n";
                my @users = <USERLIST>;
            close (USERLIST);
            foreach my $user (@users) {
                 chomp $user;
                my @f = split(":", $user);
                print "$user\n";

                my $query = "INSERT INTO vpopmail SET pw_name=\"$f[0]\", 
pw_domain=\"$_[1]\", pw_passwd=\"$f[1]\", pw_uid=\"$f[2]\", 
pw_gid=\"$f[3]\", pw_gecos=\"$f[4]\", pw_dir=\"$f[5]\", 
                my $sth = $dbh->prepare($query);

                my $x = $DBI::errstr;
                if ($x) { print "Error running $query\n"; };

On Tuesday, September 24, 2002, at 04:03  PM, Matt Simerson wrote:

> I'm rebuilding a dinosaur mail server that I built a couple years ago. 
> It's running vpopmail 4.9.10 using cdb authentication. I'm upgrading 
> to 5.3.8 with MySQL authentication.
> I've build out the new 5.3.8 system and cluster of machines. It's all 
> up, running and happy. I've NFS mounted all the home directories from 
> the old cluster onto the new system so that I have ready access to the 
> vpasswd and vpasswd.cdb files. They are mounted onto the local 
> filesystem so that the paths in /var/qmail/users/assign are correct.
> I run vconvert -c -m test.domain.com and it exits quietly indicating 
> success:
> mail8# ~vpopmail/bin/vconvert -c -m -v -d test.simerson.net
> version: 5.3.8
> converting test.simerson.net done
> However, when I check the MySQL server, there's no entries in the 
> vpopmail table that correspond to that domain. :-(
> I've tested this one step further. I've manually added a valid user 
> ([EMAIL PROTECTED]) into the new mail system by manually adding 
> it into the MySQL table. It works fine, authenticates, etc. That 
> basically makes it work with my new mail system and the old one at the 
> same time. Cool.  Anyway, if I run vconvert again, it'll actually 
> delete that entry from the vpopmail table.  Is that supposed to > happen?
> Everything on the new system works just fine except the vconvert 
> function. Can anyone verify that vconvert actually does work?  Can you 
> sanitize a copy of a newer vpasswd file and send it my way so I can 
> compare it to my ancient system to see if the format is still the > same?
> Matt

Reply via email to