- Web UI: - Added secure Authentication system (Login, 2 Roles: Admin/Viewer) - Added System Monitoring Dashboard (Health, Services, Power Mgmt) - Added User Management Interface (Create, Delete, Enable/Disable) - Added Device Mapping view in iSCSI tab (lsscsi output) - Backend: - Implemented secure session management (auth.php) - Added power management APIs (restart/shutdown appliance) - Added device mapping API - CLI: - Created global 'vtl' management tool - Added scripts for reliable startup (vtllibrary fix) - Installer: - Updated install.sh with new dependencies (tgt, sudoers, permissions) - Included all new components in build-installer.sh - Docs: - Consolidated documentation into docs/ folder
7.8 KiB
🔄 Web UI Config Loader Fix
📋 Issue
Web UI was not loading existing configuration from /etc/mhvtl/device.conf on page load. Instead, it always showed hardcoded default values (STK L700, XYZZY_A, etc.), forcing users to manually reconfigure everything even when a valid config already existed.
❌ Previous Behavior
On Page Load:
- Always showed default values:
- Vendor: STK
- Product: L700
- Serial: XYZZY_A
- 4 default drives with IBM ULT3580-TD5/TD6
User Experience:
- Had to manually re-enter all existing configuration
- No way to see current server configuration
- Risk of overwriting working config with defaults
✅ Fix Applied
New Behavior
On Page Load:
- ✅ Fetches existing
device.conffrom server via API - ✅ Parses the configuration file
- ✅ Populates all form fields with actual values
- ✅ Loads all existing drives with correct settings
- ✅ Falls back to defaults only if no config exists
Implementation
1. Updated Page Load Sequence
Before:
document.addEventListener('DOMContentLoaded', function () {
initNavigation();
addDefaultDrives(); // ❌ Always use defaults
generateConfig();
});
After:
document.addEventListener('DOMContentLoaded', function () {
initNavigation();
loadExistingConfig(); // ✅ Load from server first
});
2. Added loadExistingConfig() Function
Fetches configuration from server:
function loadExistingConfig() {
fetch('api.php', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'load_config' })
})
.then(response => response.json())
.then(data => {
if (data.success && data.config) {
parseAndLoadConfig(data.config); // Parse and populate
} else {
addDefaultDrives(); // Fallback to defaults
generateConfig();
}
})
.catch(error => {
console.error('Error loading config:', error);
addDefaultDrives(); // Fallback on error
generateConfig();
});
}
3. Added parseAndLoadConfig() Function
Comprehensive parser that extracts:
Library Configuration:
- Library ID, Channel, Target, LUN
- Vendor, Product, Serial Number
- NAA, Home Directory, Backoff
Drive Configuration:
- Drive Number, Channel, Target, LUN
- Library ID, Slot Number
- Vendor, Product, Serial Number
- NAA, Compression settings, Backoff
Parsing Logic:
function parseAndLoadConfig(configText) {
const lines = configText.split('\n');
let libraryData = {};
let drivesData = [];
// Parse line by line
for (let line of lines) {
if (line.startsWith('Library:')) {
// Extract: Library: 10 CHANNEL: 00 TARGET: 00 LUN: 00
const match = line.match(/Library:\s+(\d+)\s+CHANNEL:\s+(\d+)...
}
else if (line.startsWith('Drive:')) {
// Extract: Drive: 11 CHANNEL: 00 TARGET: 01 LUN: 00
const match = line.match(/Drive:\s+(\d+)\s+CHANNEL:\s+(\d+)...
}
else if (line.includes('Vendor identification:')) {
// Extract vendor name
}
// ... more parsing logic
}
// Populate UI fields
document.getElementById('lib-vendor').value = libraryData.vendor;
// ... populate all fields
// Recreate drives
drivesData.forEach(driveData => {
const drive = { /* mapped data */ };
drives.push(drive);
renderDrive(drive);
});
}
4. Added findDriveType() Helper
Maps vendor/product to drive type dropdown:
function findDriveType(vendor, product) {
for (const [key, value] of Object.entries(driveTypes)) {
if (value.vendor === vendor && value.product === product) {
return key; // e.g., 'IBM ULT3580-TD8'
}
}
return 'IBM ULT3580-TD8'; // Default fallback
}
🎯 Features
1. Smart Loading
- Loads existing config if available
- Falls back to defaults if no config exists
- Handles errors gracefully
2. Complete Parsing
- Parses all library settings
- Parses all drive configurations
- Maintains MHVTL drive ID convention (11, 12, 13, 14)
3. Accurate Mapping
- Maps vendor/product to correct drive types
- Preserves all compression settings
- Maintains NAA and serial numbers
4. User-Friendly
- Shows actual current configuration
- No need to re-enter existing settings
- Can modify and save changes easily
📊 Example
Current Configuration on Server
VERSION: 5
Library: 10 CHANNEL: 00 TARGET: 00 LUN: 00
Vendor identification: ADASTRA
Product identification: HEPHAESTUS-V
Unit serial number: HPV00001
NAA: 10:22:33:44:ab:cd:ef:00
Home directory: /opt/mhvtl
Backoff: 400
Drive: 11 CHANNEL: 00 TARGET: 01 LUN: 00
Library ID: 10 Slot: 01
Vendor identification: IBM
Product identification: ULT3580-TD8
Unit serial number: XYZZY_A1
NAA: 10:22:33:44:ab:cd:ef:01
Compression: factor 3 enabled 1
Compression type: lzo
Backoff: 400
Drive: 12 CHANNEL: 00 TARGET: 02 LUN: 00
Library ID: 10 Slot: 02
Vendor identification: HP
Product identification: Ultrium 6-SCSI
Unit serial number: XYZZY_A2
...
Web UI Now Shows
Library Tab:
- Library ID:
10 - Vendor:
ADASTRA - Product:
HEPHAESTUS-V - Serial:
HPV00001 - NAA:
10:22:33:44:ab:cd:ef:00 - Home Directory:
/opt/mhvtl - Backoff:
400
Drives Tab:
-
Drive 11 (IBM ULT3580-TD8)
- Channel: 0, Target: 1, LUN: 0
- Library ID: 10, Slot: 1
- Serial: XYZZY_A1
-
Drive 12 (HP Ultrium 6-SCSI)
- Channel: 0, Target: 2, LUN: 0
- Library ID: 10, Slot: 2
- Serial: XYZZY_A2
🔄 Workflow
Before Fix:
- User opens web UI
- Sees default values (STK L700)
- Has to manually configure everything
- Risk of losing existing config
After Fix:
- User opens web UI ✅
- Sees actual current configuration ✅
- Can modify if needed ✅
- Or just review current settings ✅
📁 Files Modified
-
/builder/adastra-vtl/web-ui/script.js- Updated
DOMContentLoadedevent handler - Added
loadExistingConfig()function - Added
parseAndLoadConfig()function - Added
findDriveType()helper function
- Updated
-
/var/www/html/mhvtl-config/script.js- Deployed updated version to web server
🧪 Testing
Test Case 1: Existing Configuration
Setup: Valid device.conf exists at /etc/mhvtl/device.conf
Expected:
- Web UI loads all values from config
- Library settings match file
- All drives displayed correctly
- Drive IDs follow MHVTL convention (11, 12, 13, 14)
Test Case 2: No Configuration
Setup: No device.conf file exists
Expected:
- Web UI falls back to defaults
- Shows 4 default drives
- User can configure from scratch
Test Case 3: API Error
Setup: API endpoint fails or returns error
Expected:
- Web UI catches error gracefully
- Falls back to defaults
- Error logged to console
- User can still use the UI
🎉 Benefits
- Time Saving - No need to re-enter existing configuration
- Accuracy - Shows actual current state of the system
- Safety - Less risk of accidentally overwriting working config
- Convenience - Can review settings without SSH access
- Professional - Behaves like a proper configuration manager
🔗 Related Fixes
This fix complements the previous fixes:
- Drive ID Convention Fix - Ensures correct drive numbering (11, 12, 13, 14)
- Library Detection Fix - Fixed vtllibrary startup issues
- Web UI Drive ID Fix - Fixed config generation
All three fixes work together to provide a complete, working solution.
Status: ✅ FIXED
Date: December 9, 2025
Tested On: Ubuntu 24.04.3 LTS
Web Server: Apache 2.4
Access URL: http://localhost/mhvtl-config/