assemblyline-core 4.6.1.dev215__tar.gz → 4.6.1.dev219__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of assemblyline-core might be problematic. Click here for more details.

Files changed (91) hide show
  1. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/PKG-INFO +1 -1
  2. assemblyline_core-4.6.1.dev219/assemblyline_core/VERSION +1 -0
  3. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/tasking_client.py +24 -2
  4. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core.egg-info/PKG-INFO +1 -1
  5. assemblyline_core-4.6.1.dev219/test/test_tasking_client.py +77 -0
  6. assemblyline_core-4.6.1.dev215/assemblyline_core/VERSION +0 -1
  7. assemblyline_core-4.6.1.dev215/test/test_tasking_client.py +0 -37
  8. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/LICENCE.md +0 -0
  9. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/README.md +0 -0
  10. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/__init__.py +0 -0
  11. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/alerter/__init__.py +0 -0
  12. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/alerter/processing.py +0 -0
  13. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/alerter/run_alerter.py +0 -0
  14. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/archiver/__init__.py +0 -0
  15. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/archiver/run_archiver.py +0 -0
  16. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/badlist_client.py +0 -0
  17. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/dispatching/__init__.py +0 -0
  18. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/dispatching/__main__.py +0 -0
  19. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/dispatching/client.py +0 -0
  20. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/dispatching/dispatcher.py +0 -0
  21. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/dispatching/schedules.py +0 -0
  22. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/dispatching/timeout.py +0 -0
  23. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/expiry/__init__.py +0 -0
  24. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/expiry/run_expiry.py +0 -0
  25. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/ingester/__init__.py +0 -0
  26. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/ingester/__main__.py +0 -0
  27. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/ingester/constants.py +0 -0
  28. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/ingester/ingester.py +0 -0
  29. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/__init__.py +0 -0
  30. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/es_metrics.py +0 -0
  31. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  32. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/helper.py +0 -0
  33. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/metrics_server.py +0 -0
  34. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  35. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  36. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  37. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/plumber/__init__.py +0 -0
  38. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/plumber/run_plumber.py +0 -0
  39. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/__init__.py +0 -0
  40. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/client.py +0 -0
  41. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/creator/__init__.py +0 -0
  42. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/creator/run.py +0 -0
  43. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/creator/run_worker.py +0 -0
  44. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/loader/__init__.py +0 -0
  45. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/loader/run.py +0 -0
  46. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/loader/run_worker.py +0 -0
  47. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/replay/replay.py +0 -0
  48. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/safelist_client.py +0 -0
  49. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/__init__.py +0 -0
  50. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/collection.py +0 -0
  51. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  52. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
  53. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/controllers/interface.py +0 -0
  54. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
  55. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/run_scaler.py +0 -0
  56. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/scaler/scaler_server.py +0 -0
  57. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/server_base.py +0 -0
  58. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/signature_client.py +0 -0
  59. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/submission_client.py +0 -0
  60. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/updater/__init__.py +0 -0
  61. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/updater/helper.py +0 -0
  62. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/updater/run_updater.py +0 -0
  63. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/vacuum/__init__.py +0 -0
  64. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/vacuum/crawler.py +0 -0
  65. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/vacuum/department_map.py +0 -0
  66. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/vacuum/safelist.py +0 -0
  67. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/vacuum/stream_map.py +0 -0
  68. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/vacuum/worker.py +0 -0
  69. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/workflow/__init__.py +0 -0
  70. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core/workflow/run_workflow.py +0 -0
  71. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core.egg-info/SOURCES.txt +0 -0
  72. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  73. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core.egg-info/requires.txt +0 -0
  74. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/assemblyline_core.egg-info/top_level.txt +0 -0
  75. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/setup.cfg +0 -0
  76. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/setup.py +0 -0
  77. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_alerter.py +0 -0
  78. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_badlist_client.py +0 -0
  79. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_dispatcher.py +0 -0
  80. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_expiry.py +0 -0
  81. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_plumber.py +0 -0
  82. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_replay.py +0 -0
  83. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_safelist_client.py +0 -0
  84. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_scaler.py +0 -0
  85. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_scheduler.py +0 -0
  86. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_signature_client.py +0 -0
  87. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_simulation.py +0 -0
  88. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_vacuum.py +0 -0
  89. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_worker_ingest.py +0 -0
  90. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_worker_submit.py +0 -0
  91. {assemblyline_core-4.6.1.dev215 → assemblyline_core-4.6.1.dev219}/test/test_workflow.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.6.1.dev215
