provider-kairos/internal/provider/recovery.go

65 lines
1.5 KiB
Go
Raw Permalink Normal View History

2022-08-12 07:40:40 +00:00
package provider
2022-08-11 11:30:51 +00:00
import (
"fmt"
2022-08-12 07:40:40 +00:00
"os"
2022-08-11 11:30:51 +00:00
"github.com/kairos-io/kairos/pkg/utils"
2022-08-11 11:30:51 +00:00
nodepair "github.com/mudler/go-nodepair"
2022-08-12 07:40:40 +00:00
"github.com/mudler/go-pluggable"
process "github.com/mudler/go-processmanager"
2022-08-11 11:30:51 +00:00
)
const recoveryAddr = "127.0.0.1:2222"
2022-08-12 07:40:40 +00:00
const sshStateDir = "/tmp/.ssh_recovery"
2022-08-11 11:30:51 +00:00
2022-08-12 07:40:40 +00:00
func Recovery(e *pluggable.Event) pluggable.EventResponse {
2022-08-11 11:30:51 +00:00
2022-08-12 07:40:40 +00:00
resp := &pluggable.EventResponse{}
2022-08-11 11:30:51 +00:00
tk := nodepair.GenerateToken()
serviceUUID := utils.RandStringRunes(10)
generatedPassword := utils.RandStringRunes(7)
2022-08-12 07:40:40 +00:00
resp.Data = utils.EncodeRecoveryToken(tk, serviceUUID, generatedPassword)
resp.State = fmt.Sprintf(
2022-08-11 11:30:51 +00:00
"starting ssh server on '%s', password: '%s' service: '%s' ", recoveryAddr, generatedPassword, serviceUUID)
2022-08-12 07:40:40 +00:00
// 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()
2022-08-11 11:30:51 +00:00
}
2022-08-12 07:40:40 +00:00
return *resp
2022-08-11 11:30:51 +00:00
}
2022-08-12 07:40:40 +00:00
func RecoveryStop(e *pluggable.Event) pluggable.EventResponse {
resp := &pluggable.EventResponse{}
2022-08-11 11:30:51 +00:00
2022-08-12 07:40:40 +00:00
sshServer := process.New(
process.WithStateDir(sshStateDir),
)
err := sshServer.Stop()
if err != nil {
resp.Error = err.Error()
} else {
os.RemoveAll(sshStateDir)
}
return *resp
2022-08-11 11:30:51 +00:00
}