WizardKit/scripts/upload-logs
2023-10-03 15:24:12 -07:00

138 lines
3.5 KiB
Python
Executable file

#!/usr/bin/env python3
# vim: sts=2 sw=2 ts=2
"""WizardKit: Upload Logs"""
import datetime
import os
import pathlib
import pytz
import requests
import wk
# STATIC VARIABLES
LOG_DIR = pathlib.Path('~/Logs').expanduser().resolve()
PLATFORM = wk.std.PLATFORM.replace('Darwin', 'macOS')
TIMEZONE = pytz.timezone(wk.cfg.main.LINUX_TIME_ZONE)
NOW = datetime.datetime.now(tz=TIMEZONE)
# Safety check
if PLATFORM not in ('macOS', 'Linux'):
raise OSError(f'This script is not supported under {PLATFORM}')
# Functions
def compress(reason):
dest = pathlib.Path(f'~/{reason}_{NOW.strftime("%Y-%m-%dT%H%M%S%z")}.txz')
dest = dest.expanduser().resolve()
cmd = ['tar', 'caf', dest.name, LOG_DIR.name]
wk.exe.run_program(cmd, check=False)
return dest
def compress_live_macos(reason):
"""Compress log_dir using the RAM disk."""
dest = pathlib.Path(
f'/Volumes/RAM_Disk/{reason}_{NOW.strftime("%Y-%m-%dT%H%M%S%z")}.txz',
)
tmp_file = dest.with_suffix('.tar')
cmd = ['tar', '-cf', tmp_file.name, LOG_DIR.name]
wk.exe.run_program(cmd, check=False)
cmd = ['xz', '-z', tmp_file.name]
wk.exe.run_program(cmd, check=False)
tmp_file = tmp_file.with_suffix('.tar.xz')
tmp_file.rename(dest.name)
return dest
def compress_and_upload(reason='Testing'):
"""Upload compressed log_dir to the crash server."""
server = wk.cfg.net.CRASH_SERVER
upload_args = {
'headers': server['Headers'],
'auth': (server['User'], server['Pass']),
}
# Compress LOG_DIR (relative to parent dir)
if os.path.exists('/.wk-live-macos'):
dest = compress_live_macos(reason)
else:
dest = compress(reason)
upload_args['data'] = dest.read_bytes()
# Upload compressed data
url = f'{server["Url"]}/{dest.name}'
result = requests.put(url, **upload_args)
# Check result
if not result.ok:
raise wk.std.GenericError('Failed to upload logs')
def main() -> None:
"""Upload logs for review."""
lines = []
try_and_print = wk.ui.cli.TryAndPrint()
# Set log
wk.log.update_log_path(dest_name='Upload-Logs', timestamp=True)
# Instructions
wk.ui.cli.print_success(f'{wk.cfg.main.KIT_NAME_FULL}: Upload Logs')
wk.ui.cli.print_standard('')
wk.ui.cli.print_standard('Please state the reason for the review.')
wk.ui.cli.print_info(' End note with an empty line.')
wk.ui.cli.print_standard('')
# Get reason note
while True:
text = wk.ui.cli.input_text('> ', allow_empty=True)
if not text:
lines.append('')
break
lines.append(text)
with open(f'{LOG_DIR}/__reason__.txt', 'a') as _f:
_f.write('\n'.join(lines))
# Compress and upload logs
os.chdir(LOG_DIR.parent)
print(os.getcwd())
result = try_and_print.run(
message='Uploading logs...',
function=compress_and_upload,
reason='Review',
)
if not result['Failed']:
raise SystemExit(1)
def upload_log_dir(reason='Testing') -> None:
"""Upload compressed log_dir to the crash server."""
server = wk.cfg.net.CRASH_SERVER
dest = pathlib.Path(f'~/{reason}_{NOW.strftime("%Y-%m-%dT%H%M%S%z")}.txz')
dest = dest.expanduser().resolve()
# Compress LOG_DIR (relative to parent dir)
os.chdir(LOG_DIR.parent)
cmd = ['tar', 'caf', dest.name, LOG_DIR.name]
wk.exe.run_program(cmd, check=False)
# Upload compressed data
url = f'{server["Url"]}/{dest.name}'
result = requests.put(
url,
data=dest.read_bytes(),
headers=server['Headers'],
auth=(server['User'], server['Pass']),
)
# Check result
if not result.ok:
raise wk.std.GenericError('Failed to upload logs')
if __name__ == '__main__':
main()