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をよろしくお願いしまあああああああああああああああす。