wifimanager/networkmanager/networkmanager.go

117 lines
2.5 KiB
Go

package networkmanager
import (
"fmt"
"log"
"os/exec"
"strconv"
"strings"
"sync"
"time"
)
var nmMutex sync.Mutex
type Networklist struct {
SSID string
Signal int
Channel int
Encryption string
Connected bool
Known bool
}
func ConnectToAccessPoint(ifname string, ssid string, psk string) bool {
var pass string
Reset()
nmMutex.Lock()
defer nmMutex.Unlock()
log.Println("Connecting to " + ssid)
if psk != "" {
pass = fmt.Sprintf("password %s", pass)
} else {
pass = ""
}
command := fmt.Sprintf("nmcli -t -c no d wifi connect %s password %s ifname %s", ssid, psk, ifname)
cmd := exec.Command("sh", "-c", command)
o, err := cmd.CombinedOutput()
if err != nil {
log.Fatal("wifi connect: ", err, string(o))
}
log.Println("Response: " + string(o))
if strings.Contains(string(o), "Error") {
log.Println("Error connecting to network")
log.Println(err)
return false
}
if strings.Contains(string(o), "successfully activated") {
log.Println("Connected to " + ssid)
}
return true
}
func Reset() {
nmMutex.Lock()
defer nmMutex.Unlock()
cmd := exec.Command("sh", "-c", "nmcli -t -c no c")
o, err := cmd.CombinedOutput()
if err != nil {
log.Fatal("connections: ", err)
}
networks := strings.Split(string(o), "\n")
for _, n := range networks {
t := strings.Split(string(n), ":")
if len(t) == 4 {
if t[2] == "802-11-wireless" {
cmd = exec.Command("sh", "-c", "nmcli c delete "+t[1])
err = cmd.Run()
if err != nil {
log.Fatal("Deleting network: ", err)
}
}
}
}
}
func Scan(ifname string, timeout int) []Networklist {
var m []Networklist
nmMutex.Lock()
defer nmMutex.Unlock()
// log.Println("Scanning")
cmd := exec.Command("sh", "-c", "nmcli d wifi rescan ifname "+ifname)
_ = cmd.Run()
time.Sleep(time.Duration(timeout) * time.Second)
cmd = exec.Command("sh", "-c", "nmcli -t -c no d wifi list ifname "+ifname)
n, err := cmd.Output()
if err != nil {
log.Fatal("Listing: ", err)
}
networks := strings.Split(string(n), "\n")
for _, n := range networks {
t := strings.Split(n, ":")
if len(t) == 8 {
var l Networklist
l.SSID = t[1]
l.Signal, _ = strconv.Atoi(t[5])
l.Channel, _ = strconv.Atoi(t[3])
l.Encryption = t[7]
if t[0] == "*" {
l.Connected = true
} else {
l.Connected = false
}
m = append(m, l)
/* if t[0] == "*" {
fmt.Print("Currently Connected: ")
}
fmt.Printf("SSID: %s, Rate: %s, Signal: %s, Security: %s\n", t[1], t[4], t[5], t[7])
*/
}
}
return m
}