-
Notifications
You must be signed in to change notification settings - Fork 10
/
google.go
111 lines (93 loc) · 2.67 KB
/
google.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
/*
Copyright (C) 2021-2023, Kubefirst
This program is licensed under MIT.
See the LICENSE file for more details.
*/
package google
import (
"fmt"
"net/http"
"time"
compute "cloud.google.com/go/compute/apiv1"
computepb "cloud.google.com/go/compute/apiv1/computepb"
secretmanager "cloud.google.com/go/secretmanager/apiv1"
"github.com/rs/zerolog/log"
"golang.org/x/oauth2/google"
"google.golang.org/api/iterator"
"google.golang.org/api/option"
)
// GetRegions lists all available regions
func (conf *GoogleConfiguration) GetRegions() ([]string, error) {
var regionList []string
creds, err := google.CredentialsFromJSON(conf.Context, []byte(conf.KeyFile), secretmanager.DefaultAuthScopes()...)
if err != nil {
return nil, fmt.Errorf("could not create google storage client credentials: %s", err)
}
client, err := compute.NewRegionsRESTClient(conf.Context, option.WithCredentials(creds))
if err != nil {
return []string{}, fmt.Errorf("could not create google compute client: %s", err)
}
defer client.Close()
req := &computepb.ListRegionsRequest{
Project: conf.Project,
}
it := client.List(conf.Context, req)
for {
pair, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
return []string{}, err
}
regionList = append(regionList, *pair.Name)
}
return regionList, nil
}
func (conf *GoogleConfiguration) GetZones() ([]string, error) {
var zoneList []string
creds, err := google.CredentialsFromJSON(conf.Context, []byte(conf.KeyFile), secretmanager.DefaultAuthScopes()...)
if err != nil {
return nil, fmt.Errorf("could not create google storage client credentials: %s", err)
}
client, err := compute.NewZonesRESTClient(conf.Context, option.WithCredentials(creds))
if err != nil {
return nil, fmt.Errorf("could not create google compute client: %s", err)
}
defer client.Close()
req := &computepb.ListZonesRequest{
Project: conf.Project,
}
it := client.List(conf.Context, req)
for {
pair, err := it.Next()
if err == iterator.Done {
break
}
if err != nil {
return []string{}, err
}
zoneList = append(zoneList, *pair.Name)
}
return zoneList, nil
}
// GetDomainApexContent determines whether or not a target domain features
// a host responding at zone apex
func GetDomainApexContent(domainName string) bool {
timeout := time.Duration(5 * time.Second)
client := http.Client{
Timeout: timeout,
}
exists := false
for _, proto := range []string{"http", "https"} {
fqdn := fmt.Sprintf("%s://%s", proto, domainName)
_, err := client.Get(fqdn)
if err != nil {
log.Warn().Msgf("domain %s has no apex content", fqdn)
} else {
log.Info().Msgf("domain %s has apex content", fqdn)
exists = true
}
}
return exists
}