fix farmware, logs, etc

This commit is contained in:
connor rigby 2017-11-09 13:59:26 -08:00
parent 17a865c232
commit 8d5157546f
10 changed files with 127 additions and 16 deletions

View file

@ -116,7 +116,9 @@ defmodule Farmbot.BotState do
sync_status: :sync_now,
},
user_env: %{},
process_info: %{}
process_info: %{
farmwares: %{}
}
@doc "Get a current pin value."
def get_pin_value(num) do
@ -143,6 +145,16 @@ defmodule Farmbot.BotState do
GenStage.call(__MODULE__, :force_state_push)
end
@doc "Register a farmware in the bot's state."
def register_farmware(%Farmbot.Farmware{} = fw) do
GenStage.call(__MODULE__, {:register_farmware, fw})
end
@doc "Unregister a farmware form the bot's state."
def unregister_farmware(%Farmbot.Farmware{} = fw) do
GenStage.call(__MODULE__, {:unregister_farmware, fw})
end
@doc "Emit an AST."
def emit(%AST{} = ast) do
GenStage.call(__MODULE__, {:emit, ast})
@ -222,6 +234,34 @@ defmodule Farmbot.BotState do
{:reply, state.location_data.position, [], state}
end
def handle_call({:register_farmware, fw}, _, state) do
ser_fw_meta = %{
min_os_version_major: fw.min_os_version_major,
description: fw.meta.description,
language: fw.meta.language,
version: to_string(fw.version),
author: fw.meta.author,
zip: fw.zip
}
ser_fw = %{
args: fw.args,
executable: fw.executable,
meta: ser_fw_meta,
name: fw.name,
path: Farmbot.Farmware.Installer.install_path(fw),
url: fw.url
}
new_pi = Map.put(state.process_info.farmwares, fw.name, ser_fw)
new_state = %{state | process_info: %{farmwares: new_pi}}
{:reply, :ok, [new_state], new_state}
end
def handle_call({:unregister_farmware, fw}, _, state) do
new_pi = Map.delete(state.process_info.farmware, fw.name)
new_state = %{state | process_info: %{farmwares: new_pi}}
{:reply, :ok, [new_state], new_state}
end
defp do_handle([], state), do: state
defp do_handle([{:config, "settings", key, val} | rest], state) do

View file

@ -80,7 +80,7 @@ defmodule Farmbot.BotState.Transport.GenMQTT.Client do
{:ok, state}
end
def on_publish(["bot", _, "sync", "Log", _], _, state) do
def on_publish(["bot", _, "sync", ignore, _], _, state) when ignore in ["Log", "User", "Image"] do
{:ok, state}
end

View file

@ -39,7 +39,7 @@ defmodule Farmbot.BotState.Transport.GenMQTT do
if log.module == nil or Module.split(log.module || Elixir.Logger) |> List.first == "Farmbot" do
location_data = Map.get(old_bot_state || %{}, :location_data, %{position: %{x: -1, y: -1, z: -1}})
meta = %{type: log.level, x: nil, y: nil, z: nil}
log_without_pos = %{meta: meta, channels: log.meta[:channels] || [], message: log.message}
log_without_pos = %{created_at: log.time, meta: meta, channels: log.meta[:channels] || [], message: log.message}
log = add_position_to_log(log_without_pos, location_data)
Client.push_bot_log(client, log)
end

View file

@ -0,0 +1,67 @@
defmodule Farmbot.CeleryScript.AST.Arg.Device do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def decode(val), do: {:ok, val}
def encode(val), do: {:ok, val}
end
defmodule Farmbot.CeleryScript.AST.Arg.FarmEvents do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def decode(val), do: {:ok, val}
def encode(val), do: {:ok, val}
end
defmodule Farmbot.CeleryScript.AST.Arg.Points do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def decode(val), do: {:ok, val}
def encode(val), do: {:ok, val}
end
defmodule Farmbot.CeleryScript.AST.Arg.Peripherals do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def decode(val), do: {:ok, val}
def encode(val), do: {:ok, val}
end
defmodule Farmbot.CeleryScript.AST.Arg.Regimens do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def decode(val), do: {:ok, val}
def encode(val), do: {:ok, val}
end
defmodule Farmbot.CeleryScript.AST.Arg.Tools do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def decode(val), do: {:ok, val}
def encode(val), do: {:ok, val}
end
defmodule Farmbot.CeleryScript.AST.Arg.ToolSlots do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def decode(val), do: {:ok, val}
def encode(val), do: {:ok, val}
end
defmodule Farmbot.CeleryScript.AST.Node.DataUpdate do
@moduledoc false
use Farmbot.CeleryScript.AST.Node
allow_args [:value, :device, :farm_events, :points, :peripherals, :regimens, :sequences, :tool_slots, :tools]
def execute(_, _, env) do
{:ok, env}
end
end

