[WIP] Pull in NervesHub updates

pull/974/head
Connor Rigby 2018-11-23 10:25:14 -08:00
parent 3bc18fee09
commit 451dfe1343
No known key found for this signature in database
GPG Key ID: 29A88B24B70456E0
26 changed files with 519 additions and 114 deletions

View File

@ -1,5 +1,6 @@
version: 2.0
defaults: &defaults
working_directory: /nerves/build
docker:
- image: nervesproject/nerves_system_br:1.6.8
environment:
@ -22,13 +23,6 @@ install_hex_archives: &install_hex_archives
mix local.rebar --force
mix archive.install hex nerves_bootstrap "~> 1.2" --force
fetch_and_compile_deps: &fetch_and_compile_deps
run:
name: Fetch and compile Elixir dependencies
command: |
mix deps.get
mix compile
install_arduino: &install_arduino
run:
name: Run setup script
@ -62,6 +56,7 @@ build_firmware_steps: &build_firmware_steps
- run:
name: Setup ENV
command: |
<<<<<<< HEAD
echo $MIX_TARGET > MIX_TARGET
echo $MIX_ENV > MIX_ENV
cp mix.lock MIX_LOCK
@ -69,10 +64,20 @@ build_firmware_steps: &build_firmware_steps
key: v9-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "MIX_LOCK" }}
- restore_cache:
key: v9-fbos-host-test-dependency-cache-{{ checksum "mix.lock" }}
=======
echo "/nerves/build/farmbot_os/$MIX_TARGET" > MIX_TARGET
echo "/nerves/build/farmbot_os/$MIX_ENV" > MIX_ENV
cp /nerves/build/farmbot_os/mix.lock.$MIX_TARGET MIX_LOCK
- restore_cache:
key: v9-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "MIX_LOCK" }}
- restore_cache:
key: v9-fbos-host-test-dependency-cache-{{ checksum "mix.lock.host" }}
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
- <<: *install_elixir
- <<: *install_hex_archives
- run:
name: Build Farmbot OS Firmware
working_directory: /nerves/build/farmbot_os
command: |
mix deps.get
mix compile --force
@ -83,12 +88,16 @@ build_firmware_steps: &build_firmware_steps
- run:
name: Create artifacts
command: |
<<<<<<< HEAD
cp _build/${MIX_TARGET}_${MIX_ENV}/nerves/images/farmbot.fw /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw
=======
cp /nerves/build/farmbot_os/_build/${MIX_TARGET}/${MIX_ENV}/nerves/images/farmbot.fw /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
- save_cache:
key: v9-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "MIX_LOCK" }}
paths:
- _build/
- deps/
- /nerves/build/farmbot_os/_build/
- /nerves/build/farmbot_os/deps/
- ~/.nerves/
- save_cache:
key: nerves/deploy/system-{{ checksum "MIX_TARGET" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }}
@ -102,9 +111,15 @@ deploy_nerves_hub_firmware_steps: &deploy_nerves_hub_firmware_steps
- run:
name: Setup ENV
command: |
<<<<<<< HEAD
echo $MIX_TARGET > MIX_TARGET
echo $MIX_ENV > MIX_ENV
cp mix.lock MIX_LOCK
=======
echo "/nerves/build/farmbot_os/$MIX_TARGET" > MIX_TARGET
echo "/nerves/build/farmbot_os/$MIX_ENV" > MIX_ENV
cp /nerves/build/farmbot_os/mix.lock.$MIX_TARGET MIX_LOCK
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
- restore_cache:
key: v9-fbos-{{ checksum "MIX_TARGET" }}-{{ checksum "MIX_ENV" }}-dependency-cache-{{ checksum "MIX_LOCK" }}
- restore_cache:
@ -113,9 +128,11 @@ deploy_nerves_hub_firmware_steps: &deploy_nerves_hub_firmware_steps
- <<: *install_hex_archives
- run:
name: Sign Image
working_directory: /nerves/build/farmbot_os
command: mix nerves_hub.firmware sign --key notreal /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw
- run:
name: Publish to NervesHub
working_directory: /nerves/build/farmbot_os
command: mix nerves_hub.firmware publish --deploy ${NERVES_HUB_DEPLOY} ${NERVES_HUB_TTL} /nerves/deploy/system/artifacts/farmbot-${MIX_TARGET}-$(cat VERSION).fw
jobs:
@ -124,29 +141,184 @@ jobs:
# TEST #
################################################################################
test:
test_farmbot_celery_script:
<<: *defaults
environment:
MIX_ENV: test
MIX_TARGET: host
NERVES_LOG_DISABLE_PROGRESS_BAR: "yes"
ELIXIR_VERSION: 1.7.3
steps:
- checkout
- restore_cache:
keys:
- v9-fbcs-test-dependency-cache-{{ checksum "farmbot_celery_script/mix.lock" }}
- <<: *install_elixir
- <<: *install_hex_archives
- run:
name: Test Farmbot CeleryScript
working_directory: /nerves/build/farmbot_celery_script
command: |
mix deps.get
mix compile
mix format --check-formatted
mix test
- save_cache:
key: v9-fbcs-test-dependency-cache-{{ checksum "farmbot_celery_script/mix.lock" }}
paths:
- farmbot_celery_script/_build/test
- farmbot_celery_script/deps
test_farmbot_firmware:
<<: *defaults
environment:
MIX_ENV: test
MIX_TARGET: host
<<<<<<< HEAD
ELIXIR_VERSION: 1.8.1
=======
NERVES_LOG_DISABLE_PROGRESS_BAR: "yes"
ELIXIR_VERSION: 1.7.3
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
steps:
- checkout
- restore_cache:
keys:
- v9-fbfw-test-dependency-cache-{{ checksum "farmbot_firmware/mix.lock" }}
- <<: *install_elixir
- <<: *install_hex_archives
- run:
name: Test Farmbot Firmware
working_directory: /nerves/build/farmbot_firmware
command: |
mix deps.get
mix compile
mix format --check-formatted
mix test
- save_cache:
key: v9-fbfw-test-dependency-cache-{{ checksum "farmbot_firmware/mix.lock" }}
paths:
- farmbot_firmware/_build/test
- farmbot_firmware/deps
test_farmbot_core:
<<: *defaults
environment:
MIX_ENV: test
MIX_TARGET: host
NERVES_LOG_DISABLE_PROGRESS_BAR: "yes"
ELIXIR_VERSION: 1.7.3
TZ: "America/Los_Angeles"
steps:
- checkout
- run: git submodule update --init --recursive
- restore_cache:
<<<<<<< HEAD
key: v9-fbos-host-test-dependency-cache-{{ checksum "mix.lock" }}
=======
keys:
- v9-fbcore-test-dependency-cache-{{ checksum "farmbot_core/mix.lock" }}
- restore_cache:
keys:
- v9-fbcore-test-arduino-dependency-cache-{{ checksum ".circleci/setup-arduino.sh" }}
- <<: *install_elixir
- <<: *install_hex_archives
- <<: *install_arduino
- run:
name: Ensure format
command: |
mix format --check-formatted
- run:
name: Test Farmbot Core
working_directory: /nerves/build/farmbot_core
command: |
mix deps.get
mix compile
mix format --check-formatted
mix test --trace
- save_cache:
key: v9-fbcore-test-dependency-cache-{{ checksum "farmbot_core/mix.lock" }}
paths:
- farmbot_core/_build/test
- farmbot_core/deps
- farmbot_core/arduino
- save_cache:
key: v9-fbcore-test-arduino-dependency-cache-{{ checksum ".circleci/setup-arduino.sh" }}
paths:
- ~/arduino-1.8.5
- farmbot_core/_build/core
- farmbot_core/_build/libraries
- farmbot_core/_build/farmduino_k14
- farmbot_core/_build/farmduino_v10
- farmbot_core/_build/ramps_v14
test_farmbot_ext:
<<: *defaults
environment:
MIX_ENV: test
MIX_TARGET: host
NERVES_LOG_DISABLE_PROGRESS_BAR: "yes"
ELIXIR_VERSION: 1.7.3
SKIP_ARDUINO_BUILD: 1
steps:
- checkout
- run: git submodule update --init --recursive
- restore_cache:
keys:
- v9-fbext-test-dependency-cache-{{ checksum "farmbot_core/mix.lock" }}
- <<: *install_elixir
- <<: *install_hex_archives
- run:
name: Test Farmbot Ext
working_directory: /nerves/build/farmbot_ext
command: |
mix deps.get
mix compile
mix format --check-formatted
mix ecto.create
mix ecto.migrate
mix test
- save_cache:
key: v9-fbext-test-dependency-cache-{{ checksum "farmbot_core/mix.lock" }}
paths:
- farmbot_ext/_build/test
- farmbot_ext/deps
test_farmbot_os:
<<: *defaults
environment:
MIX_ENV: test
MIX_TARGET: host
NERVES_LOG_DISABLE_PROGRESS_BAR: "yes"
ELIXIR_VERSION: 1.7.3
steps:
- checkout
- run: git submodule update --init --recursive
- restore_cache:
key: v9-fbos-host-test-dependency-cache-{{ checksum "farmbot_os/mix.lock.host" }}
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
- <<: *install_elixir
- <<: *install_hex_archives
- run:
name: Test Farmbot OS
working_directory: /nerves/build/farmbot_os
command: |
mix deps.get
mix compile
mix format --check-formatted
mix test
- save_cache:
<<<<<<< HEAD
key: v9-fbos-host-test-dependency-cache-{{ checksum "mix.lock" }}
paths:
- _build/host_test
- deps
=======
key: v9-fbos-host-test-dependency-cache-{{ checksum "farmbot_os/mix.lock.host" }}
paths:
- farmbot_os/_build/host
- farmbot_os/deps/host
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
################################################################################
# target=rpi app_env=prod #
@ -261,14 +433,22 @@ jobs:
name: Setup ENV
command: |
echo rpi3 > MIX_TARGET_RPI3
<<<<<<< HEAD
cp mix.lock MIX_LOCK_RPI3
=======
cp /nerves/build/farmbot_os/mix.lock.rpi3 MIX_LOCK_RPI3
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
# echo rpi > MIX_TARGET_RPI
# cp mix.lock.rpi MIX_LOCK_RPI
# cp /nerves/build/farmbot_os/mix.lock.rpi MIX_LOCK_RPI
echo $MIX_ENV > MIX_ENV
- restore_cache:
key: nerves/deploy/system-{{ checksum "MIX_TARGET_RPI3" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }}
# - restore_cache:
<<<<<<< HEAD
# key: nerves/deploy/system-{{ checksum "MIX_TARGET_RPI" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }}
=======
# key: nerves/deploy/system-{{ checksum "MIX_TARGET_RPI" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }}
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
- <<: *install_elixir
- <<: *install_hex_archives
- <<: *install_ghr
@ -317,9 +497,13 @@ jobs:
name: Setup ENV
command: |
echo rpi3 > MIX_TARGET_RPI3
<<<<<<< HEAD
cp mix.lock MIX_LOCK_RPI3
=======
cp /nerves/build/farmbot_os/mix.lock.rpi3 MIX_LOCK_RPI3
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates
# echo rpi > MIX_TARGET_RPI
# cp mix.lock.rpi MIX_LOCK_RPI
# cp /nerves/build/farmbot_os/mix.lock.rpi MIX_LOCK_RPI
echo $MIX_ENV > MIX_ENV
- restore_cache:
key: nerves/deploy/system-{{ checksum "MIX_TARGET_RPI3" }}-{{ .Branch }}-{{ .Revision }}-{{ .Environment.CIRCLE_TAG }}
@ -359,15 +543,52 @@ workflows:
version: 2
test:
jobs:
- test:
- test_farmbot_celery_script:
context: org-global
filters:
branches:
ignore:
# Merging is blocked on these branches until tests pass.
- beta
- master
- staging
- beta
- next
- test_farmbot_firmware:
context: org-global
filters:
branches:
ignore:
- master
- staging
- beta
- next
- test_farmbot_core:
context: org-global
filters:
branches:
ignore:
- master
- staging
- beta
- next
- test_farmbot_ext:
context: org-global
filters:
branches:
ignore:
- master
- staging
- beta
- next
- test_farmbot_os:
context: org-global
filters:
branches:
ignore:
- master
- staging
- beta
- next
# master branch to staging.farmbot.io
nerves_hub_prod_stable_staging:
jobs:
@ -474,6 +695,7 @@ workflows:
# - build_rpi_prod
- build_rpi3_prod
<<<<<<< HEAD
# # staging branch to staging.farmbot.io
# nerves_hub_rpi_prod_staging_staging:
@ -498,3 +720,106 @@ workflows:
# context: farmbot-staging
# requires:
# - build_rpi3_prod
=======
# staging branch to staging.farmbot.io
nerves_hub_rpi_prod_staging_staging:
jobs:
# - build_rpi_prod:
# context: farmbot-staging
# filters:
# branches:
# only:
# - staging
- build_rpi3_prod:
context: farmbot-staging
filters:
branches:
only:
- staging
# - deploy_rpi_prod_staging:
# context: farmbot-staging
# requires:
# - build_rpi_prod
- deploy_rpi3_prod_staging:
context: farmbot-staging
requires:
- build_rpi3_prod
# next branch to staging.farmbot.io
deploy_staging_next:
jobs:
- test_farmbot_celery_script:
context: org-global
filters:
branches:
only:
- next
- test_farmbot_firmware:
context: org-global
filters:
branches:
only:
- next
- test_farmbot_core:
context: org-global
filters:
branches:
only:
- next
- test_farmbot_ext:
context: org-global
filters:
branches:
only:
- next
- test_farmbot_os:
context: org-global
filters:
branches:
only:
- next
- build_rpi3_prod:
context: farmbot-staging
filters:
branches:
only:
- next
requires:
- test_farmbot_celery_script
- test_farmbot_firmware
- test_farmbot_core
- test_farmbot_ext
- test_farmbot_os
# - build_rpi_prod:
# context: farmbot-staging
# filters:
# branches:
# only:
# - next
# requires:
# - test_farmbot_celery_script
# - test_farmbot_firmware
# - test_farmbot_core
# - test_farmbot_ext
# - test_farmbot_os
- deploy_rpi3_prod_staging:
context: farmbot-staging
filters:
branches:
only:
- next
requires:
- build_rpi3_prod
# - deploy_rpi_prod_staging:
# context: farmbot-staging
# filters:
# branches:
# only:
# - next
# requires:
# - build_rpi_prod
>>>>>>> e9b01741... [WIP] Pull in NervesHub updates

