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  }