Skip to content

Commit 3bc5deb

Browse files
Merge pull request #4 from benceszigeti/main
Add UDS support
2 parents 4f67b9d + 7737b64 commit 3bc5deb

File tree

3 files changed

+37
-17
lines changed

3 files changed

+37
-17
lines changed

opensips/mi/__main__.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@ def load_env_file(env_file_path):
6767
metavar='FIFO_DIR',
6868
type=str,
6969
help='OpenSIPS MI FIFO Reply Directory')
70+
communication.add_argument('-ds', '--datagram-socket',
71+
metavar='SOCK',
72+
type=str,
73+
help='OpenSIPS Datagram Socket')
7074

7175
group = parser.add_mutually_exclusive_group(required=True)
7276

@@ -128,10 +132,15 @@ def main():
128132
elif args.type == 'http':
129133
mi = OpenSIPSMI('http', url=f'http://{args.ip}:{args.port}/mi')
130134
elif args.type == 'datagram':
131-
mi = OpenSIPSMI('datagram',
132-
datagram_ip=args.ip,
133-
datagram_port=args.port,
134-
timeout=0.1)
135+
if args.datagram_socket:
136+
mi = OpenSIPSMI('datagram',
137+
datagram_unix_socket=args.datagram_socket,
138+
timeout=0.1)
139+
else:
140+
mi = OpenSIPSMI('datagram',
141+
datagram_ip=args.ip,
142+
datagram_port=args.port,
143+
timeout=0.1)
135144
else:
136145
if not args.bash_complete:
137146
print(f'Unknown type: {args.type}')

opensips/mi/datagram.py

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,37 +20,48 @@
2020
""" MI Datagram implementation """
2121

2222
import socket
23+
import os
24+
from tempfile import NamedTemporaryFile
2325
from .connection import Connection
2426
from . import jsonrpc_helper
2527

26-
2728
class Datagram(Connection):
28-
2929
""" MI Datagram connection """
3030

3131
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")
3445

35-
if "datagram_port" not in kwargs:
36-
raise ValueError("datagram_port is required for Datagram")
37-
3846
self.timeout = kwargs.get("timeout", 1)
39-
self.ip = kwargs["datagram_ip"]
40-
self.port = int(kwargs["datagram_port"])
4147

4248
def execute(self, method: str, params: dict):
4349
jsoncmd = jsonrpc_helper.get_command(method, params)
4450

45-
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
51+
udp_socket = socket.socket(self.family, socket.SOCK_DGRAM)
4652
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)
4856
udp_socket.settimeout(self.timeout)
49-
reply = udp_socket.recv(32768)
57+
reply = udp_socket.recv(self.recv_size)
5058
except Exception as e:
5159
raise jsonrpc_helper.JSONRPCException(e)
5260
finally:
61+
if self.recv_sock:
62+
os.unlink(self.recv_sock)
5363
udp_socket.close()
64+
5465
return jsonrpc_helper.get_reply(reply)
5566

5667
def valid(self):

opensips/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,4 @@
1919

2020
""" OpenSIPS Package version """
2121

22-
__version__ = '0.1.5'
22+
__version__ = '0.1.6'

0 commit comments

Comments
 (0)