From 4b802815f0646a9d25a5e71a04acae7a0d8bb3fa Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 21 Mar 2013 16:22:47 -0400 Subject: fixed various debugging bits --- src/lib/Bcfg2/Reporting/Transport/LocalFilesystem.py | 6 ++++-- src/lib/Bcfg2/Server/Core.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Reporting/Transport/LocalFilesystem.py b/src/lib/Bcfg2/Reporting/Transport/LocalFilesystem.py index 30ea39263..0a0f032e5 100644 --- a/src/lib/Bcfg2/Reporting/Transport/LocalFilesystem.py +++ b/src/lib/Bcfg2/Reporting/Transport/LocalFilesystem.py @@ -36,7 +36,8 @@ class LocalFilesystem(TransportBase): def set_debug(self, debug): rv = TransportBase.set_debug(self, debug) - self.fmon.set_debug(debug) + if self.fmon is not None: + self.fmon.set_debug(debug) return rv def start_monitor(self, collector): @@ -48,7 +49,8 @@ class LocalFilesystem(TransportBase): self.logger.error("File monitor driver %s not available; " "forcing to default" % setup['filemonitor']) fmon = Bcfg2.Server.FileMonitor.available['default'] - + if self.debug_flag: + self.fmon.set_debug(self.debug_flag) try: self.fmon = fmon(debug=self.debug_flag) self.logger.info("Using the %s file monitor" % diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py index 06dfe7f25..56b50a872 100644 --- a/src/lib/Bcfg2/Server/Core.py +++ b/src/lib/Bcfg2/Server/Core.py @@ -1214,7 +1214,7 @@ class BaseCore(object): for plugin in self.plugins.values(): plugin.set_debug(debug) rv = self.set_core_debug(address, debug) - return self.set_fam_debug(address, debug) and rv + return self.fam.set_debug(address, debug) and rv @exposed def set_core_debug(self, _, debug): -- cgit v1.2.3-1-g7c22 From 8caa8c053a59a3db31a0816ad5d27e0cb4e2919c Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 21 Mar 2013 16:26:13 -0400 Subject: more debugging fixes --- src/lib/Bcfg2/Server/Core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py index 56b50a872..ff6cbb14b 100644 --- a/src/lib/Bcfg2/Server/Core.py +++ b/src/lib/Bcfg2/Server/Core.py @@ -1214,7 +1214,7 @@ class BaseCore(object): for plugin in self.plugins.values(): plugin.set_debug(debug) rv = self.set_core_debug(address, debug) - return self.fam.set_debug(address, debug) and rv + return self.fam.set_debug(debug) and rv @exposed def set_core_debug(self, _, debug): -- cgit v1.2.3-1-g7c22 From 21fa4606719825cf2b669dd5f5adbde501f89dfc Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Thu, 21 Mar 2013 16:31:20 -0500 Subject: APT: Prevent traceback for missing packages Signed-off-by: Sol Jerome --- src/lib/Bcfg2/Client/Tools/APT.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Client/Tools/APT.py b/src/lib/Bcfg2/Client/Tools/APT.py index 0cdefa613..39816403a 100644 --- a/src/lib/Bcfg2/Client/Tools/APT.py +++ b/src/lib/Bcfg2/Client/Tools/APT.py @@ -228,8 +228,13 @@ class APT(Bcfg2.Client.Tools.Tool): continue if pkg.get('version') in ['auto', 'any']: if self._newapi: - ipkgs.append("%s=%s" % (pkg.get('name'), - self.pkg_cache[pkg.get('name')].candidate.version)) + try: + ipkgs.append("%s=%s" % (pkg.get('name'), + self.pkg_cache[pkg.get('name')].candidate.version)) + except AttributeError: + self.logger.error("Failed to find %s in apt package cache" % + pkg.get('name')) + continue else: ipkgs.append("%s=%s" % (pkg.get('name'), self.pkg_cache[pkg.get('name')].candidateVersion)) -- cgit v1.2.3-1-g7c22 From ff8ab8237b0ee72cc5f5936231fdd7d0863138ed Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Thu, 21 Mar 2013 17:52:53 -0400 Subject: Client: fix some OSError tracebacks from commands not found --- src/lib/Bcfg2/Client/Tools/Portage.py | 8 ++++++-- src/lib/Bcfg2/Client/Tools/RcUpdate.py | 12 ++++++------ src/lib/Bcfg2/Utils.py | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Client/Tools/Portage.py b/src/lib/Bcfg2/Client/Tools/Portage.py index 6cbcff2e0..d4373c299 100644 --- a/src/lib/Bcfg2/Client/Tools/Portage.py +++ b/src/lib/Bcfg2/Client/Tools/Portage.py @@ -29,7 +29,10 @@ class Portage(Bcfg2.Client.Tools.PkgTool): self._binpkgonly = self.setup.get('portage_binpkgonly', False) if self._binpkgonly: self.pkgtool = self._binpkgtool - self.RefreshPackages() + try: + self.RefreshPackages() + except OSError: + raise Bcfg2.Client.Tools.ToolInstantiationError("equery not found") def RefreshPackages(self): """Refresh memory hashes of packages.""" @@ -37,7 +40,8 @@ class Portage(Bcfg2.Client.Tools.PkgTool): return self.logger.info('Getting list of installed packages') self.installed = {} - for pkg in self.cmd.run("equery -q list '*'").stdout.splitlines(): + for pkg in self.cmd.run(["equery", "-q", + "list", "*"]).stdout.splitlines(): if self._pkg_pattern.match(pkg): name = self._pkg_pattern.match(pkg).group(1) version = self._pkg_pattern.match(pkg).group(2) diff --git a/src/lib/Bcfg2/Client/Tools/RcUpdate.py b/src/lib/Bcfg2/Client/Tools/RcUpdate.py index 2e58f2564..552b27842 100644 --- a/src/lib/Bcfg2/Client/Tools/RcUpdate.py +++ b/src/lib/Bcfg2/Client/Tools/RcUpdate.py @@ -22,8 +22,8 @@ class RcUpdate(Bcfg2.Client.Tools.SvcTool): return True # check if service is enabled - cmd = '/sbin/rc-update show default | grep %s' - is_enabled = self.cmd.run(cmd % entry.get('name')).success + result = self.cmd.run(["/sbin/rc-update", "show", "default"]) + is_enabled = entry.get("name") in result.stdout # check if init script exists try: @@ -34,8 +34,8 @@ class RcUpdate(Bcfg2.Client.Tools.SvcTool): return False # check if service is enabled - cmd = '/etc/init.d/%s status | grep started' - is_running = self.cmd.run(cmd % entry.attrib['name']).success + result = self.cmd.run(self.get_svc_command(entry, "status")) + is_running = "started" in result.stdout if entry.get('status') == 'on' and not (is_enabled and is_running): entry.set('current_status', 'off') @@ -70,9 +70,9 @@ class RcUpdate(Bcfg2.Client.Tools.SvcTool): def FindExtra(self): """Locate extra rc-update services.""" - cmd = '/bin/rc-status -s' allsrv = [line.split()[0] - for line in self.cmd.run(cmd).stdout.splitlines() + for line in self.cmd.run(['/bin/rc-status', + '-s']).stdout.splitlines() if 'started' in line] self.logger.debug('Found active services:') self.logger.debug(allsrv) diff --git a/src/lib/Bcfg2/Utils.py b/src/lib/Bcfg2/Utils.py index 7d7d26d5d..4e2deb92e 100644 --- a/src/lib/Bcfg2/Utils.py +++ b/src/lib/Bcfg2/Utils.py @@ -197,7 +197,7 @@ class Executor(object): :type timeout: float :returns: :class:`Bcfg2.Utils.ExecutorResult` """ - if isinstance(command, str): + if isinstance(command, basestring): cmdstr = command else: cmdstr = " ".join(command) -- cgit v1.2.3-1-g7c22 From c82d16cde57b107d5a1a3328d2799c4e24b79728 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 08:38:40 -0400 Subject: SvcTool: Fix generic check_service to handle missing service commands --- src/lib/Bcfg2/Client/Tools/__init__.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Client/Tools/__init__.py b/src/lib/Bcfg2/Client/Tools/__init__.py index 27ca92472..e87d6e1d9 100644 --- a/src/lib/Bcfg2/Client/Tools/__init__.py +++ b/src/lib/Bcfg2/Client/Tools/__init__.py @@ -561,7 +561,10 @@ class SvcTool(Tool): :returns: bool - True if the status command returned 0, False otherwise """ - return bool(self.cmd.run(self.get_svc_command(service, 'status'))) + try: + return bool(self.cmd.run(self.get_svc_command(service, 'status'))) + except OSError: + return False def Remove(self, services): if self.setup['servicemode'] != 'disabled': -- cgit v1.2.3-1-g7c22 From eaf951368889133c7298bd05254885d324aed3b1 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 08:41:40 -0400 Subject: bcfg2-info: made packageresolve use code from Packages instead of reinventing the wheel --- src/sbin/bcfg2-info | 29 ++++++++++++++++------------- 1 file changed, 16 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info index 311784606..5bbe5b43b 100755 --- a/src/sbin/bcfg2-info +++ b/src/sbin/bcfg2-info @@ -641,21 +641,24 @@ Bcfg2 client itself.""") if 'Packages' not in self.plugins: print("Packages plugin not enabled") return + self.plugins['Packages'].toggle_debug() + + indep = lxml.etree.Element("Independent") + structures = [lxml.etree.Element("Bundle", name="packages")] + for arg in arglist[1:]: + lxml.etree.SubElement(structures[0], "Package", name=arg) + hostname = arglist[0] - initial = arglist[1:] metadata = self.build_metadata(hostname) - self.plugins['Packages'].toggle_debug() - collection = self.plugins['Packages'].get_collection(metadata) - packages, unknown = collection.complete(initial) - newpkgs = list(packages.difference(initial)) - print("%d initial packages" % len(initial)) - print(" %s" % "\n ".join(initial)) - print("%d new packages added" % len(newpkgs)) - if newpkgs: - print(" %s" % "\n ".join(newpkgs)) - print("%d unknown packages" % len(unknown)) - if unknown: - print(" %s" % "\n ".join(unknown)) + + # pylint: disable=W0212 + self.plugins['Packages']._build_packages(metadata, indep, structures) + # pylint: enable=W0212 + + print("%d new packages added" % len(indep.getchildren())) + if len(indep.getchildren()): + print(" %s" % "\n ".join(lxml.etree.tostring(p) + for p in indep.getchildren())) def do_packagesources(self, args): """ packagesources - Show package sources """ -- cgit v1.2.3-1-g7c22 From 1d03e5254a66b5092d8679d3bef061bf4d542b2e Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 08:42:13 -0400 Subject: Logger: set log handler names in a py <2.6 compatible way --- src/lib/Bcfg2/Logger.py | 15 ++++++++++++--- src/lib/Bcfg2/Server/Core.py | 5 ++--- 2 files changed, 14 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Logger.py b/src/lib/Bcfg2/Logger.py index 8f7bb14f8..5bbc9ff96 100644 --- a/src/lib/Bcfg2/Logger.py +++ b/src/lib/Bcfg2/Logger.py @@ -143,7 +143,10 @@ def add_console_handler(level=logging.DEBUG): console.setLevel(level) # tell the handler to use this format console.setFormatter(TermiosFormatter()) - console.set_name("console") + try: + console.set_name("console") + except AttributeError: + console.name = "console" logging.root.addHandler(console) @@ -158,7 +161,10 @@ def add_syslog_handler(procname, syslog_facility, level=logging.DEBUG): syslog = FragmentingSysLogHandler(procname, ('localhost', 514), syslog_facility) - syslog.set_name("syslog") + try: + syslog.set_name("syslog") + except AttributeError: + syslog.name = "syslog" syslog.setLevel(level) syslog.setFormatter( logging.Formatter('%(name)s[%(process)d]: %(message)s')) @@ -172,7 +178,10 @@ def add_syslog_handler(procname, syslog_facility, level=logging.DEBUG): def add_file_handler(to_file, level=logging.DEBUG): """Add a logging handler that logs to to_file.""" filelog = logging.FileHandler(to_file) - filelog.set_name("file") + try: + filelog.set_name("file") + except AttributeError: + filelog.name = "file" filelog.setLevel(level) filelog.setFormatter( logging.Formatter('%(asctime)s %(name)s[%(process)d]: %(message)s')) diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py index ff6cbb14b..382f11e50 100644 --- a/src/lib/Bcfg2/Server/Core.py +++ b/src/lib/Bcfg2/Server/Core.py @@ -1232,10 +1232,9 @@ class BaseCore(object): self.logger.info("Core: debug = %s" % debug) levels = self._loglevels[self.debug_flag] for handler in logging.root.handlers: - level = levels.get(handler.get_name(), levels['default']) + level = levels.get(handler.name, levels['default']) self.logger.debug("Setting %s log handler to %s" % - (handler.get_name(), - logging.getLevelName(level))) + (handler.name, logging.getLevelName(level))) handler.setLevel(level) return self.debug_flag -- cgit v1.2.3-1-g7c22 From 9444a7f8e7f304b05a979675d2e9b2c71757f9d2 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 08:57:28 -0400 Subject: doc: write and use proper sphinx docs for MetadataQuery/ClientMetadata classes --- src/lib/Bcfg2/Server/Plugins/Metadata.py | 115 ++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Server/Plugins/Metadata.py b/src/lib/Bcfg2/Server/Plugins/Metadata.py index a81139b5d..8fb3a0998 100644 --- a/src/lib/Bcfg2/Server/Plugins/Metadata.py +++ b/src/lib/Bcfg2/Server/Plugins/Metadata.py @@ -264,31 +264,63 @@ class ClientMetadata(object): # pylint: disable=R0913 def __init__(self, client, profile, groups, bundles, aliases, addresses, categories, uuid, password, version, query): + #: The client hostname (as a string) self.hostname = client + + #: The client profile (as a string) self.profile = profile + + #: The set of all bundles this client gets self.bundles = bundles + + #: A list of all client aliases self.aliases = aliases + + #: A list of all addresses this client is known by self.addresses = addresses + + #: A list of groups this client is a member of self.groups = groups + + #: A dict of categories of this client's groups. Keys are + #: category names, values are corresponding group names. self.categories = categories + + #: The UUID identifier for this client self.uuid = uuid + + #: The Bcfg2 password for this client self.password = password + + #: Connector plugins known to this client self.connectors = [] + + #: The version of the Bcfg2 client this client is running, as + #: a string self.version = version try: + #: The version of the Bcfg2 client this client is running, + #: as a :class:`Bcfg2.version.Bcfg2VersionInfo` object. self.version_info = Bcfg2VersionInfo(version) except (ValueError, AttributeError): self.version_info = None + + #: A :class:`Bcfg2.Server.Plugins.Metadata.MetadataQuery` + #: object for this client. self.query = query # pylint: enable=R0913 def inGroup(self, group): - """Test to see if client is a member of group.""" + """Test to see if client is a member of group. + + :returns: bool """ return group in self.groups def group_in_category(self, category): - """ return the group in the given category that the client is - a member of, or the empty string """ + """ Return the group in the given category that the client is + a member of, or an empty string. + + :returns: string """ for grp in self.query.all_groups_in_category(category): if grp in self.groups: return grp @@ -296,17 +328,59 @@ class ClientMetadata(object): class MetadataQuery(object): - """ object supplied to client metadata to allow client metadata - objects to query metadata without being able to modify it """ + """ This class provides query methods for the metadata of all + clients known to the Bcfg2 server, without being able to modify + that data. + + Note that ``*by_groups()`` and ``*by_profiles()`` behave + differently; for a client to be included in the return value of a + ``*by_groups()`` method, it must be a member of *all* groups + listed in the argument; for a client to be included in the return + value of a ``*by_profiles()`` method, it must have *any* group + listed as its profile group. """ def __init__(self, by_name, get_clients, by_groups, by_profiles, all_groups, all_groups_in_category): - # resolver is set later + #: Get :class:`Bcfg2.Server.Plugins.Metadata.ClientMetadata` + #: object for the given hostname. + #: + #: :returns: Bcfg2.Server.Plugins.Metadata.ClientMetadata self.by_name = by_name + + #: Get a list of hostnames of clients that are in all given + #: groups. + #: + #: :param groups: The groups to check clients for membership in + #: :type groups: list + #: + #: :returns: list of strings self.names_by_groups = self._warn_string(by_groups) + + #: Get a list of hostnames of clients whose profile matches + #: any given profile group. + #: + #: :param profiles: The profiles to check clients for + #: membership in. + #: :type profiles: list + #: :returns: list of strings self.names_by_profiles = self._warn_string(by_profiles) + + #: Get all known client hostnames. + #: + #: :returns: list of strings self.all_clients = get_clients + + #: Get all known group names. + #: + #: :returns: list of strings self.all_groups = all_groups + + #: Get the names of all groups in the given category. + #: + #: :param category: The category to query for groups that + #: belong to it. + #: :type category: string + #: :returns: list of strings self.all_groups_in_category = all_groups_in_category def _warn_string(self, func): @@ -327,22 +401,41 @@ class MetadataQuery(object): return inner def by_groups(self, groups): - """ get a list of ClientMetadata objects that are in all given - groups """ + """ Get a list of + :class:`Bcfg2.Server.Plugins.Metadata.ClientMetadata` objects + that are in all given groups. + + :param groups: The groups to check clients for membership in. + :type groups: list + :returns: list of Bcfg2.Server.Plugins.Metadata.ClientMetadata + objects + """ # don't need to decorate this with _warn_string because # names_by_groups is decorated return [self.by_name(name) for name in self.names_by_groups(groups)] def by_profiles(self, profiles): - """ get a list of ClientMetadata objects that are in any of - the given profiles """ + """ Get a list of + :class:`Bcfg2.Server.Plugins.Metadata.ClientMetadata` objects + that have any of the given groups as their profile. + + :param profiles: The profiles to check clients for membership + in. + :type profiles: list + :returns: list of Bcfg2.Server.Plugins.Metadata.ClientMetadata + objects + """ # don't need to decorate this with _warn_string because # names_by_profiles is decorated return [self.by_name(name) for name in self.names_by_profiles(profiles)] def all(self): - """ get a list of all ClientMetadata objects """ + """ Get a list of all + :class:`Bcfg2.Server.Plugins.Metadata.ClientMetadata` objects. + + :returns: list of Bcfg2.Server.Plugins.Metadata.ClientMetadata + """ return [self.by_name(name) for name in self.all_clients()] -- cgit v1.2.3-1-g7c22 From a906ebbd96cf3a022b489cc2c6aa1136e3c35af2 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 09:05:16 -0400 Subject: Executor: handle missing commands in a more backwards-compatible way --- src/lib/Bcfg2/Client/Tools/Portage.py | 5 +---- src/lib/Bcfg2/Client/Tools/__init__.py | 5 +---- src/lib/Bcfg2/Utils.py | 12 +++++++++--- 3 files changed, 11 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Client/Tools/Portage.py b/src/lib/Bcfg2/Client/Tools/Portage.py index d4373c299..6b38d7dec 100644 --- a/src/lib/Bcfg2/Client/Tools/Portage.py +++ b/src/lib/Bcfg2/Client/Tools/Portage.py @@ -29,10 +29,7 @@ class Portage(Bcfg2.Client.Tools.PkgTool): self._binpkgonly = self.setup.get('portage_binpkgonly', False) if self._binpkgonly: self.pkgtool = self._binpkgtool - try: - self.RefreshPackages() - except OSError: - raise Bcfg2.Client.Tools.ToolInstantiationError("equery not found") + self.RefreshPackages() def RefreshPackages(self): """Refresh memory hashes of packages.""" diff --git a/src/lib/Bcfg2/Client/Tools/__init__.py b/src/lib/Bcfg2/Client/Tools/__init__.py index e87d6e1d9..48fbbed52 100644 --- a/src/lib/Bcfg2/Client/Tools/__init__.py +++ b/src/lib/Bcfg2/Client/Tools/__init__.py @@ -561,10 +561,7 @@ class SvcTool(Tool): :returns: bool - True if the status command returned 0, False otherwise """ - try: - return bool(self.cmd.run(self.get_svc_command(service, 'status'))) - except OSError: - return False + return self.cmd.run(self.get_svc_command(service, 'status')).success def Remove(self, services): if self.setup['servicemode'] != 'disabled': diff --git a/src/lib/Bcfg2/Utils.py b/src/lib/Bcfg2/Utils.py index 4e2deb92e..33da8bd71 100644 --- a/src/lib/Bcfg2/Utils.py +++ b/src/lib/Bcfg2/Utils.py @@ -202,9 +202,15 @@ class Executor(object): else: cmdstr = " ".join(command) self.logger.debug("Running: %s" % cmdstr) - proc = subprocess.Popen(command, shell=shell, bufsize=16384, - stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, close_fds=True) + try: + proc = subprocess.Popen(command, shell=shell, bufsize=16384, + close_fds=True, + stdin=subprocess.PIPE, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + except OSError: + return ExecutorResult('', 'No such command: %s' % cmdstr, + 127) if timeout is None: timeout = self.timeout if timeout is not None: -- cgit v1.2.3-1-g7c22 From aa9c78201cdba651b5e8c8ebbbdb66f4153dbe72 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 09:34:01 -0400 Subject: XMLFileBacked: fixed XInclude Clear out "extras" when each event is handled to ensure that we start fresh. Failure to do so prevents the wildcard XInclude munging to work, so the first time an event is processed everything is fine; but when subsequent events are processed, _follow_xincludes() thinks that each xinclude tag has already been munged and only removes it. --- src/lib/Bcfg2/Server/Plugin/helpers.py | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/lib/Bcfg2/Server/Plugin/helpers.py b/src/lib/Bcfg2/Server/Plugin/helpers.py index c2252f956..0b81077a3 100644 --- a/src/lib/Bcfg2/Server/Plugin/helpers.py +++ b/src/lib/Bcfg2/Server/Plugin/helpers.py @@ -543,6 +543,7 @@ class XMLFileBacked(FileBacked): def Index(self): self.xdata = lxml.etree.XML(self.data, base_url=self.name, parser=Bcfg2.Server.XMLParser) + self.extras = [] self._follow_xincludes() if self.extras: try: -- cgit v1.2.3-1-g7c22 From 26567899f7095e9404254d1430f1d87456d3fb41 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 09:37:48 -0400 Subject: SvcTool: fixed some docstrings, code with new Executor --- src/lib/Bcfg2/Client/Tools/__init__.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Client/Tools/__init__.py b/src/lib/Bcfg2/Client/Tools/__init__.py index 48fbbed52..c5a5ee4d6 100644 --- a/src/lib/Bcfg2/Client/Tools/__init__.py +++ b/src/lib/Bcfg2/Client/Tools/__init__.py @@ -524,8 +524,8 @@ class SvcTool(Tool): :param service: The service entry to modify :type service: lxml.etree._Element - :returns: tuple - The return value from - :class:`Bcfg2.Client.Tools.Executor.run` + :returns: Bcfg2.Utils.ExecutorResult - The return value from + :class:`Bcfg2.Utils.Executor.run` """ self.logger.debug('Starting service %s' % service.get('name')) return self.cmd.run(self.get_svc_command(service, 'start')) @@ -535,8 +535,8 @@ class SvcTool(Tool): :param service: The service entry to modify :type service: lxml.etree._Element - :returns: tuple - The return value from - :class:`Bcfg2.Client.Tools.Executor.run` + :returns: Bcfg2.Utils.ExecutorResult - The return value from + :class:`Bcfg2.Utils.Executor.run` """ self.logger.debug('Stopping service %s' % service.get('name')) return self.cmd.run(self.get_svc_command(service, 'stop')) @@ -546,8 +546,8 @@ class SvcTool(Tool): :param service: The service entry to modify :type service: lxml.etree._Element - :returns: tuple - The return value from - :class:`Bcfg2.Client.Tools.Executor.run` + :returns: Bcfg2.Utils.ExecutorResult - The return value from + :class:`Bcfg2.Utils.Executor.run` """ self.logger.debug('Restarting service %s' % service.get('name')) restart_target = service.get('target', 'restart') @@ -561,7 +561,7 @@ class SvcTool(Tool): :returns: bool - True if the status command returned 0, False otherwise """ - return self.cmd.run(self.get_svc_command(service, 'status')).success + return bool(self.cmd.run(self.get_svc_command(service, 'status'))) def Remove(self, services): if self.setup['servicemode'] != 'disabled': -- cgit v1.2.3-1-g7c22 From 84cdfc50da10ff57f896e051b3bfdfa3ae52ffa8 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Fri, 22 Mar 2013 11:13:10 -0400 Subject: bcfg2-info: fixed building help message on 2.4 (from Michael Fenn) --- src/sbin/bcfg2-info | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/sbin/bcfg2-info b/src/sbin/bcfg2-info index 5bbe5b43b..cfcc95be2 100755 --- a/src/sbin/bcfg2-info +++ b/src/sbin/bcfg2-info @@ -736,10 +736,13 @@ def build_usage(): usage = dict() for attrname in dir(InfoCore): attr = getattr(InfoCore, attrname) - if (hasattr(attr, "__func__") and - attr.__func__.func_name not in cmd_blacklist and - attr.__func__.func_name.startswith("do_") and - attr.__func__.func_doc): + + # shim for python 2.4, __func__ is im_func + funcattr = getattr(attr, "__func__", getattr(attr, "im_func", None)) + if (funcattr != None and + funcattr.func_name not in cmd_blacklist and + funcattr.func_name.startswith("do_") and + funcattr.func_doc): usage[attr.__name__] = re.sub(r'\s+', ' ', attr.__doc__) return "Commands:\n" + "\n".join(usage[k] for k in sorted(usage.keys())) -- cgit v1.2.3-1-g7c22 From 4d6c2efbe2df7b516ef0dfcdaf2614adaa3fb53e Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Sun, 24 Mar 2013 04:51:34 -0400 Subject: client: actually return probe data to server --- src/lib/Bcfg2/Client/Client.py | 1 + 1 file changed, 1 insertion(+) (limited to 'src') diff --git a/src/lib/Bcfg2/Client/Client.py b/src/lib/Bcfg2/Client/Client.py index 88f3bd6ef..2df0b11cd 100644 --- a/src/lib/Bcfg2/Client/Client.py +++ b/src/lib/Bcfg2/Client/Client.py @@ -105,6 +105,7 @@ class Client(object): self._probe_failure(name, "Return value %s" % rv) self.logger.info("Probe %s has result:" % name) self.logger.info(rv.stdout) + ret.text = rv.stdout finally: os.unlink(scriptname) except SystemExit: -- cgit v1.2.3-1-g7c22