mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-02-18 23:41:48 +01:00
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
79 lines
4.2 KiB
Go
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("╚═══════════════════════════════════════════════════════════════════════╝")
|
|
}
|