-
Notifications
You must be signed in to change notification settings - Fork 13
/
recovery.go
64 lines (50 loc) · 1.49 KB
/
recovery.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package provider
import (
"fmt"
"os"
"github.com/kairos-io/kairos-sdk/utils"
nodepair "github.com/kairos-io/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 { //nolint:revive
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 { //nolint:revive
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
}