dsfx/cmd/dsfxnode/main.go

103 lines
2.6 KiB
Go
Raw Normal View History

2025-03-08 15:07:27 -05:00
package main
import (
"context"
"flag"
"fmt"
"log/slog"
"net"
"os"
2025-03-09 15:52:33 -04:00
"koti.casa/numenor-labs/dsfx/pkg/crypto/identity"
"koti.casa/numenor-labs/dsfx/pkg/logging"
"koti.casa/numenor-labs/dsfx/pkg/network"
2025-03-08 15:07:27 -05:00
)
var (
2025-03-09 12:35:32 -04:00
flagHost = flag.String("host", "localhost", "the host to listen on")
flagPort = flag.Int("port", 8000, "the port to listen on")
flagKey = flag.String("key", "", "the path to the key file")
2025-03-08 15:07:27 -05:00
)
func main() {
ctx := context.Background()
// ---------------------------------------------------------------------------
// Logger
opts := &slog.HandlerOptions{
AddSource: false,
Level: slog.LevelDebug,
}
logger := slog.New(slog.NewTextHandler(os.Stdout, opts))
// Everything in the application will attempt to use the logger in stored in
// the context, but we also set the default with slog as a fallback. In cases
// where the context is not available, or the context is not a child of the
// context with the logger, the default logger will be used.
slog.SetDefault(logger)
2025-03-09 15:52:33 -04:00
ctx = logging.WithContext(ctx, logger)
2025-03-08 15:07:27 -05:00
// ---------------------------------------------------------------------------
// Flags
flag.Parse()
2025-03-09 12:35:32 -04:00
if *flagKey == "" {
2025-03-08 15:07:27 -05:00
slog.ErrorContext(ctx, "master key path is required")
os.Exit(1)
}
2025-03-09 15:52:33 -04:00
masterKey, err := identity.LoadSigningKeyFromFile(*flagKey)
2025-03-08 15:07:27 -05:00
if err != nil {
logger.ErrorContext(ctx, "failed to load master key", slog.Any("error", err))
os.Exit(1)
}
2025-03-09 12:33:27 -04:00
tcpAddrRaw := net.JoinHostPort(*flagHost, fmt.Sprint(*flagPort))
tcpAddr, err := net.ResolveTCPAddr("tcp", tcpAddrRaw)
if err != nil {
slog.ErrorContext(ctx, "invalid host or port")
os.Exit(1)
}
2025-03-10 10:29:54 -04:00
addr := network.FromTCPAddr(tcpAddr, identity.ToPublicKey(masterKey))
2025-03-09 12:33:27 -04:00
2025-03-08 15:07:27 -05:00
// ---------------------------------------------------------------------------
// Listener
2025-03-09 15:52:33 -04:00
listener, err := network.Listen(ctx, masterKey, addr)
2025-03-08 15:07:27 -05:00
if err != nil {
logger.ErrorContext(ctx, "listener error", slog.Any("error", err))
os.Exit(1)
}
logger.InfoContext(ctx, "listener created", slog.String("address", listener.Addr().String()))
for {
conn, err := listener.Accept()
if err != nil {
logger.ErrorContext(ctx, "accept failure", slog.Any("error", err))
continue
}
go handleConnection(ctx, conn)
}
}
func handleConnection(ctx context.Context, conn net.Conn) error {
defer conn.Close()
2025-03-09 15:52:33 -04:00
logger := logging.FromContext(ctx)
2025-03-08 15:07:27 -05:00
msg := make([]byte, 1024)
n, err := conn.Read(msg)
if err != nil {
logger.ErrorContext(ctx, "failed to read from connection", slog.Any("error", err))
return err
}
logger.InfoContext(ctx, "received msg", slog.Int("bytes", n))
return nil
}