Make sure to serialize env into farmwawre runtime
parent
109498c806
commit
2cbd62b554
|
@ -1,2 +1,2 @@
|
||||||
erlang 20.0
|
erlang 20.0
|
||||||
elixir 1.5.0
|
elixir 1.5.2
|
||||||
|
|
|
@ -49,7 +49,7 @@ config :farmbot, Farmbot.System.ConfigStorage,
|
||||||
config :farmbot, :behaviour,
|
config :farmbot, :behaviour,
|
||||||
authorization: Farmbot.Bootstrap.Authorization,
|
authorization: Farmbot.Bootstrap.Authorization,
|
||||||
system_tasks: Farmbot.Host.SystemTasks,
|
system_tasks: Farmbot.Host.SystemTasks,
|
||||||
update_handler: Farmbot.Host.UpdateHandler,
|
update_handler: Farmbot.Host.UpdateHandler
|
||||||
firmware_handler: Farmbot.Firmware.UartHandler
|
# firmware_handler: Farmbot.Firmware.UartHandler
|
||||||
|
|
||||||
config :farmbot, :uart_handler, tty: "/dev/ttyACM0"
|
config :farmbot, :uart_handler, tty: "/dev/ttyACM0"
|
||||||
|
|
|
@ -3,18 +3,24 @@ defmodule Farmbot.CeleryScript.AST.Node.ExecuteScript do
|
||||||
use Farmbot.CeleryScript.AST.Node
|
use Farmbot.CeleryScript.AST.Node
|
||||||
allow_args [:label]
|
allow_args [:label]
|
||||||
|
|
||||||
def execute(%{label: label}, _, env) do
|
def execute(%{label: label}, pairs, env) do
|
||||||
env = mutate_env(env)
|
env = mutate_env(env)
|
||||||
case Farmbot.Farmware.lookup(label) do
|
case Farmbot.Farmware.lookup(label) do
|
||||||
{:ok, fw} -> do_execute(fw, env)
|
{:ok, fw} -> do_execute(fw, pairs, env)
|
||||||
{:error, reason} -> {:error, reason, env}
|
{:error, reason} -> {:error, reason, env}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp do_execute(%Farmbot.Farmware{} = fw, env) do
|
defp do_execute(%Farmbot.Farmware{} = fw, pairs, env) do
|
||||||
case Farmbot.Farmware.execute(fw) do
|
case Farmbot.Farmware.execute(fw, to_fw_env(pairs)) do
|
||||||
%Farmbot.Farmware.Runtime{exit_status: 0} -> {:ok, env}
|
%Farmbot.Farmware.Runtime{exit_status: 0} -> {:ok, env}
|
||||||
%Farmbot.Farmware.Runtime{} -> {:error, "Farmware failed", env}
|
%Farmbot.Farmware.Runtime{} -> {:error, "Farmware failed", env}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp to_fw_env(pairs, acc \\ [])
|
||||||
|
defp to_fw_env([], acc), do: acc
|
||||||
|
defp to_fw_env([%{args: %{label: key, value: value}} | rest], acc) do
|
||||||
|
to_fw_env(rest, [{key, value} | acc])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -124,7 +124,7 @@ defmodule Farmbot.Farmware do
|
||||||
:meta,
|
:meta,
|
||||||
]
|
]
|
||||||
|
|
||||||
defdelegate execute(fw), to: Farmbot.Farmware.Runtime
|
defdelegate execute(fw, env), to: Farmbot.Farmware.Runtime
|
||||||
|
|
||||||
@doc "Lookup a farmware by it's name."
|
@doc "Lookup a farmware by it's name."
|
||||||
def lookup(name) do
|
def lookup(name) do
|
||||||
|
|
|
@ -10,12 +10,12 @@ defmodule Farmbot.Farmware.Runtime do
|
||||||
defstruct [:farmware, :env, :port, :exit_status, :working_dir, :return_dir]
|
defstruct [:farmware, :env, :port, :exit_status, :working_dir, :return_dir]
|
||||||
|
|
||||||
@doc "Execute a Farmware struct."
|
@doc "Execute a Farmware struct."
|
||||||
def execute(%Farmware{} = farmware) do
|
def execute(%Farmware{} = farmware, env) when is_list(env) do
|
||||||
Logger.busy(2, "Beginning execution of #{inspect(farmware)}")
|
Logger.busy(2, "Beginning execution of #{inspect(farmware)}")
|
||||||
fw_path = Installer.install_path(farmware) |> Path.absname("#{:code.priv_dir(:farmbot)}/..")
|
fw_path = Installer.install_path(farmware) |> Path.absname("#{:code.priv_dir(:farmbot)}/..")
|
||||||
cwd = File.cwd!()
|
cwd = File.cwd!()
|
||||||
with :ok <- File.cd(fw_path),
|
with :ok <- File.cd(fw_path),
|
||||||
env <- build_env(farmware) do
|
env <- build_env(farmware, env) do
|
||||||
exec = farmware.executable
|
exec = farmware.executable
|
||||||
|
|
||||||
opts = [
|
opts = [
|
||||||
|
@ -75,7 +75,7 @@ defmodule Farmbot.Farmware.Runtime do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp build_env(%Farmware{config: config, name: fw_name} = _farmware) do
|
def build_env(%Farmware{config: config, name: fw_name} = _farmware, env) do
|
||||||
token = Farmbot.System.ConfigStorage.get_config_value(:string, "authorization", "token")
|
token = Farmbot.System.ConfigStorage.get_config_value(:string, "authorization", "token")
|
||||||
images_dir = "/tmp/images"
|
images_dir = "/tmp/images"
|
||||||
|
|
||||||
|
@ -88,6 +88,7 @@ defmodule Farmbot.Farmware.Runtime do
|
||||||
|> Map.put("FARMWARE_URL", "http://localhost:27347/")
|
|> Map.put("FARMWARE_URL", "http://localhost:27347/")
|
||||||
|> Map.put("FARMBOT_OS_VERSION", @fbos_version)
|
|> Map.put("FARMBOT_OS_VERSION", @fbos_version)
|
||||||
|> Map.merge(Farmbot.BotState.get_user_env())
|
|> Map.merge(Farmbot.BotState.get_user_env())
|
||||||
|
|> Map.merge(Map.new(env))
|
||||||
|> Enum.map(fn {key, val} -> {to_erl_safe(key), to_erl_safe(val)} end)
|
|> Enum.map(fn {key, val} -> {to_erl_safe(key), to_erl_safe(val)} end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,7 @@ defmodule Farmbot.Firmware.UartHandler do
|
||||||
{:noreply, [], state}
|
{:noreply, [], state}
|
||||||
end
|
end
|
||||||
|
|
||||||
defp handle_config({:config, "settings", key, val}, state)
|
defp handle_config({:config, "settings", key, _val}, state)
|
||||||
when key in ["firmware_input_log", "firmware_output_log"]
|
when key in ["firmware_input_log", "firmware_output_log"]
|
||||||
do
|
do
|
||||||
# Restart the framing to pick up new changes.
|
# Restart the framing to pick up new changes.
|
||||||
|
|
Loading…
Reference in New Issue