Skip to content
This repository was archived by the owner on Sep 16, 2022. It is now read-only.

Commit 6595ce6

Browse files
authored
Merge pull request #474 from GreatFruitOmsk/430-distro
Show Linux distribution.
2 parents 7b148d1 + 8df4128 commit 6595ce6

File tree

6 files changed

+48
-19
lines changed

6 files changed

+48
-19
lines changed

backend/device_registry/api_views.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,19 @@ def post(self, request, *args, **kwargs):
8787
device.last_ping = timezone.now()
8888
device.agent_version = data.get('agent_version')
8989
device.audit_files = data.get('audit_files', [])
90+
os_release = data.get('os_release', {})
9091
if 'deb_packages' in data:
9192
deb_packages = data['deb_packages']
9293
device.deb_packages_hash = deb_packages['hash']
93-
device.set_deb_packages(deb_packages['packages'], data.get('os_release', {}))
94+
device.set_deb_packages(deb_packages['packages'], os_release)
95+
device.os_release = os_release
9496
device_info_object, _ = DeviceInfo.objects.get_or_create(device=device)
9597
device_info_object.device__last_ping = timezone.now()
9698
device_info_object.device_operating_system_version = data.get('device_operating_system_version')
9799
device_info_object.fqdn = data.get('fqdn')
98100
device_info_object.ipv4_address = data.get('ipv4_address')
99101
device_info_object.device_manufacturer = data.get('device_manufacturer')
100102
device_info_object.device_model = data.get('device_model')
101-
device_info_object.distr_id = data.get('distr_id')
102-
device_info_object.distr_release = data.get('distr_release')
103103
device_info_object.selinux_state = data.get('selinux_status', {})
104104
device_info_object.app_armor_enabled = data.get('app_armor_enabled')
105105
device_info_object.logins = data.get('logins', {})
@@ -132,7 +132,7 @@ def post(self, request, *args, **kwargs):
132132
firewall_state.save()
133133

134134
device.update_trust_score = True
135-
device.save(update_fields=['last_ping', 'agent_version', 'audit_files', 'deb_packages_hash',
135+
device.save(update_fields=['os_release', 'last_ping', 'agent_version', 'audit_files', 'deb_packages_hash',
136136
'update_trust_score'])
137137

138138
if datastore_client:
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 2.2.6 on 2019-10-16 12:22
2+
3+
import django.contrib.postgres.fields.jsonb
4+
from django.db import migrations
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('device_registry', '0063_auto_20191014_0742'),
11+
]
12+
13+
operations = [
14+
migrations.RemoveField(
15+
model_name='deviceinfo',
16+
name='distr_id',
17+
),
18+
migrations.RemoveField(
19+
model_name='deviceinfo',
20+
name='distr_release',
21+
),
22+
migrations.AddField(
23+
model_name='device',
24+
name='os_release',
25+
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict),
26+
),
27+
]

backend/device_registry/models.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,18 @@ class Device(models.Model):
104104
deb_packages = models.ManyToManyField(DebPackage)
105105
deb_packages_hash = models.CharField(max_length=32, blank=True)
106106
audit_files = JSONField(blank=True, default=list)
107+
os_release = JSONField(blank=True, default=dict)
108+
109+
@property
110+
def distribution(self):
111+
if self.os_release:
112+
full_version = self.os_release['full_version']
113+
distro = self.os_release['distro']
114+
if distro == 'ubuntu-core':
115+
distro_name = 'Ubuntu Core'
116+
else:
117+
distro_name = distro.capitalize()
118+
return f"{distro_name} {full_version}"
107119

108120
def sshd_issues(self):
109121
if self.audit_files:
@@ -321,8 +333,6 @@ class DeviceInfo(models.Model):
321333
device_architecture = models.CharField(blank=True, null=True, max_length=32)
322334
device_operating_system = models.CharField(blank=True, null=True, max_length=128)
323335
device_operating_system_version = models.CharField(blank=True, null=True, max_length=128)
324-
distr_id = models.CharField(blank=True, null=True, max_length=32)
325-
distr_release = models.CharField(blank=True, null=True, max_length=32)
326336
fqdn = models.CharField(blank=True, null=True, max_length=128)
327337
ipv4_address = models.GenericIPAddressField(
328338
protocol="IPv4",

backend/device_registry/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ class DeviceInfoSerializer(serializers.ModelSerializer):
5050
class Meta:
5151
model = DeviceInfo
5252
fields = ['device', 'device_manufacturer', 'device_model', 'device_architecture', 'device_operating_system',
53-
'device_operating_system_version', 'distr_id', 'distr_release', 'fqdn', 'ipv4_address',
53+
'device_operating_system_version', 'fqdn', 'ipv4_address',
5454
'selinux_state', 'app_armor_enabled', 'logins', 'default_password', 'detected_mirai',
5555
'device_metadata']
5656

backend/device_registry/templates/device_info_software.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ <h4 class="tab-title">Software</h4>
2626
<th scope="row">Operating System Version</th>
2727
<td>{{ object.deviceinfo.device_operating_system_version|default_if_none:'N/A' }}</td>
2828
</tr>
29+
<tr>
30+
<th scope="row">Distribution</th>
31+
<td>{{ object.distribution|default_if_none:'N/A' }}</td>
32+
</tr>
2933
<tr>
3034
<th scope="row">Agent Version</th>
3135
<td>{{ object.agent_version|default:'N/A' }}</td>

backend/device_registry/tests/test_api.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,6 @@ def test_get(self):
205205
('device_architecture', None),
206206
('device_operating_system', None),
207207
('device_operating_system_version', None),
208-
('distr_id', None),
209-
('distr_release', None),
210208
('fqdn', None), ('ipv4_address', None),
211209
('selinux_state', {'mode': 'enforcing', 'enabled': True}),
212210
('app_armor_enabled', True),
@@ -232,8 +230,6 @@ def test_get_token_auth_success(self):
232230
('device_architecture', None),
233231
('device_operating_system', None),
234232
('device_operating_system_version', None),
235-
('distr_id', None),
236-
('distr_release', None),
237233
('fqdn', None), ('ipv4_address', None),
238234
('selinux_state', {'mode': 'enforcing', 'enabled': True}),
239235
('app_armor_enabled', True),
@@ -715,8 +711,6 @@ def setUp(self):
715711
'fqdn': 'test-device0',
716712
'ipv4_address': '127.0.0.1',
717713
'uptime': '0',
718-
'distr_id': 'Raspbian',
719-
'distr_release': '9.4',
720714
'scan_info': OPEN_PORTS_INFO,
721715
'netstat': OPEN_CONNECTIONS_INFO,
722716
'firewall_rules': TEST_RULES,
@@ -796,12 +790,6 @@ def test_ping_writes_netstat(self):
796790
netstat = portscan.netstat
797791
self.assertListEqual(netstat, OPEN_CONNECTIONS_INFO)
798792

799-
def test_ping_distr_info(self):
800-
self.client.post(self.url, self.ping_payload, **self.headers)
801-
self.device.refresh_from_db()
802-
self.assertEqual(self.device.deviceinfo.distr_id, 'Raspbian')
803-
self.assertEqual(self.device.deviceinfo.distr_release, '9.4')
804-
805793
def test_ping_writes_firewall_info_pos(self):
806794
self.client.post(self.url, self.ping_payload, **self.headers)
807795
firewall_state = FirewallState.objects.get(device=self.device)

0 commit comments

Comments
 (0)