From 03957afd7e4d74ada8d4b5a98da98facd054bd25 Mon Sep 17 00:00:00 2001 From: Ember 'n0emis' Keske Date: Thu, 21 Jul 2022 00:55:10 +0200 Subject: [PATCH] add fieldpoc dect claim script --- .sops.yaml | 2 +- hosts/yate/dect_claim.py | 30 +++++++++++++++++++++++++++ hosts/yate/voip.nix | 8 +++++++ hosts/yate/yintro.slin | Bin 0 -> 14402 bytes modules/fieldpoc/default.nix | 10 ++++++--- packages/default.nix | 2 ++ packages/python/fieldpoc/default.nix | 2 +- 7 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 hosts/yate/dect_claim.py create mode 100644 hosts/yate/yintro.slin diff --git a/.sops.yaml b/.sops.yaml index a72eeaf..cc4efac 100644 --- a/.sops.yaml +++ b/.sops.yaml @@ -2,7 +2,7 @@ keys: - &admin_clerie DD2D88B9FCB74C81E6F63AAD5B5D448C88684BC3 - &admin_n0emis 6E10217E3187069E057DF5ABE0262A773B824745 - &host_nerd age1x69924s94z4k7s50utyuqrwshpt8p8yzwaxny2gle7yeyg4w3spqml95mu - - &host_yate age10pxa70g3ekxdrk788l52s93a6ftavdw3r8x6d23gmsluudmwq3asmu6ah9\ + - &host_yate age10pxa70g3ekxdrk788l52s93a6ftavdw3r8x6d23gmsluudmwq3asmu6ah9 - &host_yate_dialup age14zsha5c5238v6hzchdfkjgjjwzc2qc79tl0ngmqrdquck5f945zs35vps4 - &host_pre_yate_n0emis age1lrujyz4d48yjelmh6eufxjffuvfm9pusen3uxskyhnyf27xyucdqq3jza5 creation_rules: diff --git a/hosts/yate/dect_claim.py b/hosts/yate/dect_claim.py new file mode 100644 index 0000000..024c433 --- /dev/null +++ b/hosts/yate/dect_claim.py @@ -0,0 +1,30 @@ +import asyncio +import os +import re +import socket + +from yate.ivr import YateIVR + +SOUNDS_PATH = "/run/current-system/sw/share/sounds/yate" + + +async def main(ivr: YateIVR): + caller_id = ivr.call_params.get("caller", "") + caller_id = re.sub("[^\\d]", "", caller_id) + called_id = ivr.call_params.get("called", "") + called_id = re.sub("[^\\d]", "", called_id) + + await ivr.play_soundfile( + os.path.join(SOUNDS_PATH, "yintro.slin"), + complete=True) + await asyncio.sleep(0.5) + + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.connect(("localhost", 9437)) + s.recv(1024) + s.sendall(f"claim {caller_id} {called_id}".encode('utf-8')) + s.recv(1024) + + +app = YateIVR() +app.run(main) diff --git a/hosts/yate/voip.nix b/hosts/yate/voip.nix index 08e594d..1bebb56 100644 --- a/hosts/yate/voip.nix +++ b/hosts/yate/voip.nix @@ -42,4 +42,12 @@ [dialin] \${sip_x-called}^.*$=lateroute/\\1"; }; + + environment.systemPackages = with pkgs; [ + (writers.makePythonWriter python39 python39.pkgs "/bin/dect_claim" { libraries = [ python39.pkgs.python-yate ]; } (builtins.readFile ./dect_claim.py)) + (runCommand "yintro.slin" {} '' + mkdir -p $out/share/sounds/yate + ln -s ${./yintro.slin} $out/share/sounds/yate/yintro.slin + '') + ]; } diff --git a/hosts/yate/yintro.slin b/hosts/yate/yintro.slin new file mode 100644 index 0000000000000000000000000000000000000000..38af3048ed5bfe1a67a1343085e537b141be8bb8 GIT binary patch literal 14402 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 i0D4Cu6@*jaQ*{^ajJ<%HWiR0-Trzy-z