network/pkg/ipfs/cluster_util.go
anonpenguin23 b3b1905fb2 feat: refactor API gateway and CLI utilities for improved functionality
- Updated the API gateway documentation to reflect changes in architecture and functionality, emphasizing its role as a multi-functional entry point for decentralized services.
- Refactored CLI commands to utilize utility functions for better code organization and maintainability.
- Introduced new utility functions for handling peer normalization, service management, and port validation, enhancing the overall CLI experience.
- Added a new production installation script to streamline the setup process for users, including detailed dry-run summaries for better visibility.
- Enhanced validation mechanisms for configuration files and swarm keys, ensuring robust error handling and user feedback during setup.
2025-12-31 10:16:26 +02:00

120 lines
2.3 KiB
Go

package ipfs
import (
"crypto/rand"
"encoding/hex"
"fmt"
"net"
"net/http"
"net/url"
"os"
"strings"
"time"
)
func loadOrGenerateClusterSecret(path string) (string, error) {
if data, err := os.ReadFile(path); err == nil {
secret := strings.TrimSpace(string(data))
if len(secret) == 64 {
return secret, nil
}
}
secret, err := generateRandomSecret()
if err != nil {
return "", err
}
_ = os.WriteFile(path, []byte(secret), 0600)
return secret, nil
}
func generateRandomSecret() (string, error) {
bytes := make([]byte, 32)
if _, err := rand.Read(bytes); err != nil {
return "", err
}
return hex.EncodeToString(bytes), nil
}
func parseClusterPorts(rawURL string) (int, int, error) {
if !strings.HasPrefix(rawURL, "http") {
rawURL = "http://" + rawURL
}
u, err := url.Parse(rawURL)
if err != nil {
return 9096, 9094, nil
}
_, portStr, err := net.SplitHostPort(u.Host)
if err != nil {
return 9096, 9094, nil
}
var port int
fmt.Sscanf(portStr, "%d", &port)
if port == 0 {
return 9096, 9094, nil
}
return port + 2, port, nil
}
func parseIPFSPort(rawURL string) (int, error) {
if !strings.HasPrefix(rawURL, "http") {
rawURL = "http://" + rawURL
}
u, err := url.Parse(rawURL)
if err != nil {
return 5001, nil
}
_, portStr, err := net.SplitHostPort(u.Host)
if err != nil {
return 5001, nil
}
var port int
fmt.Sscanf(portStr, "%d", &port)
if port == 0 {
return 5001, nil
}
return port, nil
}
func parsePeerHostAndPort(multiaddr string) (string, int) {
parts := strings.Split(multiaddr, "/")
var hostStr string
var port int
for i, part := range parts {
if part == "ip4" || part == "dns" || part == "dns4" {
hostStr = parts[i+1]
} else if part == "tcp" {
fmt.Sscanf(parts[i+1], "%d", &port)
}
}
return hostStr, port
}
func extractIPFromMultiaddrForCluster(maddr string) string {
parts := strings.Split(maddr, "/")
for i, part := range parts {
if (part == "ip4" || part == "dns" || part == "dns4") && i+1 < len(parts) {
return parts[i+1]
}
}
return ""
}
func extractDomainFromMultiaddr(maddr string) string {
parts := strings.Split(maddr, "/")
for i, part := range parts {
if (part == "dns" || part == "dns4" || part == "dns6") && i+1 < len(parts) {
return parts[i+1]
}
}
return ""
}
func newStandardHTTPClient() *http.Client {
return &http.Client{
Timeout: 10 * time.Second,
}
}