Skip to content

Commit 080ce80

Browse files
committed
Make background tasks periodicity configurable
Enhancement request described in #1542. Signed-off-by: Alioune SY <[email protected]>
1 parent b2fb1dc commit 080ce80

File tree

4 files changed

+239
-2
lines changed

4 files changed

+239
-2
lines changed

src/i18n/locales/en.json

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,16 @@
553553
"restore_default_template": "Restore default templates",
554554
"default_template_restored": "Default templates restored",
555555
"clone_template": "Clone Template",
556-
"template_cloned": "Template cloned"
556+
"template_cloned": "Template cloned",
557+
"task_scheduler": "Task scheduler",
558+
"task_scheduler_description": "Dependency Track task scheduler perform various background scans at a fixed interval. You can modify the fixed interval for each scans using the form below. A Dependency Track restart is needed to reschedule the tasks with the updated interval.",
559+
"task_scheduler_ldap_sync": "LDAP sync",
560+
"task_scheduler_portfolio_metrics_update": "Portfolio metrics",
561+
"task_scheduler_vulnerability_metrics_update": "Vulnerability metrics",
562+
"task_scheduler_portfolio_vulnerability_analysis": "Portfolio vulnerability analysis",
563+
"task_scheduler_repository_metadata_fetch": "Repository metadata fetch",
564+
"task_scheduler_internal_component_identification": "Internal component identification",
565+
"task_scheduler_component_analysis_cache_clear": "Component analysis cache clear"
557566
},
558567
"condition": {
559568
"warning": "Warning",

src/views/administration/AdminMenu.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@
5858
component: 'InternalComponents',
5959
name: this.$t('admin.internal_components'),
6060
href: "#internalComponentsTab"
61+
},
62+
{
63+
component: 'TaskScheduler',
64+
name: this.$t('admin.task_scheduler'),
65+
href: "#taskSchedulerTab"
6166
}
6267
]
6368
},

