189 lines
4.6 KiB
Go
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
|
|
}
|