public function delete_records($response, $identifier, $data, &$out = null, $connection = null) { if (!is_object($data) || !isset($data->records)) { $response->code = Response::INTERNALSERVERERROR; $response->error = "Deletion data invalid"; $response->error_detail = "INTERNAL_SERVER_ERROR"; $out = false; return $response; } ZoneFunctions::get_zone($response, $identifier, $o, false, true, true); if (empty($o)) { $out = false; return $response; } if ($o['type'] == "SLAVE") { $response->code = Response::CONFLICT; $response->error = sprintf("Cannot delete records from SLAVE zone %s", $identifier); $response->error_detail = "ZONE_IS_SLAVE"; $out = false; return $response; } $zone_id = $o['z_id']; if (empty($zone_id) || !ctype_digit($zone_id)) { $response->code = Response::INTERNALSERVERERROR; $response->error = "Could not retrieve Zone ID to delete records from" . var_export($o, true); $response->error_detail = "INTERNAL_SERVER_ERROR"; $out = false; return $response; } unset($o); $commit = false; if ($connection === null) { 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(); $commit = true; } $statement = $connection->prepare(sprintf("DELETE FROM `%s` WHERE domain_id = :did AND name = :name AND type = :type AND prio = :priority AND content = :content;", PowerDNSConfig::DB_RECORD_TABLE)); $statement->bindParam(":did", $r_did); $statement->bindParam(":name", $r_name); $statement->bindParam(":type", $r_type); $statement->bindParam(":content", $r_content); $statement->bindParam(":priority", $r_prio); $statement_noprio = $connection->prepare(sprintf("DELETE FROM `%s` WHERE domain_id = :did AND name = :name AND type = :type AND content = :content;", PowerDNSConfig::DB_RECORD_TABLE)); $statement_noprio->bindParam(":did", $r_did); $statement_noprio->bindParam(":name", $r_name); $statement_noprio->bindParam(":type", $r_type); $statement_noprio->bindParam(":content", $r_content); $r_did = $zone_id; foreach ($data->records as $record) { $stmt = $statement_noprio; if (!isset($record->name) || !isset($record->type) || !isset($record->content)) { continue; } if ($record->type == "MX" || $record->type == "SRV") { if (!isset($record->priority)) { continue; } else { $stmt = $statement; } } $r_name = $record->name; $r_type = $record->type; $r_content = $record->content; $r_prio = $record->priority; if ($stmt->execute() === false) { $response->code = Response::INTERNALSERVERERROR; $response->error = sprintf("Rolling back transaction, failed to delete zone record - name: '%s', type: '%s', prio: '%s'", $r_name, $r_type, $r_prio); $response->error_detail = "RECORD_DELETE_FAILED"; if ($commit == true) { $connection->rollback(); } $out = false; return $response; } } if ($commit == true) { $connection->commit(); } $response->code = Response::OK; $response->body = true; $response->log_message = sprintf("Zone %s deleted %d records.", $identifier, count($data->records)); $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; }