link peristence too now, diff icons for vibe check

abf0ff7 · gmorell · 2023-01-10 23:14

13 files +89 -11

Files changed

modified config/dev.exs
+1 −1
@@ -9,7 +9,7 @@ import Config
9 9 config :lambent_ex, LambentExWeb.Endpoint,
10 10 # Binding to loopback ipv4 address prevents access from other machines.
11 11 # Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
12 − http: [ip: {127, 0, 0, 1}, port: 4000],
12 + http: [ip: {0, 0, 0, 0}, port: 4000],
13 13 check_origin: false,
14 14 code_reloader: true,
15 15 debug_errors: true,
modified lib/lambent_ex/link.ex
+16 −3
@@ -15,7 +15,7 @@ defmodule LambentEx.Link do
15 15
16 16 def init(opts) do
17 17 Process.send_after(self(), :publish, 50)
18 − {:ok, opts} = Keyword.validate(opts, [:source, :target, :name])
18 + {:ok, opts} = Keyword.validate(opts, [:source, :target, :name, :persist])
19 19 Phoenix.PubSub.subscribe(@pubsub_name, @pubsub_topic <> opts[:source])
20 20 Phoenix.PubSub.subscribe(@pubsub_name, @pubsub_pfx_on <> opts[:target])
21 21
@@ -24,7 +24,9 @@ defmodule LambentEx.Link do
24 24 target: opts[:target],
25 25 name: opts[:name],
26 26 enabled: true,
27 − started: DateTime.utc_now
27 + started: DateTime.utc_now,
28 + persist: opts[:persist] || false,
29 + full_opts: opts
28 30 }
29 31
30 32 neighbor_on(state)
@@ -47,6 +49,10 @@ defmodule LambentEx.Link do
47 49 via_tuple("link-#{id}") |> GenServer.cast(:do_toggle)
48 50 end
49 51
52 + def persist(id) do
53 + via_tuple("link-#{id}") |> GenServer.cast(:persist)
54 + end
55 +
50 56 def quit(id) do
51 57 via_tuple("link-#{id}") |> GenServer.cast(:quit)
52 58 end
@@ -56,7 +62,9 @@ defmodule LambentEx.Link do
56 62 name: state[:name],
57 63 source: state[:source],
58 64 target: state[:target],
59 − enabled: state[:enabled]
65 + enabled: state[:enabled],
66 + persist: state[:persist],
67 + opts: state[:full_opts] |> Keyword.update(:persist, true, fn _ -> state[:persist] end),
60 68 }
61 69 end
62 70
@@ -106,4 +114,9 @@ defmodule LambentEx.Link do
106 114 LambentEx.LinkSupervisor.abort_child(self())
107 115 {:noreply, state}
108 116 end
117 +
118 + @impl true
119 + def handle_cast(:persist, state) do
120 + {:noreply, state |> Map.put(:persist, !state.persist)}
121 + end
109 122 end
modified lib/lambent_ex/meta.ex
+40 −1
@@ -10,10 +10,13 @@ defmodule LambentEx.Meta do
10 10 # File.cd("..")
11 11
12 12 Phoenix.PubSub.subscribe(@pubsub_name, "machines_idx")
13 + Phoenix.PubSub.subscribe(@pubsub_name, "links_idx")
13 14 Process.send_after(self(), :machine_flush, 5000)
15 + Process.send_after(self(), :link_flush, 5000)
14 16 ml = MapSet.new()
17 + ll = MapSet.new()
15 18
16 − {:ok, %{table: table, machines: ml}}
19 + {:ok, %{table: table, machines: ml, links: ll}}
17 20 end
18 21
19 22 def start_link(arg) do
@@ -58,6 +61,18 @@ defmodule LambentEx.Meta do
58 61 end
59 62 end
60 63
64 + def get_saved_links do
65 + case :dets.lookup(@table, "links") do
66 + [] -> []
67 + [{_key, value}] ->
68 + value
69 + end
70 + end
71 +
72 + def links_clear() do
73 + :dets.delete(@table, "links")
74 + end
75 +
61 76 def machines_clear() do
62 77 :dets.delete(@table, "machs")
63 78 end
@@ -73,6 +88,18 @@ defmodule LambentEx.Meta do
73 88 end
74 89 end
75 90
91 + def handle_info(:link_flush, state) do
92 + Process.send_after(self(), :link_flush, 5000)
93 + IO.puts("flushen")
94 + IO.inspect(state.links)
95 + if state.links |> MapSet.size() == 0 do
96 + {:noreply, state}
97 + else
98 + :dets.insert(@table, {"links", state.links})
99 + {:noreply, state}
100 + end
101 + end
102 +
76 103 def handle_info({:machines_pub, machine}, state) do
77 104 case machine[:persist] do
78 105 true ->
@@ -84,4 +111,16 @@ defmodule LambentEx.Meta do
84 111 %{state | machines: MapSet.delete(state.machines, machine |> Map.put(:persist, true) |> Map.put(:opts, machine[:opts] |> Keyword.update(:persist, true, fn _ -> true end)))}}
85 112 end
86 113 end
114 +
115 + def handle_info({:links_pub, link}, state) do
116 + case link[:persist] do
117 + true ->
118 + {:noreply, %{state | links: MapSet.put(state.links, link)}}
119 +
120 + false ->
121 + # IO.inspect(machine)
122 + {:noreply,
123 + %{state | links: MapSet.delete(state.links, link |> Map.put(:persist, true) |> Map.put(:opts, link[:opts] |> Keyword.update(:persist, true, fn _ -> true end)))}}
124 + end
125 + end
87 126 end
modified lib/lambent_ex/supervision/link.ex
+13 −1
@@ -16,9 +16,21 @@ defmodule LambentEx.LinkSupervisor do
16 16
17 17 @impl true
18 18 def init(init_arg) do
19 − DynamicSupervisor.init(
19 + r = DynamicSupervisor.init(
20 20 strategy: :one_for_one,
21 21 extra_arguments: [init_arg]
22 22 )
23 +
24 + Task.start(fn ->
25 + LambentEx.Meta.get_saved_links()
26 + |> Enum.map(fn l ->
27 + IO.inspect(l[:opts])
28 + spec = {LambentEx.Link, l[:opts]}
29 + #
30 + DynamicSupervisor.start_child(__MODULE__, spec) |> IO.inspect
31 + end)
32 + end)
33 +
34 + r
23 35 end
24 36 end
modified lib/lambent_ex_web/live/links/index.ex
+8 −3
@@ -66,9 +66,14 @@ defmodule LambentExWeb.LinksLive.Index do
66 66 {:noreply, socket}
67 67 end
68 68
69 − def handle_event("quit", params, socket) do
70 − LambentEx.Link.quit(params["tgt"])
71 − links = socket.assigns.links |> Map.delete(params["tgt"])
69 + def handle_event("quit", %{"tgt" => tgt}, socket) do
70 + LambentEx.Link.quit(tgt)
71 + links = socket.assigns.links |> Map.delete(tgt)
72 72 {:noreply, socket |> assign(:links, links)}
73 73 end
74 +
75 + def handle_event("persist", %{"tgt" => tgt}, socket) do
76 + LambentEx.Link.persist(tgt)
77 + {:noreply, socket}
78 + end
74 79 end
modified lib/lambent_ex_web/live/links/index.html.heex
+11 −2
@@ -41,11 +41,20 @@ on_cancel={JS.navigate(~p"/cfg/links")}>
41 41 <td><%= v[:target] %></td>
42 42 <td>
43 43 <%= if v[:enabled] == true do %>
44 − <input type="checkbox" phx-click="toggle" phx-value-tgt={k} class="toggle" checked />
44 + <input type="checkbox" phx-click="toggle" phx-value-tgt={k} class="toggle mb-4" checked />
45 45 <% else %>
46 − <input type="checkbox" phx-click="toggle" phx-value-tgt={k} class="toggle" />
46 + <input type="checkbox" phx-click="toggle" phx-value-tgt={k} class="toggle mb-4" />
47 47 <% end %>
48 48 &emsp;
49 + <%= if v[:persist] == true do %>
50 + <a class="btn btn-success btn-circle" phx-click="persist" phx-value-tgt={v[:name]}>
51 + <i class="fa-solid fa-2x fa-thumbtack"></i>
52 + </a>
53 + <% else %>
54 + <a class="btn btn-success btn-outline btn-circle" phx-click="persist" phx-value-tgt={v[:name]}>
55 + <i class="fa-solid fa-2x fa-thumbtack"></i>
56 + </a>
57 + <% end %>
49 58 <a class="btn btn-error btn-outline btn-circle" phx-click="quit" phx-value-tgt={k}>
50 59 <i class="fa-solid fa-2x fa-xmark"></i>
51 60 </a>

Parents: 5329761