開発

Gehirn DNS、BINDのゾーンファイル インポート/エクスポートに対応

2011年12月13日

Gehirn DNSですが、要望がありましたのでBINDのゾーンファイルのインポート/エクスポートに対応しました。

コンパネ対応編から見たい方はこちらからどうぞ

APIからは

GET https://dns.gehirn.jp/api/domain/{DomainID OR DomainName}/export
POST https://dns.gehirn.jp/api/domain/{DomainID OR DomainName}/import/confirm
PUT https://dns.gehirn.jp/api/domain/{DomainID OR DomainName}/import

でアクセスできます。

GET https://dns.gehirn.jp/api/domain/testdomain.com/export

すると、text/plain形式でレスポンスが返ってきます。BINDのゾーンファイルそのものです。

@                       IN SOA  ns1.gehirn.jp. isidai.isid.ai. (
                                1323779297; serial
                                300; refresh
                                900; retry 
                                86400; expire
                                300; minimum
                                )
$TTL 3600
$ORIGIN testdomain.com.
@			IN	NS		ns1.securedns.jp.
@			IN	NS		ns2.securedns.jp.
@			IN	NS		ns3.securedns.jp.
@			IN	NS		ns4.securedns.jp.
@			IN	MX	1	ASPMX.L.GOOGLE.COM.
@			IN	MX	5	ALT1.ASPMX.L.GOOGLE.COM.
@			IN	MX	5	ALT2.ASPMX.L.GOOGLE.COM.
@			IN	MX	10	ASPMX2.GOOGLEMAIL.COM.
@			IN	MX	10	ASPMX3.GOOGLEMAIL.COM.
@			IN	MX	10	ASPMX4.GOOGLEMAIL.COM.
@			IN	MX	10	ASPMX5.GOOGLEMAIL.COM.
googleffffffffaa0dd2cf			IN	CNAME		google.com.
mail			IN	CNAME		ghs.google.com.
@			IN	A		59.106.181.198
www			IN	A		163.43.140.10
ext			IN	A		59.106.181.198
dl			IN	A		59.106.181.198
@			IN	TXT		"v=spf1 include:aspmx.googlemail.com ~all"

インポートは

POST https://dns.gehirn.jp/api/domain/testdomain.com/import/confirm

で実際にインポートする前に確認できます。

《リクエスト》

Content-Type: application/x-www-form-urlencoded

data=%40%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IN%20SOA%20%20ns1.gehirn.jp.%20isidai.isid.ai.%20%28%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201323779297%3B%20serial%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20300%3B%20refresh%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20900%3B%20retry%20%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2086400%3B%20expire%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20300%3B%20minimum%0D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%29%0D%0A%24TTL%203600%0D%0A%24ORIGIN%20testdomain.com.%0D%0A%40%09%09%09IN%09NS%09%09ns1.securedns.jp.%0D%0A%40%09%09%09IN%09NS%09%09ns2.securedns.jp.%0D%0A%40%09%09%09IN%09NS%09%09ns3.securedns.jp.%0D%0A%40%09%09%09IN%09NS%09%09ns4.securedns.jp.%0D%0A%40%09%09%09IN%09MX%091%09ASPMX.L.GOOGLE.COM.%0D%0A%40%09%09%09IN%09MX%095%09ALT1.ASPMX.L.GOOGLE.COM.%0D%0A%40%09%09%09IN%09MX%095%09ALT2.ASPMX.L.GOOGLE.COM.%0D%0A%40%09%09%09IN%09MX%0910%09ASPMX2.GOOGLEMAIL.COM.%0D%0A%40%09%09%09IN%09MX%0910%09ASPMX3.GOOGLEMAIL.COM.%0D%0A%40%09%09%09IN%09MX%0910%09ASPMX4.GOOGLEMAIL.COM.%0D%0A%40%09%09%09IN%09MX%0910%09ASPMX5.GOOGLEMAIL.COM.%0D%0Agoogleffffffffaa0dd2cf%09%09%09IN%09CNAME%09%09google.com.%0D%0Amail%09%09%09IN%09CNAME%09%09ghs.google.com.%0D%0A%40%09%09%09IN%09A%09%0959.106.181.198%0D%0Awww%09%09%09IN%09A%09%09163.43.140.10%0D%0Aext%09%09%09IN%09A%09%0959.106.181.198%0D%0Adl%09%09%09IN%09A%09%0959.106.181.198%0D%0A%40%09%09%09IN%09TXT%09%09%22v%3Dspf1%20include%3Aaspmx.googlemail.com%20~all%22

