# vim: set ts=4 sw=4 expandtab syntax=python: """ fpmstatus.cli Command-line functions & CLI entry-point @author J. Hipps """ import os import sys import json import logging import logging.handlers from argparse import ArgumentParser, Action import yaml from fpmstatus import fpm, report from fpmstatus import __version__, __date__ from fpmstatus import cwp_fpm logger = logging.getLogger('fpmstatus') class SafeStoreAction(Action): def __init__(self, option_strings, dest, nargs=None, **kwargs): super(SafeStoreAction, self).__init__(option_strings, dest, **kwargs) def __call__(self, parser, namespace, values, option_string=None): is_safe = False if 'SUDO_UID' in os.environ: if os.environ['SUDO_UID'] == '0': is_safe = True else: is_safe = False else: is_safe = True if is_safe: setattr(namespace, self.dest, values) else: print("ERROR: Attempted to set dangerous option as a non-root sudoer! Aborting.") sys.exit(249) def setup_logging(clevel=logging.INFO, flevel=logging.DEBUG, logfile=None): """ Setup logging """ logger.setLevel(logging.DEBUG) # Console con = logging.StreamHandler() con.setLevel(clevel) con_format = logging.Formatter("%(levelname)s: %(message)s") con.setFormatter(con_format) logger.addHandler(con) # File if logfile: try: flog = logging.handlers.WatchedFileHandler(logfile) flog.setLevel(flevel) flog_format = logging.Formatter("[%(asctime)s] %(name)s: %(levelname)s: %(message)s") flog.setFormatter(flog_format) logger.addHandler(flog) except Exception as e: logger.warning("Failed to open logfile: %s", str(e)) def parse_cli(show_help=False): """ Parse CLI arguments """ parser = ArgumentParser(description="PHP-FPM Pool Status tool") parser.set_defaults(user=None, domain=None, outfmt='report', loglevel=logging.INFO, verbose=False) parser.add_argument('--user', '-u', action='store', metavar="USER", help="Specify user") parser.add_argument('--domain', '-d', action='store', metavar="DOMAIN", help="Specify domain") parser.add_argument('--pool', '-p', action='store', metavar="POOL", help="Specify pool name") parser.add_argument('--sock', '-s', action='store', metavar="[SOCKPATH|HOST:PORT]", help="Specify socket") parser.add_argument('--verbose', '-V', dest='verbose', action='store_true', help="Enable detailed reporting output") parser.add_argument('--compact', '-c', dest='compact', action='store_true', help="Prints the head of a verbose output, best used with -d") parser.add_argument('--debug', '-D', dest='loglevel', action='store_const', const=logging.DEBUG, help="Enable debug output") parser.add_argument('--json', '-J', dest='outfmt', action='store_const', const='json', help="Output format: JSON") parser.add_argument('--yaml', '-Y', dest='outfmt', action='store_const', const='yaml', help="Output format: YAML") parser.add_argument('--version', '-v', action='version', version="%s (%s)" % (__version__, __date__)) parser.add_argument( "--install-conf", action="store_true", dest="install", help="Only install php-fpm changes, do not fetch status. (cwp)", ) if show_help: parser.print_help() sys.exit(1) return parser.parse_args() def _main(): """Entry point""" args = parse_cli() setup_logging(clevel=args.loglevel, flevel=logging.DEBUG) if cwp_fpm.is_cwp(): full_support = cwp_fpm.check_full_support() if not full_support: if args.install: cwp_fpm.deploy_support() sys.exit(0) else: print("PHP-FPM status page not enabled. " "Re-run with --install-conf then restart FPM.") sys.exit(1) # Perform command/filtering if args.domain: pd = [fpm.get_domain_pool(args.domain)] elif args.user: pd = fpm.get_user_pools(args.user) elif args.pool: pd = [fpm.get_pool_by_name(args.pool)] elif args.sock: pd = [fpm.get_pool_status(args.sock)] else: pd = fpm.get_all_pools() # Format the output if pd: if args.outfmt == 'json': print(json.dumps(pd, sort_keys=True, indent=4, separators=(',', ': '))) elif args.outfmt == 'yaml': print(yaml.dump(pd, Dumper=yaml.SafeDumper, default_flow_style=False)) else: for tpool in pd: if isinstance(tpool, dict): if not args.compact and not args.verbose: report.repgen_pool_terse(tpool) else: report.repgen_pool(tpool, args.compact) logger.debug("Done") if __name__ == '__main__': _main()