MOON
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4
System: Linux csr818.wilogic.com 2.6.18-419.el5xen #1 SMP Fri Feb 24 22:50:37 UTC 2017 x86_64
User: digitals (531)
PHP: 5.4.45
Disabled: NONE
Upload Files
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]#