region: guests: sshable: add GET /servers/<server-id>/make-sshable-cmd

This commit is contained in:
Yousong Zhou
2021-04-15 16:41:40 +08:00
parent b090a63c3b
commit 264c58073e
2 changed files with 62 additions and 0 deletions
+4
View File
@@ -46,3 +46,7 @@ type GuestMakeSshableInput struct {
type GuestMakeSshableOutput struct {
AnsiblePlaybookId string
}
type GuestMakeSshableCmdOutput struct {
ShellCmd string
}
+58
View File
@@ -17,6 +17,7 @@ package models
import (
"context"
"fmt"
"strings"
"time"
"yunion.io/x/jsonutils"
@@ -468,3 +469,60 @@ func (guest *SGuest) PerformMakeSshable(
}
return output, nil
}
func (guest *SGuest) AllowGetDetailsMakeSshableCmd(
ctx context.Context,
userCred mcclient.TokenCredential,
query jsonutils.JSONObject,
) bool {
return db.IsProjectAllowGetSpec(userCred, guest, "make-sshable-cmd")
}
func (guest *SGuest) GetDetailsMakeSshableCmd(
ctx context.Context,
userCred mcclient.TokenCredential,
query jsonutils.JSONObject,
) (output compute_api.GuestMakeSshableCmdOutput, err error) {
_, projectPublicKey, err := sshkeys.GetSshProjectKeypair(ctx, guest.ProjectId)
if err != nil {
return output, httperrors.NewInternalServerError("fetch project public key: %v", err)
}
_, adminPublicKey, err := sshkeys.GetSshAdminKeypair(ctx)
if err != nil {
return output, httperrors.NewInternalServerError("fetch admin public key: %v", err)
}
varVals := [][2]string{
[2]string{"user", "cloudroot"},
[2]string{"adminpub", strings.TrimSpace(adminPublicKey)},
[2]string{"projpub", strings.TrimSpace(projectPublicKey)},
}
shellCmd := ""
for i := range varVals {
varVal := varVals[i]
shellCmd += fmt.Sprintf("%s=%q\n", varVal[0], varVal[1])
}
shellCmd += `
group="$user"
sshdir="/home/$user/.ssh"
`
shellCmd += `
id -g "$group" &>/dev/null || groupadd "$group"
id -u "$user" &>/dev/null || useradd --create-home --gid "$group" "$user"
mkdir -p "$sshdir"
echo "$adminpub" >>"$sshdir/authorized_keys"
echo "$projpub" >>"$sshdir/authorized_keys"
chown -R "$user:$group" "$sshdir"
chmod -R 700 "$sshdir"
chmod -R 600 "$sshdir/authorized_keys"
if ! grep -q "^$user " /etc/sudoers; then
echo "$user ALL=(ALL) NOPASSWD: ALL" | EDITOR='tee -a' visudo
fi
`
output = compute_api.GuestMakeSshableCmdOutput{
ShellCmd: shellCmd,
}
return output, nil
}