| 1 |
|
defmodule Agent.Puppet do |
| 2 |
|
import Enum, only: [map: 2, filter: 2] |
| 3 |
|
import Registry, only: [select: 2] |
| 4 |
|
import Log, only: [trace: 1] |
| 5 |
|
|
| 6 |
:-( |
def cwd do |
| 7 |
:-( |
trace("puppet:cwd called\n") |
| 8 |
:-( |
select() |> track() |
| 9 |
|
catch |
| 10 |
:-( |
_, e -> handle(e) |
| 11 |
|
end |
| 12 |
|
|
| 13 |
|
defp track(entries) do |
| 14 |
:-( |
trace("puppet:entries=#{inspect(entries)}\n") |
| 15 |
:-( |
entries |> scan() |
| 16 |
|
end |
| 17 |
|
|
| 18 |
:-( |
defp handle(e) do |
| 19 |
:-( |
trace("puppet:catch=#{inspect(e)}\n") |
| 20 |
|
nil |
| 21 |
|
end |
| 22 |
|
|
| 23 |
|
defp select do |
| 24 |
:-( |
trace("puppet:select start\n") |
| 25 |
:-( |
entries = ElitaRegistry |> select([{{:_, :"$2", :"$1"}, [], [{{:"$2", :"$1"}}]}]) |
| 26 |
:-( |
trace("puppet:selected #{entries |> length()} entries\n") |
| 27 |
:-( |
entries |> pick() |
| 28 |
|
end |
| 29 |
|
|
| 30 |
|
defp pick(entries) do |
| 31 |
:-( |
trace("puppet:pick entries=#{inspect(entries)}\n") |
| 32 |
:-( |
result = entries |> map(&extract/1) |
| 33 |
:-( |
trace("puppet:after map=#{inspect(result)}\n") |
| 34 |
:-( |
result |> filter(& &1) |
| 35 |
|
end |
| 36 |
|
|
| 37 |
:-( |
defp extract({pid, %{kind: :puppet}}) do |
| 38 |
:-( |
trace("puppet:extract found pid=#{inspect(pid)}\n") |
| 39 |
|
{pid, %{kind: :puppet}} |
| 40 |
|
end |
| 41 |
|
|
| 42 |
:-( |
defp extract(_), do: nil |
| 43 |
|
|
| 44 |
:-( |
defp scan([]), do: nil |
| 45 |
|
|
| 46 |
|
defp scan([entry | rest]) do |
| 47 |
:-( |
entry |> query() |> ok(rest) |
| 48 |
|
end |
| 49 |
|
|
| 50 |
|
defp query({pid, %{kind: :puppet}}) do |
| 51 |
:-( |
trace("puppet:found pid=#{inspect(pid)}\n") |
| 52 |
:-( |
node = node(pid) |
| 53 |
:-( |
trace("puppet:node=#{node}\n") |
| 54 |
:-( |
rpc(node) |
| 55 |
|
end |
| 56 |
|
|
| 57 |
:-( |
defp query(entry) do |
| 58 |
:-( |
trace("puppet:query skip entry=#{inspect(entry)}\n") |
| 59 |
|
nil |
| 60 |
|
end |
| 61 |
|
|
| 62 |
:-( |
defp rpc(node) do |
| 63 |
:-( |
:erpc.call(node, System, :cwd, [], 5000) |
| 64 |
|
catch |
| 65 |
:-( |
_, e -> error(e) |
| 66 |
|
end |
| 67 |
|
|
| 68 |
:-( |
defp error(e) do |
| 69 |
:-( |
trace("puppet:rpc error=#{inspect(e)}\n") |
| 70 |
|
nil |
| 71 |
|
end |
| 72 |
|
|
| 73 |
|
defp ok(cwd, _rest) when is_binary(cwd) do |
| 74 |
:-( |
trace("puppet:cwd=#{cwd}\n") |
| 75 |
:-( |
cwd |
| 76 |
|
end |
| 77 |
|
|
| 78 |
:-( |
defp ok(nil, rest), do: scan(rest) |
| 79 |
|
end |