customize_dns_record.go raw
1 // Copyright 2022-2025 The sacloud/iaas-api-go Authors
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 package iaas
16
17 import (
18 "fmt"
19 "strings"
20
21 "github.com/sacloud/iaas-api-go/types"
22 )
23
24 // Equal 名前/タイプ/値が同じレコードの場合trueを返す
25 func (o *DNSRecord) Equal(r *DNSRecord) bool {
26 return o.Name == r.Name && o.Type == r.Type && o.RData == r.RData
27 }
28
29 // NewDNSRecord レコードを生成して返す
30 func NewDNSRecord(t types.EDNSRecordType, name, rdata string, ttl int) *DNSRecord {
31 switch t {
32 case
33 types.DNSRecordTypes.NS,
34 types.DNSRecordTypes.CNAME,
35 types.DNSRecordTypes.MX,
36 types.DNSRecordTypes.ALIAS,
37 types.DNSRecordTypes.PTR:
38 if rdata != "" && !strings.HasSuffix(rdata, ".") {
39 rdata += "."
40 }
41 }
42
43 return &DNSRecord{
44 Name: name,
45 Type: t,
46 RData: rdata,
47 TTL: ttl,
48 }
49 }
50
51 // MXRecord MXレコード型
52 type MXRecord struct {
53 Name string
54 RData string
55 TTL int
56 Priority int
57 }
58
59 // Type レコードタイプ
60 func (r *MXRecord) Type() types.EDNSRecordType {
61 return types.DNSRecordTypes.MX
62 }
63
64 // ToRecord *DNSRecord型へ変換
65 func (r *MXRecord) ToRecord() *DNSRecord {
66 rdata := r.RData
67 if rdata != "" && !strings.HasSuffix(rdata, ".") {
68 rdata += "."
69 }
70 return &DNSRecord{
71 Name: r.Name,
72 Type: r.Type(),
73 RData: fmt.Sprintf("%d %s", r.Priority, rdata),
74 TTL: r.TTL,
75 }
76 }
77
78 // NewMXRecord MXレコードを生成して返す
79 func NewMXRecord(name, rdata string, ttl, priority int) *DNSRecord {
80 return (&MXRecord{
81 Name: name,
82 RData: rdata,
83 Priority: priority,
84 TTL: ttl,
85 }).ToRecord()
86 }
87
88 // SRVRecord SRVレコード型
89 type SRVRecord struct {
90 Name string
91 RData string
92 TTL int
93 Priority int
94 Weight int
95 Port int
96 }
97
98 // Type レコードタイプ
99 func (r *SRVRecord) Type() types.EDNSRecordType {
100 return types.DNSRecordTypes.SRV
101 }
102
103 // ToRecord *DNSRecordに変換
104 func (r *SRVRecord) ToRecord() *DNSRecord {
105 return &DNSRecord{
106 Name: r.Name,
107 Type: r.Type(),
108 RData: fmt.Sprintf("%d %d %d %s", r.Priority, r.Weight, r.Port, r.RData),
109 TTL: r.TTL,
110 }
111 }
112
113 // NewSRVRecord SRVレコードを生成して返す
114 func NewSRVRecord(name, rdata string, ttl, priority, weight, port int) *DNSRecord {
115 return (&SRVRecord{
116 Name: name,
117 RData: rdata,
118 TTL: ttl,
119 Priority: priority,
120 Weight: weight,
121 Port: port,
122 }).ToRecord()
123 }
124