gopkg.in/hugelgupf/u-root.v4@v4.0.0-20180831060141-1d761fb73d50/cmds/wifi/wifi.go (about) 1 // Copyright 2017 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "flag" 9 "fmt" 10 "log" 11 "os" 12 "os/exec" 13 "regexp" 14 "strings" 15 16 "github.com/u-root/u-root/pkg/wifi" 17 ) 18 19 const ( 20 cmd = "wifi [options] essid [passphrase] [identity]" 21 ) 22 23 var ( 24 // flags 25 iface = flag.String("i", "wlan0", "interface to use") 26 list = flag.Bool("l", false, "list all nearby WiFi") 27 show = flag.Bool("s", false, "list interfaces allowed with WiFi extension") 28 test = flag.Bool("test", false, "set up a test server") 29 wType = flag.String("worker", "iwl", "What kind of wireless layer to use") 30 31 // RegEx for parsing iwconfig output 32 iwconfigRE = regexp.MustCompile("(?m)^[a-zA-Z0-9]+\\s*IEEE 802.11.*$") 33 34 // Stub data for simple end-to-end interaction test 35 NearbyWifisStub = []wifi.Option{ 36 {"Stub1", wifi.NoEnc}, 37 {"Stub2", wifi.WpaPsk}, 38 {"Stub3", wifi.WpaEap}, 39 {"Stub4", wifi.NotSupportedProto}, 40 } 41 workers = map[string]func(string) (wifi.WiFi, error){ 42 "iwl": wifi.NewIWLWorker, 43 "native": wifi.NewNativeWorker, 44 } 45 ) 46 47 func parseIwconfig(o []byte) (res []string) { 48 interfaces := iwconfigRE.FindAll(o, -1) 49 for _, i := range interfaces { 50 res = append(res, strings.Split(string(i), " ")[0]) 51 } 52 return 53 } 54 55 func init() { 56 defUsage := flag.Usage 57 flag.Usage = func() { 58 os.Args[0] = cmd 59 defUsage() 60 } 61 } 62 63 func main() { 64 flag.Parse() 65 66 // Start a Server with Stub data 67 // for manual end-to-end testing 68 // This is probably in need of a change. 69 if *test { 70 worker, err := wifi.NewStubWorker("", NearbyWifisStub...) 71 if err != nil { 72 log.Fatal(err) 73 } 74 service, err := NewWifiService(worker) 75 if err != nil { 76 log.Fatal(err) 77 } 78 service.Start() 79 NewWifiServer(service).Start() // this function shutdown service upon return 80 return 81 } 82 83 if *show { 84 o, err := exec.Command("iwconfig").CombinedOutput() 85 if err != nil { 86 log.Fatalf("iwconfig: %v (%v)", string(o), err) 87 } 88 for _, i := range parseIwconfig(o) { 89 fmt.Println(i) 90 } 91 return 92 } 93 94 f, ok := workers[*wType] 95 if !ok { 96 log.Fatalf("%v: not in %v", *wType, workers) 97 } 98 worker, err := f(*iface) 99 if err != nil { 100 log.Fatal(err) 101 } 102 if *list { 103 wifiOpts, err := worker.Scan() 104 if err != nil { 105 log.Fatalf("error: %v", err) 106 } 107 for _, wifiOpt := range wifiOpts { 108 switch wifiOpt.AuthSuite { 109 case wifi.NoEnc: 110 fmt.Printf("%s: No Passphrase\n", wifiOpt.Essid) 111 case wifi.WpaPsk: 112 fmt.Printf("%s: WPA-PSK (only passphrase)\n", wifiOpt.Essid) 113 case wifi.WpaEap: 114 fmt.Printf("%s: WPA-EAP (passphrase and identity)\n", wifiOpt.Essid) 115 case wifi.NotSupportedProto: 116 fmt.Printf("%s: Not a supported protocol\n", wifiOpt.Essid) 117 } 118 } 119 return 120 } 121 122 a := flag.Args() 123 if len(a) > 3 { 124 flag.Usage() 125 os.Exit(1) 126 } 127 128 // Experimental Part 129 if len(a) == 0 { 130 if o, err := exec.Command("ip", "link", "set", "dev", "lo", "up").CombinedOutput(); err != nil { 131 log.Fatalf("ip link set dev lo: %v (%v)", string(o), err) 132 } 133 service, err := NewWifiService(worker) 134 if err != nil { 135 log.Fatal(err) 136 } 137 service.Start() 138 go service.Refresh() 139 NewWifiServer(service).Start() // this function shutdown service upon return 140 return 141 } 142 143 if err := worker.Connect(a...); err != nil { 144 log.Fatalf("error: %v", err) 145 } 146 }