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

Bug#801441: jessie-pu: package bcfg2/1.3.5-1



"Adam D. Barratt" <adam@adam-barratt.org.uk> writes:

> On 2015-10-12 13:13, Arto Jantunen wrote:
>> "Adam D. Barratt" <adam@adam-barratt.org.uk> writes:
>>
>>> Control: tags -1 + moreinfo
>>>
>>> On Sat, 2015-10-10 at 09:43 +0300, Arto Jantunen wrote:
>>>> 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.
>>>
>>> That is rather noisy, yes. :-(
>>>
>>> Is there any chance we could have an interdiff of the before-and-after
>>> patches, to highlight the actual differences between them? In any case
>>> we'd need a full debdiff of a package built and tested on jessie before
>>> giving a definite ack.
>>
>> The patch doesn't exist in jessie, so either interdiff isn't possible or
>> I'm misunderstanding something.
>
> The latter, although possibly because I wasn't clear enough.
>
> The patch contains, for example:
>
>  src/lib/Bcfg2/Reporting/migrations/0001_initial.py | 1006
> +++++++++++---------
>  .../migrations/0002_convert_perms_to_mode.py       |  171 ----
>  .../Reporting/south_migrations/0001_initial.py     |  465 +++++++++
>  .../south_migrations/0002_convert_perms_to_mode.py |  171 ++++
>
> What I was looking for was an indication of what the actual difference between
> the two sets of files is, ignoring renames (e.g. are the two
> 0002_convert_perms_to_mode.py files actually exactly the same?).
>
>> The debdiff is attached (for convenience
>> built on jessie but without modifying the version number for a stable
>> update).
>
> Sorry, I meant a _source_ debdiff (in practice, that's basically always what's
> needed).
>
> On the subject of the binary debdiff however...
>
> Files in first set of .debs but not in second
> ---------------------------------------------
> -rw-r--r--  root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0002_convert_perms_to_mode.py
> -rw-r--r--  root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0003_expand_hash_key.py
> -rw-r--r--  root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0004_profile_can_be_null.py
> -rw-r--r--  root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0005_add_selinux_entry_support.py
> -rw-r--r--  root/root
> /usr/lib/python2.7/dist-packages/Bcfg2/Reporting/migrations/0006_add_user_group_entry_support.py
>
> Shouldn't there be a corresponding set of files appearing in the second
> package? (in /Reporting/south_migrations)

I don't know the answer to that question, my understanding of Django is
rather limited (which is also why I didn't write the patch to do
this). The "initial migration" file grows quite a bit, so it's entirely
possible that it ends up containing the relevant parts of those, but
this is only a theory.

Source debdiff is attached, I'll see about generating something suitable
to compare the migration files while ignoring the renames.

-- 
Arto Jantunen

diff -Nru bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch
--- bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch	1970-01-01 02:00:00.000000000 +0200
+++ bcfg2-1.3.5/debian/patches/0003-make-Bcfg2-compatible-with-django-1.7.patch	2015-09-22 13:27:53.000000000 +0300
@@ -0,0 +1,4442 @@
+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
+ 
diff -Nru bcfg2-1.3.5/debian/patches/series bcfg2-1.3.5/debian/patches/series
--- bcfg2-1.3.5/debian/patches/series	2014-09-09 19:52:58.000000000 +0300
+++ bcfg2-1.3.5/debian/patches/series	2015-09-22 13:27:53.000000000 +0300
@@ -1,2 +1,3 @@
 0001-Update-Apache-configuration-for-version-2.4.patch
 0002-Modify-systemd-service-files-to-suit-Debian.patch
+0003-make-Bcfg2-compatible-with-django-1.7.patch

Reply to: