From 62ad8bcd8f02f45d424d2cf0334ec57ae7b9a6ab Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Sat, 25 Jun 2022 15:44:29 +0000 Subject: [PATCH] fix(pia): set port forward file owned with `PUID` and `PGID` --- cmd/gluetun/main.go | 2 +- internal/portforward/fs.go | 18 +++++++++--------- internal/portforward/loop.go | 7 ++++++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index d69e2dc2..f9a570f5 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -347,7 +347,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, portForwardLogger := logger.New(log.SetComponent("port forwarding")) portForwardLooper := portforward.NewLoop(allSettings.VPN.Provider.PortForwarding, - httpClient, firewallConf, portForwardLogger) + httpClient, firewallConf, portForwardLogger, puid, pgid) portForwardHandler, portForwardCtx, portForwardDone := goshutdown.NewGoRoutineHandler( "port forwarding", goroutine.OptionTimeout(time.Second)) go portForwardLooper.Run(portForwardCtx, portForwardDone) diff --git a/internal/portforward/fs.go b/internal/portforward/fs.go index fde9696d..638a9127 100644 --- a/internal/portforward/fs.go +++ b/internal/portforward/fs.go @@ -16,22 +16,22 @@ func (l *Loop) removePortForwardedFile() { func (l *Loop) writePortForwardedFile(port uint16) { filepath := *l.state.GetSettings().Filepath l.logger.Info("writing port file " + filepath) - if err := writePortForwardedToFile(filepath, port); err != nil { - l.logger.Error(err.Error()) + if err := writePortForwardedToFile(filepath, port, l.puid, l.pgid); err != nil { + l.logger.Error("writing port forwarded to file: " + err.Error()) } } -func writePortForwardedToFile(filepath string, port uint16) (err error) { - file, err := os.OpenFile(filepath, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0644) +func writePortForwardedToFile(filepath string, port uint16, uid, gid int) (err error) { + const perms = os.FileMode(0644) + err = os.WriteFile(filepath, []byte(fmt.Sprint(port)), perms) if err != nil { - return err + return fmt.Errorf("writing file: %w", err) } - _, err = file.Write([]byte(fmt.Sprint(port))) + err = os.Chown(filepath, uid, gid) if err != nil { - _ = file.Close() - return err + return fmt.Errorf("chowning file: %w", err) } - return file.Close() + return nil } diff --git a/internal/portforward/loop.go b/internal/portforward/loop.go index ae147aba..8fd3dc63 100644 --- a/internal/portforward/loop.go +++ b/internal/portforward/loop.go @@ -15,6 +15,9 @@ import ( type Loop struct { statusManager *loopstate.State state *state.State + // Fixed parameters + puid int + pgid int // Objects client *http.Client portAllower PortAllower @@ -33,7 +36,7 @@ const defaultBackoffTime = 5 * time.Second func NewLoop(settings settings.PortForwarding, client *http.Client, portAllower PortAllower, - logger Logger) *Loop { + logger Logger, puid, pgid int) *Loop { start := make(chan struct{}) running := make(chan models.LoopStatus) stop := make(chan struct{}) @@ -45,6 +48,8 @@ func NewLoop(settings settings.PortForwarding, return &Loop{ statusManager: statusManager, state: state, + puid: puid, + pgid: pgid, // Objects client: client, portAllower: portAllower,