From a6d2c9dfad24257a7685ec074839f6b227c29ced Mon Sep 17 00:00:00 2001 From: uan Date: Fri, 22 Aug 2025 17:41:16 +0200 Subject: [PATCH] first ipc implementation --- go.mod | 8 +------- go.work | 2 ++ main.go | 13 ++++++++++++- miniws/go.mod | 7 ++++++- miniws/go.sum | 4 ++++ miniws/webserver.go | 22 ++++++++++++++++++++++ 6 files changed, 47 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 27a2403..2cd4a32 100644 --- a/go.mod +++ b/go.mod @@ -1,11 +1,5 @@ -module github.com/shlldev/miniws +module main go 1.24.5 require github.com/akamensky/argparse v1.4.0 - -require ( - github.com/google/uuid v1.6.0 // indirect - github.com/wneessen/go-fileperm v0.2.1 // indirect - golang.org/x/sys v0.35.0 // indirect -) diff --git a/go.work b/go.work index dfca84e..46aa043 100644 --- a/go.work +++ b/go.work @@ -3,4 +3,6 @@ go 1.24.5 use ( . ./miniws + ./miniws/sockets + ./miniws/sockets/logplus ) \ No newline at end of file diff --git a/main.go b/main.go index 5bf0e05..1ad8296 100644 --- a/main.go +++ b/main.go @@ -3,9 +3,11 @@ package main import ( "fmt" "os" + "sockets" + + "miniws" "github.com/akamensky/argparse" - "github.com/shlldev/miniws/miniws" ) const ( @@ -14,11 +16,13 @@ const ( HELP_CONFIGFOLDER string = "the configurations folder" HELP_WWWFOLDER string = "the www folder where miniws will look for files to serve" HELP_MAXLOGBYTES string = "the maximum bytes after which the log files get split" + HELP_SIGNAL string = "runs the executable in command mode, meaning it will just send a command to the already running miniws server" ) func main() { parser := argparse.NewParser("miniws", "") + signal := parser.String("s", "signal", &argparse.Options{Default: "", Help: HELP_SIGNAL}) port := parser.Int("p", "port", &argparse.Options{Default: 8040, Help: HELP_PORT}) logFolder := parser.String("l", "logs-folder", &argparse.Options{Default: "logs", Help: HELP_LOGFOLDER}) configFolder := parser.String("c", "config-folder", &argparse.Options{Default: "config", Help: HELP_CONFIGFOLDER}) @@ -33,6 +37,13 @@ func main() { return } + if *signal != "" { + client := sockets.Client{} + client.OneShotWrite("unix", miniws.SOCKET_PATH, []byte(*signal)) + return + } + webserver := miniws.NewWebServer(*port, *logFolder, *configFolder, *wwwFolder, int64(*maxLogBytes)) webserver.Run() + } diff --git a/miniws/go.mod b/miniws/go.mod index 22a0144..62af72d 100644 --- a/miniws/go.mod +++ b/miniws/go.mod @@ -1,3 +1,8 @@ -module github.com/shlldev/miniws/miniws +module miniws go 1.22.2 + +require ( + github.com/google/uuid v1.6.0 + github.com/wneessen/go-fileperm v0.2.1 +) diff --git a/miniws/go.sum b/miniws/go.sum index e69de29..8ff9f9c 100644 --- a/miniws/go.sum +++ b/miniws/go.sum @@ -0,0 +1,4 @@ +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/wneessen/go-fileperm v0.2.1 h1:VNZT41b8HJDY5zUw4TbwPtfU1DuxZ3lcGH4dXlaZKis= +github.com/wneessen/go-fileperm v0.2.1/go.mod h1:Isv0pfQJstXAlmGGJjLGqCK0Z6d1ehbbrsO2xmTRsKs= diff --git a/miniws/webserver.go b/miniws/webserver.go index f3ac1fc..be01de7 100644 --- a/miniws/webserver.go +++ b/miniws/webserver.go @@ -1,6 +1,7 @@ package miniws import ( + "bytes" "errors" "log" "mime" @@ -8,6 +9,7 @@ import ( "os" "path/filepath" "slices" + "sockets" "strconv" "strings" "time" @@ -18,6 +20,8 @@ import ( const ( FILTER_MODE_WHITELIST FilterMode = 0 FILTER_MODE_BLACKLIST FilterMode = 1 + + SOCKET_PATH string = "/tmp/miniws_commands_server" ) type FilterMode int @@ -66,13 +70,31 @@ func (ws *WebServer) Run() { ws.ipFilterMode, ws.ipFilter = ws.parseFilterPanics(FILENAME_IPFILTER) ws.userAgentFilterMode, ws.userAgentFilter = ws.parseFilterPanics(FILENAME_USERAGENTFILTER) + socketserver := sockets.Server{} + go socketserver.Start(ws.recvBind, "unix", SOCKET_PATH) + http.HandleFunc("/", ws.get) log.Println("Server started on port " + strconv.Itoa(ws.port)) http.ListenAndServe(":"+strconv.Itoa(ws.port), nil) } +func (ws *WebServer) recvBind(command string, arguments []string) byte { + command = string(bytes.Trim([]byte(command), "\x00")) + switch command { + case "reload": + ws.parseFilterPanics(FILENAME_IPFILTER) + ws.parseFilterPanics(FILENAME_USERAGENTFILTER) + return byte(1) + default: + log.Println("Error: unknown command", command, arguments) + return byte(0) + } +} + func (ws *WebServer) parseFilterPanics(fileName string) (FilterMode, []string) { + log.Println("loaded filter: ", fileName) + filterMode := FILTER_MODE_BLACKLIST filter := make([]string, 0)