Powered by AppSignal & Oban Pro

DNS and User Management

livebook/06_dns_and_users.livemd

DNS and User Management

This notebook demonstrates DNS static records, DNS cache operations, user management, and system identity.

Install

Mix.install([
  {:mikrotik_api, path: ".."}
])

Setup

alias MikrotikApi.Auth
require Logger

auth = Auth.new(
  username: System.get_env("MT_USER"),
  password: System.get_env("MT_PASS"),
  verify: :verify_none
)

ip = System.get_env("MT_IP") || "192.0.2.1"

System Identity

# Get current router identity
case MikrotikApi.system_identity(auth, ip, scheme: :http) do
  {:ok, %{"name" => name}} -> Logger.info("Router identity: #{name}")
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end
# Set router identity (uncomment to run)
# MikrotikApi.system_identity_set(auth, ip, "MyRouter", scheme: :http)

DNS Settings

# Get DNS server configuration
case MikrotikApi.dns_settings_get(auth, ip, scheme: :http) do
  {:ok, config} -> Logger.info("DNS config: #{inspect(config)}")
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end
# Update DNS settings (uncomment to run)
# MikrotikApi.dns_settings_set(auth, ip, %{"servers" => "8.8.8.8,8.8.4.4"}, scheme: :http)

DNS Cache

# List DNS cache entries
case MikrotikApi.dns_cache_list(auth, ip, scheme: :http) do
  {:ok, cache} -> Logger.info("DNS cache has #{length(cache)} entries")
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end
# Flush DNS cache
case MikrotikApi.dns_cache_flush(auth, ip, scheme: :http) do
  {:ok, _} -> Logger.info("DNS cache flushed")
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end

DNS Static Records

# List static DNS entries
case MikrotikApi.dns_static_list(auth, ip, scheme: :http) do
  {:ok, records} ->
    Logger.info("DNS static records: #{length(records)}")
    Enum.each(records, fn r -> Logger.info("  #{r["name"]} -> #{r["address"]}") end)
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end
# Ensure a static DNS record exists (idempotent)
case MikrotikApi.dns_static_ensure(auth, ip, "test.local", %{"address" => "10.0.0.100"}, scheme: :http) do
  {:ok, %{name: name, changed: []}} ->
    Logger.info("Record #{name} already exists with correct values")
  {:ok, %{name: name, changed: keys}} ->
    Logger.info("Record #{name} created/updated: #{inspect(keys)}")
  {:error, err} ->
    Logger.error("Failed: #{inspect(err)}")
end
# Manual CRUD: create, update, delete
# Create
{:ok, _} = MikrotikApi.dns_static_add(auth, ip, %{"name" => "example.local", "address" => "10.0.0.1"}, scheme: :http)

# Find and update
{:ok, records} = MikrotikApi.dns_static_list(auth, ip, scheme: :http)
case Enum.find(records, fn r -> r["name"] == "example.local" end) do
  %{".id" => id} ->
    {:ok, _} = MikrotikApi.dns_static_update(auth, ip, id, %{"address" => "10.0.0.2"}, scheme: :http)
    {:ok, _} = MikrotikApi.dns_static_delete(auth, ip, id, scheme: :http)
    Logger.info("Created, updated, and deleted example.local")
  nil ->
    Logger.info("Record not found")
end

User Management

# List users
case MikrotikApi.user_list(auth, ip, scheme: :http) do
  {:ok, users} ->
    Logger.info("Users: #{length(users)}")
    Enum.each(users, fn u -> Logger.info("  #{u["name"]} (group: #{u["group"]})") end)
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end
# List user groups
case MikrotikApi.user_group_list(auth, ip, scheme: :http) do
  {:ok, groups} ->
    Logger.info("User groups: #{length(groups)}")
    Enum.each(groups, fn g -> Logger.info("  #{g["name"]}") end)
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end
# List active user sessions
case MikrotikApi.user_active_list(auth, ip, scheme: :http) do
  {:ok, sessions} ->
    Logger.info("Active sessions: #{length(sessions)}")
    Enum.each(sessions, fn s -> Logger.info("  #{s["name"]} via #{s["via"]}") end)
  {:error, err} -> Logger.error("Failed: #{inspect(err)}")
end
# Ensure a user exists (idempotent) - BE CAREFUL with this!
# Uncomment to run:
# case MikrotikApi.user_ensure(auth, ip, "testuser", %{"group" => "read", "password" => "testpass123"}, scheme: :http) do
#   {:ok, %{name: name, changed: []}} ->
#     Logger.info("User #{name} already exists")
#   {:ok, %{name: name, changed: keys}} ->
#     Logger.info("User #{name} created/updated: #{inspect(keys)}")
#   {:error, err} ->
#     Logger.error("Failed: #{inspect(err)}")
# end