
10 changed files with 429 additions and 30 deletions
@ -0,0 +1,18 @@
|
||||
package smf |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os/exec" |
||||
) |
||||
|
||||
const svcCfgBin string = "/usr/sbin/svccfg" |
||||
|
||||
func Import(path string) error { |
||||
c := exec.Command(svcCfgBin, "import", path) |
||||
output, err := c.CombinedOutput() |
||||
if err != nil { |
||||
return fmt.Errorf("command failed with: %s", output) |
||||
} |
||||
|
||||
return nil |
||||
} |
@ -0,0 +1,32 @@
|
||||
package sysacct |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os/exec" |
||||
"strconv" |
||||
) |
||||
|
||||
const groupAddBin = "/usr/sbin/groupadd" |
||||
|
||||
type Group struct { |
||||
Description string `hcl:"description,label"` |
||||
GID uint32 `hcl:"gid,optional"` |
||||
Name string `hcl:"name"` |
||||
} |
||||
|
||||
func GroupAdd(group Group) error { |
||||
args := make([]string, 0) |
||||
if group.GID > 0 { |
||||
args = append(args, "-g", strconv.Itoa(int(group.GID))) |
||||
} |
||||
|
||||
args = append(args, group.Name) |
||||
|
||||
c := exec.Command(groupAddBin, args...) |
||||
output, err := c.CombinedOutput() |
||||
if err != nil { |
||||
return fmt.Errorf("could not execute groupadd %s", output) |
||||
} |
||||
|
||||
return nil |
||||
} |
@ -0,0 +1,136 @@
|
||||
package sysacct |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os/exec" |
||||
"os/user" |
||||
"strconv" |
||||
"strings" |
||||
|
||||
"github.com/ztrue/tracerr" |
||||
) |
||||
|
||||
const userAddBin = "/usr/sbin/useradd" |
||||
|
||||
type User struct { |
||||
Name string `hcl:"name"` |
||||
Gecos string `hcl:"gecos,label"` |
||||
Group string `hcl:"group,optional"` |
||||
Shell string `hcl:"shell,optional"` |
||||
UID uint32 `hcl:"uid,optional"` |
||||
GID uint32 `hcl:"-,optional"` |
||||
AdditionalGroups []string `hcl:"groups,optional"` |
||||
AdditionalGIDs []uint32 `hcl:"-,optional"` |
||||
} |
||||
|
||||
func UserAdd(u User) (User, error) { |
||||
|
||||
if l, err := user.Lookup(u.Name); err == nil { |
||||
gid, err := strconv.Atoi(l.Gid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.GID = uint32(gid) |
||||
|
||||
uid, err := strconv.Atoi(l.Uid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.UID = uint32(uid) |
||||
return u, nil |
||||
} |
||||
|
||||
args := []string{"-c", u.Gecos} |
||||
if u.Group != "" { |
||||
args = append(args, "-g", u.Group) |
||||
lookupGroup, err := user.LookupGroup(u.Group) |
||||
if err == nil { |
||||
i, err := strconv.Atoi(lookupGroup.Gid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.GID = uint32(i) |
||||
} else { |
||||
if err := GroupAdd(Group{Name: u.Group}); err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
lookupGroup, _ = user.LookupGroup(u.Group) |
||||
i, err := strconv.Atoi(lookupGroup.Gid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.GID = uint32(i) |
||||
} |
||||
} |
||||
|
||||
if u.Shell != "" { |
||||
args = append(args, "-s", u.Shell) |
||||
} |
||||
|
||||
if u.AdditionalGroups != nil { |
||||
args = append(args, "-G", strings.Join(u.AdditionalGroups, ",")) |
||||
u.AdditionalGIDs = make([]uint32, 0) |
||||
for _, g := range u.AdditionalGroups { |
||||
lookupGroup, err := user.LookupGroup(g) |
||||
if err == nil { |
||||
i, err := strconv.Atoi(lookupGroup.Gid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.AdditionalGIDs = append(u.AdditionalGIDs, uint32(i)) |
||||
} else { |
||||
if err := GroupAdd(Group{Name: u.Group}); err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
lookupGroup, _ = user.LookupGroup(u.Group) |
||||
i, err := strconv.Atoi(lookupGroup.Gid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.AdditionalGIDs = append(u.AdditionalGIDs, uint32(i)) |
||||
} |
||||
} |
||||
} |
||||
|
||||
if u.UID > 0 { |
||||
args = append(args, "-u", strconv.Itoa(int(u.UID))) |
||||
} |
||||
|
||||
args = append(args, u.Name) |
||||
|
||||
c := exec.Command(userAddBin, args...) |
||||
|
||||
output, err := c.CombinedOutput() |
||||
if err != nil { |
||||
return u, fmt.Errorf("could not execute useradd %s", output) |
||||
} |
||||
|
||||
lookupUser, err := user.Lookup(u.Name) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
gid, err := strconv.Atoi(lookupUser.Gid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.GID = uint32(gid) |
||||
|
||||
uid, err := strconv.Atoi(lookupUser.Uid) |
||||
if err != nil { |
||||
return u, tracerr.Wrap(err) |
||||
} |
||||
|
||||
u.UID = uint32(uid) |
||||
|
||||
return u, nil |
||||
} |
Loading…
Reference in new issue