Skip to content

Commit cdbae75

Browse files
committed
add a cron job for triage evalution
Signed-off-by: tdruez <tdruez@aboutcode.org>
1 parent 2000f51 commit cdbae75

3 files changed

Lines changed: 55 additions & 3 deletions

File tree

dejacode/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ def gettext_noop(s):
479479
hourly = "0 * * * *"
480480
DEJACODE_VULNERABILITIES_CRON = env.str("DEJACODE_VULNERABILITIES_CRON", default=daily_at_3am)
481481
DEJACODE_POLICY_RULES_CRON = env.str("DEJACODE_POLICY_RULES_CRON", default=hourly)
482+
DEJACODE_VULNERABILITY_TRIAGE_CRON = env.str("DEJACODE_VULNERABILITY_TRIAGE_CRON", default=hourly)
482483

483484

484485
def enable_rq_eager_mode():

dje/cron_jobs.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,28 @@
1212

1313
from dje.tasks import update_vulnerabilities
1414
from policy.tasks import evaluate_all_products_rules_task
15+
from vulnerabilities.triage.tasks import evaluate_all_products_vulnerability_triage_task
1516

16-
two_hour = 7200
17+
two_hours = 7200
18+
ten_minutes = 600
1719

1820
cron.register(
1921
func=update_vulnerabilities,
2022
queue_name="default",
2123
cron=settings.DEJACODE_VULNERABILITIES_CRON, # Daily at 3am by default
22-
job_timeout=two_hour,
24+
job_timeout=two_hours,
2325
)
2426

2527
cron.register(
2628
func=evaluate_all_products_rules_task,
2729
queue_name="default",
2830
cron=settings.DEJACODE_POLICY_RULES_CRON, # Hourly by default
29-
job_timeout=two_hour,
31+
job_timeout=ten_minutes,
32+
)
33+
34+
cron.register(
35+
func=evaluate_all_products_vulnerability_triage_task,
36+
queue_name="default",
37+
cron=settings.DEJACODE_VULNERABILITY_TRIAGE_CRON, # Hourly by default
38+
job_timeout=ten_minutes,
3039
)

vulnerabilities/triage/tasks.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#
2+
# Copyright (c) nexB Inc. and others. All rights reserved.
3+
# DejaCode is a trademark of nexB Inc.
4+
# SPDX-License-Identifier: AGPL-3.0-only
5+
# See https://github.com/aboutcode-org/dejacode for support or download.
6+
# See https://aboutcode.org for more information about AboutCode FOSS projects.
7+
#
8+
9+
import logging
10+
11+
from django_rq import job
12+
13+
from vulnerabilities.triage.engine import evaluate_ruleset
14+
from vulnerabilities.triage.models import ProductTriageRuleset
15+
16+
logger = logging.getLogger(__name__)
17+
18+
19+
@job
20+
def evaluate_all_products_vulnerability_triage_task():
21+
"""Evaluate all enabled triage rulesets against their assigned products."""
22+
assignments = (
23+
ProductTriageRuleset.objects.filter(ruleset__enabled=True)
24+
.select_related("product", "ruleset", "dataspace")
25+
.order_by("dataspace__name", "product__name", "product__version", "-ruleset__precedence")
26+
)
27+
28+
count = assignments.count()
29+
logger.info(f"Starting triage evaluation for {count} ruleset assignment(s).")
30+
31+
for assignment in assignments:
32+
logger.info(f"Evaluating triage ruleset {assignment.ruleset} for {assignment.product}")
33+
try:
34+
evaluate_ruleset(ruleset=assignment.ruleset, product=assignment.product)
35+
except Exception:
36+
logger.exception(
37+
f"Triage evaluation failed for {assignment.ruleset} / {assignment.product},"
38+
" skipping."
39+
)
40+
continue
41+
42+
logger.info("Triage evaluation complete.")

0 commit comments

Comments
 (0)