123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- package metadata
- import (
- "encoding/json"
- "errors"
- "fmt"
- "io/ioutil"
- "net"
- "net/http"
- )
- const BaseURL = "https://metadata.packet.net"
- func GetMetadata() (*CurrentDevice, error) {
- res, err := http.Get(BaseURL + "/metadata")
- if err != nil {
- return nil, err
- }
- b, err := ioutil.ReadAll(res.Body)
- res.Body.Close()
- if err != nil {
- return nil, err
- }
- var result struct {
- Error string `json:"error"`
- *CurrentDevice
- }
- if err := json.Unmarshal(b, &result); err != nil {
- if res.StatusCode >= 400 {
- return nil, errors.New(res.Status)
- }
- return nil, err
- }
- if result.Error != "" {
- return nil, errors.New(result.Error)
- }
- return result.CurrentDevice, nil
- }
- func GetUserData() ([]byte, error) {
- res, err := http.Get(BaseURL + "/userdata")
- if err != nil {
- return nil, err
- }
- b, err := ioutil.ReadAll(res.Body)
- res.Body.Close()
- return b, err
- }
- type AddressFamily int
- const (
- IPv4 = AddressFamily(4)
- IPv6 = AddressFamily(6)
- )
- type AddressInfo struct {
- ID string `json:"id"`
- Family AddressFamily `json:"address_family"`
- Public bool `json:"public"`
- Management bool `json:"management"`
- Address net.IP `json:"address"`
- NetworkMask net.IP `json:"netmask"`
- Gateway net.IP `json:"gateway"`
- NetworkBits int `json:"cidr"`
- // These are available, but not really needed:
- // Network net.IP `json:"network"`
- }
- type BondingMode int
- const (
- BondingBalanceRR = BondingMode(0)
- BondingActiveBackup = BondingMode(1)
- BondingBalanceXOR = BondingMode(2)
- BondingBroadcast = BondingMode(3)
- BondingLACP = BondingMode(4)
- BondingBalanceTLB = BondingMode(5)
- BondingBalanceALB = BondingMode(6)
- )
- var bondingModeStrings = map[BondingMode]string{
- BondingBalanceRR: "balance-rr",
- BondingActiveBackup: "active-backup",
- BondingBalanceXOR: "balance-xor",
- BondingBroadcast: "broadcast",
- BondingLACP: "802.3ad",
- BondingBalanceTLB: "balance-tlb",
- BondingBalanceALB: "balance-alb",
- }
- func (m BondingMode) String() string {
- if str, ok := bondingModeStrings[m]; ok {
- return str
- }
- return fmt.Sprintf("%d", m)
- }
- type CurrentDevice struct {
- ID string `json:"id"`
- Hostname string `json:"hostname"`
- IQN string `json:"iqn"`
- Plan string `json:"plan"`
- Facility string `json:"facility"`
- Tags []string `json:"tags"`
- SSHKeys []string `json:"ssh_keys"`
- OS OperatingSystem `json:"operating_system"`
- Network NetworkInfo `json:"network"`
- Volumes []VolumeInfo `json:"volume"`
- // This is available, but is actually inaccurate, currently:
- // APIBaseURL string `json:"api_url"`
- }
- type InterfaceInfo struct {
- Name string `json:"name"`
- MAC string `json:"mac"`
- }
- func (i *InterfaceInfo) ParseMAC() (net.HardwareAddr, error) {
- return net.ParseMAC(i.MAC)
- }
- type NetworkInfo struct {
- Interfaces []InterfaceInfo `json:"interfaces"`
- Addresses []AddressInfo `json:"addresses"`
- Bonding struct {
- Mode BondingMode `json:"mode"`
- } `json:"bonding"`
- }
- func (n *NetworkInfo) BondingMode() BondingMode {
- return n.Bonding.Mode
- }
- type OperatingSystem struct {
- Slug string `json:"slug"`
- Distro string `json:"distro"`
- Version string `json:"version"`
- }
- type VolumeInfo struct {
- Name string `json:"name"`
- IQN string `json:"iqn"`
- IPs []net.IP `json:"ips"`
- Capacity struct {
- Size int `json:"size,string"`
- Unit string `json:"unit"`
- } `json:"capacity"`
- }
|