| diff --git a/google_guest_agent/accounts_unix.go b/google_guest_agent/accounts_unix.go |
| index 701f9f1..a4ad7f9 100644 |
| --- a/google_guest_agent/accounts_unix.go |
| +++ b/google_guest_agent/accounts_unix.go |
| @@ -23,20 +23,28 @@ import ( |
| "syscall" |
| ) |
| |
| -func getUID(path string) string { |
| +func getUIDAndGID(path string) (string, string) { |
| if dir, err := os.Stat(path); err == nil { |
| if stat, ok := dir.Sys().(*syscall.Stat_t); ok { |
| - return fmt.Sprintf("%d", stat.Uid) |
| + return fmt.Sprintf("%d", stat.Uid), fmt.Sprintf("%d", stat.Gid) |
| } |
| } |
| - return "" |
| + return "", "" |
| } |
| |
| -func createUser(username, uid string) error { |
| +func createUser(username, uid, gid string) error { |
| useradd := config.Section("Accounts").Key("useradd_cmd").MustString("useradd -m -s /bin/bash -p * {user}") |
| if uid != "" { |
| useradd = fmt.Sprintf("%s -u %s", useradd, uid) |
| } |
| + if gid != "" { |
| + groupadd := config.Section("Accounts").Key("groupadd_cmd").MustString("groupadd {group}") |
| + groupadd = fmt.Sprintf("%s -g %s", groupadd, gid) |
| + if err := runCmd(createUserGroupCmd(groupadd, "", username)); err != nil { |
| + return err |
| + } |
| + useradd = fmt.Sprintf("%s -g %s", useradd, gid) |
| + } |
| return runCmd(createUserGroupCmd(useradd, username, "")) |
| } |
| |
| diff --git a/google_guest_agent/accounts_windows.go b/google_guest_agent/accounts_windows.go |
| index d9fefd5..9398214 100644 |
| --- a/google_guest_agent/accounts_windows.go |
| +++ b/google_guest_agent/accounts_windows.go |
| @@ -137,7 +137,7 @@ func addUserToGroup(username, group string) error { |
| return nil |
| } |
| |
| -func createUser(username, pwd string) error { |
| +func createUser(username, pwd, _ string) error { |
| uPtr, err := syscall.UTF16PtrFromString(username) |
| if err != nil { |
| return fmt.Errorf("error encoding username to UTF16: %v", err) |
| @@ -183,6 +183,6 @@ func userExists(name string) (bool, error) { |
| return true, nil |
| } |
| |
| -func getUID(path string) string { |
| - return "" |
| +func getUIDAndGID(path string) (string, string) { |
| + return "", "" |
| } |
| diff --git a/google_guest_agent/non_windows_accounts.go b/google_guest_agent/non_windows_accounts.go |
| index 04f8734..9ff9ab5 100644 |
| --- a/google_guest_agent/non_windows_accounts.go |
| +++ b/google_guest_agent/non_windows_accounts.go |
| @@ -345,12 +345,12 @@ func createUserGroupCmd(cmd, user, group string) *exec.Cmd { |
| // createGoogleUser creates a Google managed user account if needed and adds it |
| // to the configured groups. |
| func createGoogleUser(user string) error { |
| - var uid string |
| + var uid, gid string |
| if config.Section("Accounts").Key("reuse_homedir").MustBool(false) { |
| - uid = getUID(fmt.Sprintf("/home/%s", user)) |
| + uid, gid = getUIDAndGID(fmt.Sprintf("/home/%s", user)) |
| } |
| |
| - if err := createUser(user, uid); err != nil { |
| + if err := createUser(user, uid, gid); err != nil { |
| return err |
| } |
| groups := config.Section("Accounts").Key("groups").MustString("adm,dip,docker,lxd,plugdev,video") |
| diff --git a/google_guest_agent/windows_accounts.go b/google_guest_agent/windows_accounts.go |
| index dc23831..e64f0c8 100644 |
| --- a/google_guest_agent/windows_accounts.go |
| +++ b/google_guest_agent/windows_accounts.go |
| @@ -139,7 +139,7 @@ func (k windowsKey) createOrResetPwd() (*credsJSON, error) { |
| } |
| } else { |
| logger.Infof("Creating user %s", k.UserName) |
| - if err := createUser(k.UserName, pwd); err != nil { |
| + if err := createUser(k.UserName, pwd, ""); err != nil { |
| return nil, fmt.Errorf("error running createUser: %v", err) |
| } |
| if k.AddToAdministrators == nil || *k.AddToAdministrators == true { |