Skip to content

Instantly share code, notes, and snippets.

@ConnorRigby
Created December 1, 2020 19:14
Show Gist options
  • Save ConnorRigby/c98d9112459ac6b3020d9c2bc13140b4 to your computer and use it in GitHub Desktop.
Save ConnorRigby/c98d9112459ac6b3020d9c2bc13140b4 to your computer and use it in GitHub Desktop.
defmodule Mix.Tasks.Firmware.Reload do
@moduledoc """
Used to reload OTP apps or modules on a
remove erlang node.
"""
use Mix.Task
@app :firmware
@switches [
app: :keep,
module: :keep
]
def run(args) do
{opts, args} = OptionParser.parse!(args, strict: @switches)
[hostname | _] = args
node = :"@{app}@#{hostname}"
mods = get_mods(opts)
{:ok, _} = Node.start(:"reload@#{hostname}")
Node.set_cookie(:"#{@app}_cookie")
true = Node.connect(node)
for module <- mods do
{:ok, [{^node, :loaded, ^module}]} = IEx.Helpers.nl([node], module)
end
Mix.shell().info("Reloaded")
end
defp get_mods(opts) do
case Keyword.get_values(opts, :module) do
[_ | _] = mods ->
Enum.map(mods, fn mod ->
mod = Module.concat("Elixir", mod)
Code.ensure_loaded?(mod)
mod
end)
[] ->
get_apps(opts)
end
end
defp get_apps(opts) do
apps =
case Keyword.get_values(opts, :app) do
[] -> [:dinko_base]
[_ | _] = apps -> Enum.map(apps, &String.to_atom/1)
end
Enum.reduce(apps, [], fn app, mods ->
Application.load(app)
{:ok, more_mods} = :application.get_key(app, :modules)
mods ++ more_mods
end)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment