{#if stage === 'complete' && activeResult} {#if activeResult.summary.critical > 0 || activeResult.summary.high > 0} {:else if activeResult.summary.medium > 0} {:else} {/if} {:else if stage === 'error'} {:else} {/if} Vulnerability scan
Scanning {imageName}
{#if activeResult?.imageId}
SHA: {activeResult.imageId.replace('sha256:', '')}
{/if}
{#if stage !== 'complete' && stage !== 'error'}
{message}
{#if scanner}

Using {scanner === 'grype' ? 'Grype (Anchore)' : 'Trivy (Aqua Security)'} scanner

{/if}
Scanner output
{#each activeOutputLines as line}
{#if line.startsWith('[grype]')} grype {line.slice(8)} {:else if line.startsWith('[trivy]')} trivy {line.slice(8)} {:else if line.startsWith('[dockhand]')} dockhand {line.slice(11)} {:else} {line} {/if}
{/each}
{:else if stage === 'error'}
{#if Object.keys(scannerErrors).length > 0}
{#each Object.entries(scannerErrors) as [scannerName, scannerError]}

{scannerName === 'grype' ? 'Grype' : 'Trivy'} failed

{scannerError}

{/each}
{:else}

Scan failed

{error}

{/if}
Scanner output
{#each activeOutputLines as line}
{#if line.startsWith('[grype]')} grype {line.slice(8)} {:else if line.startsWith('[trivy]')} trivy {line.slice(8)} {:else if line.startsWith('[dockhand]')} dockhand {line.slice(11)} {:else} {line} {/if}
{/each}
{:else if stage === 'complete' && activeResult}
{#if results.length > 1}
{#each results as r} {/each}
{/if} {#if Object.keys(scannerErrors).length > 0}
{#each Object.entries(scannerErrors) as [scannerName, scannerError]}
{scannerName === 'grype' ? 'Grype' : 'Trivy'} failed: {scannerError}
{/each}
{/if}
{#if activeResult.summary.critical > 0} {activeResult.summary.critical} Critical {/if} {#if activeResult.summary.high > 0} {activeResult.summary.high} High {/if} {#if activeResult.summary.medium > 0} {activeResult.summary.medium} Medium {/if} {#if activeResult.summary.low > 0} {activeResult.summary.low} Low {/if} {#if activeResult.summary.negligible > 0} {activeResult.summary.negligible} Negligible {/if} {#if activeResult.summary.unknown > 0} {activeResult.summary.unknown} Unknown {/if} {#if activeResult.vulnerabilities.length === 0} No vulnerabilities found {/if}
Scanner: {activeResult.scanner === 'grype' ? 'Grype' : 'Trivy'} Duration: {formatDuration(activeResult.scanDuration)} Total: {activeResult.vulnerabilities.length} vulnerabilities
{#if activeResult.vulnerabilities.length > 0}
{#each activeResult.vulnerabilities.slice(0, 100) as vuln, i} toggleVulnDetails(vuln.id + i)} > {#if expandedVulns.has(vuln.id + i) && vuln.description} {/if} {/each}
CVE ID Severity Package Installed Fixed in
{vuln.severity} {vuln.package} {vuln.version} {#if vuln.fixedVersion} {vuln.fixedVersion} {:else} No fix available {/if}

{vuln.description}

{#if activeResult.vulnerabilities.length > 100}
Showing 100 of {activeResult.vulnerabilities.length} vulnerabilities
{/if}
{/if}
Scanner output ({activeOutputLines.length} lines)
{#each activeOutputLines as line}
{#if line.startsWith('[grype]')} grype {line.slice(8)} {:else if line.startsWith('[trivy]')} trivy {line.slice(8)} {:else if line.startsWith('[dockhand]')} dockhand {line.slice(11)} {:else} {line} {/if}
{/each}
{/if}
{#if stage === 'complete'}
{#if activeResult && activeResult.vulnerabilities.length > 0} {#snippet child({ props })} {/snippet} Markdown report (.md) CSV spreadsheet (.csv) JSON data (.json) {/if}
{:else}
{/if}