From 6c74c3e3df2a064c09337dc271da928d5d3c9523 Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Thu, 27 Jun 2013 09:31:40 -0500 Subject: Chkconfig: Use get_bootstatus The get_bootstatus method has the correct logic to get the desired result when bootstatus is unset. Signed-off-by: Sol Jerome --- src/lib/Bcfg2/Client/Tools/Chkconfig.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Client/Tools/Chkconfig.py b/src/lib/Bcfg2/Client/Tools/Chkconfig.py index 156f76159..ac874c94c 100644 --- a/src/lib/Bcfg2/Client/Tools/Chkconfig.py +++ b/src/lib/Bcfg2/Client/Tools/Chkconfig.py @@ -85,16 +85,16 @@ class Chkconfig(Bcfg2.Client.Tools.SvcTool): """Install Service entry.""" self.cmd.run("/sbin/chkconfig --add %s" % (entry.get('name'))) self.logger.info("Installing Service %s" % (entry.get('name'))) - bootstatus = entry.get('bootstatus') + bootstatus = self.get_bootstatus(entry) if bootstatus is not None: if bootstatus == 'on': # make sure service is enabled on boot bootcmd = '/sbin/chkconfig %s %s --level 0123456' % \ - (entry.get('name'), entry.get('bootstatus')) + (entry.get('name'), bootstatus) elif bootstatus == 'off': # make sure service is disabled on boot bootcmd = '/sbin/chkconfig %s %s' % (entry.get('name'), - entry.get('bootstatus')) + bootstatus) bootcmdrv = self.cmd.run(bootcmd).success if self.setup['servicemode'] == 'disabled': # 'disabled' means we don't attempt to modify running svcs -- cgit v1.2.3-1-g7c22 From e3418f268de507104222a01bf94c450696e1050b Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Thu, 27 Jun 2013 18:08:11 +0200 Subject: Plugins/Metadata: fix resolution for ipv4-in-ipv6 addresses like ::ffff:127.0.0.1 --- src/lib/Bcfg2/Server/Plugins/Metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Server/Plugins/Metadata.py b/src/lib/Bcfg2/Server/Plugins/Metadata.py index 4ed3dede5..c24c0f22d 100644 --- a/src/lib/Bcfg2/Server/Plugins/Metadata.py +++ b/src/lib/Bcfg2/Server/Plugins/Metadata.py @@ -1055,7 +1055,7 @@ class Metadata(Bcfg2.Server.Plugin.Metadata, raise Bcfg2.Server.Plugin.MetadataConsistencyError(err) return self.addresses[address][0] try: - cname = socket.gethostbyaddr(address)[0].lower() + cname = socket.getnameinfo(addresspair, socket.NI_NAMEREQD)[0].lower() if cname in self.aliases: return self.aliases[cname] return cname -- cgit v1.2.3-1-g7c22 From 228bf585005b3fbcbbb43270d9a91db9c317e7a9 Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Thu, 27 Jun 2013 13:35:49 -0500 Subject: Metadata: Make pylint happy Signed-off-by: Sol Jerome --- src/lib/Bcfg2/Server/Plugins/Metadata.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Server/Plugins/Metadata.py b/src/lib/Bcfg2/Server/Plugins/Metadata.py index c24c0f22d..6934739a3 100644 --- a/src/lib/Bcfg2/Server/Plugins/Metadata.py +++ b/src/lib/Bcfg2/Server/Plugins/Metadata.py @@ -1055,7 +1055,8 @@ class Metadata(Bcfg2.Server.Plugin.Metadata, raise Bcfg2.Server.Plugin.MetadataConsistencyError(err) return self.addresses[address][0] try: - cname = socket.getnameinfo(addresspair, socket.NI_NAMEREQD)[0].lower() + cname = socket.getnameinfo(addresspair, + socket.NI_NAMEREQD)[0].lower() if cname in self.aliases: return self.aliases[cname] return cname -- cgit v1.2.3-1-g7c22 From b9022e96e1353dab0843e6341239469dec773b1f Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Tue, 18 Jun 2013 20:52:31 +0200 Subject: Opitons: add cook function to parse a dict for the config file --- src/lib/Bcfg2/Options.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py index 243c4ed2a..f027268e1 100644 --- a/src/lib/Bcfg2/Options.py +++ b/src/lib/Bcfg2/Options.py @@ -319,6 +319,28 @@ def colon_split(c_string): return [] +def dict_split(c_string): + """ split an option string on commans, optionally sourrunded by + whitespace and split the resulting items again on equals signs, + returning a dict """ + result = dict() + if c_string: + items = re.split(r'\s*,\s*', c_string) + for item in items: + if r'=' in item: + key, value = item.split(r'=', 1) + try: + result[key] = get_bool(value) + except ValueError: + try: + result[key] = get_int(value) + except ValueError: + result[key] = value + else: + result[item] = True + return result + + def get_bool(val): """ given a string value of a boolean configuration option, return an actual bool (True or False) """ -- cgit v1.2.3-1-g7c22 From 58f4b311bfa9f192c9d4d4a418e9f0db5bce1897 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Tue, 18 Jun 2013 20:53:05 +0200 Subject: Options: add database.options With the options setting in the database section of the config file various database options for the django database could be set (like ssl mode for postgres). For more information, consult your django databse backend module's documentation. --- src/lib/Bcfg2/Options.py | 7 +++++++ src/lib/Bcfg2/settings.py | 9 ++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py index f027268e1..84551a02d 100644 --- a/src/lib/Bcfg2/Options.py +++ b/src/lib/Bcfg2/Options.py @@ -674,6 +674,12 @@ DB_PORT = \ cf=('database', 'port'), deprecated_cf=('statistics', 'database_port')) +DB_OPTIONS = \ + Option('Database options', + default=dict(), + cf=('database', 'options'), + cook=dict_split) + # Django options WEB_CFILE = \ Option('Web interface configuration file', @@ -1307,6 +1313,7 @@ DATABASE_COMMON_OPTIONS = dict(web_configfile=WEB_CFILE, db_password=DB_PASSWORD, db_host=DB_HOST, db_port=DB_PORT, + db_options=DB_OPTIONS, time_zone=DJANGO_TIME_ZONE, django_debug=DJANGO_DEBUG, web_prefix=DJANGO_WEB_PREFIX) diff --git a/src/lib/Bcfg2/settings.py b/src/lib/Bcfg2/settings.py index 9adfd66bf..6e718a079 100644 --- a/src/lib/Bcfg2/settings.py +++ b/src/lib/Bcfg2/settings.py @@ -26,6 +26,7 @@ DATABASE_USER = None DATABASE_PASSWORD = None DATABASE_HOST = None DATABASE_PORT = None +DATABASE_OPTIONS = None TIME_ZONE = None @@ -58,8 +59,8 @@ def read_config(cfile=DEFAULT_CONFIG, repo=None, quiet=False): """ read the config file and set django settings based on it """ # pylint: disable=W0602,W0603 global DATABASE_ENGINE, DATABASE_NAME, DATABASE_USER, DATABASE_PASSWORD, \ - DATABASE_HOST, DATABASE_PORT, DEBUG, TEMPLATE_DEBUG, TIME_ZONE, \ - MEDIA_URL + DATABASE_HOST, DATABASE_PORT, DATABASE_OPTIONS, DEBUG, \ + TEMPLATE_DEBUG, TIME_ZONE, MEDIA_URL # pylint: enable=W0602,W0603 if not os.path.exists(cfile) and os.path.exists(DEFAULT_CONFIG): @@ -86,7 +87,8 @@ def read_config(cfile=DEFAULT_CONFIG, repo=None, quiet=False): USER=setup['db_user'], PASSWORD=setup['db_password'], HOST=setup['db_host'], - PORT=setup['db_port']) + PORT=setup['db_port'], + OPTIONS=setup['db_options']) if HAS_DJANGO and django.VERSION[0] == 1 and django.VERSION[1] < 2: DATABASE_ENGINE = setup['db_engine'] @@ -95,6 +97,7 @@ def read_config(cfile=DEFAULT_CONFIG, repo=None, quiet=False): DATABASE_PASSWORD = DATABASES['default']['PASSWORD'] DATABASE_HOST = DATABASES['default']['HOST'] DATABASE_PORT = DATABASES['default']['PORT'] + DATABASE_OPTIONS = DATABASES['default']['OPTIONS'] # dropping the version check. This was added in 1.1.2 TIME_ZONE = setup['time_zone'] -- cgit v1.2.3-1-g7c22 From 98d5d944f64b7770fd2c596129c59eec2193623b Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sun, 10 Mar 2013 22:23:12 +0100 Subject: Plugins/Packages: add missing format string parameter --- src/lib/Bcfg2/Server/Plugins/Packages/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py b/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py index f82b8a392..f93bd0932 100644 --- a/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py +++ b/src/lib/Bcfg2/Server/Plugins/Packages/__init__.py @@ -510,7 +510,8 @@ class Packages(Bcfg2.Server.Plugin.Plugin, if len(sclasses) > 1: self.logger.warning("Packages: Multiple source types found for " "%s: %s" % - ",".join([s.__name__ for s in sclasses])) + (metadata.hostname, + ",".join([s.__name__ for s in sclasses]))) cclass = Collection elif len(sclasses) == 0: self.logger.error("Packages: No sources found for %s" % -- cgit v1.2.3-1-g7c22 From aed992e317378569abfdc75e0da195e56445db19 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Fri, 28 Jun 2013 23:47:27 +0200 Subject: Revert "Avoid use of lxml-only getparent()" This reverts commit 38f55b6257ce51b1cf65ecb3d980d7528c1b53ff. --- src/lib/Bcfg2/Client/Frame.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Client/Frame.py b/src/lib/Bcfg2/Client/Frame.py index 6bef77081..edbc9f055 100644 --- a/src/lib/Bcfg2/Client/Frame.py +++ b/src/lib/Bcfg2/Client/Frame.py @@ -207,7 +207,12 @@ class Frame(object): # take care of important entries first if not self.dryrun: - for parent in self.config.findall(".//Path/.."): + for cfile in self.config.findall(".//Path"): + if (cfile.get('name') not in self.__important__ or + cfile.get('type') != 'file' or + cfile not in self.whitelist): + continue + parent = cfile.getparent() if ((parent.tag == "Bundle" and ((self.setup['bundle'] and parent.get("name") not in self.setup['bundle']) or @@ -216,15 +221,9 @@ class Frame(object): (parent.tag == "Independent" and (self.setup['bundle'] or self.setup['skipindep']))): continue - for cfile in parent.findall("./Path"): - if (cfile.get('name') not in self.__important__ or - cfile.get('type') != 'file' or - cfile not in self.whitelist): - continue - tools = [t for t in self.tools - if t.handlesEntry(cfile) and t.canVerify(cfile)] - if not tools: - continue + tools = [t for t in self.tools + if t.handlesEntry(cfile) and t.canVerify(cfile)] + if tools: if (self.setup['interactive'] and not self.promptFilter("Install %s: %s? (y/N):", [cfile])): self.whitelist.remove(cfile) -- cgit v1.2.3-1-g7c22 From c715a661fece0e2e561d4d62a27e9bdac212c54a Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Fri, 28 Jun 2013 23:48:45 +0200 Subject: Client/Frame: avoid use of lxml-only getparent() getparent is not supported by xml.etree so try to emulate it with a generated parent_map. This is the only possibility, because xml.etree does not store references to the parent elements. --- src/lib/Bcfg2/Client/Frame.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Client/Frame.py b/src/lib/Bcfg2/Client/Frame.py index edbc9f055..3254da9e9 100644 --- a/src/lib/Bcfg2/Client/Frame.py +++ b/src/lib/Bcfg2/Client/Frame.py @@ -207,12 +207,15 @@ class Frame(object): # take care of important entries first if not self.dryrun: + parent_map = dict((c, p) + for p in self.config.getiterator() + for c in p) for cfile in self.config.findall(".//Path"): if (cfile.get('name') not in self.__important__ or cfile.get('type') != 'file' or cfile not in self.whitelist): continue - parent = cfile.getparent() + parent = parent_map[cfile] if ((parent.tag == "Bundle" and ((self.setup['bundle'] and parent.get("name") not in self.setup['bundle']) or -- cgit v1.2.3-1-g7c22 From 3346f2ea0f00e62a30ca38d680abdb47f8440259 Mon Sep 17 00:00:00 2001 From: Alexander Sulfrian Date: Sat, 29 Jun 2013 16:22:59 +0200 Subject: Executor: do not split the command line if shell is true If the command should be excuted within a shell, it should not be splited into a list. If subcommand.Popen gets a list, the first element is the command and all other are the arguements. This breaks the shell evaluation of the commamnd. --- src/lib/Bcfg2/Utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Utils.py b/src/lib/Bcfg2/Utils.py index 9f46582c4..4293f3f69 100644 --- a/src/lib/Bcfg2/Utils.py +++ b/src/lib/Bcfg2/Utils.py @@ -216,7 +216,9 @@ class Executor(object): """ if isinstance(command, str): cmdstr = command - command = shlex.split(cmdstr) + + if not shell: + command = shlex.split(cmdstr) else: cmdstr = " ".join(command) self.logger.debug("Running: %s" % cmdstr) -- cgit v1.2.3-1-g7c22 From 26065a3be66e2b9bd86edd61475e1faa36a54617 Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Sat, 29 Jun 2013 19:00:55 -0500 Subject: Options: Fix typos Signed-off-by: Sol Jerome --- src/lib/Bcfg2/Options.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Options.py b/src/lib/Bcfg2/Options.py index 84551a02d..dba3e96ef 100644 --- a/src/lib/Bcfg2/Options.py +++ b/src/lib/Bcfg2/Options.py @@ -320,7 +320,7 @@ def colon_split(c_string): def dict_split(c_string): - """ split an option string on commans, optionally sourrunded by + """ split an option string on commas, optionally surrounded by whitespace and split the resulting items again on equals signs, returning a dict """ result = dict() -- cgit v1.2.3-1-g7c22 From 2519c6dbbd49b06042b4f21f10c6fecfbf7e5230 Mon Sep 17 00:00:00 2001 From: Michael Fenn Date: Mon, 1 Jul 2013 16:08:59 -0400 Subject: New approach, just create nwe directories with mode 0755 regardless --- src/lib/Bcfg2/Client/Tools/POSIX/base.py | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Client/Tools/POSIX/base.py b/src/lib/Bcfg2/Client/Tools/POSIX/base.py index 16fe0acb5..3778569a6 100644 --- a/src/lib/Bcfg2/Client/Tools/POSIX/base.py +++ b/src/lib/Bcfg2/Client/Tools/POSIX/base.py @@ -706,16 +706,10 @@ class POSIXTool(Bcfg2.Client.Tools.Tool): (path, err)) rv = False - # we need to make sure that we give +x to everyone who needs - # it. E.g., if the file that's been distributed is 0600, we - # can't make the parent directories 0600 also; that'd be - # pretty useless. They need to be 0700. + # set auto-created directories to mode 755, if you need + # something else, you should specify it in your config tmpentry = copy.deepcopy(entry) - newmode = int(entry.get('mode'), 8) - for i in range(0, 3): - if newmode & (6 * pow(8, i)): - newmode |= 1 * pow(8, i) - tmpentry.set('mode', oct_mode(newmode)) + tmpentry.set('mode', '0755') for acl in tmpentry.findall('ACL'): acl.set('perms', oct_mode(self._norm_acl_perms(acl.get('perms')) | -- cgit v1.2.3-1-g7c22 From d5943d26a546bd0831e3a3001a7c6a7f9a868399 Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Mon, 1 Jul 2013 16:24:46 -0500 Subject: Version bump to 1.3.2 Signed-off-by: Sol Jerome --- src/lib/Bcfg2/Reporting/templates/base.html | 2 +- src/lib/Bcfg2/version.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Reporting/templates/base.html b/src/lib/Bcfg2/Reporting/templates/base.html index 7f1fcba3b..0b2b7dd36 100644 --- a/src/lib/Bcfg2/Reporting/templates/base.html +++ b/src/lib/Bcfg2/Reporting/templates/base.html @@ -93,7 +93,7 @@ This is needed for Django versions less than 1.5
diff --git a/src/lib/Bcfg2/version.py b/src/lib/Bcfg2/version.py index 12fc584fe..140fb6937 100644 --- a/src/lib/Bcfg2/version.py +++ b/src/lib/Bcfg2/version.py @@ -2,7 +2,7 @@ import re -__version__ = "1.3.1" +__version__ = "1.3.2" class Bcfg2VersionInfo(tuple): # pylint: disable=E0012,R0924 -- cgit v1.2.3-1-g7c22 From c6f7025dbc5fd82bcfd6a249bdf05238539bd98a Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 2 Jul 2013 12:31:10 -0400 Subject: pep8: fixed tests --- src/lib/Bcfg2/Server/Plugins/Probes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Server/Plugins/Probes.py b/src/lib/Bcfg2/Server/Plugins/Probes.py index 0974184b4..407cfc2d4 100644 --- a/src/lib/Bcfg2/Server/Plugins/Probes.py +++ b/src/lib/Bcfg2/Server/Plugins/Probes.py @@ -249,7 +249,7 @@ class Probes(Bcfg2.Server.Plugin.Probing, ProbesDataModel.objects.filter( hostname=client.hostname).exclude( - probe__in=self.probedata[client.hostname]).delete() + probe__in=self.probedata[client.hostname]).delete() for group in self.cgroups[client.hostname]: try: @@ -264,7 +264,7 @@ class Probes(Bcfg2.Server.Plugin.Probing, group=group) ProbesGroupsModel.objects.filter( hostname=client.hostname).exclude( - group__in=self.cgroups[client.hostname]).delete() + group__in=self.cgroups[client.hostname]).delete() def load_data(self): """ Load probe data from the appropriate backend (probed.xml -- cgit v1.2.3-1-g7c22 From 7ff54957090ddbc788f415dccb3e3c20ea1a301e Mon Sep 17 00:00:00 2001 From: Michael Fenn Date: Tue, 2 Jul 2013 15:04:12 -0400 Subject: Chkconfig: give --list option to chkconfig rather than sending it on stdin --- src/lib/Bcfg2/Client/Tools/Chkconfig.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Client/Tools/Chkconfig.py b/src/lib/Bcfg2/Client/Tools/Chkconfig.py index ac874c94c..edcc86b85 100644 --- a/src/lib/Bcfg2/Client/Tools/Chkconfig.py +++ b/src/lib/Bcfg2/Client/Tools/Chkconfig.py @@ -116,8 +116,8 @@ class Chkconfig(Bcfg2.Client.Tools.SvcTool): def FindExtra(self): """Locate extra chkconfig Services.""" allsrv = [line.split()[0] - for line in self.cmd.run("/sbin/chkconfig", - "--list").stdout.splitlines() + for line in + self.cmd.run("/sbin/chkconfig --list").stdout.splitlines() if ":on" in line] self.logger.debug('Found active services:') self.logger.debug(allsrv) -- cgit v1.2.3-1-g7c22 From cc6c07eeddc80f1338371602ba1edd4dc9423881 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Wed, 3 Jul 2013 14:26:56 -0400 Subject: Metadata: fixed docstring typo --- src/lib/Bcfg2/Server/Plugins/Metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Server/Plugins/Metadata.py b/src/lib/Bcfg2/Server/Plugins/Metadata.py index 6934739a3..213f29cd0 100644 --- a/src/lib/Bcfg2/Server/Plugins/Metadata.py +++ b/src/lib/Bcfg2/Server/Plugins/Metadata.py @@ -749,7 +749,7 @@ class Metadata(Bcfg2.Server.Plugin.Metadata, return self._remove_xdata(self.groups_xml, "Bundle", bundle_name) def remove_client(self, client_name): - """Remove a bundle.""" + """Remove a client.""" if self._use_db: try: client = MetadataClientModel.objects.get(hostname=client_name) -- cgit v1.2.3-1-g7c22 From a0f20bdde06ccb7be85f59e1b8fbf57e1c492e64 Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Tue, 2 Jul 2013 15:55:55 -0500 Subject: RcUpdate: Use get_bootstatus Signed-off-by: Sol Jerome --- src/lib/Bcfg2/Client/Tools/RcUpdate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib/Bcfg2') diff --git a/src/lib/Bcfg2/Client/Tools/RcUpdate.py b/src/lib/Bcfg2/Client/Tools/RcUpdate.py index 8e9626521..e0c913dcd 100644 --- a/src/lib/Bcfg2/Client/Tools/RcUpdate.py +++ b/src/lib/Bcfg2/Client/Tools/RcUpdate.py @@ -89,7 +89,7 @@ class RcUpdate(Bcfg2.Client.Tools.SvcTool): def InstallService(self, entry): """Install Service entry.""" self.logger.info('Installing Service %s' % entry.get('name')) - bootstatus = entry.get('bootstatus') + bootstatus = self.get_bootstatus(entry) if bootstatus is not None: if bootstatus == 'on': # make sure service is enabled on boot -- cgit v1.2.3-1-g7c22