Пример #1
0
 /**
  * Retrieves an existing DNS template.
  *
  * ### Response: ###
  *
  * ~~~
  * [
  *      {
  *            "identifier": <string>,
  *            "description": <string>,
  *            "entries": [ {
  *                  "name": <string>,
  *                  "type": <string>,
  *                  "content": <string>,
  *                  "ttl": <int>,
  *                  "priority": <int>
  *            },0..n ]
  *      },0..n
  * ]
  * ~~~
  *
  * ### Errors (request without identifier): ###
  *
  * * 500 - Failed to connect to database or query execution error.
  *
  * ### Errors (request with identifier): ###
  *
  * * 500 - Failed to connect to database or query execution error.
  * * 404 - Could not find template.
  *
  * @access public
  * @param mixed $request Request parameters
  * @param string $identifier Template identifier
  * @return Response DNS template data if successful, error message otherwise.
  */
 public function get($request, $identifier = null)
 {
     $response = new FormattedResponse($request);
     $data = $request->parseData();
     if (empty($identifier)) {
         return TemplateFunctions::get_all_templates($response);
     } else {
         $validator = new TemplateValidator();
         $validator->identifier = $identifier;
         if (!$validator->validates()) {
             $response->code = Response::BADREQUEST;
             $response->error = $validator->getFormattedErrors();
             $response->error_detail = $validator->getErrorDetails();
             return $response;
         }
         return TemplateFunctions::get_template($response, $identifier);
     }
 }
Пример #2
0
 public function create_zone($response, $data, &$out = null)
 {
     ZoneFunctions::get_zone($response, $data->name, $o, false);
     if (!empty($o)) {
         $response->code = Response::CONFLICT;
         $response->error = "Resource already exists";
         $response->error_detail = "ZONE_ALREADY_EXISTS";
         $out = false;
         return $response;
     }
     unset($o);
     $records = array();
     if (isset($data->templates) && !empty($data->templates)) {
         foreach ($data->templates as $template) {
             $response = TemplateFunctions::get_template($response, $template->identifier, $p);
             if (empty($p)) {
                 continue;
             } else {
                 foreach ($p['entries'] as $entry) {
                     $e = new stdClass();
                     $e->name = str_replace(array("[ZONE]"), array($data->name), $entry['name']);
                     $e->content = str_replace(array("[ZONE]"), array($data->name), $entry['content']);
                     $e->type = $entry['type'];
                     $e->ttl = $entry['ttl'];
                     $e->priority = $entry['priority'];
                     $records[] = $e;
                 }
             }
             unset($p);
         }
     }
     if (isset($data->records) && !empty($data->records)) {
         $records = array_merge($records, $data->records);
     }
     try {
         $connection = Database::getConnection();
     } catch (PDOException $e) {
         $response->code = Response::INTERNALSERVERERROR;
         $response->error = "Could not connect to PowerDNS server.";
         $response->error_detail = "INTERNAL_SERVER_ERROR";
         return $response;
     }
     $connection->beginTransaction();
     $zone = $connection->prepare(sprintf("INSERT INTO `%s` (name, type, master) VALUES (:name, :type, :master);", PowerDNSConfig::DB_ZONE_TABLE));
     $zone->bindValue(":name", $data->name);
     $zone->bindValue(":type", strtoupper($data->type));
     if (isset($data->master) && !empty($data->master)) {
         $zone->bindValue(":master", $data->master);
     } else {
         $zone->bindValue(":master", null, PDO::PARAM_NULL);
     }
     if ($zone->execute() === false) {
         $response->code = Response::INTERNALSERVERERROR;
         $response->error = "Rolling back transaction, failed to insert zone.";
         $response->error_detail = "INTERNAL_SERVER_ERROR";
         $connection->rollback();
         $out = false;
         return $response;
     }
     if (!empty($records)) {
         $object = new stdClass();
         $object->records = $records;
         $response = ZoneFunctions::create_records($response, $connection->lastInsertId(), $object, $r, true, $connection);
         if ($r === false) {
             $connection->rollback();
             $out = false;
             return $response;
         }
     }
     $connection->commit();
     $response->code = Response::OK;
     $response->body = true;
     $response->log_message = sprintf("Zone %s was created with %d records.", $data->name, count($records));
     $out = true;
     return $response;
 }
Пример #3
0
 public static function delete_template($response, $identifier, &$out = null)
 {
     $response = TemplateFunctions::get_template($response, $identifier, $o);
     if (empty($o)) {
         $out = false;
         return $response;
     }
     try {
         $connection = Database::getConnection();
     } catch (PDOException $e) {
         $response->code = Response::INTERNALSERVERERROR;
         $response->error = "Could not connect to PowerDNS server.";
         $response->error_detail = "INTERNAL_SERVER_ERROR";
         $out = false;
         return $response;
     }
     $connection->beginTransaction();
     $delete = $connection->prepare(sprintf("DELETE FROM `%s` WHERE %s.name = :name;", PowerDNSConfig::DB_TEMPLATE_TABLE, PowerDNSConfig::DB_TEMPLATE_TABLE));
     if ($delete->execute(array(":name" => $identifier)) === false) {
         $response->code = Response::INTERNALSERVERERROR;
         $response->error = "Rolling back transaction, failed to delete template.";
         $response->error_detail = "TEMPLATE_DELETE_FAILED";
         $connection->rollback();
         $out = false;
         return $response;
     }
     $connection->commit();
     $response->code = Response::OK;
     $response->body = true;
     $response->log_message = sprintf("Template %s was deleted.", $identifier);
     $out = true;
     return $response;
 }