Files
Pulse/cmd/pulse/bootstrap.go
rcourtman b29a830046 Fix bootstrap-token command to use correct env var and default path
The bootstrap-token CLI command had two bugs:
1. Used PULSE_DATA_PATH instead of PULSE_DATA_DIR (typo)
2. Used /var/lib/pulse as fallback instead of /etc/pulse

This caused the command to look in the wrong location for non-Docker
deployments. Fixed to match config.Load() logic:
- Check PULSE_DATA_DIR env var first
- Fall back to /data for Docker, /etc/pulse otherwise
2025-11-09 23:46:41 +00:00

79 lines
4.2 KiB
Go

package main
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/spf13/cobra"
)
var bootstrapTokenCmd = &cobra.Command{
Use: "bootstrap-token",
Short: "Display the bootstrap setup token",
Long: `Display the bootstrap setup token required for first-time setup.
This token is generated on first boot and must be entered in the web UI
to unlock the initial setup wizard. The token is automatically deleted
after successful setup completion.`,
Run: func(cmd *cobra.Command, args []string) {
showBootstrapToken()
},
}
func showBootstrapToken() {
// Determine data path (same logic as main server)
dataPath := os.Getenv("PULSE_DATA_DIR")
if dataPath == "" {
if os.Getenv("PULSE_DOCKER") == "true" {
dataPath = "/data"
} else {
dataPath = "/etc/pulse"
}
}
tokenPath := filepath.Join(dataPath, ".bootstrap_token")
// Read token file
data, err := os.ReadFile(tokenPath)
if err != nil {
if os.IsNotExist(err) {
fmt.Println("╔═══════════════════════════════════════════════════════════════════════╗")
fmt.Println("║ NO BOOTSTRAP TOKEN FOUND ║")
fmt.Println("╠═══════════════════════════════════════════════════════════════════════╣")
fmt.Println("║ Possible reasons: ║")
fmt.Println("║ • Initial setup has already been completed ║")
fmt.Println("║ • Authentication is configured (token auto-deleted) ║")
fmt.Println("║ • Server hasn't started yet (token not generated) ║")
fmt.Printf("║ • Token file not found: %-44s║\n", tokenPath)
fmt.Println("╚═══════════════════════════════════════════════════════════════════════╝")
os.Exit(1)
}
fmt.Printf("Error reading bootstrap token: %v\n", err)
os.Exit(1)
}
token := strings.TrimSpace(string(data))
if token == "" {
fmt.Println("Error: Bootstrap token file is empty")
os.Exit(1)
}
// Display token prominently
fmt.Println("╔═══════════════════════════════════════════════════════════════════════╗")
fmt.Println("║ BOOTSTRAP TOKEN FOR FIRST-TIME SETUP ║")
fmt.Println("╠═══════════════════════════════════════════════════════════════════════╣")
fmt.Printf("║ Token: %-61s ║\n", token)
fmt.Printf("║ File: %-61s ║\n", tokenPath)
fmt.Println("╠═══════════════════════════════════════════════════════════════════════╣")
fmt.Println("║ Instructions: ║")
fmt.Println("║ 1. Copy the token above ║")
fmt.Println("║ 2. Open Pulse in your web browser ║")
fmt.Println("║ 3. Paste the token into the unlock screen ║")
fmt.Println("║ 4. Complete the admin account setup ║")
fmt.Println("║ ║")
fmt.Println("║ This token will be automatically deleted after successful setup. ║")
fmt.Println("╚═══════════════════════════════════════════════════════════════════════╝")
}