CountUsers.py #1

  • //
  • guest/
  • sven_erik_knop/
  • P4Pythonlib/
  • scripts/
  • CountUsers.py
  • View
  • Commits
  • Open Download .zip Download (4 KB)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2013 Sven Erik Knop, Perforce Software Ltd
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1.  Redistributions of source code must retain the above copyright
#      notice, this list of conditions and the following disclaimer.
#
# 2.  Redistributions in binary form must reproduce the above copyright
#      notice, this list of conditions and the following disclaimer in the
#      documentation and/or other materials provided with the
#      distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE
# SOFTWARE, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# User contributed content on the Perforce Public Depot is not supported by Perforce,
# although it may be supported by its author. This applies to all contributions
# even those submitted by Perforce employees.
#
# CountUsers.py
#
# This python script will count unique users in a range of Perforce Servers
# The script takes a config file that contains the list of servers, and the user name and password 
# to connect. The user can (and should) be a non-privileged user 
# 
# The configuration file is a CSV file with the fields P4PORT,P4USER,P4PASSWD
# Lines starting with # are ignored as comments

from __future__ import print_function
import argparse
import sys
import P4
import re

CONFIG = "countUsers.cfg"

class P4Server:
    def __init__(self, port, user, password):
        self.p4 = P4.P4()
        self.p4.port = port
        self.p4.user = user
        self.p4.password = password
        
        self.p4.connect()
        self.p4.run_login()
        
    def get_users(self):
        users = self.p4.run_users()
        names = [ u['User'] for u in users ]
        
        return names
    
class CountUsers:
    def __init__(self, config, verbose):
        self.config = config
        self.verbose = verbose
    
        self.get_servers()
        
    def get_servers(self):
        with open(self.config) as f:
            content = f.read()
            
        splitContent = content.split('\n')
        servers = [ re.split(',\W*', x) for x in splitContent if x and x[0] != '#' ]
        
        self.servers = []
        for s in servers:
            server = P4Server(s[0], s[1], s[2])
            self.servers.append( server)
        
    def count(self):
        
        allUsers = set()
        for server in self.servers:
            users = server.get_users()
            for u in users:
                allUsers.add(u)
        
        return len(allUsers), sorted(allUsers)
        
if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description="CountUsers",
        epilog="Copyright (C) 2013 Sven Erik Knop, Perforce Software Ltd"
    )
    
    parser.add_argument('-c', '--config', default=CONFIG, help="Default is " + CONFIG)
    parser.add_argument('-v', '--verbose', action='store_true', help="Provide output on stdout")

    options = parser.parse_args()
    
    countUsers = CountUsers(options.config, options.verbose)
    
    total, userList = countUsers.count()
    
    print("Total = {}".format(total))
    if options.verbose:
        print("Unique Users = {}".format(userList))
 
# Change User Description Committed
#1 8452 Sven Erik Knop CountUsers, a simple script that allows me to count all unique users on a range
of servers. Useful if you have an enterprise wide license and want to ensure
compliance.

Needs a config file with the servers, the user to log on with and a password.
Format:

# P4PORT, P4USER, P4PASSWD
localhost:1666, countUsers, userpass
ssl:localhost:20101, countUsers, userpass
localhost:1667, countUsers, userpass

Usage help:

usage: CountUsers.py [-h] [-c CONFIG] [-v]

CountUsers

optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG, --config CONFIG
                        Default is countUsers.cfg
  -v, --verbose         Provide output on stdout

Copyright (C) 2013 Sven Erik Knop, Perforce Software Ltd

With the -v option enabled, prints out the (sorted) list of unique users as well as the
total count.