#!/bin/sh clear config="/etc/xray/config.json" configLOCK="/etc/xray/config.json.lock" temp="/etc/xray/temp.json" CGHlog='/var/log/xray/access.log' v2rdir="/etc/xr" && [[ ! -d $v2rdir ]] && mkdir $v2rdir user_conf="/etc/xr/user" && [[ ! -e $user_conf ]] && touch $user_conf backdir="/etc/xr/back" && [[ ! -d ${backdir} ]] && mkdir ${backdir} tmpdir="$backdir/tmp" [[ ! -e $v2rdir/conf ]] && echo "autBackup 0" > $v2rdir/conf if [[ $(cat $v2rdir/conf | grep "autBackup") = "" ]]; then echo "autBackup 0" >> $v2rdir/conf fi _v2=`if netstat -tunlp | grep xray 1> /dev/null 2> /dev/null; then [[ -e ${config} ]] && echo -e "\033[1;32m[ INST \033[1;31m+ \033[1;32mWORK ] " else [[ -e ${config} ]] && echo -e "\033[1;32m[ INST \033[1;31m+ \033[1;33mLOADING \033[1;32m] " || echo -e "\033[1;32m[ \033[1;31mNO INST \033[1;32m] " fi`; barra="\033[0;31m=====================================================\033[0m" #[[ -e /bin/ejecutar/msg ]] && source /bin/ejecutar/msg > /dev/null || source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) > /dev/null source msg numero='^[0-9]+$' hora=$(printf '%(%H:%M:%S)T') fecha=$(printf '%(%D)T') un_bar () { #==comando a ejecutar== comando="$1" #==interfas== in=' [' en=' ] ' full_in="➛" full_en='100%' bar=("--------------------" "=-------------------" "]=------------------" "[-]=-----------------" "=[-]=----------------" "-=[-]=---------------" "--=[-]=--------------" "---=[-]=-------------" "----=[-]=------------" "-----=[-]=-----------" "------=[-]=----------" "-------=[-]=---------" "--------=[-]=--------" "---------=[-]=-------" "----------=[-]=------" "-----------=[-]=-----" "------------=[-]=----" "-------------=[-]=---" "--------------=[-]=--" "---------------=[-]=-" "----------------=[-]=" "-----------------=[-]" "------------------=[" "-------------------=" "------------------=[" "-----------------=[-]" "----------------=[-]=" "---------------=[-]=-" "--------------=[-]=--" "-------------=[-]=---" "------------=[-]=----" "-----------=[-]=-----" "----------=[-]=------" "---------=[-]=-------" "--------=[-]=--------" "-------=[-]=---------" "------=[-]=----------" "-----=[-]=-----------" "----=[-]=------------" "---=[-]=-------------" "--=[-]=--------------" "-=[-]=---------------" "=[-]=----------------" "[-]=-----------------" "]=------------------" "=-------------------" "--------------------"); #==color== in="\033[1;33m$in\033[0m" en="\033[1;33m$en\033[0m" full_in="\033[1;31m$full_in" full_en="\033[1;32m$full_en\033[0m" _=$( $comando > /dev/null 2>&1 ) & > /dev/null pid=$! while [[ -d /proc/$pid ]]; do for i in "${bar[@]}"; do echo -ne "\r $in" echo -ne "ESPERE $en $in \033[1;31m$i" echo -ne " $en" sleep 0.2 done done echo -e " $full_in $full_en" sleep 0.2s } usrCONEC() { [[ $log0 -le 1 ]] && xray clean &> /dev/null && let log0++ && clear msg -bar3 echo -e "" echo -e " ESPERANDO A LA VERIFICACION DE IPS Y USUARIOS " echo -e " ESPERE UN MOMENTO PORFAVOR $log0" echo -e "" msg -bar3 fun_bar msg -bar3 sleep 5s clear&&clear title2 msg -bar3 users="$(cat $config | jq -r .inbounds[].settings.clients[].email)" IP_tconex=$(netstat -nap | grep "$xrayports" | grep xray | grep ESTABLISHED | awk {'print $5'} | awk -F ":" '{print $1}' | sort | uniq) n=1 [[ -z $IP_tconex ]] && echo -e " NO HAY USUARIOS CONECTADOS!" for i in $IP_tconex do USERauth=$(cat ${CGHlog} | grep $i | grep accepted |awk '{print $7}'| sort | uniq) Users+="$USERauth\n" done echo -e " N) USER - CONEXIONES "|column -t -s '-' for U in $users do CConT=$(echo -e "$Users" | grep $U |wc -l) [[ $CConT = 0 ]] && continue UConc+=" $n) $U -$CConT\n" let n++ done echo -e "$UConc"|column -t -s '-' msg -bar3 continuar read foo } install_ini () { add-apt-repository universe apt update -y; apt upgrade -y clear msg -bar3 echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " msg -bar3 #bc [[ $(dpkg --get-selections|grep -w "bc"|head -1) ]] || apt-get install bc -y &>/dev/null [[ $(dpkg --get-selections|grep -w "bc"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "bc"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install bc................... $ESTATUS " #uuidgen [[ $(dpkg --get-selections|grep -w "uuid-runtime"|head -1) ]] || sudo apt-get install uuid-runtime -y &>/dev/null [[ $(dpkg --get-selections|grep -w "uuid-runtime"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "uuid-runtime"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install uuid-runtime......... $ESTATUS " #python [[ $(dpkg --get-selections|grep -w "python"|head -1) ]] || apt-get install python -y &>/dev/null [[ $(dpkg --get-selections|grep -w "python"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "python"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install python-pip........... $ESTATUS " #pip [[ $(dpkg --get-selections|grep -w "python-pip"|head -1) ]] || apt-get install python-pip -y &>/dev/null [[ $(dpkg --get-selections|grep -w "python-pip"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "python-pip"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install python-pip........... $ESTATUS " #python3 [[ $(dpkg --get-selections|grep -w "python3"|head -1) ]] || apt-get install python3 -y &>/dev/null [[ $(dpkg --get-selections|grep -w "python3"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "python3"|head -1) ]] && ESTATUS=`echo -e "\e[3;32mINSTALADO\e[0m"` &>/dev/null echo -e "\033[97m # apt-get install python3.............. $ESTATUS " #python3-pip [[ $(dpkg --get-selections|grep -w "python3-pip"|head -1) ]] || apt-get install python3-pip -y &>/dev/null [[ $(dpkg --get-selections|grep -w "python3-pip"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "python3-pip"|head -1) ]] && ESTATUS=`echo -e "\e[3;32mINSTALADO\e[0m"` &>/dev/null echo -e "\033[97m # apt-get install python3-pip.......... $ESTATUS " #QRENCODE [[ $(dpkg --get-selections|grep -w "qrencode"|head -1) ]] || apt-get install qrencode -y &>/dev/null [[ $(dpkg --get-selections|grep -w "qrencode"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "qrencode"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install qrencode............. $ESTATUS " #jq [[ $(dpkg --get-selections|grep -w "jq"|head -1) ]] || apt-get install jq -y &>/dev/null [[ $(dpkg --get-selections|grep -w "jq"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "jq"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install jq................... $ESTATUS " #curl [[ $(dpkg --get-selections|grep -w "curl"|head -1) ]] || apt-get install curl -y &>/dev/null [[ $(dpkg --get-selections|grep -w "curl"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "curl"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install curl................. $ESTATUS " #npm [[ $(dpkg --get-selections|grep -w "npm"|head -1) ]] || apt-get install npm -y &>/dev/null [[ $(dpkg --get-selections|grep -w "npm"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "npm"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install npm.................. $ESTATUS " #nodejs [[ $(dpkg --get-selections|grep -w "nodejs"|head -1) ]] || apt-get install nodejs -y &>/dev/null [[ $(dpkg --get-selections|grep -w "nodejs"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "nodejs"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install nodejs............... $ESTATUS " #socat [[ $(dpkg --get-selections|grep -w "socat"|head -1) ]] || apt-get install socat -y &>/dev/null [[ $(dpkg --get-selections|grep -w "socat"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "socat"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install socat................ $ESTATUS " #netcat [[ $(dpkg --get-selections|grep -w "netcat"|head -1) ]] || apt-get install netcat -y &>/dev/null [[ $(dpkg --get-selections|grep -w "netcat"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "netcat"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install netcat............... $ESTATUS " #netcat-traditional [[ $(dpkg --get-selections|grep -w "netcat-traditional"|head -1) ]] || apt-get install netcat-traditional -y &>/dev/null [[ $(dpkg --get-selections|grep -w "netcat-traditional"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "netcat-traditional"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install netcat-traditional... $ESTATUS " #net-tools [[ $(dpkg --get-selections|grep -w "net-tools"|head -1) ]] || apt-get net-tools -y &>/dev/null [[ $(dpkg --get-selections|grep -w "net-tools"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "net-tools"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install net-tools............ $ESTATUS " #cowsay [[ $(dpkg --get-selections|grep -w "cowsay"|head -1) ]] || apt-get install cowsay -y &>/dev/null [[ $(dpkg --get-selections|grep -w "cowsay"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "cowsay"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install cowsay............... $ESTATUS " #figlet [[ $(dpkg --get-selections|grep -w "figlet"|head -1) ]] || apt-get install figlet -y &>/dev/null [[ $(dpkg --get-selections|grep -w "figlet"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "figlet"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install figlet............... $ESTATUS " #lolcat apt-get install lolcat -y &>/dev/null sudo gem install lolcat &>/dev/null [[ $(dpkg --get-selections|grep -w "lolcat"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null [[ $(dpkg --get-selections|grep -w "lolcat"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null echo -e "\033[97m # apt-get install lolcat............... $ESTATUS " msg -bar3 echo -e "\033[92m La instalacion de paquetes necesarios a finalizado" msg -bar3 echo -e "\033[97m Si la instalacion de paquetes tiene fallas" echo -ne "\033[97m Puede intentar de nuevo [s/n]: " read inst [[ $inst = @(s|S|y|Y) ]] && install_ini } autB(){ if [[ ! $(cat $v2rdir/conf | grep "autBackup" | cut -d " " -f2) = "0" ]]; then autBackup fi } restore(){ clear unset num unset opcion unset _res if [[ -z $(ls $backdir) ]]; then title " no se encontraron respaldos" sleep 0.5 return fi num=1 title " Lista de Respaldos creados" blanco " nom \033[0;31m| \033[1;37mfechas \033[0;31m| \033[1;37mhora" msg -bar3 for i in $(ls $backdir); do col "$num)" "$i" _res[$num]=$i let num++ done msg -bar3 col "0)" "VOLVER" msg -bar3 blanco " cual desea restaurar?" 0 read opcion [[ $opcion = 0 ]] && return [[ -z $opcion ]] && blanco "\n deves seleccionar una opcion!" && sleep 0.1 && return [[ ! $opcion =~ $numero ]] && blanco "\n solo deves ingresar numeros!" && sleep 0.1 && return [[ $opcion -gt ${#_res[@]} ]] && blanco "\n solo numeros entre 0 y ${#_res[@]}" && sleep 0.1 && return mkdir $backdir/tmp tar xpf $backdir/${_res[$opcion]} -C $backdir/tmp/ clear title " Archivos que se restauran" if rm -rf $config && cp $tmpdir/config.json $temp; then sleep 0.1 echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"/data/xray.crt\",keyFile:\"/data/xray.key\"}]}' >> $config" | bash chmod 777 $config rm $temp blanco " /etc/xray/config.json..." && verde "[ok]" else blanco " /etc/xray/config.json..." && rojo "[fail]" fi if rm -rf $user_conf && cp $tmpdir/user $user_conf; then blanco " /etc/xr/user..." && verde "[ok]" else blanco " /etc/xr/user..." && rojo "[fail]" fi [[ -e $tmpdir/fullchain.cer ]] && mv $tmpdir/fullchain.cer $tmpdir/fullchain.crt if rm -rf /data && mkdir /data && cp $tmpdir/*.crt /data/xray.crt && cp $tmpdir/*.key /data/xray.key; then blanco " /data/xray.crt..." && verde "[ok]" blanco " /data/xray.key..." && verde "[ok]" else blanco " /data/xray.crt..." && rojo "[fail]" blanco " /data/xray.key..." && rojo "[fail]" msg -bar3 echo -e "VALIDA TU CERTIFICADO SSL " xray tls fi rm -rf $tmpdir msg -bar3 continuar read foo } server(){ clear if [[ $(npm ls -g | grep "http-server") = "" ]]; then npm install --global http-server clear fi if [[ $(ps x | grep "http-server" | grep -v grep) = "" ]]; then screen -dmS online http-server /etc/xr/back/ --port 95 -s title " Respaldos en linea" col "su url:" "http://$(wget -qO- ipv4.icanhazip.com):95" msg -bar3 continuar read foo else killall http-server title " servidor detenido..." sleep 0.1 fi } autBackup(){ unset fecha unset hora unset tmp unset back unset cer unset key #fecha=`date +%d-%m-%y-%R` fecha=`date +%d-%m-%y` hora=`date +%R` tmp="$backdir/tmp" && [[ ! -d ${tmp} ]] && mkdir ${tmp} back="$backdir/v2r___${fecha}___${hora}.tar" cer=$(cat /etc/xray/config.json | jq -r ".inbounds[].streamSettings.tlsSettings.certificates[].certificateFile") key=$(cat /etc/xray/config.json | jq -r ".inbounds[].streamSettings.tlsSettings.certificates[].keyFile") cp $user_conf $tmp cp $config $tmp [[ ! $cer = null ]] && [[ -e $cer ]] && cp $cer $tmp [[ ! $key = null ]] && [[ -e $cer ]] && cp $key $tmp cd $tmp tar -cpf $back * cp $back /var/www/html/xrayBack.tar && echo -e " Descargarlo desde cualquier sitio con acceso WEB LINK : http://$(wget -qO- ifconfig.me):81/xrayBack.tar \033[0m -------------------------------------------------------" read -p "ENTER PARA CONTINUAR" rm -rf $tmp } on_off_res(){ if [[ $(cat $v2rdir/conf | grep "autBackup" | cut -d " " -f2) = "0" ]]; then echo -e "\033[0;31m[off]" else echo -e "\033[1;92m[on]" fi } blanco(){ [[ ! $2 = 0 ]] && { echo -e "\033[1;37m$1\033[0m" } || { echo -ne " \033[1;37m$1:\033[0m " } } verde(){ [[ ! $2 = 0 ]] && { echo -e "\033[1;32m$1\033[0m" } || { echo -ne " \033[1;32m$1:\033[0m " } } rojo(){ [[ ! $2 = 0 ]] && { echo -e "\033[1;31m$1\033[0m" } || { echo -ne " \033[1;31m$1:\033[0m " } } col(){ nom=$(printf '%-55s' "\033[0;92m${1} \033[0;31m>> \033[1;37m${2}") echo -e " $nom\033[0;31m${3} \033[0;92m${4}\033[0m" } col2(){ echo -e " \033[1;91m$1\033[0m \033[1;37m$2\033[0m" } vacio(){ blanco "\n no se puede ingresar campos vacios..." } cancelar(){ echo -e "\n \033[3;49;31minstalacion cancelada...\033[0m" } continuar(){ echo -e " \033[3;49;32mEnter para continuar...\033[0m" } title2(){ xrayports=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep xray | awk '{print substr($9,3); }' > /tmp/xray.txt && echo | cat /tmp/xray.txt | tr '\n' ' ' > /etc/adm-lite/xrayports.txt && cat /etc/adm-lite/xrayports.txt` > /dev/null 2>&1 xrayports=$(echo $xrayports | awk {'print $1'}) _tconex=$(netstat -nap | grep "$xrayports" | grep xray | grep ESTABLISHED | awk {'print $5'} | awk -F ":" '{print $1}' | sort | uniq | wc -l) v1=$(cat /etc/adm-lite/v-local.log) v2=$(cat /bin/ejecutar/v-new.log) msg -bar3 [[ $v1 = $v2 ]] && echo -e " \e[97m\033[1;44m MENU XRAY LITE [$v1] POWER BY @drowkid01 \033[0m" || echo -e " \e[97m\033[1;44m MENU XRAY LITE POWER BY @drowkid01 [$v1] >> \033[1;92m[$v2] \033[0m" [[ ! -z $xrayports ]] && echo -e " \e[97m\033[1;41mPUERTO ACTIVO :\033[0m \033[3;32m$xrayports\033[0m \e[97m\033[1;41m ACTIVOS:\033[0m \033[3;32m\e[97m\033[1;41m $_tconex " || echo -e " \e[97m\033[1;41mERROR A INICIAR xray : \033[0m \033[3;32m FAIL\033[3;32m" } title(){ msg -bar3 blanco "$1" msg -bar3 } userDat(){ blanco " N° Usuarios fech exp dias" msg -bar3 } #============================================ domain_check() { ssl_install_fun clear msg -bar3 echo -e " \033[1;49;37mgenerador de certificado ssl/tls\033[0m" msg -bar3 echo -e " \033[1;49;37mingrese su dominio (ej: midominio.com.ar)\033[0m" echo -ne ' \033[3;49;31m>>>\033[0m ' read domain echo -e "\n \033[1;49;36mOteniendo resolucion dns de su dominio...\033[0m" domain_ip=$(ping "${domain}" -c 1 | sed '1{s/[^(]*(//;s/).*//;q}') echo -e "\n \033[1;49;36mOteniendo IP local...\033[0m" local_ip=$(wget -qO- ipv4.icanhazip.com) sleep 0.5 while : do if [[ $(echo "${local_ip}" | tr '.' '+' | bc) -eq $(echo "${domain_ip}" | tr '.' '+' | bc) ]]; then clear msg -bar3 echo -e " \033[1;49;37mSu dominio: ${domain}\033[0m" msg -bar3 echo -e " \033[1;49;37mIP dominio:\033[0m \033[1;49;32m${domain_ip}\033[0m" echo -e " \033[1;49;37mIP local:\033[0m \033[1;49;32m${local_ip}\033[0m" msg -bar3 echo -e " \033[1;49;32mComprovacion exitosa\033[0m" echo -e " \033[1;49;37mLa IP de su dominio coincide\n con la IP local, desea continuar?\033[0m" msg -bar3 echo -ne " \033[1;49;37msi o no [S/N]:\033[0m " read opcion case $opcion in [Yy]|[Ss]) port_exist_check;; [Nn]) cancelar && sleep 0.5;; *) echo -e "\n \033[1;49;37mselecione (S) para si o (N) para no!\033[0m" && sleep 0.5 && continue;; esac else clear msg -bar3 echo -e " \033[1;49;37mSu dominio: ${domain}\033[0m" msg -bar3 echo -e " \033[1;49;37mIP dominio:\033[0m \033[3;49;31m${domain_ip}\033[0m" echo -e " \033[1;49;37mIP local:\033[0m \033[3;49;31m${local_ip}\033[0m" msg -bar3 echo -e " \033[3;49;31mComprovacion fallida\033[0m" echo -e " \033[4;49;97mLa IP de su dominio no coincide\033[0m\n \033[4;49;97mcon la IP local\033[0m" msg -bar3 echo -e " \033[1;49;36m> Asegúrese que se agrego el registro" echo -e " (A) correcto al nombre de dominio." echo -e " > Asegurece que su registro (A)" echo -e " no posea algun tipo de seguridad" echo -e " adiccional y que solo resuelva DNS." echo -e " > De lo contrario, xray no se puede" echo -e " utilizar normalmente...\033[0m" msg -bar3 echo -e " \033[1;49;37mdesea continuar?" echo -ne " si o no [S/N]:\033[0m " read opcion case $opcion in [Yy]|[Ss]) port_exist_check;; [Nn]) cancelar && sleep 0.5;; *) echo -e "\n \033[1;49;37mselecione (S) para si o (N) para no!\033[0m" && sleep 0.2 && continue;; esac fi break done } port_exist_check() { while : do clear msg -bar3 echo -e " \033[1;49;37mPara la compilacion del certificado" echo -e " se requiere que los siguientes puerto" echo -e " esten libres." echo -e " '80' '443'" echo -e " este script intentara detener" echo -e " cualquier proseso que este" echo -e " usando estos puertos\033[0m" msg -bar3 echo -e " \033[1;49;37mdesea continuar?" echo -ne " [S/N]:\033[0m " read opcion case $opcion in [Ss]|[Yy]) ports=('80' '443') clear msg -bar3 echo -e " \033[1;49;37mcomprovando puertos...\033[0m" msg -bar3 sleep 0.2 for i in ${ports[@]}; do [[ 0 -eq $(lsof -i:$i | grep -i -c "listen") ]] && { echo -e " \033[3;49;32m$i [OK]\033[0m" } || { echo -e " \033[3;49;31m$i [fail]\033[0m" } done msg -bar3 for i in ${ports[@]}; do [[ 0 -ne $(lsof -i:$i | grep -i -c "listen") ]] && { echo -ne " \033[1;49;37mliberando puerto $i...\033[1;49;37m " lsof -i:$i | awk '{print $2}' | grep -v "PID" | xargs kill -9 echo -e "\033[1;49;32m[OK]\033[0m" } done ;; [Nn]) cancelar && sleep 0.2 && break;; *) echo -e "\n \033[1;49;37mselecione (S) para si o (N) para no!\033[0m" && sleep 0.2;; esac continuar read foo ssl_install break done } ssl_install() { while : do if [[ -f "/data/xray.key" || -f "/data/xray.crt" ]]; then clear msg -bar3 echo -e " \033[1;49;37mya existen archivos de certificados" echo -e " en el directorio asignado.\033[0m" msg -bar3 echo -e " \033[1;49;37mENTER para canselar la instacion." echo -e " 'S' para eliminar y continuar\033[0m" msg -bar3 echo -ne " opcion: " read ssl_delete case $ssl_delete in [Ss]|[Yy]) rm -rf /data/* echo -e " \033[3;49;32marchivos removidos..!\033[0m" sleep 0.2 ;; *) cancelar && sleep 0.2 && break;; esac fi if [[ -f "$HOME/.acme.sh/${domain}_ecc/${domain}.key" || -f "$HOME/.acme.sh/${domain}_ecc/${domain}.cer" ]]; then msg -bar3 echo -e " \033[1;49;37mya existe un almacer de certificado" echo -e " bajo este nombre de dominio\033[0m" msg -bar3 echo -e " \033[1;49;37m'ENTER' cansela la instalacion" echo -e " 'D' para eliminar y continuar" echo -e " 'R' para restaurar el almacen crt\033[0m" msg -bar3 echo -ne " opcion: " read opcion case $opcion in [Dd]) echo -e " \033[1;49;92meliminando almacen cert...\033[0m" sleep 0.2 rm -rf $HOME/.acme.sh/${domain}_ecc ;; [Rr]) echo -e " \033[1;49;92mrestaurando certificados...\033[0m" sleep 0.2 "$HOME"/.acme.sh/acme.sh --installcert -d "${domain}" --fullchainpath /data/xray.crt --keypath /data/xray.key --ecc echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"/data/xray.crt\",keyFile:\"/data/xray.key\"}]}' | jq '.inbounds[] += {domain:\"$domi\"}' | jq '.inbounds[].streamSettings += {security:\"tls\"}' >> $config" | bash restart_v2r echo -e " \033[1;49;37mrestauracion completa...\033[0m\033[1;49;92m[ok]\033[0m" break ;; *) cancelar && sleep 0.2 && break;; esac fi acme break done } ssl_install_fun() { apt install socat netcat -y curl https://get.acme.sh | sh } acme() { clear msg -bar3 echo -e " \033[1;49;37mcreando nuevos certificado ssl/tls\033[0m" #msg -bar3 # read -p " Ingrese correo Para Validar el acme SSL : " corrio msg -bar3 wget -O - https://get.acme.sh | sh -s email=$corrio msg -bar3 if "$HOME"/.acme.sh/acme.sh --issue -d "${domain}" --standalone -k ec-256 --force --test; then echo -e "\n \033[1;49;37mSSL La prueba del certificado\n se emite con éxito y comienza la emisión oficial\033[0m\n" rm -rf "$HOME/.acme.sh/${domain}_ecc" sleep 0.2 else echo -e "\n \033[4;49;31mError en la emisión de la prueba del certificado SSL\033[0m" msg -bar3 rm -rf "$HOME/.acme.sh/${domain}_ecc" stop=1 fi if [[ 0 -eq $stop ]]; then if "$HOME"/.acme.sh/acme.sh --issue -d "${domain}" --standalone -k ec-256 --force; then echo -e "\n \033[1;49;37mSSL El certificado se genero con éxito\033[0m" msg -bar3 sleep 0.2 [[ ! -d /data ]] && mkdir /data if "$HOME"/.acme.sh/acme.sh --installcert -d "${domain}" --fullchainpath /data/xray.crt --keypath /data/xray.key --ecc --force; then msg -bar3 mv $config $temp echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"/data/xray.crt\",keyFile:\"/data/xray.key\"}]}' | jq '.inbounds[] += {domain:\"$domain\"}' | jq '.inbounds[].streamSettings += {security:\"tls\"}' >> $config" | bash chmod 777 $config rm $temp restart_v2r echo -e "\n \033[1;49;37mLa configuración del certificado es exitosa\033[0m" msg -bar3 echo -e " /data/xray.crt" echo -e " /data/xray.key" msg -bar3 sleep 0.2 fi else echo -e "\n \033[4;49;31mError al generar el certificado SSL\033[0m" msg -bar3 rm -rf "$HOME/.acme.sh/${domain}_ecc" fi fi continuar read foo } #============================================ restart_v2r(){ xray restart #echo "reiniciando" } fun_lock(){ unset seg local seg=$(date +%s) while : do clear users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) title " BLOQUEAR USUARIO Y MANDARLO AL LIMBOOOOO" userDat local n=1 for i in $users do unset DateExp unset seg_exp unset exp [[ $i = null ]] || { DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" seg_exp=$(date +%s --date="$DateExp") exp="[$(($(($seg_exp - $seg)) / 86400))]" col "$n)" "$i" "$DateExp" "$exp" local uid[$n]="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f2|tr -d '[[:space:]]')" local user[$n]=$i local p=$n let n++ } done msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUMERO DE USUARIO A BLOQUEAR" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && continue [[ $opcion = 0 ]] && break [[ ! $opcion =~ $numero ]] && { blanco " solo numeros apartir de 1" sleep 0.2 } || { let n-- [[ $opcion -gt ${n} ]] && { blanco "solo numero entre 1 y $n" sleep 0.2 } || { #echo -e " OPCION ${opcion} / USER : ${user[$opcion]}" local LOCKDATA="$(cat ${user_conf}|grep -w "${user[$opcion]}"|cut -d'|' -f3)" local tempo=$(date +%s --date="$LOCKDATA") local dias="$(($(($tempo - $seg)) / 86400))" [[ $opcion>=${p} ]] && { echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days") |${dias}" >> $configLOCK #echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days") |${dias}" mv $config $temp echo jq \'del\(.inbounds[].settings.clients[$opcion]\)\' $temp \> $config | bash chmod 777 $config sed -i "/${user[$opcion]}/d" $user_conf rm $temp chmod 777 $configLOCK #read -p "PAUSE" } || { echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days") |${dias}" >> $configLOCK #echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days") |${dias}" mv $config $temp echo jq \'del\(.inbounds[].settings.clients[$opcion]\)\' $temp \> $config | bash chmod 777 $config rm $temp sed -i "/${user[$opcion]}/d" $user_conf chmod 777 $configLOCK #read -p "PAUSE" clear msg -bar3 #blanco " Usuario $(jq .inbounds[].settings.clients[$opcion].email $config) eliminado" blanco " USUARIO ${user[$opcion]} NUM: ${opcion} ENVIADO AL LIMBOOOO !!" msg -bar3 restart_v2r } sleep 0.2 } } done } fun_unlock(){ #echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days")" >> $configLOCK while : do unset user n clear title " DESBOQUEAR USUARIOS DEL LIMBOOOOO!!!" userDat userEpx=$(cut -d " " -f1 $configLOCK) n=1 for i in $userEpx do DateExp="$(cat ${configLOCK}|grep -w "${i}"|cut -d'|' -f4)" #seg_exp=$(date +%s --date="$DateExp") #[[ "$seg" -gt "$seg_exp" ]] && { col "$n)" "$i" "$DateExp DIAS" "\033[0;31m[LOCK]" #col "$n)" "$i" "\033[0;31m[LOCK]" local uid[$n]="$(cat ${configLOCK}|grep -w "${i}"|cut -d'|' -f2|tr -d '[[:space:]]')" local user[$n]=$i local tiempito[$n]="$(cat ${configLOCK}|grep -w "${i}"|cut -d'|' -f4|tr -d '[[:space:]]')" let n++ #} done [[ -z ${user[1]} ]] && blanco " No hay bloqueados!!!" msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUMERO DE USUARIO A DESBLOQUEAR" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && continue [[ $opcion = 0 ]] && break [[ ! $opcion =~ $numero ]] && { blanco " solo numeros apartir de 1" sleep 0.2 } || { [[ $opcion>=${n} ]] && { let n-- blanco "solo numero entre 1 y $n" sleep 0.2 } || { #blanco "DURACION EN DIAS" 0 local dias=${tiempito[$opcion]} mv $config $temp num=$(jq '.inbounds[].settings.clients | length' $temp) aid=$(jq '.inbounds[].settings.clients[0].alterId' $temp) echo "cat $temp | jq '.inbounds[].settings.clients[$num] += {alterId:${aid},id:\"${uid[$opcion]}\",email:\"${user[$opcion]}\"}' >> $config" | bash sed -i "/${user[$opcion]}/d" ${configLOCK} echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days")" >> $user_conf chmod 777 $config rm $temp clear msg -bar3 blanco " USUARIO ${user[$opcion]} RETIRADO DEL LIMBOOOOOOO!!" msg -bar3 restart_v2r sleep 0.2 } } done } _lo_un(){ clear msg -bar3 echo -e "\033[0;35m [${cor[2]}1\033[0;35m]\033[0;33m ${flech}\033[0;33m [!] BLOQUEAR USUARIO V2RAY " echo -e "\033[0;35m [${cor[2]}2\033[0;35m]\033[0;33m ${flech}\033[0;33m [!] DESBLOQUEAR USUARIO V2RAY " msg -bar3 echo -e " \033[0;35m[${cor[2]}0\033[0;35m]\033[0;33m ${flech} $(msg -bra "\033[1;43m[ Salir ]\e[0m")" msg -bar3 selection=$(selection_fun 2) case ${selection} in 1) fun_lock ;; 2) fun_unlock ;; esac } add_user(){ unset seg seg=$(date +%s) while : do clear users="$(cat $config | jq -r .inbounds[].settings.clients[].email)" title " CREAR USUARIO xray" userDat n=0 for i in $users do unset DateExp unset seg_exp unset exp [[ $i = null ]] && { i="default" a='*' DateExp=" unlimit" col "$a)" "$i" "$DateExp" } || { DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" seg_exp=$(date +%s --date="$DateExp") exp="[$(($(($seg_exp - $seg)) / 86400))]" col "$n)" "$i" "$DateExp" "$exp" } let n++ done msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NOMBRE DEL NUEVO USUARIO" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && continue [[ $opcion = 0 ]] && break blanco "DURACION EN DIAS" 0 read dias espacios=$(echo "$opcion" | tr -d '[[:space:]]') opcion=$espacios mv $config $temp num=$(jq '.inbounds[].settings.clients | length' $temp) new=".inbounds[].settings.clients[$num]" new_id=$(uuidgen) new_mail="email:\"$opcion\"" aid=$(jq '.inbounds[].settings.clients[0].alterId' $temp) echo jq \'$new += \{alterId:${aid},id:\"$new_id\","$new_mail"\}\' $temp \> $config | bash echo "$opcion | $new_id | $(date '+%y-%m-%d' -d " +$dias days")" >> $user_conf chmod 777 $config rm $temp clear msg -bar3 blanco " Usuario $opcion creado Exitosamente" msg -bar3 restart_v2r sleep 0.2 #------------------------------------------------------------- ps=${opcion} #$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" id=${new_id} #$(jq .inbounds[].settings.clients[$opcion].id $config) aid=$(jq .inbounds[].settings.clients[].alterId $config | head -1) add=$(jq '.inbounds[].domain' $config) && [[ $add = null ]] && add=$(wget -qO- ipv4.icanhazip.com) host=$(jq '.inbounds[].streamSettings.wsSettings.headers.Host' $config) && [[ $host = null ]] && host='aqui.tu.host' net=$(jq '.inbounds[].streamSettings.network' $config) [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) port=$(jq '.inbounds[].port' $config) tls=$(jq '.inbounds[].streamSettings.security' $config) addip=$(wget -qO- ifconfig.me) clear msg -bar3 blanco " Usuario: $ps" msg -bar3 col2 "Remarks:" "$ps" col2 "Domain:" "$add" col2 "IP-Address:" "$addip" col2 "Port:" "$port" col2 "id:" "$id" col2 "alterId:" "$aid" col2 "network:" "$net" [[ $tls = '"tls"' ]] && col2 "TLS:" "ABIERTO" || col2 "TLS:" " CERRADO" [[ $net = '"grpc"' ]] && col2 "Mode:" " GUN" || col2 "Head Type:" "none" col2 "security:" "none" [[ ! $host = '' ]] && col2 "Host/SNI:" "$host" [[ $net = '"grpc"' ]] && col2 "ServiceName:" "$path" || col2 "Path:" "$path" msg -bar3 blanco " VMESS LINK CONFIG" msg -bar3 vmess msg -bar3 echo -e " ESTA CONFIG SOLO SE MUESTRA UNA VEZ AQUI \n SI QUIERES VOLVER A VERLA VE A LA OPCION 4 \n Y BALLASE A LA BERGA PERRO :V" msg -bar3 continuar read foo #--------------------------------------------------------------------- done } renew(){ while : do unset user clear title " RENOVAR USUARIOS" userDat userEpx=$(cut -d " " -f1 $user_conf) n=1 for i in $userEpx do DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" seg_exp=$(date +%s --date="$DateExp") [[ "$seg" -gt "$seg_exp" ]] && { col "$n)" "$i" "$DateExp" "\033[0;31m[Exp]" uid[$n]="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f2|tr -d '[[:space:]]')" user[$n]=$i let n++ } done [[ -z ${user[1]} ]] && blanco " No hay expirados" msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUMERO DE USUARIO A RENOVAR" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && continue [[ $opcion = 0 ]] && break [[ ! $opcion =~ $numero ]] && { blanco " solo numeros apartir de 1" sleep 0.2 } || { [[ $opcion>${n} ]] && { let n-- blanco "solo numero entre 1 y $n" sleep 0.2 } || { blanco "DURACION EN DIAS" 0 read dias mv $config $temp num=$(jq '.inbounds[].settings.clients | length' $temp) aid=$(jq '.inbounds[].settings.clients[0].alterId' $temp) echo "cat $temp | jq '.inbounds[].settings.clients[$num] += {alterId:${aid},id:\"${uid[$opcion]}\",email:\"${user[$opcion]}\"}' >> $config" | bash sed -i "/${user[$opcion]}/d" $user_conf echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days")" >> $user_conf chmod 777 $config rm $temp clear msg -bar3 blanco " Usuario ${user[$opcion]} renovado Exitosamente" msg -bar3 restart_v2r sleep 0.2 } } done } autoDel(){ seg=$(date +%s) while : do unset users users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) n=0 for i in $users do [[ ! $i = null ]] && { DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" seg_exp=$(date +%s --date="$DateExp") [[ "$seg" -gt "$seg_exp" ]] && { mv $config $temp echo jq \'del\(.inbounds[].settings.clients[$n]\)\' $temp \> $config | bash chmod 777 $config rm $temp continue } } let n++ done break done restart_v2r } dell_user(){ unset seg seg=$(date +%s) while : do clear users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) title " ELIMINAR USUARIO xray" userDat n=0 for i in $users do userd[$n]=$i unset DateExp unset seg_exp unset exp [[ $i = null ]] && { i="default" a='*' DateExp=" unlimit" col "$a)" "$i" "$DateExp" } || { DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" seg_exp=$(date +%s --date="$DateExp") exp="[$(($(($seg_exp - $seg)) / 86400))]" col "$n)" "$i" "$DateExp" "$exp" } p=$n let n++ done userEpx=$(cut -d " " -f 1 $user_conf) for i in $userEpx do DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" seg_exp=$(date +%s --date="$DateExp") [[ "$seg" -gt "$seg_exp" ]] && { col "$n)" "$i" "$DateExp" "\033[0;31m[Exp]" expUser[$n]=$i } let n++ done msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUMERO DE USUARIO A ELIMINAR" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && continue [[ $opcion = 0 ]] && break [[ ! $opcion =~ $numero ]] && { blanco " solo numeros apartir de 1" sleep 0.2 } || { let n-- [[ $opcion>=${n} ]] && { blanco "solo numero entre 1 y $n" sleep 0.2 } || { [[ $opcion>${p} ]] && { sed -i "/${expUser[$opcion]}/d" $user_conf } || { sed -i "/${userd[$opcion]}/d" $user_conf mv $config $temp echo jq \'del\(.inbounds[].settings.clients[$opcion]\)\' $temp \> $config | bash chmod 777 $config rm $temp clear msg -bar3 blanco " Usuario eliminado" msg -bar3 restart_v2r } sleep 0.2 } } done } view_user(){ unset seg seg=$(date +%s) while : do clear users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) title " VER USUARIO xray" userDat n=1 for i in $users do unset DateExp unset seg_exp unset exp [[ $i = null ]] && { i="Admin" DateExp=" Ilimitado" } || { DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" seg_exp=$(date +%s --date="$DateExp") exp="[$(($(($seg_exp - $seg)) / 86400))]" } col "$n)" "$i" "$DateExp" "$exp" let n++ done msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "VER DATOS DEL USUARIO" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && continue [[ $opcion = 0 ]] && break let opcion-- ps=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" id=$(jq .inbounds[].settings.clients[$opcion].id $config) aid=$(jq .inbounds[].settings.clients[$opcion].alterId $config) add=$(jq '.inbounds[].domain' $config) && [[ $add = null ]] && add=$(wget -qO- ipv4.icanhazip.com) host=$(jq '.inbounds[].streamSettings.wsSettings.headers.Host' $config) && [[ $host = null ]] && host='aqui.tu.host' net=$(jq '.inbounds[].streamSettings.network' $config) [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) port=$(jq '.inbounds[].port' $config) tls=$(jq '.inbounds[].streamSettings.security' $config) addip=$(wget -qO- ifconfig.me) clear msg -bar3 blanco " Usuario: $ps" msg -bar3 col2 "Remarks:" "$ps" col2 "Domain:" "$add" col2 "IP-Address:" "$addip" col2 "Port:" "$port" col2 "id:" "$id" col2 "alterId:" "$aid" col2 "network:" "$net" [[ $tls = '"tls"' ]] && col2 "TLS:" "ABIERTO" || col2 "TLS:" " CERRADO" [[ $net = '"grpc"' ]] && col2 "Mode:" " GUN" || col2 "Head Type:" "none" col2 "security:" "none" [[ ! $host = '' ]] && col2 "Host/SNI:" "$host" [[ $net = '"grpc"' ]] && col2 "ServiceName:" "$path" || col2 "Path:" "$path" msg -bar3 blanco " VMESS LINK CONFIG" msg -bar3 vmess msg -bar3 continuar read foo done } vmess() { [[ $net = '"grpc"' ]] && echo -e "\033[3;32mvmess://$(echo {\"v\": \"2\", \"ps\": $ps, \"add\": $addip, \"port\": $port, \"aid\": $aid, \"type\": \"none\", \"net\": $net, \"path\": $path, \"host\": $host, \"id\": $id, \"tls\": $tls} | base64 -w 0)\033[3;32m" || { [[ $net = '"ws"' ]] && echo -e "\033[3;32mvmess://$(echo {\"v\": \"2\", \"ps\": $ps, \"add\": $addip, \"port\": $port, \"aid\": $aid, \"type\": \"gun\", \"net\": $net, \"path\": $path, \"host\": $host, \"id\": $id, \"tls\": $tls} | base64 -w 0)\033[3;32m" } } alterid(){ while : do aid=$(jq '.inbounds[].settings.clients[0].alterId' $config) clear msg -bar3 blanco " configuracion alterId" msg -bar3 col2 " alterid:" "$aid" msg -bar3 col "x)" "VOLVER" msg -bar3 blanco "NUEVO VALOR" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = x ]] && break mv $config $temp new=".inbounds[].settings.clients[0]" echo jq \'$new += \{alterId:${opcion}\}\' $temp \> $config | bash chmod 777 $config rm $temp clear msg -bar3 blanco "Nuevo AlterId fijado" msg -bar3 restart_v2r sleep 0.2 done } port(){ while : do port=$(jq '.inbounds[].port' $config) clear msg -bar3 blanco " configuracion de puerto" msg -bar3 col2 " Puerto:" "$port" msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUEVO PUERTO" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = 0 ]] && break mv $config $temp new=".inbounds[]" echo jq \'$new += \{port:${opcion}\}\' $temp \> $config | bash chmod 777 $config rm $temp clear msg -bar3 blanco " Nuevo Puerto fijado" msg -bar3 sleep 0.2 restart_v2r done } address(){ while : do add=$(jq '.inbounds[].domain' $config) && [[ $add = null ]] && add=$(wget -qO- ipv4.icanhazip.com) clear msg -bar3 blanco " configuracion address" msg -bar3 col2 "address:" "$add" msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUEVO ADDRESS" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = 0 ]] && break mv $config $temp echo "cat $temp | jq '.inbounds[] += {domain:\"$opcion\"}' >> $config" | bash chmod 777 $config rm $temp clear msg -bar3 blanco "Nuevo address fijado" msg -bar3 restart_v2r sleep 0.2 done } host(){ while : do host=$(jq '.inbounds[].streamSettings.wsSettings.headers.Host' $config) && [[ $host = null ]] && host='sin host' clear msg -bar3 blanco " configuracion Host" msg -bar3 col2 "Host:" "$host" msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUEVO HOST" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = 0 ]] && break mv $config $temp echo "cat $temp | jq '.inbounds[].streamSettings.wsSettings.headers += {Host:\"$opcion\"}' >> $config" | bash chmod 777 $config rm $temp clear msg -bar3 blanco "Nuevo Host fijado" msg -bar3 restart_v2r sleep 0.2 done } path(){ while : do path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) && [[ $path = null ]] && path='' clear msg -bar3 blanco " configuracion Path" msg -bar3 col2 "path:" "$path" msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "NUEVO Path" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = 0 ]] && break mv $config $temp echo "cat $temp | jq '.inbounds[].streamSettings.wsSettings += {path:\"$opcion\"}' >> $config" | bash chmod 777 $config rm $temp clear msg -bar3 blanco "Nuevo path fijado" msg -bar3 sleep 0.2 restart_v2r done } crt_man(){ while : do clear msg -bar3 blanco "configuracion de certificado manual" msg -bar3 chek=$(jq '.inbounds[].streamSettings.tlsSettings' $config) [[ ! $chek = {} ]] && { crt=$(jq '.inbounds[].streamSettings.tlsSettings.certificates[].certificateFile' $config) key=$(jq '.inbounds[].streamSettings.tlsSettings.certificates[].keyFile' $config) dom=$(jq '.inbounds[].domain' $config) echo -e " \033[4;49minstalado\033[0m" col2 "crt:" "$crt" col2 "key:" "$key" col2 "dominio:" "$dom" } || { blanco " certificado no instalado" } msg -bar3 col "1)" "ingresar nuevo crt" msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "opcion" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = 0 ]] && break clear msg -bar3 blanco "ingrese su archivo de certificado\n ej: /root/crt/certif.crt" msg -bar3 blanco "crt" 0 read crts clear msg -bar3 blanco " nuevo certificado" msg -bar3 blanco " $crts" msg -bar3 blanco "ingrese su archivo key\n ej: /root/crt/certif.key" msg -bar3 blanco "key" 0 read keys clear msg -bar3 blanco " nuevo certificado" msg -bar3 blanco " $crts" blanco " $keys" msg -bar3 blanco "ingrese su dominio\n ej: netfree.xyz" msg -bar3 blanco "dominio" 0 read domi clear msg -bar3 blanco "verifique sus datos sean correctos!" msg -bar3 blanco " $crts" blanco " $keys" blanco " $domi" msg -bar3 continuar read foo mv $config $temp echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"$crts\",keyFile:\"$keys\"}]}' | jq '.inbounds[] += {domain:\"$domi\"}' | jq '.inbounds[].streamSettings += {security:\"tls\"}' >> $config" | bash chmod 777 $config rm $temp clear msg -bar3 blanco "nuevo certificado agregado" msg -bar3 restart_v2r sleep 0.2 done } install(){ clear install_ini msg -bar3 blanco " Esta por intalar xray!" msg -bar3 blanco " La instalacion puede tener\n alguna fallas!\n por favor observe atentamente\n el log de intalacion,\n este podria contener informacion\n sobre algunos errores!\n estos deveras ser corregidos de\n forma manual antes de continual\n usando el script" msg -bar3 sleep 0.2 blanco "Enter para continuar..." read foo config='/etc/xray/config.json' tmp='/etc/xray/temp.json' source <(curl -sL https://raw.githubusercontent.com/ChumoGH/ADMRufu/main/Utils/xray/xray.sh) #restart_v2r echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/xray_manager.sh)" > /bin/v2r.sh chmod +x /bin/r.sh } xray_tls(){ clear msg -bar3 blanco " certificado tls xray" echo -e "Ingrese Correo Temporal o Fijo \n Para Validar su Cerficicado SSL " read -p " Ejemplo > email=my@example.com : " -e -i $(date | md5sum | head -c15)@gmail.com crreo msg -bar3 wget -O - https://get.acme.sh | sh -s email=$crreo xray tls msg -bar3 continuar read foo } xray_stream(){ clear msg -bar3 blanco " instalacion de protocolos xray" msg -bar3 xray stream msg -bar3 continuar read foo } xray_menu(){ clear msg -bar3 blanco " MENU xray" msg -bar3 xray } backups(){ while : do unset opcion unset PID if [[ $(ps x | grep "http-server" | grep -v grep) = "" ]]; then PID="\033[0;31m[offline]" else PID="\033[1;92m[online]" fi clear title " Config de Respaldos" col "1)" "Respaldar Ahora" col "2)" "\033[1;92mRestaurar Respaldo" col "3)" "\033[0;31mEliminiar Respaldos" col "4)" "\033[1;34mRespaldo en linea $PID" col "5)" "\033[1;33mRespaldos automatico $(on_off_res)" msg -bar3 col "6)" "\033[1;33m RESTAURAR Online PORT :81 " msg -bar3 col "0)" "VOLVER" msg -bar3 blanco "opcion" 0 read opcion case $opcion in 1) autBackup clear title " Nuevo Respaldo Creado..." sleep 0.2;; 2) restore;; 3) rm -rf $backdir/*.tar clear title " Almacer de Respaldo limpia..." sleep 0.2;; 4) server;; 5) if [[ $(cat $v2rdir/conf | grep "autBackup" | cut -d " " -f2) = "0" ]]; then sed -i 's/autBackup 0/autBackup 1/' $v2rdir/conf else sed -i 's/autBackup 1/autBackup 0/' $v2rdir/conf fi;; 6) clear echo -e "\033[0;33m ESTA FUNCION EXPERIMENTAL Una vez que se descarge tu Fichero, Escoje el BackOnline + OJO + Luego de Restaurarlo, Vuelve Activar el TLS Para Validar la Configuracion de tu certificao" msg -bar3 echo -n "INGRESE LINK Que Mantienes Online en GitHub, o VPS \n" read -p "Pega tu Link : " url1 wget -q -O $backdir/BakcOnline.tar $url1 && echo -e "\033[1;31m- \033[1;32mFile Exito!" && restore || echo -e "\033[1;31m- \033[1;31mFile Fallo" && sleep 0.2 ;; 0) break;; *) blanco "opcion incorrecta..." && sleep 0.2;; esac done } restablecer_v2r(){ clear title " restablecer ajustes xray" echo -e " \033[0;31mEsto va a restablecer los\n ajustes predeterminados de xray" echo -e " Se perdera ajuste previos,\n incluido los Usuarios\033[0m" msg -bar3 blanco "quiere continuar? [S/N]" 0 read opcion msg -bar3 case $opcion in [Ss]|[Yy]) xray new;; [Nn]) continuar && read foo;; esac } remove_all(){ sed -i '/net.core.default_qdisc/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_congestion_control/d' /etc/sysctl.conf sed -i '/fs.file-max/d' /etc/sysctl.conf sed -i '/net.core.rmem_max/d' /etc/sysctl.conf sed -i '/net.core.wmem_max/d' /etc/sysctl.conf sed -i '/net.core.rmem_default/d' /etc/sysctl.conf sed -i '/net.core.wmem_default/d' /etc/sysctl.conf sed -i '/net.core.netdev_max_backlog/d' /etc/sysctl.conf sed -i '/net.core.somaxconn/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_tw_reuse/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_tw_recycle/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_fin_timeout/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_keepalive_time/d' /etc/sysctl.conf sed -i '/net.ipv4.ip_local_port_range/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_max_syn_backlog/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_max_tw_buckets/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_rmem/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_wmem/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_mtu_probing/d' /etc/sysctl.conf sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf sed -i '/fs.inotify.max_user_instances/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_fin_timeout/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_tw_reuse/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_max_syn_backlog/d' /etc/sysctl.conf sed -i '/net.ipv4.ip_local_port_range/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_max_tw_buckets/d' /etc/sysctl.conf sed -i '/net.ipv4.route.gc_timeout/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_synack_retries/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_syn_retries/d' /etc/sysctl.conf sed -i '/net.core.somaxconn/d' /etc/sysctl.conf sed -i '/net.core.netdev_max_backlog/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_timestamps/d' /etc/sysctl.conf sed -i '/net.ipv4.tcp_max_orphans/d' /etc/sysctl.conf clear echo -e " \033[0;92mLa aceleración está Desinstalada." sleep 0.1 } bbr(){ while : do clear title " ACELERACION BBR" blanco " Esto activara la aceleracion\n por defecto de su kernel.\n no se modoficar nada del sistema." msg -bar3 col "1)" "Acivar aceleracion" col "2)" "quitar toda aceleracion" msg -bar3 col "0)" "volver" msg -bar3 blanco "opcion" 0 read opcion case $opcion in 1) remove_all echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf sysctl -p echo -e " \033[0;92m¡BBR comenzó con éxito!";; 2)remove_all;; 0)break;; *)blanco " seleccione una opcion" && sleep 0.2;; esac done } settings(){ while : do clear msg -bar3 blanco " Ajustes e instalacion xray" msg -bar3 col "1)" "address" col "2)" "puerto" col "3)" "alterId" col "4)" "Host" col "5)" "Path" msg -bar3 col "6)" "certif ssl/tls (script)" col "7)" "certif menu nativo" col "8)" "certif ingreso manual" msg -bar3 col "9)" "protocolo menu nativo" col "10)" "conf xray menu nativo" col "11)" "restablecer ajustes" msg -bar3 col "12)" "BBR nativo del sistema" col "13)" "install/re-install xray" msg -bar3 col "14)" "Conf. Copias de Respaldos" msg -bar3 col "0)" "Volver" msg -bar3 blanco "opcion" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = 0 ]] && break case $opcion in 1)address;; 2)port;; 3)alterid;; 4)host;; 5)path;; 6)domain_check && clear ;; 7)xray_tls;; 8)crt_man;; 9)xray_stream;; 10)xray_menu;; 11)restablecer_v2r;; 12)bbr;; 13)install;; 14)backups;; *) blanco " solo numeros de 0 a 14" && sleep 0.2;; esac done } enon(){ echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/xray_manager.sh)" > /bin/xr.sh chmod +x /bin/xr.sh clear msg -bar3 blanco " Se ha agregado un autoejecutor en el Sector de Inicios Rapidos" msg -bar3 blanco " Para Acceder al menu Rapido \n Utilize * xr.sh * !!!" msg -bar3 echo -e " \033[4;31mNOTA importante\033[0m" echo -e " \033[0;31mSi deseas desabilitar esta opcion, apagala" echo -e " Y te recomiendo, no alterar nada en este menu, para" echo -e " Evitar Errores Futuros" echo -e " y causar problemas en futuras instalaciones.\033[0m" msg -bar3 continuar read foo } enoff(){ rm -f $(which xr.sh) msg -bar3 echo -e " \033[4;31mNOTA importante\033[0m" echo -e " \033[0;31mSe ha Desabilitado el menu Rapido de v2r.sh" echo -e " Y te recomiendo, no alterar nada en este menu, para" echo -e " Evitar Errores Futuros" echo -e " y causar problemas en futuras instalaciones.\033[0m" msg -bar3 continuar read foo } enttrada () { while : do clear msg -bar3 blanco " Ajustes e Entrasda Rapida de Menu xray" msg -bar3 col "1)" "Habilitar xr.sh, Como entrada Rapida" col "2)" "Eliminar xr.sh, Como entrada Rapida" msg -bar3 col "0)" "Volver" msg -bar3 blanco "opcion" 0 read opcion [[ -z $opcion ]] && vacio && sleep 0.3 && break [[ $opcion = 0 ]] && break case $opcion in 1)enon;; 2)enoff;; *) blanco " solo numeros de 0 a 2" && sleep 0.1;; esac done } main(){ [[ ! -e $config ]] && { clear msg -bar3 blanco " No se encontro ningun archovo de configracion xray" msg -bar3 blanco " No instalo xray o esta usando\n una vercion diferente!!!" msg -bar3 echo -e " \033[4;31mNOTA importante\033[0m" echo -e " \033[0;31mSi esta usando una vercion xray diferente" echo -e " y opta por cuntinuar usando este script." echo -e " Este puede; no funcionar correctamente" echo -e " y causar problemas en futuras instalaciones.\033[0m" msg -bar3 continuar read foo } while : do _usor=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')") _usop=$(printf '%-1s' "$(top -bn1 | awk '/Cpu/ { cpu = "" 100 - $8 "%" }; END { print cpu }')") [[ -e /bin/v2r.sh ]] && enrap="\033[1;92m[ON]" || enrap="\033[0;31m[OFF]" [[ -e /etc/xray/config.json ]] && _v2Reg="$(cat /etc/xray/config.json | jq .inbounds[].settings.clients[].email|wc -l)" || _v2Reg=0 [[ -e /etc/xray/config.json.lock ]] && _v2LOCK="$(cat /etc/xray/config.json.lock|wc -l)" || _v2LOCK=0 clear title2 title " Ram: \033[1;32m$_usor \033[0;31m<<< \033[1;37mMENU xray \033[0;31m>>> \033[1;37mCPU: \033[1;32m$_usop" col "1)" "CREAR USUARIO" col "2)" "\033[0;92mRENOVAR USUARIO" col "3)" "\033[0;31mREMOVER USUARIO" col "4)" "VER DATOS DE USUARIOS \033[1;32m ( ${_v2Reg} )" col "5)" "VER USUARIOS CONECTADOS" col "b)" "LOCK/UNLOCK USUARIOS \033[1;32m ( ${_v2LOCK} ) " msg -bar3 col "6)" "\033[1;33mAJUSTES XRAY $_v2" msg -bar3 col "7)" "\033[1;33mENTRAR CON \033[1;32mxr.sh $enrap" msg -bar3 col "8)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" msg -bar3 blanco "opcion" 0 read opcion case $opcion in 1) add_user;; 2) renew;; 3) dell_user;; 4) view_user;; 5) usrCONEC ;; 6) settings;; 7) enttrada;; b) _lo_un;; 0) break;; *) blanco "\n selecione una opcion del 0 al 7" && sleep 0.1;; esac done } [[ $1 = "autoDel" ]] && { autoDel } || { autoDel main }