[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#801441: marked as done (jessie-pu: package bcfg2/1.3.5-1)



Your message dated Sat, 23 Jan 2016 13:57:15 +0000
with message-id <1453557435.1835.52.camel@adam-barratt.org.uk>
and subject line 8.3 point release cleanup
has caused the Debian Bug report #801441,
regarding jessie-pu: package bcfg2/1.3.5-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
801441: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=801441
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
Tags: jessie
User: release.debian.org@packages.debian.org
Usertags: pu

I would like to update bcfg2 in stable to match the version currently in
testing to enable it to work with Django 1.7 (bug #755645). To do this I would
add the attached patch, which looks much worse than it is due to the db
migration files being moved around.

-- System Information:
Debian Release: stretch/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (101, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.2.3 (SMP w/2 CPU cores; PREEMPT)
Locale: LANG=en_US.UTF-8, LC_CTYPE=fi_FI.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
From: Jonas Jochmaring <jjonas@mail.upb.de>
Date: Fri, 22 May 2015 15:29:02 +0200
Subject: make Bcfg2 compatible with django 1.7

  - reports.wsgi uses get_wsgi_application() now
  - old south-based migrations have been moved
  - manage.py has been updated
  - fix SOUTH_MIGRATION_MODULES value in settings.py
  - fix django loading in bcfg2 server core
  - fix django loading DjangoORM storage
  - revert back to old django testrunner
  - call django.setup in bcfg2-reports
  - close the database connection after syncdb in BaseCore.__init__
  - fixed reports.wsgi script
---
 reports/reports.wsgi                               |   19 +-
 src/lib/Bcfg2/Reporting/Storage/DjangoORM.py       |    3 +
 src/lib/Bcfg2/Reporting/migrations/0001_initial.py | 1006 +++++++++++---------
 .../migrations/0002_convert_perms_to_mode.py       |  171 ----
 .../Reporting/migrations/0003_expand_hash_key.py   |  180 ----
 .../migrations/0004_profile_can_be_null.py         |  156 ---
 .../migrations/0005_add_selinux_entry_support.py   |  485 ----------
 .../0006_add_user_group_entry_support.py           |  340 -------
 .../Reporting/south_migrations/0001_initial.py     |  465 +++++++++
 .../south_migrations/0002_convert_perms_to_mode.py |  171 ++++
 .../south_migrations/0003_expand_hash_key.py       |  180 ++++
 .../south_migrations/0004_profile_can_be_null.py   |  156 +++
 .../0005_add_selinux_entry_support.py              |  485 ++++++++++
 .../0006_add_user_group_entry_support.py           |  340 +++++++
 .../Bcfg2/Reporting/south_migrations/__init__.py   |    0
 src/lib/Bcfg2/Server/Admin/Reports.py              |   14 +-
 src/lib/Bcfg2/Server/Core.py                       |    4 +
 src/lib/Bcfg2/manage.py                            |   27 +-
 src/lib/Bcfg2/settings.py                          |   11 +-
 src/sbin/bcfg2-reports                             |    3 +
 20 files changed, 2399 insertions(+), 1817 deletions(-)
 delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
 delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
 delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
 delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
 delete mode 100644 src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
 create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py
 create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py
 create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py
 create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py
 create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py
 create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py
 create mode 100644 src/lib/Bcfg2/Reporting/south_migrations/__init__.py

diff --git a/reports/reports.wsgi b/reports/reports.wsgi
index 92401d7..75f1a73 100644
--- a/reports/reports.wsgi
+++ b/reports/reports.wsgi
@@ -1,9 +1,18 @@
 import os
 import Bcfg2.settings
 os.environ['DJANGO_SETTINGS_MODULE'] = 'Bcfg2.settings'
-import django.core.handlers.wsgi
+import django
 
-def application(environ, start_response):
-  if 'BCFG2_CONFIG_FILE' in environ:
-       Bcfg2.settings.read_config(cfile=environ['BCFG2_CONFIG_FILE'])
-  return django.core.handlers.wsgi.WSGIHandler()(environ, start_response)
+if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
+    from django.core.wsgi import get_wsgi_application
+    def application(environ, start_response):
+        if 'BCFG2_CONFIG_FILE' in environ:
+            Bcfg2.settings.read_config(cfile=environ['BCFG2_CONFIG_FILE'])
+        return get_wsgi_application()(environ, start_response)
+
+else:
+    import django.core.handlers.wsgi
+    def application(environ, start_response):
+        if 'BCFG2_CONFIG_FILE' in environ:
+            Bcfg2.settings.read_config(cfile=environ['BCFG2_CONFIG_FILE'])
+        return django.core.handlers.wsgi.WSGIHandler()(environ, start_response)
diff --git a/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py b/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py
index 0bb3111..8eadb87 100644
--- a/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py
+++ b/src/lib/Bcfg2/Reporting/Storage/DjangoORM.py
@@ -19,6 +19,9 @@ from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
 from django.db.models import FieldDoesNotExist
 from django.core.cache import cache
 from django import db
+import django
+if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
+    django.setup()
 
 #Used by GetCurrentEntry
 import difflib
diff --git a/src/lib/Bcfg2/Reporting/migrations/0001_initial.py b/src/lib/Bcfg2/Reporting/migrations/0001_initial.py
index 609290e..aab0df6 100644
--- a/src/lib/Bcfg2/Reporting/migrations/0001_initial.py
+++ b/src/lib/Bcfg2/Reporting/migrations/0001_initial.py
@@ -1,465 +1,543 @@
 # -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding model 'Client'
-        db.create_table('Reporting_client', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('creation', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_interaction', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='parent_client', null=True, to=orm['Reporting.Interaction'])),
-            ('expiration', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
-        ))
-        db.send_create_signal('Reporting', ['Client'])
-
-        # Adding model 'Interaction'
-        db.create_table('Reporting_interaction', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('client', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interactions', to=orm['Reporting.Client'])),
-            ('timestamp', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.CharField')(max_length=32)),
-            ('repo_rev_code', self.gf('django.db.models.fields.CharField')(max_length=64)),
-            ('server', self.gf('django.db.models.fields.CharField')(max_length=256)),
-            ('good_count', self.gf('django.db.models.fields.IntegerField')()),
-            ('total_count', self.gf('django.db.models.fields.IntegerField')()),
-            ('bad_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
-            ('modified_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
-            ('extra_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
-            ('profile', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.Group'])),
-        ))
-        db.send_create_signal('Reporting', ['Interaction'])
-
-        # Adding unique constraint on 'Interaction', fields ['client', 'timestamp']
-        db.create_unique('Reporting_interaction', ['client_id', 'timestamp'])
-
-        # Adding M2M table for field actions on 'Interaction'
-        db.create_table('Reporting_interaction_actions', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('actionentry', models.ForeignKey(orm['Reporting.actionentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_actions', ['interaction_id', 'actionentry_id'])
-
-        # Adding M2M table for field packages on 'Interaction'
-        db.create_table('Reporting_interaction_packages', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('packageentry', models.ForeignKey(orm['Reporting.packageentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_packages', ['interaction_id', 'packageentry_id'])
-
-        # Adding M2M table for field paths on 'Interaction'
-        db.create_table('Reporting_interaction_paths', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_paths', ['interaction_id', 'pathentry_id'])
-
-        # Adding M2M table for field services on 'Interaction'
-        db.create_table('Reporting_interaction_services', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('serviceentry', models.ForeignKey(orm['Reporting.serviceentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_services', ['interaction_id', 'serviceentry_id'])
-
-        # Adding M2M table for field failures on 'Interaction'
-        db.create_table('Reporting_interaction_failures', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('failureentry', models.ForeignKey(orm['Reporting.failureentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_failures', ['interaction_id', 'failureentry_id'])
-
-        # Adding M2M table for field groups on 'Interaction'
-        db.create_table('Reporting_interaction_groups', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('group', models.ForeignKey(orm['Reporting.group'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_groups', ['interaction_id', 'group_id'])
-
-        # Adding M2M table for field bundles on 'Interaction'
-        db.create_table('Reporting_interaction_bundles', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_bundles', ['interaction_id', 'bundle_id'])
-
-        # Adding model 'Performance'
-        db.create_table('Reporting_performance', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('interaction', self.gf('django.db.models.fields.related.ForeignKey')(related_name='performance_items', to=orm['Reporting.Interaction'])),
-            ('metric', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('value', self.gf('django.db.models.fields.DecimalField')(max_digits=32, decimal_places=16)),
-        ))
-        db.send_create_signal('Reporting', ['Performance'])
-
-        # Adding model 'Group'
-        db.create_table('Reporting_group', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
-            ('profile', self.gf('django.db.models.fields.BooleanField')(default=False)),
-            ('public', self.gf('django.db.models.fields.BooleanField')(default=False)),
-            ('category', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
-            ('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
-        ))
-        db.send_create_signal('Reporting', ['Group'])
-
-        # Adding M2M table for field groups on 'Group'
-        db.create_table('Reporting_group_groups', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('from_group', models.ForeignKey(orm['Reporting.group'], null=False)),
-            ('to_group', models.ForeignKey(orm['Reporting.group'], null=False))
-        ))
-        db.create_unique('Reporting_group_groups', ['from_group_id', 'to_group_id'])
-
-        # Adding M2M table for field bundles on 'Group'
-        db.create_table('Reporting_group_bundles', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('group', models.ForeignKey(orm['Reporting.group'], null=False)),
-            ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
-        ))
-        db.create_unique('Reporting_group_bundles', ['group_id', 'bundle_id'])
-
-        # Adding model 'Bundle'
-        db.create_table('Reporting_bundle', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
-        ))
-        db.send_create_signal('Reporting', ['Bundle'])
-
-        # Adding model 'FilePerms'
-        db.create_table('Reporting_fileperms', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('owner', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('group', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('perms', self.gf('django.db.models.fields.CharField')(max_length=128)),
-        ))
-        db.send_create_signal('Reporting', ['FilePerms'])
-
-        # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
-        db.create_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
-
-        # Adding model 'FileAcl'
-        db.create_table('Reporting_fileacl', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-        ))
-        db.send_create_signal('Reporting', ['FileAcl'])
-
-        # Adding model 'FailureEntry'
-        db.create_table('Reporting_failureentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
-            ('entry_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('message', self.gf('django.db.models.fields.TextField')()),
-        ))
-        db.send_create_signal('Reporting', ['FailureEntry'])
-
-        # Adding model 'ActionEntry'
-        db.create_table('Reporting_actionentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('status', self.gf('django.db.models.fields.CharField')(default='check', max_length=128)),
-            ('output', self.gf('django.db.models.fields.IntegerField')(default=0)),
-        ))
-        db.send_create_signal('Reporting', ['ActionEntry'])
-
-        # Adding model 'PackageEntry'
-        db.create_table('Reporting_packageentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('target_version', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)),
-            ('current_version', self.gf('django.db.models.fields.CharField')(max_length=1024)),
-            ('verification_details', self.gf('django.db.models.fields.TextField')(default='')),
-        ))
-        db.send_create_signal('Reporting', ['PackageEntry'])
-
-        # Adding model 'PathEntry'
-        db.create_table('Reporting_pathentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('path_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('target_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
-            ('current_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
-            ('detail_type', self.gf('django.db.models.fields.IntegerField')(default=0)),
-            ('details', self.gf('django.db.models.fields.TextField')(default='')),
-        ))
-        db.send_create_signal('Reporting', ['PathEntry'])
-
-        # Adding M2M table for field acls on 'PathEntry'
-        db.create_table('Reporting_pathentry_acls', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False)),
-            ('fileacl', models.ForeignKey(orm['Reporting.fileacl'], null=False))
-        ))
-        db.create_unique('Reporting_pathentry_acls', ['pathentry_id', 'fileacl_id'])
-
-        # Adding model 'LinkEntry'
-        db.create_table('Reporting_linkentry', (
-            ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
-            ('target_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
-            ('current_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
-        ))
-        db.send_create_signal('Reporting', ['LinkEntry'])
-
-        # Adding model 'DeviceEntry'
-        db.create_table('Reporting_deviceentry', (
-            ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
-            ('device_type', self.gf('django.db.models.fields.CharField')(max_length=16)),
-            ('target_major', self.gf('django.db.models.fields.IntegerField')()),
-            ('target_minor', self.gf('django.db.models.fields.IntegerField')()),
-            ('current_major', self.gf('django.db.models.fields.IntegerField')()),
-            ('current_minor', self.gf('django.db.models.fields.IntegerField')()),
-        ))
-        db.send_create_signal('Reporting', ['DeviceEntry'])
-
-        # Adding model 'ServiceEntry'
-        db.create_table('Reporting_serviceentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('target_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
-            ('current_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
-        ))
-        db.send_create_signal('Reporting', ['ServiceEntry'])
-
-
-    def backwards(self, orm):
-        # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
-        db.delete_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
-
-        # Removing unique constraint on 'Interaction', fields ['client', 'timestamp']
-        db.delete_unique('Reporting_interaction', ['client_id', 'timestamp'])
-
-        # Deleting model 'Client'
-        db.delete_table('Reporting_client')
-
-        # Deleting model 'Interaction'
-        db.delete_table('Reporting_interaction')
-
-        # Removing M2M table for field actions on 'Interaction'
-        db.delete_table('Reporting_interaction_actions')
-
-        # Removing M2M table for field packages on 'Interaction'
-        db.delete_table('Reporting_interaction_packages')
-
-        # Removing M2M table for field paths on 'Interaction'
-        db.delete_table('Reporting_interaction_paths')
-
-        # Removing M2M table for field services on 'Interaction'
-        db.delete_table('Reporting_interaction_services')
-
-        # Removing M2M table for field failures on 'Interaction'
-        db.delete_table('Reporting_interaction_failures')
-
-        # Removing M2M table for field groups on 'Interaction'
-        db.delete_table('Reporting_interaction_groups')
-
-        # Removing M2M table for field bundles on 'Interaction'
-        db.delete_table('Reporting_interaction_bundles')
-
-        # Deleting model 'Performance'
-        db.delete_table('Reporting_performance')
-
-        # Deleting model 'Group'
-        db.delete_table('Reporting_group')
-
-        # Removing M2M table for field groups on 'Group'
-        db.delete_table('Reporting_group_groups')
-
-        # Removing M2M table for field bundles on 'Group'
-        db.delete_table('Reporting_group_bundles')
-
-        # Deleting model 'Bundle'
-        db.delete_table('Reporting_bundle')
-
-        # Deleting model 'FilePerms'
-        db.delete_table('Reporting_fileperms')
-
-        # Deleting model 'FileAcl'
-        db.delete_table('Reporting_fileacl')
-
-        # Deleting model 'FailureEntry'
-        db.delete_table('Reporting_failureentry')
-
-        # Deleting model 'ActionEntry'
-        db.delete_table('Reporting_actionentry')
-
-        # Deleting model 'PackageEntry'
-        db.delete_table('Reporting_packageentry')
-
-        # Deleting model 'PathEntry'
-        db.delete_table('Reporting_pathentry')
-
-        # Removing M2M table for field acls on 'PathEntry'
-        db.delete_table('Reporting_pathentry_acls')
-
-        # Deleting model 'LinkEntry'
-        db.delete_table('Reporting_linkentry')
-
-        # Deleting model 'DeviceEntry'
-        db.delete_table('Reporting_deviceentry')
-
-        # Deleting model 'ServiceEntry'
-        db.delete_table('Reporting_serviceentry')
-
-
-    models = {
-        'Reporting.actionentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
-        },
-        'Reporting.bundle': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'Reporting.client': {
-            'Meta': {'object_name': 'Client'},
-            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
-            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.deviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_major': ('django.db.models.fields.IntegerField', [], {}),
-            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
-            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_major': ('django.db.models.fields.IntegerField', [], {}),
-            'target_minor': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.failureentry': {
-            'Meta': {'object_name': 'FailureEntry'},
-            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'message': ('django.db.models.fields.TextField', [], {}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileacl': {
-            'Meta': {'object_name': 'FileAcl'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileperms': {
-            'Meta': {'unique_together': "(('owner', 'group', 'perms'),)", 'object_name': 'FilePerms'},
-            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'perms': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.group': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
-            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
-        },
-        'Reporting.interaction': {
-            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
-            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
-            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
-            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
-            'good_count': ('django.db.models.fields.IntegerField', [], {}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
-            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
-            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
-            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
-            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
-            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
-            'total_count': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.linkentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
-        },
-        'Reporting.packageentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
-            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
-            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
-        },
-        'Reporting.pathentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
-            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
-            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
-            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
-        },
-        'Reporting.performance': {
-            'Meta': {'object_name': 'Performance'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
-            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
-        },
-        'Reporting.serviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
-            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
-        }
-    }
-
-    complete_apps = ['Reporting']
\ No newline at end of file
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ActionEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('status', models.CharField(default=b'check', max_length=128)),
+                ('output', models.IntegerField(default=0)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='Bundle',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(unique=True, max_length=255)),
+            ],
+            options={
+                'ordering': ('name',),
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='Client',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('creation', models.DateTimeField(auto_now_add=True)),
+                ('name', models.CharField(max_length=128)),
+                ('expiration', models.DateTimeField(null=True, blank=True)),
+            ],
+            options={
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='FailureEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('entry_type', models.CharField(max_length=128)),
+                ('message', models.TextField()),
+            ],
+            options={
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='FileAcl',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+            ],
+            options={
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='FilePerms',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('owner', models.CharField(max_length=128)),
+                ('group', models.CharField(max_length=128)),
+                ('mode', models.CharField(max_length=128)),
+            ],
+            options={
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='Group',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(unique=True, max_length=255)),
+                ('profile', models.BooleanField(default=False)),
+                ('public', models.BooleanField(default=False)),
+                ('category', models.CharField(max_length=1024, blank=True)),
+                ('comment', models.TextField(blank=True)),
+                ('bundles', models.ManyToManyField(to='Reporting.Bundle')),
+                ('groups', models.ManyToManyField(to='Reporting.Group')),
+            ],
+            options={
+                'ordering': ('name',),
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='Interaction',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('timestamp', models.DateTimeField(db_index=True)),
+                ('state', models.CharField(max_length=32)),
+                ('repo_rev_code', models.CharField(max_length=64)),
+                ('server', models.CharField(max_length=256)),
+                ('good_count', models.IntegerField()),
+                ('total_count', models.IntegerField()),
+                ('bad_count', models.IntegerField(default=0)),
+                ('modified_count', models.IntegerField(default=0)),
+                ('extra_count', models.IntegerField(default=0)),
+                ('actions', models.ManyToManyField(to='Reporting.ActionEntry')),
+                ('bundles', models.ManyToManyField(to='Reporting.Bundle')),
+                ('client', models.ForeignKey(related_name='interactions', to='Reporting.Client')),
+                ('failures', models.ManyToManyField(to='Reporting.FailureEntry')),
+                ('groups', models.ManyToManyField(to='Reporting.Group')),
+            ],
+            options={
+                'ordering': ['-timestamp'],
+                'get_latest_by': 'timestamp',
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='PackageEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('target_version', models.CharField(default=b'', max_length=1024)),
+                ('current_version', models.CharField(max_length=1024)),
+                ('verification_details', models.TextField(default=b'')),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='PathEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('path_type', models.CharField(max_length=128, choices=[(b'device', b'Device'), (b'directory', b'Directory'), (b'hardlink', b'Hard Link'), (b'nonexistent', b'Non Existent'), (b'permissions', b'Permissions'), (b'symlink', b'Symlink')])),
+                ('detail_type', models.IntegerField(default=0, choices=[(0, b'Unused'), (1, b'Diff'), (2, b'Binary'), (3, b'Sensitive'), (4, b'Size limit exceeded'), (5, b'VCS output'), (6, b'Pruned paths')])),
+                ('details', models.TextField(default=b'')),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='LinkEntry',
+            fields=[
+                ('pathentry_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='Reporting.PathEntry')),
+                ('target_path', models.CharField(max_length=1024, blank=True)),
+                ('current_path', models.CharField(max_length=1024, blank=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=('Reporting.pathentry',),
+        ),
+        migrations.CreateModel(
+            name='DeviceEntry',
+            fields=[
+                ('pathentry_ptr', models.OneToOneField(parent_link=True, auto_created=True, primary_key=True, serialize=False, to='Reporting.PathEntry')),
+                ('device_type', models.CharField(max_length=16, choices=[(b'block', b'Block'), (b'char', b'Char'), (b'fifo', b'Fifo')])),
+                ('target_major', models.IntegerField()),
+                ('target_minor', models.IntegerField()),
+                ('current_major', models.IntegerField()),
+                ('current_minor', models.IntegerField()),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=('Reporting.pathentry',),
+        ),
+        migrations.CreateModel(
+            name='Performance',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('metric', models.CharField(max_length=128)),
+                ('value', models.DecimalField(max_digits=32, decimal_places=16)),
+                ('interaction', models.ForeignKey(related_name='performance_items', to='Reporting.Interaction')),
+            ],
+            options={
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='POSIXGroupEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('gid', models.IntegerField(null=True)),
+                ('current_gid', models.IntegerField(null=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='POSIXUserEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('uid', models.IntegerField(null=True)),
+                ('current_uid', models.IntegerField(null=True)),
+                ('group', models.CharField(max_length=64)),
+                ('current_group', models.CharField(max_length=64, null=True)),
+                ('gecos', models.CharField(max_length=1024)),
+                ('current_gecos', models.CharField(max_length=1024, null=True)),
+                ('home', models.CharField(max_length=1024)),
+                ('current_home', models.CharField(max_length=1024, null=True)),
+                ('shell', models.CharField(default=b'/bin/bash', max_length=1024)),
+                ('current_shell', models.CharField(max_length=1024, null=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SEBooleanEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('value', models.BooleanField(default=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SEFcontextEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('selinuxtype', models.CharField(max_length=128)),
+                ('current_selinuxtype', models.CharField(max_length=128, null=True)),
+                ('filetype', models.CharField(max_length=16)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SEInterfaceEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('selinuxtype', models.CharField(max_length=128)),
+                ('current_selinuxtype', models.CharField(max_length=128, null=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SELoginEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('selinuxuser', models.CharField(max_length=128)),
+                ('current_selinuxuser', models.CharField(max_length=128, null=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SEModuleEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('disabled', models.BooleanField(default=False)),
+                ('current_disabled', models.BooleanField(default=False)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SENodeEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('selinuxtype', models.CharField(max_length=128)),
+                ('current_selinuxtype', models.CharField(max_length=128, null=True)),
+                ('proto', models.CharField(max_length=4)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SEPermissiveEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SEPortEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('selinuxtype', models.CharField(max_length=128)),
+                ('current_selinuxtype', models.CharField(max_length=128, null=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='ServiceEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('target_status', models.CharField(default=b'', max_length=128)),
+                ('current_status', models.CharField(default=b'', max_length=128)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.CreateModel(
+            name='SEUserEntry',
+            fields=[
+                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
+                ('name', models.CharField(max_length=128, db_index=True)),
+                ('hash_key', models.BigIntegerField(editable=False, db_index=True)),
+                ('state', models.IntegerField(choices=[(0, b'Good'), (1, b'Bad'), (2, b'Modified'), (3, b'Extra')])),
+                ('exists', models.BooleanField(default=True)),
+                ('roles', models.CharField(max_length=128)),
+                ('current_roles', models.CharField(max_length=128, null=True)),
+                ('prefix', models.CharField(max_length=128)),
+                ('current_prefix', models.CharField(max_length=128, null=True)),
+            ],
+            options={
+                'ordering': ('state', 'name'),
+                'abstract': False,
+            },
+            bases=(models.Model,),
+        ),
+        migrations.AddField(
+            model_name='pathentry',
+            name='acls',
+            field=models.ManyToManyField(to='Reporting.FileAcl'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='pathentry',
+            name='current_perms',
+            field=models.ForeignKey(related_name='+', to='Reporting.FilePerms'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='pathentry',
+            name='target_perms',
+            field=models.ForeignKey(related_name='+', to='Reporting.FilePerms'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='packages',
+            field=models.ManyToManyField(to='Reporting.PackageEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='paths',
+            field=models.ManyToManyField(to='Reporting.PathEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='posixgroups',
+            field=models.ManyToManyField(to='Reporting.POSIXGroupEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='posixusers',
+            field=models.ManyToManyField(to='Reporting.POSIXUserEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='profile',
+            field=models.ForeignKey(related_name='+', to='Reporting.Group', null=True),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='sebooleans',
+            field=models.ManyToManyField(to='Reporting.SEBooleanEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='sefcontexts',
+            field=models.ManyToManyField(to='Reporting.SEFcontextEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='seinterfaces',
+            field=models.ManyToManyField(to='Reporting.SEInterfaceEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='selogins',
+            field=models.ManyToManyField(to='Reporting.SELoginEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='semodules',
+            field=models.ManyToManyField(to='Reporting.SEModuleEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='senodes',
+            field=models.ManyToManyField(to='Reporting.SENodeEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='sepermissives',
+            field=models.ManyToManyField(to='Reporting.SEPermissiveEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='seports',
+            field=models.ManyToManyField(to='Reporting.SEPortEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='services',
+            field=models.ManyToManyField(to='Reporting.ServiceEntry'),
+            preserve_default=True,
+        ),
+        migrations.AddField(
+            model_name='interaction',
+            name='seusers',
+            field=models.ManyToManyField(to='Reporting.SEUserEntry'),
+            preserve_default=True,
+        ),
+        migrations.AlterUniqueTogether(
+            name='interaction',
+            unique_together=set([('client', 'timestamp')]),
+        ),
+        migrations.AlterUniqueTogether(
+            name='fileperms',
+            unique_together=set([('owner', 'group', 'mode')]),
+        ),
+        migrations.AddField(
+            model_name='client',
+            name='current_interaction',
+            field=models.ForeignKey(related_name='parent_client', blank=True, to='Reporting.Interaction', null=True),
+            preserve_default=True,
+        ),
+    ]
diff --git a/src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py b/src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
deleted file mode 100644
index 668094c..0000000
--- a/src/lib/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
+++ /dev/null
@@ -1,171 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-from Bcfg2 import settings
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Removing unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
-        db.delete_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
-
-        # Renaming field 'FilePerms.perms' to 'FilePerms.mode'
-        db.rename_column('Reporting_fileperms', 'perms', 'mode')
-
-        if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
-            # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
-            db.create_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
-
-
-    def backwards(self, orm):
-        # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
-        db.delete_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
-
-        # Renaming field 'FilePerms.mode' to 'FilePerms.perms'
-        db.rename_column('Reporting_fileperms', 'mode', 'perms')
-
-        if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
-            # Adding unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
-            db.create_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
-
-
-    models = {
-        'Reporting.actionentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
-        },
-        'Reporting.bundle': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'Reporting.client': {
-            'Meta': {'object_name': 'Client'},
-            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
-            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.deviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_major': ('django.db.models.fields.IntegerField', [], {}),
-            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
-            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_major': ('django.db.models.fields.IntegerField', [], {}),
-            'target_minor': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.failureentry': {
-            'Meta': {'object_name': 'FailureEntry'},
-            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'message': ('django.db.models.fields.TextField', [], {}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileacl': {
-            'Meta': {'object_name': 'FileAcl'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileperms': {
-            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
-            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.group': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
-            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
-        },
-        'Reporting.interaction': {
-            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
-            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
-            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
-            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
-            'good_count': ('django.db.models.fields.IntegerField', [], {}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
-            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
-            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
-            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
-            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
-            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
-            'total_count': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.linkentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
-        },
-        'Reporting.packageentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
-            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
-            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
-        },
-        'Reporting.pathentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
-            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
-            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
-            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
-        },
-        'Reporting.performance': {
-            'Meta': {'object_name': 'Performance'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
-            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
-        },
-        'Reporting.serviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
-            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
-        }
-    }
-
-    complete_apps = ['Reporting']
diff --git a/src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py b/src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
deleted file mode 100644
index 2da1fa7..0000000
--- a/src/lib/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-
-        # Changing field 'FailureEntry.hash_key'
-        db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
-
-        # Changing field 'PackageEntry.hash_key'
-        db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
-
-        # Changing field 'ServiceEntry.hash_key'
-        db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
-
-        # Changing field 'PathEntry.hash_key'
-        db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
-
-        # Changing field 'ActionEntry.hash_key'
-        db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
-
-    def backwards(self, orm):
-
-        # Changing field 'FailureEntry.hash_key'
-        db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
-
-        # Changing field 'PackageEntry.hash_key'
-        db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
-
-        # Changing field 'ServiceEntry.hash_key'
-        db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
-
-        # Changing field 'PathEntry.hash_key'
-        db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
-
-        # Changing field 'ActionEntry.hash_key'
-        db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
-
-    models = {
-        'Reporting.actionentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
-        },
-        'Reporting.bundle': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'Reporting.client': {
-            'Meta': {'object_name': 'Client'},
-            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
-            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.deviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_major': ('django.db.models.fields.IntegerField', [], {}),
-            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
-            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_major': ('django.db.models.fields.IntegerField', [], {}),
-            'target_minor': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.failureentry': {
-            'Meta': {'object_name': 'FailureEntry'},
-            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'message': ('django.db.models.fields.TextField', [], {}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileacl': {
-            'Meta': {'object_name': 'FileAcl'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileperms': {
-            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
-            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.group': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
-            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
-        },
-        'Reporting.interaction': {
-            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
-            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
-            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
-            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
-            'good_count': ('django.db.models.fields.IntegerField', [], {}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
-            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
-            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
-            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
-            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
-            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
-            'total_count': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.linkentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
-        },
-        'Reporting.packageentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
-            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
-            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
-        },
-        'Reporting.pathentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
-            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
-            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
-            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
-        },
-        'Reporting.performance': {
-            'Meta': {'object_name': 'Performance'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
-            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
-        },
-        'Reporting.serviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
-            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
-        }
-    }
-
-    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py b/src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
deleted file mode 100644
index 26a053b..0000000
--- a/src/lib/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
+++ /dev/null
@@ -1,156 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-
-        # Changing field 'Interaction.profile'
-        db.alter_column('Reporting_interaction', 'profile_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['Reporting.Group']))
-
-    def backwards(self, orm):
-
-        # User chose to not deal with backwards NULL issues for 'Interaction.profile'
-        raise RuntimeError("Cannot reverse this migration. 'Interaction.profile' and its values cannot be restored.")
-
-    models = {
-        'Reporting.actionentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
-        },
-        'Reporting.bundle': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'Reporting.client': {
-            'Meta': {'object_name': 'Client'},
-            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
-            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.deviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_major': ('django.db.models.fields.IntegerField', [], {}),
-            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
-            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_major': ('django.db.models.fields.IntegerField', [], {}),
-            'target_minor': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.failureentry': {
-            'Meta': {'object_name': 'FailureEntry'},
-            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'message': ('django.db.models.fields.TextField', [], {}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileacl': {
-            'Meta': {'object_name': 'FileAcl'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileperms': {
-            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
-            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.group': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
-            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
-        },
-        'Reporting.interaction': {
-            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
-            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
-            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
-            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
-            'good_count': ('django.db.models.fields.IntegerField', [], {}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
-            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
-            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
-            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
-            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
-            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
-            'total_count': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.linkentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
-        },
-        'Reporting.packageentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
-            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
-            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
-        },
-        'Reporting.pathentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
-            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
-            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
-            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
-        },
-        'Reporting.performance': {
-            'Meta': {'object_name': 'Performance'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
-            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
-        },
-        'Reporting.serviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
-            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
-        }
-    }
-
-    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py b/src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
deleted file mode 100644
index d5f5d80..0000000
--- a/src/lib/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
+++ /dev/null
@@ -1,485 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding model 'SELoginEntry'
-        db.create_table('Reporting_seloginentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
-        ))
-        db.send_create_signal('Reporting', ['SELoginEntry'])
-
-        # Adding model 'SEUserEntry'
-        db.create_table('Reporting_seuserentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('roles', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_roles', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
-            ('prefix', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_prefix', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
-        ))
-        db.send_create_signal('Reporting', ['SEUserEntry'])
-
-        # Adding model 'SEBooleanEntry'
-        db.create_table('Reporting_sebooleanentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('value', self.gf('django.db.models.fields.BooleanField')(default=True)),
-        ))
-        db.send_create_signal('Reporting', ['SEBooleanEntry'])
-
-        # Adding model 'SENodeEntry'
-        db.create_table('Reporting_senodeentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
-            ('proto', self.gf('django.db.models.fields.CharField')(max_length=4)),
-        ))
-        db.send_create_signal('Reporting', ['SENodeEntry'])
-
-        # Adding model 'SEFcontextEntry'
-        db.create_table('Reporting_sefcontextentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
-            ('filetype', self.gf('django.db.models.fields.CharField')(max_length=16)),
-        ))
-        db.send_create_signal('Reporting', ['SEFcontextEntry'])
-
-        # Adding model 'SEInterfaceEntry'
-        db.create_table('Reporting_seinterfaceentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
-        ))
-        db.send_create_signal('Reporting', ['SEInterfaceEntry'])
-
-        # Adding model 'SEPermissiveEntry'
-        db.create_table('Reporting_sepermissiveentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-        ))
-        db.send_create_signal('Reporting', ['SEPermissiveEntry'])
-
-        # Adding model 'SEModuleEntry'
-        db.create_table('Reporting_semoduleentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
-            ('current_disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
-        ))
-        db.send_create_signal('Reporting', ['SEModuleEntry'])
-
-        # Adding model 'SEPortEntry'
-        db.create_table('Reporting_seportentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
-            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
-        ))
-        db.send_create_signal('Reporting', ['SEPortEntry'])
-
-        # Adding M2M table for field sebooleans on 'Interaction'
-        db.create_table('Reporting_interaction_sebooleans', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('sebooleanentry', models.ForeignKey(orm['Reporting.sebooleanentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_sebooleans', ['interaction_id', 'sebooleanentry_id'])
-
-        # Adding M2M table for field seports on 'Interaction'
-        db.create_table('Reporting_interaction_seports', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('seportentry', models.ForeignKey(orm['Reporting.seportentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_seports', ['interaction_id', 'seportentry_id'])
-
-        # Adding M2M table for field sefcontexts on 'Interaction'
-        db.create_table('Reporting_interaction_sefcontexts', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('sefcontextentry', models.ForeignKey(orm['Reporting.sefcontextentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_sefcontexts', ['interaction_id', 'sefcontextentry_id'])
-
-        # Adding M2M table for field senodes on 'Interaction'
-        db.create_table('Reporting_interaction_senodes', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('senodeentry', models.ForeignKey(orm['Reporting.senodeentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_senodes', ['interaction_id', 'senodeentry_id'])
-
-        # Adding M2M table for field selogins on 'Interaction'
-        db.create_table('Reporting_interaction_selogins', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('seloginentry', models.ForeignKey(orm['Reporting.seloginentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_selogins', ['interaction_id', 'seloginentry_id'])
-
-        # Adding M2M table for field seusers on 'Interaction'
-        db.create_table('Reporting_interaction_seusers', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('seuserentry', models.ForeignKey(orm['Reporting.seuserentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_seusers', ['interaction_id', 'seuserentry_id'])
-
-        # Adding M2M table for field seinterfaces on 'Interaction'
-        db.create_table('Reporting_interaction_seinterfaces', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('seinterfaceentry', models.ForeignKey(orm['Reporting.seinterfaceentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_seinterfaces', ['interaction_id', 'seinterfaceentry_id'])
-
-        # Adding M2M table for field sepermissives on 'Interaction'
-        db.create_table('Reporting_interaction_sepermissives', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('sepermissiveentry', models.ForeignKey(orm['Reporting.sepermissiveentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_sepermissives', ['interaction_id', 'sepermissiveentry_id'])
-
-        # Adding M2M table for field semodules on 'Interaction'
-        db.create_table('Reporting_interaction_semodules', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('semoduleentry', models.ForeignKey(orm['Reporting.semoduleentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_semodules', ['interaction_id', 'semoduleentry_id'])
-
-
-    def backwards(self, orm):
-        # Deleting model 'SELoginEntry'
-        db.delete_table('Reporting_seloginentry')
-
-        # Deleting model 'SEUserEntry'
-        db.delete_table('Reporting_seuserentry')
-
-        # Deleting model 'SEBooleanEntry'
-        db.delete_table('Reporting_sebooleanentry')
-
-        # Deleting model 'SENodeEntry'
-        db.delete_table('Reporting_senodeentry')
-
-        # Deleting model 'SEFcontextEntry'
-        db.delete_table('Reporting_sefcontextentry')
-
-        # Deleting model 'SEInterfaceEntry'
-        db.delete_table('Reporting_seinterfaceentry')
-
-        # Deleting model 'SEPermissiveEntry'
-        db.delete_table('Reporting_sepermissiveentry')
-
-        # Deleting model 'SEModuleEntry'
-        db.delete_table('Reporting_semoduleentry')
-
-        # Deleting model 'SEPortEntry'
-        db.delete_table('Reporting_seportentry')
-
-        # Removing M2M table for field sebooleans on 'Interaction'
-        db.delete_table('Reporting_interaction_sebooleans')
-
-        # Removing M2M table for field seports on 'Interaction'
-        db.delete_table('Reporting_interaction_seports')
-
-        # Removing M2M table for field sefcontexts on 'Interaction'
-        db.delete_table('Reporting_interaction_sefcontexts')
-
-        # Removing M2M table for field senodes on 'Interaction'
-        db.delete_table('Reporting_interaction_senodes')
-
-        # Removing M2M table for field selogins on 'Interaction'
-        db.delete_table('Reporting_interaction_selogins')
-
-        # Removing M2M table for field seusers on 'Interaction'
-        db.delete_table('Reporting_interaction_seusers')
-
-        # Removing M2M table for field seinterfaces on 'Interaction'
-        db.delete_table('Reporting_interaction_seinterfaces')
-
-        # Removing M2M table for field sepermissives on 'Interaction'
-        db.delete_table('Reporting_interaction_sepermissives')
-
-        # Removing M2M table for field semodules on 'Interaction'
-        db.delete_table('Reporting_interaction_semodules')
-
-
-    models = {
-        'Reporting.actionentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
-        },
-        'Reporting.bundle': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'Reporting.client': {
-            'Meta': {'object_name': 'Client'},
-            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
-            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.deviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_major': ('django.db.models.fields.IntegerField', [], {}),
-            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
-            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_major': ('django.db.models.fields.IntegerField', [], {}),
-            'target_minor': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.failureentry': {
-            'Meta': {'object_name': 'FailureEntry'},
-            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'message': ('django.db.models.fields.TextField', [], {}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileacl': {
-            'Meta': {'object_name': 'FileAcl'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileperms': {
-            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
-            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.group': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
-            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
-        },
-        'Reporting.interaction': {
-            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
-            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
-            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
-            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
-            'good_count': ('django.db.models.fields.IntegerField', [], {}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
-            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
-            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
-            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
-            'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
-            'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
-            'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
-            'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
-            'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
-            'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
-            'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
-            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
-            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
-            'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
-            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
-            'total_count': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.linkentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
-        },
-        'Reporting.packageentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
-            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
-            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
-        },
-        'Reporting.pathentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
-            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
-            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
-            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
-        },
-        'Reporting.performance': {
-            'Meta': {'object_name': 'Performance'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
-            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
-        },
-        'Reporting.sebooleanentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
-        },
-        'Reporting.sefcontextentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.seinterfaceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.seloginentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
-            'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.semoduleentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
-            'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.senodeentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.sepermissiveentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.seportentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.serviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
-            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
-        },
-        'Reporting.seuserentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
-            'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        }
-    }
-
-    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py b/src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
deleted file mode 100644
index d86e663..0000000
--- a/src/lib/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
+++ /dev/null
@@ -1,340 +0,0 @@
-# -*- coding: utf-8 -*-
-import datetime
-from south.db import db
-from south.v2 import SchemaMigration
-from django.db import models
-
-
-class Migration(SchemaMigration):
-
-    def forwards(self, orm):
-        # Adding model 'POSIXGroupEntry'
-        db.create_table('Reporting_posixgroupentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
-            ('current_gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
-        ))
-        db.send_create_signal('Reporting', ['POSIXGroupEntry'])
-
-        # Adding model 'POSIXUserEntry'
-        db.create_table('Reporting_posixuserentry', (
-            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
-            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
-            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
-            ('state', self.gf('django.db.models.fields.IntegerField')()),
-            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
-            ('uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
-            ('current_uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
-            ('group', self.gf('django.db.models.fields.CharField')(max_length=64)),
-            ('current_group', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
-            ('gecos', self.gf('django.db.models.fields.CharField')(max_length=1024)),
-            ('current_gecos', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
-            ('home', self.gf('django.db.models.fields.CharField')(max_length=1024)),
-            ('current_home', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
-            ('shell', self.gf('django.db.models.fields.CharField')(default='/bin/bash', max_length=1024)),
-            ('current_shell', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
-        ))
-        db.send_create_signal('Reporting', ['POSIXUserEntry'])
-
-        # Adding M2M table for field posixusers on 'Interaction'
-        db.create_table('Reporting_interaction_posixusers', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('posixuserentry', models.ForeignKey(orm['Reporting.posixuserentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_posixusers', ['interaction_id', 'posixuserentry_id'])
-
-        # Adding M2M table for field posixgroups on 'Interaction'
-        db.create_table('Reporting_interaction_posixgroups', (
-            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
-            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
-            ('posixgroupentry', models.ForeignKey(orm['Reporting.posixgroupentry'], null=False))
-        ))
-        db.create_unique('Reporting_interaction_posixgroups', ['interaction_id', 'posixgroupentry_id'])
-
-
-    def backwards(self, orm):
-        # Deleting model 'POSIXGroupEntry'
-        db.delete_table('Reporting_posixgroupentry')
-
-        # Deleting model 'POSIXUserEntry'
-        db.delete_table('Reporting_posixuserentry')
-
-        # Removing M2M table for field posixusers on 'Interaction'
-        db.delete_table('Reporting_interaction_posixusers')
-
-        # Removing M2M table for field posixgroups on 'Interaction'
-        db.delete_table('Reporting_interaction_posixgroups')
-
-
-    models = {
-        'Reporting.actionentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
-        },
-        'Reporting.bundle': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
-        },
-        'Reporting.client': {
-            'Meta': {'object_name': 'Client'},
-            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
-            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
-            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.deviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_major': ('django.db.models.fields.IntegerField', [], {}),
-            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
-            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_major': ('django.db.models.fields.IntegerField', [], {}),
-            'target_minor': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.failureentry': {
-            'Meta': {'object_name': 'FailureEntry'},
-            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'message': ('django.db.models.fields.TextField', [], {}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileacl': {
-            'Meta': {'object_name': 'FileAcl'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
-        },
-        'Reporting.fileperms': {
-            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
-            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
-        },
-        'Reporting.group': {
-            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
-            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
-        },
-        'Reporting.interaction': {
-            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
-            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
-            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
-            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
-            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
-            'good_count': ('django.db.models.fields.IntegerField', [], {}),
-            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
-            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
-            'posixgroups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXGroupEntry']", 'symmetrical': 'False'}),
-            'posixusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXUserEntry']", 'symmetrical': 'False'}),
-            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
-            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
-            'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
-            'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
-            'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
-            'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
-            'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
-            'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
-            'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
-            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
-            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
-            'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
-            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
-            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
-            'total_count': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.linkentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
-            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
-            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
-            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
-        },
-        'Reporting.packageentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
-            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
-            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
-        },
-        'Reporting.pathentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
-            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
-            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
-            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
-            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
-        },
-        'Reporting.performance': {
-            'Meta': {'object_name': 'Performance'},
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
-            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
-        },
-        'Reporting.posixgroupentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXGroupEntry'},
-            'current_gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.posixuserentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXUserEntry'},
-            'current_gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
-            'current_group': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
-            'current_home': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
-            'current_shell': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
-            'current_uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'group': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'home': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'shell': ('django.db.models.fields.CharField', [], {'default': "'/bin/bash'", 'max_length': '1024'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
-        },
-        'Reporting.sebooleanentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
-        },
-        'Reporting.sefcontextentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.seinterfaceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.seloginentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
-            'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.semoduleentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
-            'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.senodeentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.sepermissiveentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.seportentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
-            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        },
-        'Reporting.serviceentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
-            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'state': ('django.db.models.fields.IntegerField', [], {}),
-            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
-        },
-        'Reporting.seuserentry': {
-            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
-            'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
-            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
-            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
-            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
-            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
-            'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
-            'state': ('django.db.models.fields.IntegerField', [], {})
-        }
-    }
-
-    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py b/src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py
new file mode 100644
index 0000000..609290e
--- /dev/null
+++ b/src/lib/Bcfg2/Reporting/south_migrations/0001_initial.py
@@ -0,0 +1,465 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'Client'
+        db.create_table('Reporting_client', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('creation', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_interaction', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='parent_client', null=True, to=orm['Reporting.Interaction'])),
+            ('expiration', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
+        ))
+        db.send_create_signal('Reporting', ['Client'])
+
+        # Adding model 'Interaction'
+        db.create_table('Reporting_interaction', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('client', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interactions', to=orm['Reporting.Client'])),
+            ('timestamp', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.CharField')(max_length=32)),
+            ('repo_rev_code', self.gf('django.db.models.fields.CharField')(max_length=64)),
+            ('server', self.gf('django.db.models.fields.CharField')(max_length=256)),
+            ('good_count', self.gf('django.db.models.fields.IntegerField')()),
+            ('total_count', self.gf('django.db.models.fields.IntegerField')()),
+            ('bad_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
+            ('modified_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
+            ('extra_count', self.gf('django.db.models.fields.IntegerField')(default=0)),
+            ('profile', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.Group'])),
+        ))
+        db.send_create_signal('Reporting', ['Interaction'])
+
+        # Adding unique constraint on 'Interaction', fields ['client', 'timestamp']
+        db.create_unique('Reporting_interaction', ['client_id', 'timestamp'])
+
+        # Adding M2M table for field actions on 'Interaction'
+        db.create_table('Reporting_interaction_actions', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('actionentry', models.ForeignKey(orm['Reporting.actionentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_actions', ['interaction_id', 'actionentry_id'])
+
+        # Adding M2M table for field packages on 'Interaction'
+        db.create_table('Reporting_interaction_packages', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('packageentry', models.ForeignKey(orm['Reporting.packageentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_packages', ['interaction_id', 'packageentry_id'])
+
+        # Adding M2M table for field paths on 'Interaction'
+        db.create_table('Reporting_interaction_paths', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_paths', ['interaction_id', 'pathentry_id'])
+
+        # Adding M2M table for field services on 'Interaction'
+        db.create_table('Reporting_interaction_services', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('serviceentry', models.ForeignKey(orm['Reporting.serviceentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_services', ['interaction_id', 'serviceentry_id'])
+
+        # Adding M2M table for field failures on 'Interaction'
+        db.create_table('Reporting_interaction_failures', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('failureentry', models.ForeignKey(orm['Reporting.failureentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_failures', ['interaction_id', 'failureentry_id'])
+
+        # Adding M2M table for field groups on 'Interaction'
+        db.create_table('Reporting_interaction_groups', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('group', models.ForeignKey(orm['Reporting.group'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_groups', ['interaction_id', 'group_id'])
+
+        # Adding M2M table for field bundles on 'Interaction'
+        db.create_table('Reporting_interaction_bundles', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_bundles', ['interaction_id', 'bundle_id'])
+
+        # Adding model 'Performance'
+        db.create_table('Reporting_performance', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('interaction', self.gf('django.db.models.fields.related.ForeignKey')(related_name='performance_items', to=orm['Reporting.Interaction'])),
+            ('metric', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('value', self.gf('django.db.models.fields.DecimalField')(max_digits=32, decimal_places=16)),
+        ))
+        db.send_create_signal('Reporting', ['Performance'])
+
+        # Adding model 'Group'
+        db.create_table('Reporting_group', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
+            ('profile', self.gf('django.db.models.fields.BooleanField')(default=False)),
+            ('public', self.gf('django.db.models.fields.BooleanField')(default=False)),
+            ('category', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
+            ('comment', self.gf('django.db.models.fields.TextField')(blank=True)),
+        ))
+        db.send_create_signal('Reporting', ['Group'])
+
+        # Adding M2M table for field groups on 'Group'
+        db.create_table('Reporting_group_groups', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('from_group', models.ForeignKey(orm['Reporting.group'], null=False)),
+            ('to_group', models.ForeignKey(orm['Reporting.group'], null=False))
+        ))
+        db.create_unique('Reporting_group_groups', ['from_group_id', 'to_group_id'])
+
+        # Adding M2M table for field bundles on 'Group'
+        db.create_table('Reporting_group_bundles', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('group', models.ForeignKey(orm['Reporting.group'], null=False)),
+            ('bundle', models.ForeignKey(orm['Reporting.bundle'], null=False))
+        ))
+        db.create_unique('Reporting_group_bundles', ['group_id', 'bundle_id'])
+
+        # Adding model 'Bundle'
+        db.create_table('Reporting_bundle', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(unique=True, max_length=255)),
+        ))
+        db.send_create_signal('Reporting', ['Bundle'])
+
+        # Adding model 'FilePerms'
+        db.create_table('Reporting_fileperms', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('owner', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('group', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('perms', self.gf('django.db.models.fields.CharField')(max_length=128)),
+        ))
+        db.send_create_signal('Reporting', ['FilePerms'])
+
+        # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
+        db.create_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
+
+        # Adding model 'FileAcl'
+        db.create_table('Reporting_fileacl', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+        ))
+        db.send_create_signal('Reporting', ['FileAcl'])
+
+        # Adding model 'FailureEntry'
+        db.create_table('Reporting_failureentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+            ('entry_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('message', self.gf('django.db.models.fields.TextField')()),
+        ))
+        db.send_create_signal('Reporting', ['FailureEntry'])
+
+        # Adding model 'ActionEntry'
+        db.create_table('Reporting_actionentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('status', self.gf('django.db.models.fields.CharField')(default='check', max_length=128)),
+            ('output', self.gf('django.db.models.fields.IntegerField')(default=0)),
+        ))
+        db.send_create_signal('Reporting', ['ActionEntry'])
+
+        # Adding model 'PackageEntry'
+        db.create_table('Reporting_packageentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('target_version', self.gf('django.db.models.fields.CharField')(default='', max_length=1024)),
+            ('current_version', self.gf('django.db.models.fields.CharField')(max_length=1024)),
+            ('verification_details', self.gf('django.db.models.fields.TextField')(default='')),
+        ))
+        db.send_create_signal('Reporting', ['PackageEntry'])
+
+        # Adding model 'PathEntry'
+        db.create_table('Reporting_pathentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('path_type', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('target_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
+            ('current_perms', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['Reporting.FilePerms'])),
+            ('detail_type', self.gf('django.db.models.fields.IntegerField')(default=0)),
+            ('details', self.gf('django.db.models.fields.TextField')(default='')),
+        ))
+        db.send_create_signal('Reporting', ['PathEntry'])
+
+        # Adding M2M table for field acls on 'PathEntry'
+        db.create_table('Reporting_pathentry_acls', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('pathentry', models.ForeignKey(orm['Reporting.pathentry'], null=False)),
+            ('fileacl', models.ForeignKey(orm['Reporting.fileacl'], null=False))
+        ))
+        db.create_unique('Reporting_pathentry_acls', ['pathentry_id', 'fileacl_id'])
+
+        # Adding model 'LinkEntry'
+        db.create_table('Reporting_linkentry', (
+            ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
+            ('target_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
+            ('current_path', self.gf('django.db.models.fields.CharField')(max_length=1024, blank=True)),
+        ))
+        db.send_create_signal('Reporting', ['LinkEntry'])
+
+        # Adding model 'DeviceEntry'
+        db.create_table('Reporting_deviceentry', (
+            ('pathentry_ptr', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['Reporting.PathEntry'], unique=True, primary_key=True)),
+            ('device_type', self.gf('django.db.models.fields.CharField')(max_length=16)),
+            ('target_major', self.gf('django.db.models.fields.IntegerField')()),
+            ('target_minor', self.gf('django.db.models.fields.IntegerField')()),
+            ('current_major', self.gf('django.db.models.fields.IntegerField')()),
+            ('current_minor', self.gf('django.db.models.fields.IntegerField')()),
+        ))
+        db.send_create_signal('Reporting', ['DeviceEntry'])
+
+        # Adding model 'ServiceEntry'
+        db.create_table('Reporting_serviceentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.IntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('target_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
+            ('current_status', self.gf('django.db.models.fields.CharField')(default='', max_length=128)),
+        ))
+        db.send_create_signal('Reporting', ['ServiceEntry'])
+
+
+    def backwards(self, orm):
+        # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'perms']
+        db.delete_unique('Reporting_fileperms', ['owner', 'group', 'perms'])
+
+        # Removing unique constraint on 'Interaction', fields ['client', 'timestamp']
+        db.delete_unique('Reporting_interaction', ['client_id', 'timestamp'])
+
+        # Deleting model 'Client'
+        db.delete_table('Reporting_client')
+
+        # Deleting model 'Interaction'
+        db.delete_table('Reporting_interaction')
+
+        # Removing M2M table for field actions on 'Interaction'
+        db.delete_table('Reporting_interaction_actions')
+
+        # Removing M2M table for field packages on 'Interaction'
+        db.delete_table('Reporting_interaction_packages')
+
+        # Removing M2M table for field paths on 'Interaction'
+        db.delete_table('Reporting_interaction_paths')
+
+        # Removing M2M table for field services on 'Interaction'
+        db.delete_table('Reporting_interaction_services')
+
+        # Removing M2M table for field failures on 'Interaction'
+        db.delete_table('Reporting_interaction_failures')
+
+        # Removing M2M table for field groups on 'Interaction'
+        db.delete_table('Reporting_interaction_groups')
+
+        # Removing M2M table for field bundles on 'Interaction'
+        db.delete_table('Reporting_interaction_bundles')
+
+        # Deleting model 'Performance'
+        db.delete_table('Reporting_performance')
+
+        # Deleting model 'Group'
+        db.delete_table('Reporting_group')
+
+        # Removing M2M table for field groups on 'Group'
+        db.delete_table('Reporting_group_groups')
+
+        # Removing M2M table for field bundles on 'Group'
+        db.delete_table('Reporting_group_bundles')
+
+        # Deleting model 'Bundle'
+        db.delete_table('Reporting_bundle')
+
+        # Deleting model 'FilePerms'
+        db.delete_table('Reporting_fileperms')
+
+        # Deleting model 'FileAcl'
+        db.delete_table('Reporting_fileacl')
+
+        # Deleting model 'FailureEntry'
+        db.delete_table('Reporting_failureentry')
+
+        # Deleting model 'ActionEntry'
+        db.delete_table('Reporting_actionentry')
+
+        # Deleting model 'PackageEntry'
+        db.delete_table('Reporting_packageentry')
+
+        # Deleting model 'PathEntry'
+        db.delete_table('Reporting_pathentry')
+
+        # Removing M2M table for field acls on 'PathEntry'
+        db.delete_table('Reporting_pathentry_acls')
+
+        # Deleting model 'LinkEntry'
+        db.delete_table('Reporting_linkentry')
+
+        # Deleting model 'DeviceEntry'
+        db.delete_table('Reporting_deviceentry')
+
+        # Deleting model 'ServiceEntry'
+        db.delete_table('Reporting_serviceentry')
+
+
+    models = {
+        'Reporting.actionentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+        },
+        'Reporting.bundle': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'Reporting.client': {
+            'Meta': {'object_name': 'Client'},
+            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.deviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_major': ('django.db.models.fields.IntegerField', [], {}),
+            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_major': ('django.db.models.fields.IntegerField', [], {}),
+            'target_minor': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.failureentry': {
+            'Meta': {'object_name': 'FailureEntry'},
+            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileacl': {
+            'Meta': {'object_name': 'FileAcl'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileperms': {
+            'Meta': {'unique_together': "(('owner', 'group', 'perms'),)", 'object_name': 'FilePerms'},
+            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'perms': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.group': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'Reporting.interaction': {
+            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+            'good_count': ('django.db.models.fields.IntegerField', [], {}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
+            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+            'total_count': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.linkentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+        },
+        'Reporting.packageentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'Reporting.pathentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+        },
+        'Reporting.performance': {
+            'Meta': {'object_name': 'Performance'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+        },
+        'Reporting.serviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+        }
+    }
+
+    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py b/src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py
new file mode 100644
index 0000000..668094c
--- /dev/null
+++ b/src/lib/Bcfg2/Reporting/south_migrations/0002_convert_perms_to_mode.py
@@ -0,0 +1,171 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+from Bcfg2 import settings
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Removing unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
+        db.delete_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
+
+        # Renaming field 'FilePerms.perms' to 'FilePerms.mode'
+        db.rename_column('Reporting_fileperms', 'perms', 'mode')
+
+        if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
+            # Adding unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
+            db.create_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
+
+
+    def backwards(self, orm):
+        # Removing unique constraint on 'FilePerms', fields ['owner', 'group', 'mode']
+        db.delete_unique('Reporting_fileperms', ['owner', 'group', 'mode'])
+
+        # Renaming field 'FilePerms.mode' to 'FilePerms.perms'
+        db.rename_column('Reporting_fileperms', 'mode', 'perms')
+
+        if not settings.DATABASES['default']['ENGINE'] == 'django.db.backends.sqlite3':
+            # Adding unique constraint on 'FilePerms', fields ['owner', 'perms', 'group']
+            db.create_unique('Reporting_fileperms', ['owner', 'perms', 'group'])
+
+
+    models = {
+        'Reporting.actionentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+        },
+        'Reporting.bundle': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'Reporting.client': {
+            'Meta': {'object_name': 'Client'},
+            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.deviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_major': ('django.db.models.fields.IntegerField', [], {}),
+            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_major': ('django.db.models.fields.IntegerField', [], {}),
+            'target_minor': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.failureentry': {
+            'Meta': {'object_name': 'FailureEntry'},
+            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileacl': {
+            'Meta': {'object_name': 'FileAcl'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileperms': {
+            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.group': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'Reporting.interaction': {
+            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+            'good_count': ('django.db.models.fields.IntegerField', [], {}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
+            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+            'total_count': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.linkentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+        },
+        'Reporting.packageentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'Reporting.pathentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+        },
+        'Reporting.performance': {
+            'Meta': {'object_name': 'Performance'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+        },
+        'Reporting.serviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+        }
+    }
+
+    complete_apps = ['Reporting']
diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py b/src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py
new file mode 100644
index 0000000..2da1fa7
--- /dev/null
+++ b/src/lib/Bcfg2/Reporting/south_migrations/0003_expand_hash_key.py
@@ -0,0 +1,180 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+
+        # Changing field 'FailureEntry.hash_key'
+        db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+
+        # Changing field 'PackageEntry.hash_key'
+        db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+
+        # Changing field 'ServiceEntry.hash_key'
+        db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+
+        # Changing field 'PathEntry.hash_key'
+        db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+
+        # Changing field 'ActionEntry.hash_key'
+        db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.BigIntegerField')())
+
+    def backwards(self, orm):
+
+        # Changing field 'FailureEntry.hash_key'
+        db.alter_column('Reporting_failureentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+
+        # Changing field 'PackageEntry.hash_key'
+        db.alter_column('Reporting_packageentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+
+        # Changing field 'ServiceEntry.hash_key'
+        db.alter_column('Reporting_serviceentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+
+        # Changing field 'PathEntry.hash_key'
+        db.alter_column('Reporting_pathentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+
+        # Changing field 'ActionEntry.hash_key'
+        db.alter_column('Reporting_actionentry', 'hash_key', self.gf('django.db.models.fields.IntegerField')())
+
+    models = {
+        'Reporting.actionentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+        },
+        'Reporting.bundle': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'Reporting.client': {
+            'Meta': {'object_name': 'Client'},
+            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.deviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_major': ('django.db.models.fields.IntegerField', [], {}),
+            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_major': ('django.db.models.fields.IntegerField', [], {}),
+            'target_minor': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.failureentry': {
+            'Meta': {'object_name': 'FailureEntry'},
+            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileacl': {
+            'Meta': {'object_name': 'FileAcl'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileperms': {
+            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.group': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'Reporting.interaction': {
+            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+            'good_count': ('django.db.models.fields.IntegerField', [], {}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.Group']"}),
+            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+            'total_count': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.linkentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+        },
+        'Reporting.packageentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'Reporting.pathentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+        },
+        'Reporting.performance': {
+            'Meta': {'object_name': 'Performance'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+        },
+        'Reporting.serviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+        }
+    }
+
+    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py b/src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py
new file mode 100644
index 0000000..26a053b
--- /dev/null
+++ b/src/lib/Bcfg2/Reporting/south_migrations/0004_profile_can_be_null.py
@@ -0,0 +1,156 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+
+        # Changing field 'Interaction.profile'
+        db.alter_column('Reporting_interaction', 'profile_id', self.gf('django.db.models.fields.related.ForeignKey')(null=True, to=orm['Reporting.Group']))
+
+    def backwards(self, orm):
+
+        # User chose to not deal with backwards NULL issues for 'Interaction.profile'
+        raise RuntimeError("Cannot reverse this migration. 'Interaction.profile' and its values cannot be restored.")
+
+    models = {
+        'Reporting.actionentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+        },
+        'Reporting.bundle': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'Reporting.client': {
+            'Meta': {'object_name': 'Client'},
+            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.deviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_major': ('django.db.models.fields.IntegerField', [], {}),
+            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_major': ('django.db.models.fields.IntegerField', [], {}),
+            'target_minor': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.failureentry': {
+            'Meta': {'object_name': 'FailureEntry'},
+            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileacl': {
+            'Meta': {'object_name': 'FileAcl'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileperms': {
+            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.group': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'Reporting.interaction': {
+            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+            'good_count': ('django.db.models.fields.IntegerField', [], {}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
+            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+            'total_count': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.linkentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+        },
+        'Reporting.packageentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'Reporting.pathentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+        },
+        'Reporting.performance': {
+            'Meta': {'object_name': 'Performance'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+        },
+        'Reporting.serviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+        }
+    }
+
+    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py b/src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py
new file mode 100644
index 0000000..d5f5d80
--- /dev/null
+++ b/src/lib/Bcfg2/Reporting/south_migrations/0005_add_selinux_entry_support.py
@@ -0,0 +1,485 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'SELoginEntry'
+        db.create_table('Reporting_seloginentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_selinuxuser', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+        ))
+        db.send_create_signal('Reporting', ['SELoginEntry'])
+
+        # Adding model 'SEUserEntry'
+        db.create_table('Reporting_seuserentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('roles', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_roles', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+            ('prefix', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_prefix', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+        ))
+        db.send_create_signal('Reporting', ['SEUserEntry'])
+
+        # Adding model 'SEBooleanEntry'
+        db.create_table('Reporting_sebooleanentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('value', self.gf('django.db.models.fields.BooleanField')(default=True)),
+        ))
+        db.send_create_signal('Reporting', ['SEBooleanEntry'])
+
+        # Adding model 'SENodeEntry'
+        db.create_table('Reporting_senodeentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+            ('proto', self.gf('django.db.models.fields.CharField')(max_length=4)),
+        ))
+        db.send_create_signal('Reporting', ['SENodeEntry'])
+
+        # Adding model 'SEFcontextEntry'
+        db.create_table('Reporting_sefcontextentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+            ('filetype', self.gf('django.db.models.fields.CharField')(max_length=16)),
+        ))
+        db.send_create_signal('Reporting', ['SEFcontextEntry'])
+
+        # Adding model 'SEInterfaceEntry'
+        db.create_table('Reporting_seinterfaceentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+        ))
+        db.send_create_signal('Reporting', ['SEInterfaceEntry'])
+
+        # Adding model 'SEPermissiveEntry'
+        db.create_table('Reporting_sepermissiveentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+        ))
+        db.send_create_signal('Reporting', ['SEPermissiveEntry'])
+
+        # Adding model 'SEModuleEntry'
+        db.create_table('Reporting_semoduleentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
+            ('current_disabled', self.gf('django.db.models.fields.BooleanField')(default=False)),
+        ))
+        db.send_create_signal('Reporting', ['SEModuleEntry'])
+
+        # Adding model 'SEPortEntry'
+        db.create_table('Reporting_seportentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128)),
+            ('current_selinuxtype', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
+        ))
+        db.send_create_signal('Reporting', ['SEPortEntry'])
+
+        # Adding M2M table for field sebooleans on 'Interaction'
+        db.create_table('Reporting_interaction_sebooleans', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('sebooleanentry', models.ForeignKey(orm['Reporting.sebooleanentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_sebooleans', ['interaction_id', 'sebooleanentry_id'])
+
+        # Adding M2M table for field seports on 'Interaction'
+        db.create_table('Reporting_interaction_seports', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('seportentry', models.ForeignKey(orm['Reporting.seportentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_seports', ['interaction_id', 'seportentry_id'])
+
+        # Adding M2M table for field sefcontexts on 'Interaction'
+        db.create_table('Reporting_interaction_sefcontexts', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('sefcontextentry', models.ForeignKey(orm['Reporting.sefcontextentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_sefcontexts', ['interaction_id', 'sefcontextentry_id'])
+
+        # Adding M2M table for field senodes on 'Interaction'
+        db.create_table('Reporting_interaction_senodes', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('senodeentry', models.ForeignKey(orm['Reporting.senodeentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_senodes', ['interaction_id', 'senodeentry_id'])
+
+        # Adding M2M table for field selogins on 'Interaction'
+        db.create_table('Reporting_interaction_selogins', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('seloginentry', models.ForeignKey(orm['Reporting.seloginentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_selogins', ['interaction_id', 'seloginentry_id'])
+
+        # Adding M2M table for field seusers on 'Interaction'
+        db.create_table('Reporting_interaction_seusers', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('seuserentry', models.ForeignKey(orm['Reporting.seuserentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_seusers', ['interaction_id', 'seuserentry_id'])
+
+        # Adding M2M table for field seinterfaces on 'Interaction'
+        db.create_table('Reporting_interaction_seinterfaces', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('seinterfaceentry', models.ForeignKey(orm['Reporting.seinterfaceentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_seinterfaces', ['interaction_id', 'seinterfaceentry_id'])
+
+        # Adding M2M table for field sepermissives on 'Interaction'
+        db.create_table('Reporting_interaction_sepermissives', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('sepermissiveentry', models.ForeignKey(orm['Reporting.sepermissiveentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_sepermissives', ['interaction_id', 'sepermissiveentry_id'])
+
+        # Adding M2M table for field semodules on 'Interaction'
+        db.create_table('Reporting_interaction_semodules', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('semoduleentry', models.ForeignKey(orm['Reporting.semoduleentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_semodules', ['interaction_id', 'semoduleentry_id'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'SELoginEntry'
+        db.delete_table('Reporting_seloginentry')
+
+        # Deleting model 'SEUserEntry'
+        db.delete_table('Reporting_seuserentry')
+
+        # Deleting model 'SEBooleanEntry'
+        db.delete_table('Reporting_sebooleanentry')
+
+        # Deleting model 'SENodeEntry'
+        db.delete_table('Reporting_senodeentry')
+
+        # Deleting model 'SEFcontextEntry'
+        db.delete_table('Reporting_sefcontextentry')
+
+        # Deleting model 'SEInterfaceEntry'
+        db.delete_table('Reporting_seinterfaceentry')
+
+        # Deleting model 'SEPermissiveEntry'
+        db.delete_table('Reporting_sepermissiveentry')
+
+        # Deleting model 'SEModuleEntry'
+        db.delete_table('Reporting_semoduleentry')
+
+        # Deleting model 'SEPortEntry'
+        db.delete_table('Reporting_seportentry')
+
+        # Removing M2M table for field sebooleans on 'Interaction'
+        db.delete_table('Reporting_interaction_sebooleans')
+
+        # Removing M2M table for field seports on 'Interaction'
+        db.delete_table('Reporting_interaction_seports')
+
+        # Removing M2M table for field sefcontexts on 'Interaction'
+        db.delete_table('Reporting_interaction_sefcontexts')
+
+        # Removing M2M table for field senodes on 'Interaction'
+        db.delete_table('Reporting_interaction_senodes')
+
+        # Removing M2M table for field selogins on 'Interaction'
+        db.delete_table('Reporting_interaction_selogins')
+
+        # Removing M2M table for field seusers on 'Interaction'
+        db.delete_table('Reporting_interaction_seusers')
+
+        # Removing M2M table for field seinterfaces on 'Interaction'
+        db.delete_table('Reporting_interaction_seinterfaces')
+
+        # Removing M2M table for field sepermissives on 'Interaction'
+        db.delete_table('Reporting_interaction_sepermissives')
+
+        # Removing M2M table for field semodules on 'Interaction'
+        db.delete_table('Reporting_interaction_semodules')
+
+
+    models = {
+        'Reporting.actionentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+        },
+        'Reporting.bundle': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'Reporting.client': {
+            'Meta': {'object_name': 'Client'},
+            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.deviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_major': ('django.db.models.fields.IntegerField', [], {}),
+            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_major': ('django.db.models.fields.IntegerField', [], {}),
+            'target_minor': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.failureentry': {
+            'Meta': {'object_name': 'FailureEntry'},
+            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileacl': {
+            'Meta': {'object_name': 'FileAcl'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileperms': {
+            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.group': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'Reporting.interaction': {
+            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+            'good_count': ('django.db.models.fields.IntegerField', [], {}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
+            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
+            'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
+            'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
+            'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
+            'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
+            'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
+            'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
+            'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
+            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+            'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+            'total_count': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.linkentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+        },
+        'Reporting.packageentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'Reporting.pathentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+        },
+        'Reporting.performance': {
+            'Meta': {'object_name': 'Performance'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+        },
+        'Reporting.sebooleanentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
+        },
+        'Reporting.sefcontextentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.seinterfaceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.seloginentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
+            'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.semoduleentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
+            'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.senodeentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.sepermissiveentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.seportentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.serviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+        },
+        'Reporting.seuserentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
+            'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        }
+    }
+
+    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py b/src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py
new file mode 100644
index 0000000..d86e663
--- /dev/null
+++ b/src/lib/Bcfg2/Reporting/south_migrations/0006_add_user_group_entry_support.py
@@ -0,0 +1,340 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Adding model 'POSIXGroupEntry'
+        db.create_table('Reporting_posixgroupentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+            ('current_gid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+        ))
+        db.send_create_signal('Reporting', ['POSIXGroupEntry'])
+
+        # Adding model 'POSIXUserEntry'
+        db.create_table('Reporting_posixuserentry', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
+            ('hash_key', self.gf('django.db.models.fields.BigIntegerField')(db_index=True)),
+            ('state', self.gf('django.db.models.fields.IntegerField')()),
+            ('exists', self.gf('django.db.models.fields.BooleanField')(default=True)),
+            ('uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+            ('current_uid', self.gf('django.db.models.fields.IntegerField')(null=True)),
+            ('group', self.gf('django.db.models.fields.CharField')(max_length=64)),
+            ('current_group', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
+            ('gecos', self.gf('django.db.models.fields.CharField')(max_length=1024)),
+            ('current_gecos', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
+            ('home', self.gf('django.db.models.fields.CharField')(max_length=1024)),
+            ('current_home', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
+            ('shell', self.gf('django.db.models.fields.CharField')(default='/bin/bash', max_length=1024)),
+            ('current_shell', self.gf('django.db.models.fields.CharField')(max_length=1024, null=True)),
+        ))
+        db.send_create_signal('Reporting', ['POSIXUserEntry'])
+
+        # Adding M2M table for field posixusers on 'Interaction'
+        db.create_table('Reporting_interaction_posixusers', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('posixuserentry', models.ForeignKey(orm['Reporting.posixuserentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_posixusers', ['interaction_id', 'posixuserentry_id'])
+
+        # Adding M2M table for field posixgroups on 'Interaction'
+        db.create_table('Reporting_interaction_posixgroups', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interaction', models.ForeignKey(orm['Reporting.interaction'], null=False)),
+            ('posixgroupentry', models.ForeignKey(orm['Reporting.posixgroupentry'], null=False))
+        ))
+        db.create_unique('Reporting_interaction_posixgroups', ['interaction_id', 'posixgroupentry_id'])
+
+
+    def backwards(self, orm):
+        # Deleting model 'POSIXGroupEntry'
+        db.delete_table('Reporting_posixgroupentry')
+
+        # Deleting model 'POSIXUserEntry'
+        db.delete_table('Reporting_posixuserentry')
+
+        # Removing M2M table for field posixusers on 'Interaction'
+        db.delete_table('Reporting_interaction_posixusers')
+
+        # Removing M2M table for field posixgroups on 'Interaction'
+        db.delete_table('Reporting_interaction_posixgroups')
+
+
+    models = {
+        'Reporting.actionentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ActionEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'output': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'status': ('django.db.models.fields.CharField', [], {'default': "'check'", 'max_length': '128'})
+        },
+        'Reporting.bundle': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Bundle'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
+        },
+        'Reporting.client': {
+            'Meta': {'object_name': 'Client'},
+            'creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'current_interaction': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'parent_client'", 'null': 'True', 'to': "orm['Reporting.Interaction']"}),
+            'expiration': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.deviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'DeviceEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_major': ('django.db.models.fields.IntegerField', [], {}),
+            'current_minor': ('django.db.models.fields.IntegerField', [], {}),
+            'device_type': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_major': ('django.db.models.fields.IntegerField', [], {}),
+            'target_minor': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.failureentry': {
+            'Meta': {'object_name': 'FailureEntry'},
+            'entry_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'message': ('django.db.models.fields.TextField', [], {}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileacl': {
+            'Meta': {'object_name': 'FileAcl'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'})
+        },
+        'Reporting.fileperms': {
+            'Meta': {'unique_together': "(('owner', 'group', 'mode'),)", 'object_name': 'FilePerms'},
+            'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mode': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'})
+        },
+        'Reporting.group': {
+            'Meta': {'ordering': "('name',)", 'object_name': 'Group'},
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'category': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'profile': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+        },
+        'Reporting.interaction': {
+            'Meta': {'ordering': "['-timestamp']", 'unique_together': "(('client', 'timestamp'),)", 'object_name': 'Interaction'},
+            'actions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ActionEntry']", 'symmetrical': 'False'}),
+            'bad_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'bundles': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Bundle']", 'symmetrical': 'False'}),
+            'client': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interactions'", 'to': "orm['Reporting.Client']"}),
+            'extra_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'failures': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FailureEntry']", 'symmetrical': 'False'}),
+            'good_count': ('django.db.models.fields.IntegerField', [], {}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.Group']", 'symmetrical': 'False'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified_count': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PackageEntry']", 'symmetrical': 'False'}),
+            'paths': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.PathEntry']", 'symmetrical': 'False'}),
+            'posixgroups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXGroupEntry']", 'symmetrical': 'False'}),
+            'posixusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.POSIXUserEntry']", 'symmetrical': 'False'}),
+            'profile': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'null': 'True', 'to': "orm['Reporting.Group']"}),
+            'repo_rev_code': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'sebooleans': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEBooleanEntry']", 'symmetrical': 'False'}),
+            'sefcontexts': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEFcontextEntry']", 'symmetrical': 'False'}),
+            'seinterfaces': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEInterfaceEntry']", 'symmetrical': 'False'}),
+            'selogins': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SELoginEntry']", 'symmetrical': 'False'}),
+            'semodules': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEModuleEntry']", 'symmetrical': 'False'}),
+            'senodes': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SENodeEntry']", 'symmetrical': 'False'}),
+            'sepermissives': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPermissiveEntry']", 'symmetrical': 'False'}),
+            'seports': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEPortEntry']", 'symmetrical': 'False'}),
+            'server': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
+            'services': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.ServiceEntry']", 'symmetrical': 'False'}),
+            'seusers': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.SEUserEntry']", 'symmetrical': 'False'}),
+            'state': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+            'timestamp': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
+            'total_count': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.linkentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'LinkEntry', '_ormbases': ['Reporting.PathEntry']},
+            'current_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'}),
+            'pathentry_ptr': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['Reporting.PathEntry']", 'unique': 'True', 'primary_key': 'True'}),
+            'target_path': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'blank': 'True'})
+        },
+        'Reporting.packageentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PackageEntry'},
+            'current_version': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_version': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '1024'}),
+            'verification_details': ('django.db.models.fields.TextField', [], {'default': "''"})
+        },
+        'Reporting.pathentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'PathEntry'},
+            'acls': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['Reporting.FileAcl']", 'symmetrical': 'False'}),
+            'current_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"}),
+            'detail_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+            'details': ('django.db.models.fields.TextField', [], {'default': "''"}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'path_type': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_perms': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['Reporting.FilePerms']"})
+        },
+        'Reporting.performance': {
+            'Meta': {'object_name': 'Performance'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'interaction': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'performance_items'", 'to': "orm['Reporting.Interaction']"}),
+            'metric': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'value': ('django.db.models.fields.DecimalField', [], {'max_digits': '32', 'decimal_places': '16'})
+        },
+        'Reporting.posixgroupentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXGroupEntry'},
+            'current_gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'gid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.posixuserentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'POSIXUserEntry'},
+            'current_gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
+            'current_group': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
+            'current_home': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
+            'current_shell': ('django.db.models.fields.CharField', [], {'max_length': '1024', 'null': 'True'}),
+            'current_uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'gecos': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'group': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'home': ('django.db.models.fields.CharField', [], {'max_length': '1024'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'shell': ('django.db.models.fields.CharField', [], {'default': "'/bin/bash'", 'max_length': '1024'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'uid': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
+        },
+        'Reporting.sebooleanentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEBooleanEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'value': ('django.db.models.fields.BooleanField', [], {'default': 'True'})
+        },
+        'Reporting.sefcontextentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEFcontextEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'filetype': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.seinterfaceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEInterfaceEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.seloginentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SELoginEntry'},
+            'current_selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxuser': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.semoduleentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEModuleEntry'},
+            'current_disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'disabled': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.senodeentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SENodeEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'proto': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.sepermissiveentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPermissiveEntry'},
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.seportentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEPortEntry'},
+            'current_selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'selinuxtype': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'Reporting.serviceentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'ServiceEntry'},
+            'current_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'state': ('django.db.models.fields.IntegerField', [], {}),
+            'target_status': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '128'})
+        },
+        'Reporting.seuserentry': {
+            'Meta': {'ordering': "('state', 'name')", 'object_name': 'SEUserEntry'},
+            'current_prefix': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'current_roles': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
+            'exists': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'hash_key': ('django.db.models.fields.BigIntegerField', [], {'db_index': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
+            'prefix': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'roles': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'state': ('django.db.models.fields.IntegerField', [], {})
+        }
+    }
+
+    complete_apps = ['Reporting']
\ No newline at end of file
diff --git a/src/lib/Bcfg2/Reporting/south_migrations/__init__.py b/src/lib/Bcfg2/Reporting/south_migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/lib/Bcfg2/Server/Admin/Reports.py b/src/lib/Bcfg2/Server/Admin/Reports.py
index eb97123..6399d24 100644
--- a/src/lib/Bcfg2/Server/Admin/Reports.py
+++ b/src/lib/Bcfg2/Server/Admin/Reports.py
@@ -8,6 +8,7 @@ import traceback
 from Bcfg2 import settings
 
 # Load django and reports stuff _after_ we know we can load settings
+import django
 from django.core import management
 from Bcfg2.Reporting.utils import *
 
@@ -71,11 +72,14 @@ class Reports(Bcfg2.Server.Admin.Mode):
 
     def __init__(self, setup):
         Bcfg2.Server.Admin.Mode.__init__(self, setup)
-        try:
-            import south
-        except ImportError:
-            print("Django south is required for Reporting")
-            raise SystemExit(-3)
+        if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
+            django.setup()
+        elif django.VERIONS[0] == 1 and django.VERSION[1] <= 6:
+            try:
+                import south
+            except ImportError:
+                print("Django south is required for Reporting")
+                raise SystemExit(-3)
 
     def __call__(self, args):
         if len(args) == 0 or args[0] == '-h':
diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py
index 44ba0fe..9d5a3a5 100644
--- a/src/lib/Bcfg2/Server/Core.py
+++ b/src/lib/Bcfg2/Server/Core.py
@@ -248,10 +248,14 @@ class BaseCore(object):
 
             from django.core.exceptions import ImproperlyConfigured
             from django.core import management
+            import django
+            if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
+                django.setup()
             try:
                 management.call_command("syncdb", interactive=False,
                                         verbosity=0)
                 self._database_available = True
+                django.db.close_connection()
             except ImproperlyConfigured:
                 self.logger.error("Django configuration problem: %s" %
                                   sys.exc_info()[1])
diff --git a/src/lib/Bcfg2/manage.py b/src/lib/Bcfg2/manage.py
index 3e4eedc..2861916 100755
--- a/src/lib/Bcfg2/manage.py
+++ b/src/lib/Bcfg2/manage.py
@@ -1,14 +1,21 @@
 #!/usr/bin/env python
-from django.core.management import execute_manager
-import imp
-try:
-    imp.find_module('settings') # Assumed to be in the same directory.
-except ImportError:
-    import sys
-    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
-    sys.exit(1)
+import os
+import sys
+import django
 
-import settings
+if django.VERSION[0] == 1 and django.VERSION[1] <= 6:
+    try:
+        imp.find_module('settings') # Assumed to be in the same directory.
+    except ImportError:
+        import sys
+        sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
+        sys.exit(1)
 
 if __name__ == "__main__":
-    execute_manager(settings)
+    if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
+        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Bcfg2.settings')
+
+        from django.core.management import execute_from_command_line
+        execute_from_command_line(sys.argv)
+    else:
+        execute_manager(settings)
diff --git a/src/lib/Bcfg2/settings.py b/src/lib/Bcfg2/settings.py
index 2c5466a..fd7103e 100644
--- a/src/lib/Bcfg2/settings.py
+++ b/src/lib/Bcfg2/settings.py
@@ -144,11 +144,18 @@ INSTALLED_APPS = (
     'django.contrib.admin',
     'Bcfg2.Server',
 )
-if HAS_SOUTH:
+if HAS_DJANGO and django.VERSION[0] == 1 and django.VERSION[1] >= 7:
+    INSTALLED_APPS = INSTALLED_APPS + (
+        'Bcfg2.Reporting',
+    )
+elif HAS_SOUTH:
     INSTALLED_APPS = INSTALLED_APPS + (
         'south',
         'Bcfg2.Reporting',
     )
+    SOUTH_MIGRATION_MODULES = {
+        'Bcfg2.Reporting': 'Bcfg2.Reporting.south_migrations',
+    }
 if 'BCFG2_LEGACY_MODELS' in os.environ:
     INSTALLED_APPS += ('Bcfg2.Server.Reports.reports',)
 
@@ -224,3 +231,5 @@ else:
         'django.core.context_processors.media',
         'django.core.context_processors.request'
     )
+
+TEST_RUNNER = 'django.test.simple.DjangoTestSuiteRunner'
diff --git a/src/sbin/bcfg2-reports b/src/sbin/bcfg2-reports
index 2a8447a..7fc2da1 100755
--- a/src/sbin/bcfg2-reports
+++ b/src/sbin/bcfg2-reports
@@ -23,6 +23,9 @@ sys.path.pop()
 # Set DJANGO_SETTINGS_MODULE appropriately.
 os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project_name
 
+import django
+if django.VERSION[0] == 1 and django.VERSION[1] >= 7:
+    django.setup()
 from Bcfg2.Reporting.models import (Client, BaseEntry)
 from django import db
 

--- End Message ---
--- Begin Message ---
Version: 8.3

Hi,

The updates referred to in these bugs were included in today's 8.3
Jessie point release.

Regards,

Adam

--- End Message ---

Reply to: