forked from hashicorp/terraform-provider-google-beta
/
data_source_google_netblock_ip_ranges.go
128 lines (98 loc) · 3.22 KB
/
data_source_google_netblock_ip_ranges.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package google
import (
"fmt"
"github.com/hashicorp/terraform/helper/schema"
"io/ioutil"
"net/http"
"strings"
)
func dataSourceGoogleNetblockIpRanges() *schema.Resource {
return &schema.Resource{
Read: dataSourceGoogleNetblockIpRangesRead,
Schema: map[string]*schema.Schema{
"cidr_blocks": {
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
"cidr_blocks_ipv4": {
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
"cidr_blocks_ipv6": {
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
},
}
}
func dataSourceGoogleNetblockIpRangesRead(d *schema.ResourceData, meta interface{}) error {
d.SetId("netblock-ip-ranges")
// https://cloud.google.com/compute/docs/faq#where_can_i_find_product_name_short_ip_ranges
CidrBlocks, err := getCidrBlocks()
if err != nil {
return err
}
d.Set("cidr_blocks", CidrBlocks["cidr_blocks"])
d.Set("cidr_blocks_ipv4", CidrBlocks["cidr_blocks_ipv4"])
d.Set("cidr_blocks_ipv6", CidrBlocks["cidr_blocks_ipv6"])
return nil
}
func netblock_request(name string) (string, error) {
const DNS_URL = "https://dns.google.com/resolve?name=%s&type=TXT"
response, err := http.Get(fmt.Sprintf("https://dns.google.com/resolve?name=%s&type=TXT", name))
if err != nil {
return "", fmt.Errorf("Error from _cloud-netblocks: %s", err)
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
return "", fmt.Errorf("Error to retrieve the domains list: %s", err)
}
return string(body), nil
}
func getCidrBlocks() (map[string][]string, error) {
const INITIAL_NETBLOCK_DNS = "_cloud-netblocks.googleusercontent.com"
var dnsNetblockList []string
cidrBlocks := make(map[string][]string)
response, err := netblock_request(INITIAL_NETBLOCK_DNS)
if err != nil {
return nil, err
}
splitedResponse := strings.Split(string(response), " ")
for _, sp := range splitedResponse {
if strings.HasPrefix(sp, "include:") {
dnsNetblock := strings.Replace(sp, "include:", "", 1)
dnsNetblockList = append(dnsNetblockList, dnsNetblock)
}
}
for len(dnsNetblockList) > 0 {
dnsNetblock := dnsNetblockList[0]
dnsNetblockList[0] = ""
dnsNetblockList = dnsNetblockList[1:len(dnsNetblockList)]
response, err = netblock_request(dnsNetblock)
if err != nil {
return nil, err
}
splitedResponse = strings.Split(string(response), " ")
for _, sp := range splitedResponse {
if strings.HasPrefix(sp, "ip") {
cdrBlock := strings.Split(sp, ":")[1]
cidrBlocks["cidr_blocks"] = append(cidrBlocks["cidr_blocks"], cdrBlock)
if strings.HasPrefix(sp, "ip4") {
cdrBlock := strings.Replace(sp, "ip4:", "", 1)
cidrBlocks["cidr_blocks_ipv4"] = append(cidrBlocks["cidr_blocks_ipv4"], cdrBlock)
} else if strings.HasPrefix(sp, "ip6") {
cdrBlock := strings.Replace(sp, "ip6:", "", 1)
cidrBlocks["cidr_blocks_ipv6"] = append(cidrBlocks["cidr_blocks_ipv6"], cdrBlock)
}
} else if strings.HasPrefix(sp, "include:") {
cidr_block := strings.Replace(sp, "include:", "", 1)
dnsNetblockList = append(dnsNetblockList, cidr_block)
}
}
}
return cidrBlocks, nil
}