Remove diag dumps

pull/1135/head
Rick Carlino 2020-02-04 14:11:17 -06:00
parent 1fd1b2bbcb
commit f0b0ff10b0
18 changed files with 201 additions and 349 deletions

View File

@ -31,11 +31,6 @@ defmodule FarmbotCeleryScript.AST.Factory do
) )
end end
def dump_info(%AST{} = ast) do
ast
|> add_body_node(new(:dump_info))
end
def emergency_lock(%AST{} = ast) do def emergency_lock(%AST{} = ast) do
ast ast
|> add_body_node(new(:emergency_lock)) |> add_body_node(new(:emergency_lock))

View File

@ -279,12 +279,6 @@ defmodule FarmbotCeleryScript.Compiler do
end end
end end
def dump_info(_, _env) do
quote location: :keep do
FarmbotCeleryScript.SysCalls.dump_info()
end
end
defp print_compiled_code(compiled) do defp print_compiled_code(compiled) do
IO.puts("========") IO.puts("========")

View File

@ -29,7 +29,6 @@ defmodule FarmbotCeleryScript.SysCalls do
@callback check_update() :: ok_or_error @callback check_update() :: ok_or_error
@callback coordinate(x :: number, y :: number, z :: number) :: @callback coordinate(x :: number, y :: number, z :: number) ::
%{x: number(), y: number(), z: number()} | error %{x: number(), y: number(), z: number()} | error
@callback dump_info() :: ok_or_error
@callback emergency_lock() :: ok_or_error @callback emergency_lock() :: ok_or_error
@callback emergency_unlock() :: ok_or_error @callback emergency_unlock() :: ok_or_error
@callback execute_script(package, args :: map()) :: ok_or_error @callback execute_script(package, args :: map()) :: ok_or_error
@ -172,10 +171,6 @@ defmodule FarmbotCeleryScript.SysCalls do
coord_or_error(sys_calls, :coordinate, [x, y, z]) coord_or_error(sys_calls, :coordinate, [x, y, z])
end end
def dump_info(sys_calls \\ @sys_calls) do
ok_or_error(sys_calls, :dump_info, [])
end
def emergency_lock(sys_calls \\ @sys_calls) do def emergency_lock(sys_calls \\ @sys_calls) do
ok_or_error(sys_calls, :emergency_lock, []) ok_or_error(sys_calls, :emergency_lock, [])
end end

View File

@ -28,9 +28,6 @@ defmodule FarmbotCeleryScript.SysCalls.Stubs do
@impl true @impl true
def coordinate(x, y, z), do: error(:coordinate, [x, y, z]) def coordinate(x, y, z), do: error(:coordinate, [x, y, z])
@impl true
def dump_info(), do: error(:dump_info, [])
@impl true @impl true
def emergency_lock(), do: error(:emergency_lock, []) def emergency_lock(), do: error(:emergency_lock, [])

View File

@ -3,7 +3,7 @@ defmodule FarmbotCeleryScript.Corpus.NodeTest do
alias FarmbotCeleryScript.Corpus alias FarmbotCeleryScript.Corpus
test "inspect" do test "inspect" do
assert "Sequence(version, locals) [calibrate, change_ownership, check_updates, dump_info, emergency_lock, emergency_unlock, execute, execute_script, factory_reset, find_home, flash_firmware, home, install_farmware, install_first_party_farmware, _if, move_absolute, move_relative, power_off, read_pin, read_status, reboot, remove_farmware, resource_update, send_message, set_servo_angle, set_user_env, sync, take_photo, toggle_pin, update_farmware, wait, write_pin, zero]" = assert "Sequence(version, locals) [calibrate, change_ownership, check_updates, emergency_lock, emergency_unlock, execute, execute_script, factory_reset, find_home, flash_firmware, home, install_farmware, install_first_party_farmware, _if, move_absolute, move_relative, power_off, read_pin, read_status, reboot, remove_farmware, resource_update, send_message, set_servo_angle, set_user_env, sync, take_photo, toggle_pin, update_farmware, wait, write_pin, zero]" =
inspect(Corpus.sequence()) inspect(Corpus.sequence())
end end
end end

View File

@ -9,7 +9,6 @@ defmodule FarmbotCore.Asset do
Repo, Repo,
Device, Device,
DeviceCert, DeviceCert,
DiagnosticDump,
FarmwareEnv, FarmwareEnv,
FirstPartyFarmware, FirstPartyFarmware,
FarmwareInstallation, FarmwareInstallation,
@ -54,6 +53,7 @@ defmodule FarmbotCore.Asset do
if device = Repo.get_by(Device, id: id) do if device = Repo.get_by(Device, id: id) do
Repo.delete!(device) Repo.delete!(device)
end end
:ok :ok
end end
@ -79,12 +79,13 @@ defmodule FarmbotCore.Asset do
def update_farm_event!(farm_event, params) do def update_farm_event!(farm_event, params) do
farm_event = farm_event =
farm_event |> farm_event
FarmEvent.changeset(params) |> FarmEvent.changeset(params)
|> Repo.update!() |> Repo.update!()
if farm_event.executable_type == "Regimen" do if farm_event.executable_type == "Regimen" do
regimen_instance = get_regimen_instance(farm_event) regimen_instance = get_regimen_instance(farm_event)
if regimen_instance do if regimen_instance do
regimen_instance regimen_instance
|> Repo.preload([:farm_event, :regimen]) |> Repo.preload([:farm_event, :regimen])
@ -111,9 +112,11 @@ defmodule FarmbotCore.Asset do
def get_farm_event_execution(%FarmEvent{} = farm_event, scheduled_at) do def get_farm_event_execution(%FarmEvent{} = farm_event, scheduled_at) do
Repo.one( Repo.one(
from e in FarmEvent.Execution, from(e in FarmEvent.Execution,
where: e.farm_event_local_id == ^farm_event.local_id where:
and e.scheduled_at == ^scheduled_at e.farm_event_local_id == ^farm_event.local_id and
e.scheduled_at == ^scheduled_at
)
) )
end end
@ -149,6 +152,7 @@ defmodule FarmbotCore.Asset do
if fbos_config = Repo.get_by(FbosConfig, id: id) do if fbos_config = Repo.get_by(FbosConfig, id: id) do
Repo.delete!(fbos_config) Repo.delete!(fbos_config)
end end
:ok :ok
end end
@ -177,6 +181,7 @@ defmodule FarmbotCore.Asset do
if firmware_config = Repo.get_by(FirmwareConfig, id: id) do if firmware_config = Repo.get_by(FirmwareConfig, id: id) do
Repo.delete!(firmware_config) Repo.delete!(firmware_config)
end end
:ok :ok
end end
@ -192,12 +197,19 @@ defmodule FarmbotCore.Asset do
end end
def get_regimen_instance(%FarmEvent{} = farm_event) do def get_regimen_instance(%FarmEvent{} = farm_event) do
regimen = Repo.one(from r in Regimen, where: r.id == ^farm_event.executable_id) regimen = Repo.one(from(r in Regimen, where: r.id == ^farm_event.executable_id))
regimen && Repo.one(from ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id and ri.farm_event_id == ^farm_event.local_id)
regimen &&
Repo.one(
from(ri in RegimenInstance,
where: ri.regimen_id == ^regimen.local_id and ri.farm_event_id == ^farm_event.local_id
)
)
end end
def new_regimen_instance!(%FarmEvent{} = farm_event, params \\ %{}) do def new_regimen_instance!(%FarmEvent{} = farm_event, params \\ %{}) do
regimen = Repo.one!(from r in Regimen, where: r.id == ^farm_event.executable_id) regimen = Repo.one!(from(r in Regimen, where: r.id == ^farm_event.executable_id))
RegimenInstance.changeset(%RegimenInstance{}, params) RegimenInstance.changeset(%RegimenInstance{}, params)
|> Ecto.Changeset.put_assoc(:regimen, regimen) |> Ecto.Changeset.put_assoc(:regimen, regimen)
|> Ecto.Changeset.put_assoc(:farm_event, farm_event) |> Ecto.Changeset.put_assoc(:farm_event, farm_event)
@ -217,9 +229,11 @@ defmodule FarmbotCore.Asset do
def get_regimen_instance_execution(%RegimenInstance{} = ri, scheduled_at) do def get_regimen_instance_execution(%RegimenInstance{} = ri, scheduled_at) do
Repo.one( Repo.one(
from e in RegimenInstance.Execution, from(e in RegimenInstance.Execution,
where: e.regimen_instance_local_id == ^ri.local_id where:
and e.scheduled_at == ^scheduled_at e.regimen_instance_local_id == ^ri.local_id and
e.scheduled_at == ^scheduled_at
)
) )
end end
@ -248,7 +262,7 @@ defmodule FarmbotCore.Asset do
@doc "Returns all points matching Point.pointer_type" @doc "Returns all points matching Point.pointer_type"
def get_all_points_by_type(type, order_by \\ "random") do def get_all_points_by_type(type, order_by \\ "random") do
(from p in Point, where: p.pointer_type == ^type and is_nil(p.discarded_at)) from(p in Point, where: p.pointer_type == ^type and is_nil(p.discarded_at))
|> Repo.all() |> Repo.all()
|> sort_points(order_by) |> sort_points(order_by)
end end
@ -257,7 +271,7 @@ defmodule FarmbotCore.Asset do
points points
|> Enum.group_by(&group_points_by(&1, order_by)) |> Enum.group_by(&group_points_by(&1, order_by))
|> Enum.sort(&group_sort(&1, &2, order_by)) |> Enum.sort(&group_sort(&1, &2, order_by))
|> Enum.map(fn({_group_index, group}) -> Enum.sort(group, &sort_points(&1, &2, order_by)) end) |> Enum.map(fn {_group_index, group} -> Enum.sort(group, &sort_points(&1, &2, order_by)) end)
|> List.flatten() |> List.flatten()
end end
@ -272,7 +286,6 @@ defmodule FarmbotCore.Asset do
def group_sort({lgroup, _}, {rgroup, _}, "yx_descending"), do: lgroup >= rgroup def group_sort({lgroup, _}, {rgroup, _}, "yx_descending"), do: lgroup >= rgroup
def group_sort(_, _, "random"), do: Enum.random([true, false]) def group_sort(_, _, "random"), do: Enum.random([true, false])
def sort_points(%{y: ly}, %{y: ry}, "xy_ascending"), do: ly <= ry def sort_points(%{y: ly}, %{y: ry}, "xy_ascending"), do: ly <= ry
def sort_points(%{y: ly}, %{y: ry}, "xy_descending"), do: ly >= ry def sort_points(%{y: ly}, %{y: ry}, "xy_descending"), do: ly >= ry
def sort_points(%{x: lx}, %{x: rx}, "yx_ascending"), do: lx <= rx def sort_points(%{x: lx}, %{x: rx}, "yx_ascending"), do: lx <= rx
@ -293,7 +306,7 @@ defmodule FarmbotCore.Asset do
%{point_ids: unsorted, sort_type: sort_by} = point_group -> %{point_ids: unsorted, sort_type: sort_by} = point_group ->
sorted = sorted =
Repo.all(from p in Point, where: p.id in ^unsorted) Repo.all(from(p in Point, where: p.id in ^unsorted))
|> sort_points(sort_by) |> sort_points(sort_by)
|> Enum.map(&Map.fetch!(&1, :id)) |> Enum.map(&Map.fetch!(&1, :id))
@ -322,7 +335,7 @@ defmodule FarmbotCore.Asset do
for asset <- farm_events ++ regimen_instances do for asset <- farm_events ++ regimen_instances do
# TODO(Connor) this might be worth creating a behaviour for # TODO(Connor) this might be worth creating a behaviour for
if uses_point_group?(asset, point_group) do if uses_point_group?(asset, point_group) do
Logger.debug "#{inspect(asset)} uses PointGroup: #{inspect(point_group)}. Reindexing it." Logger.debug("#{inspect(asset)} uses PointGroup: #{inspect(point_group)}. Reindexing it.")
FarmbotCore.AssetSupervisor.update_child(asset) FarmbotCore.AssetSupervisor.update_child(asset)
end end
end end
@ -335,12 +348,14 @@ defmodule FarmbotCore.Asset do
end end
def uses_point_group?(%FarmEvent{body: body}, %PointGroup{id: point_group_id}) do def uses_point_group?(%FarmEvent{body: body}, %PointGroup{id: point_group_id}) do
any_body_node_uses_point_group?(body, point_group_id) any_body_node_uses_point_group?(body, point_group_id)
end end
def uses_point_group?(%Regimen{body: body, regimen_items: regimen_items}, %PointGroup{id: point_group_id}) do def uses_point_group?(%Regimen{body: body, regimen_items: regimen_items}, %PointGroup{
any_body_node_uses_point_group?(body, point_group_id) || Enum.find(regimen_items, fn(%{sequence_id: sequence_id}) -> id: point_group_id
}) do
any_body_node_uses_point_group?(body, point_group_id) ||
Enum.find(regimen_items, fn %{sequence_id: sequence_id} ->
any_body_node_uses_point_group?(get_sequence(sequence_id).body, point_group_id) any_body_node_uses_point_group?(get_sequence(sequence_id).body, point_group_id)
end) end)
end end
@ -354,7 +369,9 @@ defmodule FarmbotCore.Asset do
%{ %{
kind: "execute", kind: "execute",
body: execute_body body: execute_body
} -> any_body_node_uses_point_group?(execute_body, point_group_id) } ->
any_body_node_uses_point_group?(execute_body, point_group_id)
%{ %{
args: %{ args: %{
"data_value" => %{ "data_value" => %{
@ -364,7 +381,8 @@ defmodule FarmbotCore.Asset do
"label" => "parent" "label" => "parent"
}, },
kind: "parameter_application" kind: "parameter_application"
} -> true } ->
true
%{ %{
args: %{ args: %{
@ -375,8 +393,11 @@ defmodule FarmbotCore.Asset do
"label" => "parent" "label" => "parent"
}, },
kind: "parameter_application" kind: "parameter_application"
} -> true } ->
_ -> false true
_ ->
false
end) end)
end end
@ -407,6 +428,7 @@ defmodule FarmbotCore.Asset do
def new_public_key_from_home!() do def new_public_key_from_home!() do
public_key_path = Path.join([System.get_env("HOME"), ".ssh", "id_rsa.pub"]) public_key_path = Path.join([System.get_env("HOME"), ".ssh", "id_rsa.pub"])
public_key = File.read!(public_key_path) public_key = File.read!(public_key_path)
%PublicKey{} %PublicKey{}
|> PublicKey.changeset(%{public_key: public_key}) |> PublicKey.changeset(%{public_key: public_key})
|> Repo.insert() |> Repo.insert()
@ -435,18 +457,23 @@ defmodule FarmbotCore.Asset do
end end
def delete_regimen!(regimen) do def delete_regimen!(regimen) do
regimen_instances = Repo.all(from ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id) regimen_instances =
Repo.all(from(ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id))
for ri <- regimen_instances do for ri <- regimen_instances do
IO.puts "deleting regimen instance: #{inspect(ri)}" IO.puts("deleting regimen instance: #{inspect(ri)}")
delete_regimen_instance!(ri) delete_regimen_instance!(ri)
end end
Repo.delete!(regimen) Repo.delete!(regimen)
end end
@doc "Update an existing regimen" @doc "Update an existing regimen"
def update_regimen!(regimen, params) do def update_regimen!(regimen, params) do
regimen_instances = Repo.all(from ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id) regimen_instances =
Repo.all(from(ri in RegimenInstance, where: ri.regimen_id == ^regimen.local_id))
|> Repo.preload([:farm_event, :regimen]) |> Repo.preload([:farm_event, :regimen])
for ri <- regimen_instances do for ri <- regimen_instances do
ri ri
|> RegimenInstance.changeset(%{updated_at: DateTime.utc_now()}) |> RegimenInstance.changeset(%{updated_at: DateTime.utc_now()})
@ -469,11 +496,18 @@ defmodule FarmbotCore.Asset do
def update_sequence!(%Sequence{} = sequence, params \\ %{}) do def update_sequence!(%Sequence{} = sequence, params \\ %{}) do
sequence_id = sequence.id sequence_id = sequence.id
farm_events = Repo.all(from f in FarmEvent,
where: f.executable_type == "Sequence"
and f.executable_id == ^sequence_id)
regimen_instances = RegimenInstance farm_events =
Repo.all(
from(f in FarmEvent,
where:
f.executable_type == "Sequence" and
f.executable_id == ^sequence_id
)
)
regimen_instances =
RegimenInstance
|> Repo.all() |> Repo.all()
|> Repo.preload([:regimen, :farm_event]) |> Repo.preload([:regimen, :farm_event])
|> Enum.filter(fn |> Enum.filter(fn
@ -483,7 +517,8 @@ defmodule FarmbotCore.Asset do
%{sequence_id: _} -> true %{sequence_id: _} -> true
end) end)
%{regimen: nil} -> false %{regimen: nil} ->
false
end) end)
for asset <- farm_events ++ regimen_instances do for asset <- farm_events ++ regimen_instances do
@ -507,6 +542,7 @@ defmodule FarmbotCore.Asset do
def get_farmware_manifest(package) do def get_farmware_manifest(package) do
first_party_farmwares = Repo.all(from(fwi in FirstPartyFarmware, select: fwi.manifest)) first_party_farmwares = Repo.all(from(fwi in FirstPartyFarmware, select: fwi.manifest))
regular_farmwares = Repo.all(from(fwi in FarmwareInstallation, select: fwi.manifest)) regular_farmwares = Repo.all(from(fwi in FarmwareInstallation, select: fwi.manifest))
Enum.find( Enum.find(
first_party_farmwares ++ regular_farmwares, first_party_farmwares ++ regular_farmwares,
fn fn
@ -519,6 +555,7 @@ defmodule FarmbotCore.Asset do
def get_farmware_installation(package) do def get_farmware_installation(package) do
first_party_farmwares = Repo.all(from(fwi in FirstPartyFarmware)) first_party_farmwares = Repo.all(from(fwi in FirstPartyFarmware))
regular_farmwares = Repo.all(from(fwi in FarmwareInstallation)) regular_farmwares = Repo.all(from(fwi in FarmwareInstallation))
Enum.find( Enum.find(
first_party_farmwares ++ regular_farmwares, first_party_farmwares ++ regular_farmwares,
fn fn
@ -530,12 +567,14 @@ defmodule FarmbotCore.Asset do
def upsert_farmware_manifest_by_id(id, params) do def upsert_farmware_manifest_by_id(id, params) do
fwi = Repo.get_by(FarmwareInstallation, id: id) || %FarmwareInstallation{} fwi = Repo.get_by(FarmwareInstallation, id: id) || %FarmwareInstallation{}
FarmwareInstallation.changeset(fwi, params) FarmwareInstallation.changeset(fwi, params)
|> Repo.insert_or_update() |> Repo.insert_or_update()
end end
def upsert_first_party_farmware_manifest_by_id(id, params) do def upsert_first_party_farmware_manifest_by_id(id, params) do
fwi = Repo.get_by(FirstPartyFarmware, id: id) || %FirstPartyFarmware{} fwi = Repo.get_by(FirstPartyFarmware, id: id) || %FirstPartyFarmware{}
FirstPartyFarmware.changeset(fwi, params) FirstPartyFarmware.changeset(fwi, params)
|> Repo.insert_or_update() |> Repo.insert_or_update()
end end
@ -557,8 +596,10 @@ defmodule FarmbotCore.Asset do
def new_farmware_env(params) do def new_farmware_env(params) do
key = params["key"] || params[:key] key = params["key"] || params[:key]
fwe = with key when is_binary(key) <- key,
[fwe | _] <- Repo.all(from fwe in FarmwareEnv, where: fwe.key == ^key) do fwe =
with key when is_binary(key) <- key,
[fwe | _] <- Repo.all(from(fwe in FarmwareEnv, where: fwe.key == ^key)) do
fwe fwe
else else
_ -> %FarmwareEnv{} _ -> %FarmwareEnv{}
@ -624,15 +665,6 @@ defmodule FarmbotCore.Asset do
## End SensorReading ## End SensorReading
## Begin DiagnosticDump
def new_diagnostic_dump(params) do
DiagnosticDump.changeset(%DiagnosticDump{}, params)
|> Repo.insert()
end
## End DiagnosticDump
## Begin DeviceCert ## Begin DeviceCert
def new_device_cert(params) do def new_device_cert(params) do

View File

@ -4,6 +4,7 @@ defmodule FarmbotCore.Asset.Command do
""" """
require Logger require Logger
alias FarmbotCore.{Asset, Asset.Repo} alias FarmbotCore.{Asset, Asset.Repo}
alias FarmbotCore.Asset.{ alias FarmbotCore.Asset.{
Device, Device,
FarmEvent, FarmEvent,
@ -112,6 +113,7 @@ defmodule FarmbotCore.Asset.Command do
def update(FarmEvent, id, params) do def update(FarmEvent, id, params) do
old = Asset.get_farm_event(id) old = Asset.get_farm_event(id)
if old, if old,
do: Asset.update_farm_event!(old, params), do: Asset.update_farm_event!(old, params),
else: Asset.new_farm_event!(params) else: Asset.new_farm_event!(params)
@ -121,6 +123,7 @@ defmodule FarmbotCore.Asset.Command do
def update(PublicKey, id, params) do def update(PublicKey, id, params) do
old = Asset.get_public_key(id) old = Asset.get_public_key(id)
if old, if old,
do: Asset.update_public_key!(old, params), do: Asset.update_public_key!(old, params),
else: Asset.new_public_key!(params) else: Asset.new_public_key!(params)
@ -130,6 +133,7 @@ defmodule FarmbotCore.Asset.Command do
def update(Regimen, id, params) do def update(Regimen, id, params) do
old = Asset.get_regimen(id) old = Asset.get_regimen(id)
if old, if old,
do: Asset.update_regimen!(old, params), do: Asset.update_regimen!(old, params),
else: Asset.new_regimen!(params) else: Asset.new_regimen!(params)
@ -139,6 +143,7 @@ defmodule FarmbotCore.Asset.Command do
def update(Sensor, id, params) do def update(Sensor, id, params) do
old = Asset.get_sensor(id) old = Asset.get_sensor(id)
if old, if old,
do: Asset.update_sensor!(old, params), do: Asset.update_sensor!(old, params),
else: Asset.new_sensor!(params) else: Asset.new_sensor!(params)
@ -148,6 +153,7 @@ defmodule FarmbotCore.Asset.Command do
def update(SensorReading, id, params) do def update(SensorReading, id, params) do
old = Asset.get_sensor_reading(id) old = Asset.get_sensor_reading(id)
if old, if old,
do: Asset.update_sensor_reading!(old, params), do: Asset.update_sensor_reading!(old, params),
else: Asset.new_sensor_reading!(params) else: Asset.new_sensor_reading!(params)
@ -157,6 +163,7 @@ defmodule FarmbotCore.Asset.Command do
def update(Sequence, id, params) do def update(Sequence, id, params) do
old = Asset.get_sequence(id) old = Asset.get_sequence(id)
if old, if old,
do: Asset.update_sequence!(old, params), do: Asset.update_sequence!(old, params),
else: Asset.new_sequence!(params) else: Asset.new_sequence!(params)
@ -172,6 +179,7 @@ defmodule FarmbotCore.Asset.Command do
def update(PointGroup, id, params) do def update(PointGroup, id, params) do
old = Asset.get_point_group(id: id) old = Asset.get_point_group(id: id)
if old, if old,
do: Asset.update_point_group!(old, params), do: Asset.update_point_group!(old, params),
else: Asset.new_point_group!(params) else: Asset.new_point_group!(params)
@ -181,8 +189,9 @@ defmodule FarmbotCore.Asset.Command do
# Catch-all use case: # Catch-all use case:
def update(asset_kind, id, params) do def update(asset_kind, id, params) do
Logger.warn "AssetCommand needs implementation: #{asset_kind}" Logger.warn("AssetCommand needs implementation: #{asset_kind}")
mod = as_module!(asset_kind) mod = as_module!(asset_kind)
case Repo.get_by(mod, id: id) do case Repo.get_by(mod, id: id) do
nil -> nil ->
struct!(mod) struct!(mod)
@ -206,7 +215,6 @@ defmodule FarmbotCore.Asset.Command do
end end
defp as_module!("Device"), do: Asset.Device defp as_module!("Device"), do: Asset.Device
defp as_module!("DiagnosticDump"), do: Asset.DiagnosticDump
defp as_module!("FarmEvent"), do: Asset.FarmEvent defp as_module!("FarmEvent"), do: Asset.FarmEvent
defp as_module!("FarmwareEnv"), do: Asset.FarmwareEnv defp as_module!("FarmwareEnv"), do: Asset.FarmwareEnv
defp as_module!("FirstPartyFarmware"), do: Asset.FirstPartyFarmware defp as_module!("FirstPartyFarmware"), do: Asset.FirstPartyFarmware

View File

@ -1,58 +0,0 @@
defmodule FarmbotCore.Asset.DiagnosticDump do
@moduledoc """
Just the DiagDump REST resource, used by FarmBot staff to help users debug
remote device problems.
"""
use FarmbotCore.Asset.Schema, path: "/api/diagnostic_dumps"
schema "diagnostic_dumps" do
field(:id, :id)
has_one(:local_meta, FarmbotCore.Asset.Private.LocalMeta,
on_delete: :delete_all,
references: :local_id,
foreign_key: :asset_local_id
)
field(:ticket_identifier, :string)
field(:fbos_commit, :string)
field(:fbos_version, :string)
field(:firmware_commit, :string)
field(:firmware_state, :string)
field(:network_interface, :string)
field(:fbos_dmesg_dump, :string)
field(:monitor, :boolean, default: true)
timestamps()
end
view diagnostic_dump do
%{
id: diagnostic_dump.id,
ticket_identifier: diagnostic_dump.ticket_identifier,
fbos_commit: diagnostic_dump.fbos_commit,
fbos_version: diagnostic_dump.fbos_version,
firmware_commit: diagnostic_dump.firmware_commit,
firmware_state: diagnostic_dump.firmware_state,
network_interface: diagnostic_dump.network_interface,
fbos_dmesg_dump: diagnostic_dump.fbos_dmesg_dump
}
end
def changeset(diagnostic_dump, params \\ %{}) do
diagnostic_dump
|> cast(params, [
:id,
:ticket_identifier,
:fbos_commit,
:fbos_version,
:firmware_commit,
:firmware_state,
:network_interface,
:fbos_dmesg_dump,
:monitor,
:created_at,
:updated_at
])
|> validate_required([])
end
end

View File

@ -103,7 +103,6 @@ defimpl String.Chars, for: FarmbotCore.Asset.PinBinding do
"Button #{button_number}: #{format_action(action)} (Pi #{pin_num})" "Button #{button_number}: #{format_action(action)} (Pi #{pin_num})"
end end
defp format_action("dump_info"), do: "Dump Info"
defp format_action("emergency_lock"), do: "E-Stop" defp format_action("emergency_lock"), do: "E-Stop"
defp format_action("emergency_unlock"), do: "E-Unlock" defp format_action("emergency_unlock"), do: "E-Unlock"
defp format_action("power_off"), do: "Power Off" defp format_action("power_off"), do: "Power Off"

View File

@ -9,7 +9,6 @@ defmodule FarmbotCore.Asset.Private.LocalMeta do
alias FarmbotCore.Asset.{ alias FarmbotCore.Asset.{
Repo, Repo,
Device, Device,
DiagnosticDump,
DeviceCert, DeviceCert,
FarmEvent, FarmEvent,
FarmwareEnv, FarmwareEnv,
@ -47,13 +46,6 @@ defmodule FarmbotCore.Asset.Private.LocalMeta do
define_field: false define_field: false
) )
belongs_to(:diagnostic_dump, DiagnosticDump,
foreign_key: :asset_local_id,
type: :binary_id,
references: :local_id,
define_field: false
)
belongs_to(:farm_event, FarmEvent, belongs_to(:farm_event, FarmEvent,
foreign_key: :asset_local_id, foreign_key: :asset_local_id,
type: :binary_id, type: :binary_id,
@ -174,8 +166,7 @@ defmodule FarmbotCore.Asset.Private.LocalMeta do
"firmware_configs", "firmware_configs",
"fbos_configs", "fbos_configs",
"farmware_installations", "farmware_installations",
"farmware_envs", "farmware_envs"
"diagnostic_dumps"
]) ])
|> unsafe_validate_unique([:table, :asset_local_id], Repo, |> unsafe_validate_unique([:table, :asset_local_id], Repo,
message: "LocalMeta already exists." message: "LocalMeta already exists."

View File

@ -41,7 +41,6 @@ defmodule FarmbotCore.Asset.Sync do
embeds_many(:devices, Item) embeds_many(:devices, Item)
embeds_many(:firmware_configs, Item) embeds_many(:firmware_configs, Item)
embeds_many(:fbos_configs, Item) embeds_many(:fbos_configs, Item)
embeds_many(:diagnostic_dumps, Item)
embeds_many(:farm_events, Item) embeds_many(:farm_events, Item)
embeds_many(:farmware_envs, Item) embeds_many(:farmware_envs, Item)
embeds_many(:first_party_farmwares, Item) embeds_many(:first_party_farmwares, Item)
@ -65,7 +64,6 @@ defmodule FarmbotCore.Asset.Sync do
devices: Enum.map(sync.device, &Item.render/1), devices: Enum.map(sync.device, &Item.render/1),
fbos_configs: Enum.map(sync.fbos_config, &Item.render/1), fbos_configs: Enum.map(sync.fbos_config, &Item.render/1),
firmware_configs: Enum.map(sync.firmware_config, &Item.render/1), firmware_configs: Enum.map(sync.firmware_config, &Item.render/1),
diagnostic_dumps: Enum.map(sync.diagnostic_dumps, &Item.render/1),
farm_events: Enum.map(sync.farm_events, &Item.render/1), farm_events: Enum.map(sync.farm_events, &Item.render/1),
farmware_envs: Enum.map(sync.farmware_envs, &Item.render/1), farmware_envs: Enum.map(sync.farmware_envs, &Item.render/1),
first_party_farmwares: Enum.map(sync.first_party_farmwares, &Item.render/1), first_party_farmwares: Enum.map(sync.first_party_farmwares, &Item.render/1),
@ -90,7 +88,6 @@ defmodule FarmbotCore.Asset.Sync do
|> cast_embed(:devices) |> cast_embed(:devices)
|> cast_embed(:fbos_configs) |> cast_embed(:fbos_configs)
|> cast_embed(:firmware_configs) |> cast_embed(:firmware_configs)
|> cast_embed(:diagnostic_dumps)
|> cast_embed(:farm_events) |> cast_embed(:farm_events)
|> cast_embed(:farmware_envs) |> cast_embed(:farmware_envs)
|> cast_embed(:farmware_installations) |> cast_embed(:farmware_installations)

View File

@ -11,15 +11,16 @@ defmodule FarmbotCore.AssetHelpers do
@doc false @doc false
defmacro __using__(_opts) do defmacro __using__(_opts) do
require Logger require Logger
Logger.warn "Don't use this in production please!" Logger.warn("Don't use this in production please!")
quote do quote do
import Ecto.Query import Ecto.Query
alias FarmbotCore.Asset alias FarmbotCore.Asset
alias Asset.{ alias Asset.{
Repo, Repo,
Device, Device,
DeviceCert, DeviceCert,
DiagnosticDump,
FarmwareEnv, FarmwareEnv,
FarmwareInstallation, FarmwareInstallation,
FirstPartyFarmware, FirstPartyFarmware,

View File

@ -75,6 +75,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do
case Asset.get_sequence(pin_binding.sequence_id) do case Asset.get_sequence(pin_binding.sequence_id) do
%Sequence{name: name} = seq -> %Sequence{name: name} = seq ->
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing #{name}") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing #{name}")
AST.decode(seq) AST.decode(seq)
|> execute(state) |> execute(state)
@ -84,24 +85,24 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do
end end
end end
def handle_cast(:trigger, %{pin_binding: %{special_action: "dump_info"} = pin_binding} = state) do def handle_cast(
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Dump Info") :trigger,
AST.Factory.new() %{pin_binding: %{special_action: "emergency_lock"} = pin_binding} = state
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") ) do
|> AST.Factory.dump_info()
|> execute(state)
end
def handle_cast(:trigger, %{pin_binding: %{special_action: "emergency_lock"} = pin_binding} = state) do
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Lock") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Lock")
AST.Factory.new() AST.Factory.new()
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}")
|> AST.Factory.emergency_lock() |> AST.Factory.emergency_lock()
|> execute(state) |> execute(state)
end end
def handle_cast(:trigger, %{pin_binding: %{special_action: "emergency_unlock"} = pin_binding} = state) do def handle_cast(
:trigger,
%{pin_binding: %{special_action: "emergency_unlock"} = pin_binding} = state
) do
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Unlock") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Emergency Unlock")
AST.Factory.new() AST.Factory.new()
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}")
|> AST.Factory.emergency_unlock() |> AST.Factory.emergency_unlock()
@ -110,14 +111,19 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do
def handle_cast(:trigger, %{pin_binding: %{special_action: "power_off"} = pin_binding} = state) do def handle_cast(:trigger, %{pin_binding: %{special_action: "power_off"} = pin_binding} = state) do
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Power Off") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Power Off")
AST.Factory.new() AST.Factory.new()
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}")
|> AST.Factory.power_off() |> AST.Factory.power_off()
|> execute(state) |> execute(state)
end end
def handle_cast(:trigger, %{pin_binding: %{special_action: "read_status"} = pin_binding} = state) do def handle_cast(
:trigger,
%{pin_binding: %{special_action: "read_status"} = pin_binding} = state
) do
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Read Status") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Read Status")
AST.Factory.new() AST.Factory.new()
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}")
|> AST.Factory.read_status() |> AST.Factory.read_status()
@ -126,6 +132,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do
def handle_cast(:trigger, %{pin_binding: %{special_action: "reboot"} = pin_binding} = state) do def handle_cast(:trigger, %{pin_binding: %{special_action: "reboot"} = pin_binding} = state) do
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Reboot") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Reboot")
AST.Factory.new() AST.Factory.new()
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}")
|> AST.Factory.reboot() |> AST.Factory.reboot()
@ -134,6 +141,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do
def handle_cast(:trigger, %{pin_binding: %{special_action: "sync"} = pin_binding} = state) do def handle_cast(:trigger, %{pin_binding: %{special_action: "sync"} = pin_binding} = state) do
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Sync") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Sync")
AST.Factory.new() AST.Factory.new()
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}")
|> AST.Factory.sync() |> AST.Factory.sync()
@ -142,6 +150,7 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do
def handle_cast(:trigger, %{pin_binding: %{special_action: "take_photo"} = pin_binding} = state) do def handle_cast(:trigger, %{pin_binding: %{special_action: "take_photo"} = pin_binding} = state) do
FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Take Photo") FarmbotCore.Logger.info(1, "#{pin_binding} triggered, executing Take Photo")
AST.Factory.new() AST.Factory.new()
|> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}") |> AST.Factory.rpc_request("pin_binding.#{pin_binding.pin_num}")
|> AST.Factory.take_photo() |> AST.Factory.take_photo()
@ -182,10 +191,13 @@ defimpl FarmbotCore.AssetWorker, for: FarmbotCore.Asset.PinBinding do
defp execute(%AST{} = ast, state) do defp execute(%AST{} = ast, state) do
case FarmbotCeleryScript.execute(ast, make_ref()) do case FarmbotCeleryScript.execute(ast, make_ref()) do
:ok -> :ok :ok ->
:ok
{:error, reason} -> {:error, reason} ->
FarmbotCore.Logger.error 1, "error executing #{state.pin_binding}: #{reason}" FarmbotCore.Logger.error(1, "error executing #{state.pin_binding}: #{reason}")
end end
{:noreply, state} {:noreply, state}
end end

