diff --git a/airtime_mvc/application/controllers/UpgradeController.php b/airtime_mvc/application/controllers/UpgradeController.php index 2df3636ff..30067ece7 100644 --- a/airtime_mvc/application/controllers/UpgradeController.php +++ b/airtime_mvc/application/controllers/UpgradeController.php @@ -1,71 +1,51 @@ view->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender(true); if (!$this->verifyAuth()) { return; } + + $upgraders = array(); + array_push($upgraders, new AirtimeUpgrader253()); + array_push($upgraders, new AirtimeUpgrader254()); - if (!$this->verifyAirtimeVersion()) { - return; - } - - $con = Propel::getConnection(); - $con->beginTransaction(); - try { - //Disable Airtime UI - //create a temporary maintenance notification file - //when this file is on the server, zend framework redirects all - //requests to the maintenance page and sets a 503 response code - - $maintenanceFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."maintenance.txt" : "/tmp/maintenance.txt"; - $file = fopen($maintenanceFile, 'w'); - fclose($file); - - //Begin upgrade + $didWePerformAnUpgrade = false; + try + { + for ($i = 0; $i < count($upgraders); $i++) + { + $upgrader = $upgraders[$i]; + if ($upgrader->checkIfUpgradeSupported()) + { + $upgrader->upgrade(); //This will throw an exception if the upgrade fails. + $didWePerformAnUpgrade = true; + $this->getResponse() + ->setHttpResponseCode(200) + ->appendBody("Upgrade to Airtime " . $upgrader->getNewVersion() . " OK
"); + $i = 0; //Start over, in case the upgrade handlers are not in ascending order. + } + } - //Update disk_usage value in cc_pref - $storDir = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."srv/airtime/stor" : "/srv/airtime/stor"; - $diskUsage = shell_exec("du -sb $storDir | awk '{print $1}'"); - - Application_Model_Preference::setDiskUsage($diskUsage); - - //TODO: clear out the cache - - $con->commit(); - - //update system_version in cc_pref and change some columns in cc_files - $airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; - $values = parse_ini_file($airtimeConf, true); - - $username = $values['database']['dbuser']; - $password = $values['database']['dbpass']; - $host = $values['database']['host']; - $database = $values['database']['dbname']; - $dir = __DIR__; - - passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); - - //delete maintenance.txt to give users access back to Airtime - unlink($maintenanceFile); - - $this->getResponse() + if (!$didWePerformAnUpgrade) + { + $this->getResponse() ->setHttpResponseCode(200) - ->appendBody("Upgrade to Airtime 2.5.3 OK"); - - } catch(Exception $e) { - $con->rollback(); - unlink($maintenanceFile); + ->appendBody("No upgrade was performed. The current Airtime version is " . AirtimeUpgrader::getCurrentVersion() . ".
"); + } + } + catch (Exception $e) + { $this->getResponse() - ->setHttpResponseCode(400) - ->appendBody($e->getMessage()); + ->setHttpResponseCode(400) + ->appendBody($e->getMessage()); } } @@ -86,25 +66,10 @@ class UpgradeController extends Zend_Controller_Action { $this->getResponse() ->setHttpResponseCode(401) - ->appendBody("Error: Incorrect API key."); + ->appendBody("Error: Incorrect API key.
"); return false; } return true; } - private function verifyAirtimeVersion() - { - $pref = CcPrefQuery::create() - ->filterByKeystr('system_version') - ->findOne(); - $airtime_version = $pref->getValStr(); - - if (!in_array($airtime_version, array('2.5.1', '2.5.2'))) { - $this->getResponse() - ->setHttpResponseCode(400) - ->appendBody("Upgrade to Airtime 2.5.3 FAILED. You must be using Airtime 2.5.1 or 2.5.2 to upgrade."); - return false; - } - return true; - } } diff --git a/airtime_mvc/application/models/Cache.php b/airtime_mvc/application/models/Cache.php index 033b55bf1..0f06b786e 100644 --- a/airtime_mvc/application/models/Cache.php +++ b/airtime_mvc/application/models/Cache.php @@ -15,6 +15,7 @@ class Cache $cacheKey = "{$key}{$a}"; } +<<<<<<< HEAD return $cacheKey; } @@ -36,3 +37,26 @@ class Cache return false; } } +======= + return $cacheKey; + } + + public function store($key, $value, $isUserValue, $userId = null) { + + $cacheKey = self::createCacheKey($key, $userId); + return apc_store($cacheKey, $value); + } + + public function fetch($key, $isUserValue, $userId = null) { + + $cacheKey = self::createCacheKey($key, $isUserValue, $userId); + return apc_fetch($cacheKey); + } + + public static function clear() + { + apc_clear_cache('user'); + apc_clear_cache(); + } +} +>>>>>>> cc-5709-airtime-analyzer-buy-now diff --git a/airtime_mvc/application/upgrade/Upgrades.php b/airtime_mvc/application/upgrade/Upgrades.php new file mode 100644 index 000000000..b427a6297 --- /dev/null +++ b/airtime_mvc/application/upgrade/Upgrades.php @@ -0,0 +1,197 @@ +filterByKeystr('system_version') + ->findOne(); + $airtime_version = $pref->getValStr(); + return $airtime_version; + } + + /** + * This function checks to see if this class can perform an upgrade of your version of Airtime + * @return boolean True if we can upgrade your version of Airtime. + */ + public function checkIfUpgradeSupported() + { + if (!in_array(AirtimeUpgrader::getCurrentVersion(), $this->getSupportedVersions())) { + return false; + } + return true; + } + + protected function toggleMaintenanceScreen($toggle) + { + if ($toggle) + { + //Disable Airtime UI + //create a temporary maintenance notification file + //when this file is on the server, zend framework redirects all + //requests to the maintenance page and sets a 503 response code + $this->maintenanceFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."maintenance.txt" : "/tmp/maintenance.txt"; + $file = fopen($this->maintenanceFile, 'w'); + fclose($file); + } else { + //delete maintenance.txt to give users access back to Airtime + if ($this->maintenanceFile) { + unlink($this->maintenanceFile); + } + } + } + + /** Implement this for each new version of Airtime */ + abstract public function upgrade(); +} + +class AirtimeUpgrader253 extends AirtimeUpgrader +{ + protected function getSupportedVersions() + { + return array('2.5.1', '2.5.2'); + } + public function getNewVersion() + { + return '2.5.3'; + } + + public function upgrade() + { + Cache::clear(); + assert($this->checkIfUpgradeSupported()); + + $con = Propel::getConnection(); + $con->beginTransaction(); + try { + + $this->toggleMaintenanceScreen(true); + Cache::clear(); + + //Begin upgrade + + //Update disk_usage value in cc_pref + $musicDir = CcMusicDirsQuery::create() + ->filterByType('stor') + ->filterByExists(true) + ->findOne(); + $storPath = $musicDir->getDirectory(); + + //Update disk_usage value in cc_pref + $storDir = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."srv/airtime/stor" : "/srv/airtime/stor"; + $diskUsage = shell_exec("du -sb $storDir | awk '{print $1}'"); + + Application_Model_Preference::setDiskUsage($diskUsage); + + //clear out the cache + Cache::clear(); + + $con->commit(); + + //update system_version in cc_pref and change some columns in cc_files + $airtimeConf = isset($_SERVER['AIRTIME_CONF']) ? $_SERVER['AIRTIME_CONF'] : "/etc/airtime/airtime.conf"; + $values = parse_ini_file($airtimeConf, true); + + $username = $values['database']['dbuser']; + $password = $values['database']['dbpass']; + $host = $values['database']['host']; + $database = $values['database']['dbname']; + $dir = __DIR__; + + passthru("export PGPASSWORD=$password && psql -h $host -U $username -q -f $dir/upgrade_sql/airtime_$airtime_upgrade_version/upgrade.sql $database 2>&1 | grep -v \"will create implicit index\""); + + Application_Model_Preference::SetAirtimeVersion($this->getNewVersion()); + //clear out the cache + Cache::clear(); + + $this->toggleMaintenanceScreen(false); + + } catch (Exception $e) { + $con->rollback(); + $this->toggleMaintenanceScreen(false); + } + } +} + +class AirtimeUpgrader254 extends AirtimeUpgrader +{ + protected function getSupportedVersions() + { + return array('2.5.3'); + } + public function getNewVersion() + { + return '2.5.4'; + } + + public function upgrade() + { + Cache::clear(); + + assert($this->checkIfUpgradeSupported()); + + $newVersion = $this->getNewVersion(); + + $con = Propel::getConnection(); + //$con->beginTransaction(); + try { + $this->toggleMaintenanceScreen(true); + Cache::clear(); + + //Begin upgrade + + //First, ensure there are no superadmins already. + $numberOfSuperAdmins = CcSubjsQuery::create() + ->filterByDbType(UTYPE_SUPERADMIN) + ->count(); + + //Only create a super admin if there isn't one already. + if ($numberOfSuperAdmins == 0) + { + //Find the "admin" user and promote them to superadmin. + $adminUser = CcSubjsQuery::create() + ->filterByDbLogin('admin') + ->findOne(); + if (!$adminUser) + { + //TODO: Otherwise get the user with the lowest ID that is of type administrator: + // + $adminUser = CcSubjsQuery::create() + ->filterByDbType(UTYPE_ADMIN) + ->orderByDbId(Criteria::ASC) + ->findOne(); + + if (!$adminUser) { + throw new Exception("Failed to find any users of type 'admin' ('A')."); + } + } + + $adminUser = new Application_Model_User($adminUser->getDbId()); + $adminUser->setType(UTYPE_SUPERADMIN); + $adminUser->save(); + Logging::info($_SERVER['HTTP_HOST'] . ': ' . $newVersion . " Upgrade: Promoted user " . $adminUser->getLogin() . " to be a Super Admin."); + } + + //$con->commit(); + Application_Model_Preference::SetAirtimeVersion($newVersion); + Cache::clear(); + + $this->toggleMaintenanceScreen(false); + + return true; + + } catch(Exception $e) { + //$con->rollback(); + $this->toggleMaintenanceScreen(false); + throw $e; + } + } +} \ No newline at end of file diff --git a/airtime_mvc/public/index.php b/airtime_mvc/public/index.php index 3d53b9e22..38f607f33 100644 --- a/airtime_mvc/public/index.php +++ b/airtime_mvc/public/index.php @@ -43,6 +43,10 @@ if (file_exists('/usr/share/php/libzend-framework-php')) { set_include_path('/usr/share/php/libzend-framework-php' . PATH_SEPARATOR . get_include_path()); } +//Upgrade directory +set_include_path(APPLICATION_PATH . '/upgrade/' . PATH_SEPARATOR . get_include_path()); + + /** Zend_Application */ require_once 'Zend/Application.php'; $application = new Zend_Application(