- 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
320 lines
7.8 KiB
Markdown
320 lines
7.8 KiB
Markdown
# 🔄 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:**
|
|
1. ✅ Fetches existing `device.conf` from server via API
|
|
2. ✅ Parses the configuration file
|
|
3. ✅ Populates all form fields with actual values
|
|
4. ✅ Loads all existing drives with correct settings
|
|
5. ✅ Falls back to defaults only if no config exists
|
|
|
|
### Implementation
|
|
|
|
#### 1. **Updated Page Load Sequence**
|
|
|
|
**Before:**
|
|
```javascript
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
initNavigation();
|
|
addDefaultDrives(); // ❌ Always use defaults
|
|
generateConfig();
|
|
});
|
|
```
|
|
|
|
**After:**
|
|
```javascript
|
|
document.addEventListener('DOMContentLoaded', function () {
|
|
initNavigation();
|
|
loadExistingConfig(); // ✅ Load from server first
|
|
});
|
|
```
|
|
|
|
#### 2. **Added `loadExistingConfig()` Function**
|
|
|
|
Fetches configuration from server:
|
|
|
|
```javascript
|
|
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:**
|
|
```javascript
|
|
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:
|
|
|
|
```javascript
|
|
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:
|
|
1. User opens web UI
|
|
2. Sees default values (STK L700)
|
|
3. Has to manually configure everything
|
|
4. Risk of losing existing config
|
|
|
|
### After Fix:
|
|
1. User opens web UI ✅
|
|
2. Sees actual current configuration ✅
|
|
3. Can modify if needed ✅
|
|
4. Or just review current settings ✅
|
|
|
|
---
|
|
|
|
## 📁 Files Modified
|
|
|
|
1. **`/builder/adastra-vtl/web-ui/script.js`**
|
|
- Updated `DOMContentLoaded` event handler
|
|
- Added `loadExistingConfig()` function
|
|
- Added `parseAndLoadConfig()` function
|
|
- Added `findDriveType()` helper function
|
|
|
|
2. **`/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
|
|
|
|
1. **Time Saving** - No need to re-enter existing configuration
|
|
2. **Accuracy** - Shows actual current state of the system
|
|
3. **Safety** - Less risk of accidentally overwriting working config
|
|
4. **Convenience** - Can review settings without SSH access
|
|
5. **Professional** - Behaves like a proper configuration manager
|
|
|
|
---
|
|
|
|
## 🔗 Related Fixes
|
|
|
|
This fix complements the previous fixes:
|
|
1. **Drive ID Convention Fix** - Ensures correct drive numbering (11, 12, 13, 14)
|
|
2. **Library Detection Fix** - Fixed vtllibrary startup issues
|
|
3. **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/`
|