Skip to content

Commit 8f2ae3b

Browse files
author
Nigel
committed
v1.4.1.5 - Enhanced logging for easier debugging
- Added comprehensive logging throughout the application - Enhanced logging in backup_utils.py for backup operations - Enhanced logging in remote_browser.py for connection testing - Enhanced logging in addon.py for UI operations - Improved error messages and debugging information - Updated release notes to mention enhanced logging
1 parent f0aeb16 commit 8f2ae3b

4 files changed

Lines changed: 81 additions & 18 deletions

File tree

release_notes_1.4.1.5.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
2. **Path Validation**: Prevents invalid paths from causing silent failures
3939
3. **User Experience**: Clear feedback and proper dialog flows
4040
4. **Error Handling**: Comprehensive error handling for all operations
41+
5. **Enhanced Logging**: Detailed logging throughout the application for easier debugging and troubleshooting
4142

4243
## Testing
4344

service.libreelec.backupper/addon.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,25 @@ def __init__(self):
3030
def show_backups(self, mode='view'):
3131
"""Display a list of available backups for selection
3232
mode: 'view' for viewing/listing, 'restore' for selecting to restore"""
33+
xbmc.log(f"BackupBrowser: Showing backups in {mode} mode", xbmc.LOGINFO)
34+
3335
# Get list of available backups
36+
xbmc.log("BackupBrowser: Retrieving backup list...", xbmc.LOGDEBUG)
3437
backups = self.backup_utils.get_all_backups()
38+
xbmc.log(f"BackupBrowser: Found {len(backups)} backups", xbmc.LOGINFO)
39+
3540
if not backups:
41+
xbmc.log("BackupBrowser: No backup files found", xbmc.LOGWARNING)
3642
xbmcgui.Dialog().ok(ADDON_NAME, "No backup files found")
3743
return
3844

3945
# Create backup options with detailed information
46+
xbmc.log("BackupBrowser: Processing backup list...", xbmc.LOGDEBUG)
4047
backup_options = []
4148
for backup in backups:
4249
try:
4350
backup_name = os.path.basename(backup)
51+
xbmc.log(f"BackupBrowser: Processing backup: {backup_name}", xbmc.LOGDEBUG)
4452

4553
# Get backup date from filename (format: backup_items_timestamp.zip)
4654
# Extract timestamp from filename
@@ -70,7 +78,8 @@ def show_backups(self, mode='view'):
7078
backup_date = "Unknown date"
7179
else:
7280
backup_date = "Unknown date"
73-
except:
81+
except Exception as e:
82+
xbmc.log(f"BackupBrowser: Error parsing backup date for {backup_name}: {str(e)}", xbmc.LOGWARNING)
7483
backup_date = "Unknown date"
7584

7685
# Get backup size
@@ -81,7 +90,8 @@ def show_backups(self, mode='view'):
8190
# For remote backups, size info may not be available
8291
backup_size = 0
8392
backup_size_formatted = self.backup_utils.format_size(backup_size)
84-
except:
93+
except Exception as e:
94+
xbmc.log(f"BackupBrowser: Error getting backup size for {backup_name}: {str(e)}", xbmc.LOGWARNING)
8595
backup_size_formatted = "Unknown size"
8696

8797
# Create display string
@@ -90,40 +100,55 @@ def show_backups(self, mode='view'):
90100
display_name += f" ({backup_size_formatted})"
91101

92102
backup_options.append((display_name, backup))
103+
xbmc.log(f"BackupBrowser: Added backup option: {display_name}", xbmc.LOGDEBUG)
93104
except Exception as e:
94-
xbmc.log(f"Error processing backup {backup}: {str(e)}", xbmc.LOGERROR)
105+
xbmc.log(f"BackupBrowser: Error processing backup {backup}: {str(e)}", xbmc.LOGERROR)
95106
continue
96107

108+
xbmc.log(f"BackupBrowser: Created {len(backup_options)} backup options", xbmc.LOGINFO)
109+
97110
if not backup_options:
111+
xbmc.log("BackupBrowser: No valid backup options created", xbmc.LOGWARNING)
98112
xbmcgui.Dialog().ok(ADDON_NAME, "No valid backup files found")
99113
return
100114

101115
# Show dialog to select backup
102116
dialog = xbmcgui.Dialog()
103117
title = "Select backup to restore" if mode == 'restore' else "Available backups"
118+
xbmc.log(f"BackupBrowser: Showing selection dialog with title: {title}", xbmc.LOGINFO)
104119
selected = dialog.select(title, [opt[0] for opt in backup_options])
105120

106121
if selected == -1: # User cancelled
122+
xbmc.log("BackupBrowser: User cancelled backup selection", xbmc.LOGINFO)
107123
return
108124

109125
selected_backup = backup_options[selected][1]
126+
selected_display = backup_options[selected][0]
127+
xbmc.log(f"BackupBrowser: User selected backup: {selected_display}", xbmc.LOGINFO)
110128

111129
if mode == 'restore':
112130
# Confirm restore
131+
xbmc.log("BackupBrowser: Showing restore confirmation dialog", xbmc.LOGDEBUG)
113132
confirmed = dialog.yesno(
114133
ADDON_NAME,
115134
f"Restore backup: {os.path.basename(selected_backup)}?",
116135
"This will overwrite existing files. Continue?"
117136
)
118137

119138
if confirmed:
139+
xbmc.log(f"BackupBrowser: Starting backup restoration: {selected_backup}", xbmc.LOGINFO)
120140
success, message = self.backup_utils.restore_backup(selected_backup)
121141
if success:
142+
xbmc.log("BackupBrowser: Backup restoration completed successfully", xbmc.LOGINFO)
122143
dialog.ok(ADDON_NAME, "Backup restored successfully")
123144
else:
145+
xbmc.log(f"BackupBrowser: Backup restoration failed: {message}", xbmc.LOGERROR)
124146
dialog.ok(ADDON_NAME, f"Failed to restore backup: {message}")
147+
else:
148+
xbmc.log("BackupBrowser: User cancelled backup restoration", xbmc.LOGINFO)
125149
else:
126150
# For view mode, just show backup info
151+
xbmc.log("BackupBrowser: Showing backup information dialog", xbmc.LOGDEBUG)
127152
dialog.ok(ADDON_NAME, f"Backup: {os.path.basename(selected_backup)}")
128153

129154
def show_main_menu():

service.libreelec.backupper/resources/lib/backup_utils.py

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,37 +48,56 @@ def __init__(self, addon=None):
4848

4949
def update_backup_location(self):
5050
"""Update backup location from settings"""
51+
xbmc.log("BackupManager: Updating backup location settings", xbmc.LOGINFO)
52+
5153
# Get backup location type from settings
5254
self.location_type = int(self.addon.getSetting('backup_location_type') or "0")
53-
55+
xbmc.log(f"BackupManager: Location type = {self.location_type} (0=Local, 1=Remote)", xbmc.LOGINFO)
56+
5457
# Define paths for various Kodi directories
5558
self.kodi_home = xbmcvfs.translatePath('special://home')
5659
self.kodi_userdata = xbmcvfs.translatePath('special://userdata')
57-
60+
xbmc.log(f"BackupManager: Kodi paths - home: {self.kodi_home}, userdata: {self.kodi_userdata}", xbmc.LOGDEBUG)
61+
5862
# Initialize backup_dir
5963
self.backup_dir = None
60-
64+
6165
# Handle local backup location
6266
if self.location_type == 0: # Local
6367
self.backup_dir = self.addon.getSetting('backup_location')
68+
xbmc.log(f"BackupManager: Local backup location setting: {self.backup_dir}", xbmc.LOGINFO)
69+
6470
if not self.backup_dir:
6571
self.backup_dir = "/storage/backup" # Default location
66-
72+
xbmc.log("BackupManager: Using default local backup location: /storage/backup", xbmc.LOGINFO)
73+
6774
# Validate that local path doesn't contain network protocols or remote path formats
6875
if self.backup_dir and (self.backup_dir.startswith(('nfs:', 'smb:', 'ftp:', 'sftp:', 'http:', 'https:')) or '://' in self.backup_dir or ':' in self.backup_dir):
69-
xbmc.log(f"Invalid local path detected (contains network protocol or remote path format): {self.backup_dir}", xbmc.LOGWARNING)
76+
xbmc.log(f"BackupManager: Invalid local path detected (contains network protocol or remote path format): {self.backup_dir}", xbmc.LOGWARNING)
7077
# Reset to default if invalid
7178
self.backup_dir = "/storage/backup"
7279
self.addon.setSetting('backup_location', self.backup_dir)
73-
xbmc.log(f"Reset backup location to default: {self.backup_dir}", xbmc.LOGINFO)
80+
xbmc.log("BackupManager: Reset backup location to default: /storage/backup", xbmc.LOGINFO)
81+
else:
82+
xbmc.log(f"BackupManager: Local backup directory validated: {self.backup_dir}", xbmc.LOGINFO)
7483
else: # Remote
84+
xbmc.log("BackupManager: Configuring remote backup settings", xbmc.LOGINFO)
85+
7586
# Get remote settings
7687
self.remote_type = int(self.addon.getSetting('remote_location_type') or "0")
7788
self.remote_path = self.addon.getSetting('remote_path')
7889
self.remote_username = self.addon.getSetting('remote_username')
79-
self.remote_password = self.addon.getSetting('remote_password')
90+
# Don't log password for security
8091
self.remote_port = int(self.addon.getSetting('remote_port') or "0")
81-
92+
93+
remote_type_names = ["SMB", "NFS", "FTP", "SFTP", "WebDAV"]
94+
remote_type_name = remote_type_names[self.remote_type] if self.remote_type < len(remote_type_names) else f"Unknown({self.remote_type})"
95+
96+
xbmc.log(f"BackupManager: Remote type = {self.remote_type} ({remote_type_name})", xbmc.LOGINFO)
97+
xbmc.log(f"BackupManager: Remote path = {self.remote_path}", xbmc.LOGINFO)
98+
xbmc.log(f"BackupManager: Remote username = {self.remote_username}", xbmc.LOGINFO)
99+
xbmc.log(f"BackupManager: Remote port = {self.remote_port}", xbmc.LOGINFO)
100+
82101
# Set default ports if not specified
83102
if self.remote_port == 0:
84103
if self.remote_type == 0: # SMB
@@ -91,21 +110,28 @@ def update_backup_location(self):
91110
self.remote_port = 22
92111
elif self.remote_type == 4: # WebDAV
93112
self.remote_port = 80
94-
113+
xbmc.log(f"BackupManager: Set default port for {remote_type_name}: {self.remote_port}", xbmc.LOGINFO)
114+
95115
# Create a temporary local directory for staging remote files
96116
self.backup_dir = os.path.join(xbmcvfs.translatePath('special://temp'), 'libreelec_backupper')
97-
117+
xbmc.log(f"BackupManager: Remote staging directory: {self.backup_dir}", xbmc.LOGINFO)
118+
98119
# Ensure backup directory exists (only for remote backups where we create temp dirs)
99120
if self.location_type != 0: # Remote
100121
if self.backup_dir and not os.path.exists(self.backup_dir):
101122
try:
102123
os.makedirs(self.backup_dir)
124+
xbmc.log(f"BackupManager: Created staging directory: {self.backup_dir}", xbmc.LOGINFO)
103125
except Exception as e:
104-
xbmc.log(f"Error creating backup directory: {str(e)}", xbmc.LOGERROR)
126+
xbmc.log(f"BackupManager: Error creating backup directory: {str(e)}", xbmc.LOGERROR)
105127
# Fall back to addon profile if custom location can't be created
106128
self.backup_dir = xbmcvfs.translatePath(self.addon.getAddonInfo('profile'))
129+
xbmc.log(f"BackupManager: Falling back to addon profile directory: {self.backup_dir}", xbmc.LOGWARNING)
107130
if not os.path.exists(self.backup_dir):
108131
os.makedirs(self.backup_dir)
132+
xbmc.log("BackupManager: Created fallback directory", xbmc.LOGINFO)
133+
134+
xbmc.log(f"BackupManager: Final backup directory: {self.backup_dir}", xbmc.LOGINFO)
109135

