/
main.go
120 lines (105 loc) · 2.25 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
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
package main
import (
"flag"
"fmt"
"os"
"reflect"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/carterjones/awsinfo/info/elb"
"github.com/carterjones/awsinfo/info/instance"
"github.com/carterjones/awsinfo/info/r53"
)
type matchIPInfoer interface {
Matches(string) bool
IPInfo() string
}
type loader interface {
Load(*session.Session) error
}
func main() {
onlyIPInfo := flag.Bool("ips", false, "if true, only show IP address information")
flag.Parse()
tail := flag.Args()
if len(tail) != 1 {
fmt.Println("usage: awsinfo [-ips] <search-value>")
os.Exit(1)
}
searchValue := tail[0]
// Tell the SDK to load defaults from your ~/.aws/config file.
os.Setenv("AWS_SDK_LOAD_CONFIG", "true")
// Create a new session.
sess, err := session.NewSession()
panicIfErr(err)
var loaders = []loader{
&instance.InfoSlice{},
&elb.InfoSlice{},
&r53.InfoSlice{},
}
for _, l := range loaders {
err = l.Load(sess)
panicIfErr(err)
}
// Print the matches.
for i, l := range loaders {
if i > 0 {
fmt.Println()
}
var matchIPInfoers []matchIPInfoer
switch l.(type) {
case *instance.InfoSlice:
infos := l.(*instance.InfoSlice)
if len(*infos) == 0 {
continue
}
for _, i := range *infos {
matchIPInfoers = append(matchIPInfoers, i)
}
fmt.Println("Instances:")
case *elb.InfoSlice:
infos := l.(*elb.InfoSlice)
if len(*infos) == 0 {
continue
}
for _, i := range *infos {
matchIPInfoers = append(matchIPInfoers, i)
}
fmt.Println("ELBs:")
case *r53.InfoSlice:
infos := l.(*r53.InfoSlice)
if len(*infos) == 0 {
continue
}
for _, i := range *infos {
matchIPInfoers = append(matchIPInfoers, i)
}
fmt.Println("Route53 entries:")
default:
panic("invalid type detected: " + reflect.TypeOf(l).String())
}
justPrintedSomething := false
for _, v := range matchIPInfoers {
if v.Matches(searchValue) {
if justPrintedSomething {
fmt.Println()
}
if *onlyIPInfo {
msg := v.IPInfo()
if msg != "" {
fmt.Print(msg)
justPrintedSomething = true
} else {
justPrintedSomething = false
}
} else {
fmt.Print(v)
justPrintedSomething = true
}
}
}
}
}
func panicIfErr(err error) {
if err != nil {
panic(err)
}
}