From a448e9200077cede0e189b243fdad41463959d8e Mon Sep 17 00:00:00 2001 From: DaanSelen Date: Thu, 8 Jan 2026 17:30:28 +0100 Subject: [PATCH] chore: update code --- go.mod | 5 ++++- go.sum | 4 ++++ src/action.go | 42 +++++++++++++++++++++++++++++++++++++++++- src/draw.go | 34 +++++++++++++++++++++++++++++++++- src/main.go | 7 +++++++ 5 files changed, 89 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 8ed051b..9bbf526 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,10 @@ module rpi-charon go 1.25.5 -require fyne.io/fyne/v2 v2.7.2 +require ( + fyne.io/fyne/v2 v2.7.2 + golang.org/x/crypto v0.46.0 +) require ( fyne.io/systray v1.12.0 // indirect diff --git a/go.sum b/go.sum index f9b78bf..0287239 100644 --- a/go.sum +++ b/go.sum @@ -67,12 +67,16 @@ github.com/yuin/goldmark v1.7.16 h1:n+CJdUxaFMiDUNnWC3dMWCIQJSkxH4uz3ZwQBkAlVNE= github.com/yuin/goldmark v1.7.16/go.mod h1:ip/1k0VRfGynBgxOz0yCqHrbZXhcjxyuS66Brc7iBKg= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/image v0.34.0 h1:33gCkyw9hmwbZJeZkct8XyR11yH889EQt/QH4VmXMn8= golang.org/x/image v0.34.0/go.mod h1:2RNFBZRB+vnwwFil8GkMdRvrJOFd1AzdZI6vOY+eJVU= golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/src/action.go b/src/action.go index 75cc460..b4e0073 100644 --- a/src/action.go +++ b/src/action.go @@ -1,5 +1,45 @@ package main -func connect() { +import ( + "log" + "net" + "time" + "golang.org/x/crypto/ssh" +) + +func translateRaspiName(targetName string) (string, string) { + for _, raspiObj := range raspiList { + if raspiObj[0] == targetName { + // Found! + return raspiObj[1], raspiObj[2] + } + } + + return "", "" +} + +func verifyCred(username, password, targetName string) bool { + hostname, port := translateRaspiName(targetName) + log.Println("Connecting to:", hostname, port) + + config := &ssh.ClientConfig{ + User: username, + Auth: []ssh.AuthMethod{ + ssh.Password(password), + }, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), // OK for internal tools (and me in production) + Timeout: 5 * time.Second, + } + + connAddr := net.JoinHostPort(hostname, port) + client, err := ssh.Dial("tcp", connAddr, config) + + if err != nil { + log.Printf("Err occurred %v", err) + return false + } + defer client.Close() + + return true } diff --git a/src/draw.go b/src/draw.go index c14b39b..a0611ba 100644 --- a/src/draw.go +++ b/src/draw.go @@ -3,6 +3,7 @@ package main import ( "image/color" "log" + "time" "fyne.io/fyne/v2" "fyne.io/fyne/v2/canvas" @@ -12,6 +13,23 @@ import ( "fyne.io/fyne/v2/widget" ) +func flashRed(btnPtr *widget.Button) { + // Set red on UI thread + fyne.CurrentApp().Driver().DoFromGoroutine(func() { + btnPtr.Importance = widget.DangerImportance + refreshButtons(btnPtr) + }, false) + + log.Println("Waiting") + time.Sleep(1 * time.Second) + + // Reset on UI thread + fyne.CurrentApp().Driver().DoFromGoroutine(func() { + btnPtr.Importance = widget.LowImportance + refreshButtons(btnPtr) + }, false) +} + func drawSeparator(trailNewLine bool) *fyne.Container { emptyLabel := widget.NewLabel("") // Give it some space at the bottom with an empty line separatorLine := canvas.NewLine(color.Gray{Y: 128}) @@ -126,10 +144,24 @@ func drawTargetSection(raspiNames []string, raspiTarget *string) *fyne.Container ) var verifyBtn *widget.Button + var credOK bool verifyBtn = widget.NewButton("Verify Credentials", func() { verifyBtn.Importance = widget.HighImportance + log.Println("Verifying credentials...") - refreshButtons(verifyBtn) + go func() { + credOK = verifyCred(userEntry.Text, passEntry.Text, *raspiTarget) + + if credOK { + // Must update UI on main thread + fyne.CurrentApp().Driver().DoFromGoroutine(func() { + verifyBtn.Importance = widget.SuccessImportance + refreshButtons(verifyBtn) + }, true) + } else { + flashRed(verifyBtn) // flashRed should handle RunOnMain internally + } + }() }) verifyWide := container.NewGridWrap( buttonSize, diff --git a/src/main.go b/src/main.go index b001065..b1dcfc2 100644 --- a/src/main.go +++ b/src/main.go @@ -10,6 +10,13 @@ import ( "fyne.io/fyne/v2/widget" ) +type ActionConfig struct { + username string + password string + hostname string + port int +} + const ( appName string = "RPi Charon Configuration Tool" )