diff --git a/backend/device_registry/api_views.py b/backend/device_registry/api_views.py index 6ca30e8ab..80d0617a4 100644 --- a/backend/device_registry/api_views.py +++ b/backend/device_registry/api_views.py @@ -87,10 +87,12 @@ def post(self, request, *args, **kwargs): device.last_ping = timezone.now() device.agent_version = data.get('agent_version') device.audit_files = data.get('audit_files', []) + os_release = data.get('os_release', {}) if 'deb_packages' in data: deb_packages = data['deb_packages'] device.deb_packages_hash = deb_packages['hash'] - device.set_deb_packages(deb_packages['packages'], data.get('os_release', {})) + device.set_deb_packages(deb_packages['packages'], os_release) + device.os_release = os_release device_info_object, _ = DeviceInfo.objects.get_or_create(device=device) device_info_object.device__last_ping = timezone.now() device_info_object.device_operating_system_version = data.get('device_operating_system_version') @@ -98,8 +100,6 @@ def post(self, request, *args, **kwargs): device_info_object.ipv4_address = data.get('ipv4_address') device_info_object.device_manufacturer = data.get('device_manufacturer') device_info_object.device_model = data.get('device_model') - device_info_object.distr_id = data.get('distr_id') - device_info_object.distr_release = data.get('distr_release') device_info_object.selinux_state = data.get('selinux_status', {}) device_info_object.app_armor_enabled = data.get('app_armor_enabled') device_info_object.logins = data.get('logins', {}) @@ -132,7 +132,7 @@ def post(self, request, *args, **kwargs): firewall_state.save() device.update_trust_score = True - device.save(update_fields=['last_ping', 'agent_version', 'audit_files', 'deb_packages_hash', + device.save(update_fields=['os_release', 'last_ping', 'agent_version', 'audit_files', 'deb_packages_hash', 'update_trust_score']) if datastore_client: diff --git a/backend/device_registry/migrations/0064_auto_20191016_1222.py b/backend/device_registry/migrations/0064_auto_20191016_1222.py new file mode 100644 index 000000000..fc624fb76 --- /dev/null +++ b/backend/device_registry/migrations/0064_auto_20191016_1222.py @@ -0,0 +1,27 @@ +# Generated by Django 2.2.6 on 2019-10-16 12:22 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('device_registry', '0063_auto_20191014_0742'), + ] + + operations = [ + migrations.RemoveField( + model_name='deviceinfo', + name='distr_id', + ), + migrations.RemoveField( + model_name='deviceinfo', + name='distr_release', + ), + migrations.AddField( + model_name='device', + name='os_release', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), + ), + ] diff --git a/backend/device_registry/models.py b/backend/device_registry/models.py index c9b2e4135..1a7e4583f 100644 --- a/backend/device_registry/models.py +++ b/backend/device_registry/models.py @@ -104,6 +104,18 @@ class Device(models.Model): deb_packages = models.ManyToManyField(DebPackage) deb_packages_hash = models.CharField(max_length=32, blank=True) audit_files = JSONField(blank=True, default=list) + os_release = JSONField(blank=True, default=dict) + + @property + def distribution(self): + if self.os_release: + full_version = self.os_release['full_version'] + distro = self.os_release['distro'] + if distro == 'ubuntu-core': + distro_name = 'Ubuntu Core' + else: + distro_name = distro.capitalize() + return f"{distro_name} {full_version}" def sshd_issues(self): if self.audit_files: @@ -321,8 +333,6 @@ class DeviceInfo(models.Model): device_architecture = models.CharField(blank=True, null=True, max_length=32) device_operating_system = models.CharField(blank=True, null=True, max_length=128) device_operating_system_version = models.CharField(blank=True, null=True, max_length=128) - distr_id = models.CharField(blank=True, null=True, max_length=32) - distr_release = models.CharField(blank=True, null=True, max_length=32) fqdn = models.CharField(blank=True, null=True, max_length=128) ipv4_address = models.GenericIPAddressField( protocol="IPv4", diff --git a/backend/device_registry/serializers.py b/backend/device_registry/serializers.py index 33011f5df..e46ec0e11 100644 --- a/backend/device_registry/serializers.py +++ b/backend/device_registry/serializers.py @@ -50,7 +50,7 @@ class DeviceInfoSerializer(serializers.ModelSerializer): class Meta: model = DeviceInfo fields = ['device', 'device_manufacturer', 'device_model', 'device_architecture', 'device_operating_system', - 'device_operating_system_version', 'distr_id', 'distr_release', 'fqdn', 'ipv4_address', + 'device_operating_system_version', 'fqdn', 'ipv4_address', 'selinux_state', 'app_armor_enabled', 'logins', 'default_password', 'detected_mirai', 'device_metadata'] diff --git a/backend/device_registry/templates/device_info_software.html b/backend/device_registry/templates/device_info_software.html index 0d5b7224b..a361dba7e 100644 --- a/backend/device_registry/templates/device_info_software.html +++ b/backend/device_registry/templates/device_info_software.html @@ -26,6 +26,10 @@