3
+ Version: 4.6.1.dev219
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1 @@
1
+ 4.6.1.dev219
@@ -3,7 +3,6 @@ import time
3
3
  from typing import Any, Dict, Optional
4
4
 
5
5
  import elasticapm
6
-
7
6
  from assemblyline.common import forge
8
7
  from assemblyline.common.constants import SERVICE_STATE_HASH, ServiceStatus
9
8
  from assemblyline.common.dict_utils import flatten, unflatten
@@ -22,6 +21,7 @@ from assemblyline.odm.models.service import Service
22
21
  from assemblyline.odm.models.tagging import Tagging
23
22
  from assemblyline.remote.datatypes.events import EventSender, EventWatcher
24
23
  from assemblyline.remote.datatypes.hash import ExpiringHash
24
+
25
25
  from assemblyline_core.dispatching.client import DispatchClient
26
26
 
27
27
 
@@ -161,9 +161,31 @@ class TaskingClient:
161
161
  self.datastore.service_delta.save(service.name, {'version': service.version})
162
162
  self.datastore.service_delta.commit()
163
163
  self.log.info(f"{log_prefix}{service.name} version ({service.version}) registered")
164
+ else:
165
+ # Check for any changes that should be merged into the service delta
166
+ service_delta = self.datastore.service_delta.get(service.name, as_obj=False)
167
+
168
+ # Check for any new configuration keys that should be added to the service delta
169
+ if service_delta.get('config'):
170
+ new_config = {k: v for k, v in service.config.items() if k not in service_delta['config']}
171
+ if new_config:
172
+ if 'config' not in service_delta:
173
+ service_delta['config'] = {}
174
+ service_delta['config'].update(new_config)
175
+
176
+ # Check for any new submission parameters that should be added to the service delta
177
+ if service_delta.get('submission_params'):
178
+ old_submission_params = {param['name'] for param in service_delta['submission_params']}
179
+ for param in service.submission_params:
180
+ if param['name'] not in old_submission_params:
181
+ # New parameter, add it to the old submission params
182
+ service_delta['submission_params'].append(param.as_primitives())
183
+
184
+ # Save any changes to the service delta
185
+ self.datastore.service_delta.save(service.name, service_delta)
164
186
 
165
187
  new_heuristics = []
166
-
188
+
167
189
  plan = self.datastore.heuristic.get_bulk_plan()
168
190
  for index, heuristic in enumerate(heuristics):
169
191
  heuristic_id = f'#{index}' # Set heuristic id to it's position in the list for logging purposes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: assemblyline-core
