/** * @return bool * @throws Exception */ public function execute($manual = false) { $farmRoleNotFound = false; $logger = Logger::getLogger(__CLASS__); switch ($this->type) { case self::LAUNCH_FARM: try { $farmId = $this->targetId; $DBFarm = DBFarm::LoadByID($farmId); if ($DBFarm->Status == FARM_STATUS::TERMINATED) { // launch farm Scalr::FireEvent($farmId, new FarmLaunchedEvent(true)); $logger->info(sprintf("Farm #{$farmId} successfully launched")); } elseif ($DBFarm->Status == FARM_STATUS::RUNNING) { // farm is running $logger->info(sprintf("Farm #{$farmId} is already running")); } else { // farm can't be launched $logger->info(sprintf("Farm #{$farmId} can't be launched because of it's status: {$DBFarm->Status}")); } } catch (Exception $e) { $farmRoleNotFound = true; $logger->info(sprintf("Farm #{$farmId} was not found and can't be launched")); } break; case self::TERMINATE_FARM: try { // get config settings $farmId = $this->targetId; $deleteDNSZones = (int) $this->config['deleteDNSZones']; $deleteCloudObjects = (int) $this->config['deleteCloudObjects']; $keepCloudObjects = $deleteCloudObjects == 1 ? 0 : 1; $DBFarm = DBFarm::LoadByID($farmId); if ($DBFarm->Status == FARM_STATUS::RUNNING) { // terminate farm $event = new FarmTerminatedEvent($deleteDNSZones, $keepCloudObjects, false, $keepCloudObjects); Scalr::FireEvent($farmId, $event); $logger->info(sprintf("Farm successfully terminated")); } else { $logger->info(sprintf("Farm #{$farmId} can't be terminated because of it's status")); } } catch (Exception $e) { $farmRoleNotFound = true; $logger->info(sprintf("Farm #{$farmId} was not found and can't be terminated")); } break; case self::SCRIPT_EXEC: // generate event name $eventName = "Scheduler (TaskID: {$this->id})"; if ($manual) { $eventName .= ' (manual)'; } try { $scr = new Scalr_Script(); $scr->loadById($this->config['scriptId']); // get executing object by target_type variable switch ($this->targetType) { case self::TARGET_FARM: $DBFarm = DBFarm::LoadByID($this->targetId); $farmId = $DBFarm->ID; $farmRoleId = null; $servers = $this->db->GetAll("SELECT server_id FROM servers WHERE `status` IN (?,?) AND farm_id = ?", array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING, $farmId)); break; case self::TARGET_ROLE: $farmRoleId = $this->targetId; $servers = $this->db->GetAll("SELECT server_id FROM servers WHERE `status` IN (?,?) AND farm_roleid = ?", array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING, $farmRoleId)); break; case self::TARGET_INSTANCE: $servers = $this->db->GetAll("SELECT server_id FROM servers WHERE `status` IN (?,?) AND farm_roleid = ? AND `index` = ? ", array(SERVER_STATUS::INIT, SERVER_STATUS::RUNNING, $this->targetId, $this->targetServerIndex)); break; } if ($servers) { $scriptSettings = array('version' => $this->config['scriptVersion'], 'scriptid' => $this->config['scriptId'], 'timeout' => $this->config['scriptTimeout'], 'issync' => $this->config['scriptIsSync'], 'params' => serialize($this->config['scriptOptions'])); // send message to start executing task (starts script) foreach ($servers as $server) { $DBServer = DBServer::LoadByID($server['server_id']); $msg = new Scalr_Messaging_Msg_ExecScript($eventName); $msg->setServerMetaData($DBServer); $script = Scalr_Scripting_Manager::prepareScript($scriptSettings, $DBServer); $itm = new stdClass(); // Script $itm->asynchronous = $script['issync'] == 1 ? '0' : '1'; $itm->timeout = $script['timeout']; if ($script['body']) { $itm->name = $script['name']; $itm->body = $script['body']; } else { $itm->path = $script['path']; } $itm->executionId = $script['execution_id']; $msg->scripts = array($itm); try { $msg->globalVariables = array(); $globalVariables = new Scalr_Scripting_GlobalVariables($DBServer->envId); $vars = $globalVariables->listVariables($DBServer->roleId, $DBServer->farmId, $DBServer->farmRoleId); foreach ($vars as $k => $v) { $msg->globalVariables[] = (object) array('name' => $k, 'value' => $v); } } catch (Exception $e) { } $DBServer->SendMessage($msg); } } else { $farmRoleNotFound = true; } } catch (Exception $e) { // farm or role not found. $farmRoleNotFound = true; $logger->warn(sprintf("Farm, role or instances were not found, script can't be executed")); } break; } return !$farmRoleNotFound; }
public function editAction() { $this->request->restrictAccess(Acl::RESOURCE_FARMS_SCRIPTS, Acl::PERM_FARMS_SCRIPTS_MANAGE); $this->request->defineParams(array('scriptId' => array('type' => 'int'), 'version' => array('type' => 'int'))); $vars = Scalr_Scripting_Manager::getScriptingBuiltinVariables(); $script = new Scalr_Script(); $script->loadById($this->getParam('scriptId')); if ($script->accountId) { $this->user->getPermissions()->validate($script); } elseif ($this->user->getType() != Scalr_Account_User::TYPE_SCALR_ADMIN) { throw new Scalr_Exception_InsufficientPermissions(); } $revision = $script->getRevision($this->getParam('version')); $this->response->page('ui/scripts/create.js', array('script' => array('id' => $script->id, 'name' => $script->name, 'description' => $script->description, 'isSync' => !is_null($script->isSync) ? $script->isSync : 0, 'script' => $revision['script'], 'version' => $revision['revision']), 'versions' => $script->getRevisionIds(), 'latestVersion' => $script->getLatestRevision(), 'variables' => "%" . implode("%, %", array_keys($vars)) . "%"), array('codemirror/codemirror.js'), array('codemirror/codemirror.css')); }