diff --git a/internal/agent/notify.go b/internal/agent/notify.go index d9f5063..fe11497 100644 --- a/internal/agent/notify.go +++ b/internal/agent/notify.go @@ -1,6 +1,8 @@ package agent import ( + "fmt" + "github.com/c3os-io/c3os/internal/bus" "github.com/c3os-io/c3os/pkg/config" events "github.com/c3os-io/c3os/sdk/bus" @@ -15,6 +17,10 @@ func Notify(event string, dirs []string) error { return err } + if !events.IsEventDefined(event) { + return fmt.Errorf("event '%s' not defined", event) + } + _, err = bus.Manager.Publish(pluggable.EventType(event), events.EventPayload{ Config: c.String(), }) diff --git a/internal/agent/recovery.go b/internal/agent/recovery.go index 711aed2..63763ac 100644 --- a/internal/agent/recovery.go +++ b/internal/agent/recovery.go @@ -1,62 +1,32 @@ package agent import ( - "context" "fmt" - "io" - "os/exec" "time" + "github.com/c3os-io/c3os/internal/bus" "github.com/c3os-io/c3os/internal/cmd" - config "github.com/c3os-io/c3os/pkg/config" "github.com/c3os-io/c3os/pkg/utils" - "github.com/ipfs/go-log" + events "github.com/c3os-io/c3os/sdk/bus" machine "github.com/c3os-io/c3os/pkg/machine" - "github.com/creack/pty" - "github.com/gliderlabs/ssh" - "github.com/mudler/edgevpn/pkg/logger" - "github.com/mudler/edgevpn/pkg/node" - "github.com/mudler/edgevpn/pkg/services" - nodepair "github.com/mudler/go-nodepair" qr "github.com/mudler/go-nodepair/qrcode" + "github.com/mudler/go-pluggable" "github.com/pterm/pterm" ) -const recoveryAddr = "127.0.0.1:2222" - -func startRecoveryService(ctx context.Context, token, name, address, loglevel string) error { - - nc := config.Network(token, "", loglevel, "c3osrecovery0") - - lvl, err := log.LevelFromString(loglevel) - if err != nil { - lvl = log.LevelError - } - llger := logger.New(lvl) - - o, _, err := nc.ToOpts(llger) - if err != nil { - llger.Fatal(err.Error()) - } - - o = append(o, - services.Alive( - time.Duration(20)*time.Second, - time.Duration(10)*time.Second, - time.Duration(10)*time.Second)...) - - o = append(o, services.RegisterService(llger, time.Duration(5*time.Second), name, address)...) - - e, err := node.New(o...) - if err != nil { - return err - } - - return e.Start(ctx) -} - func Recovery() error { + bus.Manager.Initialize() + + token := "" + msg := "" + busErr := "" + + bus.Manager.Response(events.EventRecovery, func(p *pluggable.Plugin, r *pluggable.EventResponse) { + token = r.Data + msg = r.State + busErr = r.Error + }) cmd.PrintBranding(DefaultBanner) @@ -67,29 +37,29 @@ func Recovery() error { cmd.PrintText(agentConfig.Branding.Recovery, "Recovery") - tk := nodepair.GenerateToken() - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - serviceUUID := utils.RandStringRunes(10) - generatedPassword := utils.RandStringRunes(7) - - if err := startRecoveryService(ctx, tk, serviceUUID, recoveryAddr, "fatal"); err != nil { + _, err = bus.Manager.Publish(events.EventRecovery, events.EventPayload{}) + if err != nil { return err } + if busErr != "" { + return fmt.Errorf(busErr) + } + time.Sleep(5 * time.Second) - pterm.Info.Printfln( - "starting ssh server on '%s', password: '%s' service: '%s' ", recoveryAddr, generatedPassword, serviceUUID) + pterm.Info.Println(msg) - qr.Print(utils.EncodeRecoveryToken(tk, serviceUUID, generatedPassword)) - - go sshServer(recoveryAddr, generatedPassword) + if token != "" { + qr.Print(token) + } // Wait for user input and go back to shell utils.Prompt("") //nolint:errcheck - cancel() + _, err = bus.Manager.Publish(events.EventRecoveryStop, events.EventPayload{}) + if err != nil { + return err + } // give tty1 back svc, err := machine.Getty(1) if err == nil { @@ -98,35 +68,3 @@ func Recovery() error { return nil } - -func sshServer(listenAdddr, password string) { - ssh.Handle(func(s ssh.Session) { - cmd := exec.Command("bash") - ptyReq, winCh, isPty := s.Pty() - if isPty { - cmd.Env = append(cmd.Env, fmt.Sprintf("TERM=%s", ptyReq.Term)) - f, err := pty.Start(cmd) - if err != nil { - pterm.Warning.Println("Failed reserving tty") - } - go func() { - for win := range winCh { - setWinsize(f, win.Width, win.Height) - } - }() - go func() { - io.Copy(f, s) //nolint:errcheck - }() - io.Copy(s, f) //nolint:errcheck - cmd.Wait() //nolint:errcheck - } else { - io.WriteString(s, "No PTY requested.\n") //nolint:errcheck - s.Exit(1) //nolint:errcheck - } - }) - - pterm.Info.Println(ssh.ListenAndServe(listenAdddr, nil, ssh.PasswordAuth(func(ctx ssh.Context, pass string) bool { - return pass == password - }), - )) -} diff --git a/internal/agent/recovery_linux.go b/internal/agent/recovery_linux.go deleted file mode 100644 index 9b5171d..0000000 --- a/internal/agent/recovery_linux.go +++ /dev/null @@ -1,12 +0,0 @@ -package agent - -import ( - "os" - "syscall" - "unsafe" -) - -func setWinsize(f *os.File, w, h int) { - syscall.Syscall(syscall.SYS_IOCTL, f.Fd(), uintptr(syscall.TIOCSWINSZ), //nolint:errcheck - uintptr(unsafe.Pointer(&struct{ h, w, x, y uint16 }{uint16(h), uint16(w), 0, 0}))) //nolint:errcheck -} diff --git a/internal/agent/recovery_windows.go b/internal/agent/recovery_windows.go deleted file mode 100644 index 5794e39..0000000 --- a/internal/agent/recovery_windows.go +++ /dev/null @@ -1,8 +0,0 @@ -package agent - -import ( - "os" -) - -func setWinsize(f *os.File, w, h int) { -}