Skip to content

On var change resend Android certificate templates and managed app configs#48278

Merged
ksykulev merged 6 commits into
mainfrom
37406-android-on-var-change
Jun 25, 2026
Merged

On var change resend Android certificate templates and managed app configs#48278
ksykulev merged 6 commits into
mainfrom
37406-android-on-var-change

Conversation

@ksykulev

@ksykulev ksykulev commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Related issue: Resolves #36681, #48042

Checklist for submitter

If some of the following don't apply, delete the relevant line.

  • Changes file added for user-visible changes in changes/, orbit/changes/ or ee/fleetd-chrome/changes.
    See Changes files for more information.

  • Input data is properly validated, SELECT * is avoided, SQL injection is prevented (using placeholders for values in statements), JS inline code is prevented especially for url redirects, and untrusted data interpolated into shell scripts/commands is validated against shell metacharacters.

Testing

  • Added/updated automated tests
  • QA'd all new/changed functionality manually

Database migrations

  • Checked schema for all modified table for columns that will auto-update timestamps during migration.
  • Confirmed that updating the timestamps is acceptable, and will not cause unwanted side effects.
  • Ensured the correct collation is explicitly set for character columns (COLLATE utf8mb4_unicode_ci).

Summary by CodeRabbit

  • New Features
    • Certificate templates and managed Android app configurations now keep track of referenced variables.
    • Variable changes can now trigger automatic re-sending of affected profiles and app availability updates.
  • Bug Fixes
    • Resend behavior now refreshes certificate templates when related variable values change.
    • Android managed app configurations are re-queued when their variables are updated.
  • Database
    • Added support for variable tracking on certificate templates and Android app configurations.

Copilot AI review requested due to automatic review settings June 25, 2026 15:55
@ksykulev ksykulev requested a review from a team as a code owner June 25, 2026 15:55

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.

Tip: disable this comment in your organization's Code Review settings.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

  • Copilot's review of this pull request may be incomplete because some of the changed files are excluded by your Copilot content exclusion settings. See Excluding content from Copilot for details.

Pull request overview

This PR extends Fleet’s SCIM-triggered “resend on variable change” behavior to cover Android certificate templates and Android managed app configurations by tracking which Fleet variables each artifact references and resending/repushing when those variables change.

Changes:

  • Track Fleet variable usage for Android certificate templates (service layer + datastore persistence).
  • Track Fleet variable usage for Android app configurations and enqueue repush jobs when affected SCIM variables change.
  • Extend mdm_configuration_profile_variables schema/migration to associate variables with certificate templates and Android app configurations.

Reviewed changes

Copilot reviewed 11 out of 12 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
server/service/certificates.go Persists variable associations when creating/applying certificate templates.
server/service/certificate_templates.go Adds helper to extract Fleet vars from subject name + SAN.
server/service/certificate_templates_test.go Adds unit tests for extraction + verifies variable tracking is called on create.
server/mock/datastore_mock.go Adds mock support for SetCertificateTemplateVariables.
server/fleet/datastore.go Extends datastore interface to include SetCertificateTemplateVariables.
server/datastore/mysql/scim.go On SCIM var change: marks cert templates pending and queues managed-config repush jobs.
server/datastore/mysql/schema.sql Updates schema snapshot for new variable-tracking columns/constraints.
server/datastore/mysql/migrations/tables/20260624152755_AddAppConfigVariableTracking.go Migration adding cert-template/app-config variable tracking columns + updated CHECK constraint.
server/datastore/mysql/migrations/tables/20260624152755_AddAppConfigVariableTracking_test.go Migration test covering uniqueness/check constraint + cascade deletes.
server/datastore/mysql/certificate_templates.go Implements variable association persistence for cert templates.
server/datastore/mysql/android.go Persists variable associations when Android app configs are inserted/updated.
changes/48042-resend-managed-config-on-var-change Release-note entry (content excluded from review per policy).
Files excluded by content exclusion policy (1)
  • changes/48042-resend-managed-config-on-var-change

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread server/datastore/mysql/scim.go
Comment thread server/datastore/mysql/scim.go
Comment thread server/datastore/mysql/certificate_templates.go Outdated
@codecov

codecov Bot commented Jun 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 77.67857% with 50 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.31%. Comparing base (0358811) to head (4fb6589).
⚠️ Report is 7 commits behind head on main.

Files with missing lines Patch % Lines
server/datastore/mysql/scim.go 78.43% 12 Missing and 10 partials ⚠️
server/datastore/mysql/android.go 72.72% 6 Missing and 6 partials ⚠️
server/datastore/mysql/certificate_templates.go 76.47% 4 Missing and 4 partials ⚠️
...0624152755_AddCertAndAndroidAppVariableTracking.go 86.20% 3 Missing and 1 partial ⚠️
server/service/certificates.go 33.33% 2 Missing and 2 partials ⚠️
Additional details and impacted files
@@           Coverage Diff            @@
##             main   #48278    +/-   ##
========================================
  Coverage   67.30%   67.31%            
========================================
  Files        3661     3662     +1     
  Lines      231437   231749   +312     
  Branches    12155    12155            
========================================
+ Hits       155774   156007   +233     
- Misses      61725    61768    +43     
- Partials    13938    13974    +36     
Flag Coverage Δ
backend 68.88% <77.67%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: e45838e8-14aa-499e-ba4e-f5f1cb4d36c7

📥 Commits

Reviewing files that changed from the base of the PR and between d21efc9 and 4fb6589.

📒 Files selected for processing (2)
  • server/datastore/mysql/migrations/tables/20260624152755_AddCertAndAndroidAppVariableTracking.go
  • server/datastore/mysql/migrations/tables/20260624152755_AddCertAndAndroidAppVariableTracking_test.go
💤 Files with no reviewable changes (2)
  • server/datastore/mysql/migrations/tables/20260624152755_AddCertAndAndroidAppVariableTracking.go
  • server/datastore/mysql/migrations/tables/20260624152755_AddCertAndAndroidAppVariableTracking_test.go

Walkthrough

This PR extends mdm_configuration_profile_variables with certificate-template and Android-app-configuration scopes, adds datastore and service paths to extract and store Fleet variable references for certificate templates and Android app configurations, and updates SCIM variable-change handling to reset matching certificate templates and enqueue Android managed-app availability jobs. A new migration and tests cover the schema and resend behavior.

