Separate user management scripts into Python libraries and wrapper scripts

This commit is contained in:
Anthony Wang 2022-01-24 20:15:49 -06:00
parent b12dff61f2
commit 6e856e93cd
Signed by: a
GPG key ID: BC96B00AEC5F2D76
7 changed files with 116 additions and 113 deletions

78
adduser
View file

@ -1,80 +1,8 @@
#!/usr/bin/python
from sys import argv
from os import rename, remove, chown
from subprocess import run, call, check_output
from crypt import crypt
from adduser import adduser
def adduser(username, firstname, lastname, email, password, ldap_pass=None):
"""Add a new user"""
# Get UID
output = str(check_output(['getent', 'passwd']))
uid = [u for u in range(1000, 10000) if str(u) not in output][0]
# Construct LDIF
ldif = '''dn: uid={username},ou=People,dc=exozy,dc=me
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: {username}
cn: {firstname} {lastname}
sn: {lastname}
givenName: {firstname}
userPassword: {{CRYPT}}{hashedpassword}
mail: {email}
loginShell: /bin/fish
uidNumber: {uid}
gidNumber: {uid}
homeDirectory: /home/{username}
dn: cn={username},ou=Group,dc=exozy,dc=me
objectClass: top
objectClass: posixGroup
cn: {username}
gidNumber: {uid}'''.format(username=username,
firstname=firstname,
lastname=lastname,
email=email,
uid=uid,
hashedpassword=crypt(password))
# Write to file
filename = username + '.ldif'
with open(filename, 'w') as f:
f.write(ldif)
# Add user
if ldap_pass == None:
run(['vim', filename])
ret = call(['ldapadd', '-D', 'cn=Manager,dc=exozy,dc=me',
'-W', '-f', filename])
else:
ret = call(['ldapadd', '-D', 'cn=Manager,dc=exozy,dc=me',
'-w', ldap_pass, '-f', filename])
if ret != 0:
remove(filename)
return
chown(filename, 1000, 1000)
rename(filename, '/home/ta180m/git/LDAP/users' + filename)
# Configure user
run(['sudo', 'mkhomedir_helper', username, '077'])
run(['sudo', '-u', username, 'mkdir', '/home/' + username + '/.config'])
# Set up Flatpak
run(['sudo', '-u', username, 'flatpak', 'remote-add', '--if-not-exists', 'flathub',
'https://dl.flathub.org/repo/flathub.flatpakrepo', '--user'])
# Set default browser
run(['sudo', '-u', username, 'xdg-settings', 'set',
'default-web-browser', 'firefox.desktop'])
# Running as script
if __name__ == "__main__":
username, firstname, lastname, email, password = [
argv[i] for i in range(1, 6)]
adduser(username, firstname, lastname, email, password)
username, firstname, lastname, email, password = [argv[i] for i in range(1, 6)]
adduser(username, firstname, lastname, email, password)

76
adduser.py Executable file
View file

@ -0,0 +1,76 @@
from os import rename, remove, chown
from subprocess import run, call, check_output
from crypt import crypt
def configure(username):
"""Configure user"""
run(['sudo', 'mkhomedir_helper', username, '077'])
run(['sudo', '-u', username, 'mkdir', '/home/' + username + '/.config'])
# Set up Flatpak
run(['sudo', '-u', username, 'flatpak', 'remote-add', '--if-not-exists', 'flathub',
'https://dl.flathub.org/repo/flathub.flatpakrepo', '--user'])
# Set default browser
run(['sudo', '-u', username, 'xdg-settings', 'set',
'default-web-browser', 'firefox.desktop'])
def adduser(username, firstname, lastname, email, password, ldap_pass=None):
"""Add a new user"""
# Get UID
output = str(check_output(['getent', 'passwd']))
uid = [u for u in range(1000, 10000) if str(u) not in output][0]
# Construct LDIF
ldif = '''dn: uid={username},ou=People,dc=exozy,dc=me
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: {username}
cn: {firstname} {lastname}
sn: {lastname}
givenName: {firstname}
userPassword: {{CRYPT}}{hashedpassword}
mail: {email}
loginShell: /bin/fish
uidNumber: {uid}
gidNumber: {uid}
homeDirectory: /home/{username}
dn: cn={username},ou=Group,dc=exozy,dc=me
objectClass: top
objectClass: posixGroup
cn: {username}
gidNumber: {uid}'''.format(username=username,
firstname=firstname,
lastname=lastname,
email=email,
uid=uid,
hashedpassword=crypt(password))
# Write to file
filename = username + '.ldif'
with open(filename, 'w') as f:
f.write(ldif)
# Add user
if ldap_pass is None:
run(['vim', filename])
ret = call(['ldapadd', '-D', 'cn=Manager,dc=exozy,dc=me',
'-W', '-f', filename])
else:
ret = call(['ldapadd', '-D', 'cn=Manager,dc=exozy,dc=me',
'-w', ldap_pass, '-f', filename])
if ret != 0:
remove(filename)
return
chown(filename, 1000, 1000)
rename(filename, '/home/ta180m/git/LDAP/users' + filename)
configure(username)

