diff --git a/x-ui.sh b/x-ui.sh index e2485c79..4f2e57d8 100644 --- a/x-ui.sh +++ b/x-ui.sh @@ -683,12 +683,13 @@ show_xray_status() { } firewall_menu() { - echo -e "${green}\t1.${plain} Install Firewall" - echo -e "${green}\t2.${plain} Port List" - echo -e "${green}\t3.${plain} Open Ports" - echo -e "${green}\t4.${plain} Delete Ports from List" - echo -e "${green}\t5.${plain} Disable Firewall" - echo -e "${green}\t6.${plain} Firewall Status" + echo -e "${green}\t1.${plain} ${green}Install${plain} Firewall" + echo -e "${green}\t2.${plain} Port List [numbered]" + echo -e "${green}\t3.${plain} ${green}Open${plain} Ports" + echo -e "${green}\t4.${plain} ${red}Delete${plain} Ports from List" + echo -e "${green}\t5.${plain} ${green}Enable${plain} Firewall" + echo -e "${green}\t6.${plain} ${red}Disable${plain} Firewall" + echo -e "${green}\t7.${plain} Firewall Status" echo -e "${green}\t0.${plain} Back to Main Menu" read -p "Choose an option: " choice case "$choice" in @@ -712,10 +713,14 @@ firewall_menu() { firewall_menu ;; 5) - ufw disable + ufw enable firewall_menu ;; 6) + ufw disable + firewall_menu + ;; + 7) ufw status verbose firewall_menu ;; @@ -794,46 +799,81 @@ open_ports() { } delete_ports() { - # Prompt the user to enter the ports they want to delete - read -p "Enter the ports you want to delete (e.g. 80,443,2053 or range 400-500): " ports + # Display current rules with numbers + echo "Current UFW rules:" + ufw status numbered - # Check if the input is valid - if ! [[ $ports =~ ^([0-9]+|[0-9]+-[0-9]+)(,([0-9]+|[0-9]+-[0-9]+))*$ ]]; then - echo "Error: Invalid input. Please enter a comma-separated list of ports or a range of ports (e.g. 80,443,2053 or 400-500)." >&2 + # Ask the user how they want to delete rules + echo "Do you want to delete rules by:" + echo "1) Rule numbers" + echo "2) Ports" + read -p "Enter your choice (1 or 2): " choice + + if [[ $choice -eq 1 ]]; then + # Deleting by rule numbers + read -p "Enter the rule numbers you want to delete (1, 2, etc.): " rule_numbers + + # Validate the input + if ! [[ $rule_numbers =~ ^([0-9]+)(,[0-9]+)*$ ]]; then + echo "Error: Invalid input. Please enter a comma-separated list of rule numbers." >&2 + exit 1 + fi + + # Split numbers into an array + IFS=',' read -ra RULE_NUMBERS <<<"$rule_numbers" + for rule_number in "${RULE_NUMBERS[@]}"; do + # Delete the rule by number + ufw delete "$rule_number" || echo "Failed to delete rule number $rule_number" + done + + echo "Selected rules have been deleted." + + elif [[ $choice -eq 2 ]]; then + # Deleting by ports + read -p "Enter the ports you want to delete (e.g. 80,443,2053 or range 400-500): " ports + + # Validate the input + if ! [[ $ports =~ ^([0-9]+|[0-9]+-[0-9]+)(,([0-9]+|[0-9]+-[0-9]+))*$ ]]; then + echo "Error: Invalid input. Please enter a comma-separated list of ports or a range of ports (e.g. 80,443,2053 or 400-500)." >&2 + exit 1 + fi + + # Split ports into an array + IFS=',' read -ra PORT_LIST <<<"$ports" + for port in "${PORT_LIST[@]}"; do + if [[ $port == *-* ]]; then + # Split the port range + start_port=$(echo $port | cut -d'-' -f1) + end_port=$(echo $port | cut -d'-' -f2) + # Delete the port range + ufw delete allow $start_port:$end_port/tcp + ufw delete allow $start_port:$end_port/udp + else + # Delete a single port + ufw delete allow "$port" + fi + done + + # Confirmation of deletion + echo "Deleted the specified ports:" + for port in "${PORT_LIST[@]}"; do + if [[ $port == *-* ]]; then + start_port=$(echo $port | cut -d'-' -f1) + end_port=$(echo $port | cut -d'-' -f2) + # Check if the port range has been deleted + (ufw status | grep -q "$start_port:$end_port") || echo "$start_port-$end_port" + else + # Check if the individual port has been deleted + (ufw status | grep -q "$port") || echo "$port" + fi + done + else + echo "${red}Error:${plain} Invalid choice. Please enter 1 or 2." >&2 exit 1 fi - - # Delete the specified ports using ufw - IFS=',' read -ra PORT_LIST <<<"$ports" - for port in "${PORT_LIST[@]}"; do - if [[ $port == *-* ]]; then - # Split the range into start and end ports - start_port=$(echo $port | cut -d'-' -f1) - end_port=$(echo $port | cut -d'-' -f2) - # Delete the port range - ufw delete allow $start_port:$end_port/tcp - ufw delete allow $start_port:$end_port/udp - else - ufw delete allow "$port" - fi - done - - # Confirm that the ports are deleted - - echo "Deleted the specified ports:" - for port in "${PORT_LIST[@]}"; do - if [[ $port == *-* ]]; then - start_port=$(echo $port | cut -d'-' -f1) - end_port=$(echo $port | cut -d'-' -f2) - # Check if the port range has been successfully deleted - (ufw status | grep -q "$start_port:$end_port") || echo "$start_port-$end_port" - else - # Check if the individual port has been successfully deleted - (ufw status | grep -q "$port") || echo "$port" - fi - done } + update_geo() { echo -e "${green}\t1.${plain} Loyalsoldier (geoip.dat, geosite.dat)" echo -e "${green}\t2.${plain} chocolate4u (geoip_IR.dat, geosite_IR.dat)"