function nightly() { @mkdir("/var/log/artica-postfix", 0755, true); $GLOBALS["MasterIndexFile"] = "/usr/share/artica-postfix/ressources/index.ini"; $unix = new unix(); $sock = new sockets(); $autoinstall = true; $timefile = "/etc/artica-postfix/croned.1/nightly"; $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . ".pid"; $pid = @file_get_contents($pidfile); $kill = $unix->find_program("kill"); $tmpdir = $unix->TEMP_DIR(); $php5 = $unix->LOCATE_PHP5_BIN(); $nohup = $unix->find_program("nohup"); if ($unix->process_exists($pid, basename(__FILE__))) { $time = $unix->PROCCESS_TIME_MIN($pid); echo "Starting......: " . date("H:i:s") . " nightly build already executed PID: {$pid} since {$time}Mn\n"; system_admin_events("nightly build already executed PID: {$pid} since {$time}Mn", __FUNCTION__, __FILE__, __LINE__, "artica-update"); if ($time < 120) { if (!$GLOBALS["FORCE"]) { die; } } unix_system_kill_force($pid); } $mypid = getmypid(); @file_put_contents($pidfile, $mypid); $EnableScheduleUpdates = $sock->GET_INFO("EnableScheduleUpdates"); if (!is_numeric($EnableScheduleUpdates)) { $EnableScheduleUpdates = 0; } if ($GLOBALS["FORCE"]) { _artica_update_event(1, "Update task pid {$mypid} is forced by an human.", null, __FILE__, __LINE__); } if ($EnableScheduleUpdates == 1) { if (!$GLOBALS["FORCE"]) { if (!$GLOBALS["BYCRON"]) { _artica_update_event(2, "Operation must be only executed by scheduler ( use --force to by pass)", null, __FILE__, __LINE__); @file_put_contents("/usr/share/artica-postfix/download_progress", 100); return; } } } $ini = new iniFrameWork(); $ini->loadFile('/etc/artica-postfix/artica-update.conf'); if (!isset($ini->_params["AUTOUPDATE"]["enabled"])) { $ini->_params["AUTOUPDATE"]["enabled"] = "yes"; } if (trim($ini->_params["AUTOUPDATE"]["enabled"]) == null) { $ini->_params["AUTOUPDATE"]["enabled"] = "yes"; } if ($ini->_params["AUTOUPDATE"]["enabled"] == null) { $ini->_params["AUTOUPDATE"]["enabled"] = "yes"; } if (trim($ini->_params["AUTOUPDATE"]["uri"]) == null) { $ini->_params["AUTOUPDATE"]["uri"] = "http://www.articatech.net/auto.update.php"; } if ($ini->_params["AUTOUPDATE"]["enabled"] == 1) { $ini->_params["AUTOUPDATE"]["enabled"] = 'yes'; } if (!is_numeric(trim($ini->_params["AUTOUPDATE"]["CheckEveryMinutes"]))) { $ini->_params["AUTOUPDATE"]["CheckEveryMinutes"] = 60; } if ($ini->_params["AUTOUPDATE"]["enabled"] != 'yes') { echo "Starting......: " . date("H:i:s") . " Artica Update feature is disabled (enabled = {$ini->_params["AUTOUPDATE"]["enabled"]} )\n"; return; } $CheckEveryMinutes = $ini->_params["AUTOUPDATE"]["CheckEveryMinutes"]; $uri = $ini->_params["AUTOUPDATE"]["uri"]; $arrayURI = parse_url($uri); $MAIN_URI = "{$arrayURI["scheme"]}://{$arrayURI["host"]}"; $MAIN_URI = str_replace("www.artica.fr", "www.articatech.net", $MAIN_URI); if (!$GLOBALS["FORCE"]) { if ($EnableScheduleUpdates == 0) { if ($unix->file_time_min($timefile) < $CheckEveryMinutes) { echo "Starting......: " . date("H:i:s") . " update feature (too short time, require {$CheckEveryMinutes}mn)\n"; @file_put_contents("/usr/share/artica-postfix/download_progress", 100); return; } } } @unlink($timefile); @file_put_contents($timefile, time()); if ($GLOBALS["FORCE"]) { if (is_file("/root/artica-latest.tgz")) { echo "Starting......: " . date("H:i:s") . " Installing old downloaded package\n"; if (install_package("/root/artica-latest.tgz")) { return; } } } // ----------------------- LANCEMENT ------------------------------------------------------------------------------ $EnableArticaMetaClient = intval($sock->GET_INFO("EnableArticaMetaClient")); if ($EnableArticaMetaClient == 1) { echo "Starting......: " . date("H:i:s") . " Nightly builds using Artica Meta console\n"; system("{$nohup} {$php5} /usr/share/artica-postfix/exec.artica-meta-client.php --artica-updates >/dev/null 2>&1 &"); die; } echo "Starting......: " . date("H:i:s") . " Nightly builds checking an official release first\n"; if (update_release()) { return; } $nightly = trim(strtolower($ini->_params["AUTOUPDATE"]["nightlybuild"])); if ($nightly == 1) { $nightly = "yes"; } if ($GLOBALS["FORCE"]) { $nightly = "yes"; } if ($GLOBALS["FORCE_NIGHTLY"]) { $nightly = "yes"; } if ($nightly != 'yes') { echo "Starting......: " . date("H:i:s") . " Nightly builds feature is disabled [{$nightly}]\n"; @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 100); return; } if ($ini->_params["AUTOUPDATE"]["autoinstall"] == 1) { $ini->_params["AUTOUPDATE"]["autoinstall"] = "yes"; } if (trim($ini->_params["AUTOUPDATE"]["autoinstall"]) == null) { $ini->_params["AUTOUPDATE"]["autoinstall"] = "yes"; } if ($ini->_params["AUTOUPDATE"]["autoinstall"] != "yes") { $autoinstall = false; } @file_put_contents("/usr/share/artica-postfix/download_progress", 0); $MyCurrentVersion = GetCurrentVersion(); echo "Starting......: " . date("H:i:s") . " Current version: {$MyCurrentVersion}\n"; $Lastest = trim(strtolower($GLOBALS["lastest-nightly"])); echo "Starting......: " . date("H:i:s") . " Nightly builds version \"{$Lastest}\" on repository\n"; $MyNextVersion = intval(str_replace(".", "", $Lastest)); echo "Starting......: " . date("H:i:s") . " nightly builds Cur:{$MyCurrentVersion}, Next:{$MyNextVersion}\n"; if ($MyNextVersion == $MyCurrentVersion) { echo "Starting......: " . date("H:i:s") . " nightly builds {$MyCurrentVersion}/{$MyNextVersion} \"Up to date - Same version\"\n"; @file_put_contents("/usr/share/artica-postfix/download_progress", 100); return; } if ($MyCurrentVersion > $MyNextVersion) { echo "Starting......: " . date("H:i:s") . " nightly builds {$MyCurrentVersion}/{$MyNextVersion} \"Up to date - Most updated\"\n"; @file_put_contents("/usr/share/artica-postfix/download_progress", 100); return; } $t1 = time(); _artica_update_event(2, "nightly builds Downloading new version {$Lastest}", null, __FILE__, __LINE__); echo "Starting......: " . date("H:i:s") . " nightly builds Downloading new version {$Lastest}, please wait\n"; events("Downloading new version {$Lastest}"); $uri = "{$MAIN_URI}/nightbuilds/artica-{$Lastest}.tgz"; $ArticaFileTemp = "{$tmpdir}/{$Lastest}/artica-{$Lastest}.tgz"; @mkdir("{$tmpdir}/{$Lastest}", 0755, true); $curl = new ccurl($uri); $curl->Timeout = 2400; $curl->WriteProgress = true; $curl->ProgressFunction = "nightly_progress"; $t = time(); if (!$curl->GetFile($ArticaFileTemp)) { _artica_update_event(0, "nightly builds Unable to download latest nightly build with error {$curl->error}", null, __FILE__, __LINE__); events("Unable to download latest nightly build with error {$curl->error}"); system_admin_events("Unable to download latest nightly build with error {$curl->error}", __FUNCTION__, __FILE__, __LINE__, "artica-update"); @unlink($ArticaFileTemp); return; } $took = $unix->distanceOfTimeInWords($t, time(), true); _artica_update_event(2, "artica-{$Lastest}.tgz download, took {$took}", null, __FILE__, __LINE__); system_admin_events("artica-{$Lastest}.tgz download, took {$took}", __FUNCTION__, __FILE__, __LINE__, "artica-update"); events("artica-{$Lastest}.tgz download, took {$took}"); $size = @filesize($ArticaFileTemp); $size = FormatBytes($size / 1024, true); ArticaMeta_nightly($ArticaFileTemp); echo "Starting......: " . date("H:i:s") . " nightly builds took {$took}\n"; if (!$GLOBALS["FORCE"]) { if ($autoinstall == false) { _artica_update_event(2, "artica-latest.tgz will be stored in /root", null, __FILE__, __LINE__); @copy("{$ArticaFileTemp}", "/root/artica-latest.tgz"); @unlink($ArticaFileTemp); _artica_update_event(1, "Nightly builds New Artica update v.{$Lastest} ({$size}) waiting order", null, __FILE__, __LINE__); system_admin_events("New Artica update v.{$Lastest} waiting your order", __FUNCTION__, __FILE__, __LINE__, "artica-update"); return; } else { } } events("Now, installing the newest version in {$ArticaFileTemp} package..."); $size = @filesize($ArticaFileTemp); $size = FormatBytes($size / 1024, true); if (!install_package($ArticaFileTemp, $Lastest)) { events("Install package Failed..."); return false; } events("New Artica update v.{$Lastest}"); _artica_update_event(1, "Nightly builds New Artica update v.{$Lastest} ({$size})", null, __FILE__, __LINE__); system_admin_events("New Artica update v.{$Lastest}", __FUNCTION__, __FILE__, __LINE__, "artica-update"); }
function nightly() { @mkdir("/var/log/artica-postfix", 0755, true); $GLOBALS["MasterIndexFile"] = "/usr/share/artica-postfix/ressources/index.ini"; $unix = new unix(); $sock = new sockets(); $autoinstall = true; $timefile = "/etc/artica-postfix/croned.1/nightly"; $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . ".pid"; $pid = @file_get_contents($pidfile); $kill = $unix->find_program("kill"); $tmpdir = $unix->TEMP_DIR(); $php5 = $unix->LOCATE_PHP5_BIN(); $nohup = $unix->find_program("nohup"); if ($unix->process_exists($pid, basename(__FILE__))) { $time = $unix->PROCCESS_TIME_MIN($pid); echo "Starting......: " . date("H:i:s") . " nightly build already executed PID: {$pid} since {$time}Mn\n"; updater_events("Already executed PID: {$pid} since {$time}Mn"); if ($time < 120) { if (!$GLOBALS["FORCE"]) { die; } } unix_system_kill_force($pid); } $mypid = getmypid(); @file_put_contents($pidfile, $mypid); updater_events("Running PID {$mypid}"); $EnableScheduleUpdates = $sock->GET_INFO("EnableScheduleUpdates"); $ArticaUpdateIntervalAllways = intval($sock->GET_INFO("EnableScheduleUpdates")); if (!is_numeric($EnableScheduleUpdates)) { $EnableScheduleUpdates = 0; } $ArticaAutoUpateOfficial = $sock->GET_INFO("ArticaAutoUpateOfficial"); $ArticaAutoUpateNightly = intval($sock->GET_INFO("ArticaAutoUpateNightly")); $ArticaUpdateIntervalAllways = intval($sock->GET_INFO("ArticaUpdateIntervalAllways")); $OfficialArticaUri = $sock->GET_INFO("OfficialArticaUri"); if (!is_numeric($ArticaAutoUpateOfficial)) { $ArticaAutoUpateOfficial = 1; } if ($OfficialArticaUri == null) { $OfficialArticaUri = "http://articatech.net"; } $CheckEveryMinutes = 60; $uri = $OfficialArticaUri; if ($GLOBALS["FORCE"]) { _artica_update_event(1, "Update task pid {$mypid} is forced by an human.", null, __FILE__, __LINE__); } if ($EnableScheduleUpdates == 1) { if (!$GLOBALS["FORCE"]) { if (!$GLOBALS["BYCRON"]) { updater_events("Operation must be only executed by scheduler"); _artica_update_event(2, "Operation must be only executed by scheduler ( use --force to by pass)", null, __FILE__, __LINE__); @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 100); return; } } } if ($ArticaAutoUpateOfficial == 0) { updater_events("Artica Update feature is disabled"); echo "Starting......: " . date("H:i:s") . " Artica Update feature is disabled (enabled = {$ArticaAutoUpateOfficial}} )\n"; return; } if (!$GLOBALS["FORCE"]) { if ($EnableScheduleUpdates == 0) { if ($unix->file_time_min($timefile) < $CheckEveryMinutes) { updater_events("too short time ({$timefile}Mn, require {$CheckEveryMinutes}mn)"); echo "Starting......: " . date("H:i:s") . " update feature (too short time, require {$CheckEveryMinutes}mn)\n"; @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 110); return; } } if ($ArticaUpdateIntervalAllways == 0) { if ($unix->IsProductionTime()) { updater_events("Update feature need to be run only during the non-production time"); echo "Starting......: " . date("H:i:s") . " update feature need to be run only during the non-production time \n"; @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 110); } } } @unlink($timefile); @file_put_contents($timefile, time()); // ----------------------- LANCEMENT ------------------------------------------------------------------------------ $EnableArticaMetaClient = intval($sock->GET_INFO("EnableArticaMetaClient")); if ($EnableArticaMetaClient == 1) { updater_events("Nightly builds using Meta console"); echo "Starting......: " . date("H:i:s") . " Nightly builds using Meta console\n"; system("{$nohup} {$php5} /usr/share/artica-postfix/exec.artica-meta-client.php --artica-updates >/dev/null 2>&1 &"); die; } echo "Starting......: " . date("H:i:s") . " Nightly builds checking an official release first\n"; if (update_release()) { updater_events("update_release() return true, finish"); return; } if ($ArticaAutoUpateNightly == 0) { echo "Starting......: " . date("H:i:s") . " Nightly builds feature is disabled\n"; updater_events("Update to Nightly builds feature is disabled"); @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 100); return; } @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 0); $array = unserialize(@file_get_contents("/etc/artica-postfix/settings/Daemons/ArticaUpdateRepos")); $OFFICIALS = $array["NIGHT"]; $key = update_find_latest_nightly(); $MyNextVersion = $key; $Lastest = $OFFICIALS[$key]["VERSION"]; $MAIN_URI = $OFFICIALS[$key]["URL"]; $MAIN_MD5 = $OFFICIALS[$key]["MD5"]; $MAIN_FILENAME = $OFFICIALS[$key]["FILENAME"]; $uri = $MAIN_URI; $Lastest = trim(strtolower($Lastest)); $MyCurrentVersion = GetCurrentVersion(); echo "Starting......: " . date("H:i:s") . " Current version: {$MyCurrentVersion}\n"; echo "Starting......: " . date("H:i:s") . " Nightly builds version \"{$Lastest}\" on repository\n"; echo "Starting......: " . date("H:i:s") . " nightly builds Cur:{$MyCurrentVersion}, Next:{$MyNextVersion}\n"; if ($MyNextVersion == $MyCurrentVersion) { echo "Starting......: " . date("H:i:s") . " nightly builds {$MyCurrentVersion}/{$MyNextVersion} \"Up to date - Same version\"\n"; @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 100); return; } if ($MyCurrentVersion > $MyNextVersion) { echo "Starting......: " . date("H:i:s") . " nightly builds {$MyCurrentVersion}/{$MyNextVersion} \"Up to date - Most updated\"\n"; @file_put_contents("/usr/share/artica-postfix/ressources/logs/web/download_progress", 100); return; } $t1 = time(); _artica_update_event(2, "nightly builds Downloading new version {$Lastest}", null, __FILE__, __LINE__); echo "Starting......: " . date("H:i:s") . " nightly builds Downloading new version {$Lastest}, please wait\n"; events("Downloading new version {$Lastest}"); $ArticaFileTemp = "{$tmpdir}/{$Lastest}/artica-{$Lastest}.tgz"; @mkdir("{$tmpdir}/{$Lastest}", 0755, true); $curl = new ccurl($uri); $curl->Timeout = 2400; $curl->WriteProgress = true; $curl->ProgressFunction = "nightly_progress"; $t = time(); if (!$curl->GetFile($ArticaFileTemp)) { _artica_update_event(0, "nightly builds Unable to download latest nightly build {$Lastest} with error {$curl->error}", null, __FILE__, __LINE__); events("Unable to download latest nightly build with error {$curl->error}"); system_admin_events("Unable to download latest nightly build with error {$curl->error}", __FUNCTION__, __FILE__, __LINE__, "artica-update"); @unlink($ArticaFileTemp); return; } $took = $unix->distanceOfTimeInWords($t, time(), true); _artica_update_event(2, "{$MAIN_FILENAME} download, took {$took}", null, __FILE__, __LINE__); $md5_file = md5_file($ArticaFileTemp); if ($md5_file != $MAIN_MD5) { echo "{$md5_file} <> {$MAIN_MD5}\n"; _artica_update_event(0, "nightly builds {$MAIN_FILENAME}: corrupted package", null, __FILE__, __LINE__); events("nightly builds {$MAIN_FILENAME}: corrupted package"); system_admin_events("nightly builds {$MAIN_FILENAME}: corrupted package", __FUNCTION__, __FILE__, __LINE__, "artica-update"); @unlink($ArticaFileTemp); return; } system_admin_events("{$MAIN_FILENAME} download, took {$took}", __FUNCTION__, __FILE__, __LINE__, "artica-update"); events("artica-{$Lastest}.tgz download, took {$took}"); $size = @filesize($ArticaFileTemp); $size = FormatBytes($size / 1024, true); ArticaMeta_nightly($ArticaFileTemp); echo "Starting......: " . date("H:i:s") . " nightly builds took {$took}\n"; events("Now, installing the newest version in {$ArticaFileTemp} package..."); $size = @filesize($ArticaFileTemp); $size = FormatBytes($size / 1024, true); if (!install_package($ArticaFileTemp, $Lastest)) { events("Install package Failed..."); return false; } events("New Artica update v.{$Lastest}"); _artica_update_event(1, "Nightly builds New Artica update v.{$Lastest} ({$size})", null, __FILE__, __LINE__); system_admin_events("New Artica update v.{$Lastest}", __FUNCTION__, __FILE__, __LINE__, "artica-update"); }