Da kenne ich mich aktuell noch zu wenig aus und habe zu wenige Ressourcen mich damit zu beschäftigen...
Ich hab da mal was runtergehackt:
PHP
<?php
define('CUSTOMER_NUMBER', ''); // Kundennummer
define('API_KEY', ''); // API-Key
define('API_PASSWORD', ''); // API-Passwort
define('DOMAIN', ''); // Domain, die geupdatet werden soll (z.B. example.com), muss eine Apex-Domain sein
define('TARGET_DOMAIN', ''); // Domain, dessen Records verwendet werden sollen (z.B. dyndns.example.com)
$sessionId = login();
$currentDnsRecords = filterApexDnsRecords(
infoDnsRecords($sessionId)
);
$targetDnsRecords = dns_get_record(TARGET_DOMAIN, DNS_A | DNS_AAAA);
if (recordsChanged($currentDnsRecords, $targetDnsRecords)) {
$updateDnsRecords = getUpdateDnsRecords($currentDnsRecords, $targetDnsRecords);
updateDnsRecords($sessionId, $updateDnsRecords);
}
logout($sessionId);
// Functions
function getUpdateDnsRecords($currentDnsRecords, $targetDnsRecords)
{
$updateDnsRecords = [];
foreach ($currentDnsRecords as $record) {
$record['deleterecord'] = true;
$updateDnsRecords[] = $record;
}
foreach ($targetDnsRecords as $record) {
$updateDnsRecords[] = [
'hostname' => '@',
'type' => $record['type'],
'destination' => $record['type'] === 'A' ? $record['ip'] : $record['ipv6'],
];
}
return $updateDnsRecords;
}
function login()
{
$request = [
'action' => 'login',
'param' => [
'customernumber' => CUSTOMER_NUMBER,
'apikey' => API_KEY,
'apipassword' => API_PASSWORD,
],
];
['apisessionid' => $sessionId] = sendRequest($request);
return $sessionId;
}
function filterApexDnsRecords($dnsRecords)
{
$result = [];
foreach ($dnsRecords as $dnsRecord) {
if ($dnsRecord['hostname'] !== '@') {
continue;
}
if ($dnsRecord['type'] === 'A' || $dnsRecord['type'] === 'AAAA') {
$result[] = $dnsRecord;
}
}
return $result;
}
function recordsChanged($currentDnsRecords, $targetDnsRecords)
{
$current = array_map(fn ($record) => $record['destination'], $currentDnsRecords);
$target = array_map(fn ($record) => $record['ip'] ?? $record['ipv6'], $targetDnsRecords);
sort($current);
sort($target);
return $current !== $target;
}
function infoDnsRecords($sessionId)
{
$request = [
'action' => 'infoDnsRecords',
'param' => [
'domainname' => DOMAIN,
'customernumber' => CUSTOMER_NUMBER,
'apikey' => API_KEY,
'apisessionid' => $sessionId,
],
];
['dnsrecords' => $dnsRecords] = sendRequest($request);
return $dnsRecords;
}
function updateDnsRecords($sessionId, $dnsRecords)
{
$request = [
'action' => 'updateDnsRecords',
'param' => [
'domainname' => DOMAIN,
'customernumber' => CUSTOMER_NUMBER,
'apikey' => API_KEY,
'apisessionid' => $sessionId,
'dnsrecordset' => ['dnsrecords' => $dnsRecords],
],
];
sendRequest($request);
}
function logout($sessionId)
{
$request = [
'action' => 'logout',
'param' => [
'customernumber' => CUSTOMER_NUMBER,
'apikey' => API_KEY,
'apisessionid' => $sessionId,
],
];
sendRequest($request);
}
function sendRequest($requestData)
{
$ch = curl_init('https://ccp.netcup.net/run/webservice/servers/endpoint.php?JSON');
curl_setopt_array($ch, [
CURLOPT_POSTFIELDS => json_encode($requestData),
CURLOPT_HTTPHEADER => ['Content-Type:application/json'],
CURLOPT_RETURNTRANSFER => true,
]);
$rawResult = curl_exec($ch);
curl_close($ch);
$result = json_decode($rawResult, true);
if ($result['status'] !== 'success') {
throw new Error("Error calling action \"{$result['action']}\": {$result['longmessage']}");
}
return $result['responsedata'];
}
Alles anzeigen