def hardened(request): """Have fetch expect the default HardeneBSD layout instead.""" freebsd_version = checkoutput(["freebsd-version"]) if "HBSD" in freebsd_version: _hardened = True else: _hardened = False return _hardened
def cli(dataset_type, header, _long, remote, http, plugins, _sort, quick, official): """This passes the arg and calls the jail_datasets function.""" freebsd_version = ioc_common.checkoutput(["freebsd-version"]) iocage = ioc.IOCage(skip_jails=True) if dataset_type is None: dataset_type = "all" if remote and not plugins: if "HBSD" in freebsd_version: hardened = True else: hardened = False _list = iocage.fetch(list=True, remote=True, http=http, hardened=hardened) header = False if plugins and remote: _list = iocage.fetch(list=True, remote=True, header=header, _long=_long, plugin_file=True, official=official) elif not remote: _list = iocage.list(dataset_type, header, _long, _sort, plugin=plugins, quick=quick) if not header: if dataset_type == "base": for item in _list: ioc_common.logit({"level": "INFO", "message": item}) else: for item in _list: if remote and not plugins: ioc_common.logit({"level": "INFO", "message": item}) else: ioc_common.logit({ "level": "INFO", "message": "\t".join(item) }) else: ioc_common.logit({"level": "INFO", "message": _list})
def cli(dataset_type, header, _long, remote, http, plugins, _sort, quick, official): """This passes the arg and calls the jail_datasets function.""" freebsd_version = ioc_common.checkoutput(["freebsd-version"]) iocage = ioc.IOCage(skip_jails=True) if dataset_type is None: dataset_type = "all" if remote and not plugins: if "HBSD" in freebsd_version: hardened = True else: hardened = False _list = iocage.fetch( list=True, remote=True, http=http, hardened=hardened) header = False if plugins and remote: _list = iocage.fetch( list=True, remote=True, header=header, _long=_long, plugin_file=True, official=official) elif not remote: _list = iocage.list( dataset_type, header, _long, _sort, plugin=plugins, quick=quick) if not header: if dataset_type == "base": for item in _list: ioc_common.logit({"level": "INFO", "message": item}) else: for item in _list: if remote and not plugins: ioc_common.logit({"level": "INFO", "message": item}) else: ioc_common.logit({ "level": "INFO", "message": "\t".join(item) }) else: ioc_common.logit({"level": "INFO", "message": _list})
def cli(force, delete): """Migrates all the iocage_legacy develop basejails to clone jails.""" # TODO: Move to API jails = ioc_list.IOCList("uuid").list_datasets() if not force: ioc_common.logit({ "level": "WARNING", "message": "\nThis will migrate ALL iocage-legacy develop" " basejails to clonejails, it can take a long" " time!\nPlease make sure you are not running" " this on iocage-legacy 1.7.6 basejails." }) if not click.confirm("\nAre you sure?"): exit() for uuid, path in jails.items(): pool = ioc_json.IOCJson().json_get_value("pool") iocroot = ioc_json.IOCJson(pool).json_get_value("iocroot") jail = f"{pool}/iocage/jails/{uuid}" jail_old = f"{pool}/iocage/jails_old/{uuid}" conf = ioc_json.IOCJson(path).json_load() try: tag = conf["tag"] except KeyError: # These are actually NEW jails. continue release = conf["cloned_release"] if conf["type"] == "basejail": try: ioc_common.checkoutput(["zfs", "rename", "-p", jail, jail_old], stderr=su.STDOUT) except su.CalledProcessError as err: ioc_common.logit({ "level": "EXCEPTION", "message": f"{err.output.decode('utf-8').strip()}" }) try: os.remove(f"{iocroot}/tags/{tag}") except OSError: pass date_fmt_legacy = "%Y-%m-%d@%H:%M:%S" # We don't want to rename datasets to a bunch of dates. try: datetime.datetime.strptime(tag, date_fmt_legacy) _name = str(uuid.uuid4()) except ValueError: # They already named this jail, making it like our new ones. _name = tag new_uuid = ioc_create.IOCCreate( release, "", 0, None, migrate=True, config=conf, silent=True, uuid=_name, ).create_jail() new_prop = ioc_json.IOCJson(f"{iocroot}/jails/{new_uuid}", silent=True).json_set_value new_prop(f"host_hostname={new_uuid}") new_prop(f"host_hostuuid={new_uuid}") new_prop("type=jail") new_prop(f"jail_zfs_dataset={iocroot}/jails/{new_uuid}/data") ioc_common.logit({ "level": "INFO", "message": f"Copying files for {new_uuid}, please wait..." }) ioc_common.copytree(f"{iocroot}/jails_old/{uuid}/root", f"{iocroot}/jails/{new_uuid}/root", symlinks=True) shutil.copy(f"{iocroot}/jails_old/{uuid}/fstab", f"{iocroot}/jails/{new_uuid}/fstab") for line in fileinput.input( f"{iocroot}/jails/{new_uuid}/root/etc/" "rc.conf", inplace=1): print( line.replace(f'hostname="{uuid}"', f'hostname="{new_uuid}"').rstrip()) if delete: try: ioc_common.checkoutput( ["zfs", "destroy", "-r", "-f", jail_old], stderr=su.STDOUT) except su.CalledProcessError as err: raise RuntimeError( f"{err.output.decode('utf-8').rstrip()}") try: su.check_call([ "zfs", "destroy", "-r", "-f", f"{pool}/iocage/jails_old" ]) except su.CalledProcessError: # We just want the top level dataset gone, no big deal. pass ioc_common.logit({ "level": "INFO", "message": f"{uuid} ({tag}) migrated to {new_uuid}!\n" })
def cli(force, delete): """Migrates all the iocage_legacy develop basejails to clone jails.""" # TODO: Move to API jails = ioc_list.IOCList("uuid").list_datasets() if not force: ioc_common.logit({ "level": "WARNING", "message": "\nThis will migrate ALL iocage-legacy develop" " basejails to clonejails, it can take a long" " time!\nPlease make sure you are not running" " this on iocage-legacy 1.7.6 basejails." }) if not click.confirm("\nAre you sure?"): exit() for uuid, path in jails.items(): pool = ioc_json.IOCJson().json_get_value("pool") iocroot = ioc_json.IOCJson(pool).json_get_value("iocroot") jail = f"{pool}/iocage/jails/{uuid}" jail_old = f"{pool}/iocage/jails_old/{uuid}" conf = ioc_json.IOCJson(path).json_get_value('all') try: tag = conf["tag"] except KeyError: # These are actually NEW jails. continue release = conf["cloned_release"] if conf["type"] == "basejail": try: ioc_common.checkoutput( ["zfs", "rename", "-p", jail, jail_old], stderr=su.STDOUT) except su.CalledProcessError as err: ioc_common.logit( { "level": "EXCEPTION", "message": f"{err.output.decode('utf-8').strip()}" }) try: os.remove(f"{iocroot}/tags/{tag}") except OSError: pass date_fmt_legacy = "%Y-%m-%d@%H:%M:%S" # We don't want to rename datasets to a bunch of dates. try: datetime.datetime.strptime(tag, date_fmt_legacy) _name = str(uuid.uuid4()) except ValueError: # They already named this jail, making it like our new ones. _name = tag new_uuid = ioc_create.IOCCreate( release, "", 0, None, migrate=True, config=conf, silent=True, uuid=_name, ).create_jail() new_prop = ioc_json.IOCJson( f"{iocroot}/jails/{new_uuid}", silent=True).json_set_value new_prop(f"host_hostname={new_uuid}") new_prop(f"host_hostuuid={new_uuid}") new_prop("type=jail") new_prop(f"jail_zfs_dataset={iocroot}/jails/{new_uuid}/data") ioc_common.logit({ "level": "INFO", "message": f"Copying files for {new_uuid}, please wait..." }) ioc_common.copytree( f"{iocroot}/jails_old/{uuid}/root", f"{iocroot}/jails/{new_uuid}/root", symlinks=True) shutil.copy(f"{iocroot}/jails_old/{uuid}/fstab", f"{iocroot}/jails/{new_uuid}/fstab") for line in fileinput.input( f"{iocroot}/jails/{new_uuid}/root/etc/" "rc.conf", inplace=1): print( line.replace(f'hostname="{uuid}"', f'hostname="{new_uuid}"').rstrip()) if delete: try: ioc_common.checkoutput( ["zfs", "destroy", "-r", "-f", jail_old], stderr=su.STDOUT) except su.CalledProcessError as err: raise RuntimeError( f"{err.output.decode('utf-8').rstrip()}") try: su.check_call([ "zfs", "destroy", "-r", "-f", f"{pool}/iocage/jails_old" ]) except su.CalledProcessError: # We just want the top level dataset gone, no big deal. pass ioc_common.logit({ "level": "INFO", "message": f"{uuid} ({tag}) migrated to {new_uuid}!\n" })