Skip to content

Commit

Permalink
Merge branch 'swima'
Browse files Browse the repository at this point in the history
  • Loading branch information
strongX509 committed Jul 7, 2017
2 parents e313f6a + 06c4ad7 commit 801a728
Show file tree
Hide file tree
Showing 52 changed files with 790 additions and 163 deletions.
25 changes: 22 additions & 3 deletions apps/api/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,30 @@
from rest_framework import routers

from apps.core.api_views import IdentityViewSet, SessionViewSet
from apps.swid.api_views import EntityViewSet, TagViewSet, TagAddView, SwidMeasurementView

from apps.swid.api_views import EventViewSet, EntityViewSet, TagViewSet, TagStatsViewSet, TagAddView
from apps.swid.api_views import SwidMeasurementView, SwidEventsView
from apps.devices.api_views import ProductViewSet, DeviceViewSet
from apps.packages.api_views import PackageViewSet, VersionViewSet
from apps.filesystem.api_views import AlgorithmViewSet, DirectoryViewSet, FileViewSet, FileHashViewSet

# Create router
router = routers.DefaultRouter()

# Register resources
router.register(r'identities', IdentityViewSet)
router.register(r'sessions', SessionViewSet)
router.register(r'products', ProductViewSet)
router.register(r'devices', DeviceViewSet)
router.register(r'packages', PackageViewSet)
router.register(r'versions', VersionViewSet)
router.register(r'directories', DirectoryViewSet)
router.register(r'files', FileViewSet)
router.register(r'file-hashes', FileHashViewSet)
router.register(r'algorithms', AlgorithmViewSet)
router.register(r'swid-events', EventViewSet)
router.register(r'swid-entities', EntityViewSet)
router.register(r'swid-tags', TagViewSet)
router.register(r'swid-stats', TagStatsViewSet)

# Generate basic URL configuration
urlpatterns = router.urls
Expand All @@ -30,9 +43,15 @@
url(r'^swid/add-tags/', TagAddView.as_view(), name='swid-add-tags'),
url(r'^swid/add-tags/\.(?P<format>[a-z0-9]+)', TagAddView.as_view(), name='swid-add-tags'),

# Register measurement
# Register SW ID inventory upload
url(r'^sessions/(?P<pk>[^/]+)/swid-measurement/',
SwidMeasurementView.as_view(), name='session-swid-measurement'),
url(r'^sessions/(?P<pk>[^/]+)/swid-measurement/\.(?P<format>[a-z0-9]+)',
SwidMeasurementView.as_view(), name='session-swid-measurement'),

# Register SW ID events upload
url(r'^sessions/(?P<pk>[^/]+)/swid-events/',
SwidEventsView.as_view(), name='session-swid-events'),
url(r'^sessions/(?P<pk>[^/]+)/swid-events/\.(?P<format>[a-z0-9]+)',
SwidEventsView.as_view(), name='session-swid-events'),
)
1 change: 1 addition & 0 deletions apps/core/api_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
class IdentityViewSet(viewsets.ReadOnlyModelViewSet):
model = models.Identity
serializer_class = serializers.IdentitySerializer
filter_fields = ('type', 'data',)


class SessionViewSet(viewsets.ReadOnlyModelViewSet):
Expand Down
5 changes: 3 additions & 2 deletions apps/core/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from rest_framework import serializers

from apps.api.mixins import DynamicFieldsMixin
from apps.devices.serializers import DeviceSerializer
from . import models


Expand All @@ -14,8 +15,8 @@ class Meta(object):


class SessionSerializer(DynamicFieldsMixin, serializers.HyperlinkedModelSerializer):
# PrimaryKey fields are only needed until endpoints exists
device = serializers.PrimaryKeyRelatedField()
device = DeviceSerializer()
identity = IdentitySerializer()

class Meta(object):
model = models.Session
Expand Down
18 changes: 18 additions & 0 deletions apps/devices/api_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, division, absolute_import, unicode_literals

from rest_framework import viewsets

from . import models, serializers


class ProductViewSet(viewsets.ReadOnlyModelViewSet):
model = models.Product
serializer_class = serializers.ProductSerializer
filter_fields = ('name',)


