__author__ = 'Thanh Ha'
+import getpass
import logging
import click
+from six.moves import configparser
+from six.moves import input
+from lftools import config as conf
from lftools.cli.config import config_sys
from lftools.cli.dco import dco
from lftools.cli.deploy import deploy
@click.group()
@click.option('--debug', envvar='DEBUG', is_flag=True, default=False)
+@click.option('--password', envvar='LFTOOLS_PASSWORD', default=None)
+@click.option('--username', envvar='LFTOOLS_USERNAME', default=None)
+@click.option('-i', '--interactive', is_flag=True, default=False)
@click.pass_context
@click.version_option()
-def cli(ctx, debug):
+def cli(ctx, debug, interactive, password, username):
"""CLI entry point for lftools."""
if debug:
logging.getLogger("").setLevel(logging.DEBUG)
ctx.obj['DEBUG'] = debug
log.debug('DEBUG mode enabled.')
+ # Start > Credentials
+ if username is None:
+ if interactive:
+ username = input('Username: ')
+ else:
+ try:
+ username = conf.get_setting('global', 'username')
+ except (configparser.NoOptionError,
+ configparser.NoSectionError) as e:
+ username = None
+
+ if password is None:
+ if interactive:
+ password = getpass.getpass('Password: ')
+ else:
+ try:
+ password = conf.get_setting('global', 'password')
+ except (configparser.NoOptionError,
+ configparser.NoSectionError) as e:
+ password = None
+
+ ctx.obj['username'] = username
+ ctx.obj['password'] = password
+ # End > Credentials
+
cli.add_command(config_sys)
cli.add_command(infofile)
def change(ctx):
"""Generate a new API token."""
jenkins = ctx.obj['jenkins']
- log.info(get_token(jenkins.url, change=True))
+ username = ctx.obj['username']
+ password = ctx.obj['password']
+
+ if not username or not password:
+ log.error('Username or password not set.')
+ sys.exit(1)
+
+ log.info(get_token(jenkins.url, change=True,
+ username=username, password=password))
@click.command()
def init(ctx, name, url):
"""Initialize jenkins_jobs.ini config for new server section."""
jenkins = ctx.obj['jenkins']
+ username = ctx.obj['username']
+ password = ctx.obj['password']
+
+ if not username or not password:
+ log.error('Username or password not set.')
+ sys.exit(1)
+
_require_jjb_ini(jenkins.config_file)
config = configparser.ConfigParser()
config.read(jenkins.config_file)
- token = get_token(url, True)
+ token = get_token(url, change=True,
+ username=username, password=password)
try:
config.add_section(name)
except configparser.DuplicateSectionError as e:
def print_token(ctx):
"""Print current API token."""
jenkins = ctx.obj['jenkins']
- log.info(get_token(jenkins.url))
+ username = ctx.obj['username']
+ password = ctx.obj['password']
+
+ if not username or not password:
+ log.error('Username or password not set.')
+ sys.exit(1)
+
+ log.info(get_token(jenkins.url, username=username, password=password))
@click.command()
configuration file will be reset via multi-server mode.
"""
jenkins = ctx.obj['jenkins']
+ username = ctx.obj['username']
+ password = ctx.obj['password']
+
+ if not username or not password:
+ log.error('Username or password not set.')
+ sys.exit(1)
+
_require_jjb_ini(jenkins.config_file)
def _reset_key(config, server):
url = config.get(server, 'url')
try:
- token = get_token(url, True)
+ token = get_token(url, change=True,
+ username=username, password=password)
config.set(server, 'password', token)
with open(jenkins.config_file, 'w') as configfile:
config.write(configfile)
import jenkins
-from lftools import config
-
log = logging.getLogger(__name__)
-def get_token(url, change=False):
+def get_token(url, username, password, change=False):
"""Get API token.
This function uses the global username / password for Jenkins from
lftools.ini as the user asking for the token may not already know the
api token.
"""
- username = config.get_setting('global', 'username')
- password = config.get_setting('global', 'password')
-
if change:
log.debug('Resetting Jenkins API token on {}'.format(url))
else: