fixed logs and config locations, updated connection closure handling
This commit is contained in:
@@ -1,8 +1,6 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"homestead/homestead_gateway/ws"
|
||||
)
|
||||
import "homestead/homestead_gateway/ws"
|
||||
|
||||
type GatewayController struct {
|
||||
Websocket *ws.WebsocketGateway
|
||||
|
||||
13
main.go
13
main.go
@@ -3,11 +3,20 @@ package main
|
||||
import (
|
||||
"flag"
|
||||
"homestead/homestead_gateway/controller"
|
||||
"homestead/homestead_gateway/util"
|
||||
"homestead/homestead_gateway/util/config"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cfgPath := flag.String("config", "config.toml", "configuration file")
|
||||
dir := util.GetPath()
|
||||
if dir == "" {
|
||||
dir, _ = os.Getwd()
|
||||
}
|
||||
|
||||
file := path.Join(dir, "config.toml")
|
||||
cfgPath := flag.String("config", file, "configuration file")
|
||||
cfg, err := config.LoadConfig(*cfgPath)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
@@ -19,3 +28,5 @@ func main() {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
|
||||
// todo logs from exe not cwd
|
||||
|
||||
2
sim.go
2
sim.go
@@ -23,7 +23,7 @@ const (
|
||||
apiKey = "gateway"
|
||||
serverID = "test-server-001"
|
||||
// THE CHANNEL ID the mod says it serves. Must match gateway expectation.
|
||||
channelID = "123456789"
|
||||
channelID = "1444253682777587804"
|
||||
)
|
||||
|
||||
// send interval range (random between minInterval and maxInterval)
|
||||
|
||||
@@ -3,6 +3,7 @@ package logger
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"homestead/homestead_gateway/util"
|
||||
"homestead/homestead_gateway/util/config"
|
||||
"log/slog"
|
||||
"os"
|
||||
@@ -23,6 +24,7 @@ func New(id string, cfg config.LogConfig) (*slog.Logger, func() error, error) {
|
||||
cfg.Rotation = 7
|
||||
}
|
||||
|
||||
cfg.Directory = util.NormalizeLogPath(cfg.Directory)
|
||||
console := slog.NewTextHandler(&prefixWriter{inner: os.Stderr, prefix: []byte("[" + id + "] "), startLine: true}, &slog.HandlerOptions{AddSource: true, Level: cfg.Level})
|
||||
router := newFileRouter(cfg.Directory, cfg.Rotation, id)
|
||||
root := slogmulti.Fanout(console, router)
|
||||
|
||||
51
util/util.go
Normal file
51
util/util.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package util
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
func GetPath() string {
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
|
||||
exe, err = filepath.EvalSymlinks(exe)
|
||||
if err != nil {
|
||||
}
|
||||
|
||||
return filepath.Dir(exe)
|
||||
}
|
||||
|
||||
func NormalizePath(path string) string {
|
||||
return filepath.Clean(filepath.FromSlash(path))
|
||||
}
|
||||
|
||||
func NormalizeLogPath(path string) string {
|
||||
if filepath.IsAbs(path) {
|
||||
return path
|
||||
}
|
||||
|
||||
return NormalizePath(filepath.Join(GetPath(), path))
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
func CloseConnWithControlMessage(conn *websocket.Conn, typ int, text string) {
|
||||
_ = conn.SetWriteDeadline(time.Now().Add(time.Second))
|
||||
_ = conn.WriteControl(
|
||||
typ, websocket.FormatCloseMessage(typ, text), time.Now().Add(time.Second),
|
||||
)
|
||||
_ = conn.Close()
|
||||
}
|
||||
|
||||
func CloseConn(conn *websocket.Conn) {
|
||||
CloseConnWithControlMessage(
|
||||
conn, websocket.CloseNormalClosure,
|
||||
"Disconnecting.",
|
||||
)
|
||||
}
|
||||
@@ -2,6 +2,7 @@ package ws
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"homestead/homestead_gateway/util"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
@@ -92,8 +93,7 @@ func (r *Registry) RegisterMod(channelID, serverID string, conn *websocket.Conn)
|
||||
defer e.mu.Unlock()
|
||||
|
||||
if e.Mod != nil && e.Mod.Conn != nil {
|
||||
|
||||
_ = e.Mod.Conn.Close()
|
||||
util.CloseConn(e.Mod.Conn)
|
||||
}
|
||||
|
||||
e.Mod = &ConnWrapper{Conn: conn, ServerID: serverID, LastSeen: time.Now()}
|
||||
@@ -106,7 +106,7 @@ func (r *Registry) RegisterBot(conn *websocket.Conn) {
|
||||
r.botMu.Lock()
|
||||
|
||||
if r.bot != nil && r.bot.Conn != nil {
|
||||
_ = r.bot.Conn.Close()
|
||||
r.UnregisterBot()
|
||||
}
|
||||
|
||||
r.bot = &ConnWrapper{Conn: conn, LastSeen: time.Now()}
|
||||
@@ -127,7 +127,7 @@ func (r *Registry) UnregisterMod(channelID string) {
|
||||
e.mu.Unlock()
|
||||
|
||||
if modConn != nil && modConn.Conn != nil {
|
||||
closeConn(modConn.Conn)
|
||||
util.CloseConn(modConn.Conn)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -138,7 +138,7 @@ func (r *Registry) UnregisterBot() {
|
||||
r.botMu.Unlock()
|
||||
|
||||
if botConn != nil && botConn.Conn != nil {
|
||||
closeConn(botConn.Conn)
|
||||
util.CloseConn(botConn.Conn)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -152,7 +152,6 @@ func (r *Registry) Send(channelID string, out GatewayMessageOut, sendOverConn fu
|
||||
if err := sendOverConn(b.Conn, out); err == nil {
|
||||
return true, false, nil
|
||||
}
|
||||
_ = b.Conn.Close()
|
||||
r.UnregisterBot()
|
||||
}
|
||||
|
||||
@@ -176,7 +175,6 @@ func (r *Registry) Send(channelID string, out GatewayMessageOut, sendOverConn fu
|
||||
if err := sendOverConn(mod.Conn, out); err == nil {
|
||||
return true, false, nil
|
||||
}
|
||||
_ = mod.Conn.Close()
|
||||
r.UnregisterMod(channelID)
|
||||
}
|
||||
|
||||
|
||||
15
ws/util.go
15
ws/util.go
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"homestead/homestead_gateway/util"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
@@ -55,7 +56,7 @@ func (wsg *WebsocketGateway) sendWebsocketError(conn *websocket.Conn, message st
|
||||
_ = conn.SetWriteDeadline(time.Now().Add(5 * time.Second))
|
||||
_ = conn.WriteJSON(map[string]interface{}{"message": message, "code": code})
|
||||
if close {
|
||||
_ = conn.Close()
|
||||
util.CloseConn(conn)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +65,7 @@ func (wsg *WebsocketGateway) sendWebsocketResponse(conn *websocket.Conn, content
|
||||
|
||||
if err := conn.WriteJSON(content); err != nil {
|
||||
wsg.logger.Error("Failed to respond to connection.", "remote", conn.RemoteAddr().String(), "err", err)
|
||||
_ = conn.Close()
|
||||
util.CloseConnWithControlMessage(conn, websocket.CloseAbnormalClosure, "Connection error.")
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -108,16 +109,6 @@ func (wsg *WebsocketGateway) loggingMiddleware(next http.Handler) http.Handler {
|
||||
|
||||
// connections
|
||||
|
||||
func closeConn(conn *websocket.Conn) {
|
||||
_ = conn.SetWriteDeadline(time.Now().Add(time.Second))
|
||||
_ = conn.WriteControl(
|
||||
websocket.CloseMessage,
|
||||
websocket.FormatCloseMessage(websocket.CloseNormalClosure, "Disconnecting."),
|
||||
time.Now().Add(time.Second),
|
||||
)
|
||||
_ = conn.Close()
|
||||
}
|
||||
|
||||
func (wsg *WebsocketGateway) registerConn(conn *websocket.Conn, typ, channelId, serverId string) bool {
|
||||
if typ == "bot" {
|
||||
wsg.registry.botMu.Lock()
|
||||
|
||||
Reference in New Issue
Block a user