#!/usr/bin/perl
# cpanel12 - scripts                        Copyright(c) 1997-2002 cPanel, Inc.
#                                                           All rights Reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cpanel license. Unauthorized copying is prohibited
# $Desc: v3.0.0-274-g545221d$

use strict;
use warnings;

use POSIX ();

$| = 1;

$ENV{'PATH'} = "/usr/local/bin:/usr/bin:/bin:/usr/local/ssh/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/ssl/bin:/usr/local/java/bin:/usr/local/Hughes/bin:/usr/local/mysql/bin:/usr/local/ssh/bin:/usr/spectro:/sbin:/usr/sbin:/usr/local/bin:/usr/spectro";

my $user       = $ARGV[0];
my $realuser   = $user;
my $skipacctdb = pop(@ARGV) eq '--skipacctdb';

my ( $system, $release, $machine ) = ( POSIX::uname() )[ 0, 2, 4 ];

my $dotbuffer = '/scripts/dotbuffer';
if ( !-e "/scripts/dotbuffer" ) {
    my $tmpdir = ( getpwuid($>) )[7] . "/tmp";
    mkdir( $tmpdir, 0700 );
    open( DOTBUFFER, ">$tmpdir/dotbuffer" );
    print DOTBUFFER <<EOM;
#!/usr/bin/perl
\$limit = \$ARGV[0];
\$|=1;
while(read(STDIN,\$buffer,1)) {
        if (\$buffer =~ /a/i || \$buffer =~ /b/i) {
                print ".";
                \$count++;
                if (\$count == \$limit) {
                        print "\n";
                        \$count=0;
                }
        }
}
EOM
    close(DOTBUFFER);
    chmod( 0700, "$tmpdir/dotbuffer" );
    $dotbuffer = "$tmpdir/dotbuffer";
}

if ( $user eq "root" ) {
    print "You cannot copy the root user.\n";
    exit;
}
my $tarroot  = $ARGV[1];
my $isbackup = 0;
my $prefix;

if ( $ARGV[2] eq "backup" ) {
    $isbackup = 1;
    $prefix   = '';
}
else {
    $prefix = 'cpmove-';
}

$prefix =~ s/\s//g;
$prefix =~ s/\n//g;

if ( $tarroot eq "" || !-d "$tarroot" ) {
    if ( $ARGV[2] eq "backup" ) {
        print "Bailing out.. you must set a valid destination for backups\n";
        exit;
    }
    if ( -e "/home3" ) {
        $tarroot = '/home3';
    }
    elsif ( -e "/home2" ) {
        $tarroot = '/home2';
    }
    else {
        $tarroot = '/home';
    }
}

$0 = "pkgacct - ${user}";

if ( !getpwnam($realuser) ) {
    print "Invalid Account\n";
    exit;
}

my $homedir = ( getpwnam($realuser) )[7];

if ( -l $homedir ) {
    $homedir = readlink($homedir);
}
if ( -l $homedir ) {
    $homedir = readlink($homedir);
}

my $dns;

open( DA, "/etc/domainaliases" );
while (<DA>) {
    s/\n//g;
    my ( $daddy, $duser ) = split( / /, $_, 2 );
    if ( $duser eq $realuser ) {
        ( undef, $dns ) = split( /\@/, $daddy );
    }
}

if ( $dns eq "" ) {
    print "Unable to find domain name for $user\n";
    exit;
}

print "ciXost DNS is $dns\n";

my $lcdns = $dns;
$lcdns =~ tr/[A-Z]/[a-z]/;

if ( $prefix eq "" && $tarroot eq "/home" ) {
    print "Bailing out .. no prefix set and tarroot is /home\n";
    exit;
}

if ( $prefix ne "" ) {
    if ( -d "${tarroot}/${prefix}${user}" && !-l "${tarroot}/${prefix}${user}" ) {
        system( "rm", "-rf", "${tarroot}/${prefix}${user}" );
    }
    if ( -f "${tarroot}/${prefix}${user}.tar.gz" && !-l "${tarroot}/${prefix}${user}.tar.gz" ) {
        system( "rm", "-rf", "${tarroot}/${prefix}${user}.tar.gz" );
    }
}

