Commit 47bf07df by Owo Sugiana

Lebih banyak opsi untuk web_client.py

1 parent c865e1be
0.1.7 2020-05-12 0.1.7 2020-05-12
---------------- ----------------
- Bug fixed append_others() - Bug fixed append_others()
- web-client.py tidak lagi berada di contrib melainkan sebagai
bin/iso8583_web_client
0.1.6 2020-04-09 0.1.6 2020-04-09
---------------- ----------------
......
...@@ -107,7 +107,7 @@ membuat aplikasi teller bank. Pada ``test-bjb.ini`` aktifkan section ...@@ -107,7 +107,7 @@ membuat aplikasi teller bank. Pada ``test-bjb.ini`` aktifkan section
Kemudian restart daemon-nya. Setelah *echo established* dengan daemon pemda Kemudian restart daemon-nya. Setelah *echo established* dengan daemon pemda
lakukan *echo request* dengan cara:: lakukan *echo request* dengan cara::
$ ~/env/bin/python contrib/web-client.py $ ~/env/bin/iso8583_web_client
Hasilnya menjadi seperti ini:: Hasilnya menjadi seperti ini::
......
...@@ -16,6 +16,20 @@ end_threads = [] ...@@ -16,6 +16,20 @@ end_threads = []
durations = {} durations = {}
json_responses = {} 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): def error(s):
print('ERROR: {}'.format(s)) print('ERROR: {}'.format(s))
...@@ -29,27 +43,6 @@ def required(name, default=None): ...@@ -29,27 +43,6 @@ def required(name, default=None):
p[name] = value or default 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): def log_info(s):
t = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f') t = datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
t = t[:-3] t = t[:-3]
...@@ -57,74 +50,92 @@ def log_info(s): ...@@ -57,74 +50,92 @@ def log_info(s):
print(msg) print(msg)
default_url = 'http://localhost:7000/rpc' def get_option(argv):
default_host = 'pemda' parser = ArgumentParser()
default_count = 1 parser.add_argument('--url', default=default_url, help=help_url)
default_method = 'echo' parser.add_argument('--host', default=default_host, help=help_host)
parser.add_argument(
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) '--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('--invoice-id', help=help_invoice_id) parser.add_argument('--payment', action='store_true')
parser.add_argument('--amount', type=int, help=help_amount) parser.add_argument('--reversal', action='store_true')
parser.add_argument('--ntb', help=help_ntb) parser.add_argument('--amount', type=int, help=help_amount)
parser.add_argument('--stan', help=help_stan) parser.add_argument('--ntb', help=help_ntb)
parser.add_argument('--bit', help=help_bit) parser.add_argument('--stan', help=help_stan)
parser.add_argument('--conf', help=help_conf) parser.add_argument('--bit', help=help_bit)
option = parser.parse_args(sys.argv[1:]) parser.add_argument('--conf', help=help_conf)
return parser.parse_args(argv)
url = option.url
count = option.count
p = dict(host=option.host) class App:
if option.method != 'echo': def __init__(self, argv):
p['invoice_id'] = option.invoice_id self.option = get_option(argv)
if option.method in ('payment', 'reversal'):
def set_transaction(self, p):
p['invoice_id'] = self.option.invoice_id
if self.option.payment or self.option.reversal:
required('amount') required('amount')
if option.method == 'payment': if self.option.method == 'payment':
required('ntb', datetime.now().strftime('%y%m%d%H%m%s')) required('ntb', datetime.now().strftime('%m%d%H%m%s'))
required('stan', datetime.now().strftime('%H%M%S')) required('stan', datetime.now().strftime('%H%M%S'))
else: else:
required('ntb') required('ntb')
required('stan') required('stan')
if option.bit: if self.option.bit:
bits = dict() bits = dict()
for t in option.bit.split(','): for t in self.option.bit.split(','):
bit, value = t.split(':') bit, value = t.split(':')
bits[bit] = value bits[bit] = value
p['bits'] = bits p['bits'] = bits
if option.conf: if self.option.conf:
conf = dict() conf = dict()
for t in option.conf.split(','): for t in self.option.conf.split(','):
key, val = t.split(':') key, val = t.split(':')
conf[key] = val conf[key] = val
p['conf'] = conf p['conf'] = conf
data = dict(method=option.method, params=[p], jsonrpc='2.0')
for i in range(count): 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:
method = 'echo'
data = dict(method=method, params=[p], jsonrpc='2.0')
for i in range(self.option.count):
data['id'] = i data['id'] = i
thread = create_thread(send, [dict(data)]) thread = self.create_thread([dict(data)])
threads[i] = thread threads[i] = thread
for key in threads:
for key in threads:
thread = threads[key] thread = threads[key]
thread.start() thread.start()
sleep(0.2) sleep(0.2)
while threads:
while threads:
sleep(1) sleep(1)
if not end_threads: if not end_threads:
continue continue
...@@ -135,8 +146,7 @@ while threads: ...@@ -135,8 +146,7 @@ while threads:
del threads[i] del threads[i]
index = end_threads.index(i) index = end_threads.index(i)
del end_threads[index] del end_threads[index]
for key in durations:
for key in durations:
val = durations[key] val = durations[key]
resp = json_responses[key] resp = json_responses[key]
if 'error' in resp: if 'error' in resp:
...@@ -146,4 +156,10 @@ for key in durations: ...@@ -146,4 +156,10 @@ for key in durations:
stan = result['data']['11'] stan = result['data']['11']
else: else:
stan = '-' stan = '-'
print('thread {} stan {} {} detik'.format(key, stan, val)) 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 = [ ...@@ -47,7 +47,7 @@ tests_require = [
setup( setup(
name='iso8583_web', name='iso8583_web',
version=version, version=version,
description='Web untuk menampilkan log ISO8583', description='Daemon ISO8583 yang memiliki web service',
long_description=README + '\n\n' + CHANGES, long_description=README + '\n\n' + CHANGES,
classifiers=[ classifiers=[
'Programming Language :: Python', 'Programming Language :: Python',
...@@ -71,8 +71,9 @@ setup( ...@@ -71,8 +71,9 @@ setup(
'main = iso8583_web:main', 'main = iso8583_web:main',
], ],
'console_scripts': [ 'console_scripts': [
'initialize_iso8583_web_db = iso8583_web.scripts.initialize_db:main',
'iso8583 = iso8583_web.scripts.forwarder: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!