From 55b8f63f8e66806d384d01ffed2f8f7c58c2ac03 Mon Sep 17 00:00:00 2001 From: Patrick Fairbank Date: Sun, 19 Aug 2018 20:02:03 -0700 Subject: [PATCH] Rewrite access point configuration logic to use uci instead of uploading the whole wireless file each time. --- access_point_config.tar.gz | Bin 6574 -> 6623 bytes field/access_point.go | 69 +++++++++++++---------------------- field/access_point_test.go | 73 +++++++++++++------------------------ field/network_switch.go | 9 +++++ templates/access_point.cfg | 46 ----------------------- 5 files changed, 60 insertions(+), 137 deletions(-) delete mode 100644 templates/access_point.cfg diff --git a/access_point_config.tar.gz b/access_point_config.tar.gz index 7679723614c8900bd80d21e69a11d8b065a43465..8e1531df474d83f915331a772615afeb052abbbd 100644 GIT binary patch literal 6623 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 At^fc4 literal 6574 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 x#IM}Pj0%~5k4_Sg+F#9Ts5;M}VUkgJSzM /etc/config/wireless && wifi radio0\n%sENDCONFIG\n", config) + command := fmt.Sprintf("uci batch < /etc/config/wireless && wifi radio1\n%sENDCONFIG\n", config) + command := fmt.Sprintf("uci batch < 63 { return fmt.Errorf("Invalid WPA key '%s' configured for team %d.", team.WpaKey, team.Id) } - networks[vlan] = team + + *commands = append(*commands, fmt.Sprintf("set wireless.@wifi-iface[%d].ssid='%d'", position, team.Id), + fmt.Sprintf("set wireless.@wifi-iface[%d].key='%s'", position, team.WpaKey)) + return nil } diff --git a/field/access_point_test.go b/field/access_point_test.go index 5436482..5b203e4 100644 --- a/field/access_point_test.go +++ b/field/access_point_test.go @@ -7,80 +7,57 @@ import ( "github.com/Team254/cheesy-arena/model" "github.com/stretchr/testify/assert" "regexp" - "strconv" "testing" ) func TestConfigureAccessPoint(t *testing.T) { model.BaseDir = ".." - radioRe := regexp.MustCompile("option device 'radio0'") - ssidRe := regexp.MustCompile("option ssid '([-\\w ]+)'") - wpaKeyRe := regexp.MustCompile("option key '([-\\w ]+)'") - vlanRe := regexp.MustCompile("option network 'vlan(\\d+)'") - channelRe := regexp.MustCompile("option channel '(\\d+)'") + ssidRe := regexp.MustCompile("ssid='([-\\w ]+)'") + wpaKeyRe := regexp.MustCompile("key='([-\\w ]+)'") ap := AccessPoint{teamChannel: 1234, adminChannel: 4321, adminWpaKey: "blorpy"} // Should not configure any team SSIDs if there are no teams. config, _ := ap.generateAccessPointConfig(nil, nil, nil, nil, nil, nil) - assert.NotContains(t, config, "option device 'radio0'") + assert.NotContains(t, config, "set") ssids := ssidRe.FindAllStringSubmatch(config, -1) wpaKeys := wpaKeyRe.FindAllStringSubmatch(config, -1) - vlans := vlanRe.FindAllStringSubmatch(config, -1) - channels := channelRe.FindAllStringSubmatch(config, -1) - assert.Equal(t, "Cheesy Arena", ssids[0][1]) - assert.Equal(t, ap.adminWpaKey, wpaKeys[0][1]) - assert.Equal(t, "100", vlans[0][1]) - assert.Equal(t, strconv.Itoa(ap.adminChannel), channels[0][1]) - assert.Equal(t, strconv.Itoa(ap.teamChannel), channels[1][1]) + assert.Equal(t, 0, len(ssids)) + assert.Equal(t, 0, len(wpaKeys)) // Should configure two SSID for two teams. config, _ = ap.generateAccessPointConfig(&model.Team{Id: 254, WpaKey: "aaaaaaaa"}, nil, nil, nil, nil, &model.Team{Id: 1114, WpaKey: "bbbbbbbb"}) - assert.Equal(t, 2, len(radioRe.FindAllString(config, -1))) ssids = ssidRe.FindAllStringSubmatch(config, -1) wpaKeys = wpaKeyRe.FindAllStringSubmatch(config, -1) - vlans = vlanRe.FindAllStringSubmatch(config, -1) - assert.Equal(t, "Cheesy Arena", ssids[0][1]) - assert.Equal(t, ap.adminWpaKey, wpaKeys[0][1]) - assert.Equal(t, "100", vlans[0][1]) - assert.Equal(t, "254", ssids[1][1]) - assert.Equal(t, "aaaaaaaa", wpaKeys[1][1]) - assert.Equal(t, "10", vlans[1][1]) - assert.Equal(t, "1114", ssids[2][1]) - assert.Equal(t, "bbbbbbbb", wpaKeys[2][1]) - assert.Equal(t, "60", vlans[2][1]) + if assert.Equal(t, 2, len(ssids)) && assert.Equal(t, 2, len(wpaKeys)) { + assert.Equal(t, "254", ssids[0][1]) + assert.Equal(t, "aaaaaaaa", wpaKeys[0][1]) + assert.Equal(t, "1114", ssids[1][1]) + assert.Equal(t, "bbbbbbbb", wpaKeys[1][1]) + } // Should configure all SSIDs for six teams. config, _ = ap.generateAccessPointConfig(&model.Team{Id: 1, WpaKey: "11111111"}, &model.Team{Id: 2, WpaKey: "22222222"}, &model.Team{Id: 3, WpaKey: "33333333"}, &model.Team{Id: 4, WpaKey: "44444444"}, &model.Team{Id: 5, WpaKey: "55555555"}, &model.Team{Id: 6, WpaKey: "66666666"}) - assert.Equal(t, 6, len(radioRe.FindAllString(config, -1))) ssids = ssidRe.FindAllStringSubmatch(config, -1) wpaKeys = wpaKeyRe.FindAllStringSubmatch(config, -1) - vlans = vlanRe.FindAllStringSubmatch(config, -1) - assert.Equal(t, "Cheesy Arena", ssids[0][1]) - assert.Equal(t, ap.adminWpaKey, wpaKeys[0][1]) - assert.Equal(t, "100", vlans[0][1]) - assert.Equal(t, "1", ssids[1][1]) - assert.Equal(t, "11111111", wpaKeys[1][1]) - assert.Equal(t, "10", vlans[1][1]) - assert.Equal(t, "2", ssids[2][1]) - assert.Equal(t, "22222222", wpaKeys[2][1]) - assert.Equal(t, "20", vlans[2][1]) - assert.Equal(t, "3", ssids[3][1]) - assert.Equal(t, "33333333", wpaKeys[3][1]) - assert.Equal(t, "30", vlans[3][1]) - assert.Equal(t, "4", ssids[4][1]) - assert.Equal(t, "44444444", wpaKeys[4][1]) - assert.Equal(t, "40", vlans[4][1]) - assert.Equal(t, "5", ssids[5][1]) - assert.Equal(t, "55555555", wpaKeys[5][1]) - assert.Equal(t, "50", vlans[5][1]) - assert.Equal(t, "6", ssids[6][1]) - assert.Equal(t, "66666666", wpaKeys[6][1]) - assert.Equal(t, "60", vlans[6][1]) + if assert.Equal(t, 6, len(ssids)) && assert.Equal(t, 6, len(wpaKeys)) { + assert.Equal(t, "1", ssids[0][1]) + assert.Equal(t, "11111111", wpaKeys[0][1]) + assert.Equal(t, "2", ssids[1][1]) + assert.Equal(t, "22222222", wpaKeys[1][1]) + assert.Equal(t, "3", ssids[2][1]) + assert.Equal(t, "33333333", wpaKeys[2][1]) + assert.Equal(t, "4", ssids[3][1]) + assert.Equal(t, "44444444", wpaKeys[3][1]) + assert.Equal(t, "5", ssids[4][1]) + assert.Equal(t, "55555555", wpaKeys[4][1]) + assert.Equal(t, "6", ssids[5][1]) + assert.Equal(t, "66666666", wpaKeys[5][1]) + } // Should reject a missing WPA key. _, err := ap.generateAccessPointConfig(&model.Team{Id: 254}, nil, nil, nil, nil, nil) diff --git a/field/network_switch.go b/field/network_switch.go index f9c9160..2c43cbc 100644 --- a/field/network_switch.go +++ b/field/network_switch.go @@ -18,6 +18,15 @@ import ( const switchTelnetPort = 23 +const ( + red1Vlan = 10 + red2Vlan = 20 + red3Vlan = 30 + blue1Vlan = 40 + blue2Vlan = 50 + blue3Vlan = 60 +) + type NetworkSwitch struct { address string port int diff --git a/templates/access_point.cfg b/templates/access_point.cfg deleted file mode 100644 index 736dfc4..0000000 --- a/templates/access_point.cfg +++ /dev/null @@ -1,46 +0,0 @@ -config wifi-device 'radio1' - option type 'mac80211' - option channel '{{.AdminChannel}}' - option hwmode '11g' - option path 'soc/soc:pcie-controller/pci0000:00/0000:00:02.0/0000:02:00.0' - option htmode 'HT20' - option disabled '0' - option txpower '20' - option country 'US' - -config wifi-iface - option device 'radio1' - option mode 'ap' - option hidden '1' - option encryption 'psk2+ccmp' - option network 'vlan100' - option ssid 'Cheesy Arena' - option key '{{.AdminWpaKey}}' - option macaddr '62:38:e0:12:6b:17' - -config wifi-device 'radio0' - option type 'mac80211' - option hwmode '11a' - option path 'soc/soc:pcie-controller/pci0000:00/0000:00:01.0/0000:01:00.0' - option txpower '23' - option channel '{{.TeamChannel}}' - option country 'US' - option htmode 'HT20' - option basic_rates '6500,7200' - option short_gi_20 '0' - -{{range $vlan, $team := .Networks}} -config wifi-iface - option device 'radio0' - option mode 'ap' - option isolate '0' - option bgscan '0' - option wds '0' - option maxassoc '1' - option hidden '1' - option network 'vlan{{$vlan}}' - option encryption 'psk2+ccmp' - option ssid '{{$team.Id}}' - option key '{{$team.WpaKey}}' - option disabled '0' -{{end}}