Make sure to serialize env into farmwawre runtime

pull/380/head
Connor Rigby 2017-12-08 15:48:23 -08:00
parent 109498c806
commit 2cbd62b554
6 changed files with 19 additions and 12 deletions

View File

@ -1,2 +1,2 @@
erlang 20.0
elixir 1.5.0
elixir 1.5.2

View File

@ -49,7 +49,7 @@ config :farmbot, Farmbot.System.ConfigStorage,
config :farmbot, :behaviour,
authorization: Farmbot.Bootstrap.Authorization,
system_tasks: Farmbot.Host.SystemTasks,
update_handler: Farmbot.Host.UpdateHandler,
firmware_handler: Farmbot.Firmware.UartHandler
update_handler: Farmbot.Host.UpdateHandler
# firmware_handler: Farmbot.Firmware.UartHandler
config :farmbot, :uart_handler, tty: "/dev/ttyACM0"

View File

@ -3,18 +3,24 @@ defmodule Farmbot.CeleryScript.AST.Node.ExecuteScript do
use Farmbot.CeleryScript.AST.Node
allow_args [:label]
def execute(%{label: label}, _, env) do
def execute(%{label: label}, pairs, env) do
env = mutate_env(env)
case Farmbot.Farmware.lookup(label) do
{:ok, fw} -> do_execute(fw, env)
{:ok, fw} -> do_execute(fw, pairs, env)
{:error, reason} -> {:error, reason, env}
end
end
defp do_execute(%Farmbot.Farmware{} = fw, env) do
case Farmbot.Farmware.execute(fw) do
defp do_execute(%Farmbot.Farmware{} = fw, pairs, env) do
case Farmbot.Farmware.execute(fw, to_fw_env(pairs)) do
%Farmbot.Farmware.Runtime{exit_status: 0} -> {:ok, env}
%Farmbot.Farmware.Runtime{} -> {:error, "Farmware failed", env}
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

View File

@ -124,7 +124,7 @@ defmodule Farmbot.Farmware do
:meta,
]
defdelegate execute(fw), to: Farmbot.Farmware.Runtime
defdelegate execute(fw, env), to: Farmbot.Farmware.Runtime
@doc "Lookup a farmware by it's name."
def lookup(name) do

View File

@ -10,12 +10,12 @@ defmodule Farmbot.Farmware.Runtime do
defstruct [:farmware, :env, :port, :exit_status, :working_dir, :return_dir]
@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)}")
fw_path = Installer.install_path(farmware) |> Path.absname("#{:code.priv_dir(:farmbot)}/..")
cwd = File.cwd!()
with :ok <- File.cd(fw_path),
env <- build_env(farmware) do
env <- build_env(farmware, env) do
exec = farmware.executable
opts = [
@ -75,7 +75,7 @@ defmodule Farmbot.Farmware.Runtime do
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")
images_dir = "/tmp/images"
@ -88,6 +88,7 @@ defmodule Farmbot.Farmware.Runtime do
|> Map.put("FARMWARE_URL", "http://localhost:27347/")
|> Map.put("FARMBOT_OS_VERSION", @fbos_version)
|> 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)
end

View File

@ -105,7 +105,7 @@ defmodule Farmbot.Firmware.UartHandler do
{:noreply, [], state}
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"]
do
# Restart the framing to pick up new changes.