3
- Version: 4.6.1.dev215
3
+ Version: 4.6.1.dev219
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -0,0 +1,77 @@
1
+ from assemblyline_core.tasking_client import TaskingClient
2
+
3
+ from assemblyline.datastore.helper import AssemblylineDatastore as Datastore
4
+ from assemblyline.odm.models.heuristic import Heuristic
5
+ from assemblyline.odm.models.result import Heuristic as SectionHeuristic
6
+ from assemblyline.odm.models.result import Result, Section
7
+ from assemblyline.odm.models.service import Service
8
+ from assemblyline.odm.randomizer import random_minimal_obj
9
+
10
+
11
+ def test_register_service(datastore_connection: Datastore):
12
+ client = TaskingClient(datastore_connection, register_only=True)
13
+
14
+ # Test service registration
15
+ service = random_minimal_obj(Service).as_primitives()
16
+ heuristics = [random_minimal_obj(Heuristic).as_primitives() for _ in range(2)]
17
+ service['heuristics'] = heuristics
18
+ assert client.register_service(service)
19
+ assert all([datastore_connection.heuristic.exists(h['heur_id']) for h in heuristics])
20
+
21
+ # Test registration with heuristics that were removed but still have related results
22
+ heuristic = heuristics.pop(0)
23
+ result = random_minimal_obj(Result)
24
+ section = random_minimal_obj(Section)
25
+ section.heuristic = SectionHeuristic(heuristic)
26
+ result.result.sections = [section]
27
+ datastore_connection.result.save('test_result', result)
28
+ datastore_connection.result.commit()
29
+
30
+ # Heuristics that were removed should still reside in the system if there are still associated data to it
31
+ service['heuristics'] = heuristics
32
+ assert client.register_service(service)
33
+ assert datastore_connection.heuristic.exists(heuristic['heur_id'])
34
+
35
+ # Test registration with removed heuristics that have no related results
36
+ datastore_connection.result.delete('test_result')
37
+ datastore_connection.result.commit()
38
+ assert client.register_service(service)
39
+ assert not datastore_connection.heuristic.exists(heuristic['heur_id'])
40
+
41
+ def test_service_update(datastore_connection: Datastore):
42
+ client = TaskingClient(datastore_connection, register_only=True)
43
+
44
+ # Test service registration
45
+ service = random_minimal_obj(Service).as_primitives()
46
+ assert client.register_service(service)
47
+
48
+ # Test registering a service update where there's a new submission parameter and configuration
49
+ service['submission_params'].append({"name": 'new_param', 'type': 'str', 'default': 'default_value', 'value': 'default_value'})
50
+ service['version'] = "new_version"
51
+ service['config'] = {'new_config': 'value'}
52
+ assert client.register_service(service)
53
+
54
+ # Pretend I'm the updater acknowledging the new version has been registered
55
+ datastore_connection.service_delta.update(service['name'], [(datastore_connection.service_delta.UPDATE_SET, 'version', service['version'])])
56
+
57
+ # We should see the new submission parameter in the service while applying delta changes
58
+ delta = datastore_connection.get_service_with_delta(service['name'])
59
+ assert delta['submission_params'][-1]['name'] == 'new_param'
60
+ assert delta['config']['new_config'] == 'value'
61
+
62
+ # Test registering a service update where the user has changed a submission parameter prior to the update and new parameter was added
63
+ assert datastore_connection.service_delta.update(service['name'], [(datastore_connection.service_delta.UPDATE_APPEND, 'submission_params', {'name': 'new_param', 'type': 'str', 'default': 'custom_value', 'value': 'custom_value'})])
64
+ datastore_connection.service_delta.commit()
65
+
66
+ service['submission_params'].append({"name": 'new_new_param', 'type': 'str', 'default': 'default_value', 'value': 'default_value'})
67
+ service['version'] = "new_new_version"
68
+
69
+ assert client.register_service(service)
70
+
71
+ # Pretend I'm the updater acknowledging the new version has been registered
72
+ datastore_connection.service_delta.update(service['name'], [(datastore_connection.service_delta.UPDATE_SET, 'version', service['version'])])
73
+
74
+ # We expect to see both the updated submission parameter and the newly added one (while still keeping the custom value changes)
75
+ delta = datastore_connection.get_service_with_delta(service['name'])
76
+ assert delta['submission_params'][-2]['name'] == 'new_param' and delta['submission_params'][-2]['value'] == 'custom_value'
77
+ assert delta['submission_params'][-1]['name'] == 'new_new_param'
@@ -1 +0,0 @@
1
- 4.6.1.dev215
@@ -1,37 +0,0 @@
1
- from assemblyline_core.tasking_client import TaskingClient
2
-
3
- from assemblyline.odm.models.service import Service
4
- from assemblyline.odm.models.heuristic import Heuristic
5
- from assemblyline.odm.models.result import Result, Section, Heuristic as SectionHeuristic
6
-
7
- from assemblyline.odm.randomizer import random_minimal_obj
8
-
9
- def test_register_service(datastore_connection):
10
- client = TaskingClient(datastore_connection, register_only=True)
11
-
12
- # Test service registration
13
- service = random_minimal_obj(Service).as_primitives()
14
- heuristics = [random_minimal_obj(Heuristic).as_primitives() for _ in range(2)]
15
- service['heuristics'] = heuristics
16
- assert client.register_service(service)
17
- assert all([datastore_connection.heuristic.exists(h['heur_id']) for h in heuristics])
18
-
19
- # Test registration with heuristics that were removed but still have related results
20
- heuristic = heuristics.pop(0)
21
- result = random_minimal_obj(Result)
22
- section = random_minimal_obj(Section)
23
- section.heuristic = SectionHeuristic(heuristic)
24
- result.result.sections = [section]
25
- datastore_connection.result.save('test_result', result)
26
- datastore_connection.result.commit()
27
-
28
- # Heuristics that were removed should still reside in the system if there are still associated data to it
29
- service['heuristics'] = heuristics
30
- assert client.register_service(service)
31
- assert datastore_connection.heuristic.exists(heuristic['heur_id'])
32
-
33
- # Test registration with removed heuristics that have no related results
34
- datastore_connection.result.delete('test_result')
35
- datastore_connection.result.commit()
36
- assert client.register_service(service)
37
- assert not datastore_connection.heuristic.exists(heuristic['heur_id'])