mirror of
https://github.com/xcat2/confluent.git
synced 2024-11-22 17:43:14 +00:00
Module to assist with advanced user manipulation
Currently holds the logic to ascertain the system groups for a system user.
This commit is contained in:
parent
52fa5158f6
commit
571a34cba2
40
confluent_server/confluent/userutil.py
Normal file
40
confluent_server/confluent/userutil.py
Normal file
@ -0,0 +1,40 @@
|
||||
from ctypes import *
|
||||
from ctypes.util import find_library
|
||||
import grp
|
||||
import pwd
|
||||
import os
|
||||
libc = cdll.LoadLibrary(find_library('libc'))
|
||||
_getgrouplist = libc.getgrouplist
|
||||
_getgrouplist.restype = c_int32
|
||||
|
||||
|
||||
class TooSmallException(Exception):
|
||||
def __init__(self, count):
|
||||
self.count = count
|
||||
super(TooSmallException, self).__init__()
|
||||
|
||||
|
||||
def getgrouplist(name, gid, ng=32):
|
||||
_getgrouplist.argtypes = [c_char_p, c_uint, POINTER(c_uint * ng), POINTER(c_int)]
|
||||
glist = (c_uint * ng)()
|
||||
nglist = c_int(ng)
|
||||
count = _getgrouplist(name, gid, byref(glist), byref(nglist))
|
||||
if count < 0:
|
||||
raise TooSmallException(nglist.value)
|
||||
for gidx in range(count):
|
||||
gent = glist[gidx]
|
||||
yield grp.getgrgid(gent).gr_name
|
||||
|
||||
|
||||
def grouplist(username):
|
||||
pent = pwd.getpwnam(username)
|
||||
try:
|
||||
groups = getgrouplist(pent.pw_name, pent.pw_gid)
|
||||
except TooSmallException as e:
|
||||
groups = getgrouplist(pent.pw_name, pent.pw_gid, e.count)
|
||||
return list(groups)
|
||||
|
||||
if __name__ == '__main__':
|
||||
import sys
|
||||
print(repr(grouplist(sys.argv[1])))
|
||||
|
Loading…
Reference in New Issue
Block a user