|
20 | 20 | """ MI Datagram implementation """ |
21 | 21 |
|
22 | 22 | import socket |
| 23 | +import os |
| 24 | +from tempfile import NamedTemporaryFile |
23 | 25 | from .connection import Connection |
24 | 26 | from . import jsonrpc_helper |
25 | 27 |
|
26 | | - |
27 | 28 | class Datagram(Connection): |
28 | | - |
29 | 29 | """ MI Datagram connection """ |
30 | 30 |
|
31 | 31 | def __init__(self, **kwargs): |
32 | | - if "datagram_ip" not in kwargs: |
33 | | - raise ValueError("datagram_ip is required for Datagram") |
| 32 | + if "datagram_unix_socket" in kwargs: |
| 33 | + self.address = kwargs["datagram_unix_socket"] |
| 34 | + self.family = socket.AF_UNIX |
| 35 | + self.recv_size = 65535 * 32 |
| 36 | + with NamedTemporaryFile(prefix="opensips_mi_reply_", dir="/tmp") as nt: |
| 37 | + self.recv_sock = nt.name |
| 38 | + elif "datagram_ip" in kwargs and "datagram_port" in kwargs: |
| 39 | + self.address = (kwargs["datagram_ip"], int(kwargs["datagram_port"])) |
| 40 | + self.family = socket.AF_INET |
| 41 | + self.recv_size = 32768 |
| 42 | + self.recv_sock = None |
| 43 | + else: |
| 44 | + raise ValueError("Either datagram_unix_socket or both datagram_ip and datagram_port are required for Datagram") |
34 | 45 |
|
35 | | - if "datagram_port" not in kwargs: |
36 | | - raise ValueError("datagram_port is required for Datagram") |
37 | | - |
38 | 46 | self.timeout = kwargs.get("timeout", 1) |
39 | | - self.ip = kwargs["datagram_ip"] |
40 | | - self.port = int(kwargs["datagram_port"]) |
41 | 47 |
|
42 | 48 | def execute(self, method: str, params: dict): |
43 | 49 | jsoncmd = jsonrpc_helper.get_command(method, params) |
44 | 50 |
|
45 | | - udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) |
| 51 | + udp_socket = socket.socket(self.family, socket.SOCK_DGRAM) |
46 | 52 | try: |
47 | | - udp_socket.sendto(jsoncmd.encode(), (self.ip, self.port)) |
| 53 | + if self.recv_sock: |
| 54 | + udp_socket.bind(self.recv_sock) |
| 55 | + udp_socket.sendto(jsoncmd.encode(), self.address) |
48 | 56 | udp_socket.settimeout(self.timeout) |
49 | | - reply = udp_socket.recv(32768) |
| 57 | + reply = udp_socket.recv(self.recv_size) |
50 | 58 | except Exception as e: |
51 | 59 | raise jsonrpc_helper.JSONRPCException(e) |
52 | 60 | finally: |
| 61 | + if self.recv_sock: |
| 62 | + os.unlink(self.recv_sock) |
53 | 63 | udp_socket.close() |
| 64 | + |
54 | 65 | return jsonrpc_helper.get_reply(reply) |
55 | 66 |
|
56 | 67 | def valid(self): |
|
0 commit comments