#!/bin/bash
#Version : ⇢ 2.5-Lite
udp_dir='/etc/UDPCustom'
source $udp_dir/module
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Local Module
#source ./module/module
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
request_public_ip=$(grep -m 1 -oE '^[0-9]{1,3}(\.[0-9]{1,3}){3}$' <<<"$(wget -T 10 -t 1 -4qO- "http://ip1.dynupdate.no-ip.com/" | curl -s 4.ipw.cn)")
#======= multi-login limiter =====
limiter() {
ltr() {
clear
msg -bar
# Check if limiter is already running and remove from scheduled tasks if so
for i in $(atq | awk '{print $1}'); do
if [[ ! $(at -c $i | grep '/etc/limiter.sh') = "" ]]; then
atrm $i
sed -i '/etc/limiter.sh/d' /var/spool/cron/crontabs/root
print_center -verd "Limiter stopped"
enter
return
fi
done
# Prompt user to configure limiter
print_center -ama "CONFIGURE LIMITER"
msg -bar
print_center -ama "Block users when they exceed the maximum number of connections"
msg -bar
# Set interval for running limiter
unset option
while [[ -z $option ]]; do
msg -nama "Run limiter every (in minutes): "
read option
if [[ ! $option =~ ^[0-9]+$ ]]; then
del 1
print_center -verm2 "Only numbers are allowed"
sleep 2
del 1
unset option && continue
elif [[ $option -le 0 ]]; then
del 1
print_center -verm2 "Minimum time is 1 minute"
sleep 2
del 1
unset option && continue
fi
del 1
echo -e "$(msg -nama "Run limiter every: ") $(msg -verd "$option minutes")"
echo "$option" >${udp_dir}/limit
done
msg -bar
# Set interval for automatically unblocking users blocked by the limiter
print_center -ama "Users blocked by the limiter will be unlocked automatically (enter 0 for manual unlock)"
msg -bar
unset option
while [[ -z $option ]]; do
msg -nama "Unblock users every (in minutes): "
read option
if [[ ! $option =~ ^[0-9]+$ ]]; then
tput cuu1 && tput dl1
print_center -verm2 "Only numbers are allowed"
sleep 2
tput cuu1 && tput dl1
unset option && continue
fi
tput cuu1 && tput dl1
[[ $option -le 0 ]] && echo -e "$(msg -nama "Unblock: ") $(msg -verd "manual")" || echo -e "$(msg -nama "Unblock users every: ") $(msg -verd "$option minutes")"
echo "$option" >${udp_dir}/unlimit
done
# Start limiter with new settings
nohup ${udp_dir}/limiter.sh &>/dev/null &
msg -bar
print_center -verd "Limiter started"
enter
}
l_exp() {
clear
msg -bar
l_cron=$(cat /var/spool/cron/crontabs/root | grep -w 'limiter.sh' | grep -w 'ssh')
if [[ -z "$l_cron" ]]; then
print_center -ama '0 1 * * * /etc/limiter.sh --ssh' >>/var/spool/cron/crontabs/root
print_center -verd "${a82:-scheduled expiration limiter\nwill be executed every day at 1 am\naccording to the time schedule}"
else
sed -i '/limiter.sh --ssh/d' /var/spool/cron/crontabs/root
print_center -verm2 "${a83:-expired limiter stopped}"
fi
enter
return
}
log() {
clear
msg -bar
print_center -ama "${a84:-LIMITER REGISTRY}"
msg -bar
[[ ! -e /etc/limit.log ]] && touch /etc/limit.log
if [[ -z $(cat /etc/limit.log) ]]; then
print_center -ama "${a85:-no account limiter record}"
msg -bar
sleep 2
return
fi
msg -teal "$(cat /etc/limit.log)"
msg -bar
print_center -ama "►► ${a86:-Press enter to continue...} ◄◄"
print_center -ama "►► ${a87:-0 to clear record} ◄◄"
read option
[[ $option = "0" ]] && print_center -ama "" >/etc/limit.log
}
[[ $(cat /var/spool/cron/crontabs/root | grep -w 'limiter.sh' | grep -w 'ssh') ]] && lim_e=$(msg -verd "[ON]") || lim_e=$(msg -verm2 "[OFF]")
clear
msg -bar
print_center -ama "${a11:-ACCOUNT LIMITER}"
msg -bar
menu_func "${a64:-MULTI-LOGIN LIMITER}" "${a65:-EXPIRED LIMITER} $lim_e" "${a66:-LIMITER LOG}"
back
msg -ne " ${a67:-option}: "
read option
case $option in
1) ltr ;;
2) l_exp ;;
3) log ;;
0) return ;;
esac
}
#======= CONFIGURATION OF SSH UDP ACCOUNTS =======
data_user() {
cat_users=$(cat "/etc/passwd" | grep 'home' | grep 'false' | grep -v 'syslog' | grep -v '::/' | grep -v 'hwid\|token')
[[ -z "$(echo "${cat_users}" | head -1)" ]] && print_center -verm2 "${a96:-NO REGISTERED SSH USERS}" && return 1
dat_us=$(printf '%-13s%-14s%-10s%-4s%-6s%s' "${a48:-User}" "${a49:-Pass}" "${a97:-Date}" "${a98:-Days}" 'Lmt' 'Stat')
msg -azu " $dat_us"
msg -bar
i=1
while read line; do
u=$(echo "$line" | awk -F ':' '{print $1}')
fecha=$(chage -l "$u" | sed -n '4p' | awk -F ': ' '{print $2}')
mes_dia=$(echo $fecha | awk -F ',' '{print $1}' | sed 's/ //g')
ano=$(echo $fecha | awk -F ', ' '{printf $2}' | cut -c 3-)
us=$(printf '%-12s' "$u")
pass=$(echo "$line" | awk -F ':' '{print $5}' | cut -d ',' -f2)
[[ "${#pass}" -gt '12' ]] && pass="${a99:-Discount}"
pass="$(printf '%-12s' "$pass")"
unset stat
if [[ $(passwd --status $u | cut -d ' ' -f2) = "P" ]]; then
stat="$(msg -verd "ULK")"
else
stat="$(msg -verm2 "BLK")"
fi
Limit=$(echo "$line" | awk -F ':' '{print $5}' | cut -d ',' -f1)
[[ "${#Limit}" = "1" ]] && Limit=$(printf '%2s%-4s' "$Limit") || Limit=$(printf '%-6s' "$Limit")
echo -ne "$(msg -verd "$i")$(msg -verm2 "-")$(msg -azu "${us}") $(msg -azu "${pass}")"
if [[ $(echo $fecha | awk '{print $2}') = "" ]]; then
exp="$(printf '%8s%-2s' '[X]')"
exp+="$(printf '%-6s' '[X]')"
echo " $(msg -verm2 "$fecha")$(msg -verd "$exp")$(echo -e "$stat")"
else
if [[ $(date +%s) -gt $(date '+%s' -d "${fecha}") ]]; then
exp="$(printf '%-5s' "Exp")"
echo " $(msg -verm2 "$mes_dia/$ano") $(msg -verm2 "$exp")$(msg -ama "$Limit")$(echo -e "$stat")"
else
EXPTIME="$(($(($(date '+%s' -d "${fecha}") - $(date +%s))) / 86400))"
[[ "${#EXPTIME}" = "1" ]] && exp="$(printf '%2s%-3s' "$EXPTIME")" || exp="$(printf '%-5s' "$EXPTIME")"
echo " $(msg -verm2 "$mes_dia/$ano") $(msg -verd "$exp")$(msg -ama "$Limit")$(echo -e "$stat")"
fi
fi
let i++
done <<<"$cat_users"
}
# ======== user Details ====
detail_user() {
clear
active_users=('' $(show_users))
if [[ -z ${active_users[@]} ]]; then
msg -bar
print_center -verm2 "${a62:-No registered user}"
msg -bar
sleep 3
return
else
msg -bar
print_center -ama "${a63:-DETAILS OF USERS}"
msg -bar
fi
data_user
msg -bar
enter
}
#======== user block ======
block_user() {
clear
active_users=('' $(show_users))
msg -bar
print_center -ama "${a9:-BLOCK/UNBLOCK USERS}"
msg -bar
data_user
back
print_center -ama "${a52:-Type a Username from the list}"
msg -bar
unset selection
while [[ ${selection} = "" ]]; do
msg -nazu "${a53:-Please type a username}: " && read selection
del 1
done
[[ ${selection} = "0" ]] && return
if [[ ! $(print_center -ama "${selection}" | egrep '[^0-9]') ]]; then
user_del="${active_users[$selection]}"
else
user_del="$selection"
fi
[[ -z $user_del ]] && {
msg -verm "${a54:-Error, Invalid User}"
msg -bar
return 1
}
[[ ! $(echo ${active_users[@]} | grep -w "$user_del") ]] && {
msg -verm "${a54:-Error, Invalid User}"
msg -bar
return 1
}
msg -nama " ${a48:-Username}: $user_del >>>> "
if [[ $(passwd --status $user_del | cut -d ' ' -f2) = "P" ]]; then
pkill -u $user_del &>/dev/null
droplim=$(droppids | grep -w "$user_del" | awk '{print $2}')
kill -9 $droplim &>/dev/null
usermod -L $user_del &>/dev/null
sleep 2
msg -verm2 "${a60:-Blocked}"
else
usermod -U $user_del
sleep 2
msg -verd "${a61:-Unblocked}"
fi
msg -bar
sleep 3
}
#======== user remover =========
renew_user_fun() {
#nama dias - perbaikan format tanggal
datexp=$(date "+%Y-%m-%d" -d " + $2 days")
# Cek apakah chage tersedia
if command -v chage &>/dev/null; then
if chage -E "$datexp" "$1" &>/dev/null; then
print_center -ama "${a100:-Renewed User Successfully}"
else
print_center -verm "${a101:-Error, Renewal failed!}"
# Tampilkan pesan error detail
print_center -verm "Error: $(chage -l "$1" 2>&1 | head -1)"
fi
else
# Alternatif jika chage tidak tersedia
if usermod -e "$datexp" "$1" &>/dev/null; then
print_center -ama "${a100:-Renewed User Successfully}"
else
print_center -verm "${a101:-Error, Renewal failed!}"
print_center -verm "Error: User modification failed"
fi
fi
}
renew_user() {
clear
# Dapatkan daftar user yang benar
active_users=()
while IFS= read -r user; do
if [[ -n "$user" ]]; then
active_users+=("$user")
fi
done < <(cat /etc/passwd | grep 'home' | grep 'false' | grep -v 'syslog' | grep -v 'hwid' | grep -v 'token' | grep -v '::/' | awk -F ':' '{print $1}')
msg -bar
print_center -ama "${a8:-RENEW USERS}"
msg -bar
data_user
back
print_center -ama "${a52:-Type a Username from the list}"
msg -bar
unset selection
while [[ -z ${selection} ]]; do
msg -nazu "${a53:-Select an Option}: " && read selection
del 1
done
[[ ${selection} = "0" ]] && return
# Validasi user yang lebih baik
useredit=""
# Cek apakah selection adalah nomor
if [[ "$selection" =~ ^[0-9]+$ ]]; then
# Pastikan nomor tidak melebihi jumlah user
if [[ $selection -gt 0 && $selection -le ${#active_users[@]} ]]; then
useredit="${active_users[$selection-1]}" # kurangi 1 karena array dimulai dari 0
fi
else
# Cek apakah selection adalah username
for user in "${active_users[@]}"; do
if [[ "$user" == "$selection" ]]; then
useredit="$user"
break
fi
done
fi
# Cek apakah user ditemukan
if [[ -z "$useredit" ]]; then
msg -verm "${a54:-Error, Invalid User}"
msg -bar
sleep 3
return 1
fi
# Cek apakah user ada di sistem
if ! id "$useredit" &>/dev/null; then
msg -verm "${a54:-Error, User does not exist}"
msg -bar
sleep 3
return 1
fi
while true; do
msg -ne "${a58:-New Duration}: $useredit"
read -p ": " userdays
if [[ -z "$userdays" ]]; then
print_center -ama -e '\n\n\n'
err_fun 7 && continue
elif [[ "$userdays" != +([0-9]) ]]; then
print_center -ama -e '\n\n\n'
err_fun 8 && continue
elif [[ "$userdays" -gt "360" ]]; then
print_center -ama -e '\n\n\n'
err_fun 9 && continue
fi
break
done
msg -bar
renew_user_fun "${useredit}" "${userdays}"
msg -bar
sleep 3
}
#======== remove client =========
droppids() {
port_dropbear=$(ps aux | grep 'dropbear' | awk NR==1 | awk '{print $17;}')
log=/var/log/auth.log
loginsukses='Password auth succeeded'
pids=$(ps ax | grep 'dropbear' | grep " $port_dropbear" | awk -F " " '{print $1}')
for pid in $pids; do
pidlogs=$(grep $pid $log | grep "$loginsukses" | awk -F" " '{print $3}')
i=0
for pidend in $pidlogs; do
let i=i+1
done
if [ $pidend ]; then
login=$(grep $pid $log | grep "$pidend" | grep "$loginsukses")
PID=$pid
user=$(print_center -ama $login | awk -F" " '{print $10}' | sed -r "s/'/ /g")
waktu=$(print_center -ama $login | awk -F" " '{print $2"-"$1,$3}')
while [ ${#waktu} -lt 13 ]; do
waktu=$waktu" "
done
while [ ${#user} -lt 16 ]; do
user=$user" "
done
while [ ${#PID} -lt 8 ]; do
PID=$PID" "
done
print_center -ama "$user $PID $waktu"
fi
done
}
rm_user() {
pkill -u $1
droplim=$(droppids | grep -w "$1" | awk '{print $2}')
kill -9 $droplim &>/dev/null
userdel --force "$1" &>/dev/null
msj=$?
}
show_users() {
for u in $(cat /etc/passwd | grep 'home' | grep 'false' | grep -v 'syslog' | grep -v 'hwid' | grep -v 'token' | grep -v '::/' | awk -F ':' '{print $1}'); do
print_center -ama "$u"
done
}
remove_user() {
clear
active_users=('' $(show_users))
msg -bar
print_center -ama "${a7:-REMOVE USERS}"
msg -bar
data_user
back
print_center -ama "${a52:-Type or Select a User}"
msg -bar
unset selection
while [[ -z ${selection} ]]; do
msg -nazu "${a53:-Please type a username}: " && read selection
tput cuu1 && tput dl1
done
[[ ${selection} = "0" ]] && return
if [[ ! $(print_center -ama "${selection}" | egrep '[^0-9]') ]]; then
user_del="${active_users[$selection]}"
else
user_del="$selection"
fi
[[ -z $user_del ]] && {
msg -verm "${a54:-Error, Invalid User}"
msg -bar
return 1
}
[[ ! $(echo ${active_users[@]} | grep -w "$user_del") ]] && {
msg -verm "${a54:-Error, Invalid User}"
msg -bar
return 1
}
print_center -ama "${a55:-Selected User}: $user_del"
rm_user "$user_del"
if [[ $msj = 0 ]]; then
print_center -verd "[${a56:-Removed}]"
else
print_center -verm "[${a57:-Not Removed}]"
fi
enter
}
#========create client =============
add_user() {
Fecha=$(date +%d-%m-%y-%R)
[[ $(cat /etc/passwd | grep $1: | grep -vi [a-z]$1 | grep -v [0-9]$1 >/dev/null) ]] && return 1
valid=$(date '+%Y-%m-%d' -d " +$3 days")
osl_v=$(openssl version | awk '{print $2}')
osl_v=${osl_v:0:5}
if [[ $osl_v = '1.1.1' ]]; then
pass=$(openssl passwd -6 $2)
else
pass=$(openssl passwd -1 $2)
fi
useradd -M -s /bin/false -e ${valid} -K PASS_MAX_DAYS=$3 -p ${pass} -c $4,$2 $1 &>/dev/null
msj=$?
}
new_user() {
clear
active_users=('' $(show_users))
msg -bar
print_center -ama "${a6:-CREATE USER ACCOUNT}"
msg -bar
data_user
back
while true; do
msg -ne " ${a41:-Username}: "
read nameuser
nameuser="$(echo $nameuser | sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚñÑçǪº/aAaAaAaAeEeEiIoOoOoOuUnNcCao/')"
nameuser="$(echo $nameuser | sed -e 's/[^a-z0-9 -]//ig')"
if [[ -z $nameuser ]]; then
err_fun 1 && continue
elif [[ "${nameuser}" = "0" ]]; then
return
elif [[ "${#nameuser}" -lt "4" ]]; then
err_fun 2 && continue
elif [[ "${#nameuser}" -gt "12" ]]; then
err_fun 3 && continue
elif [[ "$(echo ${active_users[@]} | grep -w "$nameuser")" ]]; then
err_fun 14 && continue
fi
break
done
while true; do
msg -ne " ${a42:-Password}"
read -p ": " userpass
userpass="$(echo $userpass | sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚñÑçǪº/aAaAaAaAeEeEiIoOoOoOuUnNcCao/')"
if [[ -z $userpass ]]; then
err_fun 4 && continue
elif [[ "${#userpass}" -lt "4" ]]; then
err_fun 5 && continue
elif [[ "${#userpass}" -gt "12" ]]; then
err_fun 6 && continue
fi
break
done
while true; do
msg -ne " ${a43:-Number of Days}"
read -p ": " userdays
if [[ -z "$userdays" ]]; then
err_fun 7 && continue
elif [[ "$userdays" != +([0-9]) ]]; then
err_fun 8 && continue
elif [[ "$userdays" -gt "360" ]]; then
err_fun 9 && continue
fi
break
done
while true; do
msg -ne " ${a44:-Connection Limit}"
read -p ": " limiteuser
if [[ -z "$limiteuser" ]]; then
err_fun 11 && continue
elif [[ "$limiteuser" != +([0-9]) ]]; then
err_fun 12 && continue
elif [[ "$limiteuser" -gt "999" ]]; then
err_fun 13 && continue
fi
break
done
add_user "${nameuser}" "${userpass}" "${userdays}" "${limiteuser}"
clear
msg -bar
if [[ $msj = 0 ]]; then
print_center -verd "${a45:-User Created Successfully}"
else
print_center -verm2 "${a46:-Error, user not created}"
enter
return 1
fi
msg -bar
msg -ne " ${a47:-Server IP}: " && msg -ama " $request_public_ip"
msg -ne " ${a47:-Port Range}: " && msg -ama " 1-65535"
msg -ne " ${a48:-Username}: " && msg -ama " $nameuser"
msg -ne " ${a49:-Password}: " && msg -ama " $userpass"
msg -ne " ${a50:-Number of Days}: " && msg -ama " $userdays"
msg -ne " ${a44:-Connection Limit}: " && msg -ama " $limiteuser"
msg -ne " ${a51:-Expiration Date}: " && msg -ama "$(date "+%F" -d " + $userdays days")"
enter
}
#======= CONFIGURATION OF UDP-CUSTOM & UDP-REQUEST ========
make_service() {
ip_nat=$(ip -4 addr | grep inet | grep -vE '127(\.[0-9]{1,3}){3}' | cut -d '/' -f 1 | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' | head -1)
interfas=$(ip -4 addr | grep inet | grep -vE '127(\.[0-9]{1,3}){3}' | grep "$ip_nat" | awk {'print $NF'})
ip_publica=$(grep -m 1 -oE '^[0-9]{1,3}(\.[0-9]{1,3}){3}$' <<<"$(wget -T 10 -t 1 -4qO- "http://ip1.dynupdate.no-ip.com/" || curl -s 4.ipw.cn)")
cat </etc/systemd/system/udp-request.service
[Unit]
Description=UDP Request Service
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/root
ExecStart=/usr/bin/udp-request -ip=$ip_publica -net=$interfas$Port -mode=system
Restart=always
RestartSec=3s
[Install]
WantedBy=multi-user.target
EOF
systemctl enable udp-request &>/dev/null
systemctl start udp-request &>/dev/null
if [[ $(systemctl is-active udp-request) = 'active' ]]; then
# msg -verd 'OK'
systemctl enable udp-request &>/dev/null
else
msg -verm2 'fail'
fi
if [[ $(systemctl is-active udp-request) = 'active' ]]; then
# msg -verd 'OK'
systemctl enable udp-request &>/dev/null
else
msg -verm2 'fail'
fi
}
uninstall_udp_manager() {
title "${a32:-Uninstall UDP-Manager & Binaries}"
read -rp " $(msg -ama "${a33:-Do you wish to continue? [Y/n]}:") " -e -i Y UNINS
[[ $UNINS != @(Y|y|S|s) ]] && return
systemctl stop udp-custom &>/dev/null
systemctl disable udp-custom &>/dev/null
# systemctl stop udp-request &>/dev/null
# systemctl disable udp-request &>/dev/null
# systemctl stop autostart &>/dev/null
# systemctl disable autostart &>/dev/null
rm -rf /etc/systemd/system/udp-custom.service
# rm -rf /etc/systemd/system/udp-request.service
# rm -rf /etc/systemd/system/autostart.service
rm -rf /usr/bin/udp-custom
rm -rf /root/udp/udp-custom
# rm -rf /root/udp/udp-request
# rm -rf /usr/bin/udp-request
rm -rf /root/udp/config.json
rm -rf /etc/UDPCustom/udp-custom
# rm -rf /usr/bin/udp-request
# rm -rf /etc/UDPCustom/autostart.service
# rm -rf /etc/UDPCustom/autostart
# rm -rf /etc/autostart.service
# rm -rf /etc/autostart
rm -rf /usr/bin/udpgw
rm -rf /etc/systemd/system/udpgw.service
systemctl stop udpgw &>/dev/null
del 1
print_center -ama "${a34:-Uninstallation completed!}"
rm -rf /usr/bin/udp
enter
exit
}
reset_udp_request() {
if [[ $(systemctl is-active udp-request) = 'active' ]]; then
systemctl stop udp-request &>/dev/null
systemctl disable udp-request &>/dev/null
print_center -ama "${a35:-UDP-Request reset done!}"
else
systemctl start udp-request &>/dev/null
if [[ $(systemctl is-active udp-request) = 'active' ]]; then
systemctl enable udp-request &>/dev/null
print_center -verd "${a36:-UDP-Request started!}"
else
print_center -verm2 "${a37:-failed to start udp-request.service!}"
fi
fi
enter
}
reset_udp_custom() {
if [[ $(systemctl is-active udp-custom) = 'active' ]]; then
systemctl stop udp-custom &>/dev/null
systemctl disable udp-custom &>/dev/null
print_center -ama "${a35:-UDP-Custom reset done!}"
else
systemctl start udp-custom &>/dev/null
if [[ $(systemctl is-active udp-custom) = 'active' ]]; then
systemctl enable udp-custom &>/dev/null
print_center -verd "${a36:-UDP-Custom started!}"
else
print_center -verm2 "${a37:-failed to start udp-custom.service!}"
fi
fi
enter
}
add_exclude() {
title "${a20:-Exclude UDP ports}"
print_center -ama "${a21:-UDP-Request covers full range of ports,}"
print_center -ama "${a22:-However, you can exclude UDP ports.}"
msg -bar3
print_center -ama "${a23:-Examples of ports you can exclude:}:"
print_center -ama "dnstt (slowdns) udp 53 5300"
print_center -ama "wireguard udp 51820"
print_center -ama "openvpn udp 1194"
msg -bar
print_center -verd "${a24:-enter the ports separated by spaces}"
print_center -verd "${a25:-Example}: 53 5300 51820 1194"
in_opcion_down "${a26:-type ports or hit enter to skip}"
del 4
tmport=($opcion)
# Perbaikan: gunakan for loop yang kompatibel dengan semua shell
i=0
for port in "${tmport[@]}"; do
num=$(($port))
if [[ $num -gt 0 ]]; then
echo "$(msg -ama " ${a27:-port to exclude} >") $(msg -azu "$num") $(msg -verd "OK")"
Port+=" $num"
else
msg -verm2 " ${a28:-not a port} > $port?"
continue
fi
i=$((i+1))
done
if [[ $Port = "" ]]; then
unset Port
print_center -ama "${a29:-no ports excluded}"
else
exclude=$(cat /etc/systemd/system/udp-request.service | grep 'exclude')
if systemctl is-active udp-request &>/dev/null; then
systemctl stop udp-request &>/dev/null
systemctl disable udp-request &>/dev/null
iniciar=1
fi
if [[ -z $exclude ]]; then
Port=" -exclude=$(echo "$Port" | sed "s/ /,/g" | sed 's/,//')"
sed -i "s/ -mode/$Port -mode/" /etc/systemd/system/udp-request.service
else
exclude_port=$(echo $exclude | awk '{print $4}' | cut -d '=' -f2)
Port="-exclude=$exclude_port$(echo "$Port" | sed "s/ /,/g")"
sed -i "s/-exclude=$exclude_port/$Port/" /etc/systemd/system/udp-request.service
fi
if [[ $iniciar = 1 ]]; then
systemctl start udp-request &>/dev/null
systemctl enable udp-request &>/dev/null
fi
fi
enter
}
quit_exclude() {
title "${a88:-REMOVE EXCLUSION PORT}"
exclude=$(cat /etc/systemd/system/udp-request.service | grep 'exclude' | awk '{print $4}')
ports=($port)
for ((i = 0; i < ${#ports[@]}; i++)); do
a=$(($i + 1))
echo " $(msg -verd "[$a]") $(msg -verm2 '>') $(msg -azu "${ports[$i]}")"
done
if [[ ! ${#ports[@]} = 1 ]]; then
let a++
msg -bar
echo " $(msg -verd "[0]") $(msg -verm2 ">") $(msg -bra "\033[1;41m${a89:-GO BACK}") $(msg -verd "[$a]") $(msg -verm2 ">") $(msg -bra "\033[1;41m${a90:-REMOVE ALL}")"
msg -bar
else
msg -bar
echo " $(msg -verd "[0]") $(msg -verm2 ">") $(msg -bra "\033[1;41m${a89:-GO BACK}")"
msg -bar
fi
option=$(selection_fun $a)
[[ $option = 0 ]] && return
if systemctl is-active udp-request &>/dev/null; then
systemctl stop udp-request &>/dev/null
systemctl disable udp-request &>/dev/null
iniciar=1
fi
if [[ $option = $a ]]; then
sed -i "s/$exclude /" /etc/systemd/system/udp-request.service
print_center -ama "${a91:-Removed all excluded ports}"
else
let option--
unset Port
for ((i = 0; i < ${#ports[@]}; i++)); do
[[ $i = $option ]] && continue
echo "$(msg -ama " ${a27:-Port to exclude} >") $(msg -azu "${ports[$i]}") $(msg -verd "OK")"
Port+=" ${ports[$i]}"
done
Port=$(echo $Port | sed 's/ /,/g')
sed -i "s/$exclude/-exclude=$Port/" /etc/systemd/system/udp-request.service
fi
if [[ $iniciar = 1 ]]; then
systemctl start udp-request &>/dev/null
systemctl enable udp-request &>/dev/null
fi
enter
}
# [Tweak UDP Speed]
tweak_udp_speed() {
# WARNING!!!
clear
echo ""
msg -bar
echo "$(msg -verm2 "${a3:- A RISK TO YOUR SYSTEM}")"
echo "$(msg -verm2 "${a8:- ⇢ ... this may or may-not work,}")"
echo "$(msg -verm2 "${a8:- depending on your OS Image!}")"
sleep 2
echo "$(msg -verm2 "${a8:- ⇢ patching...}")"
sleep 2
# Turn off TCP Timestamps to improve UDP throughput
echo 0 >/proc/sys/net/ipv4/tcp_timestamps
# Increase the maximum amount of memory available for network buffers
echo 4194304 >/proc/sys/net/core/wmem_max
echo 4194304 >/proc/sys/net/core/rmem_max
# Increase the default network buffer sizes
echo 16384 87380 16777216 >/proc/sys/net/ipv4/tcp_wmem
echo 16384 87380 16777216 >/proc/sys/net/ipv4/tcp_rmem
# Increase the maximum size of the receive buffer queue
echo 4096 >/proc/sys/net/ipv4/tcp_max_syn_backlog
# Increase the maximum number of open files per process
ulimit -n 65535
# Reboot networking interface
sudo systemctl restart NetworkManager &>/dev/null
sleep 2
echo "${a6:- ⇢ You may see network speed improvement on this Server.}"
echo "${a6:- ⇢ Done!}"
msg -bar0
sleep 3
}
vps_info() {
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#information
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
if [[ "$(grep -c "Ubuntu" /etc/issue.net)" = "1" ]]; then
system=$(cut -d' ' -f1 /etc/issue.net)
system+=$(echo ' ')
system+=$(cut -d' ' -f2 /etc/issue.net | awk -F "." '{print $1}')
else
system=$(cut -d' ' -f1 /etc/issue.net)
fi
_system=$(printf '%-14s' "$system")
os_arch=$(uname -i)
ip=$(wget -qO- ipinfo.io/ip)
region=$(wget -qO- ipinfo.io/region)
isp=$(wget -qO- ipinfo.io/org)
timezone=$(wget -qO- ipinfo.io/timezone)
ossys=$(neofetch | grep "OS" | cut -d: -f2 | sed 's/ //g')
host=$(neofetch | grep "Host" | cut -d: -f2 | sed 's/ //g')
kernel=$(neofetch | grep "Kernel" | cut -d: -f2 | sed 's/ //g')
uptime=$(neofetch | grep "Uptime" | cut -d: -f2 | sed 's/ //g')
cpu=$(top -bn1 | awk '/Cpu/ { cpu = "" 100 - $8 "%" }; END { print cpu }')
_core=$(printf '%-1s' "$(grep -c cpu[0-9] /proc/stat)")
memory=$(neofetch | grep "Memory" | cut -d: -f2 | sed 's/ //g')
ram=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')
clear
title_sub "\033[3;40m${a10:-•UDP Custom Manager} •"
print_center -ama ' Version: 2.5-Lite'
print_center -ama ' VPS Info'
msg -bar
echo " "
echo -e "$CLAY ⇢ Operating System :$NC $system $NC"
echo -e "$CLAY ⇢ Arch :$NC $os_arch $NC"
echo -e "$CLAY ⇢ IP Address :$NC $ip $NC"
echo -e "$CLAY ⇢ Region :$NC $region $NC"
echo -e "$CLAY ⇢ ISP :$NC $isp $NC"
echo -e "$CLAY ⇢ Date :$NC $(date +%A) $(date +%m-%d-%Y)"
echo -e "$CLAY ⇢ Up Time :$NC $uptime $NC"
echo -e "$CLAY ⇢ CPU Load :$NC $cpu $NC"
echo -e "$CLAY ⇢ CPU Cores :$NC $_core $NC"
echo -e "$CLAY ⇢ Memory Usage :$NC $memory $NC"
echo -e "$CLAY ⇢ Ram Usage :$NC $ram $NC"
msg -bar0
enter
}
# [UDP - Request]
menu_udp_request() {
make_service
title "\033[3;40m${a10:-•UDP Custom | UDP Request Manager} •"
print_center -ama ' Version: ⇢ 2.5-Lite'
print_center -ama ' UDP REQUEST'
print_center -ama ' Tunnel App : SocksIP'
msg -bar
if [[ $(systemctl is-active udp-request) = 'active' ]]; then
port=$(cat /etc/systemd/system/udp-request.service | grep 'exclude')
if [[ ! $port = "" ]]; then
port=$(echo $port | awk '{print $4}' | cut -d '=' -f2 | sed 's/,/ /g')
print_center -ama "${a2:-EXCLUDED PORTS} $port"
msg -bar0
msg -bar
fi
fi
ram=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')")
cpu=$(printf '%-1s' "$(top -bn1 | awk '/Cpu/ { cpu = "" 100 - $8 "%" }; END { print cpu }')")
# print_center -ama " $(msg -verd 'IP:') $(msg -azu "$request_public_ip") $(msg -verd 'Ram:') $(msg -azu "$ram") $(msg -verd 'CPU:') $(msg -azu "$cpu")"
echo " $(msg -verd ' ⇢ IP:') $(msg -azu "$request_public_ip") $(msg -verd 'Ram:') $(msg -azu "$ram") $(msg -verd 'CPU:') $(msg -azu "$cpu")"
msg -bar
if [[ $(systemctl is-active udp-request) == 'active' ]]; then
state=$(echo -e "\e[1m\e[32m[ON]")
else
systemctl start udp-request &>/dev/null
if [[ $(systemctl is-active udp-request) == 'active' ]]; then
state=$(echo -e "\e[1m\e[32m[ON]")
else
state=$(echo -e "\e[1m\e[31m[OFF]")
fi
fi
echo -e " $(msg -verd "[1]") $(msg -verm2 '>') $(msg -azu "${a2:-Activate/Deactivate UDP-Request}") $state"
msg -bar0
msg -bar3
print_center -ama "${a12:-QUICK MENU}"
msg -bar3
echo " $(msg -verd "[2]") $(msg -verm2 '>') $(msg -verd "${a6:-Create User}")"
echo " $(msg -verd "[3]") $(msg -verm2 '>') $(msg -verm2 "${a7:-Remove User}")"
echo " $(msg -verd "[4]") $(msg -verm2 '>') $(msg -ama "${a8:-Renew User}")"
echo " $(msg -verd "[5]") $(msg -verm2 '>') $(msg -blu "${a9:-Block/Unlock User}")"
echo " $(msg -verd "[6]") $(msg -verm2 '>') $(msg -verm3 "${a10:-User Details}")"
echo " $(msg -verd "[7]") $(msg -verm2 '>') $(msg -teal "${a11:-Limit Accounts}")"
msg -bar3
print_center -ama "${a12:-Port Exclusion List}"
msg -bar3
echo " $(msg -verd "[8]") $(msg -verm2 '>') $(msg -verd "${a13:-Add Port To The Exclusion List}")"
num=8
if [[ ! $port = "" ]]; then
echo " $(msg -verd "[9]") $(msg -verm2 '>') $(msg -verm2 "${a14:-Port Exclusion List}")"
num=9
fi
back
option=$(selection_fun $num)
case $option in
1) reset_udp_request ;;
2) new_user ;;
3) remove_user ;;
4) renew_user ;;
5) block_user ;;
6) detail_user ;;
7) limiter ;;
8) add_exclude ;;
9) quit_exclude ;;
0) menu_main ;;
esac
}
# [UDP - Custom]
menu_udp_custom() {
# title "\033[3;40m${a10:-•UDP Custom | UDP Request Manager} •"
title_sub "\033[3;40m${a10:-•UDP Custom Manager} •"
print_center -ama ' Version: 2.5-Lite'
print_center -ama ' UDP CUSTOM'
print_center -ama ' Tunnel App : HTTP Custom'
msg -bar
ram=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')")
cpu=$(printf '%-1s' "$(top -bn1 | awk '/Cpu/ { cpu = "" 100 - $8 "%" }; END { print cpu }')")
echo " $(msg -verd ' ⇢ IP:') $(msg -azu "$request_public_ip") $(msg -verd 'Ram:') $(msg -azu "$ram") $(msg -verd 'CPU:') $(msg -azu "$cpu")"
msg -bar
if [[ $(systemctl is-active udp-custom) = 'active' ]]; then
state="\e[1m\e[32m[ON]"
else
state="\e[1m\e[31m[OFF]"
fi
echo -e " $(msg -verd "[1]") $(msg -verm2 '>') $(msg -azu "${a2:-Activate/Deactivate UDP-Custom}") $state"
msg -bar0
msg -bar3
print_center -ama "${a12:-QUICK MENU}"
msg -bar3
echo " $(msg -verd "[2]") $(msg -verm2 '>') $(msg -verd "${a6:-Create User}")"
echo " $(msg -verd "[3]") $(msg -verm2 '>') $(msg -verm2 "${a7:-Remove User}")"
echo " $(msg -verd "[4]") $(msg -verm2 '>') $(msg -ama "${a8:-Renew User}")"
echo " $(msg -verd "[5]") $(msg -verm2 '>') $(msg -blu "${a9:-Block/Unlock User}")"
echo " $(msg -verd "[6]") $(msg -verm2 '>') $(msg -verm3 "${a10:-User Details}")"
echo " $(msg -verd "[7]") $(msg -verm2 '>') $(msg -teal "${a11:-Limit Accounts}")"
msg -bar3
back
# option=$(selection_fun $num)
read -p " ⇢ Enter your selection: " option
case $option in
1) reset_udp_custom ;;
2) new_user ;;
3) remove_user ;;
4) renew_user ;;
5) block_user ;;
6) detail_user ;;
7) limiter ;;
0) menu_main ;;
esac
}
# --- FUNGSI MENU_MAIN DENGAN WARNA BARU ---
# [MAIN MENU]A
menu_main() {
# Definisi Warna Baru
NC='\e[0m' # No Color
WHITE='\e[1;37m'
CYAN='\e[1;36m'
LIGHT_CYAN='\e[1;96m'
GREEN='\e[1;32m'
LIGHT_GREEN='\e[1;92m'
YELLOW='\e[1;33m'
LIGHT_BLUE='\e[1;94m'
GRAY='\e[0;37m'
PURPLE='\e[1;35m'
clear
# Header Baru
echo -e "${CYAN}┌──────────────────────────────────────────────────────────────────────────────┐${NC}"
echo -e "${CYAN}│${NC} ${LIGHT_CYAN}• UDP Custom Manager •${NC} ${CYAN}│${NC}"
echo -e "${CYAN}│${NC} ${WHITE}Version: 2.5-Lite${NC} ${CYAN}│${NC}"
echo -e "${CYAN}│${NC} ${GRAY}Tunnel App : HAXOR Custom${NC} ${CYAN}│${NC}"
echo -e "${CYAN}└──────────────────────────────────────────────────────────────────────────────┘${NC}"
echo ""
# System Info Baru
ram=$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')
cpu=$(top -bn1 | awk '/Cpu/ { cpu = "" 100 - $8 "%" }; END { print cpu }')
echo -e " ${LIGHT_BLUE} ⇢ IP:${NC} ${GREEN}$request_public_ip${NC} ${LIGHT_BLUE}Ram:${NC} ${YELLOW}$ram${NC} ${LIGHT_BLUE}CPU:${NC} ${YELLOW}$cpu${NC}"
echo -e "${GRAY}────────────────────────────────────────────────────────────────────────${NC}"
echo ""
# Menu Options Baru
echo -e "${LIGHT_CYAN} ${PURPLE}CHOOSE UDP CORE${NC}"
echo -e "${GRAY}────────────────────────────────────────────────────────────────────────${NC}"
echo -e " ${LIGHT_GREEN}[1]${NC} ${WHITE}UDP Custom${NC}"
echo ""
echo -e "${LIGHT_GREEN}[3]${NC} ${WHITE}Tweak UDP Speed${NC} ${YELLOW}[!Caution!]${NC}"
echo -e "${LIGHT_GREEN}[4]${NC} ${WHITE}VPS Info${NC}"
echo ""
echo -e "${LIGHT_GREEN}[10]${NC} ${WHITE}Uninstall UDP Manager${NC}"
echo -e "${LIGHT_GREEN}[11]${NC} ${WHITE}Monitoring User UDP (Panel)${NC}"
echo -e "${GRAY}────────────────────────────────────────────────────────────────────────${NC}"
echo -e " ${LIGHT_GREEN}[0]${NC} ${WHITE}Exit${NC}"
echo ""
# Prompt Baru
echo -n -e " ${LIGHT_BLUE} ⇢ Enter your selection:${NC} "
read option
# handle option selection
case $option in
1)
menu_udp_custom
;;
3)
tweak_udp_speed
;;
4)
vps_info
;;
10)
uninstall_udp_manager
;;
11)
clear
monitorpanel
;;
0)
exit
;;
esac
}
while [[ $? -eq 0 ]]; do
menu_main
done
1.Buka nano dan simpan skrip ini ke file:
nano /usr/bin/udp
2.Simpan file (Ctrl+O, Enter) dan keluar (Ctrl+X)
3.Beri izin eksekusi:
chmod +x /usr/bin/udp
4.Jalankan Panel.
udp
