Cecep Purwana

I am a Personal fun

Cecep Purwana

Seorang Driver Dump Truck Yang Menjadikan Computer Sebagai Hobi Dan Memiliki Ketertarikan Akan Dunia IT,Serta Ingin Selalu Mencoba Sesuatu Yang Baru Untuk Menambah Pengetahuan Dan Pengalaman Diri. "Computer is my hobby, the street is my life"

  • Jalan Raya Badau Km.11 Rt.006.Rw.002 Tanjung Pandan Belitung 33451
  • +628197887769
  • purwana.cecep@gmail.com
  • www.ceceppurwana.blogspot.co.id
Me

My Professional Skills

Web Development 90%
Internet Marketing 95%
Computer Technician 95%
Blogger 95%
Driver 97%

Jasa Pembuatan Website

Menerima jasa pembuatan website Usaha,Pribadi,Organisasi,Sekolah,Berita,Iklan Online,Toko Online,dll sesuai dengan permintaan anda

Service Computer

Jasa Service komputer belitung terpercaya dan berpengalaman.Kami memberikan service dan layanan terbaik sehingga customer merasa puas akan layanan yang kami berikan

Perakitan Computer

Jasa Perakitan Komputer kantor, pribadi, maupun game/warnet, Kami Memenuhi kebutuhan anda berdasarkan budget dengan mengutamakan kualitas

Internet Marketing

Merancang cara pemasaran atau modern marketing plan yang fokus mendapatkan prospek atau leads hingga meningkatkan convertion rate merupakan pilihan yang cepat, tepat dan murah.

Pemasangan CCTV

Menerima Jasa Setting CCTV , Jasa Pemasangan CCTV dan Perawatan CCTV untuk Rumah, Kafe, Hotel, Penginapan, Rumah Makan, Kantor, Warnet dan lain-lainnya.Keterangan lebih lanjut hubungi kami.

Maintenance Computer

Jasa Maintenance komputer untuk perkantoran,sekolah atau warnet,khusus bagi anda yang menghargai waktu berharga anda.Serahkan urusan ini kepada kami.Yang terbaik hanya untuk anda

