assemblyline-core 4.5.0.19__tar.gz → 4.5.0.20__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 (88) hide show
  1. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/PKG-INFO +1 -1
  2. assemblyline-core-4.5.0.20/assemblyline_core/VERSION +1 -0
  3. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/archiver/run_archiver.py +30 -6
  4. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/controllers/docker_ctl.py +12 -6
  5. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/scaler_server.py +19 -0
  6. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/updater/run_updater.py +22 -3
  7. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core.egg-info/PKG-INFO +1 -1
  8. assemblyline-core-4.5.0.19/assemblyline_core/VERSION +0 -1
  9. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/LICENCE.md +0 -0
  10. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/README.md +0 -0
  11. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/__init__.py +0 -0
  12. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/alerter/__init__.py +0 -0
  13. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/alerter/processing.py +0 -0
  14. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/alerter/run_alerter.py +0 -0
  15. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/archiver/__init__.py +0 -0
  16. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/badlist_client.py +0 -0
  17. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/dispatching/__init__.py +0 -0
  18. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/dispatching/__main__.py +0 -0
  19. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/dispatching/client.py +0 -0
  20. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/dispatching/dispatcher.py +0 -0
  21. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/dispatching/schedules.py +0 -0
  22. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/dispatching/timeout.py +0 -0
  23. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/expiry/__init__.py +0 -0
  24. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/expiry/run_expiry.py +0 -0
  25. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/ingester/__init__.py +0 -0
  26. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/ingester/__main__.py +0 -0
  27. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/ingester/constants.py +0 -0
  28. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/ingester/ingester.py +0 -0
  29. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/__init__.py +0 -0
  30. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/es_metrics.py +0 -0
  31. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/heartbeat_formatter.py +0 -0
  32. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/helper.py +0 -0
  33. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/metrics_server.py +0 -0
  34. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/run_heartbeat_manager.py +0 -0
  35. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/run_metrics_aggregator.py +0 -0
  36. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/metrics/run_statistics_aggregator.py +0 -0
  37. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/plumber/__init__.py +0 -0
  38. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/plumber/run_plumber.py +0 -0
  39. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/__init__.py +0 -0
  40. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/client.py +0 -0
  41. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/creator/__init__.py +0 -0
  42. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/creator/run.py +0 -0
  43. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/creator/run_worker.py +0 -0
  44. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/loader/__init__.py +0 -0
  45. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/loader/run.py +0 -0
  46. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/loader/run_worker.py +0 -0
  47. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/replay/replay.py +0 -0
  48. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/safelist_client.py +0 -0
  49. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/__init__.py +0 -0
  50. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/collection.py +0 -0
  51. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/controllers/__init__.py +0 -0
  52. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/controllers/interface.py +0 -0
  53. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/controllers/kubernetes_ctl.py +0 -0
  54. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/scaler/run_scaler.py +0 -0
  55. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/server_base.py +0 -0
  56. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/signature_client.py +0 -0
  57. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/submission_client.py +0 -0
  58. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/tasking_client.py +0 -0
  59. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/updater/__init__.py +0 -0
  60. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/updater/helper.py +0 -0
  61. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/vacuum/__init__.py +0 -0
  62. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/vacuum/crawler.py +0 -0
  63. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/vacuum/department_map.py +0 -0
  64. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/vacuum/safelist.py +0 -0
  65. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/vacuum/stream_map.py +0 -0
  66. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/vacuum/worker.py +0 -0
  67. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/workflow/__init__.py +0 -0
  68. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core/workflow/run_workflow.py +0 -0
  69. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core.egg-info/SOURCES.txt +0 -0
  70. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core.egg-info/dependency_links.txt +0 -0
  71. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core.egg-info/requires.txt +0 -0
  72. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/assemblyline_core.egg-info/top_level.txt +0 -0
  73. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/setup.cfg +0 -0
  74. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/setup.py +0 -0
  75. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_alerter.py +0 -0
  76. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_badlist_client.py +0 -0
  77. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_dispatcher.py +0 -0
  78. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_expiry.py +0 -0
  79. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_plumber.py +0 -0
  80. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_replay.py +0 -0
  81. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_safelist_client.py +0 -0
  82. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_scaler.py +0 -0
  83. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_scheduler.py +0 -0
  84. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_signature_client.py +0 -0
  85. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_simulation.py +0 -0
  86. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_vacuum.py +0 -0
  87. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_worker_ingest.py +0 -0
  88. {assemblyline-core-4.5.0.19 → assemblyline-core-4.5.0.20}/test/test_worker_submit.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: assemblyline-core
3
- Version: 4.5.0.19
3
+ Version: 4.5.0.20
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.5.0.20
@@ -7,8 +7,8 @@ from assemblyline.common import forge
7
7
  from assemblyline.common.archiving import ARCHIVE_QUEUE_NAME
8
8
  from assemblyline.common.metrics import MetricsFactory
9
9
  from assemblyline.datastore.collection import ESCollection, Index
10
+ from assemblyline.datastore.exceptions import VersionConflictException
10
11
  from assemblyline.odm.messages.archive_heartbeat import Metrics