Possibly related issues

  • Issue 45353: Also concerns Android managed app configuration variable handling; this PR adds variable tracking and resend job queuing for Android app configurations.

Possibly related PRs

  • fleetdm/fleet#48100: Also changes certificate template variable handling in server/service/certificate_templates.go; it expands supported $FLEET_VAR_* values, while this PR adds extraction and persistence for resend-triggered tracking.
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR also adds Android managed app config resend logic and schema changes, which are outside linked issue #36681's scope. Add #48042 to the linked issues or split the managed app config work into a separate PR so this review matches #36681.
Docstring Coverage ⚠️ Warning Docstring coverage is 17.39% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly matches the main change: resending Android certificate templates and managed app configs on variable changes.
Description check ✅ Passed The description follows the template, includes the related issue and required checklist sections, and is detailed enough for review.
Linked Issues check ✅ Passed The certificate-template variable tracking and resend logic satisfy the Android cert resend requirement for changed IDP fleet variables.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 37406-android-on-var-change

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

  • Copilot's review of this pull request may be incomplete because some of the changed files are excluded by your Copilot content exclusion settings. See Excluding content from Copilot for details.

Pull request overview

Copilot reviewed 12 out of 13 changed files in this pull request and generated 1 comment.

Files excluded by content exclusion policy (1)
  • changes/48042-resend-managed-config-on-var-change