0
completed project
0
my client
0
facebook like
0
work partners
  • UDP RENEW Script Fix

    udp_script_renew_fix
    Ini adalah script perbaikan udp yang mengalami error saat renew user
    #!/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
    Cara Menggunakan:
    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
  • Cara Non Aktifkan IPV6 Pada Server Atau VPS

    Ini adalah metode yang paling umum,aman,dan mudah untuk dikembalikan (revert). Perubahan akan bertahan setelah reboot.
    Langkah 1: Cek Status IPv6 Saat Ini Apakah Sedang Aktif
    ip a | grep inet6
    Langkah 2: Edit File Konfigurasi sysctl.conf
    sudo nano /etc/sysctl.conf
    Langkah 3: Tambahkan Baris Konfigurasi
    Gulir ke bagian paling bawah file, lalu tambahkan baris-baris berikut:
    # Menonaktifkan IPv6 untuk semua interface
    net.ipv6.conf.all.disable_ipv6 = 1
    # Menonaktifkan IPv6 untuk interface baru yang akan ditambahkan
    net.ipv6.conf.default.disable_ipv6 = 1
    # Menonaktifkan IPv6 untuk interface loopback (lo)
    net.ipv6.conf.lo.disable_ipv6 = 1
    Langkah 4: Simpan dan Tutup File
    Langkah 5: Terapkan Perubahan Tanpa Reboot
    sudo sysctl -p
    Langkah 6: Verifikasi bahwa IPv6 Telah Dinonaktifkan
    Jika berhasil, perintah ini tidak akan menampilkan output apa pun.
    ip a | grep inet6
    Anda juga bisa memeriksanya langsung dari file sistem kernel:
    cat /proc/sys/net/ipv6/conf/all/disable_ipv6
    Outputnya harus angka 1, yang berarti IPv6 telah dinonaktifkan.
    Cara Mengembalikan (Mengaktifkan Kembali) IPv6
    1.Buka kembali file sysctl.conf: sudo nano /etc/sysctl.conf
    sudo nano /etc/sysctl.conf
    2.Hapus tanda # di depan baris yang Anda tambahkan, atau ubah angka 1 menjadi 0, atau berikan tanda komentar # di setiap barisnya.
    #net.ipv6.conf.all.disable_ipv6 = 1
    #net.ipv6.conf.default.disable_ipv6 = 1
    #net.ipv6.conf.lo.disable_ipv6 = 1
    3.Simpan file (Ctrl+X, Y, Enter).
    4.Terapkan perubahan: sudo sysctl -p
    sudo sysctl -p
  • Membuat Menu Panel ZIVPN

    Cara Instalasi Pada Server atau VPS :
    1.Buka editor nano dengan perintah :
    sudo nano /usr/local/bin/zivpanel
    2.Salin dan tempel seluruh script kedalam nano.
    3.Berikan izin eksekusi dengan perintah :
    sudo chmod +x /usr/local/bin/zivpanel
    4.Jalankan panel dengan perintah :
    zivpanel
    Script Panel
    #!/bin/bash
    
    # --- VARIABEL KONFIGURASI ---
    MANUAL_DIR="/root/zivpn_manual"
    MANUAL_ACCOUNTS_FILE="$MANUAL_DIR/manual_accounts.txt"
    
    # Buat direktori jika belum ada
    mkdir -p "$MANUAL_DIR"
    
    # --- VARIABEL WARNA ---
    RESET="\033[0m"
    BLACK="\033[0;30m"
    RED="\033[0;31m"
    GREEN="\033[0;32m"
    YELLOW="\033[0;33m"
    BLUE="\033[0;34m"
    PURPLE="\033[0;35m"
    CYAN="\033[0;36m"
    WHITE="\033[0;37m"
    
    # --- WARNA TERANG ---
    LIGHT_CYAN="\033[1;36m"
    LIGHT_GREEN="\033[1;32m"
    LIGHT_YELLOW="\033[1;33m"
    LIGHT_PURPLE="\033[1;35m"
    LIGHT_GRAY="\033[0;37m" # Sama dengan WHITE untuk opsi
    
    # --- FUNGSI-FUNGSI ---
    
    # Fungsi untuk mengambil informasi sistem (IP, CPU, RAM)
    get_system_info() {
        # Dapatkan IP Publik VPS
        VPS_IP=$(curl -s --connect-timeout 3 ifconfig.me)
        if [ -z "$VPS_IP" ]; then
            VPS_IP="N/A"
        fi
    
        # Dapatkan Penggunaan CPU
        CPU_USAGE_RAW=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
        CPU_USAGE=$(printf "%.1f" "$CPU_USAGE_RAW")
    
        # Dapatkan Penggunaan RAM
        RAM_USAGE=$(free -m | awk 'NR==2{printf "%.1f%%", $3*100/$2}')
    }
    
    # Fungsi untuk membersihkan layar dan menampilkan menu utama
    tampilkan_menu() {
        clear
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_CYAN}        ZIVPN Management Panel${RESET}"
        echo -e "${LIGHT_GRAY}       Dekeng Ane Biak Belitong${RESET}" # Subtitle baru
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_PURPLE}IP VPS: ${RESET}${YELLOW}$VPS_IP${RESET} | ${LIGHT_PURPLE}CPU: ${RESET}${GREEN}$CPU_USAGE%${RESET} | ${LIGHT_PURPLE}RAM: ${RESET}${GREEN}$RAM_USAGE${RESET}"
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_GRAY}1. Tambah Akun${RESET}"                     # Teks diperbarui
        echo -e "${LIGHT_GRAY}2. Hapus Akun${RESET}"                     # Teks diperbarui
        echo -e "${LIGHT_GRAY}3. List Akun${RESET}"                      # Teks diperbarui
        echo -e "${LIGHT_GRAY}4. Kelola Akun Manual${RESET}"
        echo -e "${CYAN}--------------------------------------------${RESET}"
        echo -e "${LIGHT_GRAY}5. Download Script${RESET}"                # Teks diperbarui
        echo -e "${LIGHT_GRAY}6. Install Script${RESET}"                 # Teks diperbarui
        echo -e "${LIGHT_GRAY}7. Speedtest & Monitor${RESET}"
        echo -e "${LIGHT_GRAY}8. Info VPS${RESET}"
        echo -e "${CYAN}--------------------------------------------${RESET}"
        echo -e "${LIGHT_GRAY}0. Keluar${RESET}"
        echo -e "${CYAN}============================================${RESET}"
    }
    
    # Fungsi untuk menampilkan menu kelola akun manual
    tampilkan_menu_manual() {
        clear
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_CYAN}     Kelola Akun Manual (Catatan Pribadi)${RESET}"
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_GRAY}1. Tambah Akun Manual${RESET}"
        echo -e "${LIGHT_GRAY}2. Hapus Akun Manual${RESET}"
        echo -e "${LIGHT_GRAY}3. Lihat Daftar Akun Manual${RESET}"
        echo -e "${LIGHT_GRAY}4. Perpanjang Akun Manual${RESET}"
        echo -e "${LIGHT_GRAY}0. Kembali ke Menu Utama${RESET}"
        echo -e "${CYAN}============================================${RESET}"
    }
    
    # Fungsi untuk menampilkan menu monitor
    tampilkan_menu_monitor() {
        clear
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_CYAN}        Speedtest & Monitor${RESET}"
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_GRAY}1. Speedtest (Ookla)${RESET}"
        echo -e "${LIGHT_GRAY}2. Monitor Traffic (vnstat)${RESET}"
        echo -e "${LIGHT_GRAY}0. Kembali ke Menu Utama${RESET}"
        echo -e "${CYAN}============================================${RESET}"
    }
    
    # Fungsi untuk menampilkan menu vnstat
    tampilkan_menu_vnstat() {
        clear
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_CYAN}        Monitor Traffic (vnstat)${RESET}"
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_GRAY}1. Traffic Per Jam${RESET}"
        echo -e "${LIGHT_GRAY}2. Traffic Per Hari${RESET}"
        echo -e "${LIGHT_GRAY}3. Traffic Per Bulan${RESET}"
        echo -e "${LIGHT_GRAY}4. Traffic Per Tahun${RESET}"
        echo -e "${LIGHT_GRAY}5. Top 10 Hari (Penggunaan Tertinggi)${RESET}"
        echo -e "${LIGHT_GRAY}0. Kembali${RESET}"
        echo -e "${CYAN}============================================${RESET}"
    }
    
    # Fungsi untuk menampilkan menu info VPS
    tampilkan_menu_info_vps() {
        clear
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_CYAN}        Informasi VPS${RESET}"
        echo -e "${CYAN}============================================${RESET}"
        echo -e "${LIGHT_GRAY}1. System Resource (htop)${RESET}"
        echo -e "${LIGHT_GRAY}2. System Overview (neofetch)${RESET}"
        echo -e "${LIGHT_GRAY}3. Disk Usage${RESET}"
        echo -e "${LIGHT_GRAY}4. Memory Usage${RESET}"
        echo -e "${LIGHT_GRAY}5. System Info (uname)${RESET}"
        echo -e "${LIGHT_GRAY}0. Kembali ke Menu Utama${RESET}"
        echo -e "${CYAN}============================================${RESET}"
    }
    
    
    # --- FUNGSI-FUNGSI AKUN MANUAL ---
    
    # Fungsi untuk menghitung sisa hari
    hitung_sisa_hari() {
        local expiry_date=$1 # Format: YYYY-MM-DD
        local today=$(date +%Y-%m-%d)
        
        local sisa_detik=$(( ($(date -d "$expiry_date" +%s) - $(date -d "$today" +%s)) ))
        local sisa_hari=$((sisa_detik / 86400))
    
        if [ "$sisa_hari" -lt 0 ]; then
            echo -e "${RED}EXPIRED${RESET}"
        else
            echo "$sisa_hari"
        fi
    }
    
    tambah_akun_manual() {
        echo -e "${LIGHT_CYAN}--- Tambah Akun Manual Baru ---${RESET}"
        read -p "Masukkan Username: " username
        read -p "Masukkan masa aktif (dalam hari): " jumlah_hari
    
        if ! [[ "$jumlah_hari" =~ ^[0-9]+$ ]]; then
            echo -e "${RED}❌ Input tidak valid. Harap masukkan angka.${RESET}"
            read -p "Tekan Enter untuk kembali..."
            return
        fi
    
        local expiry_date=$(date -d "$jumlah_hari days" +%Y-%m-%d)
        echo "$username:$expiry_date" >> "$MANUAL_ACCOUNTS_FILE"
        echo ""
        echo -e "${GREEN}✅ Akun '$username' berhasil ditambahkan. Expired: $(date -d "$expiry_date" +%d-%m-%Y)${RESET}"
        read -p "Tekan Enter untuk kembali..."
    }
    
    hapus_akun_manual() {
        if [ ! -s "$MANUAL_ACCOUNTS_FILE" ]; then
            echo -e "${YELLOW}Belum ada akun manual yang terdaftar.${RESET}"
            read -p "Tekan Enter untuk kembali..."
            return
        fi
        
        echo -e "${LIGHT_CYAN}--- Hapus Akun Manual ---${RESET}"
        tampilkan_list_manual
        echo ""
        read -p "Masukkan Username yang ingin dihapus: " username_to_delete
    
        if ! grep -q "^$username_to_delete:" "$MANUAL_ACCOUNTS_FILE"; then
            echo -e "${RED}❌ Akun dengan username '$username_to_delete' tidak ditemukan.${RESET}"
            read -p "Tekan Enter untuk kembali..."
            return
        fi
    
        sed -i "/^$username_to_delete:/d" "$MANUAL_ACCOUNTS_FILE"
        
        if grep -q "^$username_to_delete:" "$MANUAL_ACCOUNTS_FILE"; then
            echo -e "${RED}❌ Gagal menghapus akun '$username_to_delete'. Silakan coba lagi.${RESET}"
        else
            echo ""
            echo -e "${GREEN}✅ Akun '$username_to_delete' berhasil dihapus.${RESET}"
        fi
        read -p "Tekan Enter untuk kembali..."
    }
    
    tampilkan_list_manual() {
        echo -e "${LIGHT_CYAN}--- Daftar Akun Manual ---${RESET}"
        if [ ! -s "$MANUAL_ACCOUNTS_FILE" ]; then
            echo -e "${YELLOW}Belum ada akun manual yang terdaftar.${RESET}"
            return
        fi
    
        printf "%-15s | %-12s | %-10s\n" "Username" "Expired" "Sisa Hari"
        echo -e "${CYAN}---------------------------------------------${RESET}"
    
        while IFS=: read -r username expiry_date; do
            sisa_hari=$(hitung_sisa_hari "$expiry_date")
            formatted_date=$(date -d "$expiry_date" +%d-%m-%Y)
            printf "%-15s | %-12s | %-10s\n" "$username" "$formatted_date" "$sisa_hari"
        done < "$MANUAL_ACCOUNTS_FILE"
    }
    
    renew_akun_manual() {
        if [ ! -s "$MANUAL_ACCOUNTS_FILE" ]; then
            echo -e "${YELLOW}Belum ada akun manual yang terdaftar.${RESET}"
            read -p "Tekan Enter untuk kembali..."
            return
        fi
    
        echo -e "${LIGHT_CYAN}--- Perpanjang Akun Manual ---${RESET}"
        tampilkan_list_manual
        echo ""
        read -p "Masukkan Username yang ingin diperpanjang: " username_to_renew
    
        local old_expiry=$(grep "^$username_to_renew:" "$MANUAL_ACCOUNTS_FILE" | cut -d':' -f2)
        
        if [ -z "$old_expiry" ]; then
            echo -e "${RED}❌ Akun dengan username '$username_to_renew' tidak ditemukan.${RESET}"
            read -p "Tekan Enter untuk kembali..."
            return
        fi
    
        read -p "Masukkan jumlah hari perpanjangan: " jumlah_hari
    
        if ! [[ "$jumlah_hari" =~ ^[0-9]+$ ]]; then
            echo -e "${RED}❌ Input tidak valid. Harap masukkan angka.${RESET}"
            read -p "Tekan Enter untuk kembali..."
            return
        fi
    
        local new_expiry=$(date -d "$old_expiry + $jumlah_hari days" +%Y-%m-%d)
        sed -i "s|^$username_to_renew:.*|$username_to_renew:$new_expiry|" "$MANUAL_ACCOUNTS_FILE"
        
        echo ""
        echo -e "${GREEN}✅ Akun '$username_to_renew' berhasil diperpanjang.${RESET}"
        echo -e "   Expired baru: $(date -d "$new_expiry" +%d-%m-%Y)"
        read -p "Tekan Enter untuk kembali..."
    }
    
    kelola_akun_manual() {
        while true
        do
            tampilkan_menu_manual
            read -p "Pilih menu [0-4]: " pilihan_manual
    
            case $pilihan_manual in
                1) echo ""; tambah_akun_manual ;;
                2) echo ""; hapus_akun_manual ;;
                3) echo ""; tampilkan_list_manual; echo ""; read -p "Tekan Enter untuk kembali..." ;;
                4) echo ""; renew_akun_manual ;;
                0) break ;;
                *) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-4.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
            esac
        done
    }
    
    # --- FUNGSI-FUNGSI FITUR BARU ---
    
    menu_monitor() {
        while true
        do
            tampilkan_menu_monitor
            read -p "Pilih menu [0-2]: " pilihan_monitor
    
            case $pilihan_monitor in
                1)
                    echo ""
                    # PERUBAHAN: Memeriksa perintah 'speedtest' (Ookla)
                    if ! command -v speedtest &> /dev/null; then
                        echo -e "${RED}❌ 'speedtest' (Ookla) tidak ditemukan.${RESET}"
                        echo -e "${YELLOW}Silakan install terlebih dahulu:${RESET}"
                        echo -e "${CYAN}  wget https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz${RESET}"
                        echo -e "${CYAN}  tar -xvf ookla-speedtest-1.2.0-linux-x86_64.tgz${RESET}"
                        echo -e "${CYAN}  sudo mv speedtest /usr/local/bin/${RESET}"
                        echo -e "${CYAN}  sudo chmod +x /usr/local/bin/speedtest${RESET}"
                    else
                        echo -e "${LIGHT_CYAN}Menjalankan Speedtest...${RESET}"
                        # PERUBAHAN: Menjalankan perintah 'speedtest'
                        speedtest
                    fi
                    read -p "Tekan Enter untuk kembali..."
                    ;;
                2)
                    menu_vnstat
                    ;;
                0)
                    break
                    ;;
                *)
                    echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-2.${RESET}"
                    read -p "Tekan Enter untuk melanjutkan..."
                    ;;
            esac
        done
    }
    
    menu_vnstat() {
        while true
        do
            tampilkan_menu_vnstat
            read -p "Pilih menu [0-5]: " pilihan_vnstat
    
            case $pilihan_vnstat in
                1) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Jam ---${RESET}"; vnstat -h; read -p "Tekan Enter untuk kembali..." ;;
                2) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Hari ---${RESET}"; vnstat -d; read -p "Tekan Enter untuk kembali..." ;;
                3) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Bulan ---${RESET}"; vnstat -m; read -p "Tekan Enter untuk kembali..." ;;
                4) echo ""; echo -e "${LIGHT_CYAN}--- Traffic Per Tahun ---${RESET}"; vnstat -y; read -p "Tekan Enter untuk kembali..." ;;
                5) echo ""; echo -e "${LIGHT_CYAN}--- Top 10 Hari ---${RESET}"; vnstat -t; read -p "Tekan Enter untuk kembali..." ;;
                0) break ;;
                *) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-5.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
            esac
        done
    }
    
    menu_info_vps() {
        while true
        do
            tampilkan_menu_info_vps
            read -p "Pilih menu [0-5]: " pilihan_info
    
            case $pilihan_info in
                1)
                    echo ""
                    echo -e "${LIGHT_CYAN}Menjalankan htop... (tekan 'q' untuk keluar)${RESET}"
                    htop
                    ;;
                2)
                    echo ""
                    if ! command -v neofetch &> /dev/null; then
                        echo -e "${RED}❌ 'neofetch' tidak ditemukan.${RESET}"
                        echo -e "${YELLOW}Silakan install terlebih dahulu:${RESET}"
                        echo -e "${CYAN}  Ubuntu/Debian: apt install neofetch${RESET}"
                        echo -e "${CYAN}  CentOS/RHEL:   yum install neofetch${RESET}"
                    else
                        neofetch
                    fi
                    read -p "Tekan Enter untuk kembali..."
                    ;;
                3) echo ""; echo -e "${LIGHT_CYAN}--- Disk Usage ---${RESET}"; df -h; read -p "Tekan Enter untuk kembali..." ;;
                4) echo ""; echo -e "${LIGHT_CYAN}--- Memory Usage ---${RESET}"; free -h; read -p "Tekan Enter untuk kembali..." ;;
                5) echo ""; echo -e "${LIGHT_CYAN}--- System Info ---${RESET}"; uname -a; read -p "Tekan Enter untuk kembali..." ;;
                0) break ;;
                *) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-5.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
            esac
        done
    }
    
    
    # --- PROGRAM UTAMA ---
    
    while true
    do
        # Ambil data sistem terbaru sebelum menampilkan menu
        get_system_info
    
        # Tampilkan menu yang sudah termasuk info sistem
        tampilkan_menu
        
        read -p "Pilih menu [0-8]: " pilihan
    
        case $pilihan in
            1) echo ""; echo -e "${LIGHT_CYAN}Sedang memproses penambahan akun...${RESET}"; bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) add; echo ""; read -p "Tekan Enter untuk kembali ke menu..." ;;
            2) echo ""; echo -e "${LIGHT_CYAN}Sedang memproses penghapusan akun...${RESET}"; bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) del; echo ""; read -p "Tekan Enter untuk kembali ke menu..." ;;
            3) echo ""; echo -e "${LIGHT_CYAN}Menampilkan daftar akun...${RESET}"; bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) list; echo ""; read -p "Tekan Enter untuk kembali ke menu..." ;;
            4) kelola_akun_manual ;;
            5)
                echo ""
                echo -e "${LIGHT_CYAN}Mendownload script ZIVPN...${RESET}"
                wget https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh -O zi.sh
                echo -e "${LIGHT_CYAN}Mengubah permission script...${RESET}"
                chmod +x zi.sh
                echo -e "${LIGHT_CYAN}Menampilkan bantuan script...${RESET}"
                ./zi.sh help
                echo ""
                echo -e "${GREEN}✅ Script berhasil didownload. Anda bisa menjalankannya dengan ./zi.sh${RESET}"
                read -p "Tekan Enter untuk kembali..."
                ;;
            6)
                echo ""
                echo -e "${LIGHT_CYAN}Memulai instalasi ZIVPN...${RESET}"
                bash <(wget -qO- https://raw.githubusercontent.com/potatonc/zivpn-udp/refs/heads/main/zi.sh) install
                echo ""
                echo -e "${GREEN}✅ Proses instalasi selesai.${RESET}"
                read -p "Tekan Enter untuk kembali..."
                ;;
            7)
                menu_monitor
                ;;
            8)
                menu_info_vps
                ;;
            0) echo -e "${LIGHT_GREEN}Terima kasih, sampai jumpa!${RESET}"; exit 0 ;;
            *) echo -e "${RED}Pilihan tidak valid! Silakan pilih 0-8.${RESET}"; read -p "Tekan Enter untuk melanjutkan..." ;;
        esac
    done
  • Membuat Panel Monitoring UDP Pada VPS V2

    Panduan Lengkap: Membuat Panel Monitoring custom untuk VPS UDP Anda

    Halo, sobat sysadmin! Pada artikel sebelumnya saya sudah pernah membahas tutorial Membuat UDP Log Di VPS Linux.Dalam tutorial kali ini yang merupakan kelanjutan dari tutorial sebelumnya, kita akan membangun sebuah panel monitoring custom dari nol yang dapat di jalankan dalam satu tempat terpusat untuk memantau semua aktivitas user di VPS Anda dan ini akan membuat pekerjaan Anda jauh lebih mudah.

    Kita akan membuat tiga perintah baru:

    • udplog: Untuk melihat daftar user yang sedang aktif.
    • checkmultilogin: Untuk mendeteksi user yang login dari lebih dari satu IP.
    • monitorpanel: Sebuah panel menu interaktif yang menggabungkan semua fungsi di atas.

    Yang terbaik dari semuanya, kita akan melakukannya dengan cara yang sangat aman, tanpa mengubah skrip asli Anda sama sekali. Yuk, kita mulai!


    Langkah 1: Membuat Perintah udplog (Cek User Aktif)

    Pertama, kita buat folder untuk menyimpan semua skrip kita.

    sudo mkdir -p /opt/udp-proxy/bin

    Sekarang, buat file untuk skrip udplog.

    sudo nano /opt/udp-proxy/bin/show_users.sh

    Salin dan tempel kode berikut ke dalamnya:

    #!/bin/bash
    
    echo "════════════════════════════════════════════════"
    echo "                [ USER LOGIN UDP ]               "
    echo "════════════════════════════════════════════════"
    echo "┌──────────────────────────────────────────────┐"
    
    if LOG_OUTPUT=$(sudo journalctl -u udp-custom.service --since "5 minutes ago" --no-pager | grep "Client connected" | awk '
        /\[src:/ && /\[user:/ {
            match($0, /\[src:([^]]+)\]/, m)
            ip = m[1]
            match($0, /\[user:([^]]+)\]/, u)
            user = u[1]
            if (ip && user) {
                printf "%-15s %-20s\n", user, ip
            }
        }' | sort -u); then
        if [ -n "$LOG_OUTPUT" ]; then
            printf " %-15s %-15s %-20s\n" "Status" "Username" "IP Address"
            echo "$LOG_OUTPUT" | while read -r user ip; do
                printf " %-15s %-15s %-20s\n" "Aktif" "$user" "$ip"
            done
        else
            echo " Tidak ada user yang terhubung dalam 5 menit terakhir."
        fi
    else
        echo " Gagal mengambil log. Pastikan Anda menjalankan dengan sudo."
    fi
    
    echo "└──────────────────────────────────────────────┘"
    

    Simpan file (Ctrl+X, lalu Y dan Enter), lalu berikan izin eksekusi:

    sudo chmod +x /opt/udp-proxy/bin/show_users.sh

    Terakhir, buat perintah pintasannya:

    sudo ln -s /opt/udp-proxy/bin/show_users.sh /usr/local/bin/udplog

    Langkah 2: Membuat Perintah checkmultilogin (Deteksi Multi-Login)

    Buat file untuk skrip deteksi multi-login.

    sudo nano /opt/udp-proxy/bin/check_multilogin.sh

    Salin dan tempel kode berikut:

    #!/bin/bash
    
    echo "════════════════════════════════════════════════"
    echo "            [ CEK USER MULTI-LOGIN ]            "
    echo "════════════════════════════════════════════════"
    echo "Menganalisis log dalam 1 jam terakhir..."
    echo ""
    
    if MULTI_LOGIN=$(sudo journalctl -u udp-custom.service --since "1 hour ago" --no-pager | grep "Client connected" | awk -F'[][]' '
        {
            for (i=1; i<=NF; i++) {
                if ($i ~ /user:/) {
                    split($i, u, ":")
                    username = u[2]
                }
                if ($i ~ /src:/) {
                    split($i, s, ":")
                    ip = s[2]
                }
            }
            if (username && ip) {
                ips[username] = ips[username] " " ip
            }
        }
        END {
            for (user in ips) {
                split(ips[user], ip_list, " ")
                delete unique_ips
                for (i in ip_list) {
                    if (ip_list[i] != "") {
                        unique_ips[ip_list[i]] = 1
                    }
                }
                if (length(unique_ips) > 1) {
                    printf "User: %-15s | Jumlah IP: %d | IP: %s\n", user, length(unique_ips), ips[user]
                }
            }
        }'); then
        if [ -n "$MULTI_LOGIN" ]; then
            echo ">>> DITEMUKAN USER YANG MELAKUKAN MULTI-LOGIN! <<<"
            echo "-----------------------------------------------"
            echo "$MULTI_LOGIN"
        else
            echo "Tidak ada user yang terdeteksi melakukan multi-login dalam 1 jam terakhir."
        fi
    else
        echo "Gagal mengambil log. Pastikan Anda menjalankan dengan sudo."
    fi
    echo "════════════════════════════════════════════════"
    

    Simpan file (Ctrl+X, Y, Enter), berikan izin eksekusi, dan buat perintah pintasannya:

    sudo chmod +x /opt/udp-proxy/bin/check_multilogin.sh
    sudo ln -s /opt/udp-proxy/bin/check_multilogin.sh /usr/local/bin/checkmultilogin

    Langkah 3: Membuat Panel Utama monitorpanel

    Sekarang, kita akan menggabungkan semuanya ke dalam satu panel yang mudah digunakan. Buat file untuk panel utama.

    sudo nano /opt/udp-proxy/bin/monitorpanel.sh

    Salin dan tempel kode menu interaktif berikut:

    #!/bin/bash
    
    function show_header() {
        clear
        echo "═══════════════════════════════════════════════════════════════"
        echo "                   [ UDP MONITOR PANEL ]                       "
        echo "═══════════════════════════════════════════════════════════════"
        echo "                     POWERED by HAXOR                          "
        echo "═══════════════════════════════════════════════════════════════"
        echo ""
    }
    
    function show_menu() {
        echo "Pilih menu monitoring yang Anda inginkan:"
        echo "1. Cek User Login (Real-time Dashboard)"
        echo "2. Cek User Multi-Login"
        echo "3. Tampilkan User Aktif Saat Ini"
        echo "4. Tampilkan Alur Log Koneksi (Live Stream)"
        echo "5. Keluar"
        echo ""
    }
    
    while true; do
        show_header
        show_menu
        read -p "Masukkan pilihan Anda [1-5]: " choice
    
        case $choice in
            1)
                echo "Menjalankan dashboard user login (update setiap 5 detik)..."
                echo "Tekan Ctrl+C untuk kembali ke menu."
                sleep 2
                watch -n 5 udplog
                ;;
            2)
                echo "Mengecek user yang melakukan multi-login..."
                sleep 1
                checkmultilogin
                echo ""
                read -p "Tekan Enter untuk kembali ke menu."
                ;;
            3)
                echo "Menampilkan user yang sedang aktif..."
                sleep 1
                udplog
                echo ""
                read -p "Tekan Enter untuk kembali ke menu."
                ;;
            4)
                echo "Menampilkan alur log koneksi secara langsung..."
                echo "Hanya menampilkan koneksi yang berhasil. Tekan Ctrl+C untuk kembali."
                sleep 2
                sudo journalctl -u udp-custom.service -f | grep "Client connected"
                ;;
            5)
                echo "Keluar dari Monitor Panel. Sampai jumpa!"
                sleep 1
                exit 0
                ;;
            *)
                echo "Pilihan tidak valid, silakan coba lagi."
                sleep 2
                ;;
        esac
    done
    

    Simpan file (Ctrl+X, Y, Enter), berikan izin eksekusi, dan buat perintah pintasannya:

    sudo chmod +x /opt/udp-proxy/bin/monitorpanel.sh
    sudo ln -s /opt/udp-proxy/bin/monitorpanel.sh /usr/local/bin/monitorpanel

    Langkah 4: Gunakan Panel Baru Anda!

    Sekarang, Anda memiliki tiga perintah baru. Yang paling powerful adalah monitorpanel. Coba jalankan:

    monitorpanel

    Taraa... Sekarang Anda akan disajikan dengan menu interaktif yang memudahkan monitoring VPS Anda. Selamat mencoba!

    Baca juga Update Script Monitoring UDP V3
  • Membuat UDP Log Di VPS Linux

    Panduan Lengkap: Cara Membuat Perintah udplog untuk Melihat User Aktif di VPS Linux

    Halo, teman-teman sysadmin! Pernahkah Anda merasa kesulitan untuk memantau user mana saja yang sedang aktif terhubung ke layanan UDP tunneling Anda di VPS? Anda mungkin sudah bisa melihatnya lewat log systemctl status, tapi tentu akan jauh lebih mudah jika ada perintah khusus yang menampilkannya dalam bentuk tabel yang rapi.

    Pada tutorial kali ini, kita akan membuat sebuah perintah kustom bernama udplog. Dengan mengetik udplog di terminal, Anda bisa langsung melihat daftar user yang sedang online beserta alamat IP mereka. Cara ini aman karena tidak akan merusak atau mengubah skrip asli Anda sama sekali.

    Mari kita mulai dari awal!

    1. Langkah 1: Buat Folder untuk Menyimpan Skrip

      Pertama, kita perlu membuat sebuah folder khusus untuk menyimpan skrip baru kita agar terorganisir. Buka terminal VPS Anda dan jalankan perintah berikut:

      sudo mkdir -p /opt/udp-proxy/bin

      Penjelasan: Perintah ini membuat folder /opt/udp-proxy dan sub-folder bin di dalamnya. Folder ini akan menjadi tempat kita menyimpan file skrip.

    2. Langkah 2: Buat File Skrip Panel

      Sekarang, kita akan membuat file kosong untuk skrip panel kita menggunakan editor teks nano.

      sudo nano /opt/udp-proxy/bin/show_users.sh

      Penjelasan: Perintah ini akan membuka editor teks nano dan membuat file baru bernama show_users.sh di dalam folder yang baru kita buat.

    3. Langkah 3: Tulis Kode ke Dalam Skrip

      Salin seluruh kode di bawah ini, lalu tempel ke dalam jendela nano yang terbuka.

      #!/bin/bash
      
      echo "════════════════════════════════════════════════"
      echo "                [ USER LOGIN UDP ]               "
      echo "════════════════════════════════════════════════"
      echo "┌──────────────────────────────────────────────┐"
      
      # Gunakan awk yang lebih kuat untuk mencari pola [src:...] dan [user:...]
      # Ini akan menemukan IP dan username di mana saja mereka berada di baris log
      if LOG_OUTPUT=$(sudo journalctl -u udp-custom.service --since "5 minutes ago" --no-pager | grep "Client connected" | awk '
          /\[src:/ && /\[user:/ {
              # Cari dan ambil IP Address
              match($0, /\[src:([^]]+)\]/, m)
              ip = m[1]
              # Cari dan ambil Username
              match($0, /\[user:([^]]+)\]/, u)
              user = u[1]
              # Cetak username dan IP jika keduanya ditemukan
              if (ip && user) {
                  printf "%-15s %-20s\n", user, ip
              }
          }' | sort -u); then
      
          if [ -n "$LOG_OUTPUT" ]; then
              printf " %-15s %-15s %-20s\n" "Status" "Username" "IP Address"
              echo "$LOG_OUTPUT" | while read -r user ip; do
                  printf " %-15s %-15s %-20s\n" "Aktif" "$user" "$ip"
              done
          else
              echo " Tidak ada user yang terhubung dalam 5 menit terakhir."
          fi
      else
          echo " Gagal mengambil log. Pastikan Anda menjalankan dengan sudo."
      fi
      
      echo "└──────────────────────────────────────────────┘"

      Penjelasan: Kode ini akan membaca log sistem, memfilternya untuk menemukan pesan "Client connected" dalam 5 menit terakhir, lalu menampilkannya dalam format tabel yang rapi.

    4. Langkah 4: Simpan File Skrip

      Setelah Anda menempelkan kode di atas, simpan filenya dengan cara:

      1. Tekan Ctrl + X di keyboard.
      2. Akan muncul pertanyaan di bagian bawah, ketik Y lalu tekan Enter.
    5. Langkah 5: Buat Skrip Bisa Dieksekusi

      Secara default, file yang baru dibuat belum bisa dijalankan. Kita perlu memberinya izin eksekusi dengan perintah:

      sudo chmod +x /opt/udp-proxy/bin/show_users.sh

      Penjelasan: Perintah chmod +x memberikan izin "eksekusi" pada file, sehingga bisa dijalankan seperti sebuah program.

    6. Langkah 6: Buat Perintah Pintasan udplog

      Agar kita bisa memanggil skrip tersebut hanya dengan mengetik udplog, kita akan membuat "jalan pintas" atau symbolic link.

      sudo ln -s /opt/udp-proxy/bin/show_users.sh /usr/local/bin/udplog

      Penjelasan: Perintah ln -s membuat symbolic link (jalan pintas) yang bernama udplog di folder /usr/local/bin. Folder ini sudah ada di "path" perintah Linux, jadi Anda bisa memanggilnya dari mana saja.

    7. Langkah 7: Uji Perintah Baru Anda

      Ini adalah langkah terakhir untuk memastikan semuanya berjalan dengan benar. Coba jalankan perintah baru Anda:

      udplog

      Jika semua langkah diikuti dengan benar, Anda akan langsung melihat output panel user yang sudah kita buat, mirip seperti ini:

      ════════════════════════════════════════════════
                      [ USER LOGIN UDP ]               
      ════════════════════════════════════════════════
      ┌──────────────────────────────────────────────┐
       Status          Username        IP Address      
       Aktif           suhartono       140.213.5.69   
       Aktif           tiotio          140.213.5.225  
       Aktif           yunidodo        112.215.170.75 
      └──────────────────────────────────────────────┘

    Kesimpulan

    Selamat! Sekarang Anda memiliki perintah udplog yang bisa dipanggil kapan saja untuk melihat daftar user yang sedang aktif terhubung ke VPS Anda. Ini adalah cara yang aman, efektif, dan rapi untuk memantau aktivitas user tanpa harus mengotak-atik skrip utama Anda. Selamat mencoba!

  • Menjalankan Ulang Dan Mematikan HAProxy Pada Server Linux Ubuntu

    Halo, para administrator sistem dan pengguna VPS!

    Pernahkah Anda merasa bahwa layanan HAProxy di VPS Anda, meskipun sangat bermanfaat, terus mengonsumsi sumber daya berharga seperti RAM, bahkan saat tidak ada traffic yang sama sekali? Ini adalah masalah umum, terutama bagi mereka yang mengelola server dengan spesifikasi kecil.

    Postingan kali ini akan memandu Anda langkah demi langkah untuk menghentikan HAProxy, mencegahnya berjalan otomatis saat restart, dan tentu saja, cara mengaktifkannya kembali hanya ketika Anda benar-benar membutuhkannya. Dengan cara ini, Anda memiliki kontrol penuh atas sumber daya VPS Anda.

    Mengapa Harus Mengontrol HAProxy Secara Manual?

    HAProxy dirancang untuk berjalan terus-menerus sebagai load balancer yang andal. Namun, dalam skenario berikut, mengontrolnya secara manual sangat menguntungkan:

    • Menghemat RAM: Seperti yang kita bahas sebelumnya, HAProxy menggunakan RAM untuk setiap koneksi dan prosesnya. Mematikannya saat tidak digunakan akan membebaskan RAM untuk aplikasi lain atau proses sistem.
    • VPS Pengembangan atau Testing: Jika VPS Anda hanya digunakan untuk pengujian sesekali, tidak ada alasan untuk menjalankan HAProxy 24/7.
    • Kontrol Penuh: Anda memutuskan kapan layanan harus aktif, memberikan fleksibilitas maksimal dalam manajemen server.

    Langkah 1: Menghentikan dan Menonaktifkan HAProxy

    Untuk mencapai tujuan kita, kita perlu melakukan dua tindakan: menghentikan layanan yang sedang berjalan dan mencegahnya start otomatis saat boot. Kita akan menggunakan systemctl, alat standar di distribusi Linux modern.

    Penting untuk memahami perbedaan dua perintah utama:

    Perintah Fungsi Keterangan
    sudo systemctl stop haproxy Menghentikan Layanan Mematikan proses HAProxy yang sedang berjalan saat ini.
    sudo systemctl disable haproxy Menonaktifkan Auto-Start Mencegah HAProxy start otomatis saat VPS dinyalakan ulang.

    Jalankan kedua perintah ini secara berurutan di terminal Anda:

    sudo systemctl stop haproxy
    sudo systemctl disable haproxy

    Langkah 2: Verifikasi Status HAProxy

    Setelah menjalankan perintah di atas, ada baiknya untuk memverifikasi bahwa semuanya sudah berubah sesuai keinginan.

    1. Cek apakah layanan sudah berhenti:

    sudo systemctl status haproxy

    Output yang diharapkan adalah Active: inactive (dead).

    2. Cek apakah auto-start sudah dinonaktifkan:

    sudo systemctl is-enabled haproxy

    Output yang diharapkan adalah disabled.

    Jika kedua output tersebut muncul, HAProxy sudah berhasil Anda "matikan" dan tidak akan mengganggu lagi saat restart.

    Langkah 3: Mengaktifkan Kembali HAProxy

    Sekarang, tiba saatnya Anda membutuhkan HAProxy lagi. Untuk mengaktifkannya, Anda cukup melakukan kebalikan dari Langkah 1: aktifkan auto-start, lalu jalankan.

    Perintah Fungsi Keterangan
    sudo systemctl enable haproxy Mengaktifkan Auto-Start Mengizinkan HAProxy untuk start otomatis saat boot.
    sudo systemctl start haproxy Menjalankan Layanan Memulai proses HAProxy saat ini.

    Jalankan perintah berikut untuk mengaktifkannya kembali:

    sudo systemctl enable haproxy
    sudo systemctl start haproxy

    Untuk memastikannya berjalan, Anda bisa kembali menjalankan sudo systemctl status haproxy dan seharusnya melihat Active: active (running).

    Ringkasan Perintah

    Sebagai referensi cepat, berikut adalah ringkasan semua perintah yang Anda butuhkan:

    Tujuan Perintah yang Dijalankan
    Menghentikan & Menonaktifkan sudo systemctl stop haproxy
    sudo systemctl disable haproxy
    Mengaktifkan & Menjalankan sudo systemctl enable haproxy
    sudo systemctl start haproxy

    Kesimpulan

    Mengontrol layanan seperti HAProxy secara manual adalah keterampilan penting untuk mengelola VPS dengan sumber daya terbatas. Dengan memahami perbedaan antara stop, start, enable, dan disable, Anda memiliki kekuatan penuh untuk mengoptimalkan penggunaan RAM dan CPU sesuai kebutuhan.

    Metode ini memastikan bahwa HAProxy hanya mengonsumsi sumber daya ketika Anda benar-benar membutuhkannya, membuat VPS kecil Anda jauh lebih efisien. Semoga panduan ini bermanfaat! Jika ada pertanyaan atau tips lain seputar manajemen layanan, tinggalkan komentar di bawah ya!

  • My Profile In Youtube

    ADDRESS

    Jalan Raya Badau Km.11 Rt.06/02 Tanjung Pandan Belitung 33451

    EMAIL

    purwana.cecep@gmail.com
    uraxarixteamxxx@gmail.com

    Telephone

    +628197887769