Skip to content

Commit a319ca1

Browse files
authored
Merge pull request #214 from syalioune/feature/configurable_period_for_tasks
Make background tasks periodicity configurable
2 parents 01d87cd + bfc5c6a commit a319ca1

File tree

5 files changed

+241
-4
lines changed

5 files changed

+241
-4
lines changed

src/i18n/locales/en.json

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,16 @@
555555
"restore_default_template": "Restore default templates",
556556
"default_template_restored": "Default templates restored",
557557
"clone_template": "Clone Template",
558-
"template_cloned": "Template cloned"
558+
"template_cloned": "Template cloned",
559+
"task_scheduler": "Task scheduler",
560+
"task_scheduler_description": "Dependency Track task scheduler perform various background tasks at a fixed interval. You can modify the fixed interval for each task using the form below. Each interval is expressed in hours. A Dependency Track restart is needed to reschedule the tasks with the updated cadence.",
561+
"task_scheduler_ldap_sync": "LDAP sync",
562+
"task_scheduler_portfolio_metrics_update": "Portfolio metrics",
563+
"task_scheduler_vulnerability_metrics_update": "Vulnerability metrics",
564+
"task_scheduler_portfolio_vulnerability_analysis": "Portfolio vulnerability analysis",
565+
"task_scheduler_repository_metadata_fetch": "Repository metadata fetch",
566+
"task_scheduler_internal_component_identification": "Internal component identification",
567+
"task_scheduler_component_analysis_cache_clear": "Component analysis cache clear"
559568
},
560569
"condition": {
561570
"warning": "Warning",
@@ -617,7 +626,8 @@
617626
},
618627
"validation": {
619628
"required": "{_field_} is required",
620-
"confirmed": "{_field_} doesn't match"
629+
"confirmed": "{_field_} doesn't match",
630+
"min_value": "{_field_} value should be above {min}"
621631
},
622632
"404": {
623633
"heading": "Oops! This is awkward",

src/validation/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { extend, configure } from 'vee-validate'
2-
import { required, confirmed } from 'vee-validate/dist/rules'
2+
import { required, confirmed, min_value } from 'vee-validate/dist/rules'
33

44
import i18n from '../i18n'
55

@@ -10,3 +10,4 @@ configure({
1010

1111
extend('required', required);
1212
extend('confirmed', confirmed);
13+
extend('min_value', min_value);

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: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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|min_value:1"
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 BValidatedInputGroupFormInput from '../../../forms/BValidatedInputGroupFormInput'
123+
import configPropertyMixin from "../mixins/configPropertyMixin";
124+
125+
export default {
126+
mixins: [configPropertyMixin],
127+
props: {
128+
header: String
129+
},
130+
components: {
131+
BValidatedInputGroupFormInput
132+
},
133+
data() {
134+
return {
135+
ghsaMirror: {"value": "0", "description":""},
136+
nistMirror: {"value": "0", "description":""},
137+
vulndbMirror: {"value": "0", "description":""},
138+
osvMirror: {"value": "0", "description":""},
139+
portfolioMetricsUpdate: {"value": "0", "description":""},
140+
vulnerabilityMetricsUpdate: {"value": "0", "description":""},
141+
portfolioVulnerabilityAnalysis: {"value": "0", "description":""},
142+
analysisCacheClear: {"value": "0", "description":""},
143+
ldapSync: {"value": "0", "description":""},
144+
repositoryMetadataFetch: {"value": "0", "description":""},
145+
internalComponentIdentification: {"value": "0", "description":""}
146+
}
147+
},
148+
methods: {
149+
saveChanges: function() {
150+
this.updateConfigProperties([
151+
{groupName: 'task-scheduler', propertyName: 'ldap.sync.cadence', propertyValue: this.ldapSync.value},
152+
{groupName: 'task-scheduler', propertyName: 'ghsa.mirror.cadence', propertyValue: this.ghsaMirror.value},
153+
{groupName: 'task-scheduler', propertyName: 'osv.mirror.cadence', propertyValue: this.osvMirror.value},
154+
{groupName: 'task-scheduler', propertyName: 'nist.mirror.cadence', propertyValue: this.nistMirror.value},
155+
{groupName: 'task-scheduler', propertyName: 'vulndb.mirror.cadence', propertyValue: this.vulndbMirror.value},
156+
{groupName: 'task-scheduler', propertyName: 'portfolio.metrics.update.cadence', propertyValue: this.portfolioMetricsUpdate.value},
157+
{groupName: 'task-scheduler', propertyName: 'vulnerability.metrics.update.cadence', propertyValue: this.vulnerabilityMetricsUpdate.value},
158+
{groupName: 'task-scheduler', propertyName: 'portfolio.vulnerability.analysis.cadence', propertyValue: this.portfolioVulnerabilityAnalysis.value},
159+
{groupName: 'task-scheduler', propertyName: 'repository.metadata.fetch.cadence', propertyValue: this.repositoryMetadataFetch.value},
160+
{groupName: 'task-scheduler', propertyName: 'internal.components.identification.cadence', propertyValue: this.internalComponentIdentification.value},
161+
{groupName: 'task-scheduler', propertyName: 'component.analysis.cache.clear.cadence', propertyValue: this.analysisCacheClear.value},
162+
]);
163+
}
164+
},
165+
created () {
166+
this.axios.get(this.configUrl).then((response) => {
167+
let configItems = response.data.filter(function (item) { return item.groupName === "task-scheduler" });
168+
for (let i=0; i<configItems.length; i++) {
169+
let item = configItems[i];
170+
switch (item.propertyName) {
171+
case "ldap.sync.cadence":
172+
this.ldapSync.value = item.propertyValue;
173+
this.ldapSync.description = item.description;
174+
break;
175+
case "ghsa.mirror.cadence":
176+
this.ghsaMirror.value = item.propertyValue;
177+
this.ghsaMirror.description = item.description;
178+
break;
179+
case "osv.mirror.cadence":
180+
this.osvMirror.value = item.propertyValue;
181+
this.osvMirror.description = item.description;
182+
break;
183+
case "nist.mirror.cadence":
184+
this.nistMirror.value = item.propertyValue;
185+
this.nistMirror.description = item.description;
186+
break;
187+
case "vulndb.mirror.cadence":
188+
this.vulndbMirror.value = item.propertyValue;
189+
this.vulndbMirror.description = item.description;
190+
break;
191+
case "portfolio.metrics.update.cadence":
192+
this.portfolioMetricsUpdate.value = item.propertyValue;
193+
this.portfolioMetricsUpdate.description = item.description;
194+
break;
195+
case "vulnerability.metrics.update.cadence":
196+
this.vulnerabilityMetricsUpdate.value = item.propertyValue;
197+
this.vulnerabilityMetricsUpdate.description = item.description;
198+
break;
199+
case "portfolio.vulnerability.analysis.cadence":
200+
this.portfolioVulnerabilityAnalysis.value = item.propertyValue;
201+
this.portfolioVulnerabilityAnalysis.description = item.description;
202+
break;
203+
case "repository.metadata.fetch.cadence":
204+
this.repositoryMetadataFetch.value = item.propertyValue;
205+
this.repositoryMetadataFetch.description = item.description;
206+
break;
207+
case "internal.components.identification.cadence":
208+
this.internalComponentIdentification.value = item.propertyValue;
209+
this.internalComponentIdentification.description = item.description;
210+
break;
211+
case "component.analysis.cache.clear.cadence":
212+
this.analysisCacheClear.value = item.propertyValue;
213+
this.analysisCacheClear.description = item.description;
214+
break;
215+
}
216+
}
217+
});
218+
}
219+
}
220+
</script>

0 commit comments

Comments
 (0)