assemblyline-core 4.6.1.dev202__tar.gz → 4.6.1.dev214__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.
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/PKG-INFO +1 -1
- assemblyline_core-4.6.1.dev214/assemblyline_core/VERSION +1 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/tasking_client.py +25 -2
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/updater/helper.py +7 -8
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/updater/run_updater.py +27 -9
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core.egg-info/PKG-INFO +1 -1
- assemblyline_core-4.6.1.dev214/test/test_tasking_client.py +89 -0
- assemblyline_core-4.6.1.dev202/assemblyline_core/VERSION +0 -1
- assemblyline_core-4.6.1.dev202/test/test_tasking_client.py +0 -37
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/LICENCE.md +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/README.md +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/alerter/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/alerter/processing.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/alerter/run_alerter.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/archiver/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/archiver/run_archiver.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/badlist_client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/dispatching/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/dispatching/__main__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/dispatching/client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/dispatching/dispatcher.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/dispatching/schedules.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/dispatching/timeout.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/expiry/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/expiry/run_expiry.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/ingester/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/ingester/__main__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/ingester/constants.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/ingester/ingester.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/es_metrics.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/helper.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/metrics_server.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/plumber/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/plumber/run_plumber.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/creator/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/creator/run.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/creator/run_worker.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/loader/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/loader/run.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/loader/run_worker.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/replay.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/safelist_client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/collection.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/controllers/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/controllers/interface.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/run_scaler.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/scaler/scaler_server.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/server_base.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/signature_client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/submission_client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/updater/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/vacuum/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/vacuum/crawler.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/vacuum/department_map.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/vacuum/safelist.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/vacuum/stream_map.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/vacuum/worker.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/workflow/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/workflow/run_workflow.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core.egg-info/SOURCES.txt +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core.egg-info/dependency_links.txt +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core.egg-info/requires.txt +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core.egg-info/top_level.txt +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/setup.cfg +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/setup.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_alerter.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_badlist_client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_dispatcher.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_expiry.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_plumber.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_replay.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_safelist_client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_scaler.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_scheduler.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_signature_client.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_simulation.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_vacuum.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_worker_ingest.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_worker_submit.py +0 -0
- {assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_workflow.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.6.1.dev214
|
|
@@ -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,32 @@ 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 updates to the service that should be applied to the service delta
|
|
166
|
+
service_delta = flatten(self.datastore.service_delta.get(service.name, as_obj=False))
|
|
167
|
+
if service_delta.get('version') is not None and service_delta['version'] != service.version:
|
|
168
|
+
# Update the service delta based on changes in the new service version
|
|
169
|
+
old_service = flatten(self.datastore.service.get(f'{service.name}_{service_delta["version"]}',
|
|
170
|
+
as_obj=False))
|
|
171
|
+
new_service = flatten(service.as_primitives())
|
|
172
|
+
|
|
173
|
+
# Check for cases elements from internal lists have been removed
|
|
174
|
+
for key, id_field in self.datastore.service_list_keys.items():
|
|
175
|
+
if key in service_delta:
|
|
176
|
+
# Check to see what was removed from the list in the previous version
|
|
177
|
+
old_ids = set(item[id_field] for item in old_service.get(key, []))
|
|
178
|
+
new_ids = set(item[id_field] for item in service_delta[key])
|
|
179
|
+
removed_ids = old_ids - new_ids
|
|
180
|
+
|
|
181
|
+
# Add any new items to the delta so it can be included in the merged service configuration
|
|
182
|
+
added_ids = set(item[id_field] for item in new_service[key]) - removed_ids
|
|
183
|
+
if added_ids:
|
|
184
|
+
service_delta[key].extend([{id_field: added_id} for added_id in added_ids])
|
|
185
|
+
|
|
186
|
+
self.datastore.service_delta.save(service.name, unflatten(service_delta))
|
|
164
187
|
|
|
165
188
|
new_heuristics = []
|
|
166
|
-
|
|
189
|
+
|
|
167
190
|
plan = self.datastore.heuristic.get_bulk_plan()
|
|
168
191
|
for index, heuristic in enumerate(heuristics):
|
|
169
192
|
heuristic_id = f'#{index}' # Set heuristic id to it's position in the list for logging purposes
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
import os
|
|
2
|
-
import requests
|
|
3
2
|
import re
|
|
4
3
|
import socket
|
|
5
4
|
import string
|
|
6
5
|
import time
|
|
7
|
-
|
|
8
|
-
from assemblyline.common.version import FRAMEWORK_VERSION, SYSTEM_VERSION
|
|
9
|
-
from assemblyline.odm.models.config import Config as SystemConfig, ServiceRegistry
|
|
10
|
-
from assemblyline.odm.models.service import Service as ServiceConfig, DockerConfig
|
|
11
|
-
|
|
12
6
|
from base64 import b64encode
|
|
13
7
|
from collections import defaultdict
|
|
14
8
|
from logging import Logger
|
|
15
9
|
from typing import Dict, List
|
|
16
|
-
from packaging.version import parse, Version
|
|
17
10
|
from urllib.parse import urlencode
|
|
18
11
|
|
|
12
|
+
import requests
|
|
13
|
+
from assemblyline.common.version import FRAMEWORK_VERSION, SYSTEM_VERSION
|
|
14
|
+
from assemblyline.odm.models.config import Config as SystemConfig
|
|
15
|
+
from assemblyline.odm.models.config import ServiceRegistry
|
|
16
|
+
from assemblyline.odm.models.service import DockerConfig
|
|
17
|
+
from assemblyline.odm.models.service import Service as ServiceConfig
|
|
19
18
|
from azure.identity import DefaultAzureCredential
|
|
20
|
-
|
|
19
|
+
from packaging.version import Version, parse
|
|
21
20
|
|
|
22
21
|
DEFAULT_DOCKER_REGISTRY = "hub.docker.com"
|
|
23
22
|
|
|
@@ -11,6 +11,12 @@ from concurrent.futures import ThreadPoolExecutor
|
|
|
11
11
|
from typing import Any, List, Optional
|
|
12
12
|
|
|
13
13
|
import docker
|
|
14
|
+
from assemblyline.common import isotime
|
|
15
|
+
from assemblyline.odm.messages.changes import Operation, ServiceChange
|
|
16
|
+
from assemblyline.odm.models.config import Mount, Selector
|
|
17
|
+
from assemblyline.odm.models.service import DockerConfig, Service
|
|
18
|
+
from assemblyline.remote.datatypes.events import EventSender, EventWatcher
|
|
19
|
+
from assemblyline.remote.datatypes.hash import Hash
|
|
14
20
|
from kubernetes import client, config
|
|
15
21
|
from kubernetes.client import (
|
|
16
22
|
V1Capabilities,
|
|
@@ -34,12 +40,6 @@ from kubernetes.client import (
|
|
|
34
40
|
)
|
|
35
41
|
from kubernetes.client.rest import ApiException
|
|
36
42
|
|
|
37
|
-
from assemblyline.common import isotime
|
|
38
|
-
from assemblyline.odm.messages.changes import Operation, ServiceChange
|
|
39
|
-
from assemblyline.odm.models.config import Mount, Selector
|
|
40
|
-
from assemblyline.odm.models.service import DockerConfig, Service
|
|
41
|
-
from assemblyline.remote.datatypes.events import EventSender, EventWatcher
|
|
42
|
-
from assemblyline.remote.datatypes.hash import Hash
|
|
43
43
|
from assemblyline_core.scaler.controllers.kubernetes_ctl import (
|
|
44
44
|
PRIVILEGED_SERVICE_ACCOUNT_NAME,
|
|
45
45
|
create_docker_auth_config,
|
|
@@ -692,14 +692,32 @@ class ServiceUpdater(ThreadedCoreBase):
|
|
|
692
692
|
service_name, latest_tag = service_key.split("_")
|
|
693
693
|
|
|
694
694
|
if self.datastore.service.get_if_exists(service_key):
|
|
695
|
-
|
|
695
|
+
service_image = self.datastore.service.get(service_key, as_obj=False)['docker_config']['image'].rsplit(':', 1)[0].split('/', 1)[1]
|
|
696
|
+
|
|
697
|
+
service_delta = self.datastore.service_delta.get(service_name, as_obj=False)
|
|
698
|
+
# Update the service version in the delta
|
|
699
|
+
service_delta['version'] = latest_tag
|
|
700
|
+
|
|
701
|
+
# If the container images related to the service have been changed, update the version
|
|
702
|
+
if service_delta.get('docker_config', {}).get('image'):
|
|
703
|
+
image_path, _ = service_delta['docker_config']['image'].rsplit(':', 1)
|
|
704
|
+
service_delta['docker_config']['image'] = f"{image_path}:{latest_tag}"
|
|
705
|
+
|
|
706
|
+
if service_delta.get('dependencies', {}).items():
|
|
707
|
+
for _, dep_data in service_delta['dependencies'].items():
|
|
708
|
+
if dep_data.get('image'):
|
|
709
|
+
dep_image_path, _ = dep_data['image'].rsplit(':', 1)
|
|
710
|
+
if service_image in dep_image_path:
|
|
711
|
+
# Only update dependencies that share the same image as the main service
|
|
712
|
+
dep_data['image'] = f"{dep_image_path}:{latest_tag}"
|
|
696
713
|
|
|
697
714
|
# Check if a service waas previously disabled and re-enable it
|
|
698
715
|
if service_name in self.incompatible_services:
|
|
699
716
|
self.incompatible_services.remove(service_name)
|
|
700
|
-
|
|
717
|
+
service_delta['enabled'] = True
|
|
701
718
|
|
|
702
|
-
|
|
719
|
+
|
|
720
|
+
if self.datastore.service_delta.save(service_name, service_delta):
|
|
703
721
|
# Update completed, cleanup
|
|
704
722
|
self.service_events.send(service_name, {
|
|
705
723
|
'operation': Operation.Modified,
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
from assemblyline.odm.models.heuristic import Heuristic
|
|
2
|
+
from assemblyline.odm.models.result import Heuristic as SectionHeuristic
|
|
3
|
+
from assemblyline.odm.models.result import Result, Section
|
|
4
|
+
from assemblyline.odm.models.service import Service
|
|
5
|
+
from assemblyline.odm.randomizer import random_minimal_obj, random_model_obj
|
|
6
|
+
from assemblyline_core.tasking_client import TaskingClient
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def test_register_service(datastore_connection):
|
|
10
|
+
client = TaskingClient(datastore_connection, register_only=True)
|
|
11
|
+
|
|
12
|
+
# Test service registration
|
|
13
|
+
service = random_model_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'])
|
|
38
|
+
|
|
39
|
+
# Test registration with new and removed sources, submission parameters and configurations
|
|
40
|
+
datastore_connection.service_delta.save(service['name'], {
|
|
41
|
+
"version": service['version'],
|
|
42
|
+
# Let's imagine a user added a new configuration parameter between updates
|
|
43
|
+
"config": {"user_config": "user_value"},
|
|
44
|
+
"submission_params": [
|
|
45
|
+
{
|
|
46
|
+
# Let's imagine a user added a new submission parameter between updates
|
|
47
|
+
"name": "user_param",
|
|
48
|
+
"type": "str",
|
|
49
|
+
"default": "user_value",
|
|
50
|
+
"value": "user_value",
|
|
51
|
+
}
|
|
52
|
+
],
|
|
53
|
+
"update_config": {
|
|
54
|
+
# Let's imagine a user removed a sources between updates
|
|
55
|
+
"sources": service['update_config']['sources'][1:],
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
# Now let's update the service with a new version that has some changes
|
|
60
|
+
service['config']['new_config'] = 'new_value'
|
|
61
|
+
service['submission_params'].append({
|
|
62
|
+
"name": "new_param",
|
|
63
|
+
"type": "str",
|
|
64
|
+
"default": "new_value",
|
|
65
|
+
"value": "new_value",
|
|
66
|
+
})
|
|
67
|
+
service['update_config']['sources'].append({"name": "new_source", "uri": "http://new_source"})
|
|
68
|
+
service['version'] = "new_version"
|
|
69
|
+
assert client.register_service(service)
|
|
70
|
+
|
|
71
|
+
datastore_connection.service_delta.update(service['name'],
|
|
72
|
+
[(datastore_connection.service_delta.UPDATE_SET, 'version', service['version'])])
|
|
73
|
+
|
|
74
|
+
merged_service = datastore_connection.get_service_with_delta(service['name'], as_obj=False)
|
|
75
|
+
# Update sources that have been removed should stay removed
|
|
76
|
+
sources = [s['name'] for s in merged_service['update_config']['sources']]
|
|
77
|
+
assert service['update_config']['sources'][0]['name'] not in sources
|
|
78
|
+
|
|
79
|
+
# Update sources that are new should be added
|
|
80
|
+
assert 'new_source' in sources
|
|
81
|
+
|
|
82
|
+
# Submission parameters that are new should be added and old user parameters should stay
|
|
83
|
+
submission_param_names = [p['name'] for p in merged_service['submission_params']]
|
|
84
|
+
assert 'new_param' in submission_param_names
|
|
85
|
+
assert 'user_param' in submission_param_names
|
|
86
|
+
|
|
87
|
+
# Configurations that are new should be added and old user configurations should stay
|
|
88
|
+
assert merged_service['config']['new_config'] == 'new_value'
|
|
89
|
+
assert merged_service['config']['user_config'] == 'user_value'
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
4.6.1.dev202
|
|
@@ -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'])
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/replay/replay.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/server_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/assemblyline_core/vacuum/worker.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_badlist_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_safelist_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_signature_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_worker_ingest.py
RENAMED
|
File without changes
|
{assemblyline_core-4.6.1.dev202 → assemblyline_core-4.6.1.dev214}/test/test_worker_submit.py
RENAMED
|
File without changes
|
|
File without changes
|