158 lines
		
	
	
		
			No EOL
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			No EOL
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import ldap, ldap.sasl, sys, getpass, subprocess, pwd, os, os.path
 | 
						|
from pathlib import Path
 | 
						|
from linuxmusterLinuxclient7 import logging, constants, config, user, ldapHelper, shares, fileHelper, computer, localUserHelper
 | 
						|
 | 
						|
def readAttributes():
 | 
						|
    """
 | 
						|
    Reads all attributes of the current user from ldap
 | 
						|
 | 
						|
    :return: Tuple (success, dict of user attributes)
 | 
						|
    :rtype: tuple
 | 
						|
    """
 | 
						|
    if not user.isInAD():
 | 
						|
        return False, None
 | 
						|
 | 
						|
    return ldapHelper.searchOne(f"(sAMAccountName={user.username()})")
 | 
						|
 | 
						|
def school():
 | 
						|
    """
 | 
						|
    Gets the school of the current user from the AD
 | 
						|
 | 
						|
    :return: The short name of the school
 | 
						|
    :rtype: str
 | 
						|
    """
 | 
						|
    rc, userdata = readAttributes()
 | 
						|
    
 | 
						|
    if not rc:
 | 
						|
        return False, None
 | 
						|
 | 
						|
    return True, userdata["sophomorixSchoolname"]
 | 
						|
 | 
						|
def username():
 | 
						|
    """
 | 
						|
    Returns the user of the current user
 | 
						|
 | 
						|
    :return: The username of the current user
 | 
						|
    :rtype: str
 | 
						|
    """
 | 
						|
    return getpass.getuser().lower()
 | 
						|
 | 
						|
def isUserInAD(user):
 | 
						|
    """
 | 
						|
    Checks if a given user is an AD user.
 | 
						|
 | 
						|
    :param user: The username of the user to check
 | 
						|
    :type user: str
 | 
						|
    :return: True if the user is in the AD, False if it is a local user
 | 
						|
    :rtype: bool
 | 
						|
    """
 | 
						|
    if not computer.isInAD():
 | 
						|
        return False
 | 
						|
    
 | 
						|
    rc, groups = localUserHelper.getGroupsOfLocalUser(user)
 | 
						|
    if not rc:
 | 
						|
        return False
 | 
						|
 | 
						|
    return "domain users" in groups
 | 
						|
 | 
						|
def isInAD():
 | 
						|
    """Checks if the current user is an AD user.
 | 
						|
 | 
						|
    :return: True if the user is in the AD, False if it is a local user
 | 
						|
    :rtype: bool
 | 
						|
    """
 | 
						|
    return isUserInAD(username())
 | 
						|
 | 
						|
def isRoot():
 | 
						|
    """
 | 
						|
    Checks if the current user is root
 | 
						|
 | 
						|
    :return: True if the current user is root, False otherwise
 | 
						|
    :rtype: bool
 | 
						|
    """
 | 
						|
    return os.geteuid() == 0
 | 
						|
 | 
						|
def isInGroup(groupName):
 | 
						|
    """
 | 
						|
    Checks if the current user is part of a given group
 | 
						|
 | 
						|
    :param groupName: The name of the group
 | 
						|
    :type groupName: str
 | 
						|
    :return: True if the user is part of the group, False otherwise
 | 
						|
    :rtype: bool
 | 
						|
    """
 | 
						|
    rc, groups = localUserHelper.getGroupsOfLocalUser(username())
 | 
						|
    if not rc:
 | 
						|
        return False
 | 
						|
 | 
						|
    return groupName in groups
 | 
						|
 | 
						|
def cleanTemplateUserGtkBookmarks():
 | 
						|
    """Remove gtk bookmarks of the template user from the current users `~/.config/gtk-3.0/bookmarks` file.
 | 
						|
    """
 | 
						|
    logging.info("Cleaning {} gtk bookmarks".format(constants.templateUser))
 | 
						|
    gtkBookmarksFile = "/home/{0}/.config/gtk-3.0/bookmarks".format(user.username())
 | 
						|
 | 
						|
    if not os.path.isfile(gtkBookmarksFile):
 | 
						|
        logging.warning("Gtk bookmarks file not found, skipping!")
 | 
						|
        return
 | 
						|
 | 
						|
    fileHelper.removeLinesInFileContainingString(gtkBookmarksFile, constants.templateUser)
 | 
						|
 | 
						|
def getHomeShareMountpoint():
 | 
						|
    """
 | 
						|
    Returns the mountpoint of the users serverhome.
 | 
						|
 | 
						|
    :return: The monutpoint of the users serverhome
 | 
						|
    :rtype: str
 | 
						|
    """
 | 
						|
    rc, homeShareName = _getHomeShareName()
 | 
						|
 | 
						|
    if rc:
 | 
						|
        basePath = constants.shareMountBasepath.format(username())
 | 
						|
        return True, f"{basePath}/{homeShareName}"
 | 
						|
 | 
						|
    return False, None
 | 
						|
 | 
						|
def mountHomeShare():
 | 
						|
    """
 | 
						|
    Mounts the serverhome of the current user
 | 
						|
 | 
						|
    :return: True on success, False otherwise
 | 
						|
    :rtype: bool
 | 
						|
    """
 | 
						|
    rc1, userAttributes = readAttributes()
 | 
						|
    rc2, shareName = _getHomeShareName(userAttributes)
 | 
						|
    if rc1 and rc2:
 | 
						|
        try:
 | 
						|
            homeShareServerPath = userAttributes["homeDirectory"]
 | 
						|
            res = shares.mountShare(homeShareServerPath, shareName=shareName, hiddenShare=False, username=username())
 | 
						|
            return res
 | 
						|
 | 
						|
        except Exception as e:
 | 
						|
            logging.error("Could not mount home dir of user")
 | 
						|
            logging.exception(e)
 | 
						|
 | 
						|
    return False, None
 | 
						|
 | 
						|
# --------------------
 | 
						|
# - Helper functions -
 | 
						|
# --------------------
 | 
						|
 | 
						|
def _getHomeShareName(userAttributes=None):
 | 
						|
    if userAttributes is None:
 | 
						|
        rc, userAttributes = readAttributes()
 | 
						|
    else:
 | 
						|
        rc = True
 | 
						|
 | 
						|
    if rc:
 | 
						|
        try:
 | 
						|
            usernameString = username()
 | 
						|
            shareName = f"{usernameString} ({userAttributes['homeDrive']})"
 | 
						|
            return True, shareName
 | 
						|
 | 
						|
        except Exception as e:
 | 
						|
            logging.error("Could not mount home dir of user")
 | 
						|
            logging.exception(e)
 | 
						|
 | 
						|
    return False, None |