From 571a34cba2adddc098d731432a6b112893b3133f Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Tue, 30 Apr 2019 13:23:26 -0400 Subject: [PATCH] Module to assist with advanced user manipulation Currently holds the logic to ascertain the system groups for a system user. --- confluent_server/confluent/userutil.py | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 confluent_server/confluent/userutil.py diff --git a/confluent_server/confluent/userutil.py b/confluent_server/confluent/userutil.py new file mode 100644 index 00000000..04f8e976 --- /dev/null +++ b/confluent_server/confluent/userutil.py @@ -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]))) +