public function modify_zone($response, $identifier, $data, &$out = null) { ZoneFunctions::get_zone($response, $identifier, $o, false); if (empty($o)) { $out = false; return $response; } unset($o); try { $connection = Database::getConnection(); $connection->beginTransaction(); } 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; } $parameters = array(); $query = "UPDATE `%s` SET "; $q = array(); if (isset($data->name)) { $q[] = "name = :name"; $parameters[":name"] = $data->name; } if (isset($data->master)) { $q[] = "master = :master"; $parameters[":master"] = $data->master; } if (isset($data->type)) { $q[] = "type = :type"; $parameters[":type"] = $data->type; } if (empty($parameters) && !isset($data->records)) { $response->code = Response::BADREQUEST; $response->error = "Nothing to change, check your request body."; $response->error_detail = "ZONE_NO_CHANGES"; $out = false; return $response; } if (!empty($parameters)) { $query .= implode(", ", $q); $query .= " WHERE name = :identifier"; $parameters[":identifier"] = $identifier; $statement = $connection->prepare(sprintf($query, PowerDNSConfig::DB_ZONE_TABLE)); if ($statement->execute($parameters) === false) { $response->code = Response::INTERNALSERVERERROR; $response->error = "Rolling back transaction, failed to modify zone."; $response->error_detail = "ZONE_MODIFY_FAILED"; $connection->rollback(); $out = false; return $response; } } if (isset($data->records)) { $deletions = array(); $additions = array(); foreach ($data->records as $record) { if (isset($record->mode) && $record->mode == "delete") { $deletions[] = $record; } else { $additions[] = $record; } } if (!empty($deletions)) { $obj = new StdClass(); $obj->records = $deletions; ZoneFunctions::delete_records($response, $identifier, $obj, $out, $connection); if (!$out) { $connection->rollback(); $out = false; return $response; } unset($obj); } if (!empty($additions)) { $obj = new StdClass(); $obj->records = $additions; ZoneFunctions::create_records($response, $identifier, $obj, $out, true, $connection); if (!$out) { $connection->rollback(); $out = false; return $response; } unset($obj); } } $connection->commit(); $response->code = Response::OK; $response->body = true; if (isset($data->records)) { $response->log_message = sprintf("Zone %s was modified, deleted %d records and added %d records.", $identifier, count($deletions), count($additions)); } else { $response->log_message = sprintf("Zone %s was modified.", $identifier); } $out = true; return $response; }
/** * Delete an existing DNS zone, or delete a record from the zone. * * If an identifier is specified, the entire zone will be deleted. * * ### Response: ### * * ~~~ * true * ~~~ * * If a body is specified, but no identifier, the specified entries will be deleted from the zone. * * ### Request: ### * * ~~~ * { * "name": <string>, * "records": [ { * "name": <string>, * "type": <string>, * "content": <string>, * "priority": <int> * },1..n ] * } * ~~~ * * ### Response: ### * * ~~~ * true * ~~~ * * ### Errors (request without identifier): ### * * * 508 - Invalid request, missing required parameters or input validation failed. * * 500 - Failed to connect to database or query execution error. * * 409 - Cannot delete records from a SLAVE zone. * * 404 - Could not find zone. * * ### Errors (request with identifier): ### * * * 508 - Invalid request, missing required parameters or input validation failed. * * 500 - Failed to connect to database or query execution error. * * 404 - Could not find zone. * * @access public * @param mixed $request Request parameters * @param string $identifier Zone identifier * @return Response True if zone was deleted, error message otherwise. */ public function delete($request, $identifier = null) { $response = new FormattedResponse($request); $data = $request->parseData(); if (empty($identifier) && (empty($data) || !isset($data->name) || !isset($data->records) || empty($data->records))) { $response->code = Response::BADREQUEST; $response->error = "Identifier and/or records were missing or invalid. Ensure that the body is in valid format and all required parameters are present."; $response->error_detail = "MISSING_REQUIRED_PARAMETERS"; return $response; } $validator = new ZoneValidator($data); $validator->mode_override = "delete"; if (!empty($identifier)) { $validator->identifier = $identifier; } if (!$validator->validates()) { $response->code = Response::BADREQUEST; $response->error = $validator->getFormattedErrors(); $response->error_detail = $validator->getErrorDetails(); return $response; } if (!empty($identifier)) { return ZoneFunctions::delete_zone($response, $identifier); } else { return ZoneFunctions::delete_records($response, $data->name, $data); } }
public function delete_arpa($response, $identifier, &$out = null) { ArpaFunctions::get_arpa($response, $identifier, $o, true); if (empty($o)) { $out = false; return $response; } $record = new stdClass(); $record->name = $o['name']; $record->type = "PTR"; $record->content = $o['reverse_dns']; $record->priority = $o['priority']; $req = new stdClass(); $req->records = array($record); $response = ZoneFunctions::delete_records($response, $o['arpa_zone'], $req, $o); if (empty($o)) { $out = false; return $response; } $response->code = Response::OK; $response->body = true; $response->log_message = sprintf("Deleted Arpa record for IP %s", $identifier); $out = true; return $response; }