function sync($id, $nopid = false) { $unix = new unix(); $users = new usersMenus(); system_admin_events("Mail synchronization: Running task {$id}", __FUNCTION__, __FILE__, __LINE__); $GLOBALS["unique_id"] = $id; $ASOfflineImap = false; $sql = "SELECT * FROM imapsync WHERE ID='{$id}'"; $q = new mysql(); $took1 = time(); $ligne = @mysql_fetch_array($q->QUERY_SQL($sql, "artica_backup")); if (!$q->ok) { system_admin_events("Mysql error {$q->mysql_error}", __FUNCTION__, __FILE__, __LINE__); die; } $pid = $ligne["pid"]; if (!$nopid) { if ($unix->process_exists($pid)) { return; } } update_pid(getmypid()); if (!is_file($unix->find_program("imapsync"))) { if (!is_file($unix->find_program("offlineimap"))) { update_status(-1, "Could not find imapsync/offlineimap program"); return; } } update_status(1, "Executed"); include_once dirname(__FILE__) . '/ressources/class.user.inc'; $ct = new user($ligne["uid"]); $parameters = unserialize(base64_decode($ligne["parameters"])); $parameters["sep"] = trim($parameters["sep"]); $parameters["sep2"] = trim($parameters["sep2"]); $parameters["maxage"] = trim($parameters["maxage"]); if ($parameters["maxage"] == null) { $parameters["maxage"] = 0; } if ($parameters["UseOfflineImap"] == 1) { $ASOfflineImap = true; } $offlineImapConf[] = "[general]"; $offlineImapConf[] = "metadata = /var/lib/offlineimap/{$ligne["uid"]}"; if ($ASOfflineImap) { @mkdir("/var/lib/offlineimap/{$ligne["uid"]}", null, true); } $offlineImapConf[] = "accounts = Myaccount"; $offlineImapConf[] = "maxsyncaccounts = 1"; $offlineImapConf[] = "ui =Noninteractive.Basic, Noninteractive.Quiet"; $offlineImapConf[] = "ignore-readonly = no"; $offlineImapConf[] = "socktimeout = 60"; $offlineImapConf[] = "fsync = true"; $offlineImapConf[] = ""; $offlineImapConf[] = "[ui.Curses.Blinkenlights]"; $offlineImapConf[] = "statuschar = ."; $offlineImapConf[] = ""; $offlineImapConf[] = "[Account Myaccount]"; $offlineImapConf[] = "localrepository = TargetServer"; $offlineImapConf[] = "remoterepository = SourceServer"; $offlineImapConf[] = "# autorefresh = 5"; $offlineImapConf[] = "# quick = 10"; $offlineImapConf[] = "# presynchook = imapfilter"; $offlineImapConf[] = "# postsynchook = notifysync.sh"; $offlineImapConf[] = "# presynchook = imapfilter -c someotherconfig.lua"; $offlineImapConf[] = "# maxsize = 2000000"; if ($parameters["maxage"] > 0) { $offlineImapConf[] = "maxage = {$parameters["maxage"]}"; } $array_folders = unserialize(base64_decode($ligne["folders"])); if ($users->cyrus_imapd_installed) { $local_mailbox = true; } if ($users->ZARAFA_INSTALLED) { $local_mailbox = true; } if ($local_mailbox) { if ($parameters["local_mailbox"] == null) { $parameters["local_mailbox"] = 1; } if ($parameters["local_mailbox_source"] == null) { $parameters["local_mailbox_source"] = 1; } } else { $parameters["local_mailbox"] = 0; $parameters["local_mailbox_source"] = 0; } if ($parameters["dest_imap_server"] == null) { if ($parameters["local_mailbox"] == 1) { $parameters["dest_imap_server"] = "127.0.0.1"; } } if (!$local_mailbox) { if ($parameters["remote_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "unable to get SOURCE imap server\n"; } update_status(-1, "unable to get SOURCE imap server"); return; } if ($parameters["dest_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "Cyrus: {$user->cyrus_imapd_installed}; Zarafa:{$user->ZARAFA_INSTALLED}\n"; } if ($GLOBALS["VERBOSE"]) { echo "unable to get DESTINATION imap server Local server:{$local_mailbox}; Parms:local_mailbox={$parameters["local_mailbox"]}\n"; } update_status(-1, "unable to get DESTINATION imap server"); return; } } if ($parameters["local_mailbox_source"] == 0) { if ($parameters["remote_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "unable to get SOURCE imap server\n"; } update_status(-1, "unable to get SOURCE imap server"); return; } } if ($parameters["local_mailbox"] == 0) { if ($parameters["dest_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "unable to get DESTINATION imap server\n"; } update_status(-1, "unable to get destination DESTINATION server"); return; } } if ($parameters["local_mailbox"] == 1) { if ($parameters["local_mailbox_source"] == 1) { if ($GLOBALS["VERBOSE"]) { echo "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox\n"; } update_status(-1, "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox"); return; } } if ($parameters["local_mailbox"] == 1) { $host2 = "127.0.0.1"; $user2 = $ct->uid; $password2 = $ct->password; $md52 = md5("{$host2}{$user2}{$password2}"); } else { $host2 = $parameters["dest_imap_server"]; $user2 = $parameters["dest_imap_username"]; $password2 = $parameters["dest_imap_password"]; $md52 = md5("{$host2}{$user2}{$password2}"); } if ($parameters["local_mailbox_source"] == 1) { $host1 = "127.0.0.1"; $user1 = $ct->uid; $password1 = $ct->password; $md51 = md5("{$host1}{$user1}{$password1}"); } else { $host1 = $ligne["imap_server"]; $user1 = $ligne["username"]; $password1 = $ligne["password"]; $md51 = md5("{$host1}{$user1}{$password1}"); } if ($md51 == $md52) { if ($GLOBALS["VERBOSE"]) { echo "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox\n"; } update_status(-1, "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox"); return; } $offlineImapUseSSL1 = "no"; $offlineImapUseSSL1port = "143"; $offlineImapUseSSL2 = "no"; $offlineImapUseSSL2port = "143"; $expunge1 = "no"; if ($parameters["use_ssl"] == 1) { $ssl1 = " --ssl1"; $offlineImapUseSSL1 = "yes"; $offlineImapUseSSL1port = "993"; } if ($parameters["dest_use_ssl"] == 1) { $ssl2 = " --ssl2"; $offlineImapUseSSL2 = "yes"; $offlineImapUseSSL2port = "993"; } if ($parameters["syncinternaldates"] == null) { $parameters["syncinternaldates"] = 1; } if ($parameters["noauthmd5"] == null) { $parameters["noauthmd5"] = 1; } if ($parameters["allowsizemismatch"] == null) { $parameters["allowsizemismatch"] = 1; } if ($parameters["nosyncacls"] == null) { $parameters["nosyncacls"] = 1; } if ($parameters["skipsize"] == null) { $parameters["skipsize"] = 0; } if ($parameters["nofoldersizes"] == null) { $parameters["nofoldersizes"] = 1; } if ($parameters["useSep1"] == null) { $parameters["useSep1"] = 0; } if ($parameters["useSep2"] == null) { $parameters["useSep2"] = 0; } if ($parameters["usePrefix1"] == null) { $parameters["usePrefix1"] = 0; } if ($parameters["usePrefix2"] == null) { $parameters["usePrefix2"] = 0; } if ($parameters["delete_messages"] == 1) { $delete = " --delete --expunge1"; $expunge1 = "yes"; } if ($parameters["syncinternaldates"] == 1) { $syncinternaldates = " --syncinternaldate"; } if ($parameters["noauthmd5"] == 1) { $noauthmd5 = " --noauthmd5"; } if ($parameters["allowsizemismatch"] == 1) { $allowsizemismatch = " --allowsizemismatch"; } if ($parameters["nosyncacls"] == 1) { $nosyncacls = " --nosyncacls"; } if ($parameters["skipsize"] == 1) { $skipsize = " --skipsize"; } if ($parameters["nofoldersizes"] == 1) { $nofoldersizes = " --nofoldersizes"; } if ($parameters["useSep1"] == 1) { $sep = " --sep1 \"{$parameters["sep"]}\""; } if ($parameters["useSep2"] == 1) { $sep2 = " --sep2 \"{$parameters["sep2"]}\""; } if ($parameters["usePrefix1"] == 1) { $prefix1 = " --prefix1 \"{$parameters["prefix1"]}\""; } if ($parameters["usePrefix2"] == 1) { $prefix2 = " --prefix2 \"{$parameters["prefix2"]}\""; } if ($parameters["maxage"] > 0) { $maxage = " --maxage {$parameters["maxage"]}"; } if (count($array_folders["FOLDERS"]) > 0) { while (list($num, $folder) = each($array_folders["FOLDERS"])) { if (trim($folder) == null) { continue; } $cleaned[trim($folder)] = trim($folder); } while (list($num, $folder) = each($cleaned)) { $foldersr[] = $folder; $offlineImapFolders[] = "'{$folder}'"; } $folders_replicate = @implode(" --folder ", $foldersr); } $offlineImapConf[] = ""; $offlineImapConf[] = "[Repository SourceServer]"; $offlineImapConf[] = "type = IMAP"; $offlineImapConf[] = "remotehost = {$host1}"; $offlineImapConf[] = "ssl = {$offlineImapUseSSL1}"; $offlineImapConf[] = "remoteport = {$offlineImapUseSSL1port}"; $offlineImapConf[] = "remoteuser = {$user1}"; $offlineImapConf[] = "remotepass = {$password1}"; $offlineImapConf[] = "# reference = Mail"; $offlineImapConf[] = "maxconnections = 1"; $offlineImapConf[] = "holdconnectionopen = no"; $offlineImapConf[] = "# keepalive = 60"; $offlineImapConf[] = "expunge = {$expunge1}"; $offlineImapConf[] = "subscribedonly = no"; if ($parameters["useSep1"] == 1) { $offlineImapConf[] = "sep = {$parameters["sep"]}"; } $offlineImapConf[] = "nametrans = lambda foldername: re.sub('^INBOX\\.*', '.', foldername)"; if (count($offlineImapFolders) > 0) { $offlineImapConf[] = "folderincludes = [" . @implode(",", $offlineImapFolders) . "]"; } $offlineImapConf[] = ""; $offlineImapConf[] = "[Repository TargetServer]"; $offlineImapConf[] = "type = IMAP"; $offlineImapConf[] = "remotehost = {$host2}"; $offlineImapConf[] = "ssl = {$offlineImapUseSSL2}"; $offlineImapConf[] = "remoteport = {$offlineImapUseSSL2port}"; $offlineImapConf[] = "remoteuser = {$user2}"; $offlineImapConf[] = "remotepass = {$password2}"; $offlineImapConf[] = "# reference = Mail"; $offlineImapConf[] = "maxconnections = 1"; $offlineImapConf[] = "holdconnectionopen = no"; $offlineImapConf[] = "# keepalive = 60"; $offlineImapConf[] = "expunge = no"; $offlineImapConf[] = "subscribedonly = no"; if ($parameters["useSep2"] == 1) { $offlineImapConf[] = "sep = {$parameters["sep2"]}"; } $offlineImapConf[] = "nametrans = lambda foldername: re.sub('^INBOX\\.*', '.', foldername)"; if (count($offlineImapFolders) > 0) { $offlineImapConf[] = "folderincludes = [" . @implode(",", $offlineImapFolders) . "]"; } $file_temp = "/usr/share/artica-postfix/ressources/logs/imapsync.{$id}.logs"; $imapsyncbin = $unix->find_program("imapsync"); $offlineimap = $unix->find_program("offlineimap"); $cmd = "{$imapsyncbin} --buffersize 8192000{$nosyncacls} --subscribe{$syncinternaldates}"; $cmd = $cmd . " --host1 {$host1} --user1 \"{$user1}\" --password1 \"{$password1}\"{$ssl1}{$prefix1}{$sep} --host2 {$host2} --user2 \"{$user2}\""; $cmd = $cmd . " --password2 \"{$password2}\"{$ssl2}{$prefix2}{$sep2}{$folders_replicate}{$delete}{$noauthmd5}{$allowsizemismatch}{$skipsize}{$nofoldersizes}{$maxage} >{$file_temp} 2>&1"; if ($ASOfflineImap) { if (is_file($file_temp)) { @unlink($file_temp); } if (!is_file($offlineimap)) { update_status(-1, "Could not find offlineimap program"); return; } $cmd = "{$offlineimap} -o -u Noninteractive.Basic -c /tmp/offlineimap-{$ligne["uid"]} -l {$file_temp}"; @file_put_contents("/tmp/offlineimap-{$ligne["uid"]}", @implode("\n", $offlineImapConf)); if ($GLOBALS["VERBOSE"]) { $cmd_show = $cmd . "\n"; $datas = @implode("\n", $offlineImapConf); $datas = str_replace("remotepass = {$password2}", "remotepass = MASKED", $datas); $datas = str_replace("remotepass = {$password1}", "remotepass = MASKED", $datas); echo "{$cmd_show}\nConfiguration file:\n---------------------------\n\n{$datas}"; return; } } else { if (!is_file($imapsyncbin)) { update_status(-1, "Could not find imapsunc program"); return; } } if ($GLOBALS["VERBOSE"]) { $cmd_show = $cmd; $cmd_show = str_replace("--password1 {$password1}", "--password1 MASKED", $cmd_show); $cmd_show = str_replace("--password2 {$password2}", "--password2 MASKED", $cmd_show); echo "{$cmd_show}\n"; return; } shell_exec($cmd); update_status(0, addslashes(@file_get_contents($file_temp))); $took = $unix->distanceOfTimeInWords($took1, time(), true); system_admin_events("Task id {$id} done took {$took}", __FUNCTION__, __FILE__, __LINE__); }
function sync($id) { $unix = new unix(); $users = new usersMenus(); $GLOBALS["unique_id"] = $id; $sql = "SELECT * FROM imapsync WHERE ID='{$id}'"; $q = new mysql(); $ligne = @mysql_fetch_array($q->QUERY_SQL($sql, "artica_backup")); if (!$q->ok) { write_syslog("Mysql error {$q->mysql_error}", __FILE__); die; } $pid = $ligne["pid"]; if ($unix->process_exists($pid)) { die; } update_pid(getmypid()); if (!is_file($unix->find_program("imapsync"))) { update_status(-1, "Could not find imapsync program"); return; } update_status(1, "Executed"); $ct = new user($ligne["uid"]); $parameters = unserialize(base64_decode($ligne["parameters"])); $parameters["sep"] = trim($parameters["sep"]); $parameters["sep2"] = trim($parameters["sep2"]); $array_folders = unserialize(base64_decode($ligne["folders"])); if ($user->cyrus_imapd_installed) { $local_mailbox = true; } if ($user->ZARAFA_INSTALLED) { $local_mailbox = true; } if ($local_mailbox) { if ($parameters["local_mailbox"] == null) { $parameters["local_mailbox"] = 1; } if ($parameters["local_mailbox_source"] == null) { $parameters["local_mailbox_source"] = 1; } } else { $parameters["local_mailbox"] = 0; $parameters["local_mailbox_source"] = 0; } if (!$local_mailbox) { if ($parameters["remote_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "unable to get SOURCE imap server\n"; } update_status(-1, "unable to get SOURCE imap server"); return; } if ($parameters["dest_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "unable to get DESTINATION imap server\n"; } update_status(-1, "unable to get DESTINATION imap server"); return; } } if ($parameters["local_mailbox_source"] == 0) { if ($parameters["remote_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "unable to get SOURCE imap server\n"; } update_status(-1, "unable to get SOURCE imap server"); return; } } if ($parameters["local_mailbox"] == 0) { if ($parameters["dest_imap_server"] == null) { if ($GLOBALS["VERBOSE"]) { echo "unable to get DESTINATION imap server\n"; } update_status(-1, "unable to get destination DESTINATION server"); return; } } if ($parameters["local_mailbox"] == 1) { if ($parameters["local_mailbox_source"] == 1) { if ($GLOBALS["VERBOSE"]) { echo "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox\n"; } update_status(-1, "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox"); return; } } if ($parameters["local_mailbox"] == 1) { $host2 = "127.0.0.1"; $user2 = $ct->uid; $password2 = $ct->password; $md52 = md5("{$host2}{$user2}{$password2}"); } else { $host2 = $parameters["dest_imap_server"]; $user2 = $parameters["dest_imap_username"]; $password2 = $parameters["dest_imap_password"]; $md52 = md5("{$host2}{$user2}{$password2}"); } if ($parameters["local_mailbox_source"] == 1) { $host1 = "127.0.0.1"; $user1 = $ct->uid; $password1 = $ct->password; $md51 = md5("{$host1}{$user1}{$password1}"); } else { $host1 = $ligne["imap_server"]; $user1 = $ligne["username"]; $password1 = $ligne["password"]; $md51 = md5("{$host1}{$user1}{$password1}"); } if ($md51 == $md52) { if ($GLOBALS["VERBOSE"]) { echo "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox\n"; } update_status(-1, "DESTINATION imap mailbox cannot be the same has SOURCE imap mailbox"); return; } if ($parameters["use_ssl"] == 1) { $ssl1 = " --ssl1"; } if ($parameters["dest_use_ssl"] == 1) { $ssl2 = " --ssl2"; } if ($parameters["syncinternaldates"] == null) { $parameters["syncinternaldates"] = 1; } if ($parameters["noauthmd5"] == null) { $parameters["noauthmd5"] = 1; } if ($parameters["allowsizemismatch"] == null) { $parameters["allowsizemismatch"] = 1; } if ($parameters["nosyncacls"] == null) { $parameters["nosyncacls"] = 1; } if ($parameters["skipsize"] == null) { $parameters["skipsize"] = 0; } if ($parameters["nofoldersizes"] == null) { $parameters["nofoldersizes"] = 1; } if ($parameters["useSep1"] == null) { $parameters["useSep1"] = 0; } if ($parameters["useSep2"] == null) { $parameters["useSep2"] = 0; } if ($parameters["usePrefix1"] == null) { $parameters["usePrefix1"] = 0; } if ($parameters["usePrefix2"] == null) { $parameters["usePrefix2"] = 0; } if (count($array_folders["FOLDERS"]) > 0) { while (list($num, $folder) = each($array_folders["FOLDERS"])) { if (trim($folder) == null) { continue; } $cleaned[trim($folder)] = trim($folder); } while (list($num, $folder) = each($cleaned)) { $foldersr[] = $folder; } $folders_replicate = @implode(" --folder ", $foldersr); } if ($parameters["delete_messages"] == 1) { $delete = " --delete --expunge1"; } if ($parameters["syncinternaldates"] == 1) { $syncinternaldates = " --syncinternaldate"; } if ($parameters["noauthmd5"] == 1) { $noauthmd5 = " --noauthmd5"; } if ($parameters["allowsizemismatch"] == 1) { $allowsizemismatch = " --allowsizemismatch"; } if ($parameters["nosyncacls"] == 1) { $nosyncacls = " --nosyncacls"; } if ($parameters["skipsize"] == 1) { $skipsize = " --skipsize"; } if ($parameters["nofoldersizes"] == 1) { $nofoldersizes = " --nofoldersizes"; } if ($parameters["useSep1"] == 1) { $sep = " --sep1 \"{$parameters["sep"]}\""; } if ($parameters["useSep2"] == 1) { $sep2 = " --sep2 \"{$parameters["sep2"]}\""; } if ($parameters["usePrefix1"] == 1) { $prefix1 = " --prefix1 \"{$parameters["prefix1"]}\""; } if ($parameters["usePrefix2"] == 1) { $prefix2 = " --prefix2 \"{$parameters["prefix2"]}\""; } $file_temp = "/usr/share/artica-postfix/ressources/logs/imapsync.{$id}.logs"; $cmd = $unix->find_program("imapsync") . " --buffersize 8192000{$nosyncacls} --subscribe{$syncinternaldates}"; $cmd = $cmd . " --host1 {$host1} --user1 {$user1} --password1 {$password1}{$ssl1}{$prefix1}{$sep} --host2 {$host2} --user2 {$user2}"; $cmd = $cmd . " --password2 {$password2}{$ssl2}{$prefix2}{$sep2}{$folders_replicate}{$delete}{$noauthmd5}{$allowsizemismatch}{$skipsize}{$nofoldersizes} >{$file_temp} 2>&1"; if ($GLOBALS["VERBOSE"]) { $cmd_show = $cmd; $cmd_show = str_replace("--password1 {$password1}", "--password1 MASKED", $cmd_show); $cmd_show = str_replace("--password2 {$password2}", "--password2 MASKED", $cmd_show); echo "{$cmd_show}\n"; return; } shell_exec($cmd); update_status(0, addslashes(@file_get_contents($file_temp))); }