feat: enhance kick functionality with specific user kick and integration

This commit is contained in:
Whispering Wind
2025-04-14 00:08:14 +03:30
committed by GitHub
parent 8cd9866309
commit 7297eb9be2
4 changed files with 57 additions and 1 deletions

View File

@ -169,11 +169,23 @@ def reset_user(username: str):
@click.option('--username', '-u', required=True, help='Username for the user to remove', type=str) @click.option('--username', '-u', required=True, help='Username for the user to remove', type=str)
def remove_user(username: str): def remove_user(username: str):
try: try:
cli_api.kick_user_by_name(username)
cli_api.traffic_status()
cli_api.remove_user(username) cli_api.remove_user(username)
click.echo(f"User '{username}' removed successfully.") click.echo(f"User '{username}' removed successfully.")
except Exception as e: except Exception as e:
click.echo(f'{e}', err=True) click.echo(f'{e}', err=True)
@cli.command('kick-user')
@click.option('--username', '-u', required=True, help='Username of the user to kick')
def kick_user(username: str):
"""Kicks a specific user by username."""
try:
cli_api.kick_user_by_name(username)
click.echo(f"User '{username}' kicked successfully.")
except Exception as e:
click.echo(f'{e}', err=True)
@cli.command('show-user-uri') @cli.command('show-user-uri')
@click.option('--username', '-u', required=True, help='Username for the user to show the URI', type=str) @click.option('--username', '-u', required=True, help='Username for the user to show the URI', type=str)

View File

@ -49,6 +49,8 @@ class Command(Enum):
SERVICES_STATUS = os.path.join(SCRIPT_DIR, 'services_status.sh') SERVICES_STATUS = os.path.join(SCRIPT_DIR, 'services_status.sh')
VERSION = os.path.join(SCRIPT_DIR, 'hysteria2', 'version.py') VERSION = os.path.join(SCRIPT_DIR, 'hysteria2', 'version.py')
LIMIT_SCRIPT = os.path.join(SCRIPT_DIR, 'hysteria2', 'limit.sh') LIMIT_SCRIPT = os.path.join(SCRIPT_DIR, 'hysteria2', 'limit.sh')
KICK_USER_SCRIPT = os.path.join(SCRIPT_DIR, 'hysteria2', 'kickuser.sh')
# region Custom Exceptions # region Custom Exceptions
@ -302,6 +304,17 @@ def remove_user(username: str):
''' '''
run_cmd(['bash', Command.REMOVE_USER.value, username]) run_cmd(['bash', Command.REMOVE_USER.value, username])
def kick_user_by_name(username: str):
'''Kicks a specific user by username.'''
if not username:
raise InvalidInputError('Username must be provided to kick a specific user.')
script_path = Command.KICK_USER_SCRIPT.value
if not os.path.exists(script_path):
raise ScriptNotFoundError(f"Kick user script not found at: {script_path}")
try:
subprocess.run(['bash', script_path, username], check=True)
except subprocess.CalledProcessError as e:
raise CommandExecutionError(f"Failed to execute kick user script: {e}")
# TODO: it's better to return json # TODO: it's better to return json
def show_user_uri(username: str, qrcode: bool, ipv: int, all: bool, singbox: bool, normalsub: bool) -> str | None: def show_user_uri(username: str, qrcode: bool, ipv: int, all: bool, singbox: bool, normalsub: bool) -> str | None:

View File

@ -0,0 +1,31 @@
#!/bin/bash
USERNAME="$1"
if [ -z "$USERNAME" ]; then
echo "Usage: kickuser.sh <username>"
exit 1
fi
source /etc/hysteria/core/scripts/path.sh
SECRET=$(jq -r '.trafficStats.secret' "$CONFIG_FILE")
KICK_ENDPOINT="http://127.0.0.1:25413/kick"
if [ -z "$SECRET" ]; then
echo "Error: Could not retrieve trafficStats secret from config.json"
exit 1
fi
echo "Kicking user: $USERNAME"
curl -s -H "Authorization: $SECRET" -X POST -d "[\"$USERNAME\"]" "$KICK_ENDPOINT"
if [ $? -eq 0 ]; then
echo "User '$USERNAME' kicked successfully."
else
echo "Error kicking user '$USERNAME'."
exit 1
fi
exit 0

View File

@ -24,5 +24,5 @@ remove_user() {
echo -e "${red}Error:${NC} Config file $USERS_FILE not found." echo -e "${red}Error:${NC} Config file $USERS_FILE not found."
fi fi
} }
python3 "$CLI_PATH" restart-hysteria2 > /dev/null 2>&1 # python3 "$CLI_PATH" restart-hysteria2 > /dev/null 2>&1
remove_user "$1" remove_user "$1"