Compare commits
4 commits
01d9c54023
...
4f90ccb047
Author | SHA1 | Date | |
---|---|---|---|
4f90ccb047 | |||
0881246d57 | |||
a0eb9cd518 | |||
9b898a6506 |
6 changed files with 165 additions and 125 deletions
8
deploy-local.sh
Normal file
8
deploy-local.sh
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
doas service freedive onestop
|
||||||
|
doas pkg remove -y freedive
|
||||||
|
mix package
|
||||||
|
doas pkg install -U -y freedive-0.1.0.pkg
|
||||||
|
doas service freedive onestart
|
||||||
|
doas tail -f /var/log/freedive/freedive.log
|
|
@ -81,9 +81,7 @@ defmodule Freedive.Api.Service do
|
||||||
broadcast(:stdlog, %{name: name, log: std_to_log(reason)})
|
broadcast(:stdlog, %{name: name, log: std_to_log(reason)})
|
||||||
end
|
end
|
||||||
|
|
||||||
if command in ["start", "stop", "restart"] do
|
|
||||||
broadcast(:refreshed, service_details(name))
|
broadcast(:refreshed, service_details(name))
|
||||||
end
|
|
||||||
|
|
||||||
{:noreply, state}
|
{:noreply, state}
|
||||||
end
|
end
|
||||||
|
|
|
@ -107,8 +107,7 @@ defmodule FreediveWeb.ServiceLive do
|
||||||
socket
|
socket
|
||||||
|> assign(:selected_item, %{
|
|> assign(:selected_item, %{
|
||||||
socket.assigns.selected_item
|
socket.assigns.selected_item
|
||||||
| log: socket.assigns.selected_item.log ++ payload.log,
|
| log: socket.assigns.selected_item.log ++ payload.log
|
||||||
busy: false
|
|
||||||
})
|
})
|
||||||
else
|
else
|
||||||
socket
|
socket
|
||||||
|
@ -137,6 +136,24 @@ defmodule FreediveWeb.ServiceLive.Components do
|
||||||
attr :details, :string, default: nil, doc: "details"
|
attr :details, :string, default: nil, doc: "details"
|
||||||
|
|
||||||
def items_block(%{details: true} = assigns) do
|
def items_block(%{details: true} = assigns) do
|
||||||
|
~H"""
|
||||||
|
<.back_link selected_item={@selected_item} />
|
||||||
|
<.service_header selected_item={@selected_item} />
|
||||||
|
<.std_log selected_item={@selected_item} />
|
||||||
|
<.basic_commands selected_item={@selected_item} />
|
||||||
|
<.extra_commands selected_item={@selected_item} />
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
def items_block(assigns) do
|
||||||
|
~H"""
|
||||||
|
<%= for {_name, item} <- @items do %>
|
||||||
|
<.service_preview item={item} selected_item={@selected_item} />
|
||||||
|
<% end %>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
|
def back_link(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<.link
|
<.link
|
||||||
class="panel-block pt-1 has-background-light"
|
class="panel-block pt-1 has-background-light"
|
||||||
|
@ -148,96 +165,119 @@ defmodule FreediveWeb.ServiceLive.Components do
|
||||||
</span>
|
</span>
|
||||||
<div class="mt-2 ml-2">Back</div>
|
<div class="mt-2 ml-2">Back</div>
|
||||||
</.link>
|
</.link>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
<.panel_media>
|
def service_header(assigns) do
|
||||||
<:icon>
|
~H"""
|
||||||
|
<.panel_block>
|
||||||
<.icon_raw for={@selected_item.icon} color="auto" size="3rem" aria-hidden="true" />
|
<.icon_raw for={@selected_item.icon} color="auto" size="3rem" aria-hidden="true" />
|
||||||
<%!-- <Lucideicons.accessibility height="2rem" width="2rem" /> --%>
|
<div class="column">
|
||||||
</:icon>
|
|
||||||
|
|
||||||
<.title is-4>
|
<.title is-4>
|
||||||
<%= @selected_item.name %>
|
<%= @selected_item.name %>
|
||||||
|
<%= if @selected_item.running do %>
|
||||||
|
<.icon for="circle-play" color="lightgreen" aria-hidden="true" />
|
||||||
|
<% else %>
|
||||||
|
<.icon for="circle-stop" color="gray" aria-hidden="true" />
|
||||||
|
<% end %>
|
||||||
|
<%= if @selected_item.enabled do %>
|
||||||
|
<.icon for="circle-check" color="lightgreen" aria-hidden="true" />
|
||||||
|
<% else %>
|
||||||
|
<.icon for="circle-x" color="gray" aria-hidden="true" />
|
||||||
|
<% end %>
|
||||||
</.title>
|
</.title>
|
||||||
<.subtitle>
|
<.subtitle>
|
||||||
<%= @selected_item.description %>
|
<%= @selected_item.description %>
|
||||||
</.subtitle>
|
</.subtitle>
|
||||||
|
|
||||||
<:actions>
|
|
||||||
<div class="columns">
|
|
||||||
<div class="column is-narrow">
|
|
||||||
<%= if @selected_item.running do %>
|
|
||||||
<.icon for="circle-play" color="green" aria-hidden="true" />
|
|
||||||
<% else %>
|
|
||||||
<.icon for="circle-stop" color="red" aria-hidden="true" />
|
|
||||||
<% end %>
|
|
||||||
<%= if @selected_item.enabled do %>
|
|
||||||
<.icon for="circle-check" color="green" aria-hidden="true" />
|
|
||||||
<% else %>
|
|
||||||
<.icon for="circle-x" color="red" aria-hidden="true" />
|
|
||||||
<% end %>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</.panel_block>
|
||||||
</:actions>
|
"""
|
||||||
</.panel_media>
|
end
|
||||||
|
|
||||||
<%= if Map.has_key?(@selected_item, :log) and @selected_item.log != [] do %>
|
def service_preview(assigns) do
|
||||||
<.panel_media>
|
~H"""
|
||||||
<:icon>
|
<.panel_block
|
||||||
<.icon for="terminal" color="gray" aria-hidden="true" />
|
class={"#{if @selected_item != nil and @selected_item.name == @item.name, do: "pt-2 has-background-info-light", else: "pt-2"}"}
|
||||||
</:icon>
|
phx-click="tap"
|
||||||
<:actions></:actions>
|
phx-value-name={@item.name}
|
||||||
<pre><code><%= Enum.join(@selected_item.log, "\n") %></code></pre>
|
>
|
||||||
</.panel_media>
|
|
||||||
|
<.icon_raw for={@item.icon} color="auto" size="1.8rem" aria-hidden="true" />
|
||||||
|
|
||||||
|
<span class="is-size-5 px-4">
|
||||||
|
<%= @item.name %>
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<%= if @item.running do %>
|
||||||
|
<.icon for="circle-play" size="1rem" color="lightgreen" aria-hidden="true" />
|
||||||
|
<% else %>
|
||||||
|
<.icon for="circle-stop" size="1rem" color="gray" aria-hidden="true" />
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<%= if @item.enabled do %>
|
||||||
|
<.icon for="circle-check" size="1rem" color="lightgreen" aria-hidden="true" />
|
||||||
|
<% else %>
|
||||||
|
<.icon for="circle-x" size="1rem" color="gray" aria-hidden="true" />
|
||||||
|
<% end %>
|
||||||
|
</.panel_block>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
<.panel_media>
|
def basic_commands(assigns) do
|
||||||
<:icon>
|
~H"""
|
||||||
<%!-- <.icon for="terminal" color="auto" size="3rem" aria-hidden="true" /> --%>
|
<.panel_block_div>
|
||||||
</:icon>
|
<%= if @selected_item.running do %>
|
||||||
|
<.icon_raw for="power" color="lightgreen" size="2rem" class="ml-2 mr-5" aria-hidden="true" />
|
||||||
<:actions>
|
<% else %>
|
||||||
<div class="columns is-mobile">
|
<.icon_raw for="power" color="gray" size="2rem" class="ml-2 mr-5" aria-hidden="true" />
|
||||||
|
<% end %>
|
||||||
|
<div class="columns is-fullwidth mr-4">
|
||||||
<%= if @selected_item.running do %>
|
<%= if @selected_item.running do %>
|
||||||
<div class="column is-narrow">
|
|
||||||
<button
|
<button
|
||||||
class="button is-warning"
|
class="button is-warning column is-2 m-2 is-fullwidth"
|
||||||
phx-click="action:restart"
|
phx-click="action:restart"
|
||||||
phx-value-name={@selected_item.name}
|
phx-value-name={@selected_item.name}
|
||||||
{if @selected_item.busy, do: [disabled: true], else: []}
|
{if @selected_item.busy, do: [disabled: true], else: []}
|
||||||
>
|
>
|
||||||
Restart
|
Restart
|
||||||
</button>
|
</button>
|
||||||
</div>
|
|
||||||
<div class="column">
|
|
||||||
<button
|
<button
|
||||||
class="button is-danger"
|
class="button is-danger column is-2 m-2 is-fullwidth"
|
||||||
phx-click="action:stop"
|
phx-click="action:stop"
|
||||||
phx-value-name={@selected_item.name}
|
phx-value-name={@selected_item.name}
|
||||||
{if @selected_item.busy, do: [disabled: true], else: []}
|
{if @selected_item.busy, do: [disabled: true], else: []}
|
||||||
>
|
>
|
||||||
Stop
|
Stop
|
||||||
</button>
|
</button>
|
||||||
</div>
|
|
||||||
<% else %>
|
<% else %>
|
||||||
<div class="column">
|
|
||||||
<button
|
<button
|
||||||
class="button is-success"
|
class="button is-success column is-2 m-2 is-fullwidth"
|
||||||
phx-click="action:start"
|
phx-click="action:start"
|
||||||
phx-value-name={@selected_item.name}
|
phx-value-name={@selected_item.name}
|
||||||
{if @selected_item.busy, do: [disabled: true], else: []}
|
{if @selected_item.busy, do: [disabled: true], else: []}
|
||||||
>
|
>
|
||||||
Start
|
Start
|
||||||
</button>
|
</button>
|
||||||
</div>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</:actions>
|
</.panel_block_div>
|
||||||
|
"""
|
||||||
|
end
|
||||||
|
|
||||||
<%= if @selected_item.commands do %>
|
def extra_commands(assigns) do
|
||||||
|
~H"""
|
||||||
|
<%= if @selected_item.commands != [] and @selected_item.commands != nil do %>
|
||||||
|
<.panel_block_div>
|
||||||
|
<.icon_raw
|
||||||
|
for="inspection-panel"
|
||||||
|
color="auto"
|
||||||
|
size="2rem"
|
||||||
|
class="ml-1 mr-5"
|
||||||
|
aria-hidden="true"
|
||||||
|
/>
|
||||||
|
<div class="columns is-fullwidth mr-4">
|
||||||
<%= for command <- @selected_item.commands do %>
|
<%= for command <- @selected_item.commands do %>
|
||||||
<button
|
<button
|
||||||
class="button is-info"
|
class="button is-info column is-2 m-2 is-fullwidth"
|
||||||
phx-disable-with="..."
|
|
||||||
phx-click={"command:#{command}"}
|
phx-click={"command:#{command}"}
|
||||||
phx-value-name={@selected_item.name}
|
phx-value-name={@selected_item.name}
|
||||||
{if @selected_item.busy, do: [disabled: true], else: []}
|
{if @selected_item.busy, do: [disabled: true], else: []}
|
||||||
|
@ -245,28 +285,16 @@ defmodule FreediveWeb.ServiceLive.Components do
|
||||||
<%= command %>
|
<%= command %>
|
||||||
</button>
|
</button>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
</div>
|
||||||
|
</.panel_block_div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</.panel_media>
|
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
||||||
def items_block(assigns) do
|
def std_log(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<%= for {_name, item} <- @items do %>
|
<%= if Map.has_key?(@selected_item, :log) and @selected_item.log != [] do %>
|
||||||
<div>
|
<pre class="panel-block is-fullwidth"><code><%= Enum.join(@selected_item.log, "\n") %></code></pre>
|
||||||
<.link
|
|
||||||
class={"panel-block pt-1 #{if @selected_item != nil and @selected_item.name == item.name, do: "has-background-info-light"}"}
|
|
||||||
phx-click="tap"
|
|
||||||
phx-value-name={item.name}
|
|
||||||
>
|
|
||||||
<span class="panel-icon">
|
|
||||||
<.icon for={item.icon} color="auto" aria-hidden="true" />
|
|
||||||
</span>
|
|
||||||
<div class="mt-2 ml-2">
|
|
||||||
<%= item.name %>
|
|
||||||
</div>
|
|
||||||
</.link>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,14 +5,14 @@ defmodule FreediveWeb.UserLoginLive do
|
||||||
~H"""
|
~H"""
|
||||||
<.hero>
|
<.hero>
|
||||||
<.container>
|
<.container>
|
||||||
<.block>
|
<.section>
|
||||||
<.title is-4>
|
<.title is-4>
|
||||||
Log in to account
|
Log in to account
|
||||||
</.title>
|
</.title>
|
||||||
<.subtitle is-6 has-text-grey>
|
<.subtitle is-6 has-text-grey>
|
||||||
freedive@hostname
|
freedive@hostname
|
||||||
</.subtitle>
|
</.subtitle>
|
||||||
</.block>
|
</.section>
|
||||||
|
|
||||||
<.column is-6-desktop>
|
<.column is-6-desktop>
|
||||||
<.simple_form for={@form} id="login_form" action={~p"/users/log_in"} phx-update="ignore">
|
<.simple_form for={@form} id="login_form" action={~p"/users/log_in"} phx-update="ignore">
|
||||||
|
|
|
@ -37,7 +37,9 @@ defmodule Liliform.Page do
|
||||||
phx-click="filter"
|
phx-click="filter"
|
||||||
phx-value-key={filter.key}
|
phx-value-key={filter.key}
|
||||||
>
|
>
|
||||||
|
<span class="is-size-5">
|
||||||
<%= filter.title %>
|
<%= filter.title %>
|
||||||
|
</span>
|
||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
</.panel_tabs>
|
</.panel_tabs>
|
||||||
|
@ -50,7 +52,11 @@ defmodule Liliform.Page do
|
||||||
phx-click="filter"
|
phx-click="filter"
|
||||||
phx-value-key={filter.key}
|
phx-value-key={filter.key}
|
||||||
>
|
>
|
||||||
<.icon for={filter.icon} color={if filter.active, do: "gray", else: "auto"} />
|
<.icon_raw
|
||||||
|
for={filter.icon}
|
||||||
|
size="2rem"
|
||||||
|
color={if filter.active, do: "gray", else: "auto"}
|
||||||
|
/>
|
||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
</.panel_tabs>
|
</.panel_tabs>
|
||||||
|
|
|
@ -99,11 +99,11 @@ defmodule Liliform.Panel do
|
||||||
|
|
||||||
~H"""
|
~H"""
|
||||||
<div class={["panel-block", @class]} {@rest}>
|
<div class={["panel-block", @class]} {@rest}>
|
||||||
<.media class="is-fullwidth">
|
<.media>
|
||||||
<.media_left>
|
<.media_left>
|
||||||
<%= render_slot(@icon) %>
|
<%= render_slot(@icon) %>
|
||||||
</.media_left>
|
</.media_left>
|
||||||
<.media_content class="is-fullwidth">
|
<.media_content>
|
||||||
<%= render_slot(@inner_block) %>
|
<%= render_slot(@inner_block) %>
|
||||||
</.media_content>
|
</.media_content>
|
||||||
<.media_right>
|
<.media_right>
|
||||||
|
|
Loading…
Reference in a new issue