public function getScriptingLogAction() { $this->request->restrictAccess(Acl::RESOURCE_LOGS_SCRIPTING_LOGS); $this->request->defineParams(array('executionId' => array('type' => 'string'))); $info = $this->db->GetRow("SELECT * FROM scripting_log WHERE execution_id = ? LIMIT 1", array($this->getParam('executionId'))); if (!$info) { throw new Exception('Script execution log not found'); } try { $dbServer = DBServer::LoadByID($info['server_id']); if (!in_array($dbServer->status, array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING))) { throw new Exception(); } } catch (Exception $e) { throw new Exception('Server was terminated and logs no longer available'); } //Note! We should not check not-owned-farms permission here. It's approved by Igor. if ($dbServer->envId != $this->environment->id) { throw new \Scalr_Exception_InsufficientPermissions(); } $client = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $dbServer->getPort(DBServer::PORT_API)); $logs = $client->getScriptLogs($this->getParam('executionId')); $msg = sprintf("STDERR: %s \n\n STDOUT: %s", base64_decode($logs->stderr), base64_decode($logs->stdout)); $msg = nl2br(htmlspecialchars($msg)); $this->response->data(array('message' => $msg)); }
private function setConfig(DBServer $dbServer, $behavior, $config) { $port = $dbServer->GetProperty(SERVER_PROPERTIES::SZR_API_PORT); if (!$port) { $port = 8010; } $client = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SERVICE, $port); $result = $client->setPreset($behavior, $config); return $result->result; }
public function progressAction() { $opId = $this->getParam('operationId'); if ($opId) { $operation = $this->db->GetRow("SELECT * FROM server_operations WHERE id = ? LIMIT 1", array($opId)); $dbServer = DBServer::LoadByID($operation['server_id']); $this->user->getPermissions()->validate($dbServer); } $client2 = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_OPERATION, $dbServer->getPort(DBServer::PORT_API)); $info = $client2->getStatus($opId); var_dump($info); }
public function getValue(DBFarmRole $dbFarmRole, Scalr_Scaling_FarmRoleMetric $farmRoleMetric) { $servers = $dbFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::RUNNING)); $dbFarm = $dbFarmRole->GetFarmObject(); if (count($servers) == 0) { return false; } $retval = array(); foreach ($servers as $DBServer) { if ($dbFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_EXCLUDE_DBMSR_MASTER) == 1) { $isMaster = $DBServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) == 1 || $DBServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1; if ($isMaster) { continue; } } if ($DBServer->IsSupported('0.13.0')) { $szrClient = Scalr_Net_Scalarizr_Client::getClient($DBServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $DBServer->getPort(DBServer::PORT_API)); $ramUsage = $szrClient->memInfo(); $ram = (double) $ramUsage->total_free; if ($farmRoleMetric->getSetting(self::SETTING_USE_CACHED)) { $ram = $ram + (double) $ramUsage->cached; } } else { $port = $DBServer->GetProperty(SERVER_PROPERTIES::SZR_SNMP_PORT); $this->snmpClient->connect($DBServer->remoteIp, $port ? $port : 161, $dbFarm->Hash, null, null, false); $res = $this->snmpClient->get($this->snmpOids['memswap']); preg_match_all("/[0-9]+/si", $res, $matches); $ram = (double) $matches[0][0]; if ($farmRoleMetric->getSetting(self::SETTING_USE_CACHED)) { $res = $this->snmpClient->get($this->snmpOids['cachedram']); preg_match_all("/[0-9]+/si", $res, $matches); $cram = (double) $matches[0][0]; $ram = $ram + $cram; } } $retval[] = round($ram / 1024, 2); } return $retval; }
public function getValue(DBFarmRole $dbFarmRole, Scalr_Scaling_FarmRoleMetric $farmRoleMetric) { $servers = $dbFarmRole->GetServersByFilter(array('status' => SERVER_STATUS::RUNNING)); $dbFarm = $dbFarmRole->GetFarmObject(); $retval = array(); if (count($servers) == 0) { return array(); } foreach ($servers as $dbServer) { if ($dbServer->IsSupported('0.13.0')) { $apiClient = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $dbServer->getPort(DBServer::PORT_API)); $metrics = $apiClient->scalingMetrics(); foreach ($metrics as $metric) { if ($metric->id == $farmRoleMetric->metricId) { if ($metric->error) { throw new Exception(sprintf(_("%s metric error on '%s' (%s): %s"), $metric->name, $dbServer->serverId, $dbServer->remoteIp, $metric->error)); } $retval[] = $metric->value; break; } } } else { $port = $dbServer->GetProperty(SERVER_PROPERTIES::SZR_SNMP_PORT); // Think about global cache $this->snmpClient->connect($DBServer->remoteIp, $port ? $port : 161, $dbFarm->Hash, 7, null, true); $res = $this->snmpClient->getFullTree(".1.3.6.1.4.1.36632.5"); $result = array(); foreach ($res as $oid => $value) { preg_match("/^(.*?)\\.36632\\.5\\.1\\.([0-9]+)\\.([0-9]+)\$/", $oid, $matches); switch ($matches[2]) { case "1": //index $result['index'][$matches[3]] = $value; break; case "2": //metric_id $result['metric_id'][$matches[3]] = $value; break; case "3": //metric_name $result['metric_name'][$matches[3]] = $value; break; case "4": //metric_value $result['metric_value'][$matches[3]] = $value; break; case "5": //error $result['error'][$matches[3]] = $value; break; } } foreach ($result['metric_id'] as $index => $metric_id) { if ($metric_id == $farmRoleMetric->metricId) { if ($result['error'][$index]) { throw new Exception(sprintf(_("%s metric error on '%s' (%s): %s"), $result['metric_name'][$index], $dbServer->serverId, $dbServer->remoteIp, $result['error'][$index])); } $retval[] = $result['metric_value'][$index]; break; } } } } return $retval; }
public function __get($name) { if ($name == 'scalarizr') { $this->scalarizr = new stdClass(); // Get list of namespaces $refl = new ReflectionClass('Scalr_Net_Scalarizr_Client'); foreach ($refl->getConstants() as $c => $v) { if (substr($c, 0, 9) == 'NAMESPACE') { $this->scalarizr->{$v} = Scalr_Net_Scalarizr_Client::getClient($this, $v, $this->getPort(self::PORT_API)); } } } if (isset($this->{$name})) { return $this->{$name}; } else { throw new InvalidArgumentException("Unknown property '{$name}' in class DBServer"); } }
public function __construct(DBServer $dbServer, $port = 8010) { $this->namespace = "postgresql"; parent::__construct($dbServer, $port); }
public function __construct(DBServer $dbServer, $port = 8010) { $this->namespace = "sysinfo"; parent::__construct($dbServer, $port); }
function handleWork($farmId) { $DBFarm = DBFarm::LoadByID($farmId); $GLOBALS["SUB_TRANSACTIONID"] = abs(crc32(posix_getpid() . $farmId)); $GLOBALS["LOGGER_FARMID"] = $farmId; if ($DBFarm->Status != FARM_STATUS::RUNNING) { $this->logger->warn("[FarmID: {$DBFarm->ID}] Farm terminated. There is no need to scale it."); return; } foreach ($DBFarm->GetFarmRoles() as $DBFarmRole) { for ($i = 0; $i < 10; $i++) { if ($DBFarmRole->NewRoleID != '') { $this->logger->warn("[FarmID: {$DBFarm->ID}] Role '{$DBFarmRole->GetRoleObject()->name}' being synchronized. This role will not be scalled."); continue 2; } if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_ENABLED) != '1' && !$DBFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MONGODB) && !$DBFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::RABBITMQ) && !$DBFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::VPC_ROUTER)) { $this->logger->info("[FarmID: {$DBFarm->ID}] Scaling disabled for role '{$DBFarmRole->GetRoleObject()->name}'. Skipping..."); continue 2; } // Get polling interval in seconds $polling_interval = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_POLLING_INTERVAL) * 60; $dt_last_polling = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_LAST_POLLING_TIME); if ($dt_last_polling && $dt_last_polling + $polling_interval > time() && $i == 0) { $this->logger->info("Polling interval: every {$polling_interval} seconds"); continue; } // Set Last polling time $DBFarmRole->SetSetting(DBFarmRole::SETTING_SCALING_LAST_POLLING_TIME, time(), DBFarmRole::TYPE_LCL); // Get current count of running and pending instances. $this->logger->info(sprintf("Processing role '%s'", $DBFarmRole->GetRoleObject()->name)); $scalingManager = new Scalr_Scaling_Manager($DBFarmRole); $scalingDecision = $scalingManager->makeScalingDecition(); if ($scalingDecision == Scalr_Scaling_Decision::STOP_SCALING) { return; } if ($scalingDecision == Scalr_Scaling_Decision::NOOP) { continue 2; } elseif ($scalingDecision == Scalr_Scaling_Decision::DOWNSCALE) { /* Timeout instance's count decrease. Decreases instance�s count after scaling resolution the spare instances are running�g for selected timeout interval from scaling EditOptions */ // We have to check timeout limits before new scaling (downscaling) process will be initiated if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_TIMEOUT_ENABLED)) { // if the farm timeout is exceeded // checking timeout interval. $last_down_scale_data_time = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_DATETIME); $timeout_interval = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_TIMEOUT); // check the time interval to continue scaling or cancel it... if (time() - $last_down_scale_data_time < $timeout_interval * 60) { // if the launch time is too small to terminate smth in this role -> go to the next role in foreach() Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Waiting for downscaling timeout on farm %s, role %s", $DBFarm->Name, $DBFarmRole->GetRoleObject()->name))); continue 2; } } // end Timeout instance's count decrease $sort = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_KEEP_OLDEST) == 1 ? 'DESC' : 'ASC'; $servers = $this->db->GetAll("SELECT server_id FROM servers WHERE status = ? AND farm_roleid=? ORDER BY dtadded {$sort}", array(SERVER_STATUS::RUNNING, $DBFarmRole->ID)); $got_valid_instance = false; // Select instance that will be terminated // // * Instances ordered by uptime (oldest wil be choosen) // * Instance cannot be mysql master // * Choose the one that was rebundled recently while (!$got_valid_instance && count($servers) > 0) { $item = array_shift($servers); $DBServer = DBServer::LoadByID($item['server_id']); if ($DBServer->GetFarmRoleObject()->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::RABBITMQ)) { $serversCount = count($DBServer->GetFarmRoleObject()->GetServersByFilter(array(), array('status' => array(SERVER_STATUS::TERMINATED, SERVER_STATUS::TROUBLESHOOTING)))); if ($DBServer->index == 1 && $serversCount > 1) { continue; } } if ($DBServer->GetProperty(EC2_SERVER_PROPERTIES::IS_LOCKED)) { continue; } // Exclude db master if ($DBServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) != 1 && $DBServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) != 1) { // We do not want to delete the most recently synced instance. Because of LA fluctuation. // I.e. LA may skyrocket during sync and drop dramatically after sync. if ($DBServer->dateLastSync != 0) { $chk_sync_time = $this->db->GetOne("\n SELECT server_id FROM servers\n WHERE dtlastsync > {$DBServer->dateLastSync}\n AND farm_roleid='{$DBServer->farmRoleId}'\n AND status NOT IN('" . SERVER_STATUS::TERMINATED . "', '" . SERVER_STATUS::TROUBLESHOOTING . "')\n LIMIT 1\n "); if ($chk_sync_time) { $got_valid_instance = true; } } else { $got_valid_instance = true; } } } if ($DBServer && $got_valid_instance) { $this->logger->info(sprintf("Server '%s' selected for termination...", $DBServer->serverId)); $allow_terminate = false; if ($DBServer->platform == SERVER_PLATFORMS::EC2) { $aws = $DBServer->GetEnvironmentObject()->aws($DBServer); // Shutdown an instance just before a full hour running if (!$DBServer->GetFarmRoleObject()->GetSetting(DBFarmRole::SETTING_SCALING_IGNORE_FULL_HOUR)) { $response = $aws->ec2->instance->describe($DBServer->GetProperty(EC2_SERVER_PROPERTIES::INSTANCE_ID))->get(0); if ($response && count($response->instancesSet)) { $launch_time = $response->instancesSet->get(0)->launchTime->getTimestamp(); $time = 3600 - (time() - $launch_time) % 3600; // Terminate instance in < 10 minutes for full hour. if ($time <= 600) { $allow_terminate = true; } else { $timeout = round(($time - 600) / 60, 1); Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Farm %s, role %s scaling down. Server '%s' will be terminated in %s minutes. Launch time: %s", $DBFarm->Name, $DBServer->GetFarmRoleObject()->GetRoleObject()->name, $DBServer->serverId, $timeout, $response->instancesSet->get(0)->launchTime->format('c')))); } } } else { $allow_terminate = true; } //Releases memory $DBServer->GetEnvironmentObject()->getContainer()->release('aws'); unset($aws); } else { $allow_terminate = true; } if ($allow_terminate) { //Check safe shutdown if ($DBServer->GetFarmRoleObject()->GetSetting(DBFarmRole::SETTING_SCALING_SAFE_SHUTDOWN) == 1) { if ($DBServer->IsSupported('0.11.3')) { try { $port = $DBServer->GetProperty(SERVER_PROPERTIES::SZR_API_PORT); if (!$port) { $port = 8010; } $szrClient = Scalr_Net_Scalarizr_Client::getClient($DBServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $port); $res = $szrClient->callAuthShutdownHook(); } catch (Exception $e) { $res = $e->getMessage(); } } else { Logger::getLogger(LOG_CATEGORY::FARM)->error(new FarmLogMessage($DBFarm->ID, sprintf("Safe shutdown enabled, but not supported by scalarizr installed on server '%s'. Ignoring.", $DBServer->serverId))); } if ($res != '1') { Logger::getLogger(LOG_CATEGORY::FARM)->warn(new FarmLogMessage($DBFarm->ID, sprintf("Safe shutdown enabled. Server '%s'. Script returned '%s', server won't be terminated while return value not '1'", $DBServer->serverId, $res))); break; } } try { $DBServer->terminate('SCALING_DOWN', false); $DBFarmRole->SetSetting(DBFarmRole::SETTING_SCALING_DOWNSCALE_DATETIME, time(), DBFarmRole::TYPE_LCL); Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Farm %s, role %s scaling down. Server '%s' marked as 'Pending terminate' and will be fully terminated in 3 minutes.", $DBFarm->Name, $DBServer->GetFarmRoleObject()->GetRoleObject()->name, $DBServer->serverId))); } catch (Exception $e) { $this->logger->fatal(sprintf("Cannot terminate %s: %s", $DBFarm->ID, $DBServer->serverId, $e->getMessage())); } } } else { $this->logger->warn(sprintf("[FarmID: %s] Scalr unable to determine what instance it should terminate (FarmRoleID: %s). Skipping...", $DBFarm->ID, $DBFarmRole->ID)); } break; } elseif ($scalingDecision == Scalr_Scaling_Decision::UPSCALE) { /* Timeout instance's count increase. Increases instance's count after scaling resolution �need more instances� for selected timeout interval from scaling EditOptions */ if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_TIMEOUT_ENABLED)) { // if the farm timeout is exceeded // checking timeout interval. $last_up_scale_data_time = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_DATETIME); $timeout_interval = $DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_TIMEOUT); // check the time interval to continue scaling or cancel it... if (time() - $last_up_scale_data_time < $timeout_interval * 60) { // if the launch time is too small to terminate smth in this role -> go to the next role in foreach() Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Waiting for upscaling timeout on farm %s, role %s", $DBFarm->Name, $DBFarmRole->GetRoleObject()->name))); continue 2; } } // end Timeout instance's count increase //Check DBMsr. Do not start slave during slave2master process $isDbMsr = $DBFarmRole->GetRoleObject()->getDbMsrBehavior(); if ($isDbMsr) { if ($DBFarmRole->GetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER)) { $runningServers = $DBFarmRole->GetRunningInstancesCount(); if ($runningServers > 0) { Logger::getLogger(LOG_CATEGORY::FARM)->warn(new FarmLogMessage($DBFarm->ID, sprintf("Role is in slave2master promotion process. Do not launch new slaves while there is no active slaves"))); continue 2; } else { $DBFarmRole->SetSetting(Scalr_Db_Msr::SLAVE_TO_MASTER, 0, DBFarmRole::TYPE_LCL); } } } if ($DBFarmRole->GetSetting(DBFarmRole::SETTING_SCALING_ONE_BY_ONE) == 1) { $pendingInstances = $DBFarmRole->GetPendingInstancesCount(); if ($pendingInstances > 0) { Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("There are %s pending intances of %s role on % farm. Waiting...", $pendingInstances, $DBFarmRole->GetRoleObject()->name, $DBFarm->Name))); continue 2; } } $fstatus = $this->db->GetOne("SELECT status FROM farms WHERE id=? LIMIT 1", array($DBFarm->ID)); if ($fstatus != FARM_STATUS::RUNNING) { $this->logger->warn("[FarmID: {$DBFarm->ID}] Farm terminated. There is no need to scale it."); return; } $ServerCreateInfo = new ServerCreateInfo($DBFarmRole->Platform, $DBFarmRole); try { $DBServer = Scalr::LaunchServer($ServerCreateInfo, null, false, "Scaling up"); $DBFarmRole->SetSetting(DBFarmRole::SETTING_SCALING_UPSCALE_DATETIME, time(), DBFarmRole::TYPE_LCL); Logger::getLogger(LOG_CATEGORY::FARM)->info(new FarmLogMessage($DBFarm->ID, sprintf("Farm %s, role %s scaling up. Starting new instance. ServerID = %s.", $DBFarm->Name, $DBServer->GetFarmRoleObject()->GetRoleObject()->name, $DBServer->serverId))); } catch (Exception $e) { Logger::getLogger(LOG_CATEGORY::SCALING)->error($e->getMessage()); } } } } }
public function xGrowStorageAction() { $dbFarmRole = DBFarmRole::LoadByID($this->getParam('farmRoleId')); $this->user->getPermissions()->validate($dbFarmRole->GetFarmObject()); $behavior = Scalr_Role_Behavior::loadByName($dbFarmRole->GetRoleObject()->getDbMsrBehavior()); $master = $behavior->getMasterServer($dbFarmRole); if ($master) { $port = $master->GetProperty(SERVER_PROPERTIES::SZR_API_PORT); if (!$port) { $port = 8010; } try { $client = Scalr_Net_Scalarizr_Client::getClient($master, Scalr_Net_Scalarizr_Client::NAMESPACE_MYSQL, $port); $volume = Scalr_Storage_Volume::init()->loadById($dbFarmRole->GetSetting(Scalr_Db_Msr::VOLUME_ID)); if ($volume->type != MYSQL_STORAGE_ENGINE::EBS && $volume->type != MYSQL_STORAGE_ENGINE::RAID_EBS && $volume->type != 'raid') { throw new Exception("Grow feature available only for EBS and RAID storage types"); } if ($volume->size >= (int) $this->getParam('newSize')) { throw new Exception("New size should be greather than current one ({$volume->size} GB)"); } $volumeConfig = $volume->getConfig(); $platformAccessData = PlatformFactory::NewPlatform($dbFarmRole->Platform)->GetPlatformAccessData($this->environment, $master); $operationId = $client->growStorage($volumeConfig, $this->getParam('newSize'), $platformAccessData); $master->operations->add($operationId, Operations::MYSQL_GROW_VOLUME); $this->response->data(array('operationId' => $operationId)); } catch (Exception $e) { throw new Exception("Cannot grow storage: {$e->getMessage()}"); } } else { throw new Exception("Impossible to increase storage size. No running master server."); } }
public function xServerGetLaAction() { $this->request->restrictAccess(Acl::RESOURCE_FARMS_SERVERS); $dbServer = DBServer::LoadByID($this->getParam('serverId')); $this->user->getPermissions()->validate($dbServer); if (!$dbServer->IsSupported('0.13.0')) { $la = "Unknown"; } else { if ($dbServer->osType == 'linux') { try { $szrClient = Scalr_Net_Scalarizr_Client::getClient($dbServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $dbServer->getPort(DBServer::PORT_API)); $la = $szrClient->loadAverage(); if ($la[0] !== null && $la[0] !== false) { $la = number_format($la[0], 2); } else { $la = "Unknown"; } } catch (Exception $e) { $la = "Unknown"; } } else { $la = "Not available"; } } $this->response->data(array('la' => $la)); }
public function statusAction() { $this->request->defineParams(array('farmId' => array('type' => 'int'), 'farmRoleId' => array('type' => 'int'), 'type')); $dbFarm = DBFarm::LoadByID($this->getParam('farmId')); $this->user->getPermissions()->validate($dbFarm); if ($this->getParam('farmRoleId')) { $dbFarmRole = DBFarmRole::LoadByID($this->getParam('farmRoleId')); if ($dbFarmRole->FarmID != $dbFarm->ID) { throw new Exception("Role not found"); } } elseif ($this->getParam('type')) { foreach ($dbFarm->GetFarmRoles() as $sDbFarmRole) { if ($sDbFarmRole->GetRoleObject()->hasBehavior($this->getParam('type'))) { $dbFarmRole = $sDbFarmRole; break; } } if (!$dbFarmRole) { throw new Exception("Role not found"); } } else { throw new Scalr_UI_Exception_NotFound(); } $data = array('farmRoleId' => $dbFarmRole->ID, 'farmHash' => $dbFarm->Hash, 'pmaAccessConfigured' => false, 'staticDnsSupported' => \Scalr::config('scalr.dns.static.enabled')); $data['backupsNotSupported'] = in_array($dbFarmRole->Platform, array(SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF, SERVER_PLATFORMS::UCLOUD)); if ($dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_PMA_USER)) { $data['pmaAccessConfigured'] = true; } else { $errmsg = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_PMA_REQUEST_ERROR); if (!$errmsg) { $time = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_PMA_REQUEST_TIME); if ($time) { if ($time + 3600 < time()) { $data['pmaAccessError'] = _("Scalr didn't receive auth info from MySQL instance. Please check that MySQL running and Scalr has access to it."); } else { $data['pmaAccessSetupInProgress'] = true; } } } else { $data['pmaAccessError'] = $errmsg; } } //TODO: Legacy code. Move to DB_MSR if ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL)) { $data['dbType'] = Scalr_Db_Msr::DB_TYPE_MYSQL; $data['dtLastBundle'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BUNDLE_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BUNDLE_TS), 'd M Y \\a\\t H:i:s') : 'Never'; $data['dtLastBackup'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BCP_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_LAST_BCP_TS), 'd M Y \\a\\t H:i:s') : 'Never'; $data['additionalInfo']['MasterUsername'] = '******'; $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_ROOT_PASSWORD); $slaveNumber = 0; foreach ($dbFarmRole->GetServersByFilter() as $dbServer) { if ($dbServer->status != SERVER_STATUS::RUNNING) { //TODO: continue; } if ($dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) == 1) { $data['isBundleRunning'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_IS_BUNDLE_RUNNING); $data['bundleServerId'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_BUNDLE_SERVER_ID); if ($data['isBundleRunning']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], 'MySQL data bundle', 'running')); } elseif ($data['bundleServerId']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], 'MySQL data bundle')); } if ($opId) { $data['bundleOperationId'] = $opId; } } $data['isBackupRunning'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_IS_BCP_RUNNING); $data['backupServerId'] = $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_BCP_SERVER_ID); if (!$data['backupOperationId']) { if ($data['isBackupRunning']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], 'MySQL backup', 'running')); } elseif ($data['backupServerId']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], 'MySQL backup')); } if ($opId) { $data['backupOperationId'] = $opId; } } try { $isCloudstack = in_array($dbFarmRole->Platform, array(SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF, SERVER_PLATFORMS::UCLOUD)); $isMaster = $dbServer->GetProperty(SERVER_PROPERTIES::DB_MYSQL_MASTER) == 1; if (!$isCloudstack) { $rStatus = $this->getMySqlReplicationStatus($isMaster ? 'MASTER' : 'SLAVE', $dbServer->remoteIp, 'scalr_stat', $dbFarmRole->GetSetting(DBFarmRole::SETTING_MYSQL_STAT_PASSWORD)); } if ($isMaster) { $MasterPosition = $rStatus['Position']; $master_ip = $dbServer->remoteIp; $master_iid = $dbServer->serverId; } else { $num = ++$slaveNumber; $SlavePosition = $rStatus['Exec_Master_Log_Pos']; } $d = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "replicationRole" => $isMaster ? 'Master' : "Slave #{$num}"); if (!$isCloudstack) { $d['data'] = $rStatus; $d['masterPosition'] = $MasterPosition; $d['slavePosition'] = $SlavePosition; } $data["replicationStatus"][] = $d; } catch (Exception $e) { $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "error" => $e->msg ? $e->msg : $e->getMessage(), "replicationRole" => $isMaster ? 'Master' : 'Slave'); } } } else { $data['dbType'] = $dbFarmRole->GetRoleObject()->getDbMsrBehavior(); if (!$data['dbType']) { $this->response->failure("Unknown db type"); } $behavior = Scalr_Role_Behavior::loadByName($data['dbType']); $masterServer = $behavior->getMasterServer($dbFarmRole); // Get Stoarge usage $size = array('total' => -1, 'used' => -1, 'free' => -1); if ($masterServer) { try { $port = $masterServer->GetProperty(SERVER_PROPERTIES::SZR_API_PORT); if (!$port) { $port = 8010; } $client = Scalr_Net_Scalarizr_Client::getClient($masterServer, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $port); if ($data['dbType'] == ROLE_BEHAVIORS::REDIS) { $mpoint = '/mnt/redisstorage'; } elseif ($data['dbType'] == ROLE_BEHAVIORS::POSTGRESQL) { $mpoint = '/mnt/pgstorage'; } else { $mpoint = '/mnt/dbstorage'; } $usage = (array) $client->statvfs(array($mpoint)); $size = (array) $usage[$mpoint]; if ($size['total']) { $size['used'] = $size['total'] - $size['free']; // Convert KB to GB foreach ($size as $k => $v) { $size[$k] = round($v / 1024 / 1024, 2); } } } catch (Exception $e) { $this->response->varDump($e->getMessage()); } } $data['storage'] = array('engine' => $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_ENGINE), 'id' => $dbFarmRole->GetSetting(Scalr_Db_Msr::VOLUME_ID) ? $dbFarmRole->GetSetting(Scalr_Db_Msr::VOLUME_ID) : '', 'fs' => $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_FSTYPE), 'size' => $size); switch ($data['storage']['engine']) { case MYSQL_STORAGE_ENGINE::EBS: $data['storage']['engineName'] = 'Single EBS volume'; break; case MYSQL_STORAGE_ENGINE::RAID_EBS: $data['storage']['engineName'] = sprintf('RAID %s on %s EBS volumes', $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_RAID_LEVEL), $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_RAID_DISKS_COUNT)); break; case MYSQL_STORAGE_ENGINE::LVM: $data['storage']['engineName'] = 'LVM on ephemeral device(s)'; break; case MYSQL_STORAGE_ENGINE::EPH: $data['storage']['engineName'] = 'Ephemeral device'; break; case MYSQL_STORAGE_ENGINE::CSVOL: $data['storage']['engineName'] = 'Single Cloudstack volume'; break; default: $data['storage']['engineName'] = $data['storage']['engine']; break; } $data['additionalInfo']['MasterUsername'] = '******'; if ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::POSTGRESQL)) { $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Postgresql::ROOT_PASSWORD); $name = 'PostgreSQL'; } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::REDIS)) { $ports = @json_decode($dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::PORTS_ARRAY)); $passwords = @json_decode($dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::PASSWD_ARRAY)); if (!$ports && !$passwords) { $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Redis::MASTER_PASSWORD); } else { $data['additionalInfo']['MasterPassword'] = ""; foreach ($ports as $i => $port) { $data['additionalInfo']['MasterPassword'] .= "Port {$port}: {$passwords[$i]}<br>"; } } $name = 'Redis'; } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MYSQL2)) { $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Mysql2::ROOT_PASSWORD); $name = 'MySQL'; } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::PERCONA)) { $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Percona::ROOT_PASSWORD); $name = 'Percona Server'; } elseif ($dbFarmRole->GetRoleObject()->hasBehavior(ROLE_BEHAVIORS::MARIADB)) { $data['additionalInfo']['MasterPassword'] = $dbFarmRole->GetSetting(Scalr_Db_Msr_Mariadb::ROOT_PASSWORD); $name = 'MariaDB'; } if (!$data['additionalInfo']['MasterPassword']) { $data['additionalInfo']['MasterPassword'] = ""; } $data['name'] = $name; if ($dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_STORAGE_ENGINE) == 'lvm') { $data['noDataBundleForSlaves'] = $dbFarmRole->GetSetting(Scalr_Role_DbMsrBehavior::ROLE_NO_DATA_BUNDLE_FOR_SLAVES) ? true : false; } $data['dtLastBackup'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_LAST_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_LAST_TS), 'd M Y \\a\\t H:i:s') : 'Never'; $data['dtLastBundle'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_LAST_TS) ? Scalr_Util_DateTime::convertTz((int) $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_LAST_TS), 'd M Y \\a\\t H:i:s') : 'Never'; $slaveNumber = 0; foreach ($dbFarmRole->GetServersByFilter() as $dbServer) { if ($dbServer->status != SERVER_STATUS::RUNNING) { //TODO: continue; } if ($dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1) { $data['isBundleRunning'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_IS_RUNNING); $data['bundleServerId'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BUNDLE_SERVER_ID); if ($data['isBundleRunning']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], "{$name} data bundle", 'running')); } elseif ($data['bundleServerId']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['bundleServerId'], "{$name} data bundle")); } if ($opId) { $data['bundleOperationId'] = $opId; } } $data['isBackupRunning'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_IS_RUNNING); $data['backupServerId'] = $dbFarmRole->GetSetting(Scalr_Db_Msr::DATA_BACKUP_SERVER_ID); if (!$data['backupOperationId']) { if ($data['isBackupRunning']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? AND status = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], "{$name} backup", 'running')); } elseif ($data['backupServerId']) { $opId = $this->db->GetOne("SELECT id FROM server_operations WHERE server_id = ? AND name = ? ORDER BY timestamp DESC LIMIT 1", array($data['backupServerId'], "{$name} backup")); } if ($opId) { $data['backupOperationId'] = $opId; } } try { $isCloudstack = in_array($dbFarmRole->Platform, array(SERVER_PLATFORMS::CLOUDSTACK, SERVER_PLATFORMS::IDCF, SERVER_PLATFORMS::UCLOUD)); $isMaster = $dbServer->GetProperty(Scalr_Db_Msr::REPLICATION_MASTER) == 1; if (!$isCloudstack && in_array($this->getParam('type'), array(ROLE_BEHAVIORS::MYSQL2, ROLE_BEHAVIORS::PERCONA, ROLE_BEHAVIORS::MARIADB))) { $password = $dbFarmRole->GetSetting(Scalr_Db_Msr_Mysql2::STAT_PASSWORD); $rStatus = $this->getMySqlReplicationStatus($isMaster ? 'MASTER' : 'SLAVE', $dbServer->remoteIp, 'scalr_stat', $password); } if ($isMaster) { $MasterPosition = $rStatus['Position']; $master_ip = $dbServer->remoteIp; $master_iid = $dbServer->serverId; } else { $num = ++$slaveNumber; $SlavePosition = $rStatus['Exec_Master_Log_Pos']; } $d = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "replicationRole" => $isMaster ? 'Master' : "Slave #{$num}"); if (!$isCloudstack) { $d['data'] = $rStatus; $d['masterPosition'] = $MasterPosition; $d['slavePosition'] = $SlavePosition; } $data["replicationStatus"][] = $d; } catch (Exception $e) { $data["replicationStatus"][] = array("serverId" => $dbServer->serverId, "localIp" => $dbServer->localIp, "remoteIp" => $dbServer->remoteIp, "error" => $e->msg ? $e->msg : $e->getMessage(), "replicationRole" => $isMaster ? 'Master' : 'Slave'); } } } $this->response->page('ui/dbmsr/status.js', $data); }
public function GetFreeDeviceName() { if (!$this->IsSupported('0.11.0')) { return $this->GetFreeDeviceNameSNMP(); } $szrClient = Scalr_Net_Scalarizr_Client::getClient($this, Scalr_Net_Scalarizr_Client::NAMESPACE_SYSTEM, $this->getPort(self::PORT_API)); $list = $szrClient->blockDevices(); $map = array("f", "g", "h", "i", "j", "k", "l", "m", "n", "p"); $n_map = array("1", "2", "3", "4", "5", "6", "7", "8", "9"); $mapUsed = array(); foreach ($list as $deviceName) { preg_match("/(sd|xvd)([a-z][0-9]*)/", $deviceName, $matches); if (!in_array($matches[0][2], $mapUsed)) { array_push($mapUsed, $matches[0][2]); } } $deviceL = false; foreach ($n_map as $v) { foreach ($map as $letter) { if (in_array($letter, $mapUsed)) { continue; } $deviceL = "{$letter}{$v}"; if (!in_array($deviceL, $mapUsed)) { break; } else { $mapUsed = false; } } if ($deviceL) { break; } } if (!$deviceL) { throw new Exception(_("There is no available device letter on instance for attaching EBS")); } return "/dev/sd{$deviceL}"; }