update scan type for scan and stop sbom request

Signed-off-by: xuelichao <xuel@vmware.com>
This commit is contained in:
xuelichao 2024-04-02 09:51:48 +08:00 committed by stonezdj(Daojun Zhang)
parent 71d4aecc13
commit 2b2f4053d7
20 changed files with 188 additions and 119 deletions

View File

@ -4744,7 +4744,7 @@ paths:
summary: Get job log by job id
description: Get job log by job id, it is only used by administrator
produces:
- text/plain
- text/plain
tags:
- jobservice
parameters:
@ -4875,7 +4875,6 @@ paths:
'200':
description: Get scheduler status successfully.
schema:
type: object
$ref: '#/definitions/SchedulerStatus'
'401':
$ref: '#/responses/401'
@ -6097,7 +6096,7 @@ paths:
description: Specify whether the dangerous Artifact are included inside summary information
type: boolean
required: false
default: false
default: false
responses:
'200':
description: Success
@ -6116,15 +6115,15 @@ paths:
get:
summary: Get the vulnerability list.
description: |
Get the vulnerability list. use q to pass the query condition,
Get the vulnerability list. use q to pass the query condition,
supported conditions:
cve_id(exact match)
cvss_score_v3(range condition)
severity(exact match)
repository_name(exact match)
project_id(exact match)
repository_name(exact match)
project_id(exact match)
package(exact match)
tag(exact match)
tag(exact match)
digest(exact match)
tags:
- securityhub
@ -6776,10 +6775,6 @@ definitions:
type: object
description: 'The generate SBOM overview information'
properties:
report_id:
type: string
description: 'id of the native sbom report'
example: '5f62c830-f996-11e9-957f-0242c0a89008'
start_time:
type: string
format: date-time
@ -6805,8 +6800,6 @@ definitions:
format: int64
description: 'Time in seconds required to create the report'
example: 300
scanner:
$ref: '#/definitions/Scanner'
NativeReportSummary:
type: object
description: 'The summary for the native report'
@ -7228,6 +7221,10 @@ definitions:
type: string
description: 'Whether scan images automatically when pushing. The valid values are "true", "false".'
x-nullable: true
auto_sbom_generation:
type: string
description: 'Whether generating SBOM automatically when pushing a subject artifact. The valid values are "true", "false".'
x-nullable: true
reuse_sys_cve_allowlist:
type: string
description: 'Whether this project reuse the system level CVE allowlist as the allowlist of its own. The valid values are "true", "false".
@ -7720,8 +7717,9 @@ definitions:
description: The level of the robot, project or system
duration:
type: integer
x-nullable: true
format: int64
description: The duration of the robot in days
description: The duration of the robot in days, duration must be either -1(Never) or a positive integer
editable:
type: boolean
x-omitempty: false
@ -7768,7 +7766,7 @@ definitions:
duration:
type: integer
format: int64
description: The duration of the robot in days
description: The duration of the robot in days, duration must be either -1(Never) or a positive integer
permissions:
type: array
items:
@ -8058,7 +8056,7 @@ definitions:
type: string
description: |
The schedule type. The valid values are 'Hourly', 'Daily', 'Weekly', 'Custom', 'Manual', 'None' and 'Schedule'.
'Manual' means to trigger it right away, 'Schedule' means to trigger it by a specified cron schedule and
'Manual' means to trigger it right away, 'Schedule' means to trigger it by a specified cron schedule and
'None' means to cancel the schedule.
enum:
- Hourly
@ -9888,12 +9886,12 @@ definitions:
type: object
description: the dangerous CVE information
properties:
cve_id:
cve_id:
type: string
description: the cve id
severity:
type: string
description: the severity of the CVE
description: the severity of the CVE
cvss_score_v3:
type: number
format: float64
@ -9903,7 +9901,7 @@ definitions:
description: the description of the CVE
package:
type: string
description: the package of the CVE
description: the package of the CVE
version:
type: string
description: the version of the package
@ -9911,14 +9909,14 @@ definitions:
type: object
description: the dangerous artifact information
properties:
project_id:
project_id:
type: integer
format: int64
description: the project id of the artifact
repository_name:
type: string
description: the repository name of the artifact
digest:
digest:
type: string
description: the digest of the artifact
critical_cnt:
@ -9978,7 +9976,7 @@ definitions:
description: The description of the vulnerability
links:
type: array
items:
items:
type: string
description: Links of the vulnerability
ScanType:
@ -9987,4 +9985,4 @@ definitions:
scan_type:
type: string
description: 'The scan type for the scan request. Two options are currently supported, vulnerability and sbom'
enum: [ vulnerability, sbom ]
enum: [ vulnerability, sbom ]

