2017-09-18 10:50:00 +00:00
|
|
|
#!/usr/bin/python3
|
|
|
|
|
2022-07-25 11:12:32 +00:00
|
|
|
""" Script that replays curtin events from a journald export.
|
|
|
|
curtin events are injected back in journald and log lines are written to a log
|
|
|
|
file. """
|
|
|
|
|
|
|
|
import argparse
|
2017-09-18 10:50:00 +00:00
|
|
|
import json
|
2018-02-12 01:44:40 +00:00
|
|
|
import os
|
2017-09-18 10:50:00 +00:00
|
|
|
import sys
|
|
|
|
import time
|
2022-07-25 11:12:32 +00:00
|
|
|
from typing import TextIO
|
2017-09-18 10:50:00 +00:00
|
|
|
|
2018-02-28 02:57:35 +00:00
|
|
|
from systemd import journal
|
2017-09-18 10:50:00 +00:00
|
|
|
|
2018-02-28 02:57:35 +00:00
|
|
|
scale_factor = float(os.environ.get('SUBIQUITY_REPLAY_TIMESCALE', "4"))
|
2017-09-18 10:50:00 +00:00
|
|
|
|
2018-02-28 02:57:35 +00:00
|
|
|
def time_for_entry(e):
|
|
|
|
return int(e['__MONOTONIC_TIMESTAMP'])/1e6
|
2017-09-18 10:50:00 +00:00
|
|
|
|
2019-11-20 22:25:43 +00:00
|
|
|
rc = 0
|
|
|
|
|
2022-07-25 11:12:32 +00:00
|
|
|
def report(e, log_file: TextIO, event_identifier: str):
|
2019-11-20 22:25:43 +00:00
|
|
|
global rc
|
2018-02-28 02:57:35 +00:00
|
|
|
if e['SYSLOG_IDENTIFIER'].startswith("curtin_event"):
|
|
|
|
e['SYSLOG_IDENTIFIER'] = event_identifier
|
|
|
|
e['CODE_LINE'] = int(e['CODE_LINE'])
|
|
|
|
journal.send(**e)
|
2019-11-20 22:25:43 +00:00
|
|
|
r = e.get("CURTIN_RESULT")
|
|
|
|
if r == "SUCCESS":
|
|
|
|
rc = 0
|
|
|
|
elif r == "FAIL":
|
|
|
|
rc = 1
|
2022-07-26 16:11:03 +00:00
|
|
|
elif e['SYSLOG_IDENTIFIER'].startswith("subiquity_log") and scale_factor < 10:
|
2019-11-20 22:47:52 +00:00
|
|
|
log_file.write(e['MESSAGE'] + '\n')
|
|
|
|
|
2022-07-25 11:12:32 +00:00
|
|
|
|
|
|
|
def main() -> int:
|
|
|
|
""" Entry point. """
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
|
|
|
|
parser.add_argument("replay-file")
|
|
|
|
parser.add_argument("--event-identifier", required=True)
|
|
|
|
parser.add_argument("--output", type=argparse.FileType("w"), default="-")
|
|
|
|
|
|
|
|
args = vars(parser.parse_args())
|
|
|
|
|
2019-11-20 22:47:52 +00:00
|
|
|
prev_ev = None
|
2022-07-25 11:12:32 +00:00
|
|
|
for line in open(args["replay-file"]):
|
2019-11-20 22:47:52 +00:00
|
|
|
ev = json.loads(line.strip())
|
|
|
|
if prev_ev is not None:
|
2022-07-25 11:12:32 +00:00
|
|
|
report(prev_ev, args["output"],
|
|
|
|
event_identifier=args["event_identifier"])
|
2019-11-20 22:47:52 +00:00
|
|
|
delay = time_for_entry(ev) - time_for_entry(prev_ev)
|
|
|
|
time.sleep(min(delay, 8)/scale_factor)
|
|
|
|
prev_ev = ev
|
2022-07-25 11:12:32 +00:00
|
|
|
report(ev, args["output"], event_identifier=args["event_identifier"])
|
|
|
|
return rc
|
|
|
|
|
2018-02-12 01:44:40 +00:00
|
|
|
|
2022-07-25 11:12:32 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
sys.exit(main())
|