Skip to content
This repository has been archived by the owner on May 6, 2019. It is now read-only.
/ DNS-Parser Public archive

This library parses BIND zone files and outputs DNS objects.

License

Notifications You must be signed in to change notification settings

Badcow/DNS-Parser

Repository files navigation

!! Code-base has been moved !!

The DNS Parser has been incorporated into Badcow DNS Zone Library to enable a better release cycle. The namespaces remain unchanged. You only need to include badcow/dns in your composer config.

Badcow DNS Zone Parser

This library parses DNS zone files and outputs DNS objects (see Badcow DNS Zone Library)

Build Status

Build Status Code Coverage Scrutinizer Code Quality

Usage

$file = file_get_contents('/path/to/example.com.txt');

$zone = Badcow\DNS\Parser\Parser::parse('example.com.', $file);

Simple as that.

Installation

Using composer...

"require": {
        "badcow/dns-parser": "~1.0"
    }

Example

BIND Record

$ORIGIN example.com.
$TTL 3600
@            IN SOA  (
                     example.com.       ; MNAME
                     post.example.com.  ; RNAME
                     2014110501         ; SERIAL
                     3600               ; REFRESH
                     14400              ; RETRY
                     604800             ; EXPIRE
                     3600               ; MINIMUM
                     )

 ; NS RECORDS
@               NS   ns1.nameserver.com.
@               NS   ns2.nameserver.com.

info            TXT "This is some additional \"information\""

 ; A RECORDS
sub.domain      A    192.168.1.42 ; This is a local ip.

 ; AAAA RECORDS
ipv6.domain    AAAA ::1 ; This is an IPv6 domain.

 ; MX RECORDS
@               MX   10 mail-gw1.example.net.
@               MX   20 mail-gw2.example.net.
@               MX   30 mail-gw3.example.net.

mail     IN     TXT  "THIS IS SOME TEXT; WITH A SEMICOLON"

Processing the record

<?php

require_once '/path/to/vendor/autoload.php';

$file = file_get_contents('/path/to/example.com.txt');
$zone = Badcow\DNS\Parser\Parser::parse('example.com.', $file);

$zone->getName(); //Returns example.com.
foreach ($zone->getResourceRecords() as $record) {
    $record->getName();
    $record->getClass();
    $record->getTtl();
    $record->getRdata()->output();
}

Using Custom RData Handlers

Out-of-the-box, the library will handle most RData types that are regularly encountered. Occasionally, you may encounter an unsupported type. You can add your own RData handler method for the record type. For example, you may want to support the non-standard SPF record type, and return a TXT instance.

$spf = function (\ArrayIterator $iterator): Badcow\DNS\Rdata\TXT {
    $string = '';
    while ($iterator->valid()) {
        $string .= $iterator->current() . ' ';
        $iterator->next();
    }
    $string = trim($string, ' "'); //Remove whitespace and quotes

    $spf = new Badcow\DNS\Rdata\TXT;
    $spf->setText($string);

    return $spf;
};

$customHandlers = ['SPF' => $spf];

$record = 'example.com. 7200 IN SPF "v=spf1 a mx ip4:69.64.153.131 include:_spf.google.com ~all"';
$parser = new \Badcow\DNS\Parser\Parser($customHandlers);
$zone = $parser->makeZone('example.com.', $record);

You can also overwrite the default handlers if you wish, as long as your handler method returns an instance of Badcow\DNS\Rdata\RdataInterface.