- - +
+
<%= @inner_content %>
+ diff --git a/apps/cf_http/lib/cf_http_web/templates/page/index.html.eex b/apps/cf_http/lib/cf_http_web/templates/page/index.html.eex deleted file mode 100644 index d8e9d74ba..000000000 --- a/apps/cf_http/lib/cf_http_web/templates/page/index.html.eex +++ /dev/null @@ -1 +0,0 @@ -Welcome! diff --git a/apps/cf_http/lib/cf_http_web/templates/rule/edit.html.eex b/apps/cf_http/lib/cf_http_web/templates/rule/edit.html.eex new file mode 100644 index 000000000..e49613818 --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/templates/rule/edit.html.eex @@ -0,0 +1,5 @@ +

Edit Rule

+ +<%= render "form.html", Map.put(assigns, :action, Routes.rule_path(@conn, :update, @rule)) %> + +<%= link "Back", to: Routes.rule_path(@conn, :index, @rule.device) %> diff --git a/apps/cf_http/lib/cf_http_web/templates/firewall_rule/form.html.eex b/apps/cf_http/lib/cf_http_web/templates/rule/form.html.eex similarity index 94% rename from apps/cf_http/lib/cf_http_web/templates/firewall_rule/form.html.eex rename to apps/cf_http/lib/cf_http_web/templates/rule/form.html.eex index 23e5eb5df..8a4461fbf 100644 --- a/apps/cf_http/lib/cf_http_web/templates/firewall_rule/form.html.eex +++ b/apps/cf_http/lib/cf_http_web/templates/rule/form.html.eex @@ -1,6 +1,6 @@ <%= form_for @changeset, @action, fn f -> %> <%= if @changeset.action do %> -
+

Oops, something went wrong! Please check the errors below.

<% end %> diff --git a/apps/cf_http/lib/cf_http_web/templates/rule/index.html.eex b/apps/cf_http/lib/cf_http_web/templates/rule/index.html.eex new file mode 100644 index 000000000..0c49c8fa4 --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/templates/rule/index.html.eex @@ -0,0 +1,32 @@ +

Listing Rules

+ + + + + + + + + + + + + +<%= for rule <- @rules do %> + + + + + + + + +<% end %> + +
DestinationPortProtocolEnabled
<%= rule.destination %><%= rule.port %><%= rule.protocol %><%= rule.enabled %> + <%= link "Show", to: Routes.rule_path(@conn, :show, rule) %> + <%= link "Edit", to: Routes.rule_path(@conn, :edit, rule) %> + <%= link "Delete", to: Routes.rule_path(@conn, :delete, rule), method: :delete, data: [confirm: "Are you sure?"] %> +
+ +<%= link "New Rule", to: Routes.rule_path(@conn, :new, @device) %> diff --git a/apps/cf_http/lib/cf_http_web/templates/rule/new.html.eex b/apps/cf_http/lib/cf_http_web/templates/rule/new.html.eex new file mode 100644 index 000000000..5c88667cd --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/templates/rule/new.html.eex @@ -0,0 +1,5 @@ +

New Rule

+ +<%= render "form.html", Map.put(assigns, :action, Routes.rule_path(@conn, :create, @device)) %> + +<%= link "Back", to: Routes.rule_path(@conn, :index, @device) %> diff --git a/apps/cf_http/lib/cf_http_web/templates/rule/show.html.eex b/apps/cf_http/lib/cf_http_web/templates/rule/show.html.eex new file mode 100644 index 000000000..6c785c6bb --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/templates/rule/show.html.eex @@ -0,0 +1,28 @@ +

Show Rule

+ +
    + +
  • + Destination: + <%= @rule.destination %> +
  • + +
  • + Port: + <%= @rule.port %> +
  • + +
  • + Protocol: + <%= @rule.protocol %> +
  • + +
  • + Enabled: + <%= @rule.enabled %> +
  • + +
