From 7115a93a0bcf90b174a4d38fcde50c7430cd5a17 Mon Sep 17 00:00:00 2001 From: kurogeek Date: Wed, 22 Oct 2025 16:40:59 +0700 Subject: [PATCH] clanService asterisk --- inventories/default.nix | 7 +++ modules/clan/asterisk/default.nix | 69 ++++++++++++++++++++++ modules/clan/asterisk/flake-module.nix | 18 ++++++ modules/clan/asterisk/tests/vm/default.nix | 39 ++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 modules/clan/asterisk/default.nix create mode 100644 modules/clan/asterisk/flake-module.nix create mode 100644 modules/clan/asterisk/tests/vm/default.nix diff --git a/inventories/default.nix b/inventories/default.nix index 520f8d8..b8783ca 100644 --- a/inventories/default.nix +++ b/inventories/default.nix @@ -57,6 +57,13 @@ roles.default.tags."fax-bridge" = { }; }; + asterisk = { + module = { + name = "asterisk"; + input = "self"; + }; + }; + pocket-id = { module = { name = "pocket-id"; diff --git a/modules/clan/asterisk/default.nix b/modules/clan/asterisk/default.nix new file mode 100644 index 0000000..1c71aac --- /dev/null +++ b/modules/clan/asterisk/default.nix @@ -0,0 +1,69 @@ +{ ... }: +{ + _class = "clan.service"; + manifest.name = "asterisk"; + manifest.description = "Asterisk PBX server"; + manifest.categories = [ "System" ]; + + roles.default = { + perInstance.nixosModule = + { + lib, + ... + }: + { + services.asterisk = { + enable = lib.mkDefault true; + confFiles = { + # Dial plan config + "extensions.conf" = '' + exten => 1001,1,Dial(PJSIP/user1,20) + exten => 1002,1,Dial(PJSIP/user2,20) + + exten => 100,1,Answer() + same => n,Wait(1) + same => n,Playback(hello-world) + same => n,Hangup() + ''; + + "pjsip.conf" = '' + [transport-udp] + type=transport + protocol=udp + bind=0.0.0.0,[::] + + [endpoint_internal](!) + type=endpoint + context=from-internal + disallow=all + allow=ulaw + + [auth_userpass](!) + type=auth + auth_type=userpass + + [aor_dynamic](!) + type=aor + max_contacts=1 + + [user1](endpoint_internal) + auth=user1 + aors=user1 + [user1](auth_userpass) + password=user1 + username=user1 + [user1](aor_dynamic) + + [user2](endpoint_internal) + auth=user2 + aors=user2 + [user2](auth_userpass) + password=user2 + username=user2 + [user2](aor_dynamic) + ''; + }; + }; + }; + }; +} diff --git a/modules/clan/asterisk/flake-module.nix b/modules/clan/asterisk/flake-module.nix new file mode 100644 index 0000000..d06c1d0 --- /dev/null +++ b/modules/clan/asterisk/flake-module.nix @@ -0,0 +1,18 @@ +{ lib, ... }: +let + module = lib.modules.importApply ./default.nix { }; +in +{ + clan.modules = { + asterisk = module; + }; + perSystem = + { ... }: + { + clan.nixosTests.asterisk = { + imports = [ ./tests/vm/default.nix ]; + + clan.modules."@clan/asterisk" = module; + }; + }; +} diff --git a/modules/clan/asterisk/tests/vm/default.nix b/modules/clan/asterisk/tests/vm/default.nix new file mode 100644 index 0000000..0a1f438 --- /dev/null +++ b/modules/clan/asterisk/tests/vm/default.nix @@ -0,0 +1,39 @@ +{ + pkgs, + ... +}: +{ + name = "service-asterisk"; + + clan = { + directory = ./.; + inventory = { + machines.server = { }; + + instances = { + asterisk-test = { + module.name = "@clan/asterisk"; + module.input = "self"; + roles.default.machines."server".settings = { }; + }; + }; + }; + }; + + nodes = { + server = { + services.asterisk = { + }; + }; + }; + + testScript = '' + start_all() + + server.wait_for_unit("asterisk") + + # Check that garage is running + server.succeed("systemctl status asterisk") + + ''; +}