16
deluser Executable file → Normal file
View file

@ -1,19 +1,7 @@
#!/usr/bin/python
from sys import argv
from subprocess import run
from deluser import deluser
def deluser(username):
"""Delete a user"""
# Delete from LDAP server
run(['ldapdelete', '-W', '-D', 'cn=Manager,dc=exozy,dc=me', 'uid=' + username +
',ou=People,dc=exozy,dc=me', 'cn=' + username + ',ou=Group,dc=exozy,dc=me'])
# Cleanup
run(['sudo', 'rm', '-rf', '/home/' + username])
# Running as script
if __name__ == "__main__":
deluser(argv[1])
deluser(argv[1])

16
deluser.py Executable file
View file

@ -0,0 +1,16 @@
from subprocess import run
def deluser(username, ldap_pass=None):
"""Delete a user"""
# Delete from LDAP server
if ldap_pass is None:
run(['ldapdelete', '-W', '-D', 'cn=Manager,dc=exozy,dc=me', 'uid=' + username +
',ou=People,dc=exozy,dc=me', 'cn=' + username + ',ou=Group,dc=exozy,dc=me'])
else:
run(['ldapdelete', '-w', ldap_pass, '-D', 'cn=Manager,dc=exozy,dc=me', 'uid=' + username +
',ou=People,dc=exozy,dc=me', 'cn=' + username + ',ou=Group,dc=exozy,dc=me'])
# Cleanup
run(['sudo', 'rm', '-rf', '/home/' + username])

18
moduser
View file

@ -1,21 +1,7 @@
#!/usr/bin/python
from sys import argv
from subprocess import run
from moduser import moduser
def moduser(username):
"""Modify an existing user"""
if username == 'Manager':
bind_user = 'cn=Manager,dc=exozy,dc=me'
else:
bind_user = 'uid=' + username + ',ou=People,dc=exozy,dc=me'
# Modify user with ldapvi
run(['ldapvi', '--user', bind_user])
# Running as script
if __name__ == "__main__":
moduser(argv[1])
moduser(argv[1])

16
moduser.py Normal file
View file

@ -0,0 +1,16 @@
from subprocess import run
def moduser(username, ldap_pass=None):
"""Modify an existing user"""
if username == 'Manager':
bind_user = 'cn=Manager,dc=exozy,dc=me'
else:
bind_user = 'uid=' + username + ',ou=People,dc=exozy,dc=me'
# Modify user with ldapvi
if ldap_pass is None:
run(['ldapvi', '--user', bind_user])
else:
run(['ldapvi', '-w', ldap_pass, '--user', bind_user])

View file

@ -1,16 +1,9 @@
#!/usr/bin/python
from sys import modules
from subprocess import run, check_output
from json import loads
from http.server import BaseHTTPRequestHandler, HTTPServer
from importlib.util import spec_from_loader, module_from_spec
from importlib.machinery import SourceFileLoader
# Import adduser module
spec = spec_from_loader('adduser', SourceFileLoader('adduser', 'adduser'))
adduser = module_from_spec(spec)
spec.loader.exec_module(adduser)
from adduser import adduser
class Server(BaseHTTPRequestHandler):