10 Commits

Author SHA1 Message Date
acdf5515c0 mob next [ci-skip] [ci skip] [skip ci]
lastFile:modules/clan/phonebox/default.nix
2025-12-25 14:45:28 +07:00
2bae7f59a3 Update var phonebox/owner-name for machine adhil 2025-12-25 14:27:36 +07:00
8a24bf97f8 mob next [ci-skip] [ci skip] [skip ci]
lastFile:modules/clan/phonebox/default.nix
2025-12-25 14:22:04 +07:00
47ea505962 mob next [ci-skip] [ci skip] [skip ci]
lastFile:modules/clan/phonebox/default.nix
2025-12-25 14:03:09 +07:00
8853fcda9b mob next [ci-skip] [ci skip] [skip ci]
lastFile:modules/clan/phonebox/default.nix
2025-12-25 14:00:25 +07:00
bfaab9b1e7 mob next [ci-skip] [ci skip] [skip ci]
lastFile:modules/clan/phonebox/default.nix
2025-12-24 17:02:01 +07:00
92fa3bcb88 mob next [ci-skip] [ci skip] [skip ci]
lastFile:modules/clan/phonebox/default.nix
2025-12-23 20:11:10 +07:00
bf64ee1202 mob next [ci-skip] [ci skip] [skip ci]
lastFile:modules/clan/phonebox/default.nix
2025-12-22 17:24:10 +07:00
ec4c3897e2 clanService:phonebox: fax echo feature 2025-12-16 10:28:16 +07:00
39bfcd0080 nix fmt 2025-12-12 18:27:30 +07:00
3 changed files with 206 additions and 417 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -1,4 +1,7 @@
{ clanLib, ... }: {
clanLib,
...
}:
{ {
_class = "clan.service"; _class = "clan.service";
manifest.name = "phonebox"; manifest.name = "phonebox";
@@ -14,6 +17,11 @@
description = "An Ethernet interface that connect to ATA box."; description = "An Ethernet interface that connect to ATA box.";
default = "enp2s0"; default = "enp2s0";
}; };
options.ownerName = lib.mkOption {
type = lib.types.str;
description = "";
default = "";
};
}; };
perInstance = perInstance =
{ {
@@ -22,6 +30,7 @@
... ...
}: }:
{ {
nixosModule = nixosModule =
{ {
lib, lib,
@@ -30,11 +39,45 @@
... ...
}: }:
let let
asterisk = pkgs.asterisk.overrideAttrs (old: {
propagatedNativeBuildInputs = [ pkgs.spandsp3 ];
});
machines = lib.attrNames roles.default.machines;
user = "asterisk"; user = "asterisk";
faxDir = "/run/asterisk/fax";
rtpPortFrom = 10000; rtpPortFrom = 10000;
rtpPortTo = 20000; rtpPortTo = 20000;
ata-interface = settings.ata-ethernet-iface; ata-interface = settings.ata-ethernet-iface;
contactList = builtins.map (machineName: {
name = "${clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = machineName;
generator = "phonebox";
file = "owner-name";
default = null;
}}";
number = "${
clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = machineName;
generator = "phonebox";
file = "server-prefix-number";
default = null;
}
}${
clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = machineName;
generator = "phonebox";
file = "ata-local-number";
default = null;
}
}";
}) machines;
genServerSIPEndpoint = genServerSIPEndpoint =
{ hostname, address }: { hostname, address }:
'' ''
@@ -97,10 +140,11 @@
throw "clanService/yggdrasil is required"; throw "clanService/yggdrasil is required";
in in
{ {
clan.core.vars.generators.phonebox = { clan.core.vars.generators.phonebox = builtins.break {
files = { files = {
server-prefix-number.secret = false; server-prefix-number.secret = false;
ata-local-number.secret = false; ata-local-number.secret = false;
owner-name.secret = false;
}; };
prompts = { prompts = {
@@ -112,11 +156,27 @@
type = "line"; type = "line";
description = "Local suffix number: indicate local number on the server [XX00]"; description = "Local suffix number: indicate local number on the server [XX00]";
}; };
owner-name = {
type = "line";
description = "The owner's name for this unit";
};
}; };
script = '' script = ''
cat $prompts/server-prefix-number > $out/server-prefix-number prompt_server_prefix=$(cat "$prompts"/server-prefix-number)
cat $prompts/ata-local-number > $out/ata-local-number if [[ -n "''${prompt_server_prefix-}" ]]; then
echo $prompt_server_prefix | tr -d "\n" > "$out"/server-prefix-number
fi
prompt_ata_local=$(cat "$prompts"/ata-local-number)
if [[ -n "''${prompt_ata_local-}" ]]; then
echo $prompt_ata_local | tr -d "\n" > "$out"/ata-local-number
fi
prompt_owner_name=$(cat "$prompts"/owner-name)
if [[ -n "''${prompt_owner_name-}" ]]; then
echo $prompt_owner_name | tr -d "\n" > "$out"/owner-name
fi
''; '';
}; };
@@ -191,9 +251,9 @@
services.asterisk = { services.asterisk = {
enable = lib.mkDefault true; enable = lib.mkDefault true;
package = lib.mkDefault asterisk;
confFiles = confFiles =
let let
machines = lib.attrNames roles.default.machines;
nodes = builtins.foldl' ( nodes = builtins.foldl' (
nodes: name: nodes: name:
nodes nodes
@@ -240,6 +300,13 @@
syslog.local0 => notice,warning,error syslog.local0 => notice,warning,error
''; '';
"modules.conf" = ''
[modules]
autoload=yes
load => res_fax_spandsp.so
'';
# Dial plan config # Dial plan config
"extensions.conf" = "extensions.conf" =
let let
@@ -257,6 +324,16 @@
same => n,Playback(hello-world) same => n,Playback(hello-world)
same => n,Hangup() same => n,Hangup()
exten => 000,1,Answer()
same => n,ReceiveFAX(${faxDir}/echo-''${UNIQUEID}.tiff)
same => n,Set(FAXFILE=${faxDir}/echo-''${UNIQUEID}.tiff)
same => n,Set(FAXECHO=true)
exten => h,1,GotoIf($[''${FAXECHO}]?sendfax)
same => n,Hangup()
same => n(sendfax),Originate(PJSIP/00,app,SendFAX,${faxDir}/echo-''${UNIQUEID}.tiff)
same => n,Set(FAXECHO=false)
'' ''
+ (genLocalExtenConf { + (genLocalExtenConf {
localNumber = config.clan.core.vars.generators.phonebox.files.ata-local-number.value; localNumber = config.clan.core.vars.generators.phonebox.files.ata-local-number.value;
@@ -318,6 +395,10 @@
}; };
}; };
systemd.tmpfiles.rules = [
"d ${faxDir} 0755 ${user} ${user} - -"
];
systemd.services.asterisk-watcher = { systemd.services.asterisk-watcher = {
enable = true; enable = true;
description = "Asterisk Configuration files watcher"; description = "Asterisk Configuration files watcher";

View File

@@ -0,0 +1 @@
w-office