/
fgcmd.go
117 lines (95 loc) · 2.72 KB
/
fgcmd.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
package main
import (
"fmt"
"log"
"os"
"strconv"
"strings"
"github.com/Nexinto/go-fortigate-client/fortigate"
"github.com/docopt/docopt-go"
)
func main() {
usage := `fgcmd - fortigate command line utility
Usage:
fgcmd -h | --help
fgcmd [ -d | --debug ] vip list
fgcmd [ -d | --debug ] vip show <name>
fgcmd [ -d | --debug ] vip delete <name>
fgcmd [ -d | --debug ] vip create <name> <ip>:<port> <realservers>
Options:
-h --help Show this screen.
-d --debug debug
`
opts, err := docopt.ParseDoc(usage)
if err != nil {
panic(err)
}
debug, _ := opts.Bool("--debug")
c, err := fortigate.NewWebClient(fortigate.WebClient{
URL: os.Getenv("FORTIGATE_URL"),
User: os.Getenv("FORTIGATE_USER"),
Password: os.Getenv("FORTIGATE_PASSWORD"),
ApiKey: os.Getenv("FORTIGATE_API_KEY"),
Log: debug})
if err != nil {
panic(err)
}
if b, _ := opts.Bool("vip"); b {
if b, _ := opts.Bool("list"); b {
vips, err := c.ListVIPs()
if err != nil {
log.Fatalf("%s", err.Error())
}
for _, vip := range vips {
fmt.Printf("%-30s %s:%s\n", vip.Name, vip.Extip, vip.Extport)
}
} else if b, _ := opts.Bool("show"); b {
name, _ := opts.String("<name>")
vip, err := c.GetVIP(name)
if err != nil {
log.Fatalf("%s", err.Error())
}
fmt.Printf("VIP Name: %s\nIP: %s\nPort(s): %s\n\nRealservers:\n", vip.Name, vip.Extip, vip.Extport)
for _, rs := range vip.Realservers {
fmt.Printf("%s:%d\n", rs.Ip, rs.Port)
}
} else if b, _ := opts.Bool("delete"); b {
name, _ := opts.String("<name>")
err := c.DeleteVIP(name)
if err != nil {
log.Fatalf("%s", err.Error())
}
} else if b, _ := opts.Bool("create"); b {
name, _ := opts.String("<name>")
vipp, _ := opts.String("<ip>:<port>")
parts := strings.Split(vipp, ":")
extip, extport := parts[0], parts[1]
realserversstr, _ := opts.String("<realservers>")
var realservers []fortigate.VIPRealservers
for _, rs := range strings.Split(realserversstr, ",") {
parts := strings.Split(rs, ":")
rip := parts[0]
rport, err := strconv.Atoi(parts[1])
if err != nil {
log.Fatalf("%s", err.Error())
}
realservers = append(realservers, fortigate.VIPRealservers{Ip: rip, Port: rport})
}
vip := &fortigate.VIP{
Name: name,
Type: fortigate.VIPTypeServerLoadBalance,
LdbMethod: fortigate.VIPLdbMethodRoundRobin,
PortmappingType: fortigate.VIPPortmappingType1To1,
Extintf: "any",
ServerType: fortigate.VIPServerTypeTcp,
Extip: extip,
Extport: extport,
Realservers: realservers,
}
_, err = c.CreateVIP(vip)
if err != nil {
log.Fatalf("%s", err.Error())
}
}
}
}