Пример #1
0
 /**
  * Constructor
  *
  * @param string $server The server Short UUID
  */
 public function __construct($uuid)
 {
     $this->server = Server::getByUUID($uuid);
     $this->node = Node::getByID($this->server->node);
     $this->client = Node::guzzleRequest($this->server->node);
     $this->headers = Server::getGuzzleHeaders($uuid);
 }
Пример #2
0
 public function __construct($server)
 {
     $this->server = $server instanceof Models\Server ? $server : Models\Server::findOrFail($server);
     $this->node = Models\Node::getByID($this->server->node);
     $this->client = Models\Node::guzzleRequest($this->server->node);
 }
Пример #3
0
 public function updateStartup($id, array $data, $admin = false)
 {
     $server = Models\Server::findOrFail($id);
     DB::beginTransaction();
     try {
         // Check the startup
         if (isset($data['startup'])) {
             $server->startup = $data['startup'];
             $server->save();
         }
         // Check those Variables
         $variables = Models\ServiceVariables::select('service_variables.*', DB::raw('COALESCE(server_variables.variable_value, service_variables.default_value) as a_currentValue'))->leftJoin('server_variables', 'server_variables.variable_id', '=', 'service_variables.id')->where('option_id', $server->option)->get();
         $variableList = [];
         if ($variables) {
             foreach ($variables as &$variable) {
                 // Move on if the new data wasn't even sent
                 if (!isset($data[$variable->env_variable])) {
                     $variableList = array_merge($variableList, [['id' => $variable->id, 'env' => $variable->env_variable, 'val' => $variable->a_currentValue]]);
                     continue;
                 }
                 // Update Empty but skip validation
                 if (empty($data[$variable->env_variable])) {
                     $variableList = array_merge($variableList, [['id' => $variable->id, 'env' => $variable->env_variable, 'val' => null]]);
                     continue;
                 }
                 // Is the variable required?
                 // @TODO: is this even logical to perform this check?
                 if (isset($data[$variable->env_variable]) && empty($data[$variable->env_variable])) {
                     if ($variable->required === 1) {
                         throw new DisplayException('A required service option variable field (' . $variable->env_variable . ') was included in this request but was left blank.');
                     }
                 }
                 // Variable hidden and/or not user editable
                 if (($variable->user_viewable === 0 || $variable->user_editable === 0) && !$admin) {
                     throw new DisplayException('A service option variable field (' . $variable->env_variable . ') does not exist or you do not have permission to edit it.');
                 }
                 // Check aganist Regex Pattern
                 if (!is_null($variable->regex) && !preg_match($variable->regex, $data[$variable->env_variable])) {
                     throw new DisplayException('Failed to validate service option variable field (' . $variable->env_variable . ') aganist regex (' . $variable->regex . ').');
                 }
                 $variableList = array_merge($variableList, [['id' => $variable->id, 'env' => $variable->env_variable, 'val' => $data[$variable->env_variable]]]);
             }
         }
         // Add Variables
         $environmentVariables = [];
         $environmentVariables = array_merge($environmentVariables, ['STARTUP' => $server->startup]);
         foreach ($variableList as $item) {
             $environmentVariables = array_merge($environmentVariables, [$item['env'] => $item['val']]);
             // Update model or make a new record if it doesn't exist.
             $model = Models\ServerVariables::firstOrNew(['variable_id' => $item['id'], 'server_id' => $server->id]);
             $model->variable_value = $item['val'];
             $model->save();
         }
         $node = Models\Node::getByID($server->node);
         $client = Models\Node::guzzleRequest($server->node);
         $client->request('PATCH', '/server', ['headers' => ['X-Access-Server' => $server->uuid, 'X-Access-Token' => $node->daemonSecret], 'json' => ['build' => ['env|overwrite' => $environmentVariables]]]);
         DB::commit();
         return true;
     } catch (\GuzzleHttp\Exception\TransferException $ex) {
         DB::rollBack();
         throw new DisplayException('An error occured while attempting to update the server configuration.', $ex);
     } catch (\Exception $ex) {
         DB::rollBack();
         throw $ex;
     }
 }
Пример #4
0
 /**
  * Updates permissions for a given subuser.
  * @param  integer $id  The ID of the subuser row in MySQL. (Not the user ID)
  * @param  array  $data
  * @throws DisplayValidationException
  * @throws DisplayException
  * @return void
  */
 public function update($id, array $data)
 {
     $validator = Validator::make($data, ['permissions' => 'required|array', 'user' => 'required|exists:users,id', 'server' => 'required|exists:servers,id']);
     if ($validator->fails()) {
         throw new DisplayValidationException(json_encode($validator->all()));
     }
     $subuser = Models\Subuser::findOrFail($id);
     $server = Models\Server::findOrFail($data['server']);
     DB::beginTransaction();
     try {
         Models\Permission::where('user_id', $subuser->user_id)->where('server_id', $subuser->server_id)->delete();
         $daemonPermissions = $this->coreDaemonPermissions;
         foreach ($data['permissions'] as $permission) {
             if (array_key_exists($permission, $this->permissions)) {
                 // Build the daemon permissions array for sending.
                 if (!is_null($this->permissions[$permission])) {
                     array_push($daemonPermissions, $this->permissions[$permission]);
                 }
                 $model = new Models\Permission();
                 $model->fill(['user_id' => $data['user'], 'server_id' => $data['server'], 'permission' => $permission]);
                 $model->save();
             }
         }
         // Contact Daemon
         // We contact even if they don't have any daemon permissions to overwrite
         // if they did have them previously.
         $node = Models\Node::getByID($server->node);
         $client = Models\Node::guzzleRequest($server->node);
         $res = $client->request('PATCH', '/server', ['headers' => ['X-Access-Server' => $server->uuid, 'X-Access-Token' => $node->daemonSecret], 'json' => ['keys' => [$subuser->daemonSecret => $daemonPermissions]]]);
         DB::commit();
         return true;
     } catch (\GuzzleHttp\Exception\TransferException $ex) {
         DB::rollBack();
         throw new DisplayException('There was an error attempting to connect to the daemon to update permissions.', $ex);
     } catch (\Exception $ex) {
         DB::rollBack();
         throw $ex;
     }
     return false;
 }