|
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