Skip to content

Instantly share code, notes, and snippets.

@kirelagin
Last active October 22, 2021 21:41
Show Gist options
  • Save kirelagin/4641261 to your computer and use it in GitHub Desktop.
Save kirelagin/4641261 to your computer and use it in GitHub Desktop.
Adding users to ldap database
#!/usr/bin/env python
import sys
import os.path
import ldap
import ldap.dn
import ldap.filter
import ldap.modlist
SERVER_URI = 'ldap://127.0.0.1'
ROOTDN = 'cn=root,dc=kirNet'
CREDENTIALS_FILE = '/etc/ldap.secret'
USERS_GID = 2000
if __name__ == '__main__':
if len(sys.argv) != 4:
print('Usage: {0} <username> <FirstName> <LastName> < <pubkey>'.format(os.path.basename(sys.argv[0])))
sys.exit(2)
try:
with open(CREDENTIALS_FILE) as file_secret:
cred = file_secret.readline()[:-1]
except IOError as e:
if e.errno == 13:
print('Superuser access is required')
sys.exit(1)
elif e.errno == 2:
print('Secret file ({0}) does not exist', e.filename)
sys.exit(1)
else:
raise e
con = ldap.initialize(SERVER_URI)
con.bind_s(ROOTDN, cred, ldap.AUTH_SIMPLE)
username = sys.argv[1]
firstname = sys.argv[2]
lastname = sys.argv[3]
if len(con.search_s('ou=People,dc=kirNet', ldap.SCOPE_ONELEVEL, '(uid={0})'.format(ldap.filter.escape_filter_chars(username)))) != 0:
print('User {0} already exists'.format(username))
sys.exit(3)
users = con.search_s('ou=People,dc=kirNet', ldap.SCOPE_ONELEVEL, '(objectClass=posixAccount)', ['uidNumber'])
nextUid = max([int(u[1]['uidNumber'][0]) for u in users]) + 1
ml_user = ldap.modlist.addModlist(
{
'objectClass': ['inetOrgPerson', 'posixAccount', 'ldapPublicKey'],
'uid': [username],
'uidNumber': [str(nextUid)],
'givenName': [firstname],
'sn': [lastname],
'cn': [firstname + ' ' + lastname],
'gidNumber': [str(USERS_GID)],
'homeDirectory': ['/home/users/' + username],
'loginShell': ['/bin/bash'],
'sshPublicKey': [sys.stdin.read()],
})
con.add_s('uid={0},ou=People,dc=kirNet'.format(ldap.dn.escape_dn_chars(username)), ml_user)
groupdn = con.search_s('ou=Group,dc=kirNet', ldap.SCOPE_ONELEVEL, '(gidNumber={0})'.format(ldap.filter.escape_filter_chars(str(USERS_GID))))[0][0]
con.modify_s(groupdn, [(0, 'memberUid', [username])])
con.unbind_s()
print('User {0} added'.format(username))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment