log2iso.py
3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import sys
import re
from argparse import ArgumentParser
from time import time
from ISO8583.ISOErrors import BitNotSet
from sqlalchemy import func
from sqlalchemy.ext.declarative import declarative_base
from zope.sqlalchemy import register
from opensipkd.waktu import create_datetime
from opensipkd.string import FixLength
from ..models import Common
from ..log_models import LogFile
from .common import (
BaseApp,
my_registry,
append_csv,
create_session,
InvalidSource,
)
PATTERN = r'^([\d]*)-([\d]*)-([\d]*) ([\d]*):([\d]*):([\d]*)\.([\d]*) '\
r'(.*) \[RECEIVED RAW BUFFER\] : (.*)'
REGEX = re.compile(PATTERN)
Base = declarative_base()
def get_parser():
pars = ArgumentParser()
pars.add_argument('conf')
pars.add_argument('--update-from-id', type=int)
pars.add_argument('--debug-sql', action='store_true')
return pars
def get_option(argv):
pars = get_parser()
return pars.parse_args(argv)
class App(BaseApp):
conf_name = 'log file last id'
def __init__(self, argv):
super().__init__(argv)
if not self.pid:
return
class Log(self.models.Log, Common):
pass
self.report_orm = Log
register(self.prod_session)
def get_option(self, argv): # Override
return get_option(argv)
def get_session_for_save(self): # Override
return self.prod_session
def get_filter_query(self, q):
return q.filter(LogFile.id > self.last_id)
def get_count(self): # Override
q = self.prod_session.query(func.count())
q = self.get_filter_query(q)
return q.scalar()
def get_payment_query(self): # Override
q = self.prod_session.query(LogFile)
q = self.get_filter_query(q)
return q.order_by(LogFile.id)
def get_prefix_log(self): # Override
return f'ID {self.log_id}'
def create_data(self, log_file): # Override
self.log_id = log_file.id
match = REGEX.search(log_file.line)
if not match:
raise InvalidSource(f'ID {log_file.id} pola tidak dipahami')
year, month, day, hour, minute, sec, msec, _, raw = \
match.groups()
waktu = create_datetime(
int(year), int(month), int(day), int(hour),
int(minute), int(sec), int(msec)*1000)
iso = self.service.Doc()
iso.setIsoContent(raw[4:].encode('utf-8'))
try:
if iso.getBit(3) != self.service.PAYMENT_CODE:
raise InvalidSource(f'ID {log_file.id} bukan payment')
except BitNotSet:
raise InvalidSource(f'ID {log_file.id} bit 3 tidak ada')
d = dict(mti=iso.getMTI(), created=waktu)
for bit in iso.get_bit_definition():
try:
value = iso.getBit(bit)
except BitNotSet:
continue
field = 'bit_{}'.format(str(bit).zfill(3))
d[field] = value
profile = FixLength(self.service.INVOICE_PROFILE)
profile.set_raw(iso.getBit(62))
d['bit_062_data'] = profile.to_dict()
return d
def get_last_time(self): # Override
return str(self.last_pay.id)
def run_payment(self): # Override
self.last_pay = None
self.offset = 0
if self.option.update_from_id is None:
self.last = self.get_last_id(self.conf_name)
self.last_id = self.last.as_int()
else:
self.last = None
self.last_id = self.option.update_from_id - 1
self.count = self.get_count()
self.start_time = time()
while True:
found = self.update_from_date()
if not found:
break
if self.last_pay and self.last:
self.update_last()
def main(argv=sys.argv[1:]):
app = App(argv)
app.run()