Esempio n. 1
0
function restorembx($basedContent)
{
    $GLOBALS["ONNLY_MOUNT"] = true;
    $unix = new unix();
    $rsync = $unix->find_program("rsync");
    $chown = $unix->find_program("chown");
    $sudo = $unix->find_program("sudo");
    $reconstruct = $unix->LOCATE_CYRRECONSTRUCT();
    if (!is_file($rsync)) {
        writelogs(date('m-d H:i:s') . " " . "Unable to stat rsync program", __FUNCTION__, __FILE__, __LINE__);
        return;
    }
    if (!is_file($reconstruct)) {
        writelogs(date('m-d H:i:s') . " " . "Unable to stat reconstruct program", __FUNCTION__, __FILE__, __LINE__);
        return;
    }
    $array = unserialize(base64_decode($basedContent));
    $id = $array["taskid"];
    writelogs(date('m-d H:i:s') . " " . "mounting {$id}", __FUNCTION__, __FILE__);
    $mounted_dir = backup($id);
    if ($mounted_dir == null) {
        writelogs(date('m-d H:i:s') . " " . "cannot mount task id {$id}", __FUNCTION__, __FILE__);
        return;
    }
    $path = $array["path"];
    $uid = $array["uid"];
    if (preg_match("#INBOX\\/(.+)#", $array["mailbox"], $re)) {
        $mailbox = $re[1];
        $cyrus = new cyrus();
        $cyrus->CreateSubDir($uid, $mailbox);
    } else {
        $mailbox = $array["mailbox"];
    }
    $localimapdir = $unix->IMAPD_GET("partition-default");
    if (!is_dir($localimapdir)) {
        writelogs(date('m-d H:i:s') . " " . "Unable to stat local partition-default", __FUNCTION__, __FILE__, __LINE__);
        return;
    }
    $userfs = str_replace(".", "^", $uid);
    $firstletter = substr($userfs, 0, 1);
    $localuserfs = "{$localimapdir}/{$firstletter}/user/{$userfs}";
    $localimapdir = "{$localimapdir}/{$firstletter}/user/{$userfs}/";
    if (!is_dir($localimapdir)) {
        writelogs(date('m-d H:i:s') . " " . "Unable to stat local \"{$localimapdir}\"", __FUNCTION__, __FILE__, __LINE__);
        return;
    }
    $remoteimapdir = "{$mounted_dir}/{$path}/{$mailbox}";
    @mkdir($localimapdir, null, true);
    if (substr($remoteimapdir, strlen($remoteimapdir) - 1, 1) != "/") {
        $remoteimapdir = $remoteimapdir . "/";
    }
    $cmd = "{$rsync} -z --stats {$remoteimapdir}* {$localimapdir} 2>&1";
    if ($GLOBALS["USE_RSYNC"]) {
        $backup = new backup_protocols();
        writelogs(date('m-d H:i:s') . " " . "Using rsync protocol", __FUNCTION__, __FILE__, __LINE__);
        $array_config = $backup->extract_rsync_protocol($remoteimapdir);
        if (!is_array($array)) {
            writelogs(date('m-d H:i:s') . " " . "[TASK {$ID}]: rsync protocol error", __FUNCTION__, __FILE__, __LINE__);
            return false;
        }
        if ($array_config["PASSWORD"] != null) {
            $tmpstr = "/opt/artica/passwords/" . md5($array_config["PASSWORD"]);
            @mkdir("/opt/artica/passwords", null, true);
            @file_put_contents($tmpstr, $array_config["PASSWORD"]);
            $pwd = " --password-file={$tmpstr}";
        }
        if ($array["USER"] != null) {
            $user = "******"USER"]}@";
        }
        $cmd = "{$rsync}{$pwd} --stats rsync://{$user}{$array_config["SERVER"]}/{$array_config["FOLDER"]}*  {$localimapdir} 2>&1";
    }
    writelogs(date('m-d H:i:s') . " " . "Restore from {$remoteimapdir}", __FUNCTION__, __FILE__, __LINE__);
    writelogs(date('m-d H:i:s') . " " . "Restore to {$localimapdir}", __FUNCTION__, __FILE__, __LINE__);
    writelogs(date('m-d H:i:s') . " " . "reconstruct path {$reconstruct}", __FUNCTION__, __FILE__, __LINE__);
    writelogs(date('m-d H:i:s') . " " . "{$cmd}", __FUNCTION__, __FILE__, __LINE__);
    exec($cmd, $rsynclogs);
    $i = 0;
    while (list($num, $line) = each($rsynclogs)) {
        if (preg_match("#Number of files transferred:\\s+([0-9]+)#", $line, $re)) {
            $GLOBALS["events"][] = "Files restored: {$re[1]}";
        }
        if (preg_match("#Total transferred file size:\\s+([0-9]+)#", $line, $re)) {
            $bytes = $re[1];
            $re[1] = round($re[1] / 1024 / 1000) . "M";
            $GLOBALS["events"][] = "{$re[1]} size restored ({$bytes} bytes)";
        }
        if (preg_match("#Permission denied#", $line)) {
            $i = $i + 1;
        }
    }
    $GLOBALS["events"][] = "{$i} file(s) on error";
    shell_exec("{$chown} -R cyrus:mail {$localuserfs}");
    shell_exec("/bin/chmod -R 755 {$localuserfs}");
    $cmd = "{$sudo} -u cyrus {$reconstruct} -r -f user/{$uid} 2>&1";
    writelogs(date('m-d H:i:s') . " " . "{$cmd}", __FUNCTION__, __FILE__, __LINE__);
    exec($cmd, $rsynclogs);
    $GLOBALS["events"][] = "Reconstruct information: ";
    while (list($num, $line) = each($rsynclogs)) {
        $GLOBALS["events"][] = "reconstructed path: {$line}";
    }
    writelogs(date('m-d H:i:s') . " " . "restarting imap service", __FUNCTION__, __FILE__, __LINE__);
    system("/etc/init.d/cyrus-imapd restart");
    print_r($GLOBALS["events"]);
}