1
.gitignore vendored
View File

@ -56,3 +56,4 @@ RELEASE_NOTES
nerves-hub
*.pem
*.db
*.db-journal

Binary file not shown.

View File

@ -35,7 +35,7 @@ config :farmbot_core, :behaviour,
config :farmbot_ext, :behaviour, authorization: Farmbot.Bootstrap.Authorization
config :ecto, json_library: Farmbot.JSON
config :farmbot_os,
config :farmbot,
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo]
config :farmbot_core, Farmbot.Config.Repo,
@ -56,12 +56,18 @@ config :farmbot_core, Farmbot.Asset.Repo,
database: "asset.#{Mix.env()}.db",
priv: "../farmbot_core/priv/asset"
config :farmbot_os, Farmbot.OS.FileSystem, data_path: "/tmp/farmbot"
config :farmbot_os, Farmbot.System, system_tasks: Farmbot.Host.SystemTasks
config :farmbot, Farmbot.OS.FileSystem, data_path: "/tmp/farmbot"
config :farmbot, Farmbot.System, system_tasks: Farmbot.Host.SystemTasks
config :farmbot_os, Farmbot.Platform.Supervisor,
config :farmbot, Farmbot.Platform.Supervisor,
platform_children: [
Farmbot.Host.Configurator
]
import_config("lagger.exs")
if Mix.Project.config()[:target] == "host" do
import_config("host/#{Mix.env()}.exs")
else
import_config("target/#{Mix.env()}.exs")
end

