68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package structfs
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"net/http"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| type DigitalOceanMetadata struct {
 | |
| 	Metadata struct {
 | |
| 		V1 struct {
 | |
| 			DropletID  int64    `json:"droplet_id"`
 | |
| 			Hostname   string   `json:"hostname"`
 | |
| 			VendorData string   `json:"vendor_data"`
 | |
| 			PublicKeys []string `json:"public_keys"`
 | |
| 			Region     string   `json:"region"`
 | |
| 			Interfaces struct {
 | |
| 				Private []struct {
 | |
| 					IPv4 struct {
 | |
| 						Address string `json:"ip_address"`
 | |
| 						Netmask string `json:"netmask"`
 | |
| 						Gateway string `json:"gateway"`
 | |
| 					}
 | |
| 					Mac  string `json:"mac"`
 | |
| 					Type string `json:"type"`
 | |
| 				} `json:"private"`
 | |
| 				Public []struct {
 | |
| 					IPv4 struct {
 | |
| 						Address string `json:"ip_address"`
 | |
| 						Netmask string `json:"netmask"`
 | |
| 						Gateway string `json:"gateway"`
 | |
| 					} `json:"ipv4"`
 | |
| 					IPv6 struct {
 | |
| 						Address string `json:"ip_address"`
 | |
| 						CIDR    int    `json:"cidr"`
 | |
| 						Gateway string `json:"gateway"`
 | |
| 					} `json:"ipv6"`
 | |
| 					Mac  string `json:"mac"`
 | |
| 					Type string `json:"type"`
 | |
| 				} `json:"public"`
 | |
| 			} `json:"interfaces"`
 | |
| 			FloatingIP struct {
 | |
| 				IPv4 struct {
 | |
| 					Active bool `json:"active"`
 | |
| 				} `json:"ipv4"`
 | |
| 			} `json:"floating_ip"`
 | |
| 			DNS struct {
 | |
| 				Nameservers []string `json:"nameservers"`
 | |
| 			} `json:"dns"`
 | |
| 			Features map[string]interface{} `json:"features"`
 | |
| 		} `json:"v1"`
 | |
| 	} `json:"metadata"`
 | |
| }
 | |
| 
 | |
| func (stfs *DigitalOceanMetadata) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 | |
| 	switch r.URL.Path {
 | |
| 	case "/metadata/v1.json":
 | |
| 		json.NewEncoder(w).Encode(stfs.Metadata.V1)
 | |
| 	default:
 | |
| 		fs := FileServer(stfs, "json", time.Now())
 | |
| 		idx := strings.Index(r.URL.Path[1:], "/")
 | |
| 		r.URL.Path = strings.Replace(r.URL.Path[idx+1:], "/metadata/v1/", "", 1)
 | |
| 		r.RequestURI = r.URL.Path
 | |
| 		fs.ServeHTTP(w, r)
 | |
| 	}
 | |
| }
 |