feat(hostdeployer): change UserAdd to CheckOrAddUser

If the user already exists, use the existing user and its information; otherwise, create a new user
This commit is contained in:
rainzm
2021-07-19 11:15:30 +08:00
parent cc5578e31d
commit 941b6df117
4 changed files with 70 additions and 7 deletions
+1 -1
View File
@@ -34,7 +34,7 @@ type IDiskPartition interface {
Exists(sPath string, caseInsensitive bool) bool
Chown(sPath string, uid, gid int, caseInsensitive bool) error
Chmod(sPath string, mode uint32, caseInsensitive bool) error
UserAdd(user, homeDir string, caseInsensitive bool, isSys bool) error
CheckOrAddUser(user, homeDir string, isSys bool) (realHomeDir string, err error)
Stat(sPath string, caseInsensitive bool) os.FileInfo
Symlink(src, dst string, caseInsensitive bool) error
+6 -4
View File
@@ -95,7 +95,7 @@ func (l *sLinuxRootFs) DeployHosts(rootFs IDiskPartition, hostname, domain strin
func (l *sLinuxRootFs) GetLoginAccount(rootFs IDiskPartition, sUser string, defaultRootUser bool, windowsDefaultAdminUser bool) (string, error) {
if len(sUser) > 0 {
if err := rootFs.UserAdd(sUser, "", false, false); err != nil && !strings.Contains(err.Error(), "already exists") {
if _, err := rootFs.CheckOrAddUser(sUser, "", false); err != nil && !strings.Contains(err.Error(), "already exists") {
return "", fmt.Errorf("UserAdd %s: %v", sUser, err)
}
if err := l.EnableUserSudo(rootFs, sUser); err != nil {
@@ -156,11 +156,13 @@ func (l *sLinuxRootFs) DeployYunionroot(rootFs IDiskPartition, pubkeys *deployap
}
var yunionroot = YUNIONROOT_USER
rootdir := path.Join(cloudrootDirectory, yunionroot)
if err := rootFs.UserAdd(yunionroot, cloudrootDirectory, false, true); err != nil && !strings.Contains(err.Error(), "already exists") {
log.Errorf("UserAdd %s: %v", yunionroot, err)
var err error
if rootdir, err = rootFs.CheckOrAddUser(yunionroot, cloudrootDirectory, true); err != nil {
return errors.Wrap(err, "unable to CheckOrAddUser")
}
err := DeployAuthorizedKeys(rootFs, rootdir, pubkeys, true)
err = DeployAuthorizedKeys(rootFs, rootdir, pubkeys, true)
if err != nil {
log.Infof("DeployAuthorizedKeys error: %s", err.Error())
return fmt.Errorf("DeployAuthorizedKeys: %v", err)
}
if err := l.EnableUserSudo(rootFs, yunionroot); err != nil {
+32 -1
View File
@@ -222,7 +222,38 @@ func (f *SLocalGuestFS) Chmod(sPath string, mode uint32, caseInsensitive bool) e
return nil
}
func (f *SLocalGuestFS) UserAdd(user, homeDir string, caseInsensitive bool, isSys bool) error {
func (f *SLocalGuestFS) CheckOrAddUser(user, homeDir string, isSys bool) (realHomeDir string, err error) {
var exist bool
if exist, realHomeDir, err = f.checkUser(user); err != nil || exist {
return
}
return path.Join(homeDir, user), f.userAdd(user, homeDir, isSys)
}
func (f *SLocalGuestFS) checkUser(user string) (exist bool, homeDir string, err error) {
cmd := []string{"chroot", f.mountPath, "cat", "/etc/passwd"}
command := procutils.NewCommand(cmd[0], cmd[1:]...)
output, err := command.Output()
if err != nil {
return
}
lines := strings.Split(strings.TrimSpace(string(output)), "\n")
for i := len(lines) - 1; i >= 0; i-- {
userInfos := strings.Split(strings.TrimSpace(lines[i]), ":")
if len(userInfos) < 6 {
continue
}
if userInfos[0] != user {
continue
}
exist = true
homeDir = userInfos[5]
break
}
return
}
func (f *SLocalGuestFS) userAdd(user, homeDir string, isSys bool) error {
if err := f.Mkdir(homeDir, 0755, false); err != nil {
return errors.Wrap(err, "Mkdir")
}
+31 -1
View File
@@ -395,7 +395,37 @@ func (p *SSHPartition) Remove(sPath string, caseInsensitive bool) {
}
}
func (p *SSHPartition) UserAdd(user, homeDir string, caseInsensitive bool, isSys bool) error {
func (p *SSHPartition) CheckOrAddUser(user, homeDir string, isSys bool) (realHomeDir string, err error) {
var exist bool
if exist, realHomeDir, err = p.checkUser(user); err != nil || exist {
return
}
return path.Join(homeDir, user), p.userAdd(user, homeDir, isSys)
}
func (p *SSHPartition) checkUser(user string) (exist bool, homeDir string, err error) {
cmd := fmt.Sprintf("/usr/sbin/chroot %s /usr/bin/cat /etc/passwd", p.mountPath)
lines, err := p.term.Run(cmd)
if err != nil {
return
}
log.Debugf("exec command 'cat /etc/passwd', output: %v", lines)
for i := len(lines) - 1; i >= 0; i-- {
userInfos := strings.Split(strings.TrimSpace(lines[i]), ":")
if len(userInfos) < 6 {
continue
}
if userInfos[0] != user {
continue
}
exist = true
homeDir = userInfos[5]
break
}
return
}
func (p *SSHPartition) userAdd(user, homeDir string, isSys bool) error {
cmd := fmt.Sprintf("/usr/sbin/chroot %s /usr/sbin/useradd -m -s /bin/bash %s", p.mountPath, user)
if isSys {
cmd += " -r"