assemblyline-core 4.6.1.dev214__tar.gz → 4.6.1.dev218__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.dev214 → assemblyline_core-4.6.1.dev218}/PKG-INFO +1 -1
- assemblyline_core-4.6.1.dev218/assemblyline_core/VERSION +1 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/tasking_client.py +21 -22
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/updater/helper.py +8 -7
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/updater/run_updater.py +9 -27
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core.egg-info/PKG-INFO +1 -1
- assemblyline_core-4.6.1.dev218/test/test_tasking_client.py +77 -0
- assemblyline_core-4.6.1.dev214/assemblyline_core/VERSION +0 -1
- assemblyline_core-4.6.1.dev214/test/test_tasking_client.py +0 -89
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/LICENCE.md +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/README.md +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/alerter/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/alerter/processing.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/alerter/run_alerter.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/archiver/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/archiver/run_archiver.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/badlist_client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/dispatching/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/dispatching/__main__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/dispatching/client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/dispatching/dispatcher.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/dispatching/schedules.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/dispatching/timeout.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/expiry/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/expiry/run_expiry.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/ingester/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/ingester/__main__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/ingester/constants.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/ingester/ingester.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/es_metrics.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/helper.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/metrics_server.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/plumber/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/plumber/run_plumber.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/creator/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/creator/run.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/creator/run_worker.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/loader/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/loader/run.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/loader/run_worker.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/replay/replay.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/safelist_client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/collection.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/controllers/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/controllers/docker_ctl.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/controllers/interface.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/run_scaler.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/scaler/scaler_server.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/server_base.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/signature_client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/submission_client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/updater/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/vacuum/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/vacuum/crawler.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/vacuum/department_map.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/vacuum/safelist.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/vacuum/stream_map.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/vacuum/worker.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/workflow/__init__.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core/workflow/run_workflow.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core.egg-info/SOURCES.txt +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core.egg-info/dependency_links.txt +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core.egg-info/requires.txt +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/assemblyline_core.egg-info/top_level.txt +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/setup.cfg +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/setup.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_alerter.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_badlist_client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_dispatcher.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_expiry.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_plumber.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_replay.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_safelist_client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_scaler.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_scheduler.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_signature_client.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_simulation.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_vacuum.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_worker_ingest.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_worker_submit.py +0 -0
- {assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_workflow.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
4.6.1.dev218
|
|
@@ -162,28 +162,27 @@ class TaskingClient:
|
|
|
162
162
|
self.datastore.service_delta.commit()
|
|
163
163
|
self.log.info(f"{log_prefix}{service.name} version ({service.version}) registered")
|
|
164
164
|
else:
|
|
165
|
-
# Check for any
|
|
166
|
-
service_delta =
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
#
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
self.datastore.service_delta.save(service.name, unflatten(service_delta))
|
|
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)
|
|
187
186
|
|
|
188
187
|
new_heuristics = []
|
|
189
188
|
|
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import os
|
|
2
|
+
import requests
|
|
2
3
|
import re
|
|
3
4
|
import socket
|
|
4
5
|
import string
|
|
5
6
|
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
|
+
|
|
6
12
|
from base64 import b64encode
|
|
7
13
|
from collections import defaultdict
|
|
8
14
|
from logging import Logger
|
|
9
15
|
from typing import Dict, List
|
|
16
|
+
from packaging.version import parse, Version
|
|
10
17
|
from urllib.parse import urlencode
|
|
11
18
|
|
|
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
|
|
18
19
|
from azure.identity import DefaultAzureCredential
|
|
19
|
-
|
|
20
|
+
|
|
20
21
|
|
|
21
22
|
DEFAULT_DOCKER_REGISTRY = "hub.docker.com"
|
|
22
23
|
|
|
@@ -11,12 +11,6 @@ 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
|
|
20
14
|
from kubernetes import client, config
|
|
21
15
|
from kubernetes.client import (
|
|
22
16
|
V1Capabilities,
|
|
@@ -40,6 +34,12 @@ from kubernetes.client import (
|
|
|
40
34
|
)
|
|
41
35
|
from kubernetes.client.rest import ApiException
|
|
42
36
|
|
|
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,32 +692,14 @@ 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
|
-
|
|
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}"
|
|
695
|
+
operations = [(self.datastore.service_delta.UPDATE_SET, 'version', latest_tag)]
|
|
713
696
|
|
|
714
697
|
# Check if a service waas previously disabled and re-enable it
|
|
715
698
|
if service_name in self.incompatible_services:
|
|
716
699
|
self.incompatible_services.remove(service_name)
|
|
717
|
-
service_delta
|
|
718
|
-
|
|
700
|
+
operations.append((self.datastore.service_delta.UPDATE_SET, 'enabled', True))
|
|
719
701
|
|
|
720
|
-
if self.datastore.service_delta.
|
|
702
|
+
if self.datastore.service_delta.update(service_name, operations):
|
|
721
703
|
# Update completed, cleanup
|
|
722
704
|
self.service_events.send(service_name, {
|
|
723
705
|
'operation': Operation.Modified,
|
|
@@ -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.dev214
|
|
@@ -1,89 +0,0 @@
|
|
|
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'
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/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.dev214 → assemblyline_core-4.6.1.dev218}/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.dev214 → assemblyline_core-4.6.1.dev218}/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.dev214 → assemblyline_core-4.6.1.dev218}/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.dev214 → assemblyline_core-4.6.1.dev218}/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.dev214 → assemblyline_core-4.6.1.dev218}/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.dev214 → assemblyline_core-4.6.1.dev218}/test/test_safelist_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_signature_client.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_worker_ingest.py
RENAMED
|
File without changes
|
{assemblyline_core-4.6.1.dev214 → assemblyline_core-4.6.1.dev218}/test/test_worker_submit.py
RENAMED
|
File without changes
|
|
File without changes
|