11
- from assemblyline.odm.models.submission import Submission
12
12
  from assemblyline.remote.datatypes import get_client
13
13
  from assemblyline.remote.datatypes.queues.named import NamedQueue
14
14
 
@@ -62,7 +62,16 @@ class Archiver(ServerBase):
62
62
  return
63
63
  else:
64
64
  try:
65
- archive_type, type_id, delete_after = message
65
+ if len(message) == 3:
66
+ archive_type, type_id, delete_after = message
67
+ metadata = None
68
+ use_alternate_dtl = False
69
+ elif len(message) == 4:
70
+ archive_type, type_id, delete_after, metadata = message
71
+ use_alternate_dtl = False
72
+ else:
73
+ archive_type, type_id, delete_after, metadata, use_alternate_dtl = message
74
+
66
75
  self.counter.increment('received')
67
76
  except Exception:
68
77
  self.log.error(f"Invalid message received: {message}")
@@ -76,11 +85,24 @@ class Archiver(ServerBase):
76
85
  if archive_type == "submission":
77
86
  self.counter.increment('submission')
78
87
  # Load submission
79
- submission: Submission = self.datastore.submission.get_if_exists(type_id)
88
+ while True:
89
+ try:
90
+ submission, version = self.datastore.submission.get_if_exists(type_id, version=True)
91
+
92
+ # If we have metadata passed in the message, we need to apply it before archiving the submission
93
+ if metadata and self.config.core.archiver.use_metadata:
94
+ submission.metadata.update({f"archive.{k}": v for k, v in metadata.items()})
95
+ self.datastore.submission.save(type_id, submission, version=version)
96
+
97
+ break
98
+ except VersionConflictException as vce:
99
+ self.log.info(f"Retrying saving metadata due to version conflict: {str(vce)}")
100
+
80
101
  if not submission:
81
102
  raise SubmissionNotFound(type_id)
82
103
 
83
- self.datastore.submission.archive(type_id, delete_after=delete_after)
104
+ self.datastore.submission.archive(type_id, delete_after=delete_after,
105
+ use_alternate_dtl=use_alternate_dtl)
84
106
  if not delete_after:
85
107
  self.datastore.submission.update(type_id, [(ESCollection.UPDATE_SET, 'archived', True)],
86
108
  index_type=Index.HOT)
@@ -100,7 +122,8 @@ class Archiver(ServerBase):
100
122
  infos = infos.union({'password' for x in tags if x['type'] == 'info.password'})
101
123
 
102
124
  # Create the archive file
103
- self.datastore.file.archive(sha256, delete_after=delete_after, allow_missing=True)
125
+ self.datastore.file.archive(sha256, delete_after=delete_after,
126
+ allow_missing=True, use_alternate_dtl=use_alternate_dtl)
104
127
 
105
128
  # Auto-Labelling
106
129
  operations = []
@@ -142,7 +165,8 @@ class Archiver(ServerBase):
142
165
  for r in submission.results:
143
166
  if not r.endswith(".e"):
144
167
  self.counter.increment('result')
145
- self.datastore.result.archive(r, delete_after=delete_after, allow_missing=True)
168
+ self.datastore.result.archive(r, delete_after=delete_after,
169
+ allow_missing=True, use_alternate_dtl=use_alternate_dtl)
146
170
 
147
171
  # End of process alert transaction (success)
148
172
  self.log.info(f"Successfully archived submission '{type_id}'.")
@@ -191,7 +191,7 @@ class DockerController(ControllerInterface):
191
191
  # Define environment variables
192
192
  env = [f'{_e.name}={_e.value}' for _e in cfg.environment]
193
193
  env += [f'{name}={os.environ[name]}' for name in INHERITED_VARIABLES if name in os.environ]
194
- env += [f'LOG_LEVEL={self.log_level}']
194
+ env += [f'LOG_LEVEL={self.log_level}', f'AL_SERVICE_NAME={service_name}']
195
195
  env += [f'{_n}={_v}' for _n, _v in self._service_limited_env[service_name].items()]
196
196
  if prof.privileged:
197
197
  env.append('PRIVILEGED=true')
@@ -259,6 +259,15 @@ class DockerController(ControllerInterface):
259
259
  env += [f'{name}={os.environ[name]}' for name in INHERITED_VARIABLES if name in os.environ]
260
260
  env += [f'LOG_LEVEL={self.log_level}', f'AL_SERVICE_NAME={service_name}']
261
261
 
262
+ healthcheck = {
263
+ 'test': ["CMD", "python3", "-m", "assemblyline_v4_service.healthz"],
264
+ 'interval': SERVICE_LIVENESS_PERIOD,
265
+ 'timeout': SERVICE_LIVENESS_TIMEOUT
266
+ }
267
+
268
+ if 'assemblyline' not in cfg.image:
269
+ healthcheck = None
270
+
262
271
  container = self.client.containers.run(
263
272
  image=cfg.image,
264
273
  name=name,
@@ -274,12 +283,9 @@ class DockerController(ControllerInterface):
274
283
  environment=env,
275
284
  detach=True,
276
285
  # ports=ports,
277
- healthcheck={
278
- 'test': ["CMD", "python3", "-m", "assemblyline_v4_service.healthz"],
279
- 'interval': SERVICE_LIVENESS_PERIOD,
280
- 'timeout': SERVICE_LIVENESS_TIMEOUT
281
- }
286
+ healthcheck=healthcheck
282
287
  )
