Compare commits
6 Commits
10c80effce
...
feature/ar
| Author | SHA1 | Date | |
|---|---|---|---|
| cc9c9354bc | |||
| 55ed1c1b36 | |||
| 8032850b0b | |||
| 5d5d90d3f6 | |||
| 7742a70f6c | |||
| 857aec79e3 |
95
internal/providers/archer_ax50.go
Normal file
95
internal/providers/archer_ax50.go
Normal file
@@ -0,0 +1,95 @@
|
||||
package providers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/go-rod/rod"
|
||||
)
|
||||
|
||||
type ArcherAx50 struct {
|
||||
passwordID string
|
||||
loginButtonID string
|
||||
wirelessTab string
|
||||
chkWifi2gID string
|
||||
saveButtonID string
|
||||
page *rod.Page
|
||||
}
|
||||
|
||||
func NewArcherAx50(page *rod.Page) ArcherAx50 {
|
||||
return ArcherAx50{
|
||||
passwordID: "#login-password",
|
||||
loginButtonID: "#login-btn",
|
||||
wirelessTab: "wireless",
|
||||
chkWifi2gID: "chk_enable_wireless_24g",
|
||||
saveButtonID: "#total_save",
|
||||
page: page,
|
||||
}
|
||||
}
|
||||
|
||||
func (p ArcherAx50) Login(user, pass string) error {
|
||||
time.Sleep(time.Millisecond * 1250)
|
||||
|
||||
p.page.MustEvaluate(&rod.EvalOptions{
|
||||
JS: `() => {
|
||||
$("input.password-text").each((i,v) => {
|
||||
v.click();
|
||||
v.focus();
|
||||
v.value="` + pass + `";
|
||||
})
|
||||
return '';
|
||||
}`,
|
||||
})
|
||||
time.Sleep(time.Millisecond * 250)
|
||||
|
||||
log.Println(p.passwordID, "DONE")
|
||||
|
||||
login, err := p.page.Element(p.loginButtonID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.loginButtonID, err)
|
||||
}
|
||||
login.MustClick()
|
||||
log.Println(p.loginButtonID, "DONE")
|
||||
time.Sleep(time.Millisecond * 400)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p ArcherAx50) SwitchWIFI() error {
|
||||
time.Sleep(time.Second * 1)
|
||||
pageURL := p.page.MustInfo().URL
|
||||
log.Println("p.page.MustInfo().URL", pageURL)
|
||||
|
||||
wirelessTab, err := p.page.Element(`[name="` + p.wirelessTab + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.wirelessTab, err)
|
||||
}
|
||||
wirelessTab.MustClick()
|
||||
log.Println(p.wirelessTab, "DONE")
|
||||
|
||||
time.Sleep(time.Millisecond * 750)
|
||||
checked := p.page.MustEvaluate(&rod.EvalOptions{
|
||||
JS: `() => {
|
||||
return document.getElementById('` + p.chkWifi2gID + `').checked;
|
||||
}`,
|
||||
})
|
||||
|
||||
isChecked := checked.Value.Bool()
|
||||
p.page.MustEvaluate(&rod.EvalOptions{
|
||||
JS: `() => {
|
||||
document.getElementById('` + p.chkWifi2gID + `').checked=` + fmt.Sprint(!isChecked) + `;
|
||||
return '';
|
||||
}`,
|
||||
})
|
||||
|
||||
log.Println(p.chkWifi2gID, "DONE")
|
||||
saveButton, err := p.page.Element(p.saveButtonID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.saveButtonID, err)
|
||||
}
|
||||
saveButton.MustClick()
|
||||
log.Println(p.saveButtonID, "DONE")
|
||||
|
||||
time.Sleep(time.Millisecond * 1500)
|
||||
return nil
|
||||
}
|
||||
112
internal/providers/huawei.go
Normal file
112
internal/providers/huawei.go
Normal file
@@ -0,0 +1,112 @@
|
||||
package providers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/go-rod/rod"
|
||||
)
|
||||
|
||||
type Huawei struct {
|
||||
usernameID string
|
||||
userpasswordID string
|
||||
loginText string
|
||||
skipText string
|
||||
netID string
|
||||
netWlanID string
|
||||
mainFrameID string
|
||||
wlanEnableID string
|
||||
page *rod.Page
|
||||
}
|
||||
|
||||
func NewHuawei(page *rod.Page) Huawei {
|
||||
return Huawei{
|
||||
usernameID: "#username",
|
||||
userpasswordID: "#userpassword",
|
||||
loginText: "Login",
|
||||
skipText: "Skip",
|
||||
netID: "#Net",
|
||||
netWlanID: "#Net-WLAN",
|
||||
mainFrameID: "#mainFrame",
|
||||
wlanEnableID: "#wlanEnable",
|
||||
page: page,
|
||||
}
|
||||
}
|
||||
|
||||
func (p Huawei) Login(user, pass string) error {
|
||||
username, err := p.page.Element(p.usernameID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.userpasswordID, err)
|
||||
}
|
||||
username.MustInput(user)
|
||||
log.Println(p.usernameID, "DONE")
|
||||
|
||||
userpassword, err := p.page.Element(p.userpasswordID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.userpasswordID, err)
|
||||
}
|
||||
userpassword.MustInput(pass)
|
||||
log.Println(p.userpasswordID, "DONE")
|
||||
|
||||
login, err := p.page.Element(`input[value="` + p.loginText + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.loginText, err)
|
||||
}
|
||||
login.MustClick()
|
||||
log.Println(p.loginText, "DONE")
|
||||
|
||||
skip, err := p.page.Element(`input[value="` + p.skipText + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.skipText, err)
|
||||
}
|
||||
skip.MustClick()
|
||||
log.Println(p.skipText, "DONE")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p Huawei) SwitchWIFI() error {
|
||||
net, err := p.page.Element(p.netID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.netID, err)
|
||||
}
|
||||
net.MustClick()
|
||||
log.Println(p.netID, "DONE")
|
||||
|
||||
netWlan, err := p.page.Element(p.netWlanID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.netWlanID, err)
|
||||
}
|
||||
netWlan.MustClick()
|
||||
log.Println(p.netWlanID, "DONE")
|
||||
|
||||
frameElement, err := p.page.Element(p.mainFrameID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.mainFrameID, err)
|
||||
}
|
||||
|
||||
mainFrame, err := frameElement.Frame()
|
||||
if err != nil {
|
||||
return fmt.Errorf("frameElement.Frame: %s", err)
|
||||
}
|
||||
|
||||
wlanEnable, err := mainFrame.Element(p.wlanEnableID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("mainFrame.Element %s: %s", p.wlanEnableID, err)
|
||||
}
|
||||
wlanEnable.MustClick()
|
||||
log.Println(p.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
|
||||
}
|
||||
104
internal/providers/nucom.go
Normal file
104
internal/providers/nucom.go
Normal file
@@ -0,0 +1,104 @@
|
||||
package providers
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"github.com/go-rod/rod"
|
||||
)
|
||||
|
||||
type Nucom struct {
|
||||
usernameName string
|
||||
passwordName string
|
||||
loginSubmitID string
|
||||
wirelessTabID string
|
||||
wirelessMenuText string
|
||||
configureWarningID string
|
||||
wifiRadioID string
|
||||
saveID string
|
||||
radioOff string
|
||||
radioOn string
|
||||
page *rod.Page
|
||||
}
|
||||
|
||||
func NewNucom(page *rod.Page) Nucom {
|
||||
return Nucom{
|
||||
usernameName: "loginUser",
|
||||
passwordName: "loginPass",
|
||||
loginSubmitID: "btnApply",
|
||||
wirelessTabID: "menu_wireless",
|
||||
wirelessMenuText: "Básico",
|
||||
configureWarningID: "Configurar ahora",
|
||||
wifiRadioID: "radiohiddenButton",
|
||||
radioOff: "Apagada",
|
||||
radioOn: "Encendida",
|
||||
saveID: "basicApply",
|
||||
page: page,
|
||||
}
|
||||
}
|
||||
|
||||
func (p Nucom) Login(user, pass string) error {
|
||||
username, err := p.page.Element(`input[name="` + p.usernameName + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.passwordName, err)
|
||||
}
|
||||
username.MustInput(user)
|
||||
log.Println(p.usernameName, "DONE")
|
||||
|
||||
userpassword, err := p.page.Element(`input[name="` + p.passwordName + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.passwordName, err)
|
||||
}
|
||||
userpassword.MustInput(pass)
|
||||
log.Println(p.passwordName, "DONE")
|
||||
|
||||
login, err := p.page.Element(`input[id="` + p.loginSubmitID + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.loginSubmitID, err)
|
||||
}
|
||||
login.MustClick()
|
||||
log.Println(p.loginSubmitID, "DONE")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p Nucom) SwitchWIFI() error {
|
||||
wirelessMenu, err := p.page.Element(`a[id="` + p.wirelessTabID + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.wirelessTabID, err)
|
||||
}
|
||||
wirelessMenu.MustClick()
|
||||
log.Println(p.wirelessTabID, "DONE")
|
||||
time.Sleep(time.Millisecond * 500)
|
||||
log.Println(p.page.MustInfo().URL)
|
||||
|
||||
offWifiRadio, err := p.page.Element(`input[type="radio"][name="radiohiddenButton"][value="0"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.wifiRadioID, err)
|
||||
}
|
||||
|
||||
offChecked := offWifiRadio.MustProperty("checked")
|
||||
if offChecked.Bool() {
|
||||
log.Println("it is off, let's switch on")
|
||||
onRadio, err := p.page.Element(`input[type="radio"][name="radiohiddenButton"][value="1"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.wifiRadioID, err)
|
||||
}
|
||||
onRadio.MustClick()
|
||||
} else {
|
||||
log.Println("it is on, time to switch off")
|
||||
offWifiRadio.MustClick()
|
||||
}
|
||||
|
||||
log.Println(p.wifiRadioID, "DONE")
|
||||
time.Sleep(time.Millisecond * 150)
|
||||
|
||||
saveButton, err := p.page.Element(`input[id="` + p.saveID + `"]`)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", p.saveID, err)
|
||||
}
|
||||
saveButton.MustClick()
|
||||
log.Println(p.saveID, "DONE")
|
||||
time.Sleep(time.Millisecond * 150)
|
||||
return nil
|
||||
}
|
||||
@@ -2,114 +2,44 @@ package switcher
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"gitea.urkob.com/urko/go-wifi-switcher/cfg"
|
||||
"gitea.urkob.com/urko/go-wifi-switcher/pkg/provider"
|
||||
"github.com/go-rod/rod"
|
||||
)
|
||||
|
||||
type switcher struct {
|
||||
remoteControlBrowserUrl string
|
||||
config *cfg.Config
|
||||
type Switcher struct {
|
||||
Browser *rod.Browser
|
||||
Page *rod.Page
|
||||
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) SwitchWIFI() error {
|
||||
func NewSwitcher(remoteControlBrowserUrl string, config *cfg.Config) Switcher {
|
||||
browser := rod.New().
|
||||
ControlURL(s.remoteControlBrowserUrl).
|
||||
ControlURL(remoteControlBrowserUrl).
|
||||
MustConnect().
|
||||
MustIgnoreCertErrors(true)
|
||||
|
||||
defer browser.MustClose()
|
||||
page := browser.MustPage(config.Page)
|
||||
|
||||
page := browser.MustPage(s.config.Page)
|
||||
|
||||
username, err := page.Element(usernameID)
|
||||
if err != nil {
|
||||
return fmt.Errorf("page.Element %s: %s", userpasswordID, err)
|
||||
return Switcher{
|
||||
Browser: browser,
|
||||
Page: page,
|
||||
config: config,
|
||||
}
|
||||
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")
|
||||
func (s Switcher) SwitchWIFI(prv provider.ProviderIface) error {
|
||||
defer s.Browser.MustClose()
|
||||
defer s.Page.Close()
|
||||
|
||||
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)
|
||||
if err := prv.Login(s.config.AdminUser, s.config.Password); err != nil {
|
||||
return fmt.Errorf("prv.Login %w", err)
|
||||
}
|
||||
|
||||
mainFrame, err := frameElement.Frame()
|
||||
if err != nil {
|
||||
return fmt.Errorf("frameElement.Frame: %s", err)
|
||||
if err := prv.SwitchWIFI(); err != nil {
|
||||
return fmt.Errorf("prv.SwitchWIFI %w", 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
|
||||
}
|
||||
|
||||
35
main.go
35
main.go
@@ -8,15 +8,13 @@ import (
|
||||
"time"
|
||||
|
||||
"gitea.urkob.com/urko/go-wifi-switcher/cfg"
|
||||
"gitea.urkob.com/urko/go-wifi-switcher/internal/providers"
|
||||
"gitea.urkob.com/urko/go-wifi-switcher/internal/switcher"
|
||||
pkgswitcher "gitea.urkob.com/urko/go-wifi-switcher/pkg/switcher"
|
||||
"github.com/go-rod/rod/lib/launcher"
|
||||
"github.com/go-rod/rod/lib/utils"
|
||||
"github.com/ysmood/leakless"
|
||||
)
|
||||
|
||||
var sw pkgswitcher.SwitcherIface
|
||||
|
||||
func main() {
|
||||
envFile := ""
|
||||
if os.Getenv("ENV") != "prod" {
|
||||
@@ -25,7 +23,6 @@ func main() {
|
||||
|
||||
config := cfg.NewConfig(envFile)
|
||||
log.SetFlags(log.Lmicroseconds)
|
||||
config.LogFile = false
|
||||
if config.LogFile {
|
||||
logFileName := fmt.Sprintf("%s.txt", time.Now().Format(strings.ReplaceAll(time.RFC1123Z, ":", "_")))
|
||||
f, err := os.OpenFile(logFileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0o644)
|
||||
@@ -40,7 +37,7 @@ func main() {
|
||||
var lc *launcher.Launcher
|
||||
var remoteControlBrowserURL string
|
||||
|
||||
config.Bin = ""
|
||||
log.Println("config", config)
|
||||
if config.Bin != "" {
|
||||
lc = launcher.New().Bin(config.Bin)
|
||||
remoteControlBrowserURL = lc.MustLaunch()
|
||||
@@ -58,30 +55,12 @@ func main() {
|
||||
remoteControlBrowserURL = launcher.MustResolveURL(<-parser.URL)
|
||||
}
|
||||
|
||||
sw = switcher.NewSwitcher(remoteControlBrowserURL, config)
|
||||
if err := sw.SwitchWIFI(); err != nil {
|
||||
log.Println("sw.SwitchWIFI", err)
|
||||
err := retry(5, time.Second*5, sw.SwitchWIFI)
|
||||
if err != nil {
|
||||
log.Fatalln("couldn't retry:", err)
|
||||
}
|
||||
sw := switcher.NewSwitcher(remoteControlBrowserURL, config)
|
||||
prv := providers.NewArcherAx50(sw.Page)
|
||||
err := sw.SwitchWIFI(prv)
|
||||
if err != nil {
|
||||
panic(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)
|
||||
}
|
||||
|
||||
6
pkg/provider/provider.go
Normal file
6
pkg/provider/provider.go
Normal file
@@ -0,0 +1,6 @@
|
||||
package provider
|
||||
|
||||
type ProviderIface interface {
|
||||
Login(user, pass string) error
|
||||
SwitchWIFI() error
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package switcher
|
||||
|
||||
type SwitcherIface interface {
|
||||
SwitchWIFI() error
|
||||
}
|
||||
Reference in New Issue
Block a user