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
|
|
|
|
2022-09-16 15:42:45 +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
|
|
|
}
|