This commit is contained in:
		
							parent
							
								
									f3f50b0ace
								
							
						
					
					
						commit
						df5a390680
					
				
					 3 changed files with 140 additions and 0 deletions
				
			
		|  | @ -231,6 +231,71 @@ func (c *Container) SetPassword(password string) error { | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Generate SSH keys and copies it into authorized keys
 | ||||||
|  | // Returns true if the key was generated in this call and error if there is any.
 | ||||||
|  | func (c *Container) GenerateDeploySSHKeys() (bool, error) { | ||||||
|  | 	driver := c.getDriver() | ||||||
|  | 
 | ||||||
|  | 	privateKey, pubKey, _ := c.GetDeploySSHKeys() | ||||||
|  | 	if privateKey != "" || pubKey != "" { | ||||||
|  | 		return false, nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err := driver.Exec(c.App.Name, []string{"mkdir", "-p", "/srv/.ssh"}, "", []string{}, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err = driver.Exec(c.App.Name, []string{"ssh-keygen", "-f", "/srv/.ssh/id_rsa", "-P", ""}, "", []string{}, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err = driver.Exec(c.App.Name, []string{"chown", "app:app", "-R", "/srv/.ssh"}, "", []string{}, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return false, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return true, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Generate SSH keys and copies it into authorized keys
 | ||||||
|  | // Return private key, public key and error.
 | ||||||
|  | func (c *Container) GetDeploySSHKeys() (string, string, error) { | ||||||
|  | 	driver := c.getDriver() | ||||||
|  | 
 | ||||||
|  | 	privateKey, err := driver.Exec(c.App.Name, []string{"cat ", "/srv/.ssh/id_rsa"}, "", []string{}, true) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", "", err | ||||||
|  | 	} | ||||||
|  | 	pubKey, err := driver.Exec(c.App.Name, []string{"cat ", "/srv/.ssh/id_rsa.pub"}, "", []string{}, true) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if privateKey != nil || pubKey != nil { | ||||||
|  | 		return string(*privateKey), string(*pubKey), nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return "", "", nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *Container) AppendOfFile(filename string, text string, mode string) error { | ||||||
|  | 	driver := c.getDriver() | ||||||
|  | 
 | ||||||
|  | 	_, err := driver.Exec(c.App.Name, []string{"tee", "-a", filename}, text, []string{}, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	_, err = driver.Exec(c.App.Name, []string{"chmod", mode, filename}, "", []string{}, false) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // SetAppPort changes application port in the container
 | // SetAppPort changes application port in the container
 | ||||||
| func (c *Container) SetAppPort(port int) error { | func (c *Container) SetAppPort(port int) error { | ||||||
| 	driver := c.getDriver() | 	driver := c.getDriver() | ||||||
|  |  | ||||||
							
								
								
									
										35
									
								
								glue/main.go
									
									
									
									
									
								
							
							
						
						
									
										35
									
								
								glue/main.go
									
									
									
									
									
								
							|  | @ -484,6 +484,41 @@ func (p *Processor) SetPassword(password string) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Generate SSH key and adds it into authorized_keys
 | ||||||
|  | // These pair of keys is used for deployment.
 | ||||||
|  | // Returns private key, pubkey and error.
 | ||||||
|  | // Keys are returned every time even if it was already generated
 | ||||||
|  | func (p *Processor) GenerateDeploySSHKeys() (string, string, error) { | ||||||
|  | 	err := p.waitForApp() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	container, err := p.getContainer() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	created, err := container.GenerateDeploySSHKeys() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	privateKey, pubKey, err := container.GetDeploySSHKeys() | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", "", err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if created { | ||||||
|  | 		err = container.AppendOfFile(sshPubKeysLocation, pubKey+"\n", "0600") | ||||||
|  | 		if err != nil { | ||||||
|  | 			return "", "", err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return privateKey, pubKey, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Processes returns list of supervisord processes
 | // Processes returns list of supervisord processes
 | ||||||
| func (p *Processor) Processes() ([]docker.Process, error) { | func (p *Processor) Processes() ([]docker.Process, error) { | ||||||
| 	container, err := p.getContainer() | 	container, err := p.getContainer() | ||||||
|  |  | ||||||
|  | @ -50,6 +50,7 @@ func _messageHandler(m *nats.Msg) error { | ||||||
| 		"stop":                       stopEventHandler, | 		"stop":                       stopEventHandler, | ||||||
| 		"start":                      startEventHandler, | 		"start":                      startEventHandler, | ||||||
| 		"restart":                    restartEventHandler, | 		"restart":                    restartEventHandler, | ||||||
|  | 		"get_deploy_ssh_keys":        getDeploySSHKeysEventHandler, | ||||||
| 		"update_keys":                updateKeysEventHandler, | 		"update_keys":                updateKeysEventHandler, | ||||||
| 		"set_password":               setPasswordEventHandler, | 		"set_password":               setPasswordEventHandler, | ||||||
| 		"processes":                  processesEventHandler, | 		"processes":                  processesEventHandler, | ||||||
|  | @ -398,6 +399,45 @@ func restartEventHandler(m *nats.Msg, message *RequestMessage) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func getDeploySSHKeysEventHandler(m *nats.Msg, message *RequestMessage) error { | ||||||
|  | 	processor := glue.Processor{ | ||||||
|  | 		AppName:           message.AppName, | ||||||
|  | 		DB:                common.GetDBConnection(), | ||||||
|  | 		SnapshotProcessor: &snapshotProcessor, | ||||||
|  | 		DockerSock:        config.DockerSocket, | ||||||
|  | 		BindIPHTTP:        config.AppsBindIPHTTP, | ||||||
|  | 		BindIPSSH:         config.AppsBindIPSSH, | ||||||
|  | 		AppsPath:          config.AppsPath, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	privateKey, pubKey, err := processor.GenerateDeploySSHKeys() | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Printf("backend error: %v\n", err) | ||||||
|  | 		return errorReplyFormater(m, "backend error", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Assembling reply message
 | ||||||
|  | 	reply := ReplyMessage{ | ||||||
|  | 		Payload: struct{ PrivateKey, PublicKey string }{ | ||||||
|  | 			PrivateKey: privateKey, | ||||||
|  | 			PublicKey:  pubKey, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	data, err := json.Marshal(reply) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return errorReplyFormater(m, "reply formatter error", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err = m.Respond(data) | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Println("ERROR: get app:", err.Error()) | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Copies body of the request into /srv/.ssh/authorized_keys
 | // Copies body of the request into /srv/.ssh/authorized_keys
 | ||||||
| func updateKeysEventHandler(m *nats.Msg, message *RequestMessage) error { | func updateKeysEventHandler(m *nats.Msg, message *RequestMessage) error { | ||||||
| 	body := message.Payload | 	body := message.Payload | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue