From e6a550d7863c42ba6b3e87c788d6e48fa1397020 Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Wed, 29 Jun 2016 20:32:49 -0700 Subject: [PATCH] Fix fetching SSH authorized keys from GCE --- cmd/cloudinit/cloudinit.go | 2 +- .../cloudinit}/gce/metadata.go | 69 +++++++++++++------ 2 files changed, 49 insertions(+), 22 deletions(-) rename {vendor/github.com/coreos/coreos-cloudinit/datasource/metadata => cmd/cloudinit}/gce/metadata.go (51%) diff --git a/cmd/cloudinit/cloudinit.go b/cmd/cloudinit/cloudinit.go index 8e3ccb71..573131fe 100644 --- a/cmd/cloudinit/cloudinit.go +++ b/cmd/cloudinit/cloudinit.go @@ -37,13 +37,13 @@ import ( "github.com/coreos/coreos-cloudinit/datasource/file" "github.com/coreos/coreos-cloudinit/datasource/metadata/digitalocean" "github.com/coreos/coreos-cloudinit/datasource/metadata/ec2" - "github.com/coreos/coreos-cloudinit/datasource/metadata/gce" "github.com/coreos/coreos-cloudinit/datasource/metadata/packet" "github.com/coreos/coreos-cloudinit/datasource/proc_cmdline" "github.com/coreos/coreos-cloudinit/datasource/url" "github.com/coreos/coreos-cloudinit/pkg" "github.com/coreos/coreos-cloudinit/system" "github.com/rancher/netconf" + "github.com/rancher/os/cmd/cloudinit/gce" rancherConfig "github.com/rancher/os/config" "github.com/rancher/os/util" ) diff --git a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/gce/metadata.go b/cmd/cloudinit/gce/metadata.go similarity index 51% rename from vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/gce/metadata.go rename to cmd/cloudinit/gce/metadata.go index 494741c7..b58b4c90 100644 --- a/vendor/github.com/coreos/coreos-cloudinit/datasource/metadata/gce/metadata.go +++ b/cmd/cloudinit/gce/metadata.go @@ -1,23 +1,11 @@ -// Copyright 2016 CoreOS, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - package gce import ( "fmt" "net" "net/http" + "strconv" + "strings" "github.com/coreos/coreos-cloudinit/datasource" "github.com/coreos/coreos-cloudinit/datasource/metadata" @@ -25,7 +13,7 @@ import ( const ( apiVersion = "computeMetadata/v1/" - metadataPath = apiVersion + "instance/" + metadataPath = apiVersion userdataPath = apiVersion + "instance/attributes/user-data" ) @@ -38,23 +26,48 @@ func NewDatasource(root string) *metadataService { } func (ms metadataService) FetchMetadata() (datasource.Metadata, error) { - public, err := ms.fetchIP("network-interfaces/0/access-configs/0/external-ip") + public, err := ms.fetchIP("instance/network-interfaces/0/access-configs/0/external-ip") if err != nil { return datasource.Metadata{}, err } - local, err := ms.fetchIP("network-interfaces/0/ip") + local, err := ms.fetchIP("instance/network-interfaces/0/ip") if err != nil { return datasource.Metadata{}, err } - hostname, err := ms.fetchString("hostname") + hostname, err := ms.fetchString("instance/hostname") if err != nil { return datasource.Metadata{}, err } + projectSshKeys, err := ms.fetchString("project/attributes/sshKeys") + if err != nil { + return datasource.Metadata{}, err + } + instanceSshKeys, err := ms.fetchString("instance/attributes/sshKeys") + if err != nil { + return datasource.Metadata{}, err + } + + keyStrings := strings.Split(projectSshKeys+"\n"+instanceSshKeys, "\n") + + sshPublicKeys := map[string]string{} + i := 0 + for _, keyString := range keyStrings { + keySlice := strings.SplitN(keyString, ":", 2) + if len(keySlice) == 2 { + key := strings.TrimSpace(keySlice[1]) + if key != "" { + sshPublicKeys[strconv.Itoa(i)] = strings.TrimSpace(keySlice[1]) + i++ + } + } + } + return datasource.Metadata{ - PublicIPv4: public, - PrivateIPv4: local, - Hostname: hostname, + PublicIPv4: public, + PrivateIPv4: local, + Hostname: hostname, + SSHPublicKeys: sshPublicKeys, }, nil } @@ -87,3 +100,17 @@ func (ms metadataService) fetchIP(key string) (net.IP, error) { return nil, fmt.Errorf("couldn't parse %q as IP address", str) } } + +func (ms metadataService) FetchUserdata() ([]byte, error) { + data, err := ms.FetchData(ms.UserdataUrl()) + if err != nil { + return nil, err + } + if len(data) == 0 { + data, err = ms.FetchData(ms.MetadataUrl() + "instance/attributes/startup-script") + if err != nil { + return nil, err + } + } + return data, nil +}