public static function prepareScript($scriptSettings, DBServer $targetServer, AbstractServerEvent $event = null) { $template = ['type' => isset($scriptSettings['type']) ? $scriptSettings['type'] : null, 'timeout' => isset($scriptSettings['timeout']) ? $scriptSettings['timeout'] : null, 'issync' => isset($scriptSettings['issync']) ? $scriptSettings['issync'] : null, 'run_as' => isset($scriptSettings['run_as']) ? $scriptSettings['run_as'] : null, 'execution_id' => Scalr::GenerateUID()]; if ($scriptSettings['type'] == self::ORCHESTRATION_SCRIPT_TYPE_SCALR) { /* @var $script Script */ $script = Script::findPk($scriptSettings['scriptid']); if (!$script) { return false; } // TODO: validate permission to access script ? if ($script->os && $targetServer->osType && $script->os != $targetServer->osType) { return false; } if ($scriptSettings['version'] == 'latest' || (int) $scriptSettings['version'] == -1) { $version = $script->getLatestVersion(); } else { $version = $script->getVersion((int) $scriptSettings['version']); } if (empty($version)) { return false; } $template['name'] = $script->name; $template['id'] = $script->id; $template['body'] = $version->content; $template['scriptVersion'] = $version->version; // variables could be null $scriptParams = $script->allowScriptParameters ? (array) $version->variables : []; foreach ($scriptParams as &$val) { $val = ""; } $params = array_merge($scriptParams, $targetServer->GetScriptingVars(), (array) unserialize($scriptSettings['params'])); if ($event) { $eventServer = $event->DBServer; foreach ($eventServer->GetScriptingVars() as $k => $v) { $params["event_{$k}"] = $v; } foreach ($event->GetScriptingVars() as $k => $v) { $params[$k] = $event->{$v}; } if (isset($event->params) && is_array($event->params)) { foreach ($event->params as $k => $v) { $params[$k] = $v; } } $params['event_name'] = $event->GetName(); } if ($event instanceof CustomEvent && count($event->params) > 0) { $params = array_merge($params, $event->params); } // Prepare keys array and array with values for replacement in script $keys = array_keys($params); $keys = array_map(function ($item) { return '%' . $item . '%'; }, $keys); $values = array_values($params); $script_contents = str_replace($keys, $values, $template['body']); $template['body'] = str_replace('\\%', "%", $script_contents); // Generate script contents $template['name'] = preg_replace("/[^A-Za-z0-9]+/", "_", $template['name']); } elseif ($scriptSettings['type'] == self::ORCHESTRATION_SCRIPT_TYPE_LOCAL) { $template['path'] = $targetServer->applyGlobalVarsToValue($scriptSettings['script_path']); } elseif ($scriptSettings['type'] == self::ORCHESTRATION_SCRIPT_TYPE_CHEF) { $chef = new stdClass(); $chefSettings = (array) unserialize($scriptSettings['params']); if ($chefSettings['chef.cookbook_url']) { $chef->cookbookUrl = $chefSettings['chef.cookbook_url']; } if ($chefSettings['chef.cookbook_url_type']) { $chef->cookbookUrlType = $chefSettings['chef.cookbook_url_type']; } if ($chefSettings['chef.relative_path']) { $chef->relativePath = $chefSettings['chef.relative_path']; } if ($chefSettings['chef.ssh_private_key']) { $chef->sshPrivateKey = $chefSettings['chef.ssh_private_key']; } if ($chefSettings['chef.role_name']) { $chef->role = $chefSettings['chef.role_name']; } else { $chef->runList = $chefSettings['chef.runlist']; } $chef->jsonAttributes = $chefSettings['chef.attributes']; $template['chef'] = $chef; } return $template; }
public static function listServerGlobalVariables(DBServer $dbServer, $includeSystem = false, AbstractServerEvent $event = null) { $retval = array(); if ($includeSystem) { $variables = $dbServer->GetScriptingVars(); if ($event) { if ($event->DBServer) { foreach ($event->DBServer->GetScriptingVars() as $k => $v) { $variables["event_{$k}"] = $v; } } foreach ($event->GetScriptingVars() as $k => $v) { $variables[$k] = $event->{$v}; } if (isset($event->params) && is_array($event->params)) { foreach ($event->params as $k => $v) { $variables[$k] = $v; } } $variables['event_name'] = $event->GetName(); } $formats = \Scalr::config("scalr.system.global_variables.format"); foreach ($variables as $name => $value) { $name = "SCALR_" . strtoupper($name); $value = trim($value); if (isset($formats[$name])) { $value = @sprintf($formats[$name], $value); } $private = strpos($name, 'SCALR_EVENT_') === 0 ? 1 : 0; $retval[] = (object) array('name' => $name, 'value' => $value, 'private' => $private, 'system' => 1); } } try { $globalVariables = new Scalr_Scripting_GlobalVariables($dbServer->GetEnvironmentObject()->clientId, $dbServer->envId, ScopeInterface::SCOPE_SERVER); $vars = $globalVariables->listVariables($dbServer->GetFarmRoleObject()->RoleID, $dbServer->farmId, $dbServer->farmRoleId, $dbServer->serverId); foreach ($vars as $v) { $retval[] = (object) $v; } } catch (Exception $e) { } return $retval; }