open( CPM, ">${tarroot}/${prefix}${user}.tar.gz" );
close(CPM);
chmod( 0600, "${tarroot}/${prefix}${user}.tar.gz" );

if ( !-e "${tarroot}/${prefix}${user}" ) {
    mkdir( "${tarroot}/${prefix}${user}",          0700 );
    mkdir( "${tarroot}/${prefix}${user}/cp",       0700 );
    mkdir( "${tarroot}/${prefix}${user}/logs",     0700 );
    mkdir( "${tarroot}/${prefix}${user}/mysql",    0700 );
    mkdir( "${tarroot}/${prefix}${user}/mm",       0700 );
    mkdir( "${tarroot}/${prefix}${user}/mma",      0700 );
    mkdir( "${tarroot}/${prefix}${user}/mma/pub",  0700 );
    mkdir( "${tarroot}/${prefix}${user}/mma/priv", 0700 );
    mkdir( "${tarroot}/${prefix}${user}/rawlists", 0700 );
    mkdir( "${tarroot}/${prefix}${user}/va",       0700 );
    mkdir( "${tarroot}/${prefix}${user}/fp",       0700 );
    mkdir( "${tarroot}/${prefix}${user}/vf",       0700 );
}
else {
    print "${tarroot}/${prefix}${user} exists, please remove it and try again\n";
    exit;
}

my $now = time();
open( CPU, ">${tarroot}/${prefix}${user}/cp/${user}" );
print CPU "DNS=$dns\n";
print CPU "STARTDATE=$now\n";
print CPU "PLAN=cihost\n";
close(CPU);

print "Copying homedir....";

if ( my $pid = fork() ) {
    my $dotcount = 5;
    while ( waitpid( $pid, 1 ) != -1 ) {
        if ( $dotcount % 5 == 0 ) {
            print ".........\n";
        }
        sleep(1);
        $dotcount++;
    }
}
else {
    if ($isbackup) {
        if ( $system =~ /freebsd/i ) {
            system( "cp", "-Rp", "$homedir", "${tarroot}/${prefix}${user}/homedir" );
        }
        else {
            system( "cp", "-a", "$homedir", "${tarroot}/${prefix}${user}/homedir" );
        }
    }
    else {
        if ( $system =~ /freebsd/i ) {
            system("cp -Rpv $homedir ${tarroot}/${prefix}${user}/homedir | $dotbuffer 20");
        }
        else {
            system("cp -av $homedir ${tarroot}/${prefix}${user}/homedir | $dotbuffer 20");
        }
    }
    exit();
}

unlink("${tarroot}/${prefix}${user}/homedir/access-log");
unlink("${tarroot}/${prefix}${user}/homedir/anonftp");
unlink("${tarroot}/${prefix}${user}/homedir/www");
my $raroot = "$homedir/www/realaudio";
if ( -l $raroot ) { $raroot = readlink($raroot) }
if ( $system =~ /freebsd/i ) {
    system("cp -Rpv $raroot ${tarroot}/${prefix}${user}/homedir/public_ra | $dotbuffer 20");
}
else {
    system("cp -av $raroot ${tarroot}/${prefix}${user}/homedir/public_ra | $dotbuffer 20");
}
my $wwwroot = "$homedir/www";
if ( -l $wwwroot ) { $wwwroot = readlink($wwwroot) }
if ( -l $wwwroot ) { $wwwroot = readlink($wwwroot) }
if ( -l $wwwroot ) { $wwwroot = readlink($wwwroot) }
if ( $system =~ /freebsd/i ) {
    system("cp -Rpv $wwwroot ${tarroot}/${prefix}${user}/homedir/public_html | $dotbuffer 20");
}
else {
    system("cp -av $wwwroot ${tarroot}/${prefix}${user}/homedir/public_html | $dotbuffer 20");
}
my $ftproot = "$homedir/anonftp";
if ( -l $ftproot ) { $ftproot = readlink($ftproot) }
if ( -l $ftproot ) { $ftproot = readlink($ftproot) }
if ( -l $ftproot ) { $ftproot = readlink($ftproot) }
if ( $system =~ /freebsd/i ) {
    system("cp -Rpv $ftproot ${tarroot}/${prefix}${user}/homedir/public_ftp | $dotbuffer 20");
}
else {
    system("cp -av $ftproot ${tarroot}/${prefix}${user}/homedir/public_ftp | $dotbuffer 20");
}
unlink("${tarroot}/${prefix}${user}/homedir/public_html/realaudio");
unlink("${tarroot}/${prefix}${user}/homedir/public_html/wusage");
symlink( "../public_ra",                     "${tarroot}/${prefix}${user}/homedir/public_html/realaudio" );
symlink( "../.wusage",                       "${tarroot}/${prefix}${user}/homedir/public_html/wusage" );
symlink( "public_ftp",                       "${tarroot}/${prefix}${user}/homedir/anonftp" );
symlink( "public_html",                      "${tarroot}/${prefix}${user}/homedir/www" );
symlink( "/usr/local/apache/domlogs/${dns}", "${tarroot}/${prefix}${user}/homedir/access-log" );
print "Done\n";

