/** * 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); } }
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; }
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; }