Merge branch 'cc-5709-airtime-analyzer-buy-now' into cc-5709-airtime-analyzer-buy-now-saas
Conflicts: airtime_mvc/application/controllers/UpgradeController.php airtime_mvc/application/models/Cache.php
This commit is contained in:
commit
2794ca1355
|
@ -1,71 +1,51 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
require_once("Upgrades.php");
|
||||||
|
|
||||||
class UpgradeController extends Zend_Controller_Action
|
class UpgradeController extends Zend_Controller_Action
|
||||||
{
|
{
|
||||||
public function indexAction()
|
public function indexAction()
|
||||||
{
|
{
|
||||||
$airtime_upgrade_version = '2.5.3';
|
|
||||||
|
|
||||||
$this->view->layout()->disableLayout();
|
$this->view->layout()->disableLayout();
|
||||||
$this->_helper->viewRenderer->setNoRender(true);
|
$this->_helper->viewRenderer->setNoRender(true);
|
||||||
|
|
||||||
if (!$this->verifyAuth()) {
|
if (!$this->verifyAuth()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$upgraders = array();
|
||||||
|
array_push($upgraders, new AirtimeUpgrader253());
|
||||||
|
array_push($upgraders, new AirtimeUpgrader254());
|
||||||
|
|
||||||
if (!$this->verifyAirtimeVersion()) {
|
$didWePerformAnUpgrade = false;
|
||||||
return;
|
try
|
||||||
}
|
{
|
||||||
|
for ($i = 0; $i < count($upgraders); $i++)
|
||||||
$con = Propel::getConnection();
|
{
|
||||||
$con->beginTransaction();
|
$upgrader = $upgraders[$i];
|
||||||
try {
|
if ($upgrader->checkIfUpgradeSupported())
|
||||||
//Disable Airtime UI
|
{
|
||||||
//create a temporary maintenance notification file
|
$upgrader->upgrade(); //This will throw an exception if the upgrade fails.
|
||||||
//when this file is on the server, zend framework redirects all
|
$didWePerformAnUpgrade = true;
|
||||||
//requests to the maintenance page and sets a 503 response code
|
$this->getResponse()
|
||||||
|
->setHttpResponseCode(200)
|
||||||
$maintenanceFile = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."maintenance.txt" : "/tmp/maintenance.txt";
|
->appendBody("Upgrade to Airtime " . $upgrader->getNewVersion() . " OK<br>");
|
||||||
$file = fopen($maintenanceFile, 'w');
|
$i = 0; //Start over, in case the upgrade handlers are not in ascending order.
|
||||||
fclose($file);
|
}
|
||||||
|
}
|
||||||
//Begin upgrade
|
|
||||||
|
|
||||||
//Update disk_usage value in cc_pref
|
if (!$didWePerformAnUpgrade)
|
||||||
$storDir = isset($_SERVER['AIRTIME_BASE']) ? $_SERVER['AIRTIME_BASE']."srv/airtime/stor" : "/srv/airtime/stor";
|
{
|
||||||
$diskUsage = shell_exec("du -sb $storDir | awk '{print $1}'");
|
$this->getResponse()
|
||||||
|
|
||||||
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()
|
|
||||||
->setHttpResponseCode(200)
|
->setHttpResponseCode(200)
|
||||||
->appendBody("Upgrade to Airtime 2.5.3 OK");
|
->appendBody("No upgrade was performed. The current Airtime version is " . AirtimeUpgrader::getCurrentVersion() . ".<br>");
|
||||||
|
}
|
||||||
} catch(Exception $e) {
|
}
|
||||||
$con->rollback();
|
catch (Exception $e)
|
||||||
unlink($maintenanceFile);
|
{
|
||||||
$this->getResponse()
|
$this->getResponse()
|
||||||
->setHttpResponseCode(400)
|
->setHttpResponseCode(400)
|
||||||
->appendBody($e->getMessage());
|
->appendBody($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,25 +66,10 @@ class UpgradeController extends Zend_Controller_Action
|
||||||
{
|
{
|
||||||
$this->getResponse()
|
$this->getResponse()
|
||||||
->setHttpResponseCode(401)
|
->setHttpResponseCode(401)
|
||||||
->appendBody("Error: Incorrect API key.");
|
->appendBody("Error: Incorrect API key.<br>");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ class Cache
|
||||||
$cacheKey = "{$key}{$a}";
|
$cacheKey = "{$key}{$a}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
return $cacheKey;
|
return $cacheKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,3 +37,26 @@ class Cache
|
||||||
return false;
|
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
|
||||||
|
|
|
@ -0,0 +1,197 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
abstract class AirtimeUpgrader
|
||||||
|
{
|
||||||
|
/** Versions that this upgrader class can upgrade from (an array of version strings). */
|
||||||
|
abstract protected function getSupportedVersions();
|
||||||
|
/** The version that this upgrader class will upgrade to. (returns a version string) */
|
||||||
|
abstract public function getNewVersion();
|
||||||
|
|
||||||
|
public static function getCurrentVersion()
|
||||||
|
{
|
||||||
|
CcPrefPeer::clearInstancePool(); //Ensure we don't get a cached Propel object (cached DB results)
|
||||||
|
//because we're updating this version number within this HTTP request as well.
|
||||||
|
$pref = CcPrefQuery::create()
|
||||||
|
->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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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());
|
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 */
|
/** Zend_Application */
|
||||||
require_once 'Zend/Application.php';
|
require_once 'Zend/Application.php';
|
||||||
$application = new Zend_Application(
|
$application = new Zend_Application(
|
||||||
|
|
Loading…
Reference in New Issue