Godje.nl

En ik zag dat het goed was.

Update DNS-instellingen met TransIP-API

Voor Godje.nl heb ik mijn domeinregistratie via TransIP geregeld. De hosting doe ik dan zelf thuis, zo heb ik alle vrijheid.
Alleen heb ik thuis geen garantie dat ik een vast IP-adres krijg. Deze kan dus veranderen. Het gevolg hiervan is dat Godje.nl dan niet bereikbaar is. Dat is heel vervelend omdat je hier uiteraard tijd te laat achter komt. Gelukkig heeft TransIP een API waarmee je het DNS-onderhoud kunt automatiseren.

Om het een en ander voor elkaar te krijgen, ben ik gaan op onderzoek uitgegaan en kwam op de website van Niek Jachimowski. Hier stond een script dat ongeveer deed wat ik wilde, echter werd alle data welke je opgeslagen had bij TransIP en die niet overeenkwam met het update-script, bij TransIP verwijderd. Dit leek me niet heel handig, dus dit heb ik aangepast naar de volgende oplossing.

  1. Als eerste is het noodzakelijk om binnen jouw TransIP-omgeving de API te activeren.
  2. Vervolgens moet je een Key Pair maken. Zodra je dit doet krijg je de private key te zien. Dit is de enige keer dat je deze te zien krijgt. Sla deze dus veilig op, deze heb je straks nog nodig. Verder zie je nog een vinkje met de tekst "Whitelisted IP". Dit vinkje zorgt ervoor dat alleen het goedgekeurde IP toegang krijgt tot de API. Bij veel toepassingen is dat heel handig en veilig, echter proberen wij een toepassing te maken die ook werkt als je een nieuw IP van jouw internet-aanbieder toegewezen krijgt. Wij moeten deze dus uitschakelen.
  3. Tenslotte moet je nog de libraries downloaden.
  4. Als laatste kun je onderstaande PHP-script gebruiken om alles aan elkaar te verbinden. Bovenin dit script kun je jouw gegevens invullen (vet gedrukte code), zodat alles voor jouw omgeving werkt.
checkwan.php

function checkwan()
{
    // Locatie TransIP API
    require_once('/libraries/Transip/DomainService.php');

    // Benodigde Instellingen
    define('DOMAIN', '[domeinnaam]');
    define('USERNAME', '[gebruikersnaam]'); // TRANSIP Account
    define('PRIVATE_KEY', '-----BEGIN PRIVATE KEY-----
      [lange code incl. line breaks.]
      <-----END PRIVATE KEY-----
'); // API Key

    // Haalt het externe adres op...
    $ipAddress = file_get_contents('http://ipecho.net/plain');

    // Verbinden met de TransIP API
    Transip_ApiSettings::$login=USERNAME;
    Transip_ApiSettings::$privateKey= PRIVATE_KEY;

    // Huidge DNS records controleren
    $dnsEntries = Transip_DomainService::getInfo(DOMAIN)->dnsEntries;
    date_default_timezone_set('Europe/Amsterdam');
    $update = false;
    $newDnsEntries = array();

    //nieuwe array opbouwen op basis van oude data
    foreach($dnsEntries as $dnsEntry){
      array_push($newDnsEntries, $dnsEntry);
      // @ Wildcard controleren. Als deze verschilt, moeten DNS-instellingen geupdated worden
      if (($dnsEntry->type == Transip_DnsEntry::TYPE_A) && ($dnsEntry->name == '@') && $dnsEntry->content != $ipAddress){
        $dnsEntry->content = $ipAddress;
        $update=true;
      }
    }

    //Als het IP-adres geupdated moet worden
    if ($update == true ){
      try{
        // Voer de update uit...
        Transip_DomainService::setDnsEntries(DOMAIN, $newDnsEntries);
        echo "DNS aangepast.";
      }
      catch(SoapFault $f){
        // Fout?
        echo "Er is iets fout gegaan, DNS is niet geupdated... " . $f->getMessage();
      }
    }
  }