Skip to content

Commit

Permalink
Use IOdata instead of post processing
Browse files Browse the repository at this point in the history
  • Loading branch information
ConnorRigby committed May 9, 2019
1 parent 3574006 commit 591cde2
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 61 deletions.
95 changes: 44 additions & 51 deletions lib/vintage_net/technology/wifi.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@ defmodule VintageNet.Technology.WiFi do
alias VintageNet.WiFi.{Scan, WPA2}
alias VintageNet.Interface.RawConfig

# this is used to indicate that an entire line should be deleted from the final config.
@mark_for_deletion "MARK_FOR_DELETION"

@impl true
def to_raw_config(ifname, %{type: __MODULE__, wifi: wifi_config} = config, opts) do
ifup = Keyword.fetch!(opts, :bin_ifup)
Expand Down Expand Up @@ -97,69 +94,62 @@ defmodule VintageNet.Technology.WiFi do
end

defp wifi_to_supplicant_contents(wifi, control_interface_path, regulatory_domain) do
content =
"""
ctrl_interface=#{control_interface_path}
country=#{regulatory_domain}
""" <> into_wifi_network_config(wifi)

strip_marks(content)
[
"ctrl_interface=#{control_interface_path}",
"\n",
"country=#{regulatory_domain}",
"\n",
into_wifi_network_config(wifi)
]
|> IO.iodata_to_binary()
end

defp key_mgmt_to_string(key) when key in [:none, :wep], do: "NONE"
defp key_mgmt_to_string(:wpa_psk), do: "WPA-PSK"
defp key_mgmt_to_string(:wpa_eap), do: "WPA-EAP"

defp into_wifi_network_config(%{networks: networks}) do
Enum.reduce(networks, "", fn network, config ->
config <> into_wifi_network_config(network)
end)
Enum.map(networks, &into_wifi_network_config/1)
end

defp into_wifi_network_config(%{key_mgmt: :wep} = wifi) do
"""
network={
#{into_config_string(wifi, :ssid)}
key_mgmt=NONE
wep_tx_keyidx=0
wep_key0=#{wifi.psk}
}
"""
network_config([
into_config_string(wifi, :ssid),
"key_mgmt=NONE",
"wep_tx_keyidx=0",
"wep_key0=#{wifi.psk}"
])
end

defp into_wifi_network_config(%{key_mgmt: :wpa_eap} = wifi) do
"""
network={
#{into_config_string(wifi, :ssid)}
#{into_config_string(wifi, :key_mgmt)}
#{into_config_string(wifi, :scan_ssid)}
#{into_config_string(wifi, :priority)}
#{into_config_string(wifi, :pairwise)}
#{into_config_string(wifi, :group)}
#{into_config_string(wifi, :eap)}
#{into_config_string(wifi, :identity)}
#{into_config_string(wifi, :password)}
#{into_config_string(wifi, :phase1)}
#{into_config_string(wifi, :phase2)}
}
"""
network_config([
into_config_string(wifi, :ssid),
into_config_string(wifi, :key_mgmt),
into_config_string(wifi, :scan_ssid),
into_config_string(wifi, :priority),
into_config_string(wifi, :pairwise),
into_config_string(wifi, :group),
into_config_string(wifi, :eap),
into_config_string(wifi, :identity),
into_config_string(wifi, :password),
into_config_string(wifi, :phase1),
into_config_string(wifi, :phase2)
])
end

defp into_wifi_network_config(wifi) do
"""
network={
#{into_config_string(wifi, :ssid)}
#{into_config_string(wifi, :psk)}
#{into_config_string(wifi, :key_mgmt)}
#{into_config_string(wifi, :scan_ssid)}
#{into_config_string(wifi, :priority)}
}
"""
network_config([
into_config_string(wifi, :ssid),
into_config_string(wifi, :psk),
into_config_string(wifi, :key_mgmt),
into_config_string(wifi, :scan_ssid),
into_config_string(wifi, :priority)
])
end

defp into_config_string(wifi, opt_key) do
case Map.get(wifi, opt_key) do
nil -> "#{@mark_for_deletion}"
nil -> nil
opt -> wifi_opt_to_config_string(wifi, opt_key, opt)
end
end
Expand Down Expand Up @@ -231,10 +221,13 @@ defmodule VintageNet.Technology.WiFi do
to_string(hostname)
end

defp strip_marks(data) do
data
|> String.split("\n")
|> Enum.reject(&String.match?(&1, ~r(#{@mark_for_deletion})))
|> Enum.join("\n")
defp network_config(config) do
config =
Enum.map(config, fn
nil -> []
conf -> [conf, "\n"]
end)

["network={", "\n", config, "}", "\n"]
end
end
20 changes: 10 additions & 10 deletions test/vintage_net/config_wifi_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -268,16 +268,16 @@ defmodule VintageNet.ConfigWiFiTest do
ctrl_interface=/tmp/vintage_net/wpa_supplicant
country=00
network={
ssid="testing"
key_mgmt=WPA-EAP
scan_ssid=1
pairwise=CCMP TKIP
group=CCMP TKIP
eap=PEAP
identity=user1
password=supersecret
phase1=peapver=auto
phase2=MSCHAPV2
ssid="testing"
key_mgmt=WPA-EAP
scan_ssid=1
pairwise=CCMP TKIP
group=CCMP TKIP
eap=PEAP
identity=user1
password=supersecret
phase1=peapver=auto
phase2=MSCHAPV2
}
"""}
],
Expand Down

0 comments on commit 591cde2

Please sign in to comment.