python-mylib/mylib/scripts/helpers.py
Benjamin Renard 9511b31a79
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/tag/woodpecker Pipeline was successful
Add SFTP client
2022-06-28 11:05:43 +02:00

289 lines
8.6 KiB
Python

# 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 = '%(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: %s)" % 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=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: %s)" % 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="SMTP port (default: %s)" % 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="Use SSL (default: %s)" % 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="Use TLS (default: %s)" % 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="SMTP username (default: %s)" % 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="SMTP password (default: %s)" % 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="Debug SMTP connection (default: %s)" % 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="SMTP encoding (default: %s)" % 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="Sender name (default: %s)" % 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="Sender email (default: %s)" % 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 (default: %s)" % 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