288
+
283
289
  if core_container:
284
290
  self._connect_to_network(container, self.core_network, aliases=[hostname])
285
291
 
@@ -448,11 +448,30 @@ class ScalerServer(ThreadedCoreBase):
448
448
  self._sync_service(service)
449
449
 
450
450
  def sync_services(self):
451
+ last_synced_profiles = None
451
452
  while self.running:
452
453
  with apm_span(self.apm_client, 'sync_services'):
453
454
  self.log.info('Synchronizing service configuration')
454
455
  with self.profiles_lock:
455
456
  current_services = set(self.profiles.keys())
457
+
458
+ # Check to see if the service is progressing since it's last sync
459
+ if last_synced_profiles:
460
+ for service, profile in self.profiles.items():
461
+ # Assume there was no backlog initially if the service is new since last sync
462
+ last_synced_backlog = 0
463
+ if last_synced_profiles.get(service):
464
+ last_synced_backlog = last_synced_profiles[service].backlog
465
+
466
+ # Check to see if the backlog has increased and if the service has been running since
467
+ if profile.backlog and profile.backlog >= last_synced_backlog and \
468
+ profile.running_instances == 0 and profile.target_instances > 0:
469
+ # Restart the service in an attempt to resolve intermittent issues with container/pod
470
+ self.controller.restart(profile)
471
+
472
+ # Update the last synced profiles for next time
473
+ last_synced_profiles = self.profiles
474
+
456
475
  discovered_services: list[str] = []
457
476
 
458
477
  # Get all the service data
@@ -357,10 +357,24 @@ class KubernetesUpdateInterface:
357
357
 
358
358
  if blocking:
359
359
  try:
360
+ # Obtain the name of the pod that spawned from the Job
361
+ pod_name = self.api.list_namespaced_pod(namespace=self.namespace,
362
+ label_selector=",".join([f"{k}={v}"
363
+ for k, v in labels.items()]),
364
+ limit=1).items[0].metadata.name
360
365
  while not (status.failed or status.succeeded):
361
366
  time.sleep(3)
362
367
  status = self.batch_api.read_namespaced_job(namespace=self.namespace, name=name,
363
368
  _request_timeout=API_TIMEOUT).status
369
+ # Monitor container's waiting status state
370
+ pod_waiting_state = self.api.read_namespaced_pod(name=pod_name, namespace=self.namespace,
371
+ _request_timeout=API_TIMEOUT).status.container_statuses[0].state.waiting
372
+ # Check to see if we've encountered an issue before the container starts
373
+ if pod_waiting_state and pod_waiting_state.reason == "ImagePullBackOff":
374
+ # Delete job and raise exception
375
+ self.batch_api.delete_namespaced_job(name=name, namespace=self.namespace,
376
+ propagation_policy='Background', _request_timeout=API_TIMEOUT)
377
+ raise Exception(pod_waiting_state.message)
364
378
 
365
379
  self.batch_api.delete_namespaced_job(name=name, namespace=self.namespace,
366
380
  propagation_policy='Background', _request_timeout=API_TIMEOUT)
@@ -479,6 +493,13 @@ class ServiceUpdater(ThreadedCoreBase):
479
493
  image_name, tag_name, auth = get_latest_tag_for_service(
480
494
  service, self.config, self.log, prefix="[CI] ")
481
495
 
496
+ if not tag_name:
497
+ # Fallback to tag alias if we can't find a suitable versioned tag
498
+ self.log.warning("Unable to find a versioned tag for "
499
+ f"{self.config.services.preferred_update_channel} channel. "
500
+ f"Defaulting to '{tag}' tag...")
501
+ tag_name = tag
502
+
482
503
  docker_config = dict(image=f"{image_name}:{tag_name}")
483
504
  if auth:
484
505
  docker_config.update(dict(registry_username=auth['username'],
@@ -507,12 +528,10 @@ class ServiceUpdater(ThreadedCoreBase):
507
528
  blocking=True
508
529
  )
509
530
 
510
- service_key = f"{service_name}_{tag_name.replace('stable', '')}"
511
-
512
531
  except Exception as e:
513
532
  self.log.error(
514
533
  f"[CI] Service {service_name} has failed to install. Install procedure cancelled... [{str(e)}]")
515
- return service_key
534
+ return f"{service_name}_{str(tag_name).replace('stable', '')}"
516
535
 
517
536
  # Start up installs for services in parallel
518
537
  install_threads = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: assemblyline-core
3
- Version: 4.5.0.19
3
+ Version: 4.5.0.20
4
4
  Summary: Assemblyline 4 - Core components
5
5
  Home-page: https://github.com/CybercentreCanada/assemblyline-core/
6
6
  Author: CCCS Assemblyline development team
@@ -1 +0,0 @@
1
- 4.5.0.19