feat: enhance kick functionality with specific user kick and integration
This commit is contained in:
12
core/cli.py
12
core/cli.py
@ -169,11 +169,23 @@ def reset_user(username: str):
|
||||
@click.option('--username', '-u', required=True, help='Username for the user to remove', type=str)
|
||||
def remove_user(username: str):
|
||||
try:
|
||||
cli_api.kick_user_by_name(username)
|
||||
cli_api.traffic_status()
|
||||
cli_api.remove_user(username)
|
||||
click.echo(f"User '{username}' removed successfully.")
|
||||
except Exception as e:
|
||||
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')
|
||||
@click.option('--username', '-u', required=True, help='Username for the user to show the URI', type=str)
|
||||
|
||||
@ -49,6 +49,8 @@ class Command(Enum):
|
||||
SERVICES_STATUS = os.path.join(SCRIPT_DIR, 'services_status.sh')
|
||||
VERSION = os.path.join(SCRIPT_DIR, 'hysteria2', 'version.py')
|
||||
LIMIT_SCRIPT = os.path.join(SCRIPT_DIR, 'hysteria2', 'limit.sh')
|
||||
KICK_USER_SCRIPT = os.path.join(SCRIPT_DIR, 'hysteria2', 'kickuser.sh')
|
||||
|
||||
|
||||
# region Custom Exceptions
|
||||
|
||||
@ -302,6 +304,17 @@ def remove_user(username: str):
|
||||
'''
|
||||
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
|
||||
def show_user_uri(username: str, qrcode: bool, ipv: int, all: bool, singbox: bool, normalsub: bool) -> str | None:
|
||||
|
||||
31
core/scripts/hysteria2/kickuser.sh
Normal file
31
core/scripts/hysteria2/kickuser.sh
Normal 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
|
||||
@ -24,5 +24,5 @@ remove_user() {
|
||||
echo -e "${red}Error:${NC} Config file $USERS_FILE not found."
|
||||
fi
|
||||
}
|
||||
python3 "$CLI_PATH" restart-hysteria2 > /dev/null 2>&1
|
||||
# python3 "$CLI_PATH" restart-hysteria2 > /dev/null 2>&1
|
||||
remove_user "$1"
|
||||
|
||||
Reference in New Issue
Block a user