From b7479fa7dc6d87135fb328dbf9ba4bcd81a5db53 Mon Sep 17 00:00:00 2001 From: Simon Ruderich Date: Mon, 11 Nov 2013 21:36:50 +0100 Subject: Fix compatibility with Django 1.6. --- src/lib/Bcfg2/Reporting/Compat.py | 18 ++++++++++++++++++ src/lib/Bcfg2/Reporting/Storage/DjangoORM.py | 4 ++-- src/lib/Bcfg2/Reporting/urls.py | 2 +- src/lib/Bcfg2/Reporting/utils.py | 2 +- src/lib/Bcfg2/Server/Admin/Reports.py | 4 ++-- src/lib/Bcfg2/Server/Hostbase/hostbase/urls.py | 2 +- src/lib/Bcfg2/Server/Hostbase/urls.py | 2 +- src/lib/Bcfg2/Server/Reports/reports/models.py | 10 ++++++---- 8 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 src/lib/Bcfg2/Reporting/Compat.py (limited to 'src') diff --git a/src/lib/Bcfg2/Reporting/Compat.py b/src/lib/Bcfg2/Reporting/Compat.py new file mode 100644 index 000000000..d8f439e22 --- /dev/null +++ b/src/lib/Bcfg2/Reporting/Compat.py @@ -0,0 +1,18 @@ +""" Compatibility imports for Django. """ + +from django import VERSION +from django.db import transaction + +# Django 1.6 deprecated commit_on_success() and introduced atomic() with +# similar semantics. +if VERSION[0] == 1 and VERSION[1] < 6: + transaction.atomic = transaction.commit_on_success + +try: + # Django < 1.6 + from django.conf.urls import defaults + django_urls = defaults +except: + # Django > 1.6 + from django.conf import urls + django_urls = urls diff --git a/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py b/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py index aea5e9d4b..ef1e92103 100644 --- a/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py +++ b/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py @@ -18,12 +18,12 @@ from django.core import management from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.db.models import FieldDoesNotExist from django.core.cache import cache -from django.db import transaction #Used by GetCurrentEntry import difflib from Bcfg2.Compat import b64decode from Bcfg2.Reporting.models import * +from Bcfg2.Reporting.Compat import transaction class DjangoORM(StorageBase): @@ -256,7 +256,7 @@ class DjangoORM(StorageBase): entry.tag) return None - @transaction.commit_on_success + @transaction.atomic def _import_interaction(self, interaction): """Real import function""" hostname = interaction['hostname'] diff --git a/src/lib/Bcfg2/Reporting/urls.py b/src/lib/Bcfg2/Reporting/urls.py index 8330fef7b..a9e5690be 100644 --- a/src/lib/Bcfg2/Reporting/urls.py +++ b/src/lib/Bcfg2/Reporting/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls.defaults import * +from Bcfg2.Reporting.Compat.django_urls import * from django.core.urlresolvers import reverse, NoReverseMatch from django.http import HttpResponsePermanentRedirect from Bcfg2.Reporting.utils import filteredUrls, paginatedUrls, timeviewUrls diff --git a/src/lib/Bcfg2/Reporting/utils.py b/src/lib/Bcfg2/Reporting/utils.py index 619501d8b..d9b8213b1 100755 --- a/src/lib/Bcfg2/Reporting/utils.py +++ b/src/lib/Bcfg2/Reporting/utils.py @@ -1,5 +1,5 @@ """Helper functions for reports""" -from django.conf.urls.defaults import * +from Bcfg2.Reporting.Compat.django_urls import * import re """List of filters provided by filteredUrls""" diff --git a/src/lib/Bcfg2/Server/Admin/Reports.py b/src/lib/Bcfg2/Server/Admin/Reports.py index 849df8025..eb97123f7 100644 --- a/src/lib/Bcfg2/Server/Admin/Reports.py +++ b/src/lib/Bcfg2/Server/Admin/Reports.py @@ -19,11 +19,11 @@ sys.path.pop() # Set DJANGO_SETTINGS_MODULE appropriately. os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project_name -from django.db import transaction from Bcfg2.Reporting.models import Client, Interaction, \ Performance, Bundle, Group, FailureEntry, PathEntry, \ PackageEntry, ServiceEntry, ActionEntry +from Bcfg2.Reporting.Compat import transaction def printStats(fn): @@ -136,7 +136,7 @@ class Reports(Bcfg2.Server.Admin.Mode): else: self.errExit("Unknown command: %s" % args[0]) - @transaction.commit_on_success + @transaction.atomic def scrub(self): ''' Perform a thorough scrub and cleanup of the database ''' diff --git a/src/lib/Bcfg2/Server/Hostbase/hostbase/urls.py b/src/lib/Bcfg2/Server/Hostbase/hostbase/urls.py index 0ee204abe..a03d2c919 100644 --- a/src/lib/Bcfg2/Server/Hostbase/hostbase/urls.py +++ b/src/lib/Bcfg2/Server/Hostbase/hostbase/urls.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -from django.conf.urls.defaults import * +from Bcfg2.Reporting.Compat.django_urls import * from django.contrib.auth.decorators import login_required from django.core.urlresolvers import reverse from django.views.generic.create_update import create_object, update_object, delete_object diff --git a/src/lib/Bcfg2/Server/Hostbase/urls.py b/src/lib/Bcfg2/Server/Hostbase/urls.py index 01fe97d4f..4a0c33f98 100644 --- a/src/lib/Bcfg2/Server/Hostbase/urls.py +++ b/src/lib/Bcfg2/Server/Hostbase/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls.defaults import * +from Bcfg2.Reporting.Compat.django_urls import * from django.conf import settings from django.views.generic.simple import direct_to_template from django.contrib import admin diff --git a/src/lib/Bcfg2/Server/Reports/reports/models.py b/src/lib/Bcfg2/Server/Reports/reports/models.py index 73adaaaaf..c43c3cee7 100644 --- a/src/lib/Bcfg2/Server/Reports/reports/models.py +++ b/src/lib/Bcfg2/Server/Reports/reports/models.py @@ -9,11 +9,13 @@ except ImproperlyConfigured: print("Reports: unable to import django models: %s" % e) sys.exit(1) -from django.db import connection, transaction +from django.db import connection from django.db.models import Q from datetime import datetime, timedelta from time import strptime +from Bcfg2.Reporting.Compat import transaction + KIND_CHOICES = ( #These are the kinds of config elements ('Package', 'Package'), @@ -288,7 +290,7 @@ class Reason(models.Model): return rv @staticmethod - @transaction.commit_on_success + @transaction.atomic def prune_orphans(): '''Prune oprhaned rows... no good way to use the ORM''' cursor = connection.cursor() @@ -305,7 +307,7 @@ class Entries(models.Model): return self.name @staticmethod - @transaction.commit_on_success + @transaction.atomic def prune_orphans(): '''Prune oprhaned rows... no good way to use the ORM''' cursor = connection.cursor() @@ -334,7 +336,7 @@ class Performance(models.Model): return self.metric @staticmethod - @transaction.commit_on_success + @transaction.atomic def prune_orphans(): '''Prune oprhaned rows... no good way to use the ORM''' cursor = connection.cursor() -- cgit v1.2.3-1-g7c22 From e3692852e897fbce142d5c296ad34f33c1526cc8 Mon Sep 17 00:00:00 2001 From: Sol Jerome Date: Mon, 11 Nov 2013 22:22:59 -0600 Subject: Reports: Add missing ImportError Signed-off-by: Sol Jerome --- src/lib/Bcfg2/Reporting/Compat.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/lib/Bcfg2/Reporting/Compat.py b/src/lib/Bcfg2/Reporting/Compat.py index d8f439e22..57261970d 100644 --- a/src/lib/Bcfg2/Reporting/Compat.py +++ b/src/lib/Bcfg2/Reporting/Compat.py @@ -12,7 +12,7 @@ try: # Django < 1.6 from django.conf.urls import defaults django_urls = defaults -except: +except ImportError: # Django > 1.6 from django.conf import urls django_urls = urls -- cgit v1.2.3-1-g7c22 From 0b1e543b2de0e8dccb986d758fe9c65a0366b9f6 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 12 Nov 2013 15:29:11 -0500 Subject: bcfg2-crypt: backported fixes in b5b26415161e715fe4d22d69328b06801ff7124d --- src/sbin/bcfg2-crypt | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/sbin/bcfg2-crypt b/src/sbin/bcfg2-crypt index 98a1ca4b0..851d38906 100755 --- a/src/sbin/bcfg2-crypt +++ b/src/sbin/bcfg2-crypt @@ -50,6 +50,10 @@ class PassphraseError(Exception): passphrase to encrypt or decrypt with """ +class DecryptError(Exception): + """ Exception raised when decryption fails. """ + + class CryptoTool(object): """ Generic decryption/encryption interface base object """ def __init__(self, filename, setup): @@ -169,23 +173,19 @@ class CfgDecryptor(Decryptor): self.data, self.passphrase, Bcfg2.Encryption.get_algorithm(self.setup)) except Bcfg2.Encryption.EVPError: - self.logger.info("Could not decrypt %s with the " - "specified passphrase" % self.filename) - return False + raise DecryptError("Could not decrypt %s with the " + "specified passphrase" % self.filename) except: - err = sys.exc_info()[1] - self.logger.error("Error decrypting %s: %s" % - (self.filename, err)) - return False + raise DecryptError("Error decrypting %s: %s" % + (self.filename, sys.exc_info()[1])) else: # no passphrase given, brute force try: return Bcfg2.Encryption.bruteforce_decrypt( self.data, passphrases=self.passphrases.values(), algorithm=Bcfg2.Encryption.get_algorithm(self.setup)) except Bcfg2.Encryption.EVPError: - self.logger.info("Could not decrypt %s with any passphrase" % - self.filename) - return False + raise DecryptError("Could not decrypt %s with any passphrase" % + self.filename) def get_destination_filename(self, original_filename): if original_filename.endswith(".crypt"): @@ -288,19 +288,20 @@ class PropertiesDecryptor(Decryptor, PropertiesCryptoMixin): default_xpath = '//*[@encrypted]' def decrypt(self): + decrypted = False xdata = lxml.etree.XML(self.data, parser=XMLParser) for elt in self._get_elements(xdata): try: pname, passphrase = self._get_element_passphrase(elt) except PassphraseError: - self.logger.error(str(sys.exc_info()[1])) - return False + raise DecryptError(str(sys.exc_info()[1])) self.logger.debug("Decrypting %s" % print_xml(elt)) try: decrypted = Bcfg2.Encryption.ssl_decrypt( elt.text, passphrase, Bcfg2.Encryption.get_algorithm(self.setup)).strip() - except Bcfg2.Encryption.EVPError: + decrypted = True + except (Bcfg2.Encryption.EVPError, TypeError): self.logger.error("Could not decrypt %s, skipping" % print_xml(elt)) try: @@ -314,7 +315,11 @@ class PropertiesDecryptor(Decryptor, PropertiesCryptoMixin): # a different key, and wound up with gibberish. self.logger.warning("Decrypted %s to gibberish, skipping" % elt.tag) - return xdata + if decrypted: + return xdata + else: + raise DecryptError("Failed to decrypt any data in %s" % + self.filename) def _write(self, filename, data): PropertiesCryptoMixin._write(self, filename, data) @@ -437,10 +442,7 @@ def main(): # pylint: disable=R0912,R0915 try: data = tool.decrypt() mode = "decrypt" - except: # pylint: disable=W0702 - pass - if data is False: - data = None + except DecryptError: logger.info("Failed to decrypt %s, trying encryption" % fname) try: tool = tools[0](fname, setup) @@ -450,10 +452,11 @@ def main(): # pylint: disable=R0912,R0915 mode = "encrypt" if data is None: - data = getattr(tool, mode)() - if data is None: - logger.error("Failed to %s %s, skipping" % (mode, fname)) - continue + try: + data = getattr(tool, mode)() + except DecryptError: + logger.error("Failed to %s %s, skipping" % (mode, fname)) + continue if setup['crypt_stdout']: if len(setup['args']) > 1: print("----- %s -----" % fname) -- cgit v1.2.3-1-g7c22 From 30882ba70ad627f89ab89af6ffc77cda08de8773 Mon Sep 17 00:00:00 2001 From: "Chris St. Pierre" Date: Tue, 12 Nov 2013 15:44:10 -0500 Subject: bcfg2-crypt: Fixed variable name collision --- src/sbin/bcfg2-crypt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/sbin/bcfg2-crypt b/src/sbin/bcfg2-crypt index 851d38906..3c2d0f2b6 100755 --- a/src/sbin/bcfg2-crypt +++ b/src/sbin/bcfg2-crypt @@ -288,7 +288,7 @@ class PropertiesDecryptor(Decryptor, PropertiesCryptoMixin): default_xpath = '//*[@encrypted]' def decrypt(self): - decrypted = False + decrypted_any = False xdata = lxml.etree.XML(self.data, parser=XMLParser) for elt in self._get_elements(xdata): try: @@ -300,7 +300,7 @@ class PropertiesDecryptor(Decryptor, PropertiesCryptoMixin): decrypted = Bcfg2.Encryption.ssl_decrypt( elt.text, passphrase, Bcfg2.Encryption.get_algorithm(self.setup)).strip() - decrypted = True + decrypted_any = True except (Bcfg2.Encryption.EVPError, TypeError): self.logger.error("Could not decrypt %s, skipping" % print_xml(elt)) @@ -315,7 +315,7 @@ class PropertiesDecryptor(Decryptor, PropertiesCryptoMixin): # a different key, and wound up with gibberish. self.logger.warning("Decrypted %s to gibberish, skipping" % elt.tag) - if decrypted: + if decrypted_any: return xdata else: raise DecryptError("Failed to decrypt any data in %s" % -- cgit v1.2.3-1-g7c22