Commit 47bf07df by Owo Sugiana

Lebih banyak opsi untuk web_client.py

1 parent c865e1be
0.1.7 2020-05-12
----------------
- Bug fixed append_others()
- web-client.py tidak lagi berada di contrib melainkan sebagai
bin/iso8583_web_client
0.1.6 2020-04-09
----------------
......
......@@ -107,7 +107,7 @@ membuat aplikasi teller bank. Pada ``test-bjb.ini`` aktifkan section
Kemudian restart daemon-nya. Setelah *echo established* dengan daemon pemda
lakukan *echo request* dengan cara::
$ ~/env/bin/python contrib/web-client.py
$ ~/env/bin/iso8583_web_client
Hasilnya menjadi seperti ini::
......
......@@ -16,6 +16,20 @@ end_threads = []
durations = {}
json_responses = {}
default_url = 'http://localhost:7000/rpc'
default_host = 'pemda'
default_count = 1
help_url = 'default ' + default_url
help_host = 'default ' + default_host
help_count = 'default {}'.format(default_count)
help_invoice_id = 'wajib saat --payment dan --reversal'
help_amount = 'wajib saat --payment dan --reversal'
help_ntb = 'opsional saat --payment, wajib saat --reversal'
help_stan = 'opsional saat --payment, wajib saat --reversal'
help_bit = 'bit tambahan, contoh: --bit=42:TOKOPEDIA'
help_conf = 'konfigurasi tambahan, contoh untuk multi: --conf=pajak:bphtb'
def error(s):
print('ERROR: {}'.format(s))
......@@ -29,27 +43,6 @@ def required(name, default=None):
p[name] = value or default
def create_thread(func, args=[]):
thread = Thread(target=func, args=args)
# Exit the server thread when the main thread terminates
thread.daemon = True
return thread
def send(p):
key = p['id']
log_info('Request: {}'.format(p))
start = time()
try:
resp = requests.post(url, data=json.dumps(p), headers=headers)
durations[key] = time() - start
json_resp = resp.json()
log_info('Response: {}'.format(json_resp))
json_responses[key] = json_resp
finally:
end_threads.append(key)
def log_info(s):
t = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
t = t[:-3]
......@@ -57,93 +50,116 @@ def log_info(s):
print(msg)
default_url = 'http://localhost:7000/rpc'
default_host = 'pemda'
default_count = 1
default_method = 'echo'
help_url = 'default ' + default_url
help_host = 'default ' + default_host
help_count = 'default {}'.format(default_count)
help_method = 'default ' + default_method
help_invoice_id = 'dibutuhkan saat --method inquiry, payment, atau reversal'
help_amount = 'dibutuhkan saat --method payment dan reversal'
help_ntb = 'dibutuhkan saat --method payment dan reversal'
help_stan = 'dibutuhkan saat --method payment dan reversal'
help_bit = 'bit tambahan, contoh: --bit=42:TOKOPEDIA'
help_conf = 'konfigurasi tambahan, contoh untuk multi: --conf=pajak:bphtb'
parser = ArgumentParser()
parser.add_argument('--url', default=default_url, help=help_url)
parser.add_argument('--host', default=default_host, help=help_host)
parser.add_argument(
'--count', type=int, default=default_count, help=help_count)
parser.add_argument('--method', default=default_method, help=help_method)
parser.add_argument('--invoice-id', help=help_invoice_id)
parser.add_argument('--amount', type=int, help=help_amount)
parser.add_argument('--ntb', help=help_ntb)
parser.add_argument('--stan', help=help_stan)
parser.add_argument('--bit', help=help_bit)
parser.add_argument('--conf', help=help_conf)
option = parser.parse_args(sys.argv[1:])
url = option.url
count = option.count
p = dict(host=option.host)
if option.method != 'echo':
p['invoice_id'] = option.invoice_id
if option.method in ('payment', 'reversal'):
required('amount')
if option.method == 'payment':
required('ntb', datetime.now().strftime('%y%m%d%H%m%s'))
required('stan', datetime.now().strftime('%H%M%S'))
def get_option(argv):
parser = ArgumentParser()
parser.add_argument('--url', default=default_url, help=help_url)
parser.add_argument('--host', default=default_host, help=help_host)
parser.add_argument(
'--count', type=int, default=default_count, help=help_count)
parser.add_argument('--invoice-id', help=help_invoice_id)
parser.add_argument('--payment', action='store_true')
parser.add_argument('--reversal', action='store_true')
parser.add_argument('--amount', type=int, help=help_amount)
parser.add_argument('--ntb', help=help_ntb)
parser.add_argument('--stan', help=help_stan)
parser.add_argument('--bit', help=help_bit)
parser.add_argument('--conf', help=help_conf)
return parser.parse_args(argv)
class App:
def __init__(self, argv):
self.option = get_option(argv)
def set_transaction(self, p):
p['invoice_id'] = self.option.invoice_id
if self.option.payment or self.option.reversal:
required('amount')
if self.option.method == 'payment':
required('ntb', datetime.now().strftime('%m%d%H%m%s'))
required('stan', datetime.now().strftime('%H%M%S'))
else:
required('ntb')
required('stan')
if self.option.bit:
bits = dict()
for t in self.option.bit.split(','):
bit, value = t.split(':')
bits[bit] = value
p['bits'] = bits
if self.option.conf:
conf = dict()
for t in self.option.conf.split(','):
key, val = t.split(':')
conf[key] = val
p['conf'] = conf
def send(self, p):
key = p['id']
log_info('Request: {}'.format(p))
start = time()
try:
resp = requests.post(
self.option.url, data=json.dumps(p), headers=headers)
durations[key] = time() - start
json_resp = resp.json()
log_info('Response: {}'.format(json_resp))
json_responses[key] = json_resp
finally:
end_threads.append(key)
def create_thread(self, args=[]):
thread = Thread(target=self.send, args=args)
# Exit the server thread when the main thread terminates
thread.daemon = True
return thread
def run(self):
p = dict(host=self.option.host)
if self.option.invoice_id:
self.set_transaction(p)
if self.option.payment:
method = 'payment'
elif self.option.reversal:
method = 'reversal'
else:
method = 'inquiry'
else:
required('ntb')
required('stan')
if option.bit:
bits = dict()
for t in option.bit.split(','):
bit, value = t.split(':')
bits[bit] = value
p['bits'] = bits
if option.conf:
conf = dict()
for t in option.conf.split(','):
key, val = t.split(':')
conf[key] = val
p['conf'] = conf
data = dict(method=option.method, params=[p], jsonrpc='2.0')
for i in range(count):
data['id'] = i
thread = create_thread(send, [dict(data)])
threads[i] = thread
for key in threads:
thread = threads[key]
thread.start()
sleep(0.2)
while threads:
sleep(1)
if not end_threads:
continue
i = end_threads[0]
if i in threads:
thread = threads[i]
thread.join()
del threads[i]
index = end_threads.index(i)
del end_threads[index]
for key in durations:
val = durations[key]
resp = json_responses[key]
if 'error' in resp:
break
result = resp['result']
if result['code'] == 0:
stan = result['data']['11']
else:
stan = '-'
print('thread {} stan {} {} detik'.format(key, stan, val))
method = 'echo'
data = dict(method=method, params=[p], jsonrpc='2.0')
for i in range(self.option.count):
data['id'] = i
thread = self.create_thread([dict(data)])
threads[i] = thread
for key in threads:
thread = threads[key]
thread.start()
sleep(0.2)
while threads:
sleep(1)
if not end_threads:
continue
i = end_threads[0]
if i in threads:
thread = threads[i]
thread.join()
del threads[i]
index = end_threads.index(i)
del end_threads[index]
for key in durations:
val = durations[key]
resp = json_responses[key]
if 'error' in resp:
break
result = resp['result']
if result['code'] == 0:
stan = result['data']['11']
else:
stan = '-'
msg = 'thread {} stan {} {} detik'.format(key, stan, val)
log_info(msg)
def main(argv=sys.argv[1:]):
app = App(argv)
app.run()
......@@ -47,7 +47,7 @@ tests_require = [
setup(
name='iso8583_web',
version=version,
description='Web untuk menampilkan log ISO8583',
description='Daemon ISO8583 yang memiliki web service',
long_description=README + '\n\n' + CHANGES,
classifiers=[
'Programming Language :: Python',
......@@ -71,8 +71,9 @@ setup(
'main = iso8583_web:main',
],
'console_scripts': [
'initialize_iso8583_web_db = iso8583_web.scripts.initialize_db:main',
'iso8583 = iso8583_web.scripts.forwarder:main',
'iso8583_web_client = iso8583_web.scripts.web_client:main',
'initialize_iso8583_web_db = iso8583_web.scripts.initialize_db:main',
]
},
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!