View file

@ -109,7 +109,7 @@ defmodule Farmbot.Farmware do
defmodule Meta do
@moduledoc "Metadata about a Farmware."
defstruct [:author, :language,:description]
defstruct [:author, :language, :description]
end
defstruct [

View file

@ -82,6 +82,9 @@ defmodule Farmbot.Farmware.Installer do
finish_install(farmware, json_map)
else
{:error, {name, version, :already_installed}} ->
# v = Version.parse!(version)
{:ok, fw} = Farmbot.Farmware.lookup(name, version |> to_string())
Farmbot.BotState.register_farmware(fw)
Logger.info 1, "Farmware #{name} - #{version} is already installed."
:ok
{:ok, %{status_code: code, body: body}} ->
@ -103,7 +106,8 @@ defmodule Farmbot.Farmware.Installer do
Logger.warn 2, "Uninstalling farmware: #{inspect fw}"
install_path = install_path(fw)
case File.rm_rf(install_path) do
{:ok, _} -> :ok
{:ok, _} ->
Farmbot.BotState.unregister_farmware(fw)
{:error, _} = err -> err
end
end
@ -143,11 +147,12 @@ defmodule Farmbot.Farmware.Installer do
zip_url = fw.zip
with {:ok, ^zip_path} <- HTTP.download_file(zip_url, zip_path),
:ok <- unzip(fw, zip_path),
{:ok, json} <- Poison.encode(json_map)
do
manifest_path = Path.join(install_path(fw), "manifest.json")
File.write(manifest_path,json)
end
{:ok, json} <- Poison.encode(json_map),
manifest_path <- Path.join(install_path(fw), "manifest.json"),
:ok <- File.write(manifest_path, json)
do
Farmbot.BotState.register_farmware(fw)
end
end
defp unzip(%Farmware{} = fw, zip_path) do

View file

@ -90,7 +90,7 @@ defmodule Farmbot.HTTP do
@doc "Upload a file to FB storage."
def upload_file(path, meta \\ nil) do
if File.exists?(path) do
GenServer.call(__MODULE__, {:upload_file, path, meta})
GenServer.call(__MODULE__, {:upload_file, {path, meta}})
else
{:error, "#{path} not found"}
end

View file

@ -68,9 +68,8 @@ defmodule Farmbot.HTTP.HTTPoisonAdapter do
defp finish_upload({:ok, %Response{status_code: code}}, http, atch_url, meta) when is_2xx(code) do
with {:ok, body} <- Poison.encode(%{"attachment_url" => atch_url, "meta" => meta}) do
case request(http, :post, "/api/images", body, [], []) do
{:ok, %Response{status_code: code}} when is_2xx(code) ->
# debug_log("#{atch_url} should exist shortly.")
:ok
{:ok, %Response{status_code: code} = resp} when is_2xx(code) ->
{:ok, resp}
{:ok, %Response{} = response} ->
{:error, response}

View file

@ -88,7 +88,7 @@ defmodule Farmbot.Logger do
end
def handle_cast({:dispatch_log, {env, level, verbosity, message, meta}}, state) do
time = :os.system_time()
time = :os.system_time(:seconds)
fun = case env.function do
{fun, ar} -> "#{fun}/#{ar}"
nil -> "no_function"

View file

@ -117,7 +117,7 @@ defmodule Farmbot.Mixfile do
{:nerves_network, "~> 0.3", github: "nerves-project/nerves_network", override: true},
# {:dhcp_server, path: "/home/connor/oss/elixir/nerves/dhcp_server", override: true},
{:dhcp_server, github: "nerves-project/dhcp_server", branch: "elixirize-go!", override: true},
{:nerves_init_gadget, github: "nerves-project/nerves_init_gadget", branch: "dhcp", only: :dev},
# {:nerves_init_gadget, github: "nerves-project/nerves_init_gadget", branch: "dhcp", only: :dev},
# {:nerves_init_gadget, path: "/home/connor/oss/elixir/nerves/nerves_init_gadget", branch: "dhcp", only: :dev},
]
end