First pass at validating network config with VintageNet

pull/974/head
Connor Rigby 2019-06-19 09:26:25 -07:00
parent 0212e378de
commit 2d1fea5377
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
2 changed files with 180 additions and 16 deletions

View File

@ -82,7 +82,13 @@ defmodule FarmbotOS.Platform.Target.Configurator.Router do
# NETWORKCONFIG
get "/network" do
interfaces = []
interfaces = Enum.map(VintageNet.all_interfaces(), fn(ifname) ->
FarmbotCore.Logger.error 1, "Fix mac_address for #{ifname}"
settings = %{
mac_address: "fixme-#{:rand.uniform()}"
}
{ifname, settings}
end)
render_page(conn, "network", interfaces: interfaces, post_action: "select_interface")
end
@ -172,9 +178,12 @@ defmodule FarmbotOS.Platform.Target.Configurator.Router do
security == "WPA-PSK" ->
render_page(conn, "/config_wireless_step_2_PSK", opts)
security == "WPA-PSK" ->
security == "WPA2-PSK" ->
render_page(conn, "/config_wireless_step_2_PSK", opts)
security == "WPA-EAP" ->
render_page(conn, "/config_wireless_step_2_EAP", opts)
security == "NONE" ->
render_page(conn, "/config_wireless_step_2_NONE", opts)
@ -208,20 +217,43 @@ defmodule FarmbotOS.Platform.Target.Configurator.Router do
ssh_key && update_config_value(:string, "settings", "authorized_ssh_key", ssh_key)
# Network Interface configuration data
_ssid = conn.params["ssid"] |> remove_empty_string()
_type = if(ssid, do: "wireless", else: "wired")
_security = conn.params["security"] |> remove_empty_string()
_psk = conn.params["psk"] |> remove_empty_string()
_identity = conn.params["identity"] |> remove_empty_string()
_password = conn.params["password"] |> remove_empty_string()
_domain = conn.params["domain"] |> remove_empty_string()
_name_servers = conn.params["name_servers"] |> remove_empty_string()
_ipv4_method = conn.params["ipv4_method"] |> remove_empty_string()
_ipv4_address = conn.params["ipv4_address"] |> remove_empty_string()
_ipv4_gateway = conn.params["ipv4_gateway"] |> remove_empty_string()
_ipv4_subnet_mask = conn.params["ipv4_subnet_mask"] |> remove_empty_string()
_reg_domain = conn.params["regulatory_domain"] |> remove_empty_string()
redir(conn, "/firmware")
ssid = conn.params["ssid"] |> remove_empty_string()
type = if(ssid, do: "wireless", else: "wired")
security = conn.params["security"] |> remove_empty_string()
psk = conn.params["psk"] |> remove_empty_string()
identity = conn.params["identity"] |> remove_empty_string()
password = conn.params["password"] |> remove_empty_string()
domain = conn.params["domain"] |> remove_empty_string()
name_servers = conn.params["name_servers"] |> remove_empty_string()
ipv4_method = conn.params["ipv4_method"] |> remove_empty_string()
ipv4_address = conn.params["ipv4_address"] |> remove_empty_string()
ipv4_gateway = conn.params["ipv4_gateway"] |> remove_empty_string()
ipv4_subnet_mask = conn.params["ipv4_subnet_mask"] |> remove_empty_string()
reg_domain = conn.params["regulatory_domain"] |> remove_empty_string()
config = %{
type: FarmbotOS.Platform.Target.Configurator.Validator,
network_type: type,
ssid: ssid,
security: security,
psk: psk,
identity: identity,
password: password,
domain: domain,
name_servers: name_servers,
ipv4_method: ipv4_method,
ipv4_address: ipv4_address,
ipv4_gateway: ipv4_gateway,
ipv4_subnet_mask: ipv4_subnet_mask,
regulatory_domain: reg_domain,
}
case VintageNet.configuration_valid?(ifname, config) do
true ->
FarmbotCore.Logger.error 1, "Do something with the raw config here"
redir(conn, "/firmware")
false ->
FarmbotCore.Logger.error 1, "Error validating network configuration"
redir(conn, "/network")
end
rescue
e in MissingField ->
FarmbotCore.Logger.error(1, Exception.message(e))

View File

@ -0,0 +1,132 @@
defmodule FarmbotOS.Platform.Target.Configurator.Validator do
@moduledoc """
Handles turning Farmbot's internal network representation into
either a VintageNet.Technology.Ethernet or VintageNet.Technology.WiFi
RawConfig.
"""
@behaviour VintageNet.Technology
@impl VintageNet.Technology
def normalize(%{
network_type: _,
ssid: _,
security: _,
psk: _,
identity: _,
password: _,
domain: _,
name_servers: _,
ipv4_method: _,
ipv4_address: _,
ipv4_gateway: _,
ipv4_subnet_mask: _,
regulatory_domain: _
} = config) do
{:ok, config}
end
def normalize(_) do
{:error, :incomplete_config}
end
@impl VintageNet.Technology
def to_raw_config(ifname, %{network_type: type} = config, opts) do
case type do
"wired" -> to_wired_raw_config(ifname, config, opts)
"wireless" -> to_wireless_raw_config(ifname, config, opts)
end
end
def to_wired_raw_config(ifname, config, opts) do
config = %{
type: VintageNet.Technology.Ethernet,
ipv4: to_ipv4(config)
}
vintage_ethernet(ifname, config, opts)
end
def to_wireless_raw_config(ifname, config, opts) do
config = %{
type: VintageNet.Technology.WiFi,
ipv4: to_ipv4(config),
wifi: to_wifi(config)
}
vintage_wifi(ifname, config, opts)
end
@impl VintageNet.Technology
def check_system(_opts) do
:ok
end
@impl true
def ioctl(_ifname, _ioctl, _args) do
{:error, :unsupported}
end
defp to_ipv4(%{
ipv4_method: "static",
# TODO(Connor) fix nameservers
# name_servers: name_servers,
# domain: domain,
ipv4_address: ipv4_address,
ipv4_gateway: ipv4_gateway,
ipv4_subnet_mask: ipv4_subnet_mask}) do
%{
method: :static,
address: ipv4_address,
netmask: ipv4_subnet_mask,
gateway: ipv4_gateway
}
end
defp to_ipv4(%{ipv4_method: "dhcp"}) do
%{method: :dhcp}
end
defp to_wifi(%{security: "NONE", ssid: ssid}) do
%{
key_mgmt: :none,
scan_ssid: 1,
ssid: ssid
}
end
defp to_wifi(%{security: "WPA_PSK", ssid: ssid, psk: psk}) do
%{
key_mgmt: :wpa_psk,
scan_ssid: 1,
ssid: ssid,
psk: psk
}
end
defp to_wifi(%{security: "WPA2_PSK", ssid: ssid, psk: psk}) do
%{
key_mgmt: :wpa_psk,
scan_ssid: 1,
ssid: ssid,
psk: psk
}
end
defp to_wifi(%{security: "WPA_EAP", ssid: ssid, identity: id, password: pw}) do
%{
key_mgmt: :wpa_eap,
scan_ssid: 1,
ssid: ssid,
identity: id,
password: pw
}
end
defp vintage_ethernet(ifname, config, opts) do
with {:ok, config} <- VintageNet.Technology.Ethernet.normalize(config),
do: VintageNet.Technology.Ethernet.to_raw_config(ifname, config, opts)
end
defp vintage_wifi(ifname, config, opts) do
with {:ok, config} <- VintageNet.Technology.WiFi.normalize(config),
do: VintageNet.Technology.WiFi.to_raw_config(ifname, config, opts)
end
end