2
0
mirror of https://github.com/acepanel/helper.git synced 2026-02-04 05:31:49 +08:00
Files
helper/internal/system/user.go
2026-01-17 23:12:33 +08:00

88 lines
2.3 KiB
Go

package system
import (
"context"
"fmt"
"github.com/acepanel/helper/pkg/i18n"
)
// UserManager 用户管理接口
type UserManager interface {
// UserExists 检查用户是否存在
UserExists(ctx context.Context, username string) bool
// GroupExists 检查组是否存在
GroupExists(ctx context.Context, groupname string) bool
// CreateUser 创建用户
CreateUser(ctx context.Context, username, groupname string, nologin bool) error
// CreateGroup 创建组
CreateGroup(ctx context.Context, groupname string) error
// EnsureUserAndGroup 确保用户和组存在
EnsureUserAndGroup(ctx context.Context, username, groupname string) error
}
type userManager struct {
executor Executor
}
// NewUserManager 创建用户管理器
func NewUserManager(executor Executor) UserManager {
return &userManager{executor: executor}
}
func (u *userManager) UserExists(ctx context.Context, username string) bool {
result, _ := u.executor.Run(ctx, "id", "-u", username)
return result != nil && result.ExitCode == 0
}
func (u *userManager) GroupExists(ctx context.Context, groupname string) bool {
result, _ := u.executor.Run(ctx, "getent", "group", groupname)
return result != nil && result.ExitCode == 0
}
func (u *userManager) CreateUser(ctx context.Context, username, groupname string, nologin bool) error {
args := []string{"-g", groupname}
if nologin {
args = append(args, "-s", "/sbin/nologin")
}
args = append(args, username)
result, err := u.executor.Run(ctx, "useradd", args...)
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s %s: %s", i18n.T.Get("Failed to create user"), username, result.Stderr)
}
return nil
}
func (u *userManager) CreateGroup(ctx context.Context, groupname string) error {
result, err := u.executor.Run(ctx, "groupadd", groupname)
if err != nil {
return err
}
if result.ExitCode != 0 {
return fmt.Errorf("%s %s: %s", i18n.T.Get("Failed to create group"), groupname, result.Stderr)
}
return nil
}
func (u *userManager) EnsureUserAndGroup(ctx context.Context, username, groupname string) error {
// 确保组存在
if !u.GroupExists(ctx, groupname) {
if err := u.CreateGroup(ctx, groupname); err != nil {
return err
}
}
// 确保用户存在
if !u.UserExists(ctx, username) {
if err := u.CreateUser(ctx, username, groupname, true); err != nil {
return err
}
}
return nil
}