Skip to content

Commit eda72f0

Browse files
authored
Merge pull request #685 from DataDog/fricounet/socket-uid
Allow to configure the socket uid and gid
2 parents f6677ba + 0d09129 commit eda72f0

File tree

5 files changed

+43
-6
lines changed

5 files changed

+43
-6
lines changed

cmd/containerd-nydus-grpc/snapshotter.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ func Start(ctx context.Context, cfg *config.SnapshotterConfig) error {
3838
stopSignal := signals.SetupSignalHandler()
3939
opt := ServeOptions{
4040
ListeningSocketPath: cfg.Address,
41+
ListeningSocketUID: cfg.UID,
42+
ListeningSocketGID: cfg.GID,
4143
EnableCRIKeychain: cfg.RemoteConfig.AuthConfig.EnableCRIKeychain,
4244
ImageServiceAddress: cfg.RemoteConfig.AuthConfig.ImageServiceAddress,
4345
}
@@ -53,6 +55,8 @@ func Start(ctx context.Context, cfg *config.SnapshotterConfig) error {
5355

5456
type ServeOptions struct {
5557
ListeningSocketPath string
58+
ListeningSocketUID int
59+
ListeningSocketGID int
5660
EnableCRIKeychain bool
5761
ImageServiceAddress string
5862
}
@@ -72,6 +76,10 @@ func Serve(ctx context.Context, sn snapshots.Snapshotter, options ServeOptions,
7276
return errors.Wrapf(err, "listen socket %q", options.ListeningSocketPath)
7377
}
7478

79+
if err := os.Chown(options.ListeningSocketPath, options.ListeningSocketUID, options.ListeningSocketGID); err != nil {
80+
return errors.Wrap(err, "chown socket")
81+
}
82+
7583
if options.EnableCRIKeychain {
7684
auth.AddImageProxy(ctx, rpc, options.ImageServiceAddress)
7785
}

config/config.go

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,17 +222,25 @@ type DebugConfig struct {
222222
}
223223

224224
type SystemControllerConfig struct {
225-
Enable bool `toml:"enable"`
226-
Address string `toml:"address"`
225+
Enable bool `toml:"enable"`
226+
Address string `toml:"address"`
227+
// UID to set on the system controller socket
228+
UID int `toml:"uid"`
229+
// GID to set on the system controller socket
230+
GID int `toml:"gid"`
227231
DebugConfig DebugConfig `toml:"debug"`
228232
}
229233

230234
type SnapshotterConfig struct {
231235
// Configuration format version
232236
Version int `toml:"version"`
233237
// Snapshotter's root work directory
234-
Root string `toml:"root"`
235-
Address string `toml:"address"`
238+
Root string `toml:"root"`
239+
Address string `toml:"address"`
240+
// UID to set on the snapshotter socket
241+
UID int `toml:"uid"`
242+
// GID to set on the snapshotter socket
243+
GID int `toml:"gid"`
236244
DaemonMode string `toml:"daemon_mode"`
237245
// Clean up all the resources when snapshotter is closed
238246
CleanupOnClose bool `toml:"cleanup_on_close"`

config/config_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ func TestLoadSnapshotterTOMLConfig(t *testing.T) {
2626
Version: 1,
2727
Root: "/var/lib/containerd/io.containerd.snapshotter.v1.nydus",
2828
Address: "/run/containerd-nydus/containerd-nydus-grpc.sock",
29+
UID: 0,
30+
GID: 0,
2931
DaemonMode: "dedicated",
3032
Experimental: Experimental{
3133
EnableStargz: false,
@@ -35,6 +37,8 @@ func TestLoadSnapshotterTOMLConfig(t *testing.T) {
3537
SystemControllerConfig: SystemControllerConfig{
3638
Enable: true,
3739
Address: "/run/containerd-nydus/system.sock",
40+
UID: 0,
41+
GID: 0,
3842
DebugConfig: DebugConfig{
3943
ProfileDuration: 5,
4044
PprofAddress: "",

pkg/system/system.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"github.com/containerd/nydus-snapshotter/pkg/manager"
3232
metrics "github.com/containerd/nydus-snapshotter/pkg/metrics/tool"
3333
"github.com/containerd/nydus-snapshotter/pkg/prefetch"
34+
"github.com/containerd/nydus-snapshotter/pkg/utils/signals"
3435
)
3536

3637
const (
@@ -61,6 +62,8 @@ type Controller struct {
6162
managers []*manager.Manager
6263
// httpSever *http.Server
6364
addr *net.UnixAddr
65+
uid int
66+
gid int
6467
router *mux.Router
6568
}
6669

@@ -125,7 +128,7 @@ type rafsInstanceInfo struct {
125128
ImageID string `json:"image_id"`
126129
}
127130

128-
func NewSystemController(fs *filesystem.Filesystem, managers []*manager.Manager, sock string) (*Controller, error) {
131+
func NewSystemController(fs *filesystem.Filesystem, managers []*manager.Manager, sock string, uid, gid int) (*Controller, error) {
129132
if err := os.MkdirAll(filepath.Dir(sock), os.ModePerm); err != nil {
130133
return nil, err
131134
}
@@ -145,6 +148,8 @@ func NewSystemController(fs *filesystem.Filesystem, managers []*manager.Manager,
145148
fs: fs,
146149
managers: managers,
147150
addr: addr,
151+
uid: uid,
152+
gid: gid,
148153
router: mux.NewRouter(),
149154
}
150155

@@ -155,11 +160,23 @@ func NewSystemController(fs *filesystem.Filesystem, managers []*manager.Manager,
155160

156161
func (sc *Controller) Run() error {
157162
log.L.Infof("Start system controller API server on %s", sc.addr)
163+
stopChan := signals.SetupSignalHandler()
158164
listener, err := net.ListenUnix("unix", sc.addr)
159165
if err != nil {
160166
return errors.Wrapf(err, "listen to socket %s ", sc.addr)
161167
}
162168

169+
if err := os.Chown(sc.addr.String(), sc.uid, sc.gid); err != nil {
170+
return errors.Wrap(err, "chown socket")
171+
}
172+
173+
go func() {
174+
<-stopChan
175+
if err := listener.Close(); err != nil {
176+
log.L.Errorf("Failed to close listener %s, err: %v", sc.addr.String(), err)
177+
}
178+
}()
179+
163180
err = http.Serve(listener, sc.router)
164181
if err != nil {
165182
return errors.Wrapf(err, "system management serving")

snapshot/snapshot.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ func NewSnapshotter(ctx context.Context, cfg *config.SnapshotterConfig) (snapsho
238238
}
239239

240240
if config.IsSystemControllerEnabled() {
241-
systemController, err := system.NewSystemController(nydusFs, fsManagers, config.SystemControllerAddress())
241+
systemController, err := system.NewSystemController(nydusFs, fsManagers, config.SystemControllerAddress(), cfg.SystemControllerConfig.UID, cfg.SystemControllerConfig.GID)
242242
if err != nil {
243243
return nil, errors.Wrap(err, "create system controller")
244244
}

0 commit comments

Comments
 (0)