diff --git a/pkg/metadata/main.go b/pkg/metadata/main.go index 4b1a2cf5b..9bb9106db 100644 --- a/pkg/metadata/main.go +++ b/pkg/metadata/main.go @@ -7,6 +7,7 @@ import ( "os" "path" "strconv" + "strings" "syscall" ) @@ -44,29 +45,34 @@ var netProviders []Provider // cdromProviders is a list of Providers offering metadata/userdata data via CDROM var cdromProviders []Provider +// fileProviders is a list of Providers offering metadata/userdata in a file on the filesystem +var fileProviders []Provider + func main() { providers := []string{"aws", "gcp", "hetzner", "openstack", "scaleway", "vultr", "packet", "cdrom"} if len(os.Args) > 1 { providers = os.Args[1:] } for _, p := range providers { - switch p { - case "aws": + switch { + case p == "aws": netProviders = append(netProviders, NewAWS()) - case "gcp": + case p == "gcp": netProviders = append(netProviders, NewGCP()) - case "hetzner": + case p == "hetzner": netProviders = append(netProviders, NewHetzner()) - case "openstack": + case p == "openstack": netProviders = append(netProviders, NewOpenstack()) - case "packet": + case p == "packet": netProviders = append(netProviders, NewPacket()) - case "scaleway": + case p == "scaleway": netProviders = append(netProviders, NewScaleway()) - case "vultr": + case p == "vultr": netProviders = append(netProviders, NewVultr()) - case "cdrom": + case p == "cdrom": cdromProviders = ListCDROMs() + case strings.HasPrefix(p, "file="): + fileProviders = append(fileProviders, fileProvider(p[5:])) default: log.Fatalf("Unrecognised metadata provider: %s", p) } @@ -99,6 +105,17 @@ func main() { } } } + if !found { + for _, p = range fileProviders { + log.Printf("Trying file %s", p.String()) + if p.Probe() { + log.Printf("%s: Probe succeeded", p) + userdata, err = p.Extract() + found = true + break + } + } + } if !found { log.Printf("No metadata/userdata found. Bye") diff --git a/pkg/metadata/provider_file.go b/pkg/metadata/provider_file.go new file mode 100644 index 000000000..d96404020 --- /dev/null +++ b/pkg/metadata/provider_file.go @@ -0,0 +1,21 @@ +package main + +import ( + "io/ioutil" + "os" +) + +type fileProvider string + +func (p fileProvider) String() string { + return string(p) +} + +func (p fileProvider) Probe() bool { + _, err := os.Stat(string(p)) + return err == nil +} + +func (p fileProvider) Extract() ([]byte, error) { + return ioutil.ReadFile(string(p)) +}