First pass at validating network config with VintageNet
parent
0212e378de
commit
2d1fea5377
|
@ -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))
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue