add mix tasks back.

pull/363/head
connor rigby 2017-11-09 16:22:52 -08:00
parent b9479fd266
commit 3069e5c3db
5 changed files with 162 additions and 5 deletions

View File

@ -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

View File

@ -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

View File

@ -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
View File

@ -83,8 +83,8 @@ defmodule Farmbot.Mixfile do
{:ex_json_schema, "~> 0.5.3"},
{:rsa, "~> 0.0.1"},
{:httpoison, "~> 0.13.0"},
# {:tzdata, "~> 0.1.201601", override: true},
# {:timex, "~> 3.1.13"},
{:tzdata, "~> 0.1.201601", override: true},
{:timex, "~> 3.1.13"},
{:fs, "~> 3.4.0"},
{:nerves_uart, "0.1.2"},
@ -121,7 +121,7 @@ defmodule Farmbot.Mixfile do
end
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"),
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"]]
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
[
"firmware.slack": ["farmbot.firmware.slack"],
"firmware.sign": ["farmbot.firmware.sign"],
"deps.precompile": ["nerves.precompile", "deps.precompile"],
"deps.loadpaths": ["deps.loadpaths", "nerves.loadpaths"]
]

View File

@ -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_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_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_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"},