Guest User

Untitled

a guest
Feb 25th, 2018
221
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.76 KB | None | 0 0
  1. import base64
  2. import json
  3. import re
  4. from datetime import datetime, timedelta
  5.  
  6. print('Loading function')
  7.  
  8.  
  9. def lambda_handler(event, context):
  10. output = []
  11. succeeded_record_cnt = 0
  12. failed_record_cnt = 0
  13.  
  14. for record in event['records']:
  15. # event['records']: base64になっている複数行のログ
  16. # record: base64になってるログ一行
  17. payload = base64.b64decode(record['data']).decode()
  18. # payload: base64じゃない普通のログ一行
  19. payload = base64.b64decode(record['data']).decode()
  20. regex_string = (r"^((?:\b(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?"
  21. r"|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\b\s+(?:(?:0[1-9])|(?:[12][0-9])|(?:3[01])|[1-9])\s+"
  22. r"(?:(?:2[0123]|[01]?[0-9]):(?:[0-5][0-9]):(?:(?:[0-5]?[0-9]|60)(?:[:\.,][0-9]+)?)))) (?:<(?:[0-9]+).(?:[0-9]+)> )"
  23. r"?((?:[a-zA-Z0-9._-]+)) ([\w\._/%-]+)(?:\[((?:[1-9][0-9]*))\])?: (.*)")
  24. p = re.compile(regex_string)
  25. m = p.match(payload)
  26. # regex_string: syslogフォーマットの正規表現 (誰も読めない)
  27. # m: 正規表現をもとに日付とか時刻とかプロセスIDとかメッセージ本体とかを個別に抽出したものの集合
  28. # m.group(x): x=1: 日付と時刻, x=2: ログの送り元ホスト名orIP, x=3: ログのクラス, x=4: ???, x=5: メッセージ本体
  29. if m:
  30. succeeded_record_cnt += 1
  31. now_jst = datetime.now() + timedelta(hours=9)
  32. syslogtime = datetime.strptime(m.group(1), '%b %d %H:%M:%S').replace(year=now_jst.year)
  33. data_field = {
  34. 'syslogtime': syslogtime.strftime('%Y-%m-%d %H:%M:%S'),
  35. 'logsource': m.group(2),
  36. 'messageclass': int(m.group(3).split('-')[-1])
  37. }
  38. token = m.group(5).split(' ')
  39. if data_field['messageclass'] == 302013 or data_field['messageclass'] == 302015:
  40. result_code = 'Ok'
  41. data_field['protocol'] = token[2]
  42. if token[1] == 'inbound':
  43. data_field['src_ip'] = token[6].split(':')[1].split('/')[0]
  44. data_field['src_port'] = int(token[6].split(':')[1].split('/')[1])
  45. data_field['dst_ip'] = token[9].split(':')[1].split('/')[0]
  46. data_field['dst_port'] = int(token[9].split(':')[1].split('/')[1])
  47. elif token[1] == 'outbound':
  48. data_field['dst_ip'] = token[6].split(':')[1].split('/')[0]
  49. data_field['dst_port'] = int(token[6].split(':')[1].split('/')[1])
  50. data_field['src_ip'] = token[9].split(':')[1].split('/')[0]
  51. data_field['src_port'] = int(token[9].split(':')[1].split('/')[1])
  52. else:
  53. result_code = 'Dropped'
  54. # data_field: JSON化前のデータ。これをCSVとかJSONとかにすると、一行分のCSVとかJSONにできる
  55. # 例) json.dumps(data_field): data_fieldをJSON化した文字列
  56. output_record = {
  57. 'recordId': record['recordId'],
  58. 'result': result_code,
  59. 'data': base64.b64encode((json.dumps(data_field)+'\n').encode()).decode()
  60. }
  61. else:
  62. print('Parsing failed')
  63. failed_record_cnt += 1
  64. output_record = {
  65. 'recordId': record['recordId'],
  66. 'result': 'ProcessingFailed',
  67. 'data': payload
  68. }
  69.  
  70. output.append(output_record)
  71.  
  72. print('Processing completed. Successful records {}, Failed records {}.'.format(succeeded_record_cnt, failed_record_cnt))
  73. return {'records': output}
Add Comment
Please, Sign In to add comment