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 }