print "Copying Mail files....";
open( VA,  ">${tarroot}/${prefix}${user}/va/$dns" );
open( RED, "$homedir/.redirect" );
my $defmail;
while (<RED>) {
    s/\n//g;
    my ( $from, $dest ) = split( / /, $_ );
    if ( $dest eq "$realuser\@$dns" ) {
        $dest = "$user";
    }
    if ( $from eq $realuser || ( $from eq "default" && $defmail eq "" ) ) {
        $defmail = $dest;
    }
    else {
        print VA "${from}\@${dns}: $dest\n";
    }

}
close(RED);
my @FILES = glob("${homedir}/infobots/*");
foreach my $file (@FILES) {
    my @BASENAME = split( /\//, $file );
    my $basename = $BASENAME[$#BASENAME];

    mkdir( "${tarroot}/${prefix}${user}/homedir/.autorespond", 0770 );
    system("cp -f $file ${tarroot}/${prefix}${user}/homedir/.autorespond/${basename}\@${dns}");
    print VA "${basename}\@${dns}: |/usr/local/cpanel/bin/autorespond ${basename}\@${dns} ${homedir}/.autorespond\n";
}
print VA "*: $defmail\n";
close(VA);
print "Done\n";

if ( -e "/usr/local/frontpage/www.${dns}:80.cnf" ) {
    print "Copying frontpage file....";
    system( "cp", "/usr/local/frontpage/www.${dns}:80.cnf", "${tarroot}/${prefix}${user}/fp" );
    print "Done\n";
}

open( NDA, ">${tarroot}/${prefix}${user}/da" );
open( DA,  "/etc/domainaliases" );
while (<DA>) {
    my $line = $_;
    my ( $addy, $null ) = split( / /, $line, 2 );
    my ($domain);
    ( undef, $domain ) = split( /\@/, $addy );
    if ( $domain eq $dns ) {
        print NDA $line;
    }
}
close(DA);
close(NDA);

print "Building proftpd file....";
open( PROFTPDPASS, ">${tarroot}/${prefix}${user}/proftpdpasswd" );
open( DA,          "/etc/domainaliases" );
while (<DA>) {
    s/\n//g;
    my ( $addy, $ftpuser ) = split( / /, $_, 2 );
    my ($domain);
    ( undef, $domain ) = split( /\@/, $addy );
    if ( $domain eq $dns ) {
        if ( ( getpwnam($ftpuser) )[8] =~ /ftp/ ) {
            my $userhome = ( getpwnam($ftpuser) )[7];
            my $wwwdir   = $userhome . "/www";
            if ( -l $wwwdir ) { $wwwdir = readlink($wwwdir); }
            if ( -l $wwwdir ) { $wwwdir = readlink($wwwdir); }
            if ( -l $wwwdir ) { $wwwdir = readlink($wwwdir); }
            my @BASENAME = split( /\//, $userhome );
            my $basename = $BASENAME[$#BASENAME];
            mkdir( "${tarroot}/${prefix}${user}/homedir/public_html",            0755 );
            mkdir( "${tarroot}/${prefix}${user}/homedir/public_html/${ftpuser}", 0755 );
            symlink( "$ftpuser", "${tarroot}/${prefix}${user}/homedir/public_html/${basename}" );
            my $spass = getcpass($ftpuser);
            print PROFTPDPASS "${ftpuser}:${spass}:-1:-1::/dev/null:/bin/ftpsh\n";
        }
    }
}
close(DA);
close(PROFTPDPASS);
print "Done\n";

print "Building mail pass file....";
mkdir( "${tarroot}/${prefix}${user}/homedir/etc",  0770 );
mkdir( "${tarroot}/${prefix}${user}/homedir/mail", 0770 );
system( "cp", "-f", "/var/spool/mail/${realuser}", "${tarroot}/${prefix}${user}/homedir/mail/inbox" );
open( PASSWD, ">${tarroot}/${prefix}${user}/homedir/etc/passwd" );
open( SHA,    ">${tarroot}/${prefix}${user}/homedir/etc/shadow" );
open( DA,     "/etc/domainaliases" );
while (<DA>) {
    s/\n//g;
    my ( $addy, $mailuser ) = split( / /, $_, 2 );
    my ($domain);
    ( undef, $domain ) = split( /\@/, $addy );
    if ( $domain eq $dns ) {
        if ( ( getpwnam($mailuser) )[8] =~ /mail/ ) {
            my $pass = getcpass($mailuser);
            print PASSWD "${mailuser}:x:-1:-1:${user}:${homedir}:/bin/sh\n";
            print SHA "${mailuser}:${pass}:::::::\n";
            mkdir( "${tarroot}/${prefix}${user}/homedir/mail/${mailuser}", 0770 );
            system( "cp", "-f", "/var/spool/mail/${mailuser}", "${tarroot}/${prefix}${user}/homedir/mail/${mailuser}/inbox" );
        }
    }
}
close(DA);
close(SHA);
close(PASSWD);
print "Done\n";

print "Copying www logs....";
if ( my $pid = fork() ) {
    while ( waitpid( $pid, 1 ) != -1 ) {
        print ".........\n";
        sleep(5);
    }
}
else {
    $0 = "pkgacct - ${user} - log copy child";
    my $wwwlogfile = "$homedir/access-log";
    my $ftplogfile = "/ftp/logs/${realuser}";
    if ( -l $wwwlogfile ) { $wwwlogfile = readlink($wwwlogfile); }
    if ( -l $wwwlogfile ) { $wwwlogfile = readlink($wwwlogfile); }
    if ( -l $wwwlogfile ) { $wwwlogfile = readlink($wwwlogfile); }
    if ( -l $ftplogfile ) { $ftplogfile = readlink($ftplogfile); }
    if ( -l $ftplogfile ) { $ftplogfile = readlink($ftplogfile); }
    if ( -l $ftplogfile ) { $ftplogfile = readlink($ftplogfile); }
    system("cp $wwwlogfile ${tarroot}/${prefix}${user}/logs/${lcdns} 2>/dev/null");
    system("cp $ftplogfile ${tarroot}/${prefix}${user}/logs/${lcdns}-ftp_log 2>/dev/null");
    exit;
}
print "Done\n";

print "Getting quota info...";

my $quota = `quota -v -g ${realuser}grp`;
my @QUOTA = split( /\n/, $quota );
my $USED  = 0;
my $LIMIT = 0;

foreach my $line (@QUOTA) {
    $line =~ s/^\s*//g;
    if ( $line =~ /^\// ) {
        $line =~ /^(\S+)\s*(\d+)\s*\d+\s*(\d+)/;
        my $dsk = $1;
        if ( getmnt($dsk) =~ /backup/ ) {
            next;
        }
        $USED += $2;
        if ( $LIMIT eq '' || $LIMIT == 0 ) { $LIMIT = $3; }
    }
}

open( QUOTA, ">${tarroot}/${prefix}${user}/quota" );
$LIMIT = ( $LIMIT / 1000 );    #should be 1024 but this is ala math
print QUOTA "$LIMIT\n";
close(QUOTA);
print "Done\n";

unless ($skipacctdb) {
    my $mysqlpass = 'spectro';        #this is a crappy default
    if ( -e "/etc/mysqlpswd" ) {
        open( MP, "/etc/mysqlpswd" );
        $mysqlpass = <MP>;
        close(MP);
    }
    $mysqlpass =~ s/\n//g;

    my @DBS = split( /\n/, `mysql  --skip-column-names  -p${mysqlpass} mysql -e "select Db,User from db where User='${realuser}';"` );

    print "Grabbing mysql dbs...";
    foreach my $db (@DBS) {
        $db =~ s/[\t\s]+/ /g;
        ( $db, undef ) = split( / /, $db );
        print "... $db ...";
        if ( -e "/usr/local/mysql/data/${db}" ) {
            my $targetdb = $db;
            $targetdb =~ s/^${realuser}//g;
            mkdir( "${tarroot}/${prefix}${user}/mysql/${user}_${targetdb}", 0755 );
            if ( $system =~ /freebsd/i ) {
                system("cp -Rp /usr/local/mysql/data/${db}/* ${tarroot}/${prefix}${user}/mysql/${user}_${targetdb} 2>/dev/null");
            }
            else {
                system("cp -a /usr/local/mysql/data/${db}/* ${tarroot}/${prefix}${user}/mysql/${user}_${targetdb} 2>/dev/null");
            }
        }
    }
    print "Done\n";
}

print "Copying mailing lists....";
if ( $system =~ /freebsd/i ) {
    system("/bin/cp -Rp $homedir/maillists/* ${tarroot}/${prefix}${user}/rawlists 2>/dev/null");
}
else {
    system("/bin/cp -a $homedir/maillists/* ${tarroot}/${prefix}${user}/rawlists 2>/dev/null");
}
print "Done\n";

print "Storing Parked Domains....\n";

#VIPS FIXME
my %PDS;
open( ID, "$homedir/www/index.cgi" );
while (<ID>) {
    my ( undef, $good ) = split( /eq/, $_ );
    if ( $good =~ /\'([^\']+)\'/ ) {
        my $pd = $1;
        if ( $pd =~ /\./ ) {
            $pd =~ s/^www\.//g;
            $PDS{$pd} = 1;
        }
    }
}
open( SH, ">${tarroot}/${prefix}${user}/pds" );
foreach my $pd ( keys %PDS ) {
    print "... $pd ...";
    print SH "$pd\n";
}
close(SH);
print "Done\n";

print "Copying password.......";
open( SH, ">${tarroot}/${prefix}${user}/shadow" );
my $pass = getcpass($realuser);
print SH "$pass";
close(SH);
print "Done\n";

chdir("${tarroot}");
print "pkgacctfile is: ${tarroot}/${prefix}${user}.tar.gz\n";
print "Creating Archive ....";
if ($isbackup) {
    system( "tar", "pczf", "${prefix}${user}.tar.gz", "${prefix}${user}" );
}
else {
    if ( my $pid = fork() ) {
        my $dotcount = 5;
        while ( waitpid( $pid, 1 ) != -1 ) {
            if ( $dotcount % 5 == 0 ) {
                print ".........\n";
            }
            sleep(1);
            $dotcount++;
        }
    }
    else {
        system( "tar", "pczf", "${prefix}${user}.tar.gz", "${prefix}${user}" );
        exit();
    }
}
if ( -d "${tarroot}/${prefix}${user}" && !-l "${tarroot}/${prefix}${user}" ) {
    system( "rm", "-rf", "${tarroot}/${prefix}${user}" );
}
print "Done\n";

chomp( my $md5sum = `md5sum ${tarroot}/${prefix}${user}.tar.gz` );
$md5sum =~ /^(\S+)[\s|\t]*/;
$md5sum = $1;

print "md5sum is: $md5sum\n";

sub getmnt {
    my ($dsk) = @_;

    open( MTAB, "/etc/mtab" );
    while (<MTAB>) {
        if (/^${dsk}\s(\S+)/) {
            return $1;
        }
    }
    close(MTAB);
    return "";
}

sub getcpass {
    my ($user) = @_;
    if ( -e "/etc/shadow" ) {
        open( SHADOW, "/etc/shadow" );
    }
    else {
        open( SHADOW, "/etc/master.passwd" );
    }

    my $cpass;

    while (<SHADOW>) {
        if (/^$user:/) {
            ( undef, $cpass, undef ) = split( /:/, $_, 3 );
            last;
        }

    }

    close(SHADOW);
    return ($cpass);
}
