feat(listener/unix): add mode metadata to chmod unix socket file

Add a "mode" metadata key to the unix listener so users can set the
file permissions on the unix domain socket after it is created. This
allows programs running under a different user/group to connect to the
socket without requiring a global umask override.

Values accept Go-style octal (0660), Go literal (0o660), or decimal
(432), both via URL query params and YAML config files.

Fixes go-gost/gost#878
This commit is contained in:
ginuerzh
2026-06-25 16:04:04 +08:00
parent 39580f04ca
commit b777bcb81a
2 changed files with 24 additions and 1 deletions
+7
View File
@@ -2,6 +2,7 @@ package unix
import ( import (
"net" "net"
"os"
"time" "time"
"github.com/go-gost/core/limiter" "github.com/go-gost/core/limiter"
@@ -48,6 +49,12 @@ func (l *unixListener) Init(md md.Metadata) (err error) {
if err != nil { if err != nil {
return return
} }
if l.md.fileMode > 0 {
if err = os.Chmod(l.options.Addr, l.md.fileMode); err != nil {
ln.Close()
return
}
}
ln = proxyproto.WrapListener(l.options.ProxyProtocol, ln, 10*time.Second) ln = proxyproto.WrapListener(l.options.ProxyProtocol, ln, 10*time.Second)
ln = metrics.WrapListener(l.options.Service, ln) ln = metrics.WrapListener(l.options.Service, ln)
+17 -1
View File
@@ -1,11 +1,27 @@
package unix package unix
import ( import (
"os"
"strconv"
md "github.com/go-gost/core/metadata" md "github.com/go-gost/core/metadata"
) )
type metadata struct{} type metadata struct {
fileMode os.FileMode
}
func (l *unixListener) parseMetadata(md md.Metadata) (err error) { func (l *unixListener) parseMetadata(md md.Metadata) (err error) {
if !md.IsExists("mode") {
return
}
switch v := md.Get("mode").(type) {
case int:
l.md.fileMode = os.FileMode(v)
case string:
n, _ := strconv.ParseInt(v, 0, 32)
l.md.fileMode = os.FileMode(n)
}
return return
} }