#!/usr/bin/env python

import grp
from dm.common.utility.loggingManager import LoggingManager
from dmSubprocess import DmSubprocess

class LinuxUtility:

    SUDO_CMD = '/usr/bin/sudo'
    GROUPADD_CMD = '/usr/sbin/groupadd'
    USERMOD_CMD = '/usr/sbin/usermod'
    SETFACL_CMD = '/usr/bin/setfacl'
    CHOWN_CMD = '/bin/chown'
    GPASSWD_CMD = '/usr/bin/gpasswd'

    @classmethod
    def getLogger(cls):
        logger = LoggingManager.getInstance().getLogger(cls.__name__)
        return logger

    @classmethod
    def executeSudoCommand(cls, cmd):
        p = DmSubprocess('%s %s' % (cls.SUDO_CMD, cmd))
        p.run()

    @classmethod
    def createGroup(cls, name):
        """ Create group if it does not exist. """
        logger = cls.getLogger()
        try:
            group = grp.getgrnam(name)
            logger.debug('Group %s already exists' % name)
            return 
        except KeyError, ex:
            # ok, we need to create group 
            pass
        logger.debug('Creating group %s' % name)
        cmd = '%s %s' % (cls.GROUPADD_CMD, name)
        cls.executeSudoCommand(cmd)

    @classmethod
    def addUserToGroup(cls, username, groupName):
        """ Add user to group. """
        logger = cls.getLogger()
        logger.debug('Adding user %s to group %s' % (username, groupName))
        cmd = '%s -a -G %s %s' % (cls.USERMOD_CMD, groupName, username)
        cls.executeSudoCommand(cmd)

    @classmethod
    def addLocalUserToGroup(cls, username, groupName):
        """ Add local user to group. """
        logger = cls.getLogger()
        logger.debug('Adding local user %s to group %s' % (username, groupName))
        cmd = '%s -a %s %s' % (cls.GPASSWD_CMD, username, groupName)
        cls.executeSudoCommand(cmd)

    @classmethod
    def deleteLocalUserFromGroup(cls, username, groupName):
        """ Remove local user from group. """
        logger = cls.getLogger()
        logger.debug('Removing local user %s from group %s' % (username, groupName))
        cmd = '%s -d %s %s' % (cls.GPASSWD_CMD, username, groupName)
        cls.executeSudoCommand(cmd)

    @classmethod
    def setGroupUsers(cls, groupName, usernameList):
        """ Set list of users for a given group. """
        logger = cls.getLogger()
        logger.debug('Setting group %s users to: %s' % (groupName, usernameList))
        cmd = '%s -M "%s" %s' % (cls.GPASSWD_CMD, ','.join(usernameList), groupName)
        cls.executeSudoCommand(cmd)

    @classmethod
    def setPathReadExecutePermissionsForGroup(cls, path, groupName):
        """ Set path permissions for the given group. """
        logger = cls.getLogger()
        logger.debug('Allowing group %s to read/execute path %s' % (groupName, path))
        cmd = '%s -m group\:%s\:rx %s' % (cls.SETFACL_CMD, groupName, path)
        cls.executeSudoCommand(cmd)

    @classmethod
    def changePathGroupOwner(cls, path, groupName):
        logger = cls.getLogger()
        logger.debug('Changing group owner to %s for path %s' % (groupName, path))
        cmd = '%s \:%s %s' % (cls.CHOWN_CMD, groupName, path)
        cls.executeSudoCommand(cmd)

#######################################################################
# Testing.

if __name__ == '__main__':
    LinuxUtility.createGroup('exp3')
    LinuxUtility.addUserToGroup('hpc', 'exp3')
    LinuxUtility.setPathReadExecutePermissionsForGroup('/home/sveseli/Work/DM/data/ESAF/exp3', 'exp3')