removeuserfromgroups.py #9

  • //
  • guest/
  • perforce_software/
  • sdp/
  • main/
  • Maintenance/
  • removeuserfromgroups.py
  • View
  • Commits
  • Open Download .zip Download (4 KB)
#!/usr/bin/env python
# ==============================================================================
# Copyright and license info is available in the LICENSE file included with
# the Server Deployment Package (SDP), and also available online:
# https://swarm.workshop.perforce.com/projects/perforce-software-sdp/view/main/LICENSE
# ------------------------------------------------------------------------------

USAGE = """
This script will look for the specified users in all groups and remove them.

Usage:
  removeuserfromgroups.py [instance] USER
  removeuserfromgroups.py [instance] FILE

USER can be a single username or, it can be a FILE with a list of users.

instance defaults to 1 if not given.
"""

import os
import re
import sys
import sdputils

if len(sys.argv) > 2:  # see params above
    SDP_INSTANCE = str(sys.argv[1])
else:
    SDP_INSTANCE = '1'

utils = sdputils.SDPUtils(SDP_INSTANCE)
config = utils.config
p4 = utils.p4
utils.login()

def rep(mo): return '_%s' % hex(ord(mo.group(0)))[-2:]

def removeuserfromfile(groupfile, username):
    infile = open(groupfile, "r")
    outfile = open(groupfile + ".new", "w")
    for line in infile.readlines():
        if username.lower() != (line.strip()).lower():
            outfile.write(line)
    infile.close()
    outfile.close()
    os.remove(groupfile)
    newgroupfile = groupfile + ".new"
    os.rename(newgroupfile, groupfile)


def removeuser(username):
    usersgroups = []
    for line in os.popen("%s groups %s" % (p4, username)):
        line = line.strip()
        print("Removing %s from %s" % (username, line))
        groupname = re.sub(r'[\@=`~+<>/:\|\\ ,\(\)\[\]\$%^&?;{}\'\"]', rep, line)
        groupfile = "%s.group" % groupname
        if not os.path.exists(groupfile):
            os.system('%s group -o "%s" > %s' % (p4, line, groupfile))
        usersgroups.append(line)
        if line not in groups:
            groups.append(line.strip())

    for group in usersgroups:
        groupname = re.sub(r'[\@=`~+<>/:\|\\ ,\(\)\[\]\$%^&?;{}\'\"]', rep, group)
        groupfile = "%s.group" % groupname
        removeuserfromfile(groupfile, username)


def savegroups():
    print("Saving groups on server")
    for group in groups:
        groupname = re.sub(r'[\@=`~+<>/:\|\\ ,\(\)\[\]\$%^&?;{}\'\"]', rep, group)
        groupfile = "%s.group" % groupname
        os.system("%s group -i < %s" % (p4, groupfile))


def cleanup():
    print("Cleaning temp files")
    for group in groups:
        try:
            groupname = re.sub(r'[\@=`~+<>/:\|\\ ,\(\)\[\]\$%^&?;{}\'\"]', rep, group)
            groupfile = "%s.group" % groupname
            os.remove(groupfile)
        except:
            print("Failed to delete %s." % groupfile)


def automain(userlist):
    global initialized
    initialized = 0
    global groups
    groups = []
    for user in userlist:
        removeuser(user)
    savegroups()
    cleanup()


def main():
    if len(sys.argv) < 2:
        print(USAGE)
        sys.exit(1)

    # Handle the optional instance parameter shift
    if len(sys.argv) > 2:
        userorfile = (sys.argv[2])
    else:
        userorfile = (sys.argv[1])

    global initialized
    initialized = 0
    global groups
    groups = []

    try:
        userlistfile = open(userorfile, "r")
        for line in userlistfile.readlines():
            line = line.strip()
            if line:
                removeuser(line)
        userlistfile.close()
    except:
        print("No file %s available, assuming it is the actual user name." % userorfile)
        removeuser(userorfile.strip())

    savegroups()
    cleanup()


if __name__ == '__main__':
    main()
# Change User Description Committed
#11 27331 C. Thomas Tyler Released SDP 2020.1.27325 (2021/01/29).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#10 26161 C. Thomas Tyler Released SDP 2019.3.26159 (2019/11/06).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#9 22685 Russell C. Jackson (Rusty) Update main with current changes from dev.
#8 20997 C. Thomas Tyler Released SDP 2016.2.20995 (2016/11/07).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#7 20974 C. Thomas Tyler Released SDP 2016.2.20972 (2016/11/01).
Copy Up using 'p4 copy -r -b perforce_software-sdp-dev'.
#6 16581 Robert Cowham Standardised processing and formatting.
Made python 2/3 compatible.
These need automated testing!
#5 15856 C. Thomas Tyler Replaced the big license comment block with a shortened
form referencing the LICENSE file included with the SDP
package, and also by the URL for the license file in
The Workshop.
#4 13908 C. Thomas Tyler Pushing SDP 2015.1.13906.
#3 11583 Russell C. Jackson (Rusty) Added -Fs to client delete in case shelves can't be deleted for some reason.

 Added replacement of / with _ for group file names to avoid errors with
 groups that have a / in the name.
#2 11524 Russell C. Jackson (Rusty) Released updated version of the SDP from Dev.
#1 10148 C. Thomas Tyler Promoted the Perforce Server Deployment Package to The Workshop.