+ +<%= link "Edit", to: Routes.rule_path(@conn, :edit, @rule) %> +<%= link "Back", to: Routes.rule_path(@conn, :index, @rule.device) %> diff --git a/apps/cf_http/lib/cf_http_web/templates/session/new.html.eex b/apps/cf_http/lib/cf_http_web/templates/session/new.html.eex new file mode 100644 index 000000000..5428d0e86 --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/templates/session/new.html.eex @@ -0,0 +1,23 @@ +
+
+
+ Sign In +
+ + +
+
+ + +
+ +
+
+ +
+ +
+
diff --git a/apps/cf_http/lib/cf_http_web/views/firewall_rule_view.ex b/apps/cf_http/lib/cf_http_web/views/firewall_rule_view.ex deleted file mode 100644 index e873be9b3..000000000 --- a/apps/cf_http/lib/cf_http_web/views/firewall_rule_view.ex +++ /dev/null @@ -1,3 +0,0 @@ -defmodule CfHttpWeb.FirewallRuleView do - use CfHttpWeb, :view -end diff --git a/apps/cf_http/lib/cf_http_web/views/page_view.ex b/apps/cf_http/lib/cf_http_web/views/page_view.ex deleted file mode 100644 index 6e3a53c9d..000000000 --- a/apps/cf_http/lib/cf_http_web/views/page_view.ex +++ /dev/null @@ -1,3 +0,0 @@ -defmodule CfHttpWeb.PageView do - use CfHttpWeb, :view -end diff --git a/apps/cf_http/lib/cf_http_web/views/rule_view.ex b/apps/cf_http/lib/cf_http_web/views/rule_view.ex new file mode 100644 index 000000000..d354a584f --- /dev/null +++ b/apps/cf_http/lib/cf_http_web/views/rule_view.ex @@ -0,0 +1,3 @@ +defmodule CfHttpWeb.RuleView do + use CfHttpWeb, :view +end diff --git a/apps/cf_http/priv/repo/migrations/20200228154815_create_firewall_rules.exs b/apps/cf_http/priv/repo/migrations/20200228154815_create_rules.exs similarity index 54% rename from apps/cf_http/priv/repo/migrations/20200228154815_create_firewall_rules.exs rename to apps/cf_http/priv/repo/migrations/20200228154815_create_rules.exs index 336a27fdb..a39328eb2 100644 --- a/apps/cf_http/priv/repo/migrations/20200228154815_create_firewall_rules.exs +++ b/apps/cf_http/priv/repo/migrations/20200228154815_create_rules.exs @@ -1,14 +1,17 @@ -defmodule CfHttp.Repo.Migrations.CreateFirewallRules do +defmodule CfHttp.Repo.Migrations.CreateRules do use Ecto.Migration def change do - create table(:firewall_rules) do + create table(:rules) do add :destination, :inet add :port, :string add :protocol, :string add :enabled, :boolean, default: false, null: false + add :device_id, references(:devices, on_delete: :delete_all) timestamps() end + + create index(:rules, [:device_id]) end end diff --git a/apps/cf_http/priv/repo/migrations/20200510162435_create_sessions.exs b/apps/cf_http/priv/repo/migrations/20200510162435_create_sessions.exs new file mode 100644 index 000000000..60cca853b --- /dev/null +++ b/apps/cf_http/priv/repo/migrations/20200510162435_create_sessions.exs @@ -0,0 +1,13 @@ +defmodule CfHttp.Repo.Migrations.CreateSessions do + use Ecto.Migration + + def change do + create table(:sessions) do + add :user_id, references(:users, on_delete: :delete_all) + + timestamps() + end + + create index(:sessions, [:user_id]) + end +end diff --git a/apps/cf_http/test/cf_http/firewall_rules_test.exs b/apps/cf_http/test/cf_http/firewall_rules_test.exs deleted file mode 100644 index 0101d51c6..000000000 --- a/apps/cf_http/test/cf_http/firewall_rules_test.exs +++ /dev/null @@ -1,6 +0,0 @@ -defmodule CfHttp.FirewallRulesTest do - use CfHttp.DataCase - - describe "firewall_rules" do - end -end diff --git a/apps/cf_http/test/cf_http/rules_test.exs b/apps/cf_http/test/cf_http/rules_test.exs new file mode 100644 index 000000000..7222a43cc --- /dev/null +++ b/apps/cf_http/test/cf_http/rules_test.exs @@ -0,0 +1,6 @@ +defmodule CfHttp.RulesTest do + use CfHttp.DataCase + + describe "rules" do + end +end diff --git a/apps/cf_http/test/cf_http_web/controllers/firewall_rule_controller_test.exs b/apps/cf_http/test/cf_http_web/controllers/firewall_rule_controller_test.exs deleted file mode 100644 index fc836c691..000000000 --- a/apps/cf_http/test/cf_http_web/controllers/firewall_rule_controller_test.exs +++ /dev/null @@ -1,21 +0,0 @@ -defmodule CfHttpWeb.FirewallRuleControllerTest do - use CfHttpWeb.ConnCase - - describe "index" do - end - - describe "new firewall_rule" do - end - - describe "create firewall_rule" do - end - - describe "edit firewall_rule" do - end - - describe "update firewall_rule" do - end - - describe "delete firewall_rule" do - end -end diff --git a/apps/cf_http/test/cf_http_web/controllers/page_controller_test.exs b/apps/cf_http/test/cf_http_web/controllers/page_controller_test.exs deleted file mode 100644 index a42397504..000000000 --- a/apps/cf_http/test/cf_http_web/controllers/page_controller_test.exs +++ /dev/null @@ -1,8 +0,0 @@ -defmodule CfHttpWeb.PageControllerTest do - use CfHttpWeb.ConnCase - - test "GET /", %{conn: conn} do - conn = get(conn, "/") - assert html_response(conn, 200) =~ "Welcome!" - end -end diff --git a/apps/cf_http/test/cf_http_web/controllers/rule_controller_test.exs b/apps/cf_http/test/cf_http_web/controllers/rule_controller_test.exs new file mode 100644 index 000000000..5c36eb39a --- /dev/null +++ b/apps/cf_http/test/cf_http_web/controllers/rule_controller_test.exs @@ -0,0 +1,21 @@ +defmodule CfHttpWeb.RuleControllerTest do + use CfHttpWeb.ConnCase + + describe "index" do + end + + describe "new rule" do + end + + describe "create rule" do + end + + describe "edit rule" do + end + + describe "update rule" do + end + + describe "delete rule" do + end +end diff --git a/apps/cf_http/test/cf_http_web/views/page_view_test.exs b/apps/cf_http/test/cf_http_web/views/page_view_test.exs deleted file mode 100644 index d3f100c9a..000000000 --- a/apps/cf_http/test/cf_http_web/views/page_view_test.exs +++ /dev/null @@ -1,3 +0,0 @@ -defmodule CfHttpWeb.PageViewTest do - use CfHttpWeb.ConnCase, async: true -end diff --git a/config/config.exs b/config/config.exs index 4b6613136..54bf9f45b 100644 --- a/config/config.exs +++ b/config/config.exs @@ -27,7 +27,7 @@ config :cf_http, CfHttpWeb.Endpoint, url: [host: "localhost"], secret_key_base: "5OVYJ83AcoQcPmdKNksuBhJFBhjHD1uUa9mDOHV/6EIdBQ6pXksIhkVeWIzFk5SD", render_errors: [view: CfHttpWeb.ErrorView, accepts: ~w(html json)], - pubsub_server: [name: CfHttp.PubSub] + pubsub_server: CfHttp.PubSub # Configures Elixir's Logger config :logger, :console, diff --git a/config/dev.exs b/config/dev.exs index 5a9a44fff..ef9d2c1f0 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -26,7 +26,7 @@ config :cf_http, CfHttpWeb.Endpoint, "--mode", "development", "--watch-stdin", - cd: Path.expand("../assets", __DIR__) + cd: Path.expand("../apps/cf_http/assets", __DIR__) ] ] @@ -58,10 +58,10 @@ config :cf_http, CfHttpWeb.Endpoint, config :cf_http, CfHttpWeb.Endpoint, live_reload: [ patterns: [ - ~r"priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", - ~r"priv/gettext/.*(po)$", - ~r"lib/cf_http_web/(live|views)/.*(ex)$", - ~r"lib/cf_http_web/templates/.*(eex)$" + ~r"apps/cf_http/priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$", + ~r"apps/cf_http/priv/gettext/.*(po)$", + ~r"apps/cf_http/lib/cf_http_web/(live|views)/.*(ex)$", + ~r"apps/cf_http/lib/cf_http_web/templates/.*(eex)$" ] ] diff --git a/mix.exs b/mix.exs index 98ed83f66..93934f430 100644 --- a/mix.exs +++ b/mix.exs @@ -32,8 +32,6 @@ defmodule FireguardUmbrella.MixProject do # # Run "mix help deps" for examples and options. defp deps do - [ - {:credo, "~> 1.4", only: [:dev, :test], runtime: false} - ] + [] end end diff --git a/mix.lock b/mix.lock index 73733f638..78a04796e 100644 --- a/mix.lock +++ b/mix.lock @@ -4,18 +4,18 @@ "cowboy": {:hex, :cowboy, "2.7.0", "91ed100138a764355f43316b1d23d7ff6bdb0de4ea618cb5d8677c93a7a2f115", [:rebar3], [{:cowlib, "~> 2.8.0", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "04fd8c6a39edc6aaa9c26123009200fc61f92a3a94f3178c527b70b767c6e605"}, "cowlib": {:hex, :cowlib, "2.8.0", "fd0ff1787db84ac415b8211573e9a30a3ebe71b5cbff7f720089972b2319c8a4", [:rebar3], [], "hexpm", "79f954a7021b302186a950a32869dbc185523d99d3e44ce430cd1f3289f41ed4"}, "credo": {:hex, :credo, "1.4.0", "92339d4cbadd1e88b5ee43d427b639b68a11071b6f73854e33638e30a0ea11f5", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1fd3b70dce216574ce3c18bdf510b57e7c4c85c2ec9cad4bff854abaf7e58658"}, - "db_connection": {:hex, :db_connection, "2.2.1", "caee17725495f5129cb7faebde001dc4406796f12a62b8949f4ac69315080566", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "2b02ece62d9f983fcd40954e443b7d9e6589664380e5546b2b9b523cd0fb59e1"}, + "db_connection": {:hex, :db_connection, "2.2.2", "3bbca41b199e1598245b716248964926303b5d4609ff065125ce98bcd368939e", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "642af240d8a8affb93b4ba5a6fcd2bbcbdc327e1a524b825d383711536f8070c"}, "decimal": {:hex, :decimal, "1.8.1", "a4ef3f5f3428bdbc0d35374029ffcf4ede8533536fa79896dd450168d9acdf3c", [:mix], [], "hexpm", "3cb154b00225ac687f6cbd4acc4b7960027c757a5152b369923ead9ddbca7aec"}, - "ecto": {:hex, :ecto, "3.4.1", "ca5b5f6314eebd7fa2e52c6d78abb1ef955005dd60cc7a047b963ee23ee14a6c", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "748a317a2eacac0b7b6540cb7d2198b79457ede9cec2b4d1582117f90ac309d5"}, + "ecto": {:hex, :ecto, "3.4.3", "3a14c2500c3964165245a4f24a463e080762f7ccd0c632c763ea589f75ca205f", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b6f18dea95f2004d0369f6a8346513ca3f706614f4ede219a5f3fe5db5dd962"}, "ecto_network": {:hex, :ecto_network, "1.3.0", "1e77fa37c20e0f6a426d3862732f3317b0fa4c18f123d325f81752a491d7304e", [:mix], [{:ecto_sql, ">= 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:phoenix_html, ">= 0.0.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.14.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "053a5e46ef2837e8ea5ea97c82fa0f5494699209eddd764e663c85f11b2865bd"}, - "ecto_sql": {:hex, :ecto_sql, "3.4.2", "3d842665a81ba2137b62aa70151afe81dae44824cd09b2076a255937ab4e2dc9", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "f2b064102467e1525314a464b6fea0707ff28ee132a15006727ccf51b73492ff"}, + "ecto_sql": {:hex, :ecto_sql, "3.4.3", "c552aa8a7ccff2b64024f835503b3155d8e73452c180298527fbdbcd6e79710b", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.4.3", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.0", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ec9e59d6fa3f8cfda9963ada371e9e6659167c2338a997bd7ea23b10b245842b"}, "file_system": {:hex, :file_system, "0.2.8", "f632bd287927a1eed2b718f22af727c5aeaccc9a98d8c2bd7bff709e851dc986", [:mix], [], "hexpm", "97a3b6f8d63ef53bd0113070102db2ce05352ecf0d25390eb8d747c2bde98bca"}, "gettext": {:hex, :gettext, "0.17.4", "f13088e1ec10ce01665cf25f5ff779e7df3f2dc71b37084976cf89d1aa124d5c", [:mix], [], "hexpm", "3c75b5ea8288e2ee7ea503ff9e30dfe4d07ad3c054576a6e60040e79a801e14d"}, - "jason": {:hex, :jason, "1.2.0", "10043418c42d2493d0ee212d3fddd25d7ffe484380afad769a0a38795938e448", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "116747dbe057794c3a3e4e143b7c8390b29f634e16c78a7f59ba75bfa6852e7f"}, + "jason": {:hex, :jason, "1.2.1", "12b22825e22f468c02eb3e4b9985f3d0cb8dc40b9bd704730efa11abd2708c44", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "b659b8571deedf60f79c5a608e15414085fa141344e2716fbd6988a084b5f993"}, "mime": {:hex, :mime, "1.3.1", "30ce04ab3175b6ad0bdce0035cba77bba68b813d523d1aac73d9781b4d193cf8", [:mix], [], "hexpm", "6cbe761d6a0ca5a31a0931bf4c63204bceb64538e664a8ecf784a9a6f3b875f1"}, "phoenix": {:hex, :phoenix, "1.5.1", "95156589879dc69201d5fc0ebdbfdfc7901a09a3616ea611ec297f81340275a2", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "fc272b38e79d2881790fccae6f67a9fbe9b790103d6878175ea03d23003152eb"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.1.0", "a044d0756d0464c5a541b4a0bf4bcaf89bffcaf92468862408290682c73ae50d", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.9", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "c5e666a341ff104d0399d8f0e4ff094559b2fde13a5985d4cb5023b2c2ac558b"}, - "phoenix_html": {:hex, :phoenix_html, "2.14.1", "7dabafadedb552db142aacbd1f11de1c0bbaa247f90c449ca549d5e30bbc66b4", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "536d5200ad37fecfe55b3241d90b7a8c3a2ca60cd012fc065f776324fa9ab0a9"}, + "phoenix_html": {:hex, :phoenix_html, "2.14.2", "b8a3899a72050f3f48a36430da507dd99caf0ac2d06c77529b1646964f3d563e", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "58061c8dfd25da5df1ea0ca47c972f161beb6c875cd293917045b92ffe1bf617"}, "phoenix_live_reload": {:hex, :phoenix_live_reload, "1.2.1", "274a4b07c4adbdd7785d45a8b0bb57634d0b4f45b18d2c508b26c0344bd59b8f", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.4", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "41b4103a2fa282cfd747d377233baf213c648fdcc7928f432937676532490eee"}, "phoenix_pubsub": {:hex, :phoenix_pubsub, "2.0.0", "a1ae76717bb168cdeb10ec9d92d1480fec99e3080f011402c0a2d68d47395ffb", [:mix], [], "hexpm", "c52d948c4f261577b9c6fa804be91884b381a7f8f18450c5045975435350f771"}, "plug": {:hex, :plug, "1.10.0", "6508295cbeb4c654860845fb95260737e4a8838d34d115ad76cd487584e2fc4d", [:mix], [{:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:plug_crypto, "~> 1.1.1 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "422a9727e667be1bf5ab1de03be6fa0ad67b775b2d84ed908f3264415ef29d4a"},