Source code for cobbler.actions.litesync

"""
Running small pieces of cobbler sync when certain actions are taken,
such that we don't need a time consuming sync when adding new
systems if nothing has changed for systems that have already
been created.
"""

from builtins import object
import os
import os.path

from cobbler import clogger
from cobbler import module_loader
from cobbler import utils


[docs]class CobblerLiteSync(object): """ Handles conversion of internal state to the tftpboot tree layout """ def __init__(self, collection_mgr, verbose=False, logger=None): """ Constructor """ self.verbose = verbose self.collection_mgr = collection_mgr self.distros = collection_mgr.distros() self.profiles = collection_mgr.profiles() self.systems = collection_mgr.systems() self.images = collection_mgr.images() self.settings = collection_mgr.settings() self.repos = collection_mgr.repos() if logger is None: logger = clogger.Logger() self.logger = logger self.tftpd = module_loader.get_module_from_file("tftpd", "module", "in_tftpd").get_manager(collection_mgr, logger) self.sync = collection_mgr.api.get_sync(verbose, logger=self.logger) self.sync.make_tftpboot()
[docs] def add_single_distro(self, name): # get the distro record distro = self.distros.find(name=name) if distro is None: return # copy image files to images/$name in webdir & tftpboot: self.sync.tftpgen.copy_single_distro_files(distro, self.settings.webdir, True) self.tftpd.add_single_distro(distro) # create the symlink for this distro src_dir = utils.find_distro_path(self.settings, distro) dst_dir = os.path.join(self.settings.webdir, "links", name) if os.path.exists(dst_dir): self.logger.warning("skipping symlink, destination (%s) exists" % dst_dir) elif utils.path_tail(os.path.join(self.settings.webdir, "distro_mirror"), src_dir) == "": self.logger.warning("skipping symlink, the source (%s) is not in %s" % (src_dir, os.path.join(self.settings.webdir, "distro_mirror"))) else: try: self.logger.info("trying symlink %s -> %s" % (src_dir, dst_dir)) os.symlink(src_dir, dst_dir) except (IOError, OSError): self.logger.error("symlink failed (%s -> %s)" % (src_dir, dst_dir)) # generate any templates listed in the distro self.sync.tftpgen.write_templates(distro, write_file=True) # cascade sync kids = distro.get_children() for k in kids: self.add_single_profile(k.name, rebuild_menu=False) self.sync.tftpgen.make_pxe_menu()
[docs] def add_single_image(self, name): image = self.images.find(name=name) self.sync.tftpgen.copy_single_image_files(image) kids = image.get_children() for k in kids: self.add_single_system(k.name) self.sync.tftpgen.make_pxe_menu()
[docs] def remove_single_distro(self, name): bootloc = self.settings.tftpboot_location # delete contents of images/$name directory in webdir utils.rmtree(os.path.join(self.settings.webdir, "images", name)) # delete contents of images/$name in tftpboot utils.rmtree(os.path.join(bootloc, "images", name)) # delete potential symlink to tree in webdir/links utils.rmfile(os.path.join(self.settings.webdir, "links", name))
[docs] def remove_single_image(self, name): bootloc = self.settings.tftpboot_location utils.rmfile(os.path.join(bootloc, "images2", name))
[docs] def add_single_profile(self, name, rebuild_menu=True): # get the profile object: profile = self.profiles.find(name=name) if profile is None: # most likely a subprofile's kid has been # removed already, though the object tree has # not been reloaded ... and this is just noise. return # rebuild the yum configuration files for any attached repos # generate any templates listed in the distro self.sync.tftpgen.write_templates(profile) # cascade sync kids = profile.get_children() for k in kids: if k.COLLECTION_TYPE == "profile": self.add_single_profile(k.name, rebuild_menu=False) else: self.add_single_system(k.name) if rebuild_menu: self.sync.tftpgen.make_pxe_menu() return True
[docs] def remove_single_profile(self, name, rebuild_menu=True): # delete profiles/$name file in webdir utils.rmfile(os.path.join(self.settings.webdir, "profiles", name)) # delete contents on autoinstalls/$name directory in webdir utils.rmtree(os.path.join(self.settings.webdir, "autoinstalls", name)) if rebuild_menu: self.sync.tftpgen.make_pxe_menu()
[docs] def update_system_netboot_status(self, name): self.tftpd.update_netboot(name)
[docs] def add_single_system(self, name): # get the system object: system = self.systems.find(name=name) if system is None: return # rebuild system_list file in webdir if self.settings.manage_dhcp: self.sync.dhcp.regen_ethers() if self.settings.manage_dns: self.sync.dns.regen_hosts() # write the PXE files for the system self.tftpd.add_single_system(system)
[docs] def remove_single_system(self, name): bootloc = self.settings.tftpboot_location # delete contents of autoinsts_sys/$name in webdir system_record = self.systems.find(name=name) for (name, interface) in list(system_record.interfaces.items()): filename = system_record.get_config_filename(interface=name) utils.rmfile(os.path.join(bootloc, "pxelinux.cfg", filename)) utils.rmfile(os.path.join(bootloc, "grub", filename.upper()))