class DeviceViewSet(viewsets.ReadOnlyModelViewSet):
model = models.Device
serializer_class = serializers.DeviceSerializer
filter_fields = ('value', 'description', 'product', 'created', 'trusted',)
17 changes: 17 additions & 0 deletions apps/devices/device_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from django.utils.translation import ugettext_lazy as _

from apps.core.models import Session, Result
from apps.swid.models import Event, TagEvent
from .models import Device, Group, Product


Expand Down Expand Up @@ -237,6 +238,22 @@ def session(request, sessionID):
return render(request, 'devices/session.html', context)


@require_GET
@login_required
def event(request, eventID):
"""
View details for a device-event
"""
event = get_object_or_404(Event, pk=eventID)

context = {}
context['event'] = event
context['title'] = _('Event details')
context['tags'] = event.tags.all()
context['tag_events'] = TagEvent.objects.filter(event=eventID)
return render(request, 'devices/event.html', context)


@require_GET
@login_required
def toggle_trusted(request, device_id):
Expand Down
25 changes: 24 additions & 1 deletion apps/devices/paging.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

from .models import Device, Product
from apps.core.models import Session
from apps.swid.models import Event
from apps.front.paging import ProducerFactory


Expand All @@ -27,6 +28,18 @@ def device_session_stat_producer(page_size, filter_query, dynamic_params=None, s
return math.ceil(count / page_size)


def device_event_list_producer(from_idx, to_idx, filter_query, dynamic_params=None, static_params=None):
device_id = dynamic_params['device_id']
event_list = Event.objects.filter(device=device_id)
return event_list[from_idx:to_idx]


def device_event_stat_producer(page_size, filter_query, dynamic_params=None, static_params=None):
device_id = dynamic_params['device_id']
count = Event.objects.filter(device=device_id).count()
return math.ceil(count / page_size)


def product_device_list_producer(from_idx, to_idx, filter_query, dynamic_params=None, static_params=None):
if not dynamic_params:
return []
Expand Down Expand Up @@ -79,5 +92,15 @@ def product_device_stat_producer(page_size, filter_query, dynamic_params=None, s
'static_producer_args': None,
'var_name': 'sessions',
'url_name': 'devices:session_detail',
'page_size': 30,
'page_size': 20,
}

device_event_list_paging = {
'template_name': 'devices/paging/device_report_events',
'list_producer': device_event_list_producer,
'stat_producer': device_event_stat_producer,
'static_producer_args': None,
'var_name': 'events',
'url_name': 'devices:event_detail',
'page_size': 20,
}
21 changes: 21 additions & 0 deletions apps/devices/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, division, absolute_import, unicode_literals

from rest_framework import serializers

from apps.api.mixins import DynamicFieldsMixin
from . import models


class ProductSerializer(DynamicFieldsMixin, serializers.HyperlinkedModelSerializer):
class Meta(object):
model = models.Product
fields = ('id', 'uri', 'name')


class DeviceSerializer(DynamicFieldsMixin, serializers.HyperlinkedModelSerializer):
product = ProductSerializer()

class Meta(object):
model = models.Device
fields = ('id', 'uri', 'value', 'description', 'product', 'created', 'trusted')
4 changes: 4 additions & 0 deletions apps/devices/templates/devices/device_report.html
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,10 @@ <h4>{% trans 'Enforcements' %}</h4>
<hr>
<h4>{% trans 'Sessions' %}</h4>
{% paged_block config_name="device_session_list_config" producer_args=paging_args %}

<hr>
<h4>{% trans 'Software Events' %}</h4>
{% paged_block config_name="device_event_list_config" producer_args=paging_args %}
</div>
</div>
</div>
Expand Down
81 changes: 81 additions & 0 deletions apps/devices/templates/devices/event.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
{% extends "front/base.html" %}

{% load i18n %}
{% block title %}{{ title }}{% endblock %}

{% block hero %}
<h1>{{ title }}</h1>
{% endblock %}

{% block content %}
<div class="container-fluid">
<div class="row">
<h4>{% trans 'Event Info' %}</h4>

<div class="row">
<div class="col-md-6">
<table class="table" border="0">
<tbody>
<tr>
<td><strong>{% trans 'ID' %}</strong></td>
<td>{{ event.id }}</td>
</tr>
<tr>
<td><strong>{% trans 'Device' %}</strong></td>
<td>{{ event.device }}</td>
</tr>
<tr>
<td><strong>{% trans 'Timestamp' %}</strong></td>
<td>{{ event.timestamp|date:'M d H:i:s Y' }}</td>
</tr>
<tr>
<td><strong>{% trans 'Epoch' %}</strong></td>
<td>{{ event.epoch }}</td>
</tr>
<tr>
<td><strong>{% trans 'EID' %}</strong></td>
<td>{{ event.eid }}</td>
</tr>
</tbody>
</table>
</div>
</div>

<hr>
<h4>{% trans 'Software' %}</h4>
{% if tag_events %}
<table class="table table-striped">
<thead>
<tr>
<th>{% trans "Action" %}</th>
<th>{% trans "Tag ID" %}</th>
<th>{% trans "Record ID" %}</th>
<th>{% trans "Source ID" %}</th>
</tr>
</thead>
<tbody>
{% for te in tag_events %}
<tr>
<td>
{% if te.action == 1 %}
{% trans 'ADDED' %}
{% else %}
{% trans 'REMOVED' %}
{% endif %}
</td>
<td><a href="{% url 'swid:tag_detail' te.tag.pk %}">{{ te.tag.list_repr }}</a></td>
<td>{{ te.record_id }}</td>
<td>{{ te.source_id }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>
{% trans 'No tags in this event.' %}
</p>
{% endif %}

</div>
</div>
{% endblock %}
26 changes: 26 additions & 0 deletions apps/devices/templates/devices/paging/device_report_events.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{% load i18n %}

{% if events.count %}
<table class="table table-striped">
<thead>
<tr>
<th class="dateWidth">{% trans "Time" %}</th>
<th>{% trans "EID" %}</th>
<th>{% trans "Epoch" %}</th>
</tr>
</thead>
<tbody>
{% for e in events %}
<tr>
<td><a
href="{% url url_name e.pk %}">{{ e.timestamp|date:'M d H:i:s Y' }}</a>
</td>
<td>{{ e.eid }}</td>
<td>{{ e.epoch }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>{% trans 'No software events reported for this device.' %}</p>
{% endif %}
1 change: 1 addition & 0 deletions apps/devices/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

url(r'^devices/(?P<deviceID>\d+)/report/?$', device_views.report, name='device_report'),

url(r'^events/(?P<eventID>\d+)/?$', device_views.event, name='event_detail'),
url(r'^sessions/(?P<sessionID>\d+)/?$', device_views.session, name='session_detail'),

url(r'^groups/?$', group_views.groups, name='group_list'),
Expand Down
2 changes: 1 addition & 1 deletion apps/filesystem/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class AlgorithmAdmin(admin.ModelAdmin):

class FileHashAdmin(admin.ModelAdmin):
list_display = ('file', 'algorithm', 'hash')
list_filter = ('algorithm', 'product')
list_filter = ('algorithm', 'version__product')


class FileAdmin(admin.ModelAdmin):
Expand Down
31 changes: 31 additions & 0 deletions apps/filesystem/api_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
from __future__ import print_function, division, absolute_import, unicode_literals

from rest_framework import viewsets

from . import models, serializers


class AlgorithmViewSet(viewsets.ReadOnlyModelViewSet):
model = models.Algorithm
serializer_class = serializers.AlgorithmSerializer
filter_fields = ('name',)


class DirectoryViewSet(viewsets.ReadOnlyModelViewSet):
model = models.Directory
serializer_class = serializers.DirectorySerializer
filter_fields = ('path',)


class FileViewSet(viewsets.ReadOnlyModelViewSet):
model = models.File
serializer_class = serializers.FileSerializer
filter_fields = ('name', 'directory', 'directory__path',)


class FileHashViewSet(viewsets.ReadOnlyModelViewSet):
model = models.FileHash
serializer_class = serializers.FileHashSerializer
filter_fields = ('file', 'file__name', 'file__directory__path', 'version',
'device', 'size', 'algorithm', 'hash', 'mutable',)
2 changes: 1 addition & 1 deletion apps/filesystem/file_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def file(request, fileID):
if file:
context['file'] = file
context['title'] = _('File ') + file.name
file_hashes = file.filehash_set.all().order_by('product', 'algorithm')
file_hashes = file.filehash_set.all().order_by('version', 'algorithm')
context['file_hashes'] = file_hashes

policies = Policy.objects.filter(file=file)
Expand Down
Loading

0 comments on commit 801a728

Please sign in to comment.