Packages
nerves_runtime
0.4.0
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/init.ex
defmodule Nerves.Runtime.Init do
use GenServer
alias Nerves.Runtime.KV
def start_link() do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init([]) do
init_application_partition()
{:ok, %{}}
end
def init_application_partition() do
prefix = "nerves_fw_application_part0"
fstype = KV.get_active("#{prefix}_fstype")
target = KV.get_active("#{prefix}_target")
devpath = KV.get_active("#{prefix}_devpath")
if fstype != nil
and target != nil
and devpath != nil do
opts = %{mounted: nil, fstype: fstype, target: target, devpath: devpath}
mounted_state(opts)
|> unmount_if_error()
|> mount()
|> unmount_if_error()
|> format_if_unmounted()
|> mount()
|> validate_mount()
else
:noop
end
end
def mounted_state(s) do
{mounts, 0} = System.cmd("mount", [])
mount =
String.split(mounts, "\n")
|> Enum.find(fn(mount) ->
String.starts_with?(mount, "#{s.devpath} on #{s.target}")
end)
mounted_state =
case mount do
nil -> :unmounted
mount ->
opts =
String.split(mount, " ")
|> List.last
|> String.slice(1..-2)
|> String.split(",")
cond do
"rw" in opts ->
:mounted
true ->
# Mount was read only or any other type
:mounted_with_error
end
end
%{s | mounted: mounted_state}
end
defp mount(%{mounted: :mounted} = s), do: s
defp mount(s) do
System.cmd("mount", ["-t", s.fstype, "-o", "rw", s.devpath, s.target])
mounted_state(s)
end
defp unmount_if_error(%{mounted: :mounted_with_error} = s) do
System.cmd("umount", [s.target])
mounted_state(s)
end
defp unmount_if_error(s), do: s
defp format_if_unmounted(%{mounted: :unmounted} = s) do
System.cmd("mkfs.#{s.fstype}", ["#{s.devpath}", "-F"])
s
end
defp format_if_unmounted(s), do: s
defp validate_mount(s), do: s.mounted
end