#!/usr/bin/env python3 # This file is part of GNU TALER. # Copyright (C) 2018 INRIA # # TALER is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free Software # Foundation; either version 2.1, or (at your option) any later version. # # TALER is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License along with # GNU TALER; see the file COPYING. If not, see # # @author Florian Dold """ Wrapper for programs that log to stderr. Redirects logs to a file specified by a path with strfmt-style placeholders in it. """ from subprocess import Popen, PIPE import sys import os import os.path import signal import time def handler(signum, frame): if p: os.kill(p.pid, signum) else: sys.exit(-1) def touchp(path): dir = os.path.dirname(path) if dir: os.makedirs(dir, exist_ok=True) if len(sys.argv) < 3: print("Usage: {} logfile prog_and_args...".format(sys.argv[0]), file=sys.stderr) sys.exit(-1) p = None catchable_sigs = set(signal.Signals) - {signal.SIGKILL, signal.SIGSTOP} for sig in catchable_sigs: signal.signal(sig, handler) p = Popen(sys.argv[2:], stderr=PIPE, shell=False) log = sys.argv[1] last_name = None while p.poll() is None: full_name = time.strftime(log) if full_name != last_name: touchp(full_name) last_name = full_name last_read = p.stderr.readline() if last_read == '': break with open(full_name, "ab") as f: f.write(last_read) status = p.wait() sys.exit(status)