2022-07-18 22:02:49 +00:00
|
|
|
package agent
|
|
|
|
|
|
|
|
import (
|
2022-09-23 15:20:23 +00:00
|
|
|
"encoding/json"
|
2022-07-18 22:02:49 +00:00
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"sync"
|
|
|
|
"time"
|
|
|
|
|
2023-03-15 14:45:00 +00:00
|
|
|
sdk "github.com/kairos-io/kairos-sdk/bus"
|
2023-03-18 09:27:18 +00:00
|
|
|
"github.com/kairos-io/kairos-sdk/machine"
|
|
|
|
"github.com/kairos-io/kairos-sdk/utils"
|
2023-03-30 11:18:53 +00:00
|
|
|
hook "github.com/kairos-io/kairos/v2/internal/agent/hooks"
|
|
|
|
"github.com/kairos-io/kairos/v2/internal/bus"
|
|
|
|
"github.com/kairos-io/kairos/v2/internal/cmd"
|
|
|
|
"github.com/kairos-io/kairos/v2/pkg/config"
|
|
|
|
"github.com/kairos-io/kairos/v2/pkg/config/collector"
|
2022-09-23 15:20:23 +00:00
|
|
|
|
|
|
|
"github.com/mudler/go-pluggable"
|
2022-07-18 22:02:49 +00:00
|
|
|
"github.com/pterm/pterm"
|
|
|
|
)
|
|
|
|
|
2022-10-24 11:13:23 +00:00
|
|
|
func Reset(dir ...string) error {
|
2022-09-23 15:20:23 +00:00
|
|
|
bus.Manager.Initialize()
|
|
|
|
|
|
|
|
options := map[string]string{}
|
|
|
|
|
|
|
|
bus.Manager.Response(sdk.EventBeforeReset, func(p *pluggable.Plugin, r *pluggable.EventResponse) {
|
|
|
|
err := json.Unmarshal([]byte(r.Data), &options)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
}
|
|
|
|
})
|
2022-07-18 22:02:49 +00:00
|
|
|
|
|
|
|
cmd.PrintBranding(DefaultBanner)
|
|
|
|
|
|
|
|
agentConfig, err := LoadConfig()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd.PrintText(agentConfig.Branding.Reset, "Reset")
|
|
|
|
|
|
|
|
// We don't close the lock, as none of the following actions are expected to return
|
|
|
|
lock := sync.Mutex{}
|
|
|
|
go func() {
|
|
|
|
// Wait for user input and go back to shell
|
2022-07-25 22:26:10 +00:00
|
|
|
utils.Prompt("") //nolint:errcheck
|
2022-07-18 22:02:49 +00:00
|
|
|
// give tty1 back
|
|
|
|
svc, err := machine.Getty(1)
|
|
|
|
if err == nil {
|
2022-07-25 22:26:10 +00:00
|
|
|
svc.Start() //nolint:errcheck
|
2022-07-18 22:02:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
lock.Lock()
|
|
|
|
fmt.Println("Reset aborted")
|
|
|
|
panic(utils.Shell().Run())
|
|
|
|
}()
|
|
|
|
|
2022-10-01 00:23:10 +00:00
|
|
|
if !agentConfig.Fast {
|
|
|
|
time.Sleep(60 * time.Second)
|
|
|
|
}
|
2022-07-18 22:02:49 +00:00
|
|
|
lock.Lock()
|
|
|
|
args := []string{"reset"}
|
2022-09-23 15:20:23 +00:00
|
|
|
|
|
|
|
bus.Manager.Publish(sdk.EventBeforeReset, sdk.EventPayload{}) //nolint:errcheck
|
|
|
|
|
|
|
|
optsArgs := optsToArgs(options)
|
|
|
|
if len(optsArgs) > 0 {
|
|
|
|
args = append(args, optsArgs...)
|
|
|
|
} else {
|
|
|
|
args = append(args, "--reset-persistent")
|
|
|
|
}
|
2022-07-18 22:02:49 +00:00
|
|
|
|
2023-03-29 14:25:38 +00:00
|
|
|
c, err := config.Scan(collector.Directories(dir...))
|
2022-10-24 11:13:23 +00:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
utils.SetEnv(c.Env)
|
|
|
|
|
2022-07-18 22:02:49 +00:00
|
|
|
cmd := exec.Command("elemental", args...)
|
|
|
|
cmd.Env = os.Environ()
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stdin = os.Stdin
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
|
|
|
|
2023-01-25 12:38:56 +00:00
|
|
|
if err := hook.Run(*c, hook.AfterReset...); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2022-09-23 15:20:23 +00:00
|
|
|
bus.Manager.Publish(sdk.EventAfterReset, sdk.EventPayload{}) //nolint:errcheck
|
|
|
|
|
2022-07-18 22:02:49 +00:00
|
|
|
pterm.Info.Println("Rebooting in 60 seconds, press Enter to abort...")
|
|
|
|
|
|
|
|
// We don't close the lock, as none of the following actions are expected to return
|
|
|
|
lock2 := sync.Mutex{}
|
|
|
|
go func() {
|
|
|
|
// Wait for user input and go back to shell
|
2022-07-25 22:26:10 +00:00
|
|
|
utils.Prompt("") //nolint:errcheck
|
2022-07-18 22:02:49 +00:00
|
|
|
// give tty1 back
|
|
|
|
svc, err := machine.Getty(1)
|
|
|
|
if err == nil {
|
2022-07-25 22:26:10 +00:00
|
|
|
svc.Start() //nolint:errcheck
|
2022-07-18 22:02:49 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
lock2.Lock()
|
|
|
|
fmt.Println("Reboot aborted")
|
|
|
|
panic(utils.Shell().Run())
|
|
|
|
}()
|
|
|
|
|
2022-10-01 00:23:10 +00:00
|
|
|
if !agentConfig.Fast {
|
|
|
|
time.Sleep(60 * time.Second)
|
|
|
|
}
|
2022-07-18 22:02:49 +00:00
|
|
|
lock2.Lock()
|
|
|
|
utils.Reboot()
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|