View File

@ -1,6 +1,7 @@
use Mix.Config
data_path = Path.join(["/", "tmp", "farmbot"])
config :farmbot_ext,
data_path: data_path
@ -23,16 +24,15 @@ config :farmbot_core, Farmbot.Asset.Repo,
loggers: [],
database: Path.join(data_path, "repo-#{Mix.env()}.sqlite3")
config :farmbot_os,
config :farmbot,
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo],
platform_children: [
{Farmbot.Host.Configurator, []}
]
config :farmbot_os, :behaviour,
system_tasks: Farmbot.Host.SystemTasks
config :farmbot, :behaviour, system_tasks: Farmbot.Host.SystemTasks
config :farmbot_os, Farmbot.System.NervesHub,
config :farmbot, Farmbot.System.NervesHub,
farmbot_nerves_hub_handler: Farmbot.Host.NervesHubHandler
config :farmbot_core, :behaviour,

View File

@ -0,0 +1,44 @@
use Mix.Config
data_path = Path.join(["/", "tmp", "farmbot"])
config :farmbot_ext,
data_path: data_path
config :logger_backend_ecto, LoggerBackendEcto.Repo,
adapter: Sqlite.Ecto2,
database: Path.join(data_path, "logs.sqlite3")
config :farmbot_core, Farmbot.Config.Repo,
adapter: Sqlite.Ecto2,
loggers: [],
database: Path.join(data_path, "config-#{Mix.env()}.sqlite3")
config :farmbot_core, Farmbot.Logger.Repo,
adapter: Sqlite.Ecto2,
loggers: [],
database: Path.join(data_path, "logs-#{Mix.env()}.sqlite3")
config :farmbot_core, Farmbot.Asset.Repo,
adapter: Sqlite.Ecto2,
loggers: [],
database: Path.join(data_path, "repo-#{Mix.env()}.sqlite3")
config :farmbot,
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo],
platform_children: [
{Farmbot.Host.Configurator, []}
]
config :farmbot, :behaviour, system_tasks: Farmbot.Host.SystemTasks
config :farmbot, Farmbot.System.NervesHub,
farmbot_nerves_hub_handler: Farmbot.Host.NervesHubHandler
config :farmbot_core, :behaviour,
leds_handler: Farmbot.Leds.StubHandler,
pin_binding_handler: Farmbot.PinBinding.StubHandler,
celery_script_io_layer: Farmbot.OS.IOLayer,
firmware_handler: Farmbot.Firmware.UartHandler
config :farmbot_core, :uart_handler, tty: "/dev/ttyACM0"

