| #!/usr/bin/env python |
| # Copyright 2005-2023 Gentoo Authors |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| """System health checks and maintenance utilities. |
| """ |
| |
| import os |
| import signal |
| |
| # For compatibility with Python < 3.8 |
| raise_signal = getattr( |
| signal, "raise_signal", lambda signum: os.kill(os.getpid(), signum) |
| ) |
| |
| |
| # Inherit from KeyboardInterrupt to avoid a traceback from asyncio. |
| class SignalInterrupt(KeyboardInterrupt): |
| def __init__(self, signum): |
| self.signum = signum |
| |
| |
| try: |
| |
| def signal_interrupt(signum, _frame): |
| raise SignalInterrupt(signum) |
| |
| def debug_signal(_signum, _frame): |
| import pdb |
| |
| pdb.set_trace() |
| |
| # Prevent "[Errno 32] Broken pipe" exceptions when writing to a pipe. |
| signal.signal(signal.SIGPIPE, signal.SIG_DFL) |
| signal.signal(signal.SIGTERM, signal_interrupt) |
| signal.signal(signal.SIGUSR1, debug_signal) |
| |
| import sys |
| import errno |
| from os import path as osp |
| |
| if osp.isfile( |
| osp.join( |
| osp.dirname(osp.dirname(osp.realpath(__file__))), ".portage_not_installed" |
| ) |
| ): |
| sys.path.insert( |
| 0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "lib") |
| ) |
| import portage |
| |
| portage._internal_caller = True |
| from portage.emaint.main import emaint_main |
| from portage.util._eventloop.global_event_loop import global_event_loop |
| |
| if __name__ == "__main__": |
| try: |
| emaint_main(sys.argv[1:]) |
| except OSError as e: |
| if e.errno == errno.EACCES: |
| print("\nemaint: Need superuser access") |
| sys.exit(1) |
| else: |
| raise |
| finally: |
| # Only close the event loop for __main__, |
| # since outside of __main__ it would close the |
| # event loop for child processes when using |
| # the multiprocessing spawn start method. |
| global_event_loop().close() |
| |
| except KeyboardInterrupt as e: |
| # Prevent traceback on ^C |
| signum = getattr(e, "signum", signal.SIGINT) |
| signal.signal(signum, signal.SIG_DFL) |
| raise_signal(signum) |