Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion config/dev.exs
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@

1 change: 0 additions & 1 deletion config/prod.exs
Original file line number Diff line number Diff line change
@@ -1 +0,0 @@

18 changes: 13 additions & 5 deletions lib/crow/worker.ex
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,22 @@ defmodule Crow.Worker do
{:ok, hostname} = :inet.gethostname()
:ok = :gen_tcp.send(conn, '# munin node at #{hostname}\n')
Logger.debug("accepted connection from #{:inet.ntoa(ip)}:#{port}.")
{:noreply, conn}
{:noreply, {[], conn}}
end

@doc false
@impl true
def handle_info({:tcp, sock, "cap" <> _rest}, state) do
:ok = :gen_tcp.send(sock, 'cap\n')
{:noreply, state}
def handle_info({:tcp, sock, "cap" <> requested_caps}, {used_caps, conn}) do
if String.contains?(requested_caps, "dirtyconfig") do
:ok = :gen_tcp.send(sock, 'cap dirtyconfig\n')
{:noreply, {[:dirtyconfig], conn}}
else
:ok = :gen_tcp.send(sock, 'cap\n')
{:noreply, {used_caps, conn}}
end
end

def handle_info({:tcp, sock, "config " <> rest}, state) do
def handle_info({:tcp, sock, "config " <> rest}, {client_caps, _conn} = state) do
plugin_name =
rest
|> String.trim()
Expand All @@ -42,8 +47,11 @@ defmodule Crow.Worker do
if matching_plugin == nil do
:gen_tcp.send(sock, '# unknown plugin\n')
else
dirty_values = if :dirtyconfig in client_caps, do: matching_plugin.values(), else: []

response =
matching_plugin.config()
|> Kernel.++(dirty_values)
|> Stream.intersperse('\n')
|> Enum.to_list()
|> :lists.concat()
Expand Down
16 changes: 15 additions & 1 deletion test/crow/worker_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,15 @@ defmodule Crow.WorkerTest do
end

describe "cap command" do
test "displays no capabilities", %{socket: socket} do
test "with no capabilities", %{socket: socket} do
:ok = :gen_tcp.send(socket, 'cap\n')
assert_receive {:tcp, ^socket, "cap\n"}
end

test "with dirtyconfig capability", %{socket: socket} do
:ok = :gen_tcp.send(socket, 'cap dirtyconfig\n')
assert_receive {:tcp, ^socket, "cap dirtyconfig\n"}
end
end

describe "config command" do
Expand All @@ -47,6 +52,15 @@ defmodule Crow.WorkerTest do
end
end

describe "dirtyconfig capability" do
test "adds values in config command", %{socket: socket} do
:ok = :gen_tcp.send(socket, 'cap dirtyconfig\n')
assert_receive {:tcp, ^socket, "cap dirtyconfig\n"}
:ok = :gen_tcp.send(socket, 'config custom_name\n')
assert_receive {:tcp, ^socket, "graph_title fizz buzz\nfoo.value 3\n.\n"}
end
end

describe "fetch command" do
test "displays values for known plugins", %{socket: socket} do
:ok = :gen_tcp.send(socket, 'fetch custom_name\n')
Expand Down