From 61e36d6aff37a306e7d2ff0a7c368c73b92285d4 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Tue, 11 May 2021 17:52:29 +0000 Subject: [PATCH] Maintenance: error wrapping of alpine package --- cmd/gluetun/main.go | 3 ++- internal/alpine/users.go | 29 +++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index 4070dc94..3bcd1657 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -49,6 +49,7 @@ var ( var ( errSetupRouting = errors.New("cannot setup routing") + errCreateUser = errors.New("cannot create user") ) func main() { @@ -177,7 +178,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, const defaultUsername = "nonrootuser" nonRootUsername, err := alpineConf.CreateUser(defaultUsername, puid) if err != nil { - return err + return fmt.Errorf("%w: %s", errCreateUser, err) } if nonRootUsername != defaultUsername { logger.Info("using existing username %s corresponding to user id %d", nonRootUsername, puid) diff --git a/internal/alpine/users.go b/internal/alpine/users.go index 915e2c2c..d75db15c 100644 --- a/internal/alpine/users.go +++ b/internal/alpine/users.go @@ -1,35 +1,47 @@ package alpine import ( + "errors" "fmt" "os" "os/user" + "strconv" +) + +var ( + ErrUserAlreadyExists = errors.New("user already exists") ) // CreateUser creates a user in Alpine with the given UID. func (c *configurator) CreateUser(username string, uid int) (createdUsername string, err error) { - UIDStr := fmt.Sprintf("%d", uid) + UIDStr := strconv.Itoa(uid) u, err := c.osUser.LookupID(UIDStr) _, unknownUID := err.(user.UnknownUserIdError) if err != nil && !unknownUID { - return "", fmt.Errorf("cannot create user: %w", err) - } else if u != nil { + return "", err + } + + if u != nil { if u.Username == username { return "", nil } return u.Username, nil } + u, err = c.osUser.Lookup(username) _, unknownUsername := err.(user.UnknownUserError) if err != nil && !unknownUsername { - return "", fmt.Errorf("cannot create user: %w", err) - } else if u != nil { - return "", fmt.Errorf("cannot create user: user with name %s already exists for ID %s instead of %d", - username, u.Uid, uid) + return "", err } + + if u != nil { + return "", fmt.Errorf("%w: with name %s for ID %s instead of %d", + ErrUserAlreadyExists, username, u.Uid, uid) + } + file, err := c.openFile("/etc/passwd", os.O_APPEND|os.O_WRONLY, 0644) if err != nil { - return "", fmt.Errorf("cannot create user: %w", err) + return "", err } s := fmt.Sprintf("%s:x:%d:::/dev/null:/sbin/nologin\n", username, uid) _, err = file.WriteString(s) @@ -37,5 +49,6 @@ func (c *configurator) CreateUser(username string, uid int) (createdUsername str _ = file.Close() return "", err } + return username, file.Close() }