110136
def _create_webdav_session(self):
111137
"""Create a WebDAV session with retry logic and connection pooling"""

service.libreelec.backupper/resources/lib/remote_browser.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,22 @@ def __init__(self):
3939

4040
def reload_settings(self):
4141
"""Reload settings from Kodi"""
42+
xbmc.log("RemoteBrowser: Reloading settings from Kodi", xbmc.LOGINFO)
43+
4244
# Force reload of addon to get fresh settings
4345
global ADDON
4446
ADDON = xbmcaddon.Addon()
45-
47+
4648
self.remote_type = int(ADDON.getSetting('remote_location_type'))
4749
self.remote_path = ADDON.getSetting('remote_path')
4850
self.username = ADDON.getSetting('remote_username')
49-
self.password = ADDON.getSetting('remote_password')
51+
# Don't log password for security
5052
self.port = ADDON.getSetting('remote_port')
51-
53+
54+
xbmc.log(f"RemoteBrowser: Remote type = {self.remote_type}", xbmc.LOGINFO)
55+
xbmc.log(f"RemoteBrowser: Remote path = {self.remote_path}", xbmc.LOGINFO)
56+
xbmc.log(f"RemoteBrowser: Username = {self.username}", xbmc.LOGINFO)
57+
5258
# Default ports if not specified
5359
self.default_ports = {
5460
0: 445, # SMB
@@ -57,9 +63,14 @@ def reload_settings(self):
5763
3: 22, # SFTP
5864
4: 80 # WebDAV
5965
}
60-
66+
6167
if not self.port:
6268
self.port = str(self.default_ports.get(self.remote_type, 0))
69+
xbmc.log(f"RemoteBrowser: Set default port: {self.port}", xbmc.LOGINFO)
70+
else:
71+
xbmc.log(f"RemoteBrowser: Using configured port: {self.port}", xbmc.LOGINFO)
72+
73+
xbmc.log("RemoteBrowser: Settings reloaded successfully", xbmc.LOGINFO)
6374

6475
def browse(self, mode='backup'):
6576
"""Main method to browse remote locations based on type

0 commit comments

Comments
 (0)