From e626e798821cbc83309adfc266c0aba3f00fa7c3 Mon Sep 17 00:00:00 2001 From: Urko Date: Tue, 7 Mar 2023 22:50:07 +0100 Subject: [PATCH] feat: handle retries on switch wifi --- main.go | 63 ++++++++++++---------------- switcher.go | 115 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 142 insertions(+), 36 deletions(-) create mode 100644 switcher.go diff --git a/main.go b/main.go index ec34a6f..a4aaeb8 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,6 @@ import ( "time" "gitea.urkob.com/urko/go-wifi-switcher/cfg" - "github.com/go-rod/rod" "github.com/go-rod/rod/lib/launcher" "github.com/go-rod/rod/lib/utils" "github.com/ysmood/leakless" @@ -35,12 +34,12 @@ func main() { } var lc *launcher.Launcher - var u string + var remoteControlBrowserURL string if config.Bin != "" { lc = launcher.New().Bin(config.Bin) - u = lc.MustLaunch() - log.Println("u = lc.MustLaunch()", u) + remoteControlBrowserURL = lc.MustLaunch() + log.Println("u = lc.MustLaunch()", remoteControlBrowserURL) } else { lc = launcher.New() path := launcher.NewBrowser().MustGet() @@ -51,40 +50,32 @@ func main() { parser := launcher.NewURLParser() cmd.Stderr = parser utils.E(cmd.Start()) - u = launcher.MustResolveURL(<-parser.URL) + remoteControlBrowserURL = launcher.MustResolveURL(<-parser.URL) } - browser := rod.New(). - ControlURL(u). - MustConnect(). - MustIgnoreCertErrors(true) - defer browser.MustClose() - - page := browser.MustPage(config.Page) - - page.MustElement(`#username`).MustInput(config.AdminUser) - page.MustElement(`#userpassword`).MustInput(config.Password) - log.Println("INPUT DONE") - - page.MustElement(`input[value="Login"]`).MustClick() - log.Println("LOGIN DONE") - - page.MustElement(`input[value="Skip"]`).MustClick() - log.Println("SKIP DONE") - - page.MustElement("#Net").MustClick() - log.Println("Net DONE") - - page.MustElement("#Net-WLAN").MustClick() - log.Println("Net-WLAN DONE") - - mainFrame := page.MustElement("#mainFrame").MustFrame() - mainFrame.MustElement("#wlanEnable").MustClick() - log.Println("wlanEnable DONE") - - mainFrame.MustElement("#sysSubmit").MustClick() - // TODO: improve this and wait until something should happens (refresh) - time.Sleep(time.Second * 3) + sw := newSwitcher(remoteControlBrowserURL, config) + if err := sw.switchOff(); err != nil { + err := retry(5, time.Second*5, sw.switchOff) + if err != nil { + log.Fatalln("couldn't retry:", err) + } + } log.Println("task completed") } + +func retry(attempts int, sleep time.Duration, f func() error) error { + var err error + for i := 0; i < attempts; i++ { + if i > 0 { + log.Println("retrying after error:", err) + time.Sleep(sleep) + sleep *= 2 + } + err = f() + if err == nil { + return nil + } + } + return fmt.Errorf("after %d attempts, last error: %s", attempts, err) +} diff --git a/switcher.go b/switcher.go new file mode 100644 index 0000000..f67b4b8 --- /dev/null +++ b/switcher.go @@ -0,0 +1,115 @@ +package main + +import ( + "fmt" + "log" + "time" + + "gitea.urkob.com/urko/go-wifi-switcher/cfg" + "github.com/go-rod/rod" +) + +type switcher struct { + remoteControlBrowserUrl string + config *cfg.Config +} + +var ( + usernameID = "#username" + userpasswordID = "#userpassword" + loginText = "Login" + skipText = "Skip" + netID = "#Net" + netWlanID = "#Net-WLAN" + mainFrameID = "#mainFrame" + wlanEnableID = "#wlanEnable" +) + +func newSwitcher(remoteControlBrowserUrl string, config *cfg.Config) *switcher { + return &switcher{ + remoteControlBrowserUrl: remoteControlBrowserUrl, + config: config, + } +} + +func (s *switcher) switchOff() error { + browser := rod.New(). + ControlURL(s.remoteControlBrowserUrl). + MustConnect(). + MustIgnoreCertErrors(true) + + defer browser.MustClose() + + page := browser.MustPage(s.config.Page) + + username, err := page.Element(usernameID) + if err != nil { + return fmt.Errorf("page.Element %s: %s", userpasswordID, err) + } + username.MustInput(s.config.AdminUser) + log.Println(usernameID, "DONE") + + userpassword, err := page.Element(userpasswordID) + if err != nil { + return fmt.Errorf("page.Element %s: %s", userpasswordID, err) + } + userpassword.MustInput(s.config.Password) + log.Println(userpasswordID, "DONE") + + login, err := page.Element(`input[value=` + loginText + `"]`) + if err != nil { + return fmt.Errorf("page.Element %s: %s", loginText, err) + } + login.MustClick() + log.Println(loginText, "DONE") + + skip, err := page.Element(`input[value="` + skipText + `"]`) + if err != nil { + return fmt.Errorf("page.Element %s: %s", skipText, err) + } + skip.MustClick() + log.Println(skipText, "DONE") + + net, err := page.Element(netID) + if err != nil { + return fmt.Errorf("page.Element %s: %s", netID, err) + } + net.MustClick() + log.Println(netID, "DONE") + + netWlan, err := page.Element(netWlanID) + if err != nil { + return fmt.Errorf("page.Element %s: %s", netWlanID, err) + } + netWlan.MustClick() + log.Println(netWlanID, "DONE") + + frameElement, err := page.Element(mainFrameID) + if err != nil { + return fmt.Errorf("page.Element %s: %s", mainFrameID, err) + } + + mainFrame, err := frameElement.Frame() + if err != nil { + return fmt.Errorf("frameElement.Frame: %s", err) + } + + wlanEnable, err := mainFrame.Element(wlanEnableID) + if err != nil { + return fmt.Errorf("mainFrame.Element %s: %s", wlanEnableID, err) + } + wlanEnable.MustClick() + log.Println(wlanEnableID, "DONE") + + sysSubmitID := "#sysSubmit" + sysSubmit, err := mainFrame.Element(sysSubmitID) + if err != nil { + return fmt.Errorf("mainFrame.Element %s: %s", sysSubmitID, err) + } + sysSubmit.MustClick() + log.Println(sysSubmitID, "DONE") + + // TODO: improve this and wait until something should happens (refresh) + time.Sleep(time.Second * 3) + return nil +}