Packages
nerves_runtime
0.10.3
0.13.13
0.13.12
0.13.11
retired
0.13.10
0.13.9
0.13.8
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.10
0.11.9
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.3
0.10.2
0.10.1
0.10.0
retired
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.1
0.3.0
0.2.0
0.1.2
0.1.1
0.1.0
Small, general runtime utilities for Nerves devices
Current section
Files
Jump to
Current section
Files
lib/nerves_runtime/application.ex
defmodule Nerves.Runtime.Application do
@moduledoc false
use Application
require Logger
alias Nerves.Runtime.{Init, Kernel, KV}
alias Nerves.Runtime.Log.{KmsgTailer, SyslogTailer}
@rngd_path "/usr/sbin/rngd"
@impl true
def start(_type, _args) do
# On systems with hardware random number generation, it is important that
# "rngd" gets started as soon as possible to start adding entropy to the
# system. So much code directly or indirectly uses random numbers that it's
# very easy to block on the random number generator or get low entropy
# numbers.
try_rngd()
target = Nerves.Runtime.target()
children =
[
KV
] ++ target_children(target)
opts = [strategy: :one_for_one, name: Nerves.Runtime.Supervisor]
Supervisor.start_link(children, opts)
end
defp target_children("host") do
[]
end
defp target_children(_target) do
kernel_opts = Application.get_env(:nerves_runtime, :kernel, [])
[
KmsgTailer,
SyslogTailer,
{Kernel.UEvent, kernel_opts},
Init
]
end
defp try_rngd() do
if File.exists?(@rngd_path) do
# Launch rngd. It daemonizes itself so this should return quickly.
case System.cmd(@rngd_path, []) do
{_, 0} ->
:ok
{reason, _non_zero_exit} ->
_ = Logger.warn("Failed to start rngd: #{inspect(reason)}")
:ok
end
else
:ok
end
end
end