View File

@ -11,9 +11,10 @@ config :farmbot_core, :behaviour,
leds_handler: Farmbot.Target.Leds.AleHandler,
pin_binding_handler: Farmbot.Target.PinBinding.AleHandler,
celery_script_io_layer: Farmbot.OS.IOLayer,
json_parser: Farmbot.JSON.JasonParser
json_parser: Farmbot.JSON.JasonParser
data_path = Path.join("/", "root")
config :farmbot_ext,
data_path: data_path
@ -36,11 +37,11 @@ config :farmbot_core, Farmbot.Asset.Repo,
loggers: [],
database: Path.join(data_path, "repo-#{Mix.env()}.sqlite3")
config :farmbot_os,
config :farmbot,
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo],
init_children: [
{Farmbot.Target.Leds.AleHandler, []},
{Farmbot.Firmware.UartHandler.AutoDetector, []},
{Farmbot.Firmware.UartHandler.AutoDetector, []}
],
platform_children: [
{Farmbot.Target.Bootstrap.Configurator, []},
@ -58,19 +59,16 @@ config :farmbot_os,
# Reports Uptime every 60 seconds.
{Farmbot.Target.UptimeWorker, []},
{Farmbot.Target.Network.InfoSupervisor, []},
{Farmbot.Target.Uevent.Supervisor, []},
{Farmbot.Target.Uevent.Supervisor, []}
]
config :farmbot_os, :behaviour,
system_tasks: Farmbot.Target.SystemTasks
config :farmbot, :behaviour, system_tasks: Farmbot.Target.SystemTasks
config :farmbot_os, Farmbot.System.NervesHub,
config :farmbot, Farmbot.System.NervesHub,
farmbot_nerves_hub_handler: Farmbot.System.NervesHubClient
config :nerves_hub,
client: Farmbot.System.NervesHubClient,
public_keys: [File.read!("priv/staging.pub"), File.read!("priv/prod.pub")]
config :nerves_hub, NervesHub.Socket, [
reconnect_interval: 5_000,
]
config :nerves_hub, NervesHub.Socket, reconnect_interval: 5_000

