update_limits.py #4

  • //
  • guest/
  • russell_jackson/
  • sdp/
  • Server/
  • Unix/
  • p4/
  • common/
  • bin/
  • update_limits.py
  • View
  • Commits
  • Open Download .zip Download (3 KB)
#!/usr/bin/env python3
"""
update_limits.py - Ensure all users are in the limits group.

This script makes sure that all Perforce users are in the limits group.

Usage:
    python update_limits.py <instance>

Arguments:
    instance    SDP instance number
"""

from __future__ import annotations

import subprocess
import sys
from pathlib import Path
from typing import List


def run_p4_command(instance: str, args: List[str]) -> subprocess.CompletedProcess:
    """Run a p4 command for the given instance.

    Args:
        instance: SDP instance number
        args: Command arguments

    Returns:
        CompletedProcess result
    """
    p4_cmd = f"/p4/{instance}/bin/p4_{instance}"
    cmd = ["/p4/common/bin/p4master_run", instance, p4_cmd] + args

    return subprocess.run(
        cmd,
        capture_output=True,
        text=True,
        errors="replace",
        check=False,
    )


def login(instance: str) -> None:
    """Login to Perforce.

    Args:
        instance: SDP instance number
    """
    subprocess.run(
        ["/p4/common/bin/p4login", instance],
        capture_output=True,
        check=False,
    )


def get_all_users(instance: str) -> List[str]:
    """Get all users from the server.

    Args:
        instance: SDP instance number

    Returns:
        List of usernames
    """
    result = run_p4_command(instance, ["-ztag", "-F", "%User%", "users"])

    users: List[str] = []
    for line in result.stdout.splitlines():
        user = line.strip()
        if user:
            users.append(user)

    return users


def get_limits_group_spec(instance: str) -> str:
    """Get the limits group specification.

    Args:
        instance: SDP instance number

    Returns:
        Group specification
    """
    result = run_p4_command(instance, ["group", "-o", "limits"])
    return result.stdout


def update_limits_group(instance: str) -> bool:
    """Update the limits group with all users.

    Args:
        instance: SDP instance number

    Returns:
        True if successful
    """
    # Get all users
    users = get_all_users(instance)
    if not users:
        return True  # No users to add

    # Get current limits group spec
    limits_spec = get_limits_group_spec(instance)

    # Build new spec with all users
    lines = [line for line in limits_spec.splitlines() if line.strip()]

    # Add all users
    for user in users:
        lines.append(f"\t{user}")

    new_spec = "\n".join(lines) + "\n"

    # Update the group
    p4_cmd = f"/p4/{instance}/bin/p4_{instance}"
    result = subprocess.run(
        ["/p4/common/bin/p4master_run", instance, p4_cmd, "group", "-i"],
        input=new_spec,
        capture_output=True,
        text=True,
        check=False,
    )

    return result.returncode == 0


def main() -> int:
    """Main entry point."""
    if len(sys.argv) < 2:
        print(__doc__)
        print("Error: Instance number is required", file=sys.stderr)
        return 1

    instance = sys.argv[1]

    # Login
    login(instance)

    # Update limits group
    if update_limits_group(instance):
        return 0
    else:
        return 1


if __name__ == "__main__":
    sys.exit(main())
# Change User Description Committed
#4 32388 Russell C. Jackson (Rusty) Updates using Claude.ai to clean up the code, reduce duplication, enhanace security, and use current standards.
#3 29754 Russell C. Jackson (Rusty) Updated to work with python3 changes to string handling.
#2 22981 Russell C. Jackson (Rusty) Made files writeable so they are easier to update once on the server.
#1 22693 Russell C. Jackson (Rusty) Branched a Unix only version of the SDP.
Removed extra items to create a cleaner tree.
Moved a few items around to make more sense without Windows in the mix.
//guest/perforce_software/sdp/dev/Server/Unix/p4/common/bin/update_limits.py
#4 19768 UnstoppableDrew @tom_tyler @russell_jackson
Bug fix for running p4master_run as root, and some comment header cleanup. Job 000543

p4master_run: Preserve original arguments list and use this when exec'ing as $OSUSER.

backup_functions.sh: Add text about sourcing p4_vars yourself instead of using p4master_run.

update_limites.py: Run p4login directly without p4master_run since p4login calls p4_vars now.

everything else: Remove comment block about needing to run with p4master_run. Reword comment
  about SDP_INSTANCE since it is not always an integer value.
#3 16029 C. Thomas Tyler Routine merge to dev from main using:
p4 merge -b perforce_software-sdp-dev
#2 12169 Russell C. Jackson (Rusty) Updated copyright date to 2015

 Updated shell scripts to require an instance parameter to eliminate the need
 for calling p4master_run.    Python and Perl still need it since you have to set the
environment for them to run in.

 Incorporated comments from reviewers. Left the . instead of source as that seems
more common in the field and has the same functionality.
#1 10638 C. Thomas Tyler Populate perforce_software-sdp-dev.
//guest/perforce_software/sdp/main/Server/Unix/p4/common/bin/update_limits.py
#1 10148 C. Thomas Tyler Promoted the Perforce Server Deployment Package to The Workshop.