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"]); }