diff options
Diffstat (limited to 'cobbler/api.py')
-rw-r--r-- | cobbler/api.py | 135 |
1 files changed, 82 insertions, 53 deletions
diff --git a/cobbler/api.py b/cobbler/api.py index 84c2c638..ffc62644 100644 --- a/cobbler/api.py +++ b/cobbler/api.py @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA """ +import yaml import config import utils import action_sync @@ -48,7 +49,8 @@ import logging import time import random import os -import yaml +import xmlrpclib +import traceback ERROR = 100 INFO = 10 @@ -65,7 +67,7 @@ class BootAPI: __shared_state = {} __has_loaded = False - def __init__(self, log_settings={}): + def __init__(self, log_settings={}, is_cobblerd=False): """ Constructor """ @@ -82,6 +84,7 @@ class BootAPI: # level (and remote.py web service level) instead. random.seed() + self.is_cobblerd = is_cobblerd try: self.logger = self.__setup_logger("api") @@ -90,14 +93,16 @@ class BootAPI: # perms_ok is False return - self.logger_remote = self.__setup_logger("remote") + # FIMXE: conslidate into 1 server instance + self.selinux_enabled = utils.is_selinux_enabled() self.dist = utils.check_dist() self.os_version = utils.os_release() self.acl_engine = acls.AclEngine() - + BootAPI.__has_loaded = True + module_loader.load_modules() self._config = config.Config(self) @@ -118,9 +123,10 @@ class BootAPI: self.pxegen = pxegen.PXEGen(self._config) self.logger.debug("API handle initialized") self.perms_ok = True - + + def __setup_logger(self,name): - return utils.setup_logger(name, **self.log_settings) + return utils.setup_logger(name, is_cobblerd=self.is_cobblerd, **self.log_settings) def is_selinux_enabled(self): """ @@ -142,6 +148,28 @@ class BootAPI: return False return True + def _internal_cache_update(self, collection_type, name, remove=False): + """ + Update cobblerd so it won't have to ever reload the config, once started. + """ + # FIXME: take value from settings, use raw port + if self.is_cobblerd: + # don't signal yourself, that's asking for trouble. + return True + self.server = xmlrpclib.Server("http://127.0.0.1:%s" % self.settings().xmlrpc_port) + try: + if not remove: + self.server.internal_cache_update(collection_type, name) + else: + self.server.internal_cache_remove(collection_type, name) + except Exception, e: + if len(e.args) == 2 and e[0] == 111: + # if cobblerd is not running, no harm done, nothing to signal + pass + else: + raise CX("error contacting cobblerd") + return False + def last_modified_time(self): """ Returns the time of the last modification to cobbler, made by any @@ -181,14 +209,16 @@ class BootAPI: version_tuple -- something like [ 1, 3, 2 ] """ fd = open("/var/lib/cobbler/version") - data = yaml.load(fd.read()).next() + ydata = fd.read() fd.close() + data = yaml.load(ydata) if not extended: # for backwards compatibility and use with koan's comparisons elems = data["version_tuple"] + print elems return int(elems[0]) + 0.1*int(elems[1]) + 0.001*int(elems[2]) else: - return data + return data def clear(self): """ @@ -237,14 +267,10 @@ class BootAPI: def update(self): """ - This can be called when you expect a cobbler object - to have changed outside of your API call. It does not - have to be called before read operations but should be - called before write operations depending on the last - modification time. For the local API it is not needed. + This can be called is no longer used by cobbler. + And is here to just avoid breaking older scripts. """ - self.clear() - self.deserialize() + return True def copy_distro(self, ref, newname): self.log("copy_distro",[ref.name, newname]) @@ -266,46 +292,45 @@ class BootAPI: self.log("copy_image",[ref.name, newname]) return self._config.images().copy(ref,newname) - def remove_distro(self, ref, recursive=False): + def remove_distro(self, ref, recursive=False, delete=True, with_triggers=True, ): if type(ref) != str: self.log("remove_distro",[ref.name]) - return self._config.distros().remove(ref.name, recursive=recursive) + return self._config.distros().remove(ref.name, recursive=recursive, with_delete=delete, with_triggers=with_triggers) else: self.log("remove_distro",ref) - return self._config.distros().remove(ref, recursive=recursive) - + return self._config.distros().remove(ref, recursive=recursive, with_delete=delete, with_triggers=with_triggers) - def remove_profile(self,ref, recursive=False): + def remove_profile(self,ref, recursive=False, delete=True, with_triggers=True): if type(ref) != str: self.log("remove_profile",[ref.name]) - return self._config.profiles().remove(ref.name, recursive=recursive) + return self._config.profiles().remove(ref.name, recursive=recursive, with_delete=delete, with_triggers=with_triggers) else: self.log("remove_profile",ref) - return self._config.profiles().remove(ref, recursive=recursive) + return self._config.profiles().remove(ref, recursive=recursive, with_delete=delete, with_triggers=with_triggers) - def remove_system(self, ref, recursive=False): + def remove_system(self, ref, recursive=False, delete=True, with_triggers=True): if type(ref) != str: self.log("remove_system",[ref.name]) - return self._config.systems().remove(ref.name) + return self._config.systems().remove(ref.name, with_delete=delete, with_triggers=with_triggers) else: self.log("remove_system",ref) - return self._config.systems().remove(ref) + return self._config.systems().remove(ref, with_delete=delete, with_triggers=with_triggers) - def remove_repo(self, ref, recursive=False): + def remove_repo(self, ref, recursive=False, delete=True, with_triggers=True): if type(ref) != str: self.log("remove_repo",[ref.name]) - return self._config.repos().remove(ref.name) + return self._config.repos().remove(ref.name, with_delete=delete, with_triggers=with_triggers) else: self.log("remove_repo",ref) - return self._config.repos().remove(ref) + return self._config.repos().remove(ref, with_delete=delete, with_triggers=with_triggers) - def remove_image(self, ref, recursive=False): + def remove_image(self, ref, recursive=False, delete=True, with_triggers=True): if type(ref) != str: self.log("remove_image",[ref.name]) - return self._config.images().remove(ref.name, recursive=recursive) + return self._config.images().remove(ref.name, recursive=recursive, with_delete=delete, with_triggers=with_triggers) else: self.log("remove_image",ref) - return self._config.images().remove(ref, recursive=recursive) + return self._config.images().remove(ref, recursive=recursive, with_delete=delete, with_triggers=with_triggers) def rename_distro(self, ref, newname): self.log("rename_distro",[ref.name,newname]) @@ -347,29 +372,34 @@ class BootAPI: self.log("new_image",[is_subobject]) return self._config.new_image(is_subobject=is_subobject) - def add_distro(self, ref, check_for_duplicate_names=False): + def add_distro(self, ref, check_for_duplicate_names=False, save=True): self.log("add_distro",[ref.name]) - return self._config.distros().add(ref,save=True,check_for_duplicate_names=check_for_duplicate_names) + rc = self._config.distros().add(ref,check_for_duplicate_names=check_for_duplicate_names,save=save) + return rc - def add_profile(self, ref, check_for_duplicate_names=False): + def add_profile(self, ref, check_for_duplicate_names=False,save=True): self.log("add_profile",[ref.name]) - return self._config.profiles().add(ref,save=True,check_for_duplicate_names=check_for_duplicate_names) + rc = self._config.profiles().add(ref,check_for_duplicate_names=check_for_duplicate_names,save=save) + return rc - def add_system(self, ref, check_for_duplicate_names=False, check_for_duplicate_netinfo=False): + def add_system(self, ref, check_for_duplicate_names=False, check_for_duplicate_netinfo=False, save=True): self.log("add_system",[ref.name]) - return self._config.systems().add(ref,save=True,check_for_duplicate_names=check_for_duplicate_names,check_for_duplicate_netinfo=check_for_duplicate_netinfo) + rc = self._config.systems().add(ref,check_for_duplicate_names=check_for_duplicate_names,check_for_duplicate_netinfo=check_for_duplicate_netinfo,save=save) + return rc - def add_repo(self, ref, check_for_duplicate_names=False): + def add_repo(self, ref, check_for_duplicate_names=False,save=True): self.log("add_repo",[ref.name]) - return self._config.repos().add(ref,save=True,check_for_duplicate_names=check_for_duplicate_names) - - def add_image(self, ref, check_for_duplicate_names=False): + rc = self._config.repos().add(ref,check_for_duplicate_names=check_for_duplicate_names,save=save) + return rc + + def add_image(self, ref, check_for_duplicate_names=False,save=True): self.log("add_image",[ref.name]) - return self._config.images().add(ref,save=True,check_for_duplicate_names=check_for_duplicate_names) + rc = self._config.images().add(ref,check_for_duplicate_names=check_for_duplicate_names,save=save) + return rc def find_distro(self, name=None, return_list=False, no_errors=False, **kargs): return self._config.distros().find(name=name, return_list=return_list, no_errors=no_errors, **kargs) - + def find_profile(self, name=None, return_list=False, no_errors=False, **kargs): return self._config.profiles().find(name=name, return_list=return_list, no_errors=no_errors, **kargs) @@ -389,12 +419,11 @@ class BootAPI: results1 = collector() results2 = [] for x in results1: - print "INPUT: %s ACTUAL: %s" % (mtime, x.mtime) if x.mtime == 0 or x.mtime >= mtime: if not collapse: - results2.append(results1) + results2.append(x) else: - results2.append(results1.to_datastruct()) + results2.append(x.to_datastruct()) return results2 def get_distros_since(self,mtime,collapse=False): @@ -511,7 +540,7 @@ class BootAPI: validator = action_validate.Validate(self._config) return validator.run() - def sync(self): + def sync(self,verbose=False): """ Take the values currently written to the configuration files in /etc, and /var, and build out the information tree found in @@ -519,10 +548,10 @@ class BootAPI: saved with serialize() will NOT be synchronized with this command. """ self.log("sync") - sync = self.get_sync() + sync = self.get_sync(verbose=verbose) return sync.run() - def get_sync(self): + def get_sync(self,verbose=False): self.dhcp = self.get_module_from_file( "dhcp", "module", @@ -533,7 +562,7 @@ class BootAPI: "module", "manage_bind" ).get_manager(self._config) - return action_sync.BootSync(self._config,dhcp=self.dhcp,dns=self.dns) + return action_sync.BootSync(self._config,dhcp=self.dhcp,dns=self.dns,verbose=verbose) def reposync(self, name=None, tries=1, nofail=False): """ @@ -646,10 +675,10 @@ class BootAPI: self.log("authorize",[user,resource,arg1,arg2,rc],debug=True) return rc - def build_iso(self,iso=None,profiles=None,systems=None,tempdir=None): + def build_iso(self,iso=None,profiles=None,systems=None,tempdir=None,distro=None,standalone=None,source=None): builder = action_buildiso.BuildIso(self._config) return builder.run( - iso=iso, profiles=profiles, systems=systems, tempdir=tempdir + iso=iso, profiles=profiles, systems=systems, tempdir=tempdir, distro=distro, standalone=standalone, source=source ) def replicate(self, cobbler_master = None, sync_all=False, sync_kickstarts=False, sync_trees=False, sync_repos=False, sync_triggers=False, systems=False): @@ -697,7 +726,7 @@ class BootAPI: Cycles power on a system that has power management configured. """ self.power_off(system, user, password) - time.sleep(1) + time.sleep(5) return self.power_on(system, user, password) def get_os_details(self): |