From ec7e4db437011f9654198a84f28b0df5a901b3a3 Mon Sep 17 00:00:00 2001 From: Johannes Christ Date: Mon, 10 Apr 2023 01:59:13 +0200 Subject: [PATCH] Add dirtyconfig capability --- config/dev.exs | 1 - config/prod.exs | 1 - lib/crow/worker.ex | 18 +++++++++++++----- test/crow/worker_test.exs | 16 +++++++++++++++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/config/dev.exs b/config/dev.exs index 8b13789..e69de29 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -1 +0,0 @@ - diff --git a/config/prod.exs b/config/prod.exs index 8b13789..e69de29 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -1 +0,0 @@ - diff --git a/lib/crow/worker.ex b/lib/crow/worker.ex index c146426..8dc90b0 100644 --- a/lib/crow/worker.ex +++ b/lib/crow/worker.ex @@ -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() @@ -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() diff --git a/test/crow/worker_test.exs b/test/crow/worker_test.exs index e1e864f..72a864a 100644 --- a/test/crow/worker_test.exs +++ b/test/crow/worker_test.exs @@ -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 @@ -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')