/
main.go
87 lines (74 loc) · 1.97 KB
/
main.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
package main
import (
"flag"
"log"
"os"
"strings"
"golang.org/x/net/context"
"golang.org/x/oauth2/google"
"google.golang.org/api/compute/v1"
"github.com/Matts966/kubernetes-cloudflare-syncer/pkg/core"
)
type arrayFlag []string
func (af *arrayFlag) String() string {
return strings.Join(*af, " ")
}
func (af *arrayFlag) Set(value string) error {
*af = append(*af, value)
return nil
}
var options = struct {
Projects arrayFlag
Filters arrayFlag
}{
Projects: strings.Split(os.Getenv("PROJECTS"), ","),
Filters: strings.Split(os.Getenv("FILTERS"), ","),
}
type gcloud_ip_lister struct {
service *compute.Service
}
func (gcloud_ip_lister *gcloud_ip_lister) Setup() {
flag.Var(&options.Projects, "projects", "GCP projects")
flag.Var(&options.Filters, "filters", "instance filters")
log.SetOutput(os.Stdout)
ctx := context.Background()
client, err := google.DefaultClient(ctx, compute.ComputeScope)
if err != nil {
log.Println(err)
os.Exit(1)
}
computeService, err := compute.New(client)
gcloud_ip_lister.service = computeService
}
func (gcloud_ip_lister *gcloud_ip_lister) List() []string {
var ips []string
for _, project := range options.Projects {
zoneListCall := gcloud_ip_lister.service.Zones.List(project)
zoneList, err := zoneListCall.Do()
if err != nil {
log.Println("Error", err)
} else {
for _, zone := range zoneList.Items {
instanceListCall := gcloud_ip_lister.service.Instances.List(project, zone.Name)
instanceListCall.Filter(strings.Join(options.Filters[:], " "))
instanceList, err := instanceListCall.Do()
if err != nil {
log.Println("Error", err)
} else {
for _, instance := range instanceList.Items {
for _, networkInterface := range instance.NetworkInterfaces {
for _, accessConfig := range networkInterface.AccessConfigs {
ips = append(ips, accessConfig.NatIP)
}
}
}
}
}
}
}
return ips
}
func main() {
ip_lister := gcloud_ip_lister{}
core.Main(&ip_lister)
}