125 lines
4.0 KiB
Python
125 lines
4.0 KiB
Python
import os
|
|
import sys
|
|
import time
|
|
import copy
|
|
import json
|
|
from subprocess import Popen, PIPE
|
|
|
|
import gentooimgr.config
|
|
from gentooimgr import LOG
|
|
|
|
def older_than_a_day(fullpath):
|
|
if not os.path.exists(fullpath):
|
|
return True # Don't fail on missing files
|
|
filetime = os.path.getmtime(fullpath)
|
|
return time.time() - filetime > (gentooimgr.config.DAY_IN_SECONDS *
|
|
gentooimgr.config.DAYS)
|
|
|
|
def find_iso(download_dir):
|
|
LOG.info(f"Looking for iso in {download_dir}")
|
|
name = None
|
|
ext = None
|
|
found = []
|
|
for f in os.listdir(download_dir):
|
|
name, ext = os.path.splitext(f)
|
|
if ext == ".iso":
|
|
found.append(os.path.join(download_dir, f))
|
|
|
|
return found
|
|
|
|
def make_iso_from_dir(mydir):
|
|
""" Generates an iso with gentooimgr inside it for use inside a live cd guest
|
|
:Returns:
|
|
path to iso that was created or NoneType if mydir is not found
|
|
"""
|
|
if not os.path.exists(mydir):
|
|
LOG.warn(f"\t:: dir not found {mydir}")
|
|
return
|
|
|
|
LOG.info(f"\t:: Making ISO with dir of {mydir}")
|
|
path = os.path.join(mydir, "..", "cloudgen.iso")
|
|
proc = Popen(["mkisofs",
|
|
"--input-charset", "utf-8",
|
|
"-J",
|
|
"-r",
|
|
"-V", "gentooimgr",
|
|
"-m", "*.img",
|
|
"-m", "*.iso",
|
|
"-o", path,
|
|
mydir
|
|
], stdout=PIPE, stderr=PIPE)
|
|
proc.communicate()
|
|
|
|
return path
|
|
|
|
def portage_from_dir(download_dir, filename=None):
|
|
"""Find portage file from directory. Will do a check in os.listdir() for portage*.tar.bz2.
|
|
|
|
If a filename is provided, this function either returns that filename assuming it exists in d,
|
|
or return None. If filename is None, this looks through all entries for portage files and if
|
|
only one exists, returns it, otherwise None.
|
|
"""
|
|
assert download_dir, f"empty {download_dir} for for portage"
|
|
LOG.info(f"Looking for portage in {download_dir}")
|
|
found = []
|
|
for f in os.listdir(download_dir):
|
|
if filename is not None:
|
|
if filename == f:
|
|
found.append(f)
|
|
elif f.startswith("portage") and f.endswith(".tar.xz"):
|
|
found.append(f)
|
|
|
|
if len(found) > 1:
|
|
LOG.error("\tEE: More than one portage file exists, please specify the exact portage file with --portage [file] or remove all others\n")
|
|
LOG.error(''.join([f"\t{f}\n" for f in found]))
|
|
LOG.error(f"in {download_dir}\n")
|
|
sys.exit(1)
|
|
|
|
return found[0] if found else None
|
|
|
|
|
|
def stage3_from_dir(d, filename=None):
|
|
"""Find stage3 file from directory. Will do a check in os.listdir() for stage3*.tar.xz.
|
|
|
|
If a filename is provided, this function either returns that filename assuming it exists in d,
|
|
or return None. If filename is None, this looks through all entries for stage3 files and if
|
|
only one exists, returns it, otherwise None.
|
|
"""
|
|
found = []
|
|
for f in os.listdir(d):
|
|
if filename is not None:
|
|
if filename == f:
|
|
found.append(f)
|
|
elif f.startswith("stage3") and f.endswith(".tar.xz"):
|
|
found.append(f)
|
|
|
|
if len(found) > 1:
|
|
LOG.error("More than one stage3 file exists, please specify the exact stage3 file or remove all others\n")
|
|
LOG.error(''.join([f"\t{f}\n" for f in found]))
|
|
LOG.error(f"in {d}\n")
|
|
return None
|
|
|
|
return found[0] if found else None
|
|
|
|
|
|
def get_image_name(args, config):
|
|
image = config.get("imagename", "gentoo."+args.format)
|
|
if image is None:
|
|
image = "gentoo."+args.format
|
|
return image
|
|
|
|
#
|
|
# def load_config(args):
|
|
# cfg = generatecfg(args)
|
|
# if args.config:
|
|
# override = generatecfg(args, config=args.config)
|
|
# cfg.update(cfgoverride)
|
|
#
|
|
# if cfg.get("portage") is None:
|
|
# cfg['portage'] = portage_from_dir(args.download_dir, filename=args.portage or cfg.get("portage"))
|
|
# if cfg.get("stage3") is None:
|
|
# cfg['stage3'] = stage3_from_dir(args.download_dir, filename=args.stage3 or cfg.get("stage3"))
|
|
#
|
|
# return cfg
|
|
#
|