provider-kairos/internal/provider/recovery.go
2022-09-16 15:42:45 +00:00

65 lines
1.5 KiB
Go

package provider
import (
"fmt"
"os"
"github.com/kairos-io/kairos/pkg/utils"
nodepair "github.com/mudler/go-nodepair"
"github.com/mudler/go-pluggable"
process "github.com/mudler/go-processmanager"
)
const recoveryAddr = "127.0.0.1:2222"
const sshStateDir = "/tmp/.ssh_recovery"
func Recovery(e *pluggable.Event) pluggable.EventResponse {
resp := &pluggable.EventResponse{}
tk := nodepair.GenerateToken()
serviceUUID := utils.RandStringRunes(10)
generatedPassword := utils.RandStringRunes(7)
resp.Data = utils.EncodeRecoveryToken(tk, serviceUUID, generatedPassword)
resp.State = fmt.Sprintf(
"starting ssh server on '%s', password: '%s' service: '%s' ", recoveryAddr, generatedPassword, serviceUUID)
// start ssh server in a separate process
sshServer := process.New(
process.WithName(os.Args[0]),
process.WithArgs("recovery-ssh-server"),
process.WithEnvironment(
fmt.Sprintf("TOKEN=%s", tk),
fmt.Sprintf("SERVICE=%s", serviceUUID),
fmt.Sprintf("LISTEN=%s", recoveryAddr),
fmt.Sprintf("PASSWORD=%s", generatedPassword),
),
process.WithStateDir(sshStateDir),
)
err := sshServer.Run()
if err != nil {
resp.Error = err.Error()
}
return *resp
}
func RecoveryStop(e *pluggable.Event) pluggable.EventResponse {
resp := &pluggable.EventResponse{}
sshServer := process.New(
process.WithStateDir(sshStateDir),
)
err := sshServer.Stop()
if err != nil {
resp.Error = err.Error()
} else {
os.RemoveAll(sshStateDir)
}
return *resp
}