LCC
LTO Control Center
{{ currentTime }}
{{ isConnected ? 'Connected' : 'Disconnected' }}

Sites Online

{{ summary.sites_online }}

Total Tapes

{{ summary.total_tapes }}

Total Files

{{ formatNumber(summary.total_files) }}

Total Storage

{{ summary.total_size_tb }} TB

Drive Cleaning Required!

{{ cleaningAlertMessage }}

{{ key === 'drive1' ? 'Drive 1' : 'Drive 2' }} ({{ key === 'drive1' ? '/dev/nst0' : '/dev/nst1' }})

{{ drive.needs_cleaning ? 'CLEANING REQUIRED' : (drive.status === 'ready' ? 'Ready' : 'Unknown') }}

{{ drive.hours_used }}h used

Last cleaned: {{ formatDate(drive.last_cleaned) }}

{{ fiafCompliant ? '✓' : '⚠' }}

FIAF Compliance: {{ summary.fiaf_compliant_pairs }}/{{ summary.tape_pairs }} pairs compliant

{{ fiafCompliant ? 'All tape pairs have matching A/B copies' : 'Some tape pairs need verification' }}

All Tapes (Click to view contents)

Barcode Site Status Files Size Pair Actions
{{ tape.barcode }} {{ tape.site || 'Unknown' }} {{ tape.status || 'unknown' }} {{ formatNumber(tape.file_count || 0) }} {{ formatSize(tape.total_size || 0) }} A B -

Tape Contents: {{ selectedTape?.barcode }}

{{ formatNumber(selectedTape?.file_count || 0) }} files | {{ formatSize(selectedTape?.total_size || 0) }}

Loading tape contents...

File Path Size Modified Checksum
{{ file.path }}
{{ formatSize(file.size) }} {{ file.mtime || '-' }} {{ file.checksum?.substring(0, 16) || '-' }}...
Showing first 100 of {{ filteredTapeFiles.length }} files

No files indexed for this tape

Mount the tape and run indexing to see contents

Search Files Across All Tapes

Found {{ searchResults.length }} results

{{ result.path }}

Tape: {{ result.tape }} | Size: {{ formatSize(result.size) }}

Enter a search term to find files across all tapes

Job Queue

{{ job.type }} - {{ job.tape_a }}{{ job.tape_b ? ' / ' + job.tape_b : '' }}

{{ job.source_path }}

{{ job.status }}

{{ job.progress }}% complete - {{ formatNumber(job.processed_files || 0) }}/{{ formatNumber(job.total_files || 0) }} files

No jobs in queue

FIAF Compliance Reports

Compliant Tape Pairs

{{ summary.fiaf_compliant_pairs }}

Pending Verification

{{ summary.tape_pairs - summary.fiaf_compliant_pairs }}

New Backup Job

{{ i + 1 }}
{{ step }}

Identify Loaded Tapes

Scan the tape barcodes to identify what's loaded in each drive

Scan to Identify Loaded Tapes

Use the barcode scanner to identify which tapes are loaded in each drive

{{ !scannedTapeA ? 'Scan the barcode on the tape in DRIVE A (nst0)' : 'Scan the barcode on the tape in DRIVE B (nst1)' }}

Waiting for barcode scan...

Both Tapes Identified
A
Drive 1 (nst0)

{{ scannedTapeA }}

B
Drive 2 (nst1)

{{ scannedTapeB }}

Valid tape pair: {{ getTapePairId(scannedTapeA) }}

Warning: Tape pair mismatch - verify correct tapes are loaded

{{ scannerError }}

A

Drive A Identified

{{ scannedTapeA }}

Reading tape mount status...

A

Drive 1 (Tape A)

/dev/nst0

{{ tapeStatus.driveA.status === 'empty' || tapeStatus.driveA.status === 'formatted' ? 'Empty/Ready' : tapeStatus.driveA.status === 'has_data' ? 'Has Data' : tapeStatus.driveA.status === 'not_formatted' ? 'Not Formatted' : 'No Tape' }}
Barcode: {{ scannedTapeA || tapeStatus.driveA.barcode || "Scan to identify" }}
Used Space: {{ formatSize(tapeStatus.driveA.used_bytes) }}
File Count: {{ formatNumber(tapeStatus.driveA.file_count) }}

Top Folders:

{{ folder }}
B

Drive 2 (Tape B)

/dev/nst1

{{ tapeStatus.driveB.status === 'empty' || tapeStatus.driveB.status === 'formatted' ? 'Empty/Ready' : tapeStatus.driveB.status === 'has_data' ? 'Has Data' : tapeStatus.driveB.status === 'not_formatted' ? 'Not Formatted' : 'No Tape' }}
Barcode: {{ scannedTapeB || tapeStatus.driveB.barcode || "Scan to identify" }}
Used Space: {{ formatSize(tapeStatus.driveB.used_bytes) }}
File Count: {{ formatNumber(tapeStatus.driveB.file_count) }}

Top Folders:

{{ folder }}

Tapes contain existing data

Proceeding will overwrite existing data. Format the tapes or confirm overwrite to continue.

Tapes Not Identified

Use the barcode scanner above to identify which tapes are loaded, or click "Refresh Mount Status" if LTFS is mounted.

Auto-Selected Projects (Oldest First)

{{ autoSelectedProjects.length }} projects / {{ formatSize(autoSelectedTotalSize) }}
{{ idx + 1 }}. {{ project.pid }} {{ project.pid }} - {{ project.title || 'Untitled' }}
{{ formatDate(project.created_at) }} {{ formatSize(project.total_size || 0) }}
{{ projectsNeedingBackup.length }} projects need backup (no size data) All projects are backed up!
No projects found. Check site connection.
{{ backupForm.selectedProjects.length }} project(s) selected Calculating... Total: {{ formatSize(estimatedBackupSize) }} / 18 TB ({{ tapeUtilizationPercent }}%)
No clients found. Check site connection.
Calculating... {{ fetchedProjectCount }} project(s), {{ formatNumber(fetchedFileCount) }} file(s) Client selected Estimating... Total: {{ formatSize(estimatedBackupSize) }} / 18 TB ({{ tapeUtilizationPercent }}%)
All projects backed up! Nothing pending.
{{ backupForm.selectedProjects.length }} project(s) selected Calculating... Total: {{ formatSize(estimatedBackupSize) }} / 18 TB ({{ tapeUtilizationPercent }}%)
/

Loading folders...

No subfolders found

Will create {{ backupForm.tapePair }}-A and {{ backupForm.tapePair }}-B

Creates identical A/B tape pair for archival compliance

A

Load Tape {{ backupForm.tapePair }}-A into Drive 1

Then scan the barcode to verify

Barcode verified! Tape {{ backupForm.tapePair }}-A confirmed in Drive 1
WRONG TAPE! Expected {{ backupForm.tapePair }}-A, scanned {{ barcodeVerify.driveA }}
B

Load Tape {{ backupForm.tapePair }}-B into Drive 2

Then scan the barcode to verify

Barcode verified! Tape {{ backupForm.tapePair }}-B confirmed in Drive 2
WRONG TAPE! Expected {{ backupForm.tapePair }}-B, scanned {{ barcodeVerify.driveB }}

Ready to Start Backup

Source

{{ backupSourceDescription }}

Site

{{ backupForm.site }}

Estimated Size

Calculating... {{ formatSize(estimatedBackupSize) }}

Files / Projects

{{ formatNumber(fetchedFileCount) }} files / {{ fetchedProjectCount }} projects

Drive 1 (Tape A)

{{ backupForm.tapePair }}-A ✓

Drive 2 (Tape B)

{{ backupForm.tapePair }}-B ✓

Tape Utilization (LTO-9: 18 TB) {{ tapeUtilizationPercent }}%

Tip: Consider adding more projects to maximize tape space efficiency

Excellent tape utilization!

Note: This will mount both tapes, copy all files from source to both tapes simultaneously, verify checksums, and index all files. This may take several hours depending on data size.

Mount Tape

Verify Tape

Format Tape{{ formatTarget === 'both' ? 's' : ' ' + formatTarget }}

WARNING: This will ERASE ALL DATA

Tape {{ tapeStatus.driveA.barcode }} in Drive 1 will be completely erased. Tape {{ tapeStatus.driveB.barcode }} in Drive 2 will be completely erased. Both tapes ({{ tapeStatus.driveA.barcode }} and {{ tapeStatus.driveB.barcode }}) will be completely erased. This action cannot be undone!

Drive Cleaning

Important: Use LTO Cleaning Tape

Only use approved LTO cleaning cartridges. Regular cleaning extends drive life and prevents data loss.

Cleaning Instructions:

  1. Eject any tape currently in the drive
  2. Insert the LTO cleaning cartridge
  3. Click "Start Cleaning" below
  4. Wait for cleaning cycle to complete (~30-60 sec)
  5. The cleaning tape will auto-eject when done

Note: LTO cleaning cartridges have limited uses (typically 50 cycles). Track usage and replace when exhausted.

Backup Progress

Phase: {{ backupProgress.phase }}
Staging -> Copy A -> Copy B -> Verify -> Done
Progress {{ backupProgress.percent.toFixed(1) }}%

Files

{{ formatNumber(backupProgress.files_done) }} / {{ formatNumber(backupProgress.files_total) }}

Data

{{ formatSize(backupProgress.bytes_done) }} / {{ formatSize(backupProgress.bytes_total) }}

Speed

{{ backupProgress.speed_mbps.toFixed(1) }} MB/s

ETA

{{ formatEta(backupProgress.eta_seconds) }}

Current File

{{ backupProgress.current_file }}

Error

{{ backupProgress.error }}

Backup Completed Successfully!

{{ formatNumber(backupProgress.files_total) }} files ({{ formatSize(backupProgress.bytes_total) }}) backed up to tape pair