View File

@ -5,9 +5,10 @@ config :farmbot_core, :behaviour,
leds_handler: Farmbot.Target.Leds.AleHandler,
pin_binding_handler: Farmbot.Target.PinBinding.AleHandler,
celery_script_io_layer: Farmbot.OS.IOLayer,
json_parser: Farmbot.JSON.JasonParser
json_parser: Farmbot.JSON.JasonParser
data_path = Path.join("/", "root")
config :farmbot_ext,
data_path: data_path
@ -30,11 +31,11 @@ config :farmbot_core, Farmbot.Asset.Repo,
loggers: [],
database: Path.join(data_path, "repo-#{Mix.env()}.sqlite3")
config :farmbot_os,
config :farmbot,
ecto_repos: [Farmbot.Config.Repo, Farmbot.Logger.Repo, Farmbot.Asset.Repo],
init_children: [
{Farmbot.Target.Leds.AleHandler, []},
{Farmbot.Firmware.UartHandler.AutoDetector, []},
{Farmbot.Firmware.UartHandler.AutoDetector, []}
],
platform_children: [
{Farmbot.Target.Bootstrap.Configurator, []},
@ -52,20 +53,16 @@ config :farmbot_os,
# Reports Uptime every 60 seconds.
{Farmbot.Target.UptimeWorker, []},
{Farmbot.Target.Network.InfoSupervisor, []},
{Farmbot.Target.Uevent.Supervisor, []},
{Farmbot.Target.Uevent.Supervisor, []}
]
config :farmbot_os, :behaviour,
system_tasks: Farmbot.Target.SystemTasks
config :farmbot, :behaviour, system_tasks: Farmbot.Target.SystemTasks
config :farmbot_os, Farmbot.System.NervesHub,
config :farmbot, Farmbot.System.NervesHub,
farmbot_nerves_hub_handler: Farmbot.System.NervesHubClient
config :nerves_hub,
client: Farmbot.System.NervesHubClient,
public_keys: [File.read!("priv/staging.pub"), File.read!("priv/prod.pub")]
config :nerves_hub, NervesHub.Socket, [
reconnect_interval: 5_000,
]
config :nerves_hub, NervesHub.Socket, reconnect_interval: 5_000

View File

@ -38,7 +38,7 @@ defmodule Farmbot.EasterEggs do
end
defp load_data do
Path.join(:code.priv_dir(:farmbot_os), "easter_eggs.json")
Path.join(:code.priv_dir(:farmbot), "easter_eggs.json")
|> File.read!()
|> Farmbot.JSON.decode!()
end

View File

@ -1,9 +1,9 @@
defmodule Farmbot.OS.FileSystem do
@data_path Application.get_env(:farmbot_os, __MODULE__)[:data_path]
@data_path Application.get_env(:farmbot, __MODULE__)[:data_path]
@data_path || Mix.raise("""
config :farmbot_os, Farmbot.OS.Filesystem,
config :farmbot, Farmbot.OS.Filesystem,
data_path: "/path/to/folder"
""")
def data_path, do: @data_path
end
end

View File

@ -14,16 +14,16 @@ defmodule Farmbot.System.Init.Ecto do
@doc "Replacement for Mix.Tasks.Ecto.Create"
def setup do
repos = Application.get_env(:farmbot_os, :ecto_repos)
repos = Application.get_env(:farmbot, :ecto_repos)
for repo <- repos do
Application.put_env(:farmbot_os, :repo_hack, repo)
Application.put_env(:farmbot, :repo_hack, repo)
setup(repo)
end
end
def setup(repo) do
db_file = Application.get_env(:farmbot_os, repo)[:database]
db_file = Application.get_env(:farmbot, repo)[:database]
unless File.exists?(db_file) do
:ok = repo.__adapter__.storage_up(repo.config)
@ -32,7 +32,7 @@ defmodule Farmbot.System.Init.Ecto do
@doc "Replacement for Mix.Tasks.Ecto.Drop"
def drop do
repos = Application.get_env(:farmbot_os, :ecto_repos)
repos = Application.get_env(:farmbot, :ecto_repos)
for repo <- repos do
case drop(repo) do
@ -49,11 +49,11 @@ defmodule Farmbot.System.Init.Ecto do
@doc "Replacement for Mix.Tasks.Ecto.Migrate"
def migrate do
repos = Application.get_env(:farmbot_os, :ecto_repos)
Application.put_env(:farmbot_os, :repo_hack, nil)
repos = Application.get_env(:farmbot, :ecto_repos)
Application.put_env(:farmbot, :repo_hack, nil)
for repo <- repos do
Application.put_env(:farmbot_os, :repo_hack, repo)
Application.put_env(:farmbot, :repo_hack, repo)
# setup(repo)
migrate(repo)
end

View File

@ -6,7 +6,7 @@ defmodule Farmbot.System.Init.Supervisor do
end
def init([]) do
children = Application.get_env(:farmbot_os, :init_children, []) ++ [
children = Application.get_env(:farmbot, :init_children, []) ++ [
{Farmbot.System.Init.FSCheckup, []},
{Farmbot.System.Init.Ecto, []},
]

View File

@ -22,7 +22,7 @@ defmodule Farmbot.System.NervesHub do
get_config_value: 3, update_config_value: 4
]
@handler Application.get_env(:farmbot_os, __MODULE__)[:farmbot_nerves_hub_handler]
@handler Application.get_env(:farmbot, __MODULE__)[:farmbot_nerves_hub_handler]
|| Mix.raise("missing :farmbot_nerves_hub_handler module")
@doc "Function to return a String serial number. "