のような感じです。

そうするとAnalyzedとして値が返ってきます。

{
    "Analyzed": [{
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "NameServer": "ns1.securedns.jp.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "NS"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "NameServer": "ns2.securedns.jp.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "NS"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "NameServer": "ns3.securedns.jp.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "NS"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "NameServer": "ns4.securedns.jp.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "NS"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Priority": 1,
            "MailServer": "ASPMX.L.GOOGLE.COM.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "MX"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Priority": 5,
            "MailServer": "ALT1.ASPMX.L.GOOGLE.COM.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "MX"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Priority": 5,
            "MailServer": "ALT2.ASPMX.L.GOOGLE.COM.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "MX"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Priority": 10,
            "MailServer": "ASPMX2.GOOGLEMAIL.COM.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "MX"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Priority": 10,
            "MailServer": "ASPMX3.GOOGLEMAIL.COM.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "MX"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Priority": 10,
            "MailServer": "ASPMX4.GOOGLEMAIL.COM.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "MX"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Priority": 10,
            "MailServer": "ASPMX5.GOOGLEMAIL.COM.",
            "HostName": "@",
            "TTL": 3600,
            "Type": "MX"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "AliasTo": "google.com.",
            "HostName": "googleffffffffaa0dd2cf",
            "TTL": 3600,
            "Type": "CNAME"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "AliasTo": "ghs.google.com.",
            "HostName": "mail",
            "TTL": 3600,
            "Type": "CNAME"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "IPAddress": "59.106.181.198",
            "HostName": "@",
            "TTL": 3600,
            "Type": "A"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "IPAddress": "163.43.140.10",
            "HostName": "www",
            "TTL": 3600,
            "Type": "A"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "IPAddress": "59.106.181.198",
            "HostName": "ext",
            "TTL": 3600,
            "Type": "A"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "IPAddress": "59.106.181.198",
            "HostName": "dl",
            "TTL": 3600,
            "Type": "A"
        }
    }, {
        "Domain": {
            "ID": 229,
            "Name": "testdomain.com."
        },
        "Resource": {
            "Value": "v=spf1 include:aspmx.googlemail.com ~all",
            "HostName": "@",
            "TTL": 3600,
            "Type": "TXT"
        }
    }],
    "is_success": true
}

先ほどPOSTした内容(application/x-www-form-urlencoded, data=****)そのままに

PUT https://dns.gehirn.jp/api/domain/testdomain.com/import

すれば、ドメインのリソースレコードがすべて削除され、渡したゾーンファイルの情報に置き換えられます。既存のリソースレコードは消えてしまうのでご注意ください。

ちなみに、SOAレコードだけを残して他のリソースレコードをすべて消すには

DELETE https://dns.gehirn.jp/api/domain/{DomainID OR DomainName}/Resources

でリクエストします。空になるのでリセットできます。

また、BINDのファイルを一括で適用させたいとき、もしくは定期的に適用したいときにはcurlコマンドから送ってやると楽です。
例:

curl -X PUT --basic --user TOKEN:SECRET --data-binary 'data=@/tmp/isidai.com.zone' https://dns.gehirn.jp/api/domain/isidai.com/import

data=@ の後ろにはファイルのパスを書いてください。 また、APIのURIは domain/{DomainID OR DomainName}/import に適時置き換えてください。
こうすることで直接ゾーンファイルを送りつけて適用することができます。定期的に送ることでスレーブサーバみたいな動かし方ができそうですね。

for i in `ls *.zone|sed -e 's/\.zone$//'`
 do
  curl -X PUT --basic --user TOKEN:SECRET --data-binary "data=@/var/cache/bind/$i.zone" https://dns.gehirn.jp/api/domain/$i/import
 done

これでゾーンファイルを一括転送できます。
なお、これをやる前に予めGehirn DNS側でドメインのゾーンを登録(作成)しておく必要があります。ドメインゾーンを登録していないと404エラーになりますのでご注意ください。

で、APIだとくっそ面倒なので、コンパネからもできますwwww←先に言えよ

各ドメインのリソースページの下部にリンクがあります。

ちなみに、

$ORIGIN ******

なんかに別なドメインが入ってるとエラーになりますのでご注意ください。

ますます便利になった(はずの)Gehirn DNSをよろしくお願いしまあああああああああああああああす。

Pocket

You Might Also Like