forked from TrueCloudLab/lego
193 lines
4.6 KiB
Go
193 lines
4.6 KiB
Go
|
package lib
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net/url"
|
||
|
"sort"
|
||
|
)
|
||
|
|
||
|
// IPv4 information of a virtual machine
|
||
|
type IPv4 struct {
|
||
|
IP string `json:"ip"`
|
||
|
Netmask string `json:"netmask"`
|
||
|
Gateway string `json:"gateway"`
|
||
|
Type string `json:"type"`
|
||
|
ReverseDNS string `json:"reverse"`
|
||
|
}
|
||
|
|
||
|
type ipv4s []IPv4
|
||
|
|
||
|
func (s ipv4s) Len() int { return len(s) }
|
||
|
func (s ipv4s) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||
|
func (s ipv4s) Less(i, j int) bool {
|
||
|
// sort order: type, ip
|
||
|
if s[i].Type < s[j].Type {
|
||
|
return true
|
||
|
} else if s[i].Type > s[j].Type {
|
||
|
return false
|
||
|
}
|
||
|
return s[i].IP < s[j].IP
|
||
|
}
|
||
|
|
||
|
// IPv6 information of a virtual machine
|
||
|
type IPv6 struct {
|
||
|
IP string `json:"ip"`
|
||
|
Network string `json:"network"`
|
||
|
NetworkSize string `json:"network_size"`
|
||
|
Type string `json:"type"`
|
||
|
}
|
||
|
|
||
|
type ipv6s []IPv6
|
||
|
|
||
|
func (s ipv6s) Len() int { return len(s) }
|
||
|
func (s ipv6s) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||
|
func (s ipv6s) Less(i, j int) bool {
|
||
|
// sort order: type, ip
|
||
|
if s[i].Type < s[j].Type {
|
||
|
return true
|
||
|
} else if s[i].Type > s[j].Type {
|
||
|
return false
|
||
|
}
|
||
|
return s[i].IP < s[j].IP
|
||
|
}
|
||
|
|
||
|
// ReverseDNSIPv6 information of a virtual machine
|
||
|
type ReverseDNSIPv6 struct {
|
||
|
IP string `json:"ip"`
|
||
|
ReverseDNS string `json:"reverse"`
|
||
|
}
|
||
|
|
||
|
type reverseDNSIPv6s []ReverseDNSIPv6
|
||
|
|
||
|
func (s reverseDNSIPv6s) Len() int { return len(s) }
|
||
|
func (s reverseDNSIPv6s) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||
|
func (s reverseDNSIPv6s) Less(i, j int) bool { return s[i].IP < s[j].IP }
|
||
|
|
||
|
// ListIPv4 lists the IPv4 information of a virtual machine
|
||
|
func (c *Client) ListIPv4(id string) (list []IPv4, err error) {
|
||
|
var ipMap map[string][]IPv4
|
||
|
if err := c.get(`server/list_ipv4?SUBID=`+id, &ipMap); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
for _, iplist := range ipMap {
|
||
|
for _, ip := range iplist {
|
||
|
list = append(list, ip)
|
||
|
}
|
||
|
}
|
||
|
sort.Sort(ipv4s(list))
|
||
|
return list, nil
|
||
|
}
|
||
|
|
||
|
// CreateIPv4 creates an IPv4 address and attaches it to a virtual machine
|
||
|
func (c *Client) CreateIPv4(id string, reboot bool) error {
|
||
|
values := url.Values{
|
||
|
"SUBID": {id},
|
||
|
"reboot": {fmt.Sprintf("%t", reboot)},
|
||
|
}
|
||
|
|
||
|
if err := c.post(`server/create_ipv4`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// DeleteIPv4 deletes an IPv4 address and detaches it from a virtual machine
|
||
|
func (c *Client) DeleteIPv4(id, ip string) error {
|
||
|
values := url.Values{
|
||
|
"SUBID": {id},
|
||
|
"ip": {ip},
|
||
|
}
|
||
|
|
||
|
if err := c.post(`server/destroy_ipv4`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// ListIPv6 lists the IPv4 information of a virtual machine
|
||
|
func (c *Client) ListIPv6(id string) (list []IPv6, err error) {
|
||
|
var ipMap map[string][]IPv6
|
||
|
if err := c.get(`server/list_ipv6?SUBID=`+id, &ipMap); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
for _, iplist := range ipMap {
|
||
|
for _, ip := range iplist {
|
||
|
list = append(list, ip)
|
||
|
}
|
||
|
}
|
||
|
sort.Sort(ipv6s(list))
|
||
|
return list, nil
|
||
|
}
|
||
|
|
||
|
// ListIPv6ReverseDNS lists the IPv6 reverse DNS entries of a virtual machine
|
||
|
func (c *Client) ListIPv6ReverseDNS(id string) (list []ReverseDNSIPv6, err error) {
|
||
|
var ipMap map[string][]ReverseDNSIPv6
|
||
|
if err := c.get(`server/reverse_list_ipv6?SUBID=`+id, &ipMap); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
for _, iplist := range ipMap {
|
||
|
for _, ip := range iplist {
|
||
|
list = append(list, ip)
|
||
|
}
|
||
|
}
|
||
|
sort.Sort(reverseDNSIPv6s(list))
|
||
|
return list, nil
|
||
|
}
|
||
|
|
||
|
// DeleteIPv6ReverseDNS removes a reverse DNS entry for an IPv6 address of a virtual machine
|
||
|
func (c *Client) DeleteIPv6ReverseDNS(id string, ip string) error {
|
||
|
values := url.Values{
|
||
|
"SUBID": {id},
|
||
|
"ip": {ip},
|
||
|
}
|
||
|
|
||
|
if err := c.post(`server/reverse_delete_ipv6`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// SetIPv6ReverseDNS sets a reverse DNS entry for an IPv6 address of a virtual machine
|
||
|
func (c *Client) SetIPv6ReverseDNS(id, ip, entry string) error {
|
||
|
values := url.Values{
|
||
|
"SUBID": {id},
|
||
|
"ip": {ip},
|
||
|
"entry": {entry},
|
||
|
}
|
||
|
|
||
|
if err := c.post(`server/reverse_set_ipv6`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// DefaultIPv4ReverseDNS sets a reverse DNS entry for an IPv4 address of a virtual machine to the original setting
|
||
|
func (c *Client) DefaultIPv4ReverseDNS(id, ip string) error {
|
||
|
values := url.Values{
|
||
|
"SUBID": {id},
|
||
|
"ip": {ip},
|
||
|
}
|
||
|
|
||
|
if err := c.post(`server/reverse_default_ipv4`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// SetIPv4ReverseDNS sets a reverse DNS entry for an IPv4 address of a virtual machine
|
||
|
func (c *Client) SetIPv4ReverseDNS(id, ip, entry string) error {
|
||
|
values := url.Values{
|
||
|
"SUBID": {id},
|
||
|
"ip": {ip},
|
||
|
"entry": {entry},
|
||
|
}
|
||
|
|
||
|
if err := c.post(`server/reverse_set_ipv4`, values, nil); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|