ons, 06.10.2004 kl. 10.47 skrev Tony Earnshaw: > YES! Now it works, thanks a bundle :) > > > Obviously, this is a homegrown script not quite ready for the real world. > > As it is, the modified script could be a useful addition to the SM > package. It'll certainly ease the changeover from flat files to MySQL > for the 133t school's 200+ SM users ...
For posterity and to avoid others having to waste time, the modified script is attached and works for most of the options, anyway. The options at the beginning should be changed to suit peoples' own sites. Many thanks to Paul for the shoves in the right direction and not forgetting Michael Blandford and "Tal" who published the original. --Tonni -- «Livet er ein gamp», sa øyken. I can confirm this. mail: [EMAIL PROTECTED] http://www.billy.demon.nl They love us, don't they, They feed us, won't they
#!/usr/bin/perl # flat2sql.pl v1.0 # # Copyright (c) 2002, Michael Blandford and Tal Yardeni ##### Conf Section ##### $data_dir = "/var/www/squirrelmail-1.4.3a/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.$pref_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; }