Run Jasmin in both directions: message_payload, data_sm and a multipart deadlock confirmed against a production gateway
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Boot-time jcli bootstrap for one Jasmin instance: group, users, an smppc connector pointing at
|
||||
our own server(), and the MT/MO routes that wire it up. jcli (port 8990) is a Twisted telnet
|
||||
console: no negotiation reply is needed, the server proceeds regardless (confirmed empirically)."""
|
||||
import os
|
||||
import socket
|
||||
import sys
|
||||
import time
|
||||
|
||||
JCLI_HOST = os.environ.get('JCLI_HOST', 'jasmin')
|
||||
JCLI_PORT = int(os.environ.get('JCLI_PORT', '8990'))
|
||||
JCLI_USER = os.environ.get('JCLI_USER', 'jcliadmin')
|
||||
JCLI_PASS = os.environ.get('JCLI_PASS', 'jclipwd')
|
||||
|
||||
GROUP = os.environ.get('GROUP', 'clients')
|
||||
ESME_UID = os.environ.get('ESME_UID', 'esme1')
|
||||
ESME_PASSWORD = os.environ.get('ESME_PASSWORD', 'esme1pw')
|
||||
ESME2_UID = os.environ.get('ESME2_UID', 'esme2')
|
||||
ESME2_PASSWORD = os.environ.get('ESME2_PASSWORD', 'esme2pw')
|
||||
ESME2_THROUGHPUT = os.environ.get('ESME2_THROUGHPUT', '0.1')
|
||||
|
||||
CONNECTOR_CID = os.environ.get('CONNECTOR_CID', 'upstream')
|
||||
CONNECTOR_HOST = os.environ.get('CONNECTOR_HOST', 'node')
|
||||
CONNECTOR_PORT = os.environ.get('CONNECTOR_PORT', '2777')
|
||||
CONNECTOR_USERNAME = os.environ.get('CONNECTOR_USERNAME', 'upstreamesme')
|
||||
# <=8 chars: SMPP's password is a C-octet-string with an 8-char + NUL wire maximum, which Jasmin's
|
||||
# own smpp.pdu encoder enforces strictly when it builds the connector's own bind PDU (unlike our
|
||||
# library's encoder, which is permissive) - a longer one throws mid-bind on every single attempt.
|
||||
CONNECTOR_PASSWORD = os.environ.get('CONNECTOR_PASSWORD', 'upstrmpw')
|
||||
|
||||
|
||||
class Jcli:
|
||||
def __init__(self, host, port):
|
||||
last_err = None
|
||||
for _ in range(60):
|
||||
try:
|
||||
self.sock = socket.create_connection((host, port), timeout=5)
|
||||
self.sock.settimeout(5)
|
||||
self._drain()
|
||||
return
|
||||
except OSError as err:
|
||||
last_err = err
|
||||
time.sleep(1)
|
||||
raise RuntimeError(f'could not reach jcli at {host}:{port}: {last_err}')
|
||||
|
||||
def _drain(self, wait=0.4):
|
||||
time.sleep(wait)
|
||||
buf = b''
|
||||
try:
|
||||
while True:
|
||||
chunk = self.sock.recv(65536)
|
||||
if not chunk:
|
||||
break
|
||||
buf += chunk
|
||||
except socket.timeout:
|
||||
pass
|
||||
return buf
|
||||
|
||||
def send(self, line, wait=0.4):
|
||||
self.sock.sendall(line.encode() + b'\r\n')
|
||||
return self._drain(wait).decode(errors='replace')
|
||||
|
||||
def login(self, user, password):
|
||||
self._drain()
|
||||
self.send(user)
|
||||
reply = self.send(password)
|
||||
if 'Welcome to Jasmin' not in reply:
|
||||
raise RuntimeError(f'jcli login failed: {reply!r}')
|
||||
|
||||
def run(self, *lines, label=''):
|
||||
"""Sends a sequence ending in 'ok' and fails loudly if Jasmin refused it. Checking only for
|
||||
keywords missed 'Failed adding connector, check log for details' once, which left the
|
||||
session stuck at the '>' sub-prompt and every later command misread as a key inside it - so
|
||||
this also insists the last reply lands back on the top-level 'jcli :' prompt."""
|
||||
out = []
|
||||
for line in lines:
|
||||
out.append(self.send(line))
|
||||
joined = '\n'.join(out)
|
||||
last = out[-1] if out else ''
|
||||
back_at_top = last.rstrip().endswith('jcli :')
|
||||
keyword_hit = any(word in joined.lower() for word in ('error', 'must set', 'unknown', 'invalid', 'failed'))
|
||||
if keyword_hit or not back_at_top:
|
||||
raise RuntimeError(f'{label} failed (last reply {last!r}):\n{joined}')
|
||||
return joined
|
||||
|
||||
|
||||
def main() -> int:
|
||||
jcli = Jcli(JCLI_HOST, JCLI_PORT)
|
||||
jcli.login(JCLI_USER, JCLI_PASS)
|
||||
|
||||
print(jcli.run('group -a', f'gid {GROUP}', 'ok', label='group'))
|
||||
|
||||
print(jcli.run(
|
||||
'user -a', f'uid {ESME_UID}', f'gid {GROUP}', f'username {ESME_UID}', f'password {ESME_PASSWORD}', 'ok',
|
||||
label='user esme1',
|
||||
))
|
||||
|
||||
print(jcli.run(
|
||||
'user -a', f'uid {ESME2_UID}', f'gid {GROUP}', f'username {ESME2_UID}', f'password {ESME2_PASSWORD}', 'ok',
|
||||
label='user esme2',
|
||||
))
|
||||
print(jcli.run(
|
||||
f'user -u {ESME2_UID}', f'mt_messaging_cred quota smpps_throughput {ESME2_THROUGHPUT}', 'ok',
|
||||
label='user esme2 throughput quota',
|
||||
))
|
||||
|
||||
print(jcli.run(
|
||||
'smppccm -a',
|
||||
f'cid {CONNECTOR_CID}',
|
||||
f'host {CONNECTOR_HOST}',
|
||||
f'port {CONNECTOR_PORT}',
|
||||
f'username {CONNECTOR_USERNAME}',
|
||||
f'password {CONNECTOR_PASSWORD}',
|
||||
'bind transceiver',
|
||||
'con_fail_delay 2',
|
||||
'con_loss_delay 2',
|
||||
# The connector's own default (1) is 1 msg/s - a second submit while the first is still
|
||||
# in flight (a message's 2nd segment, or a 2nd message sent right after) then never reaches
|
||||
# the connector's peer at all inside any sane test budget; see findings/03-jasmin.md.
|
||||
'submit_throughput 0',
|
||||
'ok',
|
||||
label='smppccm',
|
||||
))
|
||||
started = jcli.send(f'smppccm -1 {CONNECTOR_CID}')
|
||||
print(started)
|
||||
if 'Successfully started' not in started:
|
||||
raise RuntimeError(f'smppccm -1 {CONNECTOR_CID} failed: {started!r}')
|
||||
|
||||
print(jcli.run(
|
||||
'mtrouter -a', 'type DefaultRoute', 'order 0', f'connector smppc({CONNECTOR_CID})', 'rate 0.0', 'ok',
|
||||
label='mtrouter',
|
||||
))
|
||||
print(jcli.run(
|
||||
'morouter -a', 'type DefaultRoute', 'order 0', f'connector smpps({ESME_UID})', 'ok',
|
||||
label='morouter',
|
||||
))
|
||||
|
||||
jcli.send('persist')
|
||||
jcli.send('quit', wait=0.2)
|
||||
print('jasmin bootstrap complete')
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
@@ -0,0 +1,654 @@
|
||||
#
|
||||
# This is the main Jasmin SMS gateway configuration file.
|
||||
# For any modifications to this file, refer to Jasmin Documentation.
|
||||
# If that does not help, post your question on Jasmin's web forum
|
||||
# hosted at Google Groups: https://groups.google.com/group/jasmin-sms-gateway
|
||||
#
|
||||
# Do NOT simply read the instructions in here without understanding
|
||||
# what they do. They're here only as hints or reminders. If you are unsure
|
||||
# consult the online docs.
|
||||
|
||||
[smpp-server]
|
||||
|
||||
# SMPP Server identifier
|
||||
#id = "smpps_01"
|
||||
|
||||
# If you want you can bind a single interface, you can specify its IP here
|
||||
#bind = 0.0.0.0
|
||||
|
||||
# Accept connections on the specified port, default is 2775
|
||||
#port = 2775
|
||||
|
||||
# Activate billing feature
|
||||
# May be disabled if not needed/used
|
||||
#billing_feature = True
|
||||
|
||||
# Timeout for response to bind request
|
||||
#sessionInitTimerSecs = 30
|
||||
|
||||
# Enquire link interval
|
||||
#enquireLinkTimerSecs = 30
|
||||
|
||||
# Maximum time lapse allowed between transactions, after which,
|
||||
# the connection is considered as inactive
|
||||
#inactivityTimerSecs = 300
|
||||
|
||||
# Timeout for responses to any request PDU
|
||||
#responseTimerSecs = 60
|
||||
|
||||
# Timeout for reading a single PDU, this is the maximum lapse of time between
|
||||
# receiving PDU's header and its complete read, if the PDU reading timed out,
|
||||
# the connection is considered as 'corrupt' and will reconnect
|
||||
#pduReadTimerSecs = 10
|
||||
|
||||
# When message is routed to a SMPP Client connecter: How much time it is kept in
|
||||
# redis waiting for receipt
|
||||
#dlr_expiry = 86400
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/default-smpps_01.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = midnight
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
#log_privacy = False
|
||||
|
||||
[smpp-server-pb]
|
||||
# If you want you can bind a single interface, you can specify its IP here
|
||||
#bind = 0.0.0.0
|
||||
|
||||
# Accept connections on the specified port, default is 14000
|
||||
#port = 14000
|
||||
|
||||
# If authentication is True, access will require entering a username and password
|
||||
# as defined in admin_username and admin_password, you can disable this security
|
||||
# layer by setting authentication to False, in this case admin_* values are ignored.
|
||||
#authentication = True
|
||||
#admin_username = smppsadmin
|
||||
# This is a MD5 password digest hex encoded
|
||||
#admin_password = e97ab122faa16beea8682d84f3d2eea4
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/smpp-server-pb.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
[client-management]
|
||||
# Jasmin persists its configuration profiles in /etc/jasmin/store by
|
||||
# default. You can specify a custom location here
|
||||
#store_path = /etc/jasmin/store
|
||||
|
||||
# If you want you can bind a single interface, you can specify its IP here
|
||||
#bind = 0.0.0.0
|
||||
|
||||
# Accept connections on the specified port, default is 8989
|
||||
#port = 8989
|
||||
|
||||
# If authentication is True, access will require entering a username and password
|
||||
# as defined in admin_username and admin_password, you can disable this security
|
||||
# layer by setting authentication to False, in this case admin_* values are ignored.
|
||||
#authentication = True
|
||||
#admin_username = cmadmin
|
||||
# This is a MD5 password digest hex encoded
|
||||
#admin_password = e1c5136acafb7016bc965597c992eb82
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/smppclient-manager.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
# The protocol version used to pickle objects before transfering
|
||||
# them to client side, this is used in the client manager only,
|
||||
# the pickle protocol defined in SMPPClientManagerPBProxy is set
|
||||
# to 2 and is not configurable
|
||||
#pickle_protocol = 2
|
||||
|
||||
[service-smppclient]
|
||||
# For each smppclient connector a service is associated
|
||||
# refer to "Message flows" documentation for more details
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/service-smppclients.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
[sm-listener]
|
||||
# SM listener consumes submit_sm and deliver_sm messages from amqp broker
|
||||
# refer to "Message flows" documentation for more details
|
||||
|
||||
# If publish_submit_sm_resp is True, any received SubmitSm PDU will be published
|
||||
# to the 'messaging' exchange on 'submit.sm.resp.CID' route, useful when you have
|
||||
# a third party application waiting for these messages.
|
||||
#publish_submit_sm_resp = False
|
||||
|
||||
# If the error is defined in submit_error_retrial, Jasmin will retry sending submit_sm if it
|
||||
# gets one of these errors.
|
||||
# submit_sm retrial will be executed 'count' times and delayed for 'delay' seconds each time.
|
||||
#submit_error_retrial = {
|
||||
# 'ESME_RSYSERR': {'count': 2, 'delay': 30},
|
||||
# 'ESME_RTHROTTLED': {'count': 20, 'delay': 30},
|
||||
# 'ESME_RMSGQFUL': {'count': 2, 'delay': 180},
|
||||
# 'ESME_RINVSCHED': {'count': 2, 'delay': 300},
|
||||
# }
|
||||
|
||||
# The maximum number of seconds a message can stay in queue waiting for SMPPC to get ready for
|
||||
# delivey (connected and bound).
|
||||
#submit_max_age_smppc_not_ready = 1200
|
||||
|
||||
# Delay (seconds) when retrying a submit with a not-yet ready SMPPc
|
||||
# Hint: for large scale messaging deployment, it is advised to set this value to few seconds
|
||||
# in order to keep Jasmin free.
|
||||
#submit_retrial_delay_smppc_not_ready = 30
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/messages.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = midnight
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
#log_privacy = False
|
||||
|
||||
[dlr]
|
||||
# DLRLookup process id
|
||||
#pid = main
|
||||
|
||||
# DLRLookup mechanism configuration
|
||||
#dlr_lookup_retry_delay = 10
|
||||
#dlr_lookup_max_retries = 2
|
||||
|
||||
# If smpp_receipt_on_success_submit_sm_resp is True, every connected user to smpp server will
|
||||
# receive a receipt (data_sm or deliver_sm) whenever a submit_sm_resp is received
|
||||
# for a message he sent and requested receipt for it.
|
||||
#smpp_receipt_on_success_submit_sm_resp = False
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/messages.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = midnight
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
#log_privacy = False
|
||||
|
||||
[amqp-broker]
|
||||
host=rabbitmq
|
||||
port=5672
|
||||
# The following directives define the way how Jasmin is connecting to the AMQP Broker,
|
||||
# default values must work with a freshly installed RabbitMQ server.
|
||||
#host = 127.0.0.1
|
||||
#vhost = /
|
||||
#spec = /etc/jasmin/resource/amqp0-9-1.xml
|
||||
#port = 5672
|
||||
#username = guest
|
||||
#password = guest
|
||||
#heartbeat = 0
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/amqp-client.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
#connection_loss_retry = True
|
||||
#connection_failure_retry = True
|
||||
#connection_loss_retry_delay = 10
|
||||
#connection_loss_failure_delay = 10
|
||||
|
||||
[http-api]
|
||||
# If you want you can bind a single interface, you can specify its IP here
|
||||
#bind = 0.0.0.0
|
||||
|
||||
# Accept connections on the specified port, default is 1401
|
||||
#port = 1401
|
||||
|
||||
# Activate billing feature
|
||||
# May be disabled if not needed/used
|
||||
#billing_feature = True
|
||||
|
||||
# How many message parts you can get for a long message, default is 5 so you
|
||||
# can't exceed 800 characters (160x5) when sending a long latin message.
|
||||
#long_content_max_parts = 5
|
||||
|
||||
# Splitting long content can be made through SAR options or UDH
|
||||
# Possible values are: sar and udh
|
||||
#long_content_split = udh
|
||||
|
||||
# Specify the access log file path
|
||||
#access_log = /var/log/jasmin/http-access.log
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/http-api.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
#log_privacy = False
|
||||
|
||||
[router]
|
||||
# Jasmin router persists its routing configuration profiles in /etc/jasmin/store by
|
||||
# default. You can specify a custom location here
|
||||
#store_path = /etc/jasmin/store
|
||||
|
||||
# Router will automatically persist users and groups to disk whenever a critical information
|
||||
# is updated (ex: user balance), persistence is executed every persistence_timer_secs
|
||||
#persistence_timer_secs = 60
|
||||
|
||||
# If you want you can bind a single interface, you can specify its IP here
|
||||
#bind = 0.0.0.0
|
||||
|
||||
# Accept connections on the specified port, default is 8988
|
||||
#port = 8988
|
||||
|
||||
# If authentication is True, access will require entering a username and password
|
||||
# as defined in admin_username and admin_password, you can disable this security
|
||||
# layer by setting authentication to False, in this case admin_* values are ignored.
|
||||
#authentication = True
|
||||
#admin_username = radmin
|
||||
# This is a MD5 password digest hex encoded
|
||||
#admin_password = 82a606ca5a0deea2b5777756788af5c8
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/router.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
# The protocol version used to pickle objects before transfering
|
||||
# them to client side, this is used in the client manager only,
|
||||
# the pickle protocol defined in SMPPClientManagerPBProxy is set
|
||||
# to 2 and is not configurable
|
||||
#pickle_protocol = 2
|
||||
|
||||
[deliversm-thrower]
|
||||
# The following directives define the process of delivery SMS-MO through http to third party
|
||||
# application, it is explained in "HTTP API" documentation
|
||||
# Sets socket timeout in seconds for outgoing client http connections.
|
||||
#http_timeout = 30
|
||||
# Define how many seconds should pass within the queuing system for retrying a failed throw.
|
||||
#retry_delay = 30
|
||||
# Define how many retries should be performed for failing throws of SMS-MO.
|
||||
#max_retries = 3
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/deliversm-thrower.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
[dlr-thrower]
|
||||
# The following directives define the process of delivering delivery-receipts through http to third party
|
||||
# application, it is explained in "HTTP API" documentation
|
||||
# Sets socket timeout in seconds for outgoing client http connections.
|
||||
#http_timeout = 30
|
||||
# Define how many seconds should pass within the queuing system for retrying a failed throw.
|
||||
#retry_delay = 30
|
||||
# Define how many retries should be performed for failing throws of DLR.
|
||||
#max_retries = 3
|
||||
|
||||
# Specify the pdu type to consider when throwing a receipt through SMPPs, possible values:
|
||||
# - data_sm
|
||||
# - deliver_sm (default pdu)
|
||||
dlr_pdu = data_sm
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/dlr-thrower.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
[redis-client]
|
||||
host=redis
|
||||
port=6379
|
||||
# The following directives define the way how Jasmin is connecting to the redis server,
|
||||
# default values must work with a freshly installed redis server.
|
||||
#host = 127.0.0.1
|
||||
#port = 6379
|
||||
#dbid = 0
|
||||
#password = None
|
||||
#poolsize = 10
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/redis-client.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
[jcli]
|
||||
bind=0.0.0.0
|
||||
# If you want you can bind a single interface, you can specify its IP here
|
||||
#bind = 127.0.0.1
|
||||
|
||||
# Accept connections on the specified port, default is 8990
|
||||
#port = 8990
|
||||
|
||||
# If authentication is True, access will require entering a username and password
|
||||
# as defined in admin_username and admin_password, you can disable this security
|
||||
# layer by setting authentication to False, in this case admin_* values are ignored.
|
||||
#authentication = True
|
||||
#admin_username = jcliadmin
|
||||
# This is a MD5 password digest hex encoded
|
||||
#admin_password = 79e9b0aa3f3e7c53e916f7ac47439bcb
|
||||
|
||||
# Specify the server verbosity level.
|
||||
# This can be one of:
|
||||
# NOTSET (disable logging)
|
||||
# DEBUG (a lot of information, useful for development/testing)
|
||||
# INFO (moderately verbose, what you want in production probably)
|
||||
# WARNING (only very important / critical messages and errors are logged)
|
||||
# ERROR (only errors / critical messages are logged)
|
||||
# CRITICAL (only critical messages are logged)
|
||||
#log_level = INFO
|
||||
|
||||
# Specify the log file path
|
||||
#log_file = /var/log/jasmin/jcli.log
|
||||
|
||||
# When to rotate the log file, possible values:
|
||||
# S: Seconds
|
||||
# M: Minutes
|
||||
# H: Hours
|
||||
# D: Days
|
||||
# W0-W6: Weekday (0=Monday)
|
||||
# midnight: Roll over at midnight
|
||||
#log_rotate = W6
|
||||
|
||||
# The following directives define logging patterns including:
|
||||
# - log_format: using python logging's attributes
|
||||
# refer to https://docs.python.org/2/library/logging.html#logrecord-attributes
|
||||
# -log_date_format: using python strftime formating directives
|
||||
# refer to https://docs.python.org/2/library/time.html#time.strftime
|
||||
#log_format = %(asctime)s %(levelname)-8s %(process)d %(message)s
|
||||
#log_date_format = %Y-%m-%d %H:%M:%S
|
||||
|
||||
[interceptor-client]
|
||||
# The following directives define client connector to InterceptorPB, it's used when jasmind
|
||||
# is started with --enable-interceptor-client
|
||||
#host = 127.0.0.1
|
||||
#port = 8987
|
||||
#username = iadmin
|
||||
#password = ipwd
|
||||
Reference in New Issue
Block a user