View File

@ -281,4 +281,13 @@ describe('CreateEditRuleComponent (inline template)', () => {
expect(ruleNameInput).toBeTruthy();
expect(ruleNameInput.value.trim()).toEqual('sync_01');
}));
it('List all Registries Response', fakeAsync(() => {
fixture.detectChanges();
comp.ngOnInit();
comp.getAllRegistries();
fixture.whenStable();
tick(5000);
expect(comp.targetList.length).toBe(4);
}));
});

View File

@ -6,6 +6,7 @@ import {
USERSTATICPERMISSION,
} from '../../../../../shared/services';
import { ErrorHandler } from '../../../../../shared/units/error-handler';
import { Scanner } from '../../../../left-side-nav/interrogation-services/scanner/scanner';
@Injectable()
export class ArtifactListPageService {
@ -19,6 +20,7 @@ export class ArtifactListPageService {
private _hasDeleteImagePermission: boolean = false;
private _hasScanImagePermission: boolean = false;
private _hasSbomPermission: boolean = false;
private _scanner: Scanner = undefined;
constructor(
private scanningService: ScanningResultService,
@ -26,6 +28,10 @@ export class ArtifactListPageService {
private errorHandlerService: ErrorHandler
) {}
getProjectScanner(): Scanner {
return this._scanner;
}
getScanBtnState(): ClrLoadingState {
return this._scanBtnState;
}
@ -103,29 +109,28 @@ export class ArtifactListPageService {
this._sbomBtnState = ClrLoadingState.LOADING;
this.scanningService.getProjectScanner(projectId).subscribe(
response => {
if (
response &&
'{}' !== JSON.stringify(response) &&
!response.disabled &&
response.health === 'healthy'
) {
this.updateStates(
true,
ClrLoadingState.SUCCESS,
ClrLoadingState.SUCCESS
);
if (response?.capabilities) {
this.updateCapabilities(response?.capabilities);
if (response && '{}' !== JSON.stringify(response)) {
this._scanner = response;
if (!response.disabled && response.health === 'healthy') {
this.updateStates(
true,
ClrLoadingState.SUCCESS,
ClrLoadingState.SUCCESS
);
if (response?.capabilities) {
this.updateCapabilities(response?.capabilities);
}
} else {
this.updateStates(
false,
ClrLoadingState.ERROR,
ClrLoadingState.ERROR
);
}
} else {
this.updateStates(
false,
ClrLoadingState.ERROR,
ClrLoadingState.ERROR
);
}
},
error => {
this._scanner = null;
this.updateStates(
false,
ClrLoadingState.ERROR,

View File

@ -33,16 +33,6 @@
>&nbsp;
<span>{{ 'VULNERABILITY.SCAN_NOW' | translate }}</span>
</button>
<button
id="stop-scan"
[clrLoading]="stopBtnState"
type="button"
class="btn btn-secondary scan-btn"
[disabled]="!(canStopScan() && hasScanImagePermission)"
(click)="stopNow()">
<clr-icon shape="stop" size="16"></clr-icon>&nbsp;
<span>{{ 'VULNERABILITY.STOP_NOW' | translate }}</span>
</button>
<button
*ngIf="hasEnabledSbom()"
id="generate-sbom-btn"
@ -59,26 +49,10 @@
)
"
(click)="generateSbom()">
<clr-icon shape="file" size="16"></clr-icon>&nbsp;
<clr-icon shape="sbom" size="16"></clr-icon>&nbsp;
<span>{{ 'SBOM.GENERATE' | translate }}</span>
</button>
<button
id="stop-sbom-btn"
*ngIf="hasEnabledSbom()"
[clrLoading]="stopBtnState"
type="button"
class="btn btn-secondary scan-btn"
[disabled]="
!(
canStopSbom() &&
hasSbomPermission &&
hasEnabledScanner
)
"
(click)="stopSbom()">
<clr-icon shape="stop" size="16"></clr-icon>&nbsp;
<span>{{ 'SBOM.STOP' | translate }}</span>
</button>
<clr-dropdown class="btn btn-link" *ngIf="!depth">
<span
clrDropdownTrigger
@ -91,6 +65,45 @@
class="action-dropdown"
clrPosition="bottom-left"
*clrIfOpen>
<div
class="dropdown-divider"
role="separator"
aria-hidden="true"></div>
<button
clrDropdownItem
id="stop-scan"
[clrLoading]="stopBtnState"
type="button"
class="btn btn-secondary scan-btn action-dropdown-item"
[disabled]="
!(canStopScan() && hasScanImagePermission)
"
(click)="stopNow()">
<span>{{
'VULNERABILITY.STOP_NOW' | translate
}}</span>
</button>
<button
clrDropdownItem
id="stop-sbom-btn"
*ngIf="hasEnabledSbom()"
[clrLoading]="stopBtnState"
type="button"
class="btn btn-secondary scan-btn action-dropdown-item"
[disabled]="
!(
canStopSbom() &&
hasSbomPermission &&
hasEnabledScanner
)
"
(click)="stopSbom()">
<span>{{ 'SBOM.STOP' | translate }}</span>
</button>
<div
class="dropdown-divider"
role="separator"
aria-hidden="true"></div>
<div
id="artifact-list-copy-digest"
class="action-dropdown-item no-border"
@ -102,6 +115,10 @@
(click)="showDigestId()">
{{ 'REPOSITORY.COPY_DIGEST_ID' | translate }}
</div>
<div
class="dropdown-divider"
role="separator"
aria-hidden="true"></div>
<clr-dropdown>
<button
id="artifact-list-add-labels"
@ -115,6 +132,10 @@
">
{{ 'REPOSITORY.ADD_LABELS' | translate }}
</button>
<div
class="dropdown-divider"
role="separator"
aria-hidden="true"></div>
<clr-dropdown-menu
[hidden]="!selectedRow.length">
<div class="filter-grid">
@ -441,7 +462,7 @@
(submitStopFinish)="submitSbomStopFinish($event)"
(scanFinished)="sbomFinished($event)"
*ngIf="hasScannerSupportSBOM"
[inputScanner]="artifact?.sbom_overview?.scanner"
[inputScanner]="projectScanner"
(submitFinish)="submitSbomFinish($event)"
[projectName]="projectName"
[projectId]="projectId"

View File

@ -27,11 +27,17 @@ import { ArtifactModule } from '../../../artifact.module';
import {
SBOM_SCAN_STATUS,
VULNERABILITY_SCAN_STATUS,
} from 'src/app/shared/units/utils';
} from '../../../../../../../shared/units/utils';
import { Scanner } from '../../../../../../left-side-nav/interrogation-services/scanner/scanner';
describe('ArtifactListTabComponent', () => {
let comp: ArtifactListTabComponent;
let fixture: ComponentFixture<ArtifactListTabComponent>;
const mockScanner = {
name: 'Trivy',
vendor: 'vm',
version: 'v1.2',
};
const mockActivatedRoute = {
snapshot: {
params: {
@ -274,6 +280,9 @@ describe('ArtifactListTabComponent', () => {
hasScanImagePermission(): boolean {
return true;
},
getProjectScanner(): Scanner {
return mockScanner;
},
init() {},
};
beforeEach(async () => {
@ -384,7 +393,7 @@ describe('ArtifactListTabComponent', () => {
fixture.nativeElement.querySelector('#generate-sbom-btn');
fixture.detectChanges();
await fixture.whenStable();
expect(generatedButton.disabled).toBeTruthy();
expect(generatedButton.disabled).toBeFalsy();
});
it('Stop SBOM button should be disabled', async () => {
await fixture.whenStable();

View File

@ -84,6 +84,7 @@ import { Accessory } from 'ng-swagger-gen/models/accessory';
import { Tag } from '../../../../../../../../../ng-swagger-gen/models/tag';
import { CopyArtifactComponent } from './copy-artifact/copy-artifact.component';
import { CopyDigestComponent } from './copy-digest/copy-digest.component';
import { Scanner } from '../../../../../../left-side-nav/interrogation-services/scanner/scanner';
export const AVAILABLE_TIME = '0001-01-01T00:00:00.000Z';
@ -160,6 +161,10 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
get generateSbomBtnState(): ClrLoadingState {
return this.artifactListPageService.getSbomBtnState();
}
get projectScanner(): Scanner {
return this.artifactListPageService.getProjectScanner();
}
onSendingScanCommand: boolean;
onSendingStopScanCommand: boolean = false;
onStopScanArtifactsLength: number = 0;
@ -269,6 +274,9 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
}
);
}
if (this.projectId) {
this.artifactListPageService.init(this.projectId);
}
}
ngOnDestroy() {
@ -987,11 +995,6 @@ export class ArtifactListTabComponent implements OnInit, OnDestroy {
this.scanFinished(artifact);
}
// when finished, remove it from selectedRow
sbomFinished(artifact: Artifact) {
this.scanFinished(artifact);
}
getIconsFromBackEnd() {
if (this.artifactList && this.artifactList.length) {
this.artifactService.getIconsFromBackEnd(this.artifactList);

View File

@ -20,23 +20,18 @@ describe('ResultSbomComponent (inline template)', () => {
};
const mockedSbomDigest =
'sha256:052240e8190b7057439d2bee1dffb9b37c8800e5c1af349f667635ae1debf8f3';
const mockScanner = {
name: 'Trivy',
vendor: 'vm',
version: 'v1.2',
};
const mockedSbomOverview = {
report_id: '12345',
scan_status: 'Error',
scanner: {
name: 'Trivy',
vendor: 'vm',
version: 'v1.2',
},
};
const mockedCloneSbomOverview = {
report_id: '12346',
scan_status: 'Pending',
scanner: {
name: 'Trivy',
vendor: 'vm',
version: 'v1.2',
},
};
const FakedScanService = {
scanArtifact: () => of({}),
@ -119,6 +114,7 @@ describe('ResultSbomComponent (inline template)', () => {
fixture = TestBed.createComponent(ResultSbomComponent);
component = fixture.componentInstance;
component.repoName = 'mockRepo';
component.inputScanner = mockScanner;
component.artifactDigest = mockedSbomDigest;
component.sbomDigest = mockedSbomDigest;
component.sbomOverview = mockData;
@ -179,9 +175,11 @@ describe('ResultSbomComponent (inline template)', () => {
});
it('Test ResultSbomComponent getScanner', () => {
fixture.detectChanges();
component.inputScanner = undefined;
expect(component.getScanner()).toBeUndefined();
component.inputScanner = mockScanner;
component.sbomOverview = mockedSbomOverview;
expect(component.getScanner()).toBe(mockedSbomOverview.scanner);
expect(component.getScanner()).toBe(mockScanner);
component.projectName = 'test';
component.repoName = 'ui';
component.artifactDigest = 'dg';
@ -238,7 +236,9 @@ describe('ResultSbomComponent (inline template)', () => {
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();
expect(component.stateCheckTimer).toBeUndefined();
expect(component.sbomOverview.scan_status).toBe(
SBOM_SCAN_STATUS.SUCCESS
);
});
});
});

View File

@ -8,7 +8,6 @@ import {
} from '@angular/core';
import { Subscription, timer } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { ScannerVo } from '../../../../../shared/services';
import { ErrorHandler } from '../../../../../shared/units/error-handler';
import {
clone,
@ -27,6 +26,7 @@ import { ScanService } from '../../../../../../../ng-swagger-gen/services/scan.s
import { ScanType } from 'ng-swagger-gen/models';
import { ScanTypes } from '../../../../../shared/entities/shared.const';
import { SBOMOverview } from './sbom-overview';
import { Scanner } from '../../../../left-side-nav/interrogation-services/scanner/scanner';
const STATE_CHECK_INTERVAL: number = 3000; // 3s
const RETRY_TIMES: number = 3;
@ -36,7 +36,7 @@ const RETRY_TIMES: number = 3;
styleUrls: ['./scanning.scss'],
})
export class ResultSbomComponent implements OnInit, OnDestroy {
@Input() inputScanner: ScannerVo;
@Input() inputScanner: Scanner;
@Input() repoName: string = '';
@Input() projectName: string = '';
@Input() projectId: string = '';
@ -271,10 +271,7 @@ export class ResultSbomComponent implements OnInit, OnDestroy {
}/scan/${this.sbomOverview.report_id}/log`;
}
getScanner(): ScannerVo {
if (this.sbomOverview && this.sbomOverview.scanner) {
return this.sbomOverview.scanner;
}
getScanner(): Scanner {
return this.inputScanner;
}

View File

@ -1,7 +1,7 @@
import { Component, Input } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { ActivatedRoute, Router } from '@angular/router';
import { ScannerVo, SbomSummary } from '../../../../../../shared/services';
import { SbomSummary } from '../../../../../../shared/services';
import { SBOM_SCAN_STATUS } from '../../../../../../shared/units/utils';
import {
UN_LOGGED_PARAM,
@ -9,6 +9,7 @@ import {
} from '../../../../../../account/sign-in/sign-in.service';
import { HAS_STYLE_MODE, StyleMode } from '../../../../../../services/theme';
import { ScanTypes } from '../../../../../../shared/entities/shared.const';
import { Scanner } from '../../../../../left-side-nav/interrogation-services/scanner/scanner';
const MIN = 60;
const MIN_STR = 'min ';
@ -21,7 +22,7 @@ const SUCCESS_PCT: number = 100;
styleUrls: ['./sbom-tip-histogram.component.scss'],
})
export class SbomTipHistogramComponent {
@Input() scanner: ScannerVo;
@Input() scanner: Scanner;
@Input() sbomSummary: SbomSummary = {
scan_status: SBOM_SCAN_STATUS.NOT_GENERATED_SBOM,
};

View File

@ -256,8 +256,8 @@ describe('ResultBarChartComponent (inline template)', () => {
});
it('Test ResultBarChartComponent getSummary', () => {
fixture.detectChanges();
// component.summary.scan_status = VULNERABILITY_SCAN_STATUS.SUCCESS;
component.getSummary();
component.summary.scan_status = VULNERABILITY_SCAN_STATUS.SUCCESS;
fixture.detectChanges();
fixture.whenStable().then(() => {
fixture.detectChanges();

View File

@ -127,6 +127,23 @@ ClarityIcons.add({
21.18,0,0,0,4,21.42,21,21,0,0,0,7.71,33.58a1,1,0,0,0,.81.42h19a1,1,0,0,0,
.81-.42A21,21,0,0,0,32,21.42,21.18,21.18,0,0,0,29.1,10.49Z"/>
<rect class="cls-1" width="36" height="36"/></g></svg>`,
sbom: `
<?xml version='1.0' encoding='utf-8'?>
<!-- Generator: imaengine 6.0 -->
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0,0,512,512" style="enable-background:new 0 0 512 512;" version="1.1">
<defs/>
<g id="layer0">
<g transform="matrix(1 0 0 1 0 0)">
<path d="M341.333,213.333L362.666,213.333L362.666,117.333C362.619,116.239 362.399,115.159 362.015,114.133C361.93,113.866 361.951,113.557 361.844,113.29C361.285,111.937 360.454,110.713 359.401,109.695L252.885,3.136C250.88,1.135 248.166,0.0079999 245.333,0L10.667,0C4.776,0 0,4.776 0,10.667L0,458.667C0,464.558 4.776,469.334 10.667,469.334L224,469.334L224,448L21.333,448L21.333,21.333L234.666,21.333L234.666,117.333C234.666,123.224 239.442,128 245.333,128L341.333,128L341.333,213.333L341.333,213.333ZM256,106.667L256,36.427L326.219,106.667L256,106.667L256,106.667Z" fill="#175975"/>
<path d="M501.333,341.333L480,341.333L480,330.666C479.988,289.429 446.55,256.009 405.312,256.02C402.195,256.021 399.081,256.217 395.989,256.607C358.752,261.151 330.666,294.047 330.666,333.119L330.666,341.332L309.333,341.332C303.442,341.332 298.666,346.108 298.666,351.999L298.666,501.332C298.666,507.223 303.442,511.999 309.333,511.999L501.333,511.999C507.224,511.999 512,507.223 512,501.332L512,352C512,346.109 507.224,341.333 501.333,341.333L501.333,341.333ZM352,333.131C352,304.822 372.021,281.035 398.571,277.792C427.788,274.057 454.502,294.715 458.237,323.932C458.523,326.165 458.666,328.415 458.667,330.666L458.667,341.333L352,341.333L352,333.131L352,333.131ZM490.667,490.667L320,490.667L320,362.667L490.667,362.667L490.667,490.667L490.667,490.667Z" fill="#175975"/>
<path d="M394.667,423.797L394.667,458.666C394.667,464.557 399.443,469.333 405.334,469.333C411.225,469.333 416,464.558 416,458.667L416,423.563C426.103,417.57 429.435,404.522 423.443,394.419C419.605,387.948 412.633,383.986 405.11,384C393.369,383.979 383.834,393.479 383.813,405.22C383.798,412.922 387.951,420.028 394.667,423.797L394.667,423.797Z" fill="#175975"/>
</g>
<text font-size="100" font-family="'MesloLGLDZForPowerline-Bold'" fill="#175975" transform="matrix(1.24404 0 0 1.04972 34.5897 178.002)">
<tspan x="0" y="112" textLength="240.82">
<![CDATA[SBOM]]></tspan>
</text>
</g>
</svg>`,
});
@NgModule({

View File

@ -804,6 +804,7 @@
"FILTER_BY_LABEL": "Images nach Label filtern",
"FILTER_ARTIFACT_BY_LABEL": "Artefakte nach Label filtern",
"ADD_LABELS": "Label hinzufügen",
"STOP": "Stop",
"RETAG": "Kopieren",
"ACTION": "AKTION",
"DEPLOY": "Bereitstellen",
@ -1057,7 +1058,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1107,7 +1108,7 @@
"PLACEHOLDER": "Filter Schwachstellen",
"PACKAGE": "Paket",
"PACKAGES": "Pakete",
"SCAN_NOW": "Scan",
"SCAN_NOW": "Scan vulnerability",
"SCAN_BY": "SCAN DURCH {{scanner}}",
"REPORTED_BY": "GEMELDET VON {{scanner}}",
"NO_SCANNER": "KEIN SCANNER",

View File

@ -805,6 +805,7 @@
"FILTER_BY_LABEL": "Filter images by label",
"FILTER_ARTIFACT_BY_LABEL": "Filter actifact by label",
"ADD_LABELS": "Add Labels",
"STOP": "Stop",
"RETAG": "Copy",
"ACTION": "ACTION",
"DEPLOY": "DEPLOY",
@ -1058,7 +1059,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM ",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1108,7 +1109,7 @@
"PLACEHOLDER": "Filter Vulnerabilities",
"PACKAGE": "package",
"PACKAGES": "packages",
"SCAN_NOW": "Scan",
"SCAN_NOW": "Scan vulnerability ",
"SCAN_BY": "SCAN BY {{scanner}}",
"REPORTED_BY": "Reported by {{scanner}}",
"NO_SCANNER": "NO SCANNER",

View File

@ -805,6 +805,7 @@
"FILTER_BY_LABEL": "Filter images by label",
"FILTER_ARTIFACT_BY_LABEL": "Filter actifact by label",
"ADD_LABELS": "Add Labels",
"STOP": "Stop",
"RETAG": "Copy",
"ACTION": "ACTION",
"DEPLOY": "DEPLOY",
@ -1056,7 +1057,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1106,7 +1107,7 @@
"PLACEHOLDER": "Filter Vulnerabilities",
"PACKAGE": "package",
"PACKAGES": "packages",
"SCAN_NOW": "Scan",
"SCAN_NOW": "Scan vulnerability",
"SCAN_BY": "SCAN BY {{scanner}}",
"REPORTED_BY": "Reported by {{scanner}}",
"NO_SCANNER": "NO SCANNER",

View File

@ -804,6 +804,7 @@
"FILTER_BY_LABEL": "Filtrer les images par label",
"FILTER_ARTIFACT_BY_LABEL": "Filtrer les artefact par label",
"ADD_LABELS": "Ajouter des labels",
"STOP": "Stop",
"RETAG": "Copier",
"ACTION": "Action",
"DEPLOY": "Déployer",
@ -1056,7 +1057,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1106,12 +1107,12 @@
"PLACEHOLDER": "Filtrer les vulnérabilités",
"PACKAGE": "paquet",
"PACKAGES": "paquets",
"SCAN_NOW": "Analyser",
"SCAN_NOW": "Scan vulnerability",
"SCAN_BY": "Scan par {{scanner}}",
"REPORTED_BY": "Rapporté par {{scanner}}",
"NO_SCANNER": "Aucun scanneur",
"TRIGGER_STOP_SUCCESS": "Déclenchement avec succès de l'arrêt d'analyse",
"STOP_NOW": "Arrêter l'analyse"
"STOP_NOW": "Stop Scan"
},
"PUSH_IMAGE": {
"TITLE": "Commande de push",

View File

@ -802,6 +802,7 @@
"FILTER_BY_LABEL": "라벨별로 이미지 필터",
"FILTER_ARTIFACT_BY_LABEL": "라벨별로 아티팩트 필터",
"ADD_LABELS": "라벨 추가",
"STOP": "Stop",
"RETAG": "복사",
"ACTION": "동작",
"DEPLOY": "배포",
@ -1055,7 +1056,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1105,12 +1106,12 @@
"PLACEHOLDER": "취약점 필터",
"PACKAGE": "패키지",
"PACKAGES": "패키지들",
"SCAN_NOW": "스캔",
"SCAN_NOW": "Scan vulnerability",
"SCAN_BY": "{{scanner}로 스캔",
"REPORTED_BY": "{{scanner}}로 보고 됨",
"NO_SCANNER": "스캐너 없음",
"TRIGGER_STOP_SUCCESS": "트리거 중지 스캔이 성공적으로 수행되었습니다",
"STOP_NOW": "스캔 중지"
"STOP_NOW": "Stop Scan"
},
"PUSH_IMAGE": {
"TITLE": "푸시 명령어",

View File

@ -803,6 +803,7 @@
"FILTER_BY_LABEL": "Filtrar imagens por marcadores",
"FILTER_ARTIFACT_BY_LABEL": "Filtrar por marcador",
"ADD_LABELS": "Adicionar Marcadores",
"STOP": "Stop",
"RETAG": "Copiar",
"ACTION": "AÇÃO",
"DEPLOY": "IMPLANTAR",
@ -1054,7 +1055,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1104,12 +1105,12 @@
"PLACEHOLDER": "Filtrar",
"PACKAGE": "pacote",
"PACKAGES": "pacotes",
"SCAN_NOW": "Examinar",
"SCAN_NOW": "Scan vulnerability",
"SCAN_BY": "EXAMINAR COM {{scanner}}",
"REPORTED_BY": "Encontrado com {{scanner}}",
"NO_SCANNER": "NENHUM",
"TRIGGER_STOP_SUCCESS": "Exame foi interrompido",
"STOP_NOW": "Interromper"
"STOP_NOW": "Stop Scan"
},
"PUSH_IMAGE": {
"TITLE": "Comando Push",

View File

@ -804,6 +804,7 @@
"FILTER_BY_LABEL": "İmajları etikete göre filtrele",
"FILTER_ARTIFACT_BY_LABEL": "Filter actifact by label",
"ADD_LABELS": "Etiketler Ekle",
"STOP": "Stop",
"RETAG": "Copy",
"ACTION": "AKSİYON",
"DEPLOY": "YÜKLE",
@ -1057,7 +1058,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1107,7 +1108,7 @@
"PLACEHOLDER": "Güvenlik Açıklarını Filtrele",
"PACKAGE": "paket",
"PACKAGES": "paketler",
"SCAN_NOW": "Tara",
"SCAN_NOW": "Scan vulnerability",
"SCAN_BY": "SCAN BY {{scanner}}",
"REPORTED_BY": "Reported by {{scanner}}",
"NO_SCANNER": "NO SCANNER",

View File

@ -801,6 +801,7 @@
"LABELS": "标签",
"ADD_LABEL_TO_IMAGE": "添加标签到此镜像",
"ADD_LABELS": "添加标签",
"STOP": "Stop",
"RETAG": "拷贝",
"FILTER_BY_LABEL": "过滤标签",
"FILTER_ARTIFACT_BY_LABEL": "通过标签过滤Artifact",
@ -1055,7 +1056,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",
@ -1105,7 +1106,7 @@
"PLACEHOLDER": "过滤漏洞",
"PACKAGE": "组件",
"PACKAGES": "组件",
"SCAN_NOW": "扫描",
"SCAN_NOW": "Scan vulnerability",
"SCAN_BY": "使用 {{scanner}} 进行扫描",
"REPORTED_BY": "结果由 {{scanner}} 提供",
"NO_SCANNER": "无扫描器",

View File

@ -801,6 +801,7 @@
"LABELS": "標籤",
"ADD_LABEL_TO_IMAGE": "新增標籤到此映像檔",
"ADD_LABELS": "新增標籤",
"STOP": "Stop",
"RETAG": "複製",
"FILTER_BY_LABEL": "篩選標籤",
"FILTER_ARTIFACT_BY_LABEL": "透過標籤篩選 Artifact",
@ -1054,7 +1055,7 @@
"NO_SBOM": "No SBOM",
"PACKAGES": "SBOM",
"REPORTED_BY": "Reported by {{scanner}}",
"GENERATE": "Create SBOM",
"GENERATE": "Generate SBOM",
"DOWNLOAD": "Download SBOM",
"Details": "SBOM details",
"STOP": "Stop SBOM",