117 lines
2.5 KiB
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
|
|
}
|