mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-10-31 09:09:57 +00:00 
			
		
		
		
	Added AWS provider to metadata package
Signed-off-by: Ken Cochrane <kencochrane@gmail.com>
This commit is contained in:
		| @@ -47,7 +47,7 @@ var netProviders []Provider | ||||
| var cdromProviders []Provider | ||||
|  | ||||
| func init() { | ||||
| 	netProviders = []Provider{NewGCP()} | ||||
| 	netProviders = []Provider{NewGCP(), NewAWS()} | ||||
| 	cdromProviders = []Provider{NewCDROM()} | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										105
									
								
								pkg/metadata/provider_aws.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								pkg/metadata/provider_aws.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| package main | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
| 	"log" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	userDataURL = "http://169.254.169.254/latest/user-data" | ||||
| 	metaDataURL = "http://169.254.169.254/latest/meta-data/" | ||||
| ) | ||||
|  | ||||
| // ProviderAWS is the type implementing the Provider interface for AWS | ||||
| type ProviderAWS struct { | ||||
| } | ||||
|  | ||||
| // NewAWS returns a new ProviderAWS | ||||
| func NewAWS() *ProviderAWS { | ||||
| 	return &ProviderAWS{} | ||||
| } | ||||
|  | ||||
| func (p *ProviderAWS) String() string { | ||||
| 	return "AWS" | ||||
| } | ||||
|  | ||||
| // Probe checks if we are running on AWS | ||||
| func (p *ProviderAWS) Probe() bool { | ||||
| 	// Getting the hostname should always work... | ||||
| 	_, err := awsGet(metaDataURL + "hostname") | ||||
| 	return (err == nil) | ||||
| } | ||||
|  | ||||
| // Extract gets both the AWS specific and generic userdata | ||||
| func (p *ProviderAWS) Extract() ([]byte, error) { | ||||
| 	// Get host name. This must not fail | ||||
| 	hostname, err := awsGet(metaDataURL + "hostname") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	err = ioutil.WriteFile(path.Join(ConfigPath, Hostname), hostname, 0644) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("AWS: Failed to write hostname: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	if err := p.handleSSH(); err != nil { | ||||
| 		log.Printf("AWS: Failed to get ssh data: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	// Generic userdata | ||||
| 	userData, err := awsGet(userDataURL) | ||||
| 	if err != nil { | ||||
| 		log.Printf("AWS: Failed to get user-data: %s", err) | ||||
| 		// This is not an error | ||||
| 		return nil, nil | ||||
| 	} | ||||
| 	return userData, nil | ||||
| } | ||||
|  | ||||
| // awsGet requests and extracts the requested URL | ||||
| func awsGet(url string) ([]byte, error) { | ||||
| 	var client = &http.Client{ | ||||
| 		Timeout: time.Second * 2, | ||||
| 	} | ||||
|  | ||||
| 	req, err := http.NewRequest("", url, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("AWS: http.NewRequest failed: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	resp, err := client.Do(req) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("AWS: Could not contact metadata service: %s", err) | ||||
| 	} | ||||
| 	if resp.StatusCode != 200 { | ||||
| 		return nil, fmt.Errorf("AWS: Status not ok: %d", resp.StatusCode) | ||||
| 	} | ||||
| 	body, err := ioutil.ReadAll(resp.Body) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("AWS: Failed to read http response: %s", err) | ||||
| 	} | ||||
| 	return body, nil | ||||
| } | ||||
|  | ||||
| // SSH keys: | ||||
| func (p *ProviderAWS) handleSSH() error { | ||||
| 	sshKeys, err := awsGet(metaDataURL + "public-keys/0/openssh-key") | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("Failed to get sshKeys: %s", err) | ||||
| 	} | ||||
|  | ||||
| 	if err := os.Mkdir(path.Join(ConfigPath, SSH), 0755); err != nil { | ||||
| 		return fmt.Errorf("Failed to create %s: %s", SSH, err) | ||||
| 	} | ||||
|  | ||||
| 	err = ioutil.WriteFile(path.Join(ConfigPath, SSH, "authorized_keys"), sshKeys, 0600) | ||||
| 	if err != nil { | ||||
| 		return fmt.Errorf("Failed to write ssh keys: %s", err) | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user