tagliatelle

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit e09bb70470bd81231722e39c5ff71cae0499797e
parent 649ec1abdc4c9af4f0a43cfbf0df833d825ba57e
Author: breadcat <breadcat@users.noreply.github.com>
Date:   Tue,  7 Apr 2026 11:31:54 +0100

Add extra logging, preventing silent failures

Diffstat:
Minclude-admin-orphans.go | 2++
Minclude-admin-thumbnails.go | 14++++++++++----
Minclude-admin.go | 25++++++++++++++++++++++---
Minclude-bulk.go | 11+++++++++--
Minclude-cbz.go | 7+++++--
Minclude-files.go | 10+++++++++-
Minclude-filters.go | 9++++++++-
Minclude-general.go | 2++
Minclude-notes.go | 31++++++++++++++++++++-----------
Minclude-viewer.go | 18+++++++++++++++---
10 files changed, 102 insertions(+), 27 deletions(-)

diff --git a/include-admin-orphans.go b/include-admin-orphans.go @@ -1,6 +1,7 @@ package main import ( + "log" "net/http" "os" ) @@ -44,6 +45,7 @@ func getOrphanedFiles(uploadDir string) (OrphanData, error) { func orphansHandler(w http.ResponseWriter, r *http.Request) { orphanData, err := getOrphanedFiles(config.UploadDir) if err != nil { + log.Printf("Error: orphansHandler: failed to read orphaned files: %v", err) renderError(w, "Error reading orphaned files", http.StatusInternalServerError) return } diff --git a/include-admin-thumbnails.go b/include-admin-thumbnails.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" "net/http" "net/url" "os" @@ -42,6 +43,7 @@ func getVideoFiles() ([]VideoFile, error) { for rows.Next() { var v VideoFile if err := rows.Scan(&v.ID, &v.Filename, &v.Path); err != nil { + log.Printf("Warning: getVideoFiles: failed to scan row: %v", err) continue } @@ -78,12 +80,14 @@ func getVideoFiles() ([]VideoFile, error) { func thumbnailsHandler(w http.ResponseWriter, r *http.Request) { allVideos, err := getVideoFiles() if err != nil { + log.Printf("Error: thumbnailsHandler: failed to get video files: %v", err) renderError(w, "Failed to get video files: "+err.Error(), http.StatusInternalServerError) return } missing, err := getMissingThumbnailVideos() if err != nil { + log.Printf("Error: thumbnailsHandler: failed to get missing thumbnail videos: %v", err) renderError(w, "Failed to get video files: "+err.Error(), http.StatusInternalServerError) return } @@ -121,6 +125,7 @@ func generateThumbnailHandler(w http.ResponseWriter, r *http.Request) { case "generate_all": missing, err := getMissingThumbnailVideos() if err != nil { + log.Printf("Error: generateThumbnailHandler: failed to get missing thumbnails: %v", err) http.Redirect(w, r, redirectBase+"?error="+url.QueryEscape("Failed to get videos: "+err.Error()), http.StatusSeeOther) return } @@ -129,8 +134,8 @@ func generateThumbnailHandler(w http.ResponseWriter, r *http.Request) { var errors []string for _, v := range missing { - err := generateThumbnail(v.Path, config.UploadDir, v.Filename) - if err != nil { + if err := generateThumbnail(v.Path, config.UploadDir, v.Filename); err != nil { + log.Printf("Error: generateThumbnailHandler: failed to generate thumbnail for %s: %v", v.Filename, err) errors = append(errors, fmt.Sprintf("%s: %v", v.Filename, err)) } else { successCount++ @@ -154,12 +159,13 @@ func generateThumbnailHandler(w http.ResponseWriter, r *http.Request) { var filename, path string err := db.QueryRow("SELECT filename, path FROM files WHERE id=?", fileID).Scan(&filename, &path) if err != nil { + log.Printf("Error: generateThumbnailHandler: file not found for id=%s: %v", fileID, err) http.Redirect(w, r, redirectBase+"?error="+url.QueryEscape("File not found"), http.StatusSeeOther) return } - err = generateThumbnailAtTime(path, config.UploadDir, filename, timestamp) - if err != nil { + if err = generateThumbnailAtTime(path, config.UploadDir, filename, timestamp); err != nil { + log.Printf("Error: generateThumbnailHandler: failed to generate thumbnail for file id=%s at %s: %v", fileID, timestamp, err) http.Redirect(w, r, redirectBase+"?error="+url.QueryEscape("Failed to generate thumbnail: "+err.Error()), http.StatusSeeOther) return } diff --git a/include-admin.go b/include-admin.go @@ -4,6 +4,7 @@ import ( "database/sql" "fmt" "io" + "log" "net/http" "os" "path/filepath" @@ -50,10 +51,16 @@ func validateConfig(newConfig Config) error { func adminHandler(w http.ResponseWriter, r *http.Request) { // Get orphaned files - orphanData, _ := getOrphanedFiles(config.UploadDir) + orphanData, err := getOrphanedFiles(config.UploadDir) + if err != nil { + log.Printf("Warning: adminHandler: failed to get orphaned files: %v", err) + } // Get video files for thumbnails - missingThumbnails, _ := getMissingThumbnailVideos() + missingThumbnails, err := getMissingThumbnailVideos() + if err != nil { + log.Printf("Warning: adminHandler: failed to get missing thumbnails: %v", err) + } switch r.Method { case http.MethodPost: @@ -63,13 +70,19 @@ func adminHandler(w http.ResponseWriter, r *http.Request) { case "backup": err := backupDatabase(config.DatabasePath) + if err != nil { + log.Printf("Error: adminHandler: database backup failed: %v", err) + } data := currentAdminState(r, orphanData, missingThumbnails) data.Error = errorString(err) data.Success = successString(err, "Database backup created successfully!") renderAdminPage(w, r, data) case "vacuum": - err := vacuumDatabase(config.DatabasePath) + err := vacuumDatabase() + if err != nil { + log.Printf("Error: adminHandler: database vacuum failed: %v", err) + } data := currentAdminState(r, orphanData, missingThumbnails) data.Error = errorString(err) data.Success = successString(err, "Database vacuum completed successfully!") @@ -107,6 +120,8 @@ func parseAliasesFromForm(r *http.Request) []TagAliasGroup { } if len(aliases) >= 2 { groups = append(groups, TagAliasGroup{Category: category, Aliases: aliases}) + } else { + log.Printf("Warning: parseAliasesFromForm: alias group for category %q has fewer than 2 aliases (%d) and was discarded", category, len(aliases)) } } return groups @@ -136,6 +151,7 @@ func handleSaveAliases(w http.ResponseWriter, r *http.Request, orphanData Orphan config.TagAliases = parseAliasesFromForm(r) if err := SaveConfig(db, config); err != nil { + log.Printf("Error: handleSaveAliases: failed to save configuration: %v", err) data := currentAdminState(r, orphanData, missingThumbnails) data.Error = "Failed to save configuration: " + err.Error() renderAdminPage(w, r, data) @@ -162,6 +178,7 @@ func handleSaveSettings(w http.ResponseWriter, r *http.Request, orphanData Orpha config = newConfig if err := SaveConfig(db, config); err != nil { + log.Printf("Error: handleSaveSettings: failed to save configuration: %v", err) data := currentAdminState(r, orphanData, missingThumbnails) data.Error = "Failed to save configuration: " + err.Error() renderAdminPage(w, r, data) @@ -185,6 +202,7 @@ func handleSaveSedRules(w http.ResponseWriter, r *http.Request, orphanData Orpha config.SedRules = rules if err := SaveConfig(db, config); err != nil { + log.Printf("Error: handleSaveSedRules: failed to save configuration: %v", err) data := currentAdminState(r, orphanData, missingThumbnails) data.Error = "Failed to save configuration: " + err.Error() renderAdminPage(w, r, data) @@ -226,6 +244,7 @@ func backupDatabase(dbPath string) error { return fmt.Errorf("failed to copy database: %w", err) } + log.Printf("Info: backupDatabase: backup written to %s", backupPath) return nil } diff --git a/include-bulk.go b/include-bulk.go @@ -3,6 +3,7 @@ package main import ( "database/sql" "fmt" + "log" "net/http" "strconv" "strings" @@ -84,7 +85,10 @@ func applyBulkTagOperations(fileIDs []int, category, value, operation string) er } func getBulkTagFormData() BulkTagFormData { - catRows, _ := db.Query("SELECT name FROM categories ORDER BY name") + catRows, err := db.Query("SELECT name FROM categories ORDER BY name") + if err != nil { + log.Printf("Error: getBulkTagFormData: failed to query categories: %v", err) + } var cats []string for catRows.Next() { var c string @@ -93,7 +97,10 @@ func getBulkTagFormData() BulkTagFormData { } catRows.Close() - recentRows, _ := db.Query("SELECT id, filename FROM files ORDER BY id DESC LIMIT 20") + recentRows, err := db.Query("SELECT id, filename FROM files ORDER BY id DESC LIMIT 20") + if err != nil { + log.Printf("Error: getBulkTagFormData: failed to query recent files: %v", err) + } var recentFiles []File for recentRows.Next() { var f File diff --git a/include-cbz.go b/include-cbz.go @@ -70,14 +70,14 @@ func generateCBZThumbnail(cbzPath, uploadDir, filename string) error { for _, f := range selectedFiles { rc, err := f.Open() if err != nil { - log.Printf("CBZ Thumbnail: Failed to open %s: %v", f.Name, err) + log.Printf("Warning: generateCBZThumbnail: failed to open %s: %v", f.Name, err) continue } img, _, err := image.Decode(rc) rc.Close() if err != nil { - log.Printf("CBZ Thumbnail: Failed to decode %s: %v", f.Name, err) + log.Printf("Warning: generateCBZThumbnail: failed to decode %s: %v", f.Name, err) continue } images = append(images, img) @@ -293,6 +293,7 @@ func cbzViewerHandler(w http.ResponseWriter, r *http.Request) { err := db.QueryRow("SELECT id, filename, path, COALESCE(description, '') FROM files WHERE id = ?", fileID). Scan(&f.ID, &f.Filename, &f.Path, &f.Description) if err != nil { + log.Printf("Error: cbzViewerHandler: file not found for id=%s: %v", fileID, err) renderError(w, "File not found", http.StatusNotFound) return } @@ -305,6 +306,7 @@ func cbzViewerHandler(w http.ResponseWriter, r *http.Request) { fmt.Sscanf(parts[2], "%d", &imageIndex) if err := serveCBZImage(w, cbzPath, imageIndex); err != nil { + log.Printf("Error: cbzViewerHandler: failed to serve image index %d from %s: %v", imageIndex, cbzPath, err) renderError(w, "Failed to serve image", http.StatusInternalServerError) } return @@ -313,6 +315,7 @@ func cbzViewerHandler(w http.ResponseWriter, r *http.Request) { // Get list of images images, err := getCBZImages(cbzPath) if err != nil { + log.Printf("Error: cbzViewerHandler: failed to read CBZ contents at %s: %v", cbzPath, err) renderError(w, "Failed to read CBZ contents", http.StatusInternalServerError) return } diff --git a/include-files.go b/include-files.go @@ -42,33 +42,39 @@ func fileDeleteHandler(w http.ResponseWriter, r *http.Request, parts []string) { var currentFile File err := db.QueryRow("SELECT id, filename, path FROM files WHERE id=?", fileID).Scan(&currentFile.ID, &currentFile.Filename, &currentFile.Path) if err != nil { + log.Printf("Error: fileDeleteHandler: file not found for id=%s: %v", fileID, err) renderError(w, "File not found", http.StatusNotFound) return } tx, err := db.Begin() if err != nil { + log.Printf("Error: fileDeleteHandler: failed to start transaction for file id=%s: %v", fileID, err) renderError(w, "Failed to start transaction", http.StatusInternalServerError) return } defer tx.Rollback() if _, err = tx.Exec("DELETE FROM file_tags WHERE file_id=?", fileID); err != nil { + log.Printf("Error: fileDeleteHandler: failed to delete file_tags for file id=%s: %v", fileID, err) renderError(w, "Failed to delete file tags", http.StatusInternalServerError) return } if _, err = tx.Exec("DELETE FROM file_properties WHERE file_id=?", fileID); err != nil { + log.Printf("Error: fileDeleteHandler: failed to delete file_properties for file id=%s: %v", fileID, err) renderError(w, "Failed to delete file properties", http.StatusInternalServerError) return } if _, err = tx.Exec("DELETE FROM files WHERE id=?", fileID); err != nil { + log.Printf("Error: fileDeleteHandler: failed to delete files record for file id=%s: %v", fileID, err) renderError(w, "Failed to delete file record", http.StatusInternalServerError) return } if err = tx.Commit(); err != nil { + log.Printf("Error: fileDeleteHandler: failed to commit transaction for file id=%s: %v", fileID, err) renderError(w, "Failed to commit transaction", http.StatusInternalServerError) return } @@ -81,7 +87,7 @@ func fileDeleteHandler(w http.ResponseWriter, r *http.Request, parts []string) { thumbPath := filepath.Join(config.UploadDir, "thumbnails", currentFile.Filename+".jpg") if _, err := os.Stat(thumbPath); err == nil { if err := os.Remove(thumbPath); err != nil { - log.Printf("Warning: Failed to delete thumbnail %s: %v", thumbPath, err) + log.Printf("Warning: fileDeleteHandler: failed to delete thumbnail %s: %v", thumbPath, err) } } @@ -105,6 +111,7 @@ func fileRenameHandler(w http.ResponseWriter, r *http.Request, parts []string) { var currentFilename, currentPath string err := db.QueryRow("SELECT filename, path FROM files WHERE id=?", fileID).Scan(&currentFilename, &currentPath) if err != nil { + log.Printf("Error: fileRenameHandler: file not found for id=%s: %v", fileID, err) renderError(w, "File not found", http.StatusNotFound) return } @@ -160,6 +167,7 @@ func checkFileConflictStrict(filename string) (string, string, int64, error) { if _, err := os.Stat(finalPath); err == nil { existingID, dbErr := getFileIDByName(filename) if dbErr != nil { + log.Printf("Warning: checkFileConflictStrict: file %s exists on disk but not in DB: %v", filename, dbErr) return "", "", 0, fmt.Errorf("a file with that name already exists") } return "", "", existingID, nil diff --git a/include-filters.go b/include-filters.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" "net/http" "net/url" "strings" @@ -11,7 +12,10 @@ func untaggedFilesHandler(w http.ResponseWriter, r *http.Request) { page := pageFromRequest(r) perPage := perPageFromConfig(50) - files, total, _ := getUntaggedFilesPaginated(page, perPage) + files, total, err := getUntaggedFilesPaginated(page, perPage) + if err != nil { + log.Printf("Error: untaggedFilesHandler: failed to get untagged files: %v", err) + } pageData := buildPageDataWithPagination("Untagged Files", files, page, total, perPage, r) renderTemplate(w, "untagged.html", pageData) } @@ -93,6 +97,7 @@ func tagFilterHandler(w http.ResponseWriter, r *http.Request) { // Handle preview mode files, err := getPreviewFiles(filters) if err != nil { + log.Printf("Error: tagFilterHandler: failed to fetch preview files: %v", err) renderError(w, "Failed to fetch preview files", http.StatusInternalServerError) return } @@ -155,6 +160,7 @@ func tagFilterHandler(w http.ResponseWriter, r *http.Request) { var total int err := db.QueryRow(countQuery, countArgs...).Scan(&total) if err != nil { + log.Printf("Error: tagFilterHandler: failed to count files: %v", err) renderError(w, "Failed to count files", http.StatusInternalServerError) return } @@ -203,6 +209,7 @@ func tagFilterHandler(w http.ResponseWriter, r *http.Request) { files, err := queryFilesWithTags(query, args...) if err != nil { + log.Printf("Error: tagFilterHandler: failed to fetch files: %v", err) renderError(w, "Failed to fetch files", http.StatusInternalServerError) return } diff --git a/include-general.go b/include-general.go @@ -1,6 +1,7 @@ package main import ( + "log" "net/http" "net/url" "strings" @@ -23,6 +24,7 @@ func renderError(w http.ResponseWriter, message string, statusCode int) { func renderTemplate(w http.ResponseWriter, tmplName string, data PageData) { if err := tmpl.ExecuteTemplate(w, tmplName, data); err != nil { + log.Printf("Error: renderTemplate: failed to execute template %s: %v", tmplName, err) renderError(w, "Template rendering failed", http.StatusInternalServerError) } } diff --git a/include-notes.go b/include-notes.go @@ -231,8 +231,8 @@ func CountLines(content string) int { func notesViewHandler(w http.ResponseWriter, r *http.Request) { content, err := GetNotes(db) if err != nil { + log.Printf("Error: notesViewHandler: failed to load notes: %v", err) http.Error(w, "Failed to load notes", http.StatusInternalServerError) - log.Printf("Error loading notes: %v", err) return } @@ -254,8 +254,8 @@ func notesViewHandler(w http.ResponseWriter, r *http.Request) { pageData := buildPageData("Notes", notesData) if err := tmpl.ExecuteTemplate(w, "notes.html", pageData); err != nil { + log.Printf("Error: notesViewHandler: template error: %v", err) http.Error(w, "Template error", http.StatusInternalServerError) - log.Printf("Template error: %v", err) } } @@ -270,8 +270,8 @@ func notesSaveHandler(w http.ResponseWriter, r *http.Request) { // Process (deduplicate and sort) before saving if err := SaveNotes(db, content); err != nil { + log.Printf("Error: notesSaveHandler: failed to save notes: %v", err) http.Error(w, "Failed to save notes", http.StatusInternalServerError) - log.Printf("Error saving notes: %v", err) return } @@ -287,6 +287,7 @@ func notesSaveHandler(w http.ResponseWriter, r *http.Request) { func notesFilterHandler(w http.ResponseWriter, r *http.Request) { content, err := GetNotes(db) if err != nil { + log.Printf("Error: notesFilterHandler: failed to load notes: %v", err) http.Error(w, "Failed to load notes", http.StatusInternalServerError) return } @@ -312,6 +313,7 @@ func notesFilterHandler(w http.ResponseWriter, r *http.Request) { func notesStatsHandler(w http.ResponseWriter, r *http.Request) { content, err := GetNotes(db) if err != nil { + log.Printf("Error: notesStatsHandler: failed to load notes: %v", err) http.Error(w, "Failed to load notes", http.StatusInternalServerError) return } @@ -324,10 +326,10 @@ func notesStatsHandler(w http.ResponseWriter, r *http.Request) { // notesApplySedHandler applies a sed rule to the notes func notesApplySedHandler(w http.ResponseWriter, r *http.Request) { - log.Printf("notesApplySedHandler called - Method: %s, Path: %s", r.Method, r.URL.Path) + log.Printf("Info: notesApplySedHandler called - Method: %s, Path: %s", r.Method, r.URL.Path) if r.Method != http.MethodPost { - log.Printf("Wrong method: %s", r.Method) + log.Printf("Warning: notesApplySedHandler: wrong method: %s", r.Method) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusMethodNotAllowed) json.NewEncoder(w).Encode(map[string]interface{}{ @@ -339,11 +341,11 @@ func notesApplySedHandler(w http.ResponseWriter, r *http.Request) { content := r.FormValue("content") ruleIndexStr := r.FormValue("rule_index") - log.Printf("Received: content length=%d, rule_index=%s", len(content), ruleIndexStr) + log.Printf("Info: notesApplySedHandler: content length=%d, rule_index=%s", len(content), ruleIndexStr) ruleIndex, err := strconv.Atoi(ruleIndexStr) if err != nil || ruleIndex < 0 || ruleIndex >= len(config.SedRules) { - log.Printf("Invalid rule index: %s (error: %v, len(rules)=%d)", ruleIndexStr, err, len(config.SedRules)) + log.Printf("Warning: notesApplySedHandler: invalid rule index: %s (error: %v, len(rules)=%d)", ruleIndexStr, err, len(config.SedRules)) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusBadRequest) json.NewEncoder(w).Encode(map[string]interface{}{ @@ -354,10 +356,10 @@ func notesApplySedHandler(w http.ResponseWriter, r *http.Request) { } rule := config.SedRules[ruleIndex] - log.Printf("Applying rule: %s (command: %s)", rule.Name, rule.Command) + log.Printf("Info: notesApplySedHandler: applying rule: %s (command: %s)", rule.Name, rule.Command) result, err := ApplySedRule(content, rule.Command) if err != nil { - log.Printf("Sed rule error: %v", err) + log.Printf("Error: notesApplySedHandler: sed rule error: %v", err) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusInternalServerError) json.NewEncoder(w).Encode(map[string]interface{}{ @@ -374,7 +376,7 @@ func notesApplySedHandler(w http.ResponseWriter, r *http.Request) { "content": result, "stats": GetNoteStats(result), } - log.Printf("Sed rule success, returning %d bytes", len(result)) + log.Printf("Info: notesApplySedHandler: sed rule success, returning %d bytes", len(result)) json.NewEncoder(w).Encode(response) } @@ -403,6 +405,7 @@ func notesPreviewHandler(w http.ResponseWriter, r *http.Request) { func notesExportHandler(w http.ResponseWriter, r *http.Request) { content, err := GetNotes(db) if err != nil { + log.Printf("Error: notesExportHandler: failed to load notes: %v", err) http.Error(w, "Failed to load notes", http.StatusInternalServerError) return } @@ -421,6 +424,7 @@ func notesImportHandler(w http.ResponseWriter, r *http.Request) { file, _, err := r.FormFile("file") if err != nil { + log.Printf("Warning: notesImportHandler: failed to read uploaded file: %v", err) http.Error(w, "Failed to read file", http.StatusBadRequest) return } @@ -429,6 +433,7 @@ func notesImportHandler(w http.ResponseWriter, r *http.Request) { // Read file content buf := new(strings.Builder) if _, err := io.Copy(buf, file); err != nil { + log.Printf("Error: notesImportHandler: failed to read file content: %v", err) http.Error(w, "Failed to read file", http.StatusInternalServerError) return } @@ -440,12 +445,16 @@ func notesImportHandler(w http.ResponseWriter, r *http.Request) { if mergeMode { // Merge with existing content - existingContent, _ := GetNotes(db) + existingContent, err := GetNotes(db) + if err != nil { + log.Printf("Warning: notesImportHandler: failed to load existing notes for merge: %v", err) + } content = existingContent + "\n" + content } // Save (will auto-process) if err := SaveNotes(db, content); err != nil { + log.Printf("Error: notesImportHandler: failed to save imported notes: %v", err) http.Error(w, "Failed to save notes", http.StatusInternalServerError) return } diff --git a/include-viewer.go b/include-viewer.go @@ -4,6 +4,7 @@ import ( "database/sql" "fmt" "html" + "log" "net" "net/http" "net/url" @@ -43,6 +44,7 @@ func fileHandler(w http.ResponseWriter, r *http.Request) { var f File err := db.QueryRow("SELECT id, filename, path, COALESCE(description, '') as description FROM files WHERE id=?", idStr).Scan(&f.ID, &f.Filename, &f.Path, &f.Description) if err != nil { + log.Printf("Error: fileHandler: file not found for id=%s: %v", idStr, err) renderError(w, "File not found", http.StatusNotFound) return } @@ -69,6 +71,7 @@ func fileHandler(w http.ResponseWriter, r *http.Request) { } if _, err := db.Exec("UPDATE files SET description = ? WHERE id = ?", description, f.ID); err != nil { + log.Printf("Error: fileHandler: failed to update description for file id=%d: %v", f.ID, err) renderError(w, "Failed to update description", http.StatusInternalServerError) return } @@ -106,13 +109,16 @@ func fileHandler(w http.ResponseWriter, r *http.Request) { return } - catRows, _ := db.Query(` + catRows, err := db.Query(` SELECT DISTINCT c.name FROM categories c JOIN tags t ON t.category_id = c.id JOIN file_tags ft ON ft.tag_id = t.id ORDER BY c.name `) + if err != nil { + log.Printf("Warning: fileHandler: failed to query categories for file id=%d: %v", f.ID, err) + } var cats []string for catRows.Next() { var c string @@ -121,11 +127,14 @@ func fileHandler(w http.ResponseWriter, r *http.Request) { } catRows.Close() - propRows, _ := db.Query(` + propRows, err := db.Query(` SELECT key, value FROM file_properties WHERE file_id = ? ORDER BY key, value `, f.ID) + if err != nil { + log.Printf("Warning: fileHandler: failed to query properties for file id=%d: %v", f.ID, err) + } fileProps := make(map[string]string) for propRows.Next() { var k, v string @@ -146,7 +155,10 @@ func fileHandler(w http.ResponseWriter, r *http.Request) { func buildPageDataWithIP(title string, data interface{}) PageData { pageData := buildPageData(title, data) - ip, _ := getLocalIP() + ip, err := getLocalIP() + if err != nil { + log.Printf("Warning: buildPageDataWithIP: could not determine local IP: %v", err) + } pageData.IP = ip pageData.Port = strings.TrimPrefix(config.ServerPort, ":") return pageData