View File

@ -8,7 +8,7 @@ defmodule Farmbot.Platform.Supervisor do
end
def init([]) do
platform_children = Application.get_env(:farmbot_os, __MODULE__)[:platform_children]
platform_children = Application.get_env(:farmbot, __MODULE__)[:platform_children]
Supervisor.init(platform_children, strategy: :one_for_all)
end
end

View File

@ -8,14 +8,14 @@ defmodule Farmbot.OS.ShoehornHandler do
def application_exited(:farmbot_core, reason, state) do
Logger.error "FarmbotCore exited: #{inspect reason}"
Application.stop(:farmbot_os)
Application.ensure_all_started(:farmbot_os)
Application.stop(:farmbot)
Application.ensure_all_started(:farmbot)
{:continue, state}
end
def application_exited(:farmbot_os, reason, state) do
def application_exited(:farmbot, reason, state) do
Logger.error "FarmbotOS exited: #{inspect reason}"
Application.ensure_all_started(:farmbot_os)
Application.ensure_all_started(:farmbot)
{:continue, state}
end

View File

@ -8,7 +8,7 @@ defmodule Farmbot.System do
Please configure `:system_tasks`!
"""
@system_tasks Application.get_env(:farmbot_os, __MODULE__)[:system_tasks]
@system_tasks Application.get_env(:farmbot, __MODULE__)[:system_tasks]
@system_tasks || Mix.raise(error_msg)
@data_path Farmbot.OS.FileSystem.data_path()

View File

@ -8,9 +8,11 @@ defmodule Farmbot.OS.MixProject do
System.put_env("NERVES_FW_MISC", @branch)
@elixir_version Path.join([__DIR__, "..", "ELIXIR_VERSION"]) |> File.read!() |> String.trim()
System.put_env("NERVES_FW_VCS_IDENTIFIER", @commit)
def project do
[
app: :farmbot_os,
app: :farmbot,
elixir: @elixir_version,
target: @target,
version: @version,

View File

@ -9,7 +9,7 @@
"cowlib": {:hex, :cowlib, "2.6.0", "8aa629f81a0fc189f261dc98a42243fa842625feea3c7ec56c48f4ccdb55490f", [:rebar3], [], "hexpm"},
"db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
"decimal": {:hex, :decimal, "1.6.0", "bfd84d90ff966e1f5d4370bdd3943432d8f65f07d3bab48001aebd7030590dcc", [:mix], [], "hexpm"},
"dialyxir": {:hex, :dialyxir, "1.0.0-rc.3", "774306f84973fc3f1e2e8743eeaa5f5d29b117f3916e5de74c075c02f1b8ef55", [:mix], [], "hexpm"},
"dialyxir": {:hex, :dialyxir, "1.0.0-rc.4", "71b42f5ee1b7628f3e3a6565f4617dfb02d127a0499ab3e72750455e986df001", [:mix], [{:erlex, "~> 0.1", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm"},
"distillery": {:hex, :distillery, "2.0.10", "e9f1f1d3f4a89996a3e1a555872feed8a3a73e3d10b51886941382d29ca58f99", [:mix], [{:artificery, "~> 0.2", [hex: :artificery, repo: "hexpm", optional: false]}], "hexpm"},
"earmark": {:hex, :earmark, "1.2.6", "b6da42b3831458d3ecc57314dff3051b080b9b2be88c2e5aa41cd642a5b044ed", [:mix], [], "hexpm"},
"ecto": {:hex, :ecto, "2.2.9", "031d55df9bb430cb118e6f3026a87408d9ce9638737bda3871e5d727a3594aae", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},

View File

@ -3,6 +3,7 @@ defmodule Farmbot.Host.NervesHubHandler do
def serial_number do
{:ok, [_ | [{_ifname, info} | _]]} = :inet.getifaddrs()
:io_lib.format('~2.16.0B~2.16.0B~2.16.0B~2.16.0B~2.16.0B~2.16.0B', info[:hwaddr])
|> to_string()
|> String.trim()
@ -16,11 +17,12 @@ defmodule Farmbot.Host.NervesHubHandler do
def deconfigure, do: :ok
def config, do: [
serial_number(),
"Not a real cert",
"Not a real key"
]
def config,
do: [
serial_number(),
"Not a real cert",
"Not a real key"
]
def check_update, do: nil

View File

@ -2,8 +2,8 @@ defmodule Farmbot.Target.Bootstrap.Configurator.CaptivePortal do
use GenServer
require Farmbot.Logger
@interface Application.get_env(:farmbot_os, :captive_portal_interface, "wlan0")
@address Application.get_env(:farmbot_os, :captive_portal_address, "192.168.25.1")
@interface Application.get_env(:farmbot, :captive_portal_interface, "wlan0")
@address Application.get_env(:farmbot, :captive_portal_address, "192.168.25.1")
@mdns_domain "farmbot-setup.local"
@dnsmasq_conf_file "dnsmasq.conf"

View File

@ -210,7 +210,7 @@ defmodule Farmbot.Target.Bootstrap.Configurator.Router do
ntp_server_1 = conn.params["ntp_server_1"] |> remove_empty_string()
ntp_server_2 = conn.params["ntp_server_2"] |> remove_empty_string()
reg_domain = conn.params["regulatory_domain"] |> remove_empty_string()
reg_domain = conn.params["regulatory_domain"] |> remove_empty_string()
ssh_key = conn.params["ssh_key"] |> remove_empty_string()
@ -244,7 +244,7 @@ defmodule Farmbot.Target.Bootstrap.Configurator.Router do
ipv4_address: ipv4_address,
ipv4_gateway: ipv4_gateway,
ipv4_subnet_mask: ipv4_subnet_mask,
regulatory_domain: reg_domain,
regulatory_domain: reg_domain
})
redir(conn, "/firmware")

View File

@ -4,7 +4,7 @@ defmodule Farmbot.System.NervesHubClient do
"""
use GenServer
use Farmbot.Logger
require Farmbot.Logger
alias Farmbot.BotState.JobProgress
@behaviour NervesHub.Client
@ -20,7 +20,11 @@ defmodule Farmbot.System.NervesHubClient do
def serial_number(:rpi3), do: serial_number("rpi")
def serial_number(plat) do
:os.cmd('/usr/bin/boardid -b uboot_env -u nerves_serial_number -b uboot_env -u serial_number -b #{plat}')
:os.cmd(
'/usr/bin/boardid -b uboot_env -u nerves_serial_number -b uboot_env -u serial_number -b #{
plat
}'
)
|> to_string()
|> String.trim()
end
@ -30,10 +34,10 @@ defmodule Farmbot.System.NervesHubClient do
def serial_number, do: serial_number(Farmbot.Project.target())
def connect do
Logger.debug 3, "Starting OTA Service"
Farmbot.Logger.debug(3, "Starting OTA Service")
# NervesHub replaces it's own env on startup. Reset it.
Application.put_env(:nerves_hub, NervesHub.Socket, [reconnect_interval: 5000])
Application.put_env(:nerves_hub, NervesHub.Socket, reconnect_interval: 5000)
supervisor = Farmbot.System.Supervisor
# Stop Nerves Hub if it is running.
_ = Supervisor.terminate_child(supervisor, NervesHub.Supervisor)
@ -47,7 +51,7 @@ defmodule Farmbot.System.NervesHubClient do
# Start the connection again.
{:ok, _pid} = Supervisor.start_child(supervisor, NervesHub.Supervisor)
Logger.debug 3, "OTA Service started"
Logger.debug(3, "OTA Service started")
:ok
end
@ -74,9 +78,9 @@ defmodule Farmbot.System.NervesHubClient do
[
Nerves.Runtime.KV.get("nerves_fw_serial_number"),
Nerves.Runtime.KV.get("nerves_hub_cert"),
Nerves.Runtime.KV.get("nerves_hub_key"),
Nerves.Runtime.KV.get("nerves_hub_key")
]
|> Enum.map(fn(val) ->
|> Enum.map(fn val ->
if val == "", do: nil, else: val
end)
end
@ -85,15 +89,18 @@ defmodule Farmbot.System.NervesHubClient do
case GenServer.call(__MODULE__, :check_update) do
# If updates were disabled, and an update is queued
{:ignore, _url} ->
Logger.info 1, "Applying OTA update"
Farmbot.Logger.info(1, "Applying OTA update")
NervesHub.update()
_ ->
Logger.debug 1, "No update cached. Checking for tag changes."
Farmbot.Logger.debug(1, "No update cached. Checking for tag changes.")
case NervesHub.HTTPClient.update() do
{:ok, %{"data" => %{"update_available" => false}}} ->
do_backup_strats()
_ ->
Logger.info 1, "Applying OTA update"
Farmbot.Logger.info(1, "Applying OTA update")
NervesHub.update()
end
end
@ -102,11 +109,12 @@ defmodule Farmbot.System.NervesHubClient do
defp do_backup_strats do
case Farmbot.System.Updates.check_updates() do
{version, url} ->
Logger.busy 1, "Downloading fallback OTA"
Logger.busy(1, "Downloading fallback OTA")
Farmbot.System.Updates.download_and_apply_update({version, url})
:ok
_ ->
Logger.success 1, "Farmbot is up to date!"
Logger.success(1, "Farmbot is up to date!")
nil
end
end
@ -117,46 +125,56 @@ defmodule Farmbot.System.NervesHubClient do
end
def handle_error(args) do
Logger.error 1, "OTA failed to download: #{inspect(args)}"
Logger.error(1, "OTA failed to download: #{inspect(args)}")
prog = %JobProgress.Percent{status: :error}
if Process.whereis(Farmbot.BotState) do
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
end
:ok
end
def handle_fwup_message({:ok, _, info}) do
Logger.success 1, "OTA Complete Going down for reboot"
Logger.success(1, "OTA Complete Going down for reboot")
prog = %JobProgress.Percent{percent: 100, status: :complete}
if Process.whereis(Farmbot.BotState) do
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
end
:ok
end
def handle_fwup_message({:progress, 100}) do
Logger.success 1, "OTA Complete. Going down for reboot"
Logger.success(1, "OTA Complete. Going down for reboot")
prog = %JobProgress.Percent{percent: 100, status: :complete}
if Process.whereis(Farmbot.BotState) do
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
end
:ok
end
def handle_fwup_message({:progress, percent}) when rem(percent, 5) == 0 do
prog = %JobProgress.Percent{percent: percent}
if Process.whereis(Farmbot.BotState) do
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
end
:ok
end
def handle_fwup_message({:error, _, reason}) do
Logger.error 1, "OTA failed to apply: #{inspect(reason)}"
Farmbot.Logger.error(1, "OTA failed to apply: #{inspect(reason)}")
prog = %JobProgress.Percent{status: :error}
if Process.whereis(Farmbot.BotState) do
Farmbot.BotState.set_job_progress("FBOS_OTA", prog)
end
:ok
end
@ -165,7 +183,7 @@ defmodule Farmbot.System.NervesHubClient do
end
def start_link(_, _) do
GenServer.start_link(__MODULE__, [], [name: __MODULE__])
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init([]) do
@ -177,12 +195,14 @@ defmodule Farmbot.System.NervesHubClient do
if Process.whereis(Farmbot.BotState) do
Farmbot.BotState.set_update_available(true)
end
case get_config_value(:bool, "settings", "os_auto_update") do
true ->
Logger.success 1, "Applying OTA update"
Logger.success(1, "Applying OTA update")
{:reply, :apply, {:apply, url}}
false ->
Logger.info 1, "New Farmbot OS is available!"
Logger.info(1, "New Farmbot OS is available!")
{:reply, :ignore, {:ignore, url}}
end
end
@ -193,15 +213,20 @@ defmodule Farmbot.System.NervesHubClient do
defp maybe_post_update do
case File.read(update_file()) do
{:ok, @current_version} -> :ok
{:ok, @current_version} ->
:ok
{:ok, old_version} ->
Logger.info 1, "Updating FarmbotOS from #{old_version} to #{@current_version}"
Logger.info(1, "Updating FarmbotOS from #{old_version} to #{@current_version}")
do_post_update()
{:error, :enoent} ->
Logger.info 1, "Setting up FarmbotOS #{@current_version}"
{:error, err} -> raise err
Logger.info(1, "Setting up FarmbotOS #{@current_version}")
{:error, err} ->
raise err
end
before_update()
end
@ -209,8 +234,9 @@ defmodule Farmbot.System.NervesHubClient do
alias Farmbot.Firmware.UartHandler.Update
hw = get_config_value(:string, "settings", "firmware_hardware")
is_beta? = Farmbot.Project.branch() in ["beta", "staging"]
if is_beta? do
Logger.debug 1, "Forcing beta image arduino firmware flash."
Logger.debug(1, "Forcing beta image arduino firmware flash.")
Update.force_update_firmware(hw)
else
Update.maybe_update_firmware(hw)

View File

@ -186,8 +186,11 @@ defmodule Farmbot.Target.Network do
ipv4_gateway: config.ipv4_gateway,
ipv4_subnet_mask: config.ipv4_subnet_mask
]
"dhcp" ->
[ipv4_address_method: :dhcp]
{name, Keyword.merge(opts, settings)}
"dhcp" ->
{name, opts}
end
|> maybe_use_name_servers(config)
|> maybe_use_domain(config)

