Files
ddnsonroute53/public/update.php
Ivan Carlos de Almeida 1c946f5b16
All checks were successful
Build, Push, Publish / Build & Release (push) Successful in 16m52s
bye phar
2025-12-09 22:41:15 -03:00

121 lines
4.4 KiB
PHP

<?php
include '../dbconfig.php';
require '../vendor/autoload.php';
use Aws\Route53\Route53Client;
use Aws\Exception\AwsException;
// Clean up logs older than 30 days
$cleanup_sql = "CALL CleanupOldLogs()";
if ($cleanup_stmt = $link->prepare($cleanup_sql)) {
$cleanup_stmt->execute();
$cleanup_stmt->close();
}
// Extract the hostname and IP from the request
$ddns_fqdn = $_GET['hostname'];
$myip = $_GET['myip'];
$ddns_password = $_SERVER['PHP_AUTH_PW'];
// Validate the request
if (empty($ddns_fqdn) || empty($myip) || empty($ddns_password)) {
die("badauth");
}
// Fetch the DDNS entry from the database
$sql = "SELECT id, ddns_fqdn, ddns_password, last_ipv4, ttl FROM ddns_entries WHERE ddns_fqdn = ? AND ddns_password = ?";
if ($stmt = $link->prepare($sql)) {
$stmt->bind_param("ss", $ddns_fqdn, $ddns_password);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows == 1) {
$stmt->bind_result($id, $ddns_fqdn, $ddns_password, $last_ipv4, $ttl);
$stmt->fetch();
// Check if the IP has changed
if ($last_ipv4 !== $myip) {
// Fetch AWS credentials from the database
$aws_sql = "SELECT region, access_key_id, secret_access_key, hosted_zone_id FROM aws_credentials LIMIT 1";
if ($aws_stmt = $link->prepare($aws_sql)) {
$aws_stmt->execute();
$aws_stmt->store_result();
$aws_stmt->bind_result($region, $access_key_id, $secret_access_key, $hosted_zone_id);
$aws_stmt->fetch();
$aws_stmt->close();
// Initialize the Route53 client
$route53 = new Route53Client([
'version' => 'latest',
'region' => $region,
'credentials' => [
'key' => $access_key_id,
'secret' => $secret_access_key,
],
]);
// Prepare the DNS record update
$changeBatch = [
'Changes' => [
[
'Action' => 'UPSERT',
'ResourceRecordSet' => [
'Name' => $ddns_fqdn,
'Type' => 'A',
'TTL' => $ttl,
'ResourceRecords' => [
[
'Value' => $myip,
],
],
],
],
],
];
try {
// Update the DNS record in Route53
$result = $route53->changeResourceRecordSets([
'HostedZoneId' => $hosted_zone_id,
'ChangeBatch' => $changeBatch,
]);
// Update the database with the new IP
$update_sql = "UPDATE ddns_entries SET last_ipv4 = ?, last_update = NOW() WHERE id = ?";
if ($update_stmt = $link->prepare($update_sql)) {
$update_stmt->bind_param("si", $myip, $id);
$update_stmt->execute();
$update_stmt->close();
}
// Log the action
$action = 'update';
$ip_address = $_SERVER['REMOTE_ADDR'];
$details = "Updated IP: $myip";
$log_sql = "INSERT INTO ddns_logs (ddns_entry_id, action, ip_address, details) VALUES (?, ?, ?, ?)";
if ($log_stmt = $link->prepare($log_sql)) {
$log_stmt->bind_param("isss", $id, $action, $ip_address, $details);
$log_stmt->execute();
$log_stmt->close();
}
echo "good"; // Success
} catch (AwsException $e) {
echo "dnserror"; // DNS update failed
}
} else {
echo "badauth"; // AWS credentials not found
}
} else {
echo "nochg"; // IP hasn't changed
}
} else {
echo "badauth"; // Invalid DDNS credentials
}
$stmt->close();
} else {
echo "badauth"; // Database error
}
$link->close();
?>