Fix directory creation for blueprints

Depending on how lorax-composer is run setting up an empty blueprints
directory can fail. So this moves checking/creation until after the
other directories are created and uses make_owned_dir to make sure
ownership is correct.
This commit is contained in:
Brian C. Lane 2018-10-10 13:46:34 -07:00
parent 1a7b6c74b4
commit 9c758c7c4b

View File

@ -37,7 +37,7 @@ from gevent.pywsgi import WSGIServer
from pylorax import vernum from pylorax import vernum
from pylorax.api.cmdline import lorax_composer_parser from pylorax.api.cmdline import lorax_composer_parser
from pylorax.api.config import configure, make_dnf_dirs, make_queue_dirs from pylorax.api.config import configure, make_dnf_dirs, make_queue_dirs, make_owned_dir
from pylorax.api.compose import test_templates from pylorax.api.compose import test_templates
from pylorax.api.dnfbase import DNFLock from pylorax.api.dnfbase import DNFLock
from pylorax.api.queue import start_queue_monitor from pylorax.api.queue import start_queue_monitor
@ -185,12 +185,6 @@ if __name__ == '__main__':
server.config["COMPOSER_CFG"] = configure(conf_file=opts.config) server.config["COMPOSER_CFG"] = configure(conf_file=opts.config)
server.config["COMPOSER_CFG"].set("composer", "tmp", opts.tmp) server.config["COMPOSER_CFG"].set("composer", "tmp", opts.tmp)
# Make sure the git repo can be accessed by the API uid/gid
if os.path.exists(opts.BLUEPRINTS):
repodir_stat = os.stat(opts.BLUEPRINTS)
if repodir_stat.st_gid != gid or repodir_stat.st_uid != uid:
subprocess.call(["chown", "-R", "%s:%s" % (opts.user, opts.group), opts.BLUEPRINTS])
# If the user passed in a releasever set it in the configuration # If the user passed in a releasever set it in the configuration
if opts.releasever: if opts.releasever:
server.config["COMPOSER_CFG"].set("composer", "releasever", opts.releasever) server.config["COMPOSER_CFG"].set("composer", "releasever", opts.releasever)
@ -213,6 +207,14 @@ if __name__ == '__main__':
# Make sure dnf directories are created (owned by user:group) # Make sure dnf directories are created (owned by user:group)
make_dnf_dirs(server.config["COMPOSER_CFG"], uid, gid) make_dnf_dirs(server.config["COMPOSER_CFG"], uid, gid)
# Make sure the git repo can be accessed by the API uid/gid
if os.path.exists(opts.BLUEPRINTS):
repodir_stat = os.stat(opts.BLUEPRINTS)
if repodir_stat.st_gid != gid or repodir_stat.st_uid != uid:
subprocess.call(["chown", "-R", "%s:%s" % (opts.user, opts.group), opts.BLUEPRINTS])
else:
make_owned_dir(opts.BLUEPRINTS, uid, gid)
# Did systemd pass any extra fds (for socket activation)? # Did systemd pass any extra fds (for socket activation)?
try: try:
fds = int(os.environ['LISTEN_FDS']) fds = int(os.environ['LISTEN_FDS'])
@ -244,6 +246,14 @@ if __name__ == '__main__':
# Switch to a home directory we can access (libgit2 uses this to look for .gitconfig) # Switch to a home directory we can access (libgit2 uses this to look for .gitconfig)
os.environ["HOME"] = server.config["COMPOSER_CFG"].get("composer", "lib_dir") os.environ["HOME"] = server.config["COMPOSER_CFG"].get("composer", "lib_dir")
# Setup access to the git repo
server.config["REPO_DIR"] = opts.BLUEPRINTS
repo = open_or_create_repo(server.config["REPO_DIR"])
server.config["GITLOCK"] = GitLock(repo=repo, lock=Lock(), dir=opts.BLUEPRINTS)
# Import example blueprints
commit_recipe_directory(server.config["GITLOCK"].repo, "master", opts.BLUEPRINTS)
# Get a dnf.Base to share with the requests # Get a dnf.Base to share with the requests
try: try:
server.config["DNFLOCK"] = DNFLock(server.config["COMPOSER_CFG"]) server.config["DNFLOCK"] = DNFLock(server.config["COMPOSER_CFG"])
@ -255,14 +265,6 @@ if __name__ == '__main__':
with server.config["DNFLOCK"].lock: with server.config["DNFLOCK"].lock:
server.config["TEMPLATE_ERRORS"] = test_templates(server.config["DNFLOCK"].dbo, server.config["COMPOSER_CFG"].get("composer", "share_dir")) server.config["TEMPLATE_ERRORS"] = test_templates(server.config["DNFLOCK"].dbo, server.config["COMPOSER_CFG"].get("composer", "share_dir"))
# Setup access to the git repo
server.config["REPO_DIR"] = opts.BLUEPRINTS
repo = open_or_create_repo(server.config["REPO_DIR"])
server.config["GITLOCK"] = GitLock(repo=repo, lock=Lock(), dir=opts.BLUEPRINTS)
# Import example blueprints
commit_recipe_directory(server.config["GITLOCK"].repo, "master", opts.BLUEPRINTS)
log.info("Starting %s on %s with blueprints from %s", VERSION, opts.socket, opts.BLUEPRINTS) log.info("Starting %s on %s with blueprints from %s", VERSION, opts.socket, opts.BLUEPRINTS)
http_server = WSGIServer(listener, server, log=LogWrapper(server_log)) http_server = WSGIServer(listener, server, log=LogWrapper(server_log))
# The server writes directly to a file object, so point to our log directory # The server writes directly to a file object, so point to our log directory