View File

@ -10,7 +10,6 @@ defmodule FarmbotExt.API.DirtyWorker.Supervisor do
alias FarmbotCore.Asset.{ alias FarmbotCore.Asset.{
Device, Device,
DeviceCert, DeviceCert,
DiagnosticDump,
FarmEvent, FarmEvent,
FarmwareEnv, FarmwareEnv,
FarmwareInstallation, FarmwareInstallation,
@ -39,7 +38,6 @@ defmodule FarmbotExt.API.DirtyWorker.Supervisor do
{DirtyWorker, DeviceCert}, {DirtyWorker, DeviceCert},
{DirtyWorker, FbosConfig}, {DirtyWorker, FbosConfig},
{DirtyWorker, FirmwareConfig}, {DirtyWorker, FirmwareConfig},
{DirtyWorker, DiagnosticDump},
{DirtyWorker, FarmEvent}, {DirtyWorker, FarmEvent},
{DirtyWorker, FarmwareEnv}, {DirtyWorker, FarmwareEnv},
{DirtyWorker, FarmwareInstallation}, {DirtyWorker, FarmwareInstallation},

View File

@ -9,7 +9,6 @@ defmodule FarmbotExt.API.EagerLoader.Supervisor do
alias FarmbotCore.Asset.{ alias FarmbotCore.Asset.{
Device, Device,
DiagnosticDump,
FarmEvent, FarmEvent,
FarmwareEnv, FarmwareEnv,
FirstPartyFarmware, FirstPartyFarmware,
@ -42,7 +41,6 @@ defmodule FarmbotExt.API.EagerLoader.Supervisor do
def init(_args) do def init(_args) do
children = [ children = [
{EagerLoader, Device}, {EagerLoader, Device},
{EagerLoader, DiagnosticDump},
{EagerLoader, FarmEvent}, {EagerLoader, FarmEvent},
{EagerLoader, FarmwareEnv}, {EagerLoader, FarmwareEnv},
{EagerLoader, FirstPartyFarmware}, {EagerLoader, FirstPartyFarmware},

View File

@ -19,3 +19,4 @@ erl_crash.dump
auth_secret.exs auth_secret.exs
log log
*.csv *.csv
*.coverdata

View File

@ -18,7 +18,6 @@ defmodule FarmbotOS.SysCalls do
alias FarmbotOS.SysCalls.{ alias FarmbotOS.SysCalls.{
ChangeOwnership, ChangeOwnership,
CheckUpdate, CheckUpdate,
DumpInfo,
Farmware, Farmware,
FactoryReset, FactoryReset,
FlashFirmware, FlashFirmware,
@ -52,9 +51,6 @@ defmodule FarmbotOS.SysCalls do
@impl true @impl true
defdelegate change_ownership(email, secret, server), to: ChangeOwnership defdelegate change_ownership(email, secret, server), to: ChangeOwnership
@impl true
defdelegate dump_info(), to: DumpInfo
@impl true @impl true
defdelegate check_update(), to: CheckUpdate defdelegate check_update(), to: CheckUpdate

View File

@ -1,104 +0,0 @@
defmodule FarmbotOS.SysCalls.DumpInfo do
@moduledoc false
require FarmbotCore.Logger
require FarmbotTelemetry
alias FarmbotCore.{
Asset,
Asset.DiagnosticDump,
Asset.Private,
Config,
Project
}
def dump_info do
FarmbotCore.Logger.busy(1, "Recording diagnostic dump.")
ifname = get_network_config()
dmesg = dmesg()
fbos_commit = Project.commit()
fbos_version = Project.version()
fw_version = fw_version()
fw_commit = Project.arduino_commit()
fw_hardware = extract_fw_hardware(fw_version)
fw_data = fw_state(fw_version, fw_hardware)
params = %{
network_interface: ifname,
firmware_hardware: fw_hardware,
firmware_commit: fw_commit,
fbos_commit: fbos_commit,
fbos_version: fbos_version,
fbos_dmesg_dump: dmesg,
firmware_state: FarmbotCore.JSON.encode!(fw_data)
}
case Asset.new_diagnostic_dump(params) do
{:ok, diag} ->
_ = Private.mark_dirty!(diag, %{})
FarmbotCore.Logger.success(1, "Diagnostic dump recorded.")
FarmbotTelemetry.event(:diagnostic_dump, :record, nil,
diagnostic_dump: DiagnosticDump.render(diag)
)
:ok
{:error, changeset} ->
FarmbotTelemetry.event(:diagnostic_dump, :record_error, nil,
error: inspect(changeset)
)
{:error, "error creating diagnostic dump: #{inspect(changeset)}"}
end
end
defp get_network_config do
case Config.get_all_network_configs() do
[%{name: ifname} | _] -> ifname
_ -> nil
end
end
defp dmesg do
{dmesg, _status} = System.cmd("dmesg", [])
dmesg
end
defp fw_version do
case FarmbotFirmware.request({:software_version_read, []}) do
{:ok, {_, {:report_software_version, [version]}}} -> version
_ -> nil
end
end
defp extract_fw_hardware(nil), do: nil
defp extract_fw_hardware(str) do
case String.split(str, ".") do
[_, _, _, "R"] -> "arduino"
[_, _, _, "F"] -> "farmduino"
[_, _, _, "G"] -> "farmduino_k14"
[_, _, _, "H"] -> "farmduino_k15"
[_, _, _, "E"] -> "express_k10"
_ -> nil
end
end
defp fw_state(version, hardware) do
pid = Process.whereis(FarmbotFirmware)
if state = pid && :sys.get_state(pid) do
%{
firmware_hardware: hardware,
firmware_version: version,
busy: state.status == :busy,
serial_port: state.transport_args[:device],
locked: state.status == :emergency_lock,
current_command: inspect(state.command_queue)
}
else
%{error: "Firmware process is not running. Could not collect info."}
end
end
end