File: //proc/self/root/scripts.20110531.215904.25158/neomail2hordeaddrbook
#!/usr/bin/perl
# cpanel10 - neomail2hordeaddrbook Copyright(c) 2005 cPanel, Inc.
# All rights Reserved.
# copyright@cpanel.net http://cpanel.net
# This code is subject to the cpanel license. Unauthorized copying is prohibited
use strict;
use warnings;
use Carp;
use DBI;
my $mypass = get_root_mysql_pass();
my $myhost = get_root_mysql_host();
my $dbh = DBI->connect('DBI:mysql:horde:' . $myhost, 'root', $mypass)
or die DBI->errstr();
DOUSER:
for my $user (@{ get_all_users_or_arg_ref() }) {
print "Processing $user...\n";
my $home = (getpwnam( $user ))[7];
if(!defined $home) {
carp "Could not determine home for $user";
next DOUSER;
}
chdir $home or croak "Could not go into $home for $user: $!";
opendir my $home_dh, '.' or croak "Can not read .: $!";
my @neomails = grep { /^\.neomail/ } readdir $home_dh;
closedir $home_dh;
my $address_books_processed = 0;
for my $neo (@neomails) {
if(-e "$neo/$user/addressbook") {
my $email_user = '';
if($neo ne '.neomail') {
(undef, $email_user) = split /\-/, $neo;
}
my $owner_id = !$email_user ? $user
: get_entire_addr($user, $email_user);
$owner_id = $dbh->quote( $owner_id );
if(open my $addr_fh, '<', "$neo/$user/addressbook") {
while(<$addr_fh>) {
chomp;
my ($name, $email) = split /\:/, $_;
my $object_name = $dbh->quote( $name );
my $object_email = $dbh->quote( $email );
my $exists_query = <<"EXISTS_END";
SELECT object_id FROM horde.turba_objects WHERE
owner_id=$owner_id AND object_email=$object_email
EXISTS_END
my ($exists) = $dbh->selectrow_array($exists_query);
if(!$exists) {
my $add_query = <<"QUERY_END";
INSERT INTO horde.turba_objects
(object_id, owner_id, object_name, object_email)
VALUES (MD5( RAND() ),
$owner_id, $object_name, $object_email)
QUERY_END
$dbh->do($add_query);
print "Query failed (run manually):\n$add_query\n\n"
if $dbh->errstr();
}
else {
print "$object_email for $owner_id already exists\n";
}
}
close $addr_fh;
if(unlink "$neo/$user/addressbook") {
$address_books_processed++;
}
else {
print "Could not remove $neo/$user/addressbook: $!";
}
}
else {
print "ERROR: Could not open $neo/$user/addressbook: $!\n";
}
}
}
if($address_books_processed) {
my $s = $address_books_processed == 1 ? '' : 's';
print "$user had $address_books_processed address book$s processed\n";
}
else {
print "$user has no neomail entries to import\n";
}
print "$user Done!\n\n";
}
#############################################
#### put in module & use that module above ##
#### use Carp; ##
#############################################
sub get_root_mysql_pass {
my $mypass = '';
open my $mycnf_fh, '<', '/root/.my.cnf'
or croak "Set MySQL root passwd: $!";
while(<$mycnf_fh>) {
if($_ =~ m/pass\s*\=/) {
($mypass) = $_ =~ m/pass\s*\=\s*\"?([^\"\s]+)\"?/;
last;
}
}
close $mycnf_fh;
return $mypass;
}
sub get_root_mysql_host {
my $mypass = '';
open my $mycnf_fh, '<', '/root/.my.cnf'
or croak "Set MySQL root passwd: $!";
while(<$mycnf_fh>) {
if($_ =~ m/host\s*\=/) {
($myhost) = $_ =~ m/host\s*\=\s*\"?([^\"\s]+)\"?/;
last;
}
}
close $mycnf_fh;
return $myhost || 'localhost';
}
sub get_entire_addr {
my ( $owner, $first_part ) = @_; # systemuser, part of address before @
my $entire_address = $first_part; # append @domain.here
my $home = (getpwnam( $owner ))[7];
opendir my $mail_dh, "$home/mail"
or croak "Could not read ~/mail for $owner: $!";
my @dirs = grep { -d "$home/mail/$_" && $_ !~ m/^\.\.?$/ } readdir $mail_dh;
closedir $mail_dh;
LOOKFORUSER:
for my $domain (@dirs) {
if(-d "$home/mail/$domain/$first_part") {
$entire_address .= '@' . $domain;
last LOOKFORUSER;
}
}
return $entire_address;
}
sub get_all_users_or_arg_ref {
my $arg_location = shift || 0;
my $user_to_run = defined $ARGV[$arg_location]
&& $ARGV[$arg_location]
? $ARGV[$arg_location] : '';
my $user_lookup_ref = get_user_lookup_ref();
my @users_to_transform = keys %{ $user_lookup_ref };
if($user_to_run) {
if(exists $user_lookup_ref->{$user_to_run}) {
@users_to_transform = ($user_to_run);
}
else {
croak 'Unknown user';
}
}
return \@users_to_transform;
}
sub get_user_lookup_ref {
my $user_lookup = {};
open my $TUD, '/etc/trueuserdomains' or die "trueuserdomains failed: $!";
while( <$TUD> ) {
my ($user) = $_ =~ m/\:\s+(\w+)/;
$user_lookup->{ $user }++ if $user;
}
close $TUD;
return $user_lookup;
}
__END__
# system user
# .neomail/$user/addressbook
# email@foo.com
#.neaomail-email/$user/addressbook
# bar@foo.com
# .neaomail-bar/$user/addressbook
#root@localhost [/home/neotest]# cat .neomail/neotest/addressbook
#your name:address@here.foo
#Name:email@ddre.ss
#root@localhost [/home/neotest]# cat .neomail-iloveneomail/neotest/addressbook
#Fran:fran@fran.fran
#Fibble John:joehn@fibble.net
#root@localhost [/home/neotest]#