add mix tasks back.
parent
b9479fd266
commit
3069e5c3db
|
@ -0,0 +1,43 @@
|
||||||
|
defmodule Mix.Tasks.Farmbot.Env do
|
||||||
|
@moduledoc false
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def mix_config(key \\ nil) do
|
||||||
|
config = Mix.Project.config()
|
||||||
|
if key do
|
||||||
|
config[key]
|
||||||
|
else
|
||||||
|
config
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def fw_file do
|
||||||
|
Path.join([images_dir(), "#{mix_config(:app)}.fw"])
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def signed_fw_file do
|
||||||
|
Path.join([images_dir(), "#{mix_config(:app)}-signed.fw"])
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def images_dir do
|
||||||
|
Path.join([mix_config(:build_path), env(), "nerves", "images"])
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def target do
|
||||||
|
mix_config(:target)
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def env do
|
||||||
|
to_string(Mix.env())
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc false
|
||||||
|
def slack_token do
|
||||||
|
System.get_env("SLACK_TOKEN") || Mix.raise "No $SLACK_TOKEN environment variable."
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,35 @@
|
||||||
|
defmodule Mix.Tasks.Farmbot.Firmware.Sign do
|
||||||
|
@moduledoc "Sign a firmware."
|
||||||
|
@shortdoc "Sign a firmware."
|
||||||
|
import Mix.Tasks.Farmbot.Env
|
||||||
|
|
||||||
|
use Mix.Task
|
||||||
|
|
||||||
|
def run(args) do
|
||||||
|
case args do
|
||||||
|
[private_key_file, input_fw_file, output_fw_file] ->
|
||||||
|
do_run(private_key_file, input_fw_file, output_fw_file)
|
||||||
|
[private_key_file] ->
|
||||||
|
do_run(private_key_file, fw_file(), signed_fw_file())
|
||||||
|
_ -> error()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp error do
|
||||||
|
Mix.raise "Usage: mix farmbot.firmware.sign /path/to/private/key [input.fw] [output.fw]"
|
||||||
|
end
|
||||||
|
|
||||||
|
defp do_run(private_key_file, input_fw_file, output_fw_file) do
|
||||||
|
unless File.exists?(private_key_file) do
|
||||||
|
error()
|
||||||
|
end
|
||||||
|
|
||||||
|
unless File.exists?(input_fw_file) do
|
||||||
|
Mix.raise "Could not find input file: #{input_fw_file}"
|
||||||
|
end
|
||||||
|
|
||||||
|
Mix.shell.info [:green, "Signing: #{input_fw_file} with: #{private_key_file} to: #{output_fw_file}"]
|
||||||
|
|
||||||
|
System.cmd("fwup", ["-S", "-s", private_key_file, "-i", input_fw_file, "-o", output_fw_file])
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,74 @@
|
||||||
|
defmodule Mix.Tasks.Farmbot.Firmware.Slack do
|
||||||
|
@moduledoc "Upload a firmware to slack."
|
||||||
|
@shortdoc "Upload firmware to slack."
|
||||||
|
|
||||||
|
use Mix.Task
|
||||||
|
import Mix.Tasks.Farmbot.Env
|
||||||
|
|
||||||
|
def run(opts) do
|
||||||
|
token = slack_token()
|
||||||
|
{keywords, comment, _} = opts |> OptionParser.parse(switches: [signed: :boolean])
|
||||||
|
signed? = Keyword.get(keywords, :signed, false)
|
||||||
|
Application.ensure_all_started(:httpoison)
|
||||||
|
|
||||||
|
fw_file_to_upload = if signed?, do: signed_fw_file(), else: fw_file()
|
||||||
|
time = format_date_time(File.stat!(fw_file_to_upload))
|
||||||
|
filename = "#{mix_config(:app)}-#{env()}-#{mix_config(:commit)}#{if signed?, do: "-signed-", else: "-"}#{time}.fw"
|
||||||
|
comment = Enum.join(comment, " ")
|
||||||
|
Mix.shell.info [:green, "Uploading: #{filename} (#{fw_file_to_upload})"]
|
||||||
|
url = "https://slack.com/api/files.upload"
|
||||||
|
form_data = %{
|
||||||
|
:file => fw_file_to_upload,
|
||||||
|
"token" => token,
|
||||||
|
"channels" => "embedded-systems",
|
||||||
|
"filename" => filename,
|
||||||
|
"title" => filename,
|
||||||
|
"initial_comment" => """
|
||||||
|
*New Farmbot Firmware!*
|
||||||
|
> *_Env_*: `#{env()}`
|
||||||
|
> *_Target_*: `#{target()}`
|
||||||
|
> *_Commit_*: `#{mix_config(:commit)}`
|
||||||
|
> *_Time_*: `#{time}`
|
||||||
|
#{String.trim(comment)}
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
payload = Enum.map(form_data, fn({key, val}) -> {key, val} end)
|
||||||
|
real_payload = {:multipart, payload}
|
||||||
|
headers = [ {'User-Agent', 'Farmbot HTTP Adapter'} ]
|
||||||
|
case HTTPoison.post(url, real_payload, headers, [follow_redirect: true]) do
|
||||||
|
{:ok, %{status_code: code, body: body}} when code > 199 and code < 300 ->
|
||||||
|
if Poison.decode!(body) |> Map.get("ok", false) do
|
||||||
|
Mix.shell.info [:green, "Upload complete!"]
|
||||||
|
else
|
||||||
|
error("#{Poison.decode!(body, pretty: true)}")
|
||||||
|
end
|
||||||
|
other ->
|
||||||
|
error("#{inspect other}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp error(msg) do
|
||||||
|
Mix.raise("Upload failed! " <> msg)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp format_date_time(%{ctime: {{yr,m,day}, {hr, min, sec}}}) do
|
||||||
|
dt = %DateTime{
|
||||||
|
hour: hr,
|
||||||
|
year: yr,
|
||||||
|
month: m,
|
||||||
|
day: day,
|
||||||
|
minute: min,
|
||||||
|
second: sec,
|
||||||
|
time_zone: "Etc/UTC",
|
||||||
|
zone_abbr: "UTC",
|
||||||
|
std_offset: 0,
|
||||||
|
utc_offset: 0
|
||||||
|
}
|
||||||
|
|> Timex.local()
|
||||||
|
"#{dt.year}-#{pad(dt.month)}-#{pad(dt.day)}_#{pad(dt.hour)}#{pad(dt.minute)}"
|
||||||
|
end
|
||||||
|
|
||||||
|
defp pad(int) do
|
||||||
|
if int < 10, do: "0#{int}", else: "#{int}"
|
||||||
|
end
|
||||||
|
end
|
13
mix.exs
13
mix.exs
|
@ -83,8 +83,8 @@ defmodule Farmbot.Mixfile do
|
||||||
{:ex_json_schema, "~> 0.5.3"},
|
{:ex_json_schema, "~> 0.5.3"},
|
||||||
{:rsa, "~> 0.0.1"},
|
{:rsa, "~> 0.0.1"},
|
||||||
{:httpoison, "~> 0.13.0"},
|
{:httpoison, "~> 0.13.0"},
|
||||||
# {:tzdata, "~> 0.1.201601", override: true},
|
{:tzdata, "~> 0.1.201601", override: true},
|
||||||
# {:timex, "~> 3.1.13"},
|
{:timex, "~> 3.1.13"},
|
||||||
|
|
||||||
{:fs, "~> 3.4.0"},
|
{:fs, "~> 3.4.0"},
|
||||||
{:nerves_uart, "0.1.2"},
|
{:nerves_uart, "0.1.2"},
|
||||||
|
@ -121,7 +121,7 @@ defmodule Farmbot.Mixfile do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp system("rpi3"),
|
defp system("rpi3"),
|
||||||
do: [{:nerves_system_farmbot_rpi3, "0.17.2-farmbot", runtime: false}]
|
do: [{:nerves_system_farmbot_rpi3, "0.17.2-farmbot.1", runtime: false}]
|
||||||
|
|
||||||
defp system("rpi0"),
|
defp system("rpi0"),
|
||||||
do: [{:nerves_system_farmbot_rpi0, "0.18.3-farmbot", runtime: false}]
|
do: [{:nerves_system_farmbot_rpi0, "0.18.3-farmbot", runtime: false}]
|
||||||
|
@ -154,10 +154,15 @@ defmodule Farmbot.Mixfile do
|
||||||
["test": ["ecto.create --quiet", "ecto.migrate", "test"]]
|
["test": ["ecto.create --quiet", "ecto.migrate", "test"]]
|
||||||
end
|
end
|
||||||
|
|
||||||
defp aliases(_env, "host"), do: []
|
defp aliases(_env, "host"), do: [
|
||||||
|
"firmware.slack": ["farmbot.firmware.slack"],
|
||||||
|
"firmware.sign": ["farmbot.firmware.sign"]
|
||||||
|
]
|
||||||
|
|
||||||
defp aliases(_env, _system) do
|
defp aliases(_env, _system) do
|
||||||
[
|
[
|
||||||
|
"firmware.slack": ["farmbot.firmware.slack"],
|
||||||
|
"firmware.sign": ["farmbot.firmware.sign"],
|
||||||
"deps.precompile": ["nerves.precompile", "deps.precompile"],
|
"deps.precompile": ["nerves.precompile", "deps.precompile"],
|
||||||
"deps.loadpaths": ["deps.loadpaths", "nerves.loadpaths"]
|
"deps.loadpaths": ["deps.loadpaths", "nerves.loadpaths"]
|
||||||
]
|
]
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
"nerves_network_interface": {:hex, :nerves_network_interface, "0.4.2", "7a3663a07803f2f9f1e37146714d24ccec1e9349268586e4ed8c41f38641d837", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
|
"nerves_network_interface": {:hex, :nerves_network_interface, "0.4.2", "7a3663a07803f2f9f1e37146714d24ccec1e9349268586e4ed8c41f38641d837", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
|
||||||
"nerves_runtime": {:hex, :nerves_runtime, "0.5.0", "5f4135fe3c94ca5c9e25d677350fbb136f279d14aac4871236961b6f5ccbcfa5", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.5", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"},
|
"nerves_runtime": {:hex, :nerves_runtime, "0.5.0", "5f4135fe3c94ca5c9e25d677350fbb136f279d14aac4871236961b6f5ccbcfa5", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.5", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"},
|
||||||
"nerves_system_br": {:hex, :nerves_system_br, "0.14.1", "b108f8e12b2fd5cfd75be72d8ade4a1cfa9b9fd9076380c431ad930a7ccd5526", [], [], "hexpm"},
|
"nerves_system_br": {:hex, :nerves_system_br, "0.14.1", "b108f8e12b2fd5cfd75be72d8ade4a1cfa9b9fd9076380c431ad930a7ccd5526", [], [], "hexpm"},
|
||||||
"nerves_system_farmbot_rpi3": {:hex, :nerves_system_farmbot_rpi3, "0.17.2-farmbot", "3d53c198191f9cd977037fe692507d8bf21295b055c3124d834622cb616c8fa7", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "~> 0.14.1", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_arm_unknown_linux_gnueabihf, "~> 0.11.0", [hex: :nerves_toolchain_arm_unknown_linux_gnueabihf, repo: "hexpm", optional: false]}], "hexpm"},
|
"nerves_system_farmbot_rpi3": {:hex, :nerves_system_farmbot_rpi3, "0.17.2-farmbot.1", "e1b067e72a7927aacb9a46bb7605f61747686f9ea5a9c6f509c4cef18d9d62ae", [:mix], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "~> 0.14.1", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_arm_unknown_linux_gnueabihf, "~> 0.11.0", [hex: :nerves_toolchain_arm_unknown_linux_gnueabihf, repo: "hexpm", optional: false]}], "hexpm"},
|
||||||
"nerves_system_rpi3": {:hex, :nerves_system_rpi3, "0.16.1", "46b2fc942d7434d9eb8164c06c25a94ee6dd6db7e88c857101e5a06e6b7d01a8", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "~> 0.13.7", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_arm_unknown_linux_gnueabihf, "~> 0.11.0", [hex: :nerves_toolchain_arm_unknown_linux_gnueabihf, repo: "hexpm", optional: false]}], "hexpm"},
|
"nerves_system_rpi3": {:hex, :nerves_system_rpi3, "0.16.1", "46b2fc942d7434d9eb8164c06c25a94ee6dd6db7e88c857101e5a06e6b7d01a8", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "~> 0.13.7", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_arm_unknown_linux_gnueabihf, "~> 0.11.0", [hex: :nerves_toolchain_arm_unknown_linux_gnueabihf, repo: "hexpm", optional: false]}], "hexpm"},
|
||||||
"nerves_toolchain_arm_unknown_linux_gnueabihf": {:hex, :nerves_toolchain_arm_unknown_linux_gnueabihf, "0.11.0", "8d7606275a2d19de26ae238cd59475f4c06679aa9222b8987518d7c8a7beae51", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.1", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"},
|
"nerves_toolchain_arm_unknown_linux_gnueabihf": {:hex, :nerves_toolchain_arm_unknown_linux_gnueabihf, "0.11.0", "8d7606275a2d19de26ae238cd59475f4c06679aa9222b8987518d7c8a7beae51", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.1", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"},
|
||||||
"nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.1.0", "0f03e4a3f3beef5fe271de0148b9f106c417e57f303f635c21c74b4bd6eb68ee", [], [], "hexpm"},
|
"nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.1.0", "0f03e4a3f3beef5fe271de0148b9f106c417e57f303f635c21c74b4bd6eb68ee", [], [], "hexpm"},
|
||||||
|
|
Loading…
Reference in New Issue