# coding: utf8 """ Scripts helpers """ import argparse import getpass import logging import socket import sys import os.path log = logging.getLogger(__name__) def init_logging(options, name, report=None): """ Initialize logging from calling script options """ logformat = f'%(asctime)s - {name} - %(levelname)s - %(message)s' if options.debug: loglevel = logging.DEBUG elif options.verbose: loglevel = logging.INFO else: loglevel = logging.WARNING handlers = [] if options.logfile: handlers.append(logging.FileHandler(options.logfile)) if not options.logfile or options.console: handlers.append(logging.StreamHandler()) if report: handlers.append(report.get_handler()) logging.basicConfig(level=loglevel, format=logformat, handlers=handlers) def get_default_opt_value(config, default_config, key): """ Retreive default option value from config or default config dictionaries """ if config and key in config: return config[key] return default_config.get(key) def get_opts_parser(desc=None, just_try=False, just_one=False, progress=False, config=None): """ Retrieve options parser """ default_config = dict(logfile=None) parser = argparse.ArgumentParser(description=desc) parser.add_argument( '-v', '--verbose', action="store_true", dest="verbose", help="Enable verbose mode" ) parser.add_argument( '-d', '--debug', action="store_true", dest="debug", help="Enable debug mode" ) parser.add_argument( '-l', '--log-file', action="store", type=str, dest="logfile", help=( 'Log file path (default: ' f'{get_default_opt_value(config, default_config, "logfile")})'), default=get_default_opt_value(config, default_config, 'logfile') ) parser.add_argument( '-C', '--console', action="store_true", dest="console", help="Always log on console (even if log file is configured)" ) if just_try: parser.add_argument( '-j', '--just-try', action="store_true", dest="just_try", help="Enable just-try mode" ) if just_one: parser.add_argument( '-J', '--just-one', action="store_true", dest="just_one", help="Enable just-one mode" ) if progress: parser.add_argument( '-p', '--progress', action="store_true", dest="progress", help="Enable progress bar" ) return parser def add_email_opts(parser, config=None): """ Add email options """ email_opts = parser.add_argument_group('Email options') default_config = dict( smtp_host="127.0.0.1", smtp_port=25, smtp_ssl=False, smtp_tls=False, smtp_user=None, smtp_password=None, smtp_debug=False, email_encoding=sys.getdefaultencoding(), sender_name=getpass.getuser(), sender_email=f'{getpass.getuser()}@{socket.gethostname()}', catch_all=False ) email_opts.add_argument( '--smtp-host', action="store", type=str, dest="email_smtp_host", help=( 'SMTP host (default: ' f'{get_default_opt_value(config, default_config, "smtp_host")})'), default=get_default_opt_value(config, default_config, 'smtp_host') ) email_opts.add_argument( '--smtp-port', action="store", type=int, dest="email_smtp_port", help=f'SMTP port (default: {get_default_opt_value(config, default_config, "smtp_port")})', default=get_default_opt_value(config, default_config, 'smtp_port') ) email_opts.add_argument( '--smtp-ssl', action="store_true", dest="email_smtp_ssl", help=f'Use SSL (default: {get_default_opt_value(config, default_config, "smtp_ssl")})', default=get_default_opt_value(config, default_config, 'smtp_ssl') ) email_opts.add_argument( '--smtp-tls', action="store_true", dest="email_smtp_tls", help=f'Use TLS (default: {get_default_opt_value(config, default_config, "smtp_tls")})', default=get_default_opt_value(config, default_config, 'smtp_tls') ) email_opts.add_argument( '--smtp-user', action="store", type=str, dest="email_smtp_user", help=f'SMTP username (default: {get_default_opt_value(config, default_config, "smtp_user")})', default=get_default_opt_value(config, default_config, 'smtp_user') ) email_opts.add_argument( '--smtp-password', action="store", type=str, dest="email_smtp_password", help=f'SMTP password (default: {get_default_opt_value(config, default_config, "smtp_password")})', default=get_default_opt_value(config, default_config, 'smtp_password') ) email_opts.add_argument( '--smtp-debug', action="store_true", dest="email_smtp_debug", help=f'Debug SMTP connection (default: {get_default_opt_value(config, default_config, "smtp_debug")})', default=get_default_opt_value(config, default_config, 'smtp_debug') ) email_opts.add_argument( '--email-encoding', action="store", type=str, dest="email_encoding", help=f'SMTP encoding (default: {get_default_opt_value(config, default_config, "email_encoding")})', default=get_default_opt_value(config, default_config, 'email_encoding') ) email_opts.add_argument( '--sender-name', action="store", type=str, dest="email_sender_name", help=f'Sender name (default: {get_default_opt_value(config, default_config, "sender_name")})', default=get_default_opt_value(config, default_config, 'sender_name') ) email_opts.add_argument( '--sender-email', action="store", type=str, dest="email_sender_email", help=f'Sender email (default: {get_default_opt_value(config, default_config, "sender_email")})', default=get_default_opt_value(config, default_config, 'sender_email') ) email_opts.add_argument( '--catch-all', action="store", type=str, dest="email_catch_all", help=( 'Catch all sent email: specify catch recipient email address ' f'(default: {get_default_opt_value(config, default_config, "catch_all")})'), default=get_default_opt_value(config, default_config, 'catch_all') ) def init_email_client(options, **kwargs): """ Initialize email client from calling script options """ from mylib.email import EmailClient # pylint: disable=import-outside-toplevel log.info('Initialize Email client') return EmailClient( smtp_host=options.email_smtp_host, smtp_port=options.email_smtp_port, smtp_ssl=options.email_smtp_ssl, smtp_tls=options.email_smtp_tls, smtp_user=options.email_smtp_user, smtp_password=options.email_smtp_password, smtp_debug=options.email_smtp_debug, sender_name=options.email_sender_name, sender_email=options.email_sender_email, catch_all_addr=options.email_catch_all, just_try=options.just_try if hasattr(options, 'just_try') else False, encoding=options.email_encoding, **kwargs ) def add_sftp_opts(parser): """ Add SFTP options to argpase.ArgumentParser """ sftp_opts = parser.add_argument_group("SFTP options") sftp_opts.add_argument( '-H', '--sftp-host', action="store", type=str, dest="sftp_host", help="SFTP Host (default: localhost)", default='localhost' ) sftp_opts.add_argument( '--sftp-port', action="store", type=int, dest="sftp_port", help="SFTP Port (default: 22)", default=22 ) sftp_opts.add_argument( '-u', '--sftp-user', action="store", type=str, dest="sftp_user", help="SFTP User" ) sftp_opts.add_argument( '-P', '--sftp-password', action="store", type=str, dest="sftp_password", help="SFTP Password" ) sftp_opts.add_argument( '--sftp-known-hosts', action="store", type=str, dest="sftp_known_hosts", help="SFTP known_hosts file path (default: ~/.ssh/known_hosts)", default=os.path.expanduser('~/.ssh/known_hosts') ) sftp_opts.add_argument( '--sftp-auto-add-unknown-host-key', action="store_true", dest="sftp_auto_add_unknown_host_key", help="Auto-add unknown SSH host key" ) return sftp_opts