Run Jasmin in both directions: message_payload, data_sm and a multipart deadlock confirmed against a production gateway

This commit is contained in:
2026-09-06 02:24:32 +02:00
parent db02f0058d
commit 66b49ebfb3
7 changed files with 1858 additions and 1 deletions
+146
View File
@@ -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