|
1
|
|
|
#!/usr/bin/env python3 |
|
2
|
|
|
# -*- coding: utf-8 -*- |
|
3
|
|
|
|
|
4
|
|
|
# pylint: disable=C0111,C0326,C0103 |
|
5
|
|
|
|
|
6
|
|
|
"""Tools to manage dumps of API requests.""" |
|
7
|
|
|
|
|
8
|
|
|
import errno |
|
9
|
|
|
import glob |
|
10
|
|
|
import os |
|
11
|
|
|
import random |
|
12
|
|
|
import time |
|
13
|
|
|
from math import floor |
|
14
|
|
|
|
|
15
|
|
|
from . import ansi |
|
16
|
|
|
|
|
17
|
|
|
|
|
18
|
|
|
def get_timestamp_random(): |
|
19
|
|
|
"""Generate timestamp + random part to avoid collisions.""" |
|
20
|
|
|
millis = floor(time.time() * 1000) |
|
21
|
|
|
tail = "{:06d}".format(random.randint(0, 999999)) |
|
22
|
|
|
return "{}_{}".format(str(millis), tail) |
|
23
|
|
|
|
|
24
|
|
|
def write_info_if_dumps_found(): |
|
25
|
|
|
"""Notify user to upload dumps if present.""" |
|
26
|
|
|
# To disable this info, uncomment the following line. |
|
27
|
|
|
# return |
|
28
|
|
|
files = glob.glob(os.path.normpath("logs/*.xml")) |
|
29
|
|
|
if files: |
|
30
|
|
|
print() |
|
31
|
|
|
print("{}There are {} logs collected in the logs/ directory.{} Please consider uploading".format(ansi.YELLOW, len(files), ansi.RESET)) |
|
32
|
|
|
print("them to https://tclota.birth-online.de/ by running {}./upload_logs.py{}.".format(ansi.CYAN, ansi.RESET)) |
|
33
|
|
|
|
|
34
|
|
|
class DumpMgr: |
|
|
|
|
|
|
35
|
|
|
"""A class for XML dump management.""" |
|
36
|
|
|
|
|
37
|
|
|
def __init__(self): |
|
38
|
|
|
"""Populate dump file name.""" |
|
39
|
|
|
self.last_dump_filename = None |
|
40
|
|
|
|
|
41
|
|
|
def write_dump(self, data): |
|
42
|
|
|
"""Write dump to file.""" |
|
43
|
|
|
outfile = os.path.normpath("logs/{}.xml".format(get_timestamp_random())) |
|
44
|
|
|
if not os.path.exists(os.path.dirname(outfile)): |
|
45
|
|
|
try: |
|
46
|
|
|
os.makedirs(os.path.dirname(outfile)) |
|
47
|
|
|
except OSError as err: |
|
48
|
|
|
if err.errno != errno.EEXIST: |
|
49
|
|
|
raise |
|
50
|
|
|
with open(outfile, "w", encoding="utf-8") as fhandle: |
|
51
|
|
|
fhandle.write(data) |
|
52
|
|
|
self.last_dump_filename = outfile |
|
53
|
|
|
|
|
54
|
|
|
def delete_last_dump(self): |
|
55
|
|
|
"""Delete last dump.""" |
|
56
|
|
|
if self.last_dump_filename: |
|
57
|
|
|
os.unlink(self.last_dump_filename) |
|
58
|
|
|
self.last_dump_filename = None |
|
59
|
|
|
|