View File

@ -1,12 +1,11 @@
use Mix.Releases.Config,
# This sets the default release built by `mix release`
default_release: :default,
# This sets the default environment used by `mix release`
default_environment: :dev
# This sets the default release built by `mix release`
default_release: :default,
# This sets the default environment used by `mix release`
default_environment: :dev
# For a full list of config options for both releases
# and environments, visit https://hexdocs.pm/distillery/configuration.html
# and environments, visit https://hexdocs.pm/distillery/config/distillery.html
# You may define one or more environments in this file,
# an environment's settings will override those of a release
@ -14,13 +13,11 @@ use Mix.Releases.Config,
# and environment configuration is called a profile
environment :dev do
set(cookie: :"gz`tgx[zM,ueL[g{Ji62{jiawNDZHH~PGkNQLa&R>R7c0SKziff4L,*&ZNG)(qu0")
set(vm_args: "rel/vm.args")
set(cookie: :"Unused with Nerves. See vm.args")
end
environment :prod do
set(cookie: :"gz`tgx[zM,ueL[g{Ji62{jiawNDZHH~PGkNQLa&R>R7c0SKziff4L,*&ZNG)(qu0")
set(vm_args: "rel/vm.args")
set(cookie: :"Unused with Nerves. See vm.args")
end
# You may define one or more releases in this file.
@ -29,7 +26,7 @@ end
# will be used by default
release :farmbot do
set version: current_version(:farmbot)
plugin Shoehorn
plugin Nerves
set(version: current_version(:farmbot))
plugin(Nerves)
plugin(Shoehorn)
end

View File

@ -0,0 +1,3 @@
*.*
!*.exs
!.gitignore

View File

@ -1,5 +1,6 @@
#!/bin/bash
PROJECTS="farmbot_celery_script \
farmbot_firmware \
farmbot_core \
farmbot_ext \
farmbot_os