traefik/vendor/github.com/sacloud/libsacloud/sacloud/dns.go
Ludovic Fernandez 139f280f35 ACME TLS ALPN
2018-07-03 12:44:04 +02:00

189 lines
4.6 KiB
Go

package sacloud
import (
"fmt"
"strings"
)
// DNS DNS(CommonServiceItem)
type DNS struct {
*Resource // ID
propName // 名称
propDescription // 説明
propServiceClass // サービスクラス
propIcon // アイコン
propTags // タグ
propCreatedAt // 作成日時
propModifiedAt // 変更日時
Status DNSStatus `json:",omitempty"` // ステータス
Provider DNSProvider `json:",omitempty"` // プロバイダ
Settings DNSSettings `json:",omitempty"` // 設定
}
// DNSSettings DNS設定リスト
type DNSSettings struct {
DNS DNSRecordSets `json:",omitempty"` // DNSレコード設定リスト
}
// DNSStatus DNSステータス
type DNSStatus struct {
Zone string `json:",omitempty"` // 対象ゾーン
NS []string `json:",omitempty"` // ネームサーバーリスト
}
// DNSProvider プロバイダ
type DNSProvider struct {
Class string `json:",omitempty"` // クラス
}
// CreateNewDNS DNS作成
func CreateNewDNS(zoneName string) *DNS {
return &DNS{
Resource: &Resource{},
propName: propName{Name: zoneName},
Status: DNSStatus{
Zone: zoneName,
},
Provider: DNSProvider{
Class: "dns",
},
Settings: DNSSettings{
DNS: DNSRecordSets{},
},
}
}
// AllowDNSTypes DNSレコード種別リスト
func AllowDNSTypes() []string {
return []string{"A", "AAAA", "CNAME", "NS", "MX", "TXT", "SRV"}
}
// SetZone DNSゾーン名 設定
func (d *DNS) SetZone(zone string) {
d.Name = zone
d.Status.Zone = zone
}
// HasDNSRecord DNSレコード設定を保持しているか判定
func (d *DNS) HasDNSRecord() bool {
return len(d.Settings.DNS.ResourceRecordSets) > 0
}
// CreateNewRecord DNSレコード作成(汎用)
func (d *DNS) CreateNewRecord(name string, rtype string, rdata string, ttl int) *DNSRecordSet {
return &DNSRecordSet{
// Name
Name: name,
// Type
Type: rtype,
// RData
RData: rdata,
// TTL
TTL: ttl,
}
}
// CreateNewMXRecord DNSレコード作成(MXレコード)
func (d *DNS) CreateNewMXRecord(name string, rdata string, ttl int, priority int) *DNSRecordSet {
if rdata != "" && !strings.HasSuffix(rdata, ".") {
rdata = rdata + "."
}
return &DNSRecordSet{
// Name
Name: name,
// Type
Type: "MX",
// RData
RData: fmt.Sprintf("%d %s", priority, rdata),
// TTL
TTL: ttl,
}
}
// CreateNewSRVRecord DNSレコード作成(SRVレコード)
func (d *DNS) CreateNewSRVRecord(name string, rdata string, ttl int, priority int, weight int, port int) *DNSRecordSet {
return &DNSRecordSet{
// Name
Name: name,
// Type
Type: "SRV",
// RData
RData: fmt.Sprintf("%d %d %d %s", priority, weight, port, rdata),
// TTL
TTL: ttl,
}
}
// AddRecord レコードの追加
func (d *DNS) AddRecord(record *DNSRecordSet) {
var recordSet = d.Settings.DNS.ResourceRecordSets
var isExist = false
for i := range recordSet {
if recordSet[i].Name == record.Name && recordSet[i].Type == record.Type && recordSet[i].RData == record.RData {
d.Settings.DNS.ResourceRecordSets[i].TTL = record.TTL
isExist = true
}
}
if !isExist {
d.Settings.DNS.ResourceRecordSets = append(d.Settings.DNS.ResourceRecordSets, *record)
}
}
// ClearRecords レコード クリア
func (d *DNS) ClearRecords() {
d.Settings.DNS = DNSRecordSets{}
}
// DNSRecordSets DNSレコード設定リスト
type DNSRecordSets struct {
// ResourceRecordSets DNSレコード設定リスト
ResourceRecordSets []DNSRecordSet
}
// AddDNSRecordSet ホスト名とIPアドレスにてAレコードを登録
func (d *DNSRecordSets) AddDNSRecordSet(name string, ip string) {
var record DNSRecordSet
var isExist = false
for i := range d.ResourceRecordSets {
if d.ResourceRecordSets[i].Name == name && d.ResourceRecordSets[i].Type == "A" {
d.ResourceRecordSets[i].RData = ip
isExist = true
}
}
if !isExist {
record = DNSRecordSet{
// Name
Name: name,
// Type
Type: "A",
// RData
RData: ip,
}
d.ResourceRecordSets = append(d.ResourceRecordSets, record)
}
}
// DeleteDNSRecordSet ホスト名とIPアドレスにてAレコードを削除する
func (d *DNSRecordSets) DeleteDNSRecordSet(name string, ip string) {
res := []DNSRecordSet{}
for i := range d.ResourceRecordSets {
if d.ResourceRecordSets[i].Name != name || d.ResourceRecordSets[i].Type != "A" || d.ResourceRecordSets[i].RData != ip {
res = append(res, d.ResourceRecordSets[i])
}
}
d.ResourceRecordSets = res
}
// DNSRecordSet DNSレコード設定
type DNSRecordSet struct {
Name string `json:",omitempty"` // ホスト名
Type string `json:",omitempty"` // レコードタイプ
RData string `json:",omitempty"` // レコードデータ
TTL int `json:",omitempty"` // TTL
}