Here is my script for converting from file prefs to database prefs.
Michael
#!/usr/bin/perl
# flat2sql.pl v1.0
#
# Copyright (c) 2002, Michael Blandford and Tal Yardeni
##### Conf Section #####
$data_dir = "/var/www/html/mail/data";
$db = "squirrelmail";
$abook_table = "address";
$pref_table = "userprefs";
##### ##### #####
use Getopt::Long;
&GetOptions( \%opts, qw( abook data_dir:s delete h help pref sig user:s ) );
&Usage if ( defined $opts{h} or defined $opts{help} );
unless ( defined $opts{abook} or defined $opts{pref} or
defined $opts{sig}) {
$opts{abook}=TRUE;
$opts{pref}=TRUE;
$opts{sig}=TRUE;
}
# Override the data directory if passed as an argument
$data_dir = $opts{data_dir} if ( defined $opts{data_dir} );
# Are we looking for specific users or all users?
# There has to be a better way to do this - Below
@user_list = split ( /,/, $opts{user} ) if defined $opts{user};
# Here we go
# If no arguments are passed, and we cant open the dir, we should
# get a usage.
opendir(DIR, $data_dir) or
die "DIRECTORY READ ERROR: Could not open $data_dir!!\n";
while ( $filename = readdir DIR ) {
next if ( $filename eq "." or $filename eq ".." );
$filename =~ /(.*)\.(.*)/;
$username = $1;
# Deal with the people
# There has to be a better way to do this - Above
next if ( defined $opts{user} and grep(!/$username/,@user_list));
# Deal with the extension files
$ext = $2;
next unless $ext;
&abook if ( $ext eq "abook" and defined $opts{abook} );
&pref if ( $ext eq "pref" and defined $opts{pref} );
&sig if ( $ext =~ /si([g\d])$/ and defined $opts{sig});
}
closedir ( DIR );
# All done. Below are functions
# Process a user address file
sub abook {
print "DELETE FROM $db.$abook_table WHERE owner = '$username;\n"
if ( defined $opts{delete} );
open(ABOOK, ">$data_dir/$filename") or
die "FILE READ ERROR: Could not open $filename!!\n";
while (my $line = <ABOOK> ) {
chomp $line;
my ( $nickname,$firstname,$lastname,$email,$label ) = split(/\|/, $line);
print "INSERT INTO $db.$abook_table "
. "(owner,nickname,firstname,lastname,email,label) "
. "VALUES ('$username','$nickname','$firstname','$lastname',"
. "'$email','$label');\n";
}
close(ABOOK);
}
# Process a user prefernce file
sub pref {
print "DELETE FROM $db.$pref_table "
. "WHERE user = '$username' and prefkey not like '___sig\%___';\n"
if ( defined $opts{delete} );
open(PREFS, "<$data_dir/$filename") or
die "FILE READ ERROR: Could not open $filename!!\n";
while (my $line = <PREFS> ) {
chomp $line;
my ( $prefkey, $prefval ) = split(/=/, $line);
print "INSERT INTO $db.$pref_table "
. "(user,prefkey,prefval) "
. "VALUES ('$username','$prefkey','$prefval');\n";
}
close(PREFS);
}
# Process a user sig file
sub sig {
$del_ext = $1;
$del_ext = "nature" if ( $del_ext eq "g" );
print "DELETE FROM $db.$pref_table "
. "WHERE user = '$username' and prefkey like '___sig" . $del_ext . "___';\n"
if ( defined $opts{delete} );
open(SIG, "<$data_dir/$filename") or
die "FILE READ ERROR: Could not open $filename!!\n";
my @lines = <SIG>;
close(SIG);
$filename =~ /.*\.si([g,\d]$)/;
$prefkey = "___sig";
if ( $1 eq "g" ) {
$prefkey .= "nature___";
} else {
$prefkey .= "$1___";
}
print "INSERT INTO $db.$sig_table (user,prefkey,prefval) "
. "VALUES ('$username','$prefkey','".join("",@lines)."');\n";
}
# Print out the usage screen
sub Usage {
$0 =~ /.*\/(.*)/;
$prog = $1;
print <<EOL;
This program generates SQL statements to aid importing squirrelmail
user config into a database.
Usage: $prog [--delete] [--abook] [--pref] [--sig] [--data_dir=<>]
[--user=<username0[,username1[,username2]...]]
Prefs --abook, --pref, and --sig are assumed if none of them as passed
--delete removes all previous values for users ( --users=<> ) already in
the database. This is useful to reimport users.
It respects --abook, --pref, and --sig.
If --user is not specified, it will try to do all users.
EOL
exit 1;
}