src/views/administration/Administration.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import BomFormats from "./configuration/BomFormats";
2424
import Email from "./configuration/Email";
2525
import InternalComponents from "./configuration/InternalComponents";
26+
import TaskScheduler from "./configuration/TaskScheduler.vue";
2627
// Analyzer plugins
2728
import InternalAnalyzer from "./analyzers/InternalAnalyzer";
2829
import OssIndexAnalyzer from "./analyzers/OssIndexAnalyzer";
@@ -61,7 +62,7 @@
6162
components: {
6263
EventBus,
6364
AdminMenu,
64-
General, BomFormats, Email, InternalComponents,
65+
General, BomFormats, Email, InternalComponents, TaskScheduler,
6566
InternalAnalyzer, OssIndexAnalyzer, VulnDbAnalyzer,
6667
VulnSourceNvd, VulnSourceGitHubAdvisories, VulnSourceOSVAdvisories,
6768
Cargo, Composer, Gem, GoModules, Hex, Maven, Npm, Nuget, Python,
Lines changed: 222 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,222 @@
1+
<template>
2+
<b-card no-body :header="header">
3+
<b-card-body>
4+
<p>{{ $t('admin.task_scheduler_description') }}</p>
5+
<br/>
6+
<h4>Components</h4>
7+
<b-validated-input-group-form-input
8+
id="repository_metadata_fetch"
9+
:label="$t('admin.task_scheduler_repository_metadata_fetch')"
10+
input-group-size="mb-3"
11+
rules="required"
12+
type="number"
13+
v-model="repositoryMetadataFetch.value"
14+
:tooltip="repositoryMetadataFetch.description"
15+
/>
16+
<b-validated-input-group-form-input
17+
id="internal_component_identification"
18+
:label="$t('admin.task_scheduler_internal_component_identification')"
19+
input-group-size="mb-3"
20+
rules="required"
21+
type="number"
22+
v-model="internalComponentIdentification.value"
23+
:tooltip="internalComponentIdentification.description"
24+
/>
25+
<br/>
26+
<h4>Vulnerability databases synchronization</h4>
27+
<b-validated-input-group-form-input
28+
id="ghsa_mirror"
29+
:label="$t('admin.github_advisories')"
30+
input-group-size="mb-3"
31+
rules="required"
32+
type="number"
33+
v-model="ghsaMirror.value"
34+
:tooltip="ghsaMirror.description"
35+
/>
36+
<b-validated-input-group-form-input
37+
id="nist_mirror"
38+
:label="$t('admin.nvd')"
39+
input-group-size="mb-3"
40+
rules="required"
41+
type="number"
42+
v-model="nistMirror.value"
43+
:tooltip="nistMirror.description"
44+
/>
45+
<b-validated-input-group-form-input
46+
id="vulndb_mirror"
47+
:label="$t('admin.vulndb')"
48+
input-group-size="mb-3"
49+
rules="required"
50+
type="number"
51+
v-model="vulndbMirror.value"
52+
:tooltip="vulndbMirror.description"
53+
/>
54+
<b-validated-input-group-form-input
55+
id="osv_mirror"
56+
:label="$t('admin.osv_advisories')"
57+
input-group-size="mb-3"
58+
rules="required"
59+
type="number"
60+
v-model="osvMirror.value"
61+
:tooltip="osvMirror.description"
62+
/>
63+
<br/>
64+
<h4>Analysis</h4>
65+
<b-validated-input-group-form-input
66+
id="portfolio_vulnerability_analysis"
67+
:label="$t('admin.task_scheduler_portfolio_vulnerability_analysis')"
68+
input-group-size="mb-3"
69+
rules="required"
70+
type="number"
71+
v-model="portfolioVulnerabilityAnalysis.value"
72+
:tooltip="portfolioVulnerabilityAnalysis.description"
73+
/>
74+
<b-validated-input-group-form-input
75+
id="component_analysis_cache_clear"
76+
:label="$t('admin.task_scheduler_component_analysis_cache_clear')"
77+
input-group-size="mb-3"
78+
rules="required"
79+
type="number"
80+
v-model="analysisCacheClear.value"
81+
:tooltip="analysisCacheClear.description"
82+
/>
83+
<br/>
84+
<h4>Metrics update</h4>
85+
<b-validated-input-group-form-input
86+
id="portfolio_metrics_update"
87+
:label="$t('admin.task_scheduler_portfolio_metrics_update')"
88+
input-group-size="mb-3"
89+
rules="required"
90+
type="number"
91+
v-model="portfolioMetricsUpdate.value"
92+
:tooltip="portfolioMetricsUpdate.description"
93+
/>
94+
<b-validated-input-group-form-input
95+
id="vulnerability_metrics_update"
96+
:label="$t('admin.task_scheduler_vulnerability_metrics_update')"
97+
input-group-size="mb-3"
98+
rules="required"
99+
type="number"
100+
v-model="vulnerabilityMetricsUpdate.value"
101+
:tooltip="vulnerabilityMetricsUpdate.description"
102+
/>
103+
<br/>
104+
<h4>Authentication</h4>
105+
<b-validated-input-group-form-input
106+
id="ldap_sync"
107+
:label="$t('admin.task_scheduler_ldap_sync')"
108+
input-group-size="mb-3"
109+
rules="required"
110+
type="number"
111+
v-model="ldapSync.value"
112+
:tooltip="ldapSync.description"
113+
/>
114+
</b-card-body>
115+
<b-card-footer>
116+
<b-button variant="outline-primary" class="px-4" @click="saveChanges">{{ $t('message.update') }}</b-button>
117+
</b-card-footer>
118+
</b-card>
119+
</template>
120+
121+
<script>
122+
import { ValidationObserver } from 'vee-validate';
123+
import BValidatedInputGroupFormInput from '../../../forms/BValidatedInputGroupFormInput'
124+
import configPropertyMixin from "../mixins/configPropertyMixin";
125+
126+
export default {
127+
mixins: [configPropertyMixin],
128+
props: {
129+
header: String
130+
},
131+
components: {
132+
ValidationObserver,
133+
BValidatedInputGroupFormInput
134+
},
135+
data() {
136+
return {
137+
ghsaMirror: {"value": "0", "description":""},
138+
nistMirror: {"value": "0", "description":""},
139+
vulndbMirror: {"value": "0", "description":""},
140+
osvMirror: {"value": "0", "description":""},
141+
portfolioMetricsUpdate: {"value": "0", "description":""},
142+
vulnerabilityMetricsUpdate: {"value": "0", "description":""},
143+
portfolioVulnerabilityAnalysis: {"value": "0", "description":""},
144+
analysisCacheClear: {"value": "0", "description":""},
145+
ldapSync: {"value": "0", "description":""},
146+
repositoryMetadataFetch: {"value": "0", "description":""},
147+
internalComponentIdentification: {"value": "0", "description":""}
148+
}
149+
},
150+
methods: {
151+
saveChanges: function() {
152+
this.updateConfigProperties([
153+
{groupName: 'task-scheduler', propertyName: 'ldap.sync.period', propertyValue: this.ldapSync.value},
154+
{groupName: 'task-scheduler', propertyName: 'ghsa.mirror.period', propertyValue: this.ghsaMirror.value},
155+
{groupName: 'task-scheduler', propertyName: 'osv.mirror.period', propertyValue: this.osvMirror.value},
156+
{groupName: 'task-scheduler', propertyName: 'nist.mirror.period', propertyValue: this.nistMirror.value},
157+
{groupName: 'task-scheduler', propertyName: 'vulndb.mirror.period', propertyValue: this.vulndbMirror.value},
158+
{groupName: 'task-scheduler', propertyName: 'portfolio.metrics.update.period', propertyValue: this.portfolioMetricsUpdate.value},
159+
{groupName: 'task-scheduler', propertyName: 'vulnerability.metrics.update.period', propertyValue: this.vulnerabilityMetricsUpdate.value},
160+
{groupName: 'task-scheduler', propertyName: 'portfolio.vulnerability.analysis.period', propertyValue: this.portfolioVulnerabilityAnalysis.value},
161+
{groupName: 'task-scheduler', propertyName: 'repository.metadata.fetch.period', propertyValue: this.repositoryMetadataFetch.value},
162+
{groupName: 'task-scheduler', propertyName: 'internal.components.identification.period', propertyValue: this.internalComponentIdentification.value},
163+
{groupName: 'task-scheduler', propertyName: 'component.analysis.cache.clear.period', propertyValue: this.analysisCacheClear.value},
164+
]);
165+
}
166+
},
167+
created () {
168+
this.axios.get(this.configUrl).then((response) => {
169+
let configItems = response.data.filter(function (item) { return item.groupName === "task-scheduler" });
170+
for (let i=0; i<configItems.length; i++) {
171+
let item = configItems[i];
172+
switch (item.propertyName) {
173+
case "ldap.sync.period":
174+
this.ldapSync.value = item.propertyValue;
175+
this.ldapSync.description = item.description;
176+
break;
177+
case "ghsa.mirror.period":
178+
this.ghsaMirror.value = item.propertyValue;
179+
this.ghsaMirror.description = item.description;
180+
break;
181+
case "osv.mirror.period":
182+
this.osvMirror.value = item.propertyValue;
183+
this.osvMirror.description = item.description;
184+
break;
185+
case "nist.mirror.period":
186+
this.nistMirror.value = item.propertyValue;
187+
this.nistMirror.description = item.description;
188+
break;
189+
case "vulndb.mirror.period":
190+
this.vulndbMirror.value = item.propertyValue;
191+
this.vulndbMirror.description = item.description;
192+
break;
193+
case "portfolio.metrics.update.period":
194+
this.portfolioMetricsUpdate.value = item.propertyValue;
195+
this.portfolioMetricsUpdate.description = item.description;
196+
break;
197+
case "vulnerability.metrics.update.period":
198+
this.vulnerabilityMetricsUpdate.value = item.propertyValue;
199+
this.vulnerabilityMetricsUpdate.description = item.description;
200+
break;
201+
case "portfolio.vulnerability.analysis.period":
202+
this.portfolioVulnerabilityAnalysis.value = item.propertyValue;
203+
this.portfolioVulnerabilityAnalysis.description = item.description;
204+
break;
205+
case "repository.metadata.fetch.period":
206+
this.repositoryMetadataFetch.value = item.propertyValue;
207+
this.repositoryMetadataFetch.description = item.description;
208+
break;
209+
case "internal.components.identification.period":
210+
this.internalComponentIdentification.value = item.propertyValue;
211+
this.internalComponentIdentification.description = item.description;
212+
break;
213+
case "component.analysis.cache.clear.period":
214+
this.analysisCacheClear.value = item.propertyValue;
215+
this.analysisCacheClear.description = item.description;
216+
break;
217+
}
218+
}
219+
});
220+
}
221+
}
222+
</script>

0 commit comments

Comments
 (0)