Comment thread server/datastore/mysql/scim.go Outdated
Comment on lines +1420 to +1423
// Queue make_android_app_available jobs for managed app configs that use affected variables.
if err := queueManagedConfigResendJobs(ctx, tx, vars); err != nil {
return ctxerr.Wrap(ctx, err, "queue managed config resend jobs")
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The calls are idempotent (AMAPI returns NotModified) but it wastes rate limit quota unnecessarily. I think this is a reasonable approach for now and can be fixed in a follow up.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (2)
server/datastore/mysql/certificate_templates.go (2)

327-383: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Make the delete+insert "replace" atomic.

setCertTemplateVariableAssociations deletes existing rows and then performs a separate bulk insert, and the exported SetCertificateTemplateVariables runs it on ds.writer(ctx) (no transaction). If the insert fails after the delete commits, the template is left with no variable associations, so a subsequent IdP variable change would silently fail to resend that template (the SCIM resend query joins through mdm_configuration_profile_variables). Consider wrapping the delete+insert in a transaction.

♻️ Run the replace inside a transaction
 func (ds *Datastore) SetCertificateTemplateVariables(ctx context.Context, certTemplateID uint, fleetVars []fleet.FleetVarName) error {
-	return setCertTemplateVariableAssociations(ctx, ds.writer(ctx), certTemplateID, fleetVars)
+	return ds.withRetryTxx(ctx, func(tx sqlx.ExtContext) error {
+		return setCertTemplateVariableAssociations(ctx, tx, certTemplateID, fleetVars)
+	})
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/datastore/mysql/certificate_templates.go` around lines 327 - 383,
`setCertTemplateVariableAssociations` currently performs a delete followed by a
separate insert, and `SetCertificateTemplateVariables` calls it through
`ds.writer(ctx)` without a transaction, so a failed insert can leave
`mdm_configuration_profile_variables` empty; make the replace atomic by running
the delete+insert together in one transaction. Update
`SetCertificateTemplateVariables` (or the helper it calls) to begin a
transaction, pass the transactional executor into
`setCertTemplateVariableAssociations`, and only commit after the insert succeeds
so the associations are never partially replaced.

369-373: 📐 Maintainability & Code Quality | 🔵 Trivial

Consider replacing deprecated VALUES() with row aliases.

The VALUES() function usage within the ON DUPLICATE KEY UPDATE clause is deprecated as of MySQL 8.0.20 and subject to removal in future versions. Replacing it with the aliased-row syntax is recommended for forward compatibility.

Update the statement to include a row alias (e.g., AS new) after the values list to reference the inserted values directly in the update clause:

INSERT INTO mdm_configuration_profile_variables (certificate_template_id, fleet_variable_id)
VALUES %s AS new
ON DUPLICATE KEY UPDATE fleet_variable_id = new.fleet_variable_id
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@server/datastore/mysql/certificate_templates.go` around lines 369 - 373, The
SQL built in certificate templates insertion still uses deprecated VALUES()
inside the ON DUPLICATE KEY UPDATE clause. Update the statement in the
certificate template variable insert logic to use a row alias after the VALUES
list and reference that alias in the update assignment, keeping the behavior in
sync while avoiding VALUES() in the statement constructed by the code that
formats the INSERT for mdm_configuration_profile_variables.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@server/datastore/mysql/migrations/tables/20260624152755_AddAppConfigVariableTracking_test.go`:
- Around line 57-58: The CHECK constraint assertions in the migration test are
being masked by duplicate unique-key violations. Update the invalid insert
checks in the migration test around the mdm_configuration_profile_variables
inserts so they don’t reuse existing `(certificate_template_id,
fleet_variable_id)` and `(android_app_configuration_id, fleet_variable_id)`
pairs; instead, perform the exclusivity checks before the valid inserts, remove
the existing association first, or use a different fleet variable. Make the same
fix for both the certificate_template/windows_profile_uuid case and the
android_app_configuration case so the test specifically validates
`ck_mdm_configuration_profile_variables_exactly_one`.
- Around line 40-44: Scope the inserted-row lookups in the migration test so
they only resolve the record created by the test. The current `db.QueryRow`
lookups for `certTemplateID` (and the later similar lookup around the second
insert) rely on non-unique fields like `name`, which can bind to the wrong row;
update the test to use `LastInsertId()` from the insert result or add the full
entity scoping criteria such as `team_id`, `global_or_team_id`, and the relevant
CA/team identifiers. Keep the fix localized to the test helpers/queries in this
migration test so the identifiers retrieved always correspond to the inserted
rows.

In `@server/datastore/mysql/scim.go`:
- Around line 1420-1447: queueManagedConfigResendJobs is too broadly scoped
because it only filters affected Android app configs by variable name, which can
enqueue resend jobs for unrelated hosts and teams. Update the SCIM flow to pass
hostIDs into queueManagedConfigResendJobs, and tighten the lookup in
queueManagedConfigResendJobs/findAffectedApps so it only selects app configs
tied to the affected hosts’ team scope before creating jobs. Use the existing
queueManagedConfigResendJobs helper and the affected app/team joins to add the
host-specific filtering before job insertion.

---

Nitpick comments:
In `@server/datastore/mysql/certificate_templates.go`:
- Around line 327-383: `setCertTemplateVariableAssociations` currently performs
a delete followed by a separate insert, and `SetCertificateTemplateVariables`
calls it through `ds.writer(ctx)` without a transaction, so a failed insert can
leave `mdm_configuration_profile_variables` empty; make the replace atomic by
running the delete+insert together in one transaction. Update
`SetCertificateTemplateVariables` (or the helper it calls) to begin a
transaction, pass the transactional executor into
`setCertTemplateVariableAssociations`, and only commit after the insert succeeds
so the associations are never partially replaced.
- Around line 369-373: The SQL built in certificate templates insertion still
uses deprecated VALUES() inside the ON DUPLICATE KEY UPDATE clause. Update the
statement in the certificate template variable insert logic to use a row alias
after the VALUES list and reference that alias in the update assignment, keeping
the behavior in sync while avoiding VALUES() in the statement constructed by the
code that formats the INSERT for mdm_configuration_profile_variables.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c4e0ad84-ea3e-4619-b4f7-b5d000964150

📥 Commits

Reviewing files that changed from the base of the PR and between 0358811 and 8b4d7ea.

📒 Files selected for processing (13)
  • changes/48042-resend-managed-config-on-var-change
  • server/datastore/mysql/android.go
  • server/datastore/mysql/certificate_templates.go
  • server/datastore/mysql/migrations/tables/20260624152755_AddAppConfigVariableTracking.go
  • server/datastore/mysql/migrations/tables/20260624152755_AddAppConfigVariableTracking_test.go
  • server/datastore/mysql/schema.sql
  • server/datastore/mysql/scim.go
  • server/datastore/mysql/scim_test.go
  • server/fleet/datastore.go
  • server/mock/datastore_mock.go
  • server/service/certificate_templates.go
  • server/service/certificate_templates_test.go
  • server/service/certificates.go

Comment thread server/datastore/mysql/scim.go Outdated

@JordanMontgomery JordanMontgomery left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My only real concern is whether or not it's possible the current resend is too broad for the app - like do we need to check label applicability since this could potentially "widen" the applicability of an app sinec it queues that make available job. It's possible I'm off base there so happy to be convinced I am wrong. Otherwise this looks good to me and matches what we've been doing for this sort of thing elsewhere

ON mcpv.android_app_configuration_id = aac.id
JOIN fleet_variables fv
ON mcpv.fleet_variable_id = fv.id
JOIN vpp_apps_teams vat

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to validate that the app is applicable to the given hosts here by chance(e.g. with label settings)? Or am I missing something(not familiar with this feature so possible)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Valid concern. But the makeAndroidAppAvailable calls GetIncludedHostUUIDMapForAppStoreApp. this resolves the in-scope hosts including label filtering. Adding label filtering to the query would duplicate that logic (joining vpp_app_host_label_conditions etc.) for not much safety gain. If someone decides to call this outside of makeAndroidAppAvailable, worst case we queue a job that resolves to zero in-scope hosts and no-ops.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That makes sense. The model is a little different for other things that apply or don't apply based on scoping so it wasn't clear to me how this works. In that light, this lgtm

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: test-go (vuln, mysql:8.0.44) / test

Failed stage: Run Go Tests [❌]

Failed test name: TestTranslateCPEToCVE

Failure summary:

The action failed because the Go test package github.com/fleetdm/fleet/v4/server/vulnerabilities/nvd
failed.
- The specific failing test is TestTranslateCPEToCVE (see nettest.go:84).
- The test
attempts to download an NVD CVE feed asset from GitHub Releases but receives an HTTP 404 Not Found:

https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta

- After repeated retries, the package ultimately fails (FAIL .../server/vulnerabilities/nvd
1200.185s), indicating the external dependency (expected release/asset) was missing or the
URL/version tag was incorrect/unavailable at test time.

Relevant error logs:
1:  Runner name: 'ubuntu-8core-1000948221'
2:  Runner group name: 'default larger runners'
...

1305:  �[36;1mattempt=1�[0m
1306:  �[36;1m�[0m
1307:  �[36;1mwhile [ $attempt -le $max_attempts ]; do�[0m
1308:  �[36;1m  echo "Attempt $attempt of $max_attempts"�[0m
1309:  �[36;1m�[0m
1310:  �[36;1m  # Try to connect to MySQL�[0m
1311:  �[36;1m  if wait_for_mysql "mysql_test"; then�[0m
1312:  �[36;1m    # If MySQL is ready, try to connect to MySQL replica�[0m
1313:  �[36;1m    if wait_for_mysql "mysql_replica_test"; then�[0m
1314:  �[36;1m      # Both are ready, we're done�[0m
1315:  �[36;1m      echo "All MySQL connections successful"�[0m
1316:  �[36;1m      exit 0�[0m
1317:  �[36;1m    fi�[0m
1318:  �[36;1m  fi�[0m
1319:  �[36;1m�[0m
1320:  �[36;1m  # If we get here, at least one connection failed�[0m
1321:  �[36;1m  echo "Failed to connect to MySQL on attempt $attempt"�[0m
1322:  �[36;1m�[0m
1323:  �[36;1m  if [ $attempt -lt $max_attempts ]; then�[0m
1324:  �[36;1m    echo "Restarting containers and trying again..."�[0m
1325:  �[36;1m    restart_containers�[0m
1326:  �[36;1m  else�[0m
1327:  �[36;1m    echo "Maximum attempts reached. Failing the job."�[0m
1328:  �[36;1m    exit 1�[0m
...

1454:  �[32m✓�[0m Is server core (0.00s)
1455:  �[32m✓�[0m Matches (0.00s)
1456:  �[32m✓�[0m Matches from differect arch (0.00s)
1457:  �[32m✓�[0m Matches from differect products (0.00s)
1458:  �[32m✓�[0m Matches operating system (0.00s)
1459:  �[32m✓�[0m Matches same product but for different architecture (0.00s)
1460:  �[32m✓�[0m Matches same product one with no architecture (0.00s)
1461:  �[32m✓�[0m Matches same product same arch (0.00s)
1462:  �[32m✓�[0m New product from OS (0.00s)
1463:  �[32m✓�[0m Product has display version (0.00s)
1464:  �[32m✓�[0m Security bulletin (0.00s)
1465:  �[32m✓�[0m Security bulletin # merge (0.00s)
1466:  �[32m✓�[0m Security bulletin # merge . products (0.00s)
1467:  �[32m✓�[0m Security bulletin # merge . vendor fixes (0.00s)
1468:  �[32m✓�[0m Security bulletin # merge . vulnerabilities (0.00s)
1469:  �[32m✓�[0m Security bulletin # merge fails if product names don't match (0.00s)
1470:  �[32m✓�[0m Security bulletin # merge with empty bulletins (0.00s)
1471:  �[32m✓�[0m Security bulletin # unmarshal JSON (0.00s)
1472:  �[32m✓�[0m Security bulletin # unmarshal JSON accepts new vulnerabilities key (0.00s)
1473:  �[32m✓�[0m Security bulletin # unmarshal JSON accepts old misspelled vulnerabities key (0.00s)
1474:  �[32m✓�[0m Security bulletin # unmarshal JSON marshal uses correct spelling (0.00s)
1475:  github.com/fleetdm/fleet/v4/server/vulnerabilities/goval_dictionary:
1476:  �[32m✓�[0m Database (0.00s)
1477:  �[32m✓�[0m Database close releases file handle (0.06s)
1478:  �[32m✓�[0m Database fixed version (0.00s)
1479:  �[32m✓�[0m Database multiple packages, fixed version (0.00s)
1480:  �[32m✓�[0m Database multiple packages, multiple vulnerabilities (0.00s)
1481:  �[32m✓�[0m Database newer than fixed version (0.00s)
1482:  �[32m✓�[0m Database non-matching architecture (0.00s)
1483:  �[32m✓�[0m Database non-matching package name (0.00s)
1484:  �[32m✓�[0m Database older than fixed version (0.00s)
1485:  �[32m✓�[0m Database verify returns no errors (0.00s)
1486:  �[32m✓�[0m Sync (0.00s)
1487:  �[32m✓�[0m Sync #what to download (0.00s)
1488:  �[32m✓�[0m Verify (0.00s)
1489:  �[32m✓�[0m Verify verify alerts of error (0.00s)
1490:  github.com/fleetdm/fleet/v4/server/vulnerabilities/msrc:
...

1521:  �[32m✓�[0m Parser (0.29s)
1522:  �[32m✓�[0m Parser map to security bulletins (0.00s)
1523:  �[32m✓�[0m Parser map to security bulletins each bulletin should have the right products (0.00s)
1524:  �[32m✓�[0m Parser map to security bulletins each bulletin should have the right vulnerabilities (0.00s)
1525:  �[32m✓�[0m Parser map to security bulletins should have one bulletin per product (0.00s)
1526:  �[32m✓�[0m Parser map to security bulletins should map the vendor fixes entries correctly (0.00s)
1527:  �[32m✓�[0m Parser map to security bulletins should map the vulnerability entries correctly (0.00s)
1528:  �[32m✓�[0m Parser parse XML (0.10s)
1529:  �[32m✓�[0m Parser parse XML only CVEs for windows products are included (0.00s)
1530:  �[32m✓�[0m Parser parse XML only windows products are included (0.00s)
1531:  �[32m✓�[0m Parser parse XML scores are parsed correctly (0.00s)
1532:  �[32m✓�[0m Parser parse XML should include windows server 2025 from 202 6- feb feed (0.10s)
1533:  �[32m✓�[0m Parser parse XML the remediations are parsed correctly (0.00s)
1534:  �[32m✓�[0m Parser parse XML the revision history is parsed correctly (0.00s)
1535:  �[32m✓�[0m Parser parse feed (0.00s)
1536:  �[32m✓�[0m Parser parse feed errors out if file does not exists (0.00s)
1537:  �[32m✓�[0m Sync (0.00s)
...

1655:  �[32m✓�[0m Unbind fmt string cpe: 2. 3 :a:microsoft:internet exp?????: 8 . *:s p?:*:*:*:*:*:* (0.00s)
1656:  �[32m✓�[0m Unbind fmt string cpe: 2. 3 :a:microsoft:internet explorer: 8 . *:s p?:*:*:*:*:*:* (0.00s)
1657:  �[32m✓�[0m Unbind fmt string cpe: 2. 3 :a:microsoft:internet explorer: 8. 0.600 1 :beta:*:*:*:*:*:* (0.00s)
1658:  �[32m✓�[0m WF nize (0.00s)
1659:  github.com/fleetdm/fleet/v4/server/vulnerabilities/oval/input:
1660:  github.com/fleetdm/fleet/v4/server/vulnerabilities/oval/parsed:
1661:  �[32m✓�[0m Dpkg info test eval no host list (0.00s)
1662:  �[32m✓�[0m Dpkg info test eval no host list # eval (0.00s)
1663:  �[32m✓�[0m Dpkg info test eval no host list # eval test matches n objects (0.00s)
1664:  �[32m✓�[0m Dpkg info test eval no host list # eval test matches n states (0.00s)
1665:  �[32m✓�[0m Dpkg info test eval no host list # eval with no packages (0.00s)
1666:  �[32m✓�[0m Eval (0.00s)
1667:  �[32m✓�[0m Eval alt pattern match (0.00s)
1668:  �[32m✓�[0m Eval equal (0.00s)
1669:  �[32m✓�[0m Eval greater than (0.00s)
1670:  �[32m✓�[0m Eval higher version fails pattern match (0.00s)
1671:  �[32m✓�[0m Eval kernel (0.00s)
1672:  �[32m✓�[0m Eval less than (0.00s)
1673:  �[32m✓�[0m Eval lower version fails pattern match (0.00s)
1674:  �[32m✓�[0m Eval suffix doesn't match (0.00s)
...

1686:  �[32m✓�[0m Object info state # eval OS version name (0.00s)
1687:  �[32m✓�[0m Object info state # eval OS version version (0.00s)
1688:  �[32m✓�[0m Object info state # eval software (0.00s)
1689:  �[32m✓�[0m Object info state # eval software arch (0.00s)
1690:  �[32m✓�[0m Object info state # eval software evr (0.00s)
1691:  �[32m✓�[0m Object info state # eval software name (0.00s)
1692:  �[32m✓�[0m Object info state # eval software release (0.00s)
1693:  �[32m✓�[0m Object info state # eval software signature key id (0.00s)
1694:  �[32m✓�[0m Object info state # eval software version (0.00s)
1695:  �[32m✓�[0m Object match type (0.00s)
1696:  �[32m✓�[0m Object match type # eval (0.00s)
1697:  �[32m✓�[0m Object match type new object match type (0.00s)
1698:  �[32m✓�[0m Object state evr string (0.00s)
1699:  �[32m✓�[0m Object state evr string # eval (0.00s)
1700:  �[32m✓�[0m Object state evr string # eval evaluates an evr string (0.00s)
1701:  �[32m✓�[0m Object state evr string # eval it errors out if operation can not be computed (0.00s)
1702:  �[32m✓�[0m Object state simple value (0.00s)
1703:  �[32m✓�[0m Object state simple value # eval (0.00s)
1704:  �[32m✓�[0m Object state simple value # eval compares simple data types (0.00s)
1705:  �[32m✓�[0m Object state simple value # eval compares simple data types booleans (0.00s)
1706:  �[32m✓�[0m Object state simple value # eval compares simple data types floats (0.00s)
1707:  �[32m✓�[0m Object state simple value # eval compares simple data types ints (0.00s)
1708:  �[32m✓�[0m Object state simple value # eval compares simple data types strings (0.00s)
1709:  �[32m✓�[0m Object state simple value # eval it errors out if complex type used (0.00s)
1710:  �[32m✓�[0m Object state simple value #unpack (0.00s)
1711:  �[32m✓�[0m Object state simple value new object state simple value (0.00s)
1712:  �[32m✓�[0m Object state string (0.00s)
1713:  �[32m✓�[0m Object state string # eval (0.00s)
1714:  �[32m✓�[0m Object state string # eval it errors out if operation can not be computed (0.00s)
1715:  �[32m✓�[0m Object state string # eval it errors out if regexp can not be parsed (0.00s)
1716:  �[32m✓�[0m Object state string # eval it evaluates string values (0.00s)
...

1752:  �[32m✓�[0m Extract ubuntu version future version 2 5.04 (0.00s)
1753:  �[32m✓�[0m Extract ubuntu version interim release 2 3.10 (0.00s)
1754:  �[32m✓�[0m Extract ubuntu version interim release 2 4.10 with patch (0.00s)
1755:  �[32m✓�[0m Extract ubuntu version invalid version - single digit (0.00s)
1756:  �[32m✓�[0m Extract ubuntu version ubuntu 1 6.04 with extra spaces (0.00s)
1757:  �[32m✓�[0m Extract ubuntu version ubuntu 1 8.04 (0.00s)
1758:  �[32m✓�[0m Extract ubuntu version ubuntu 2 0.04 LTS (0.00s)
1759:  �[32m✓�[0m Extract ubuntu version ubuntu 2 2.04 LTS (0.00s)
1760:  �[32m✓�[0m Extract ubuntu version ubuntu 2 4.04 no LTS suffix (0.00s)
1761:  �[32m✓�[0m Extract ubuntu version version with codename suffix (0.00s)
1762:  �[32m✓�[0m Extract ubuntu version very old version 1 4.04 (0.00s)
1763:  �[32m✓�[0m Find latest OSV artifact for version (0.00s)
1764:  �[32m✓�[0m Find latest OSV artifact for version finds latest 1 8.04 artifact (0.00s)
1765:  �[32m✓�[0m Find latest OSV artifact for version finds latest 2 0.04 artifact (0.00s)
1766:  �[32m✓�[0m Find latest OSV artifact for version finds latest 2 2.04 artifact (0.00s)
1767:  �[32m✓�[0m Find latest OSV artifact for version returns error for non-existent version (0.00s)
1768:  �[32m✓�[0m Get needed RHEL versions (0.00s)
...

1840:  �[32m✓�[0m Normalize kernel version generic 6 4k kernel (0.00s)
1841:  �[32m✓�[0m Normalize kernel version generic kernel (0.00s)
1842:  �[32m✓�[0m Normalize kernel version kernel with only one part (0.00s)
1843:  �[32m✓�[0m Normalize kernel version lowlatency kernel (0.00s)
1844:  �[32m✓�[0m OSV filename (0.00s)
1845:  �[32m✓�[0m OSV filename 1804 (0.00s)
1846:  �[32m✓�[0m OSV filename 2004 (0.00s)
1847:  �[32m✓�[0m OSV filename 2204 (0.00s)
1848:  �[32m✓�[0m RHELOSV filename (0.00s)
1849:  �[32m✓�[0m RHELOSV filename 10 (0.00s)
1850:  �[32m✓�[0m RHELOSV filename 8 (0.00s)
1851:  �[32m✓�[0m RHELOSV filename 9 (0.00s)
1852:  �[32m✓�[0m Release date from assets (0.00s)
1853:  �[32m✓�[0m Remove old OSV artifacts (0.00s)
1854:  �[32m✓�[0m Remove old OSV artifacts date boundary race (0.00s)
1855:  �[32m✓�[0m Remove old OSV artifacts preserves failed versions (0.00s)
1856:  �[32m✓�[0m Remove old OSV artifacts with skipped versions (0.00s)
1857:  �[32m✓�[0m Remove old RHELOSV artifacts (0.00s)
1858:  �[32m✓�[0m Sync OSV checksum match (0.00s)
1859:  �[32m✓�[0m Sync OSV fault tolerance (0.00s)
1860:  �[32m✓�[0m Sync OSV partial failure not returned as error (0.00s)
1861:  �[32m✓�[0m Version from asset name (0.00s)
...

1908:  �[32m✓�[0m CVE use existing sync cve-1. 2 .xml.gz (0.01s)
1909:  �[32m✓�[0m CVE use existing sync cve-1. 2 .xml.zip (0.01s)
1910:  �[32m✓�[0m CVE use existing sync cve-2. 0 .xml.gz (0.01s)
1911:  �[32m✓�[0m CVE use existing sync cve-2. 0 .xml.zip (0.01s)
1912:  �[33m∅�[0m End to end (0.00s)
1913:  �[32m✓�[0m Response not OK (0.00s)
1914:  github.com/fleetdm/fleet/v4/server/vulnerabilities/macoffice:
1915:  �[32m✓�[0m Analyzer (0.00s)
1916:  �[32m✓�[0m Analyzer analyze (0.00s)
1917:  �[32m✓�[0m Analyzer analyze when no release notes on path (0.00s)
1918:  �[32m✓�[0m Analyzer analyze when release notes contain no valid security updates (0.00s)
1919:  �[32m✓�[0m Analyzer analyze when using wrong path (0.00s)
1920:  �[32m✓�[0m Analyzer collect vulnerabilities (0.00s)
1921:  �[32m✓�[0m Analyzer collect vulnerabilities no release notes (0.00s)
1922:  �[32m✓�[0m Analyzer get stored vulnerabilities (0.00s)
1923:  �[32m✓�[0m Analyzer get stored vulnerabilities on error (0.00s)
1924:  �[32m✓�[0m Analyzer latest release notes (0.00s)
1925:  �[32m✓�[0m Analyzer latest release notes returns release notes in order (0.00s)
1926:  �[32m✓�[0m Analyzer latest release notes when the JSON file is invalid (0.00s)
1927:  �[32m✓�[0m Analyzer latest release notes when vuln path does not exists (0.00s)
1928:  �[32m✓�[0m Analyzer latest release notes when vuln path exists (0.00s)
1929:  �[32m✓�[0m Analyzer update vulns in DB (0.00s)
1930:  �[32m✓�[0m Analyzer update vulns in DB on error when deleting vulns (0.00s)
1931:  �[32m✓�[0m Analyzer update vulns in DB on error when inserting vulns (0.00s)
1932:  �[32m✓�[0m Build number (0.00s)
...

1938:  �[32m✓�[0m Integrations parse release HTML (0.27s)
1939:  �[32m✓�[0m Integrations parse release HTML should parse dates (0.00s)
1940:  �[32m✓�[0m Integrations parse release HTML should parse release versions (0.00s)
1941:  �[32m✓�[0m Integrations parse release HTML should parse security updates (0.01s)
1942:  �[32m✓�[0m Integrations sync (1.07s)
1943:  �[32m✓�[0m Release note (0.00s)
1944:  �[32m✓�[0m Release note # cmp version (0.00s)
1945:  �[32m✓�[0m Release note # cmp version when release version is newer than (0.00s)
1946:  �[32m✓�[0m Release note # cmp version when release version is older than (0.00s)
1947:  �[32m✓�[0m Release note # cmp version when the same (0.00s)
1948:  �[32m✓�[0m Release note # collect vulnerabilities (0.00s)
1949:  �[32m✓�[0m Release note # office product from bundle id (0.00s)
1950:  �[32m✓�[0m Short version format (0.00s)
1951:  �[32m✓�[0m Sync (0.00s)
1952:  �[32m✓�[0m Sync #sync (0.00s)
1953:  �[32m✓�[0m Sync #sync on FS error (0.00s)
1954:  �[32m✓�[0m Sync #sync on GH error (0.00s)
1955:  �[32m✓�[0m Sync #sync on error when deleting (0.00s)
1956:  �[32m✓�[0m Sync #sync on error when downloading GH asset (0.00s)
1957:  �[32m✓�[0m Sync #sync removes multiple out of date copies (0.00s)
...

1960:  �[32m✓�[0m Sync #sync when nothing published on GH (0.00s)
1961:  �[32m✓�[0m Sync #sync when there are no local files (0.00s)
1962:  �[32m✓�[0m Sync #sync when there are no remote rel notes (0.00s)
1963:  github.com/fleetdm/fleet/v4/server/vulnerabilities/oval:
1964:  �[32m✓�[0m Oval analyzer (0.00s)
1965:  �[32m✓�[0m Oval analyzer #load (0.00s)
1966:  �[32m✓�[0m Oval analyzer #load invalid vuln path (0.00s)
1967:  �[32m✓�[0m Oval analyzer #load rejects empty definition file (0.00s)
1968:  �[32m✓�[0m Oval analyzer analyzing RHEL software (11.48s)
1969:  �[32m✓�[0m Oval analyzer analyzing ubuntu software (7.33s)
1970:  �[32m✓�[0m Oval download definitions matching host info (0.00s)
1971:  �[32m✓�[0m Oval download definitions platform not found (0.00s)
1972:  �[32m✓�[0m Oval mapper (0.00s)
1973:  �[32m✓�[0m Oval mapper #extract id (0.00s)
1974:  �[32m✓�[0m Oval mapper #map criteria (0.00s)
1975:  �[32m✓�[0m Oval mapper #map criteria errors out if id can not be parsed on any criterion (0.00s)
1976:  �[32m✓�[0m Oval mapper #map criteria errors out if no criteriums or nested criterias (0.00s)
1977:  �[32m✓�[0m Oval mapper #map criteria maps criteriums (0.00s)
1978:  �[32m✓�[0m Oval mapper #map criteria maps nested criterias (0.00s)
1979:  �[32m✓�[0m Oval mapper #map definition (0.00s)
1980:  �[32m✓�[0m Oval mapper #map definition errors out if no vulnerabilities (0.00s)
1981:  �[32m✓�[0m Oval mapper #map dpkg info state (0.00s)
1982:  �[32m✓�[0m Oval mapper #map dpkg info state errors out if one of non-supported state information is provided (0.00s)
1983:  �[32m✓�[0m Oval mapper #map dpkg info test (0.00s)
1984:  �[32m✓�[0m Oval mapper #map dpkg info test errors out if id can not be parsed (0.00s)
1985:  �[32m✓�[0m Oval mapper #map dpkg info test maps a dpkg info test XML (0.00s)
1986:  �[32m✓�[0m Oval mapper #map package info test object (0.00s)
1987:  �[32m✓�[0m Oval mapper #map package info test object name defined in var ref (0.00s)
1988:  �[32m✓�[0m Oval mapper #map package info test object name defined inline (0.00s)
1989:  �[32m✓�[0m Oval mapper #map package info test object name not defined inline nor using a variable ref (0.00s)
1990:  �[32m✓�[0m Oval mapper #map rpm info state (0.00s)
1991:  �[32m✓�[0m Oval mapper #map rpm info state errors out if not supported state is provided (0.00s)
1992:  �[32m✓�[0m Oval mapper #map rpm info state maps a rpm info state XML (0.00s)
1993:  �[32m✓�[0m Oval mapper #map rpm info state maps the operator, if any (0.00s)
1994:  �[32m✓�[0m Oval mapper #map rpm info test (0.00s)
1995:  �[32m✓�[0m Oval mapper #map rpm info test errors out if id can not be parsed (0.00s)
1996:  �[32m✓�[0m Oval mapper #map rpm info test maps a rpm info test XML (0.00s)
1997:  �[32m✓�[0m Oval mapper #map rpm verify file object (0.00s)
1998:  �[32m✓�[0m Oval mapper #map rpm verify file object errors out if invalid children provided (0.00s)
1999:  �[32m✓�[0m Oval mapper #map rpm verify file object maps to a filepath (0.00s)
2000:  �[32m✓�[0m Oval mapper #map rpm verify file state (0.00s)
2001:  �[32m✓�[0m Oval mapper #map rpm verify file state errors out if not supported state is provided (0.00s)
2002:  �[32m✓�[0m Oval mapper #map rpm verify file state maps a rpm verify file state XML (0.00s)
...

2084:  �[32m✓�[0m Integration check version unknown version returns no vulnerabilities (0.00s)
2085:  �[32m✓�[0m Integration check version version not in bulletin returns empty (0.00s)
2086:  �[32m✓�[0m Parse office version (0.00s)
2087:  �[32m✓�[0m Parse office version invalid version - no prefix (0.00s)
2088:  �[32m✓�[0m Parse office version invalid version - too few parts (0.00s)
2089:  �[32m✓�[0m Parse office version invalid version - wrong prefix (0.00s)
2090:  �[32m✓�[0m Parse office version valid version (0.00s)
2091:  �[32m✓�[0m Parse security markdown (0.00s)
2092:  �[32m✓�[0m Parse security markdown keeps minimum build suffix for same version (0.00s)
2093:  �[32m✓�[0m Parse security markdown parses LTSC versions (0.00s)
2094:  �[32m✓�[0m Parse security markdown parses multiple releases (0.00s)
2095:  �[32m✓�[0m Parse security markdown parses single release with multiple versions (0.00s)
2096:  �[32m✓�[0m Parse security markdown skips releases without CVEs (0.00s)
2097:  �[32m✓�[0m Parse security markdown skips retail versions (0.00s)
2098:  �[32m✓�[0m Sync bulletin (0.00s)
2099:  �[32m✓�[0m Sync bulletin on FS error (0.00s)
2100:  �[32m✓�[0m Sync bulletin on GH error (0.00s)
2101:  �[32m✓�[0m Sync bulletin on error when deleting (0.00s)
2102:  �[32m✓�[0m Sync bulletin on error when downloading GH asset (0.00s)
2103:  �[32m✓�[0m Sync bulletin removes multiple out of date copies (0.00s)
...

2110:  �[32m✓�[0m FS client (0.00s)
2111:  �[32m✓�[0m FS client #MSRC bulletins (0.00s)
2112:  �[32m✓�[0m FS client #MSRC bulletins directory does not exists (0.00s)
2113:  �[32m✓�[0m FS client #MSRC bulletins returns a list of file matching the MSRC file prefix (0.00s)
2114:  �[32m✓�[0m FS client delete (0.00s)
2115:  �[32m✓�[0m FS client delete file does not exists (0.00s)
2116:  �[32m✓�[0m FS client mac office release notes (0.00s)
2117:  �[32m✓�[0m FS client mac office release notes directory does not exists (0.00s)
2118:  �[32m✓�[0m FS client mac office release notes returns a list of file matching the mac office file prefix (0.00s)
2119:  �[32m✓�[0m FS client mac office release notes when files contain the wrong date format (0.00s)
2120:  �[32m✓�[0m Integrations github client (289.58s)
2121:  �[32m✓�[0m Integrations github client # download (289.58s)
2122:  �[32m✓�[0m Integrations github client # download with invalid URL (289.58s)
2123:  �[32m✓�[0m Integrations github client #MSRC bulletins (0.00s)
2124:  �[32m✓�[0m Integrations github client mac office release notes (0.00s)
2125:  �[32m✓�[0m Integrations github client mac office release notes on error (0.00s)
2126:  �[32m✓�[0m Integrations github client mac office release notes with HTTP error code (0.00s)
2127:  �[32m✓�[0m Integrations github client mac office release notes with a single release note asset (0.00s)
...

2251:  �[32m✓�[0m Syncs CVE from URL (0.00s)
2252:  �[32m✓�[0m Translate (0.00s)
2253:  �[32m✓�[0m Translate match on bundle identifier (0.00s)
2254:  �[32m✓�[0m Translate match on name and source (0.00s)
2255:  �[32m✓�[0m Translate match with regex (0.00s)
2256:  �[32m✓�[0m Translate match with regex not matching (0.00s)
2257:  �[32m✓�[0m Translate no match (0.00s)
2258:  �[32m✓�[0m Translate software to CPE (0.02s)
2259:  �[32m✓�[0m Translate software to CPE ignore empty version (0.02s)
2260:  �[32m✓�[0m Variations (0.00s)
2261:  === �[33mSkipped�[0m
2262:  === �[33mSKIP�[0m: server/vulnerabilities/nvd/tools/providers/nvd TestEndToEnd (0.00s)
2263:  e2e_test.go:45: e2e tests not enabled
2264:  === �[33mSKIP�[0m: server/vulnerabilities/vulntest TestGenerateVulnFixtures (0.00s)
2265:  gen_fixture_test.go:123: set GENERATE_FIXTURES=1 to run this test
2266:  === �[31mFailed�[0m
2267:  === �[31mFAIL�[0m: server/vulnerabilities/nvd  (0.00s)
...

2481:  net/http.(*http2clientConnReadLoop).run(0x2350cf0c2fa8)
2482:  /opt/hostedtoolcache/go/1.26.4/x64/src/net/http/h2_bundle.go:9550 +0xca
2483:  net/http.(*http2ClientConn).readLoop(0x2350cf1461c0)
2484:  /opt/hostedtoolcache/go/1.26.4/x64/src/net/http/h2_bundle.go:9419 +0x52
2485:  created by net/http.(*http2Transport).newClientConn in goroutine 6366
2486:  /opt/hostedtoolcache/go/1.26.4/x64/src/net/http/h2_bundle.go:8171 +0xda5
2487:  goroutine 7868 [select]:
2488:  net/http.(*http2clientStream).writeRequest(0x2350cf078c00, 0x2350cf2c8500, 0x0)
2489:  /opt/hostedtoolcache/go/1.26.4/x64/src/net/http/h2_bundle.go:8857 +0xc88
2490:  net/http.(*http2clientStream).doRequest(0x2350cf078c00, 0x0?, 0x2350ddcb4938?)
2491:  /opt/hostedtoolcache/go/1.26.4/x64/src/net/http/h2_bundle.go:8718 +0x18
2492:  created by net/http.(*http2ClientConn).roundTrip in goroutine 216
2493:  /opt/hostedtoolcache/go/1.26.4/x64/src/net/http/h2_bundle.go:8624 +0x470
2494:  FAIL	github.com/fleetdm/fleet/v4/server/vulnerabilities/nvd	1200.185s
2495:  === �[31mFAIL�[0m: server/vulnerabilities/nvd TestTranslateCPEToCVE (unknown)
2496:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2497:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2498:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2499:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2500:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2501:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2502:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2503:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2504:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2505:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2506:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2507:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2508:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2509:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2510:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2511:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2512:  nettest.go:84: TestTranslateCPEToCVE: retrying error: download nvd cve feed: download nvd cve feed: 1 synchronisation error:
2513:  unexpected http response from "https://github.com/fleetdm/vulnerabilities/releases/download/cve-202606240129/nvdcve-1.1-2017.meta" ("404 Not Found"): "\n\n\n\n\n\n\n\n<!DOCTYPE html>\n<html\n  lang=\"en\"\n  \n  data-color-mode=\"auto\" data-light-theme=\"light\" data-dark-theme=\"dark\"\n  data-a11y-animated-images=\"system\" data-a11y-link-underlines=\"true\"\n  \n  >\n\n\n\n\n  <head>\n    <meta charset=\"utf-8\">\n  <link rel=\"dns-prefetch\" href=\"https://github.githubassets.com\">\n  <link rel=\"dns-prefetch\" href=\"https://avatars.githubusercontent.com\">\n  <link rel=\"dns-prefetch\" href=\"https://github-cloud.s3.amazonaws.com\">\n  <link rel=\"dns-prefetch\" href=\"https://user-images.githubusercontent.com/\">\n  <link rel=\"preconnect\" href=\"https://github.githubassets.com\" crossorigin>\n  <link rel=\"preconnect\" href=\"https://avatars.githubusercontent.com\">\n\n      <link crossorigin=\"anonymous\" rel=\"preload\" as=\"script\" href=\"https://github.githubassets.com/assets/global-banner-disable-7217e941c22f8801.js\" />\n\n  <link rel=\"preload\" href=\"https://github.githubassets.com/assets/MonaSansVF-wdth-wght-opsz-902d64c7ad02.woff2\" as=\"font\" type=\"font/woff2\" crossorigin>\n\n\n  <link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"light\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light-4fded0090af0ad58.css\" /><link data-color-theme=\"light_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_high_contrast-cf8e26bc17e62ebc.css\" /><link data-color-theme=\"light_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind-3a437477a570cc40.css\" /><link data-color-theme=\"light_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_colorblind_high_contrast-39b6c209db5491c9.css\" /><link data-color-theme=\"light_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia-3822234d6c03b00b.css\" /><link data-color-theme=\"light_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/light_tritanopia_high_contrast-33857254a8064bf7.css\" /><link data-color-theme=\"dark\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark-06381ff23d863842.css\" /><link data-color-theme=\"dark_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_high_contrast-9023e6605402defb.css\" /><link data-color-theme=\"dark_colorblind\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind-37023bf69d8e0e34.css\" /><link data-color-theme=\"dark_colorblind_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_colorblind_high_contrast-486bd43e01a2c0ec.css\" /><link data-color-theme=\"dark_tritanopia\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia-838ba2a5070c5b09.css\" /><link data-color-theme=\"dark_tritanopia_high_contrast\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_tritanopia_high_contrast-2aa7245dc545d61f.css\" /><link data-color-theme=\"dark_dimmed\" crossorigin=\"anonymous\" media=\"all\" rel=\"stylesheet\" data-href=\"https://github.githubassets.com/assets/dark_dimmed-29ef2eb185e7de1c.css\" /><link data-color-theme=\"dark_dimmed_high_contrast\" crossorigin=\"anonymo"
2514:  n...

@ksykulev ksykulev merged commit c226a3f into main Jun 25, 2026
42 of 45 checks passed
@ksykulev ksykulev deleted the 37406-android-on-var-change branch June 25, 2026 21:27
JordanMontgomery pushed a commit that referenced this pull request Jun 26, 2026
…nfigs (#48278)

**Related issue:** Resolves #36681, #48042

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [x] Changes file added for user-visible changes in `changes/`,
`orbit/changes/` or `ee/fleetd-chrome/changes`.
See [Changes
files](https://github.com/fleetdm/fleet/blob/main/docs/Contributing/guides/committing-changes.md#changes-files)
for more information.

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.

## Testing

- [x] Added/updated automated tests
- [ ] QA'd all new/changed functionality manually

## Database migrations

- [x] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [x] Confirmed that updating the timestamps is acceptable, and will not
cause unwanted side effects.
- [x] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Certificate templates and managed Android app configurations now keep
track of referenced variables.
* Variable changes can now trigger automatic re-sending of affected
profiles and app availability updates.
* **Bug Fixes**
* Resend behavior now refreshes certificate templates when related
variable values change.
* Android managed app configurations are re-queued when their variables
are updated.
* **Database**
* Added support for variable tracking on certificate templates and
Android app configurations.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Android certs: IDP var update

4 participants