├── README.md ├── _xkeen ├── 01_info │ ├── 00_info_import.sh │ ├── 01_info_variable.sh │ ├── 02_info_packages.sh │ ├── 03_info_cpu.sh │ ├── 04_info_xray.sh │ ├── 05_info_geodata.sh │ ├── 05_info_geosite.sh │ ├── 06_info_geoip.sh │ ├── 07_info_cron.sh │ ├── 08_info_version │ │ ├── 00_version_import.sh │ │ ├── 01_version_xkeen.sh │ │ └── 02_version_xray.sh │ ├── 09_info_compare │ │ ├── 00_compare_import.sh │ │ ├── 01_compare_xkeen.sh │ │ └── 02_compare_xray.sh │ └── _variable_help.sh ├── 02_install │ ├── 00_install_import.sh │ ├── 01_install_packages.sh │ ├── 02_install_xray.sh │ ├── 03_install_xkeen.sh │ ├── 04_install_geodata.sh │ ├── 04_install_geosite.sh │ ├── 05_install_geoip.sh │ ├── 06_install_cron.sh │ ├── 07_install_register │ │ ├── 00_register_import.sh │ │ ├── 01_register_xray.sh │ │ ├── 02_register_xkeen.sh │ │ └── 03_register_cron.sh │ └── 08_install_configs │ │ ├── 00_configs_import.sh │ │ ├── 01_configs_install.sh │ │ └── 02_configs_dir │ │ ├── 00_base.json │ │ ├── 01_log.json │ │ ├── 02_stats.json │ │ ├── 03_dns.json │ │ ├── 04_reverse.json │ │ ├── 05_fake-dns.json │ │ ├── 06_transport.json │ │ ├── 07_inbounds.json │ │ ├── 08_outbounds.json │ │ ├── 09_policy.json │ │ ├── 10_routing.json │ │ └── 11_fallbacks.json ├── 03_delete │ ├── 00_delete_import.sh │ ├── 01_delete_geodata.sh │ ├── 01_delete_geosite.sh │ ├── 02_delete_geoip.sh │ ├── 03_delete_cron.sh │ ├── 04_delete_configs.sh │ ├── 05_delete_register.sh │ └── 06_delete_tmp.sh ├── 04_tools │ ├── 00_tools_import.sh │ ├── 01_tools_logs │ │ ├── 00_logs_import.sh │ │ ├── 01_logs_clear.sh │ │ ├── 02_logs_console.sh │ │ └── 03_logs_xkeen.sh │ ├── 02_tools_choose │ │ ├── 00_choose_import.sh │ │ ├── 01_choose_input.sh │ │ ├── 02_choose_geodata.sh │ │ ├── 02_choose_geosite.sh │ │ ├── 03_choose_geoip.sh │ │ └── 04_choose_cron │ │ │ ├── 00_cron_import.sh │ │ │ ├── 01_cron_status.sh │ │ │ └── 02_cron_time.sh │ ├── 03_tools_backups │ │ ├── 00_backups_import.sh │ │ ├── 01_backups_xray.sh │ │ ├── 02_backups_configs.sh │ │ └── 02_backups_xkeen.sh │ ├── 04_tools_downloaders │ │ ├── 00_downloaders_import.sh │ │ ├── 01_downloaders_xray.sh │ │ └── 02_donwloaders_xkeen.sh │ ├── 05_tools_archive.sh │ ├── 05_tools_cpu-keyword.sh │ └── 06_tools_archive.sh ├── 05_tests │ ├── 00_tests_import.sh │ ├── 01_tests_connected.sh │ ├── 02_tests_ports.sh │ ├── 02_tests_xports.sh │ ├── 03_test_arch-simulate.sh │ ├── 03_tests_socks5.sh │ ├── 03_tests_xports.sh │ ├── 04_tests_reality.sh │ ├── 04_tests_users.sh │ ├── 05_tests_temperature.sh │ ├── 06_tests_speed.sh │ ├── 07_tests_socks5.sh │ └── 08_tests_reality.sh ├── author.sh ├── help └── import.sh ├── install.sh ├── optimise_server.sh └── xkeen /README.md: -------------------------------------------------------------------------------- 1 | # Xray-Keenetic -------------------------------------------------------------------------------- /_xkeen/01_info/00_info_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт информационных модулей 2 | 3 | # Модуль информации 4 | . "$xinfo_dir/01_info_variable.sh" 5 | . "$xinfo_dir/02_info_packages.sh" 6 | . "$xinfo_dir/03_info_cpu.sh" 7 | . "$xinfo_dir/04_info_xray.sh" 8 | . "$xinfo_dir/05_info_geosite.sh" 9 | . "$xinfo_dir/06_info_geoip.sh" 10 | . "$xinfo_dir/07_info_cron.sh" 11 | 12 | . "$xinfo_dir/08_info_version/00_version_import.sh" 13 | . "$xinfo_dir/09_info_compare/00_compare_import.sh" 14 | -------------------------------------------------------------------------------- /_xkeen/01_info/01_info_variable.sh: -------------------------------------------------------------------------------- 1 | # Определение цветов для вывода в терминал 2 | green="\033[32m" # Зеленый 3 | red="\033[31m" # Красный 4 | yellow="\033[33m" # Желтый 5 | light_blue="\033[96m" # Голубой 6 | dark_gray="\e[90m" # Темно-серый 7 | reset="\033[0m" # Сброс цветов 8 | 9 | # ------------------------------------- 10 | # Определение директорий 11 | # ------------------------------------- 12 | 13 | tmp_dir_global="/opt/tmp" # Временная директория общая 14 | tmp_dir="/opt/tmp/xkeen" # Временная директория xkeen 15 | xkeen_log_dir="/opt/var/log/xkeen" # Директория логов для xkeen 16 | xray_log_dir="/opt/var/log/xray" # Директория логов для xray 17 | initd_dir="/opt/etc/init.d" # Директория init.d 18 | pid_dir="/opt/var/run" # Директория для pid файлов 19 | backups_dir="/opt/backups" # Директория для бекапов 20 | install_dir="/opt/sbin" # Директория установки 21 | xkeen_dir="/opt/sbin/.xkeen" # xkeen директория 22 | geo_dir="/opt/etc/xray/dat" # Директория для dat 23 | cron_dir="/opt/var/spool/cron/crontabs" # Директория для cron файла xkeen 24 | cron_file="root" # Сron файл 25 | install_conf_dir="/opt/etc/xray/configs" # Директория для хранения конфигурации в xray 26 | xkeen_conf_dir="$xkeen_dir/02_install/08_install_configs/02_configs_dir/" # Директория для хранения конфигурации в xkeen 27 | register_dir="/opt/lib/opkg/info" 28 | status_file="/opt/lib/opkg/status" 29 | releases_dir="/opt/releases" 30 | app_name=Xkeen 31 | xkeen_current_version="0.8.2" 32 | 33 | # ------------------------------------- 34 | # Определение временных значений 35 | # ------------------------------------- 36 | 37 | installed_time=$(date +%s) 38 | existing_content=$(cat "$status_file") 39 | installed_size=$(du -s "$install_dir" | cut -f1) 40 | source_date_epoch=$(date +%s) 41 | current_datetime=$(date "+%d-%b-%y_%H-%M") 42 | 43 | # ------------------------------------- 44 | # Определение url api 45 | # ------------------------------------- 46 | 47 | xray_api_url_reserv="https://api.github.com/repos/yichya/openwrt-xray/releases/latest" # url резервного api для xray 48 | xray_api_url="https://api.github.com/repos/XTLS/Xray-core/releases/latest" # url api для xray 49 | xkeen_api_url="https://api.github.com/repos/skrill0/xkeen/releases/latest" # url api для xkeen 50 | 51 | # ------------------------------------- 52 | # Создание директорий и файлов 53 | # ------------------------------------- 54 | 55 | # Проверка и создание директорий логов, если не существуют 56 | mkdir -p "$xkeen_log_dir" || { echo "Ошибка: Не удалось создать директорию $xkeen_log_dir"; exit 1; } 57 | mkdir -p "$xray_log_dir" || { echo "Ошибка: Не удалось создать директорию $xray_log_dir"; exit 1; } 58 | mkdir -p "$initd_dir" || { echo "Ошибка: Не удалось создать директорию $initd_dir"; exit 1; } 59 | mkdir -p "$pid_dir" || { echo "Ошибка: Не удалось создать директорию $pid_dir"; exit 1; } 60 | mkdir -p "$backups_dir" || { echo "Ошибка: Не удалось создать директорию $backups_dir"; exit 1; } 61 | mkdir -p "$install_dir" || { echo "Ошибка: Не удалось создать директорию $install_dir"; exit 1; } 62 | mkdir -p "$cron_dir" || { echo "Ошибка: Не удалось создать директорию $cron_dir"; exit 1; } 63 | 64 | # ------------------------------------- 65 | # Определение файлов логов 66 | # ------------------------------------- 67 | 68 | xkeen_info_log="$xkeen_log_dir/info.log" 69 | xkeen_error_log="$xkeen_log_dir/error.log" 70 | 71 | xray_access_log="$xray_log_dir/access.log" 72 | xray_error_log="$xray_log_dir/error.log" 73 | 74 | # Создание .log файлов, если они не существуют 75 | touch "$xkeen_info_log" || { echo "Ошибка: Не удалось создать файл $xkeen_info_log"; exit 1; } 76 | touch "$xkeen_error_log" || { echo "Ошибка: Не удалось создать файл $xkeen_error_log"; exit 1; } 77 | 78 | touch "$xray_access_log" || { echo "Ошибка: Не удалось создать файл $xkeen_info_log"; exit 1; } 79 | touch "$xray_error_log" || { echo "Ошибка: Не удалось создать файл $xkeen_error_log"; exit 1; } 80 | 81 | # ------------------------------------- 82 | # Функция для вызова api с обработкой ошибок 83 | # ------------------------------------- 84 | 85 | call_api() { 86 | local url="$1" 87 | local response 88 | 89 | response=$(curl -ss "$url") 90 | if [ $? -ne 0 ]; then 91 | log_error "Ошибка при вызове api: $url" 92 | exit 1 93 | fi 94 | 95 | echo "$response" 96 | } 97 | 98 | log_notice(){ 99 | local header=${app_name} 100 | logger -p notice -t "${header}" "${1}" 101 | } 102 | -------------------------------------------------------------------------------- /_xkeen/01_info/02_info_packages.sh: -------------------------------------------------------------------------------- 1 | # Функция для проверки наличия необходимых пакетов 2 | info_packages() { 3 | local package_name="$1" 4 | 5 | # Проверяем, установлен ли пакет 6 | if opkg list-installed | grep -q "$package_name"; then 7 | package_status="installed" 8 | else 9 | package_status="not_installed" 10 | fi 11 | } 12 | 13 | # Проверка наличия пакета "lscpu" 14 | info_packages "lscpu" 15 | info_packages_lscpu=$package_status 16 | 17 | # Проверка наличия пакета "coreutils-uname" 18 | info_packages "coreutils-uname" 19 | info_packages_uname=$package_status 20 | 21 | # Проверка наличия пакета "curl" 22 | info_packages "curl" 23 | info_packages_curl=$package_status 24 | 25 | # Проверка наличия пакета "jq" 26 | info_packages "jq" 27 | info_packages_jq=$package_status 28 | 29 | # Проверка наличия пакета "libc" 30 | info_packages "libc" 31 | info_packages_libc=$package_status 32 | 33 | # Проверка наличия пакета "libssp" 34 | info_packages "libssp" 35 | info_packages_libssp=$package_status 36 | 37 | # Проверка наличия пакета "librt" 38 | info_packages "librt" 39 | info_packages_librt=$package_status 40 | 41 | # Проверка наличия пакета "libpthread" 42 | info_packages "libpthread" 43 | info_packages_libpthread=$package_status 44 | 45 | # Проверка наличия пакета "ca-bundle" 46 | info_packages "ca-bundle" 47 | info_packages_cabundle=$package_status 48 | 49 | -------------------------------------------------------------------------------- /_xkeen/01_info/03_info_cpu.sh: -------------------------------------------------------------------------------- 1 | info_cpu() { 2 | 3 | # Попробуем получить архитектуру из uname 4 | case "$(uname -m | tr '[:upper:]' '[:lower:]')" in 5 | *'armv5tel'*) 6 | architecture='arm32-v5' 7 | ;; 8 | *'armv6l'*) 9 | architecture='arm32-v6' 10 | if grep Features /proc/cpuinfo | grep -qw 'vfp'; then 11 | architecture='arm32-v5' 12 | fi 13 | ;; 14 | *'armv7'*) 15 | architecture='arm32-v7a' 16 | if grep Features /proc/cpuinfo | grep -qw 'vfp'; then 17 | architecture='arm32-v5' 18 | fi 19 | ;; 20 | *'armv8'* | *'aarch64'*) 21 | architecture='arm64-v8a' 22 | ;; 23 | *'mips64le'* | *'mips64'* ) 24 | architecture='mips64' 25 | ;; 26 | *'mipsle'* | *'mips 1004'* | *'mips 34'* | *'mips 24'*) 27 | architecture='mips32le' 28 | ;; 29 | *'mips'*) 30 | architecture='mips32' 31 | ;; 32 | *) 33 | # Если архитектура не определена через uname, используем резервную проверку /proc/cpuinfo 34 | local cpuinfo=$(grep -i 'model name' /proc/cpuinfo | sed -e 's/.*: //i' | tr '[:upper:]' '[:lower:]') 35 | 36 | if echo "$cpuinfo" | grep -q -e *'armv8'* -e *'aarch64'* -e *'cortex-a'*; then 37 | architecture='arm64-v8a' 38 | elif echo "$cpuinfo" | grep -q -e *'mips64le'*; then 39 | architecture='mips64le' 40 | elif echo "$cpuinfo" | grep -q -e *'mips64'*; then 41 | architecture='mips64' 42 | elif echo "$cpuinfo" | grep -q -e *'mips32le'* -e *'mips 1004'* -e *'mips 34'* -e *'mips 24'*; then 43 | architecture='mips32le' 44 | elif echo "$cpuinfo" | grep -q -e *'mips'*; then 45 | architecture='mips32' 46 | fi 47 | ;; 48 | esac 49 | 50 | # Проверяем Little Endian с помощью lscpu только при архитектуре "mips64" или "mips32" 51 | if [ "$architecture" = 'mips64' ] || [ "$architecture" = 'mips32' ]; then 52 | if [ "$info_packages_lscpu" = "not_installed" ]; then 53 | opkg install lscpu &>/dev/null 54 | fi 55 | 56 | local lscpu_output="$(lscpu 2>/dev/null | tr '[:upper:]' '[:lower:]')" 57 | if echo "$lscpu_output" | grep -q "little endian"; then 58 | architecture="${architecture}le" 59 | fi 60 | fi 61 | 62 | # Получаем информацию о архитектуре из файла состояния (status_file) 63 | status_architecture=$(grep -m 1 '^Architecture:' "$status_file" | awk '{print $2}') 64 | } 65 | -------------------------------------------------------------------------------- /_xkeen/01_info/04_info_xray.sh: -------------------------------------------------------------------------------- 1 | # Функция для проверки установки xray 2 | 3 | info_xray() { 4 | if [ -e "$install_dir/xray" ]; then 5 | xray_installed="installed" 6 | else 7 | xray_installed="not_installed" 8 | fi 9 | } 10 | -------------------------------------------------------------------------------- /_xkeen/01_info/05_info_geodata.sh: -------------------------------------------------------------------------------- 1 | # Функция для проверки наличия и записи информации о базах geo 2 | info_geodata() { 3 | # Проверяем наличие файла geodata_antizapret.dat 4 | if [ -e "$geo_dir/geodata_antizapret.dat" ]; then 5 | geo_exists_geodata_antizapret="installed" 6 | else 7 | geo_exists_geodata_antizapret="not_installed" 8 | fi 9 | 10 | # Проверяем наличие файла geodata_antifilter.dat 11 | if [ -e "$geo_dir/geodata_antifilter.dat" ]; then 12 | geo_exists_geodata_antifilter="installed" 13 | else 14 | geo_exists_geodata_antifilter="not_installed" 15 | fi 16 | 17 | # Проверяем наличие файла geodata_v2fly.dat 18 | if [ -e "$geo_dir/geodata_v2fly.dat" ]; then 19 | geo_exists_geodata_v2fly="installed" 20 | else 21 | geo_exists_geodata_v2fly="not_installed" 22 | fi 23 | } 24 | -------------------------------------------------------------------------------- /_xkeen/01_info/05_info_geosite.sh: -------------------------------------------------------------------------------- 1 | # Функция для проверки наличия и записи информации о базах geo 2 | info_geosite() { 3 | # Проверяем наличие файла geosite_antizapret.dat 4 | if [ -e "$geo_dir/geosite_antizapret.dat" ]; then 5 | geo_exists_geosite_antizapret="installed" 6 | else 7 | geo_exists_geosite_antizapret="not_installed" 8 | fi 9 | 10 | # Проверяем наличие файла geosite_antifilter.dat 11 | if [ -e "$geo_dir/geosite_antifilter.dat" ]; then 12 | geo_exists_geosite_antifilter="installed" 13 | else 14 | geo_exists_geosite_antifilter="not_installed" 15 | fi 16 | 17 | # Проверяем наличие файла geosite_v2fly.dat 18 | if [ -e "$geo_dir/geosite_v2fly.dat" ]; then 19 | geo_exists_geosite_v2fly="installed" 20 | else 21 | geo_exists_geosite_v2fly="not_installed" 22 | fi 23 | } 24 | -------------------------------------------------------------------------------- /_xkeen/01_info/06_info_geoip.sh: -------------------------------------------------------------------------------- 1 | # Функция для проверки наличия и записи информации о базах geoip 2 | info_geoip() { 3 | # Проверяем наличие файла geoip_antifilter.dat 4 | if [ -e "$geo_dir/geoip_antifilter.dat" ]; then 5 | geo_exists_geoip_antifilter="installed" 6 | else 7 | geo_exists_geoip_antifilter="not_installed" 8 | fi 9 | 10 | # Проверяем наличие файла geoip_v2fly.dat 11 | if [ -e "$geo_dir/geoip_v2fly.dat" ]; then 12 | geo_exists_geoip_v2fly="installed" 13 | else 14 | geo_exists_geoip_v2fly="not_installed" 15 | fi 16 | } 17 | -------------------------------------------------------------------------------- /_xkeen/01_info/07_info_cron.sh: -------------------------------------------------------------------------------- 1 | # Проверка наличия задач автоматического обновления в cron 2 | info_cron() { 3 | # Получаем текущую crontab конфигурацию для пользователя root 4 | cron_output=$(crontab -l -u root 2>/dev/null) 5 | 6 | # Проверяем наличие задачи с ключевым словом "uxc" в crontab 7 | if echo "$cron_output" | grep -q "ux"; then 8 | info_update_xray_cron="installed" 9 | else 10 | info_update_xray_cron="not_installed" 11 | fi 12 | 13 | # Проверяем наличие задачи с ключевым словом "ukc" в crontab 14 | if echo "$cron_output" | grep -q "uk"; then 15 | info_update_xkeen_cron="installed" 16 | else 17 | info_update_xkeen_cron="not_installed" 18 | fi 19 | 20 | # Проверяем наличие задачи с ключевым словом "ugic" в crontab 21 | if echo "$cron_output" | grep -q "ugi"; then 22 | info_update_geoip_cron="installed" 23 | else 24 | info_update_geoip_cron="not_installed" 25 | fi 26 | 27 | # Проверяем наличие задачи с ключевым словом "ugsc" в crontab 28 | if echo "$cron_output" | grep -q "ugs"; then 29 | info_update_geosite_cron="installed" 30 | else 31 | info_update_geosite_cron="not_installed" 32 | fi 33 | } 34 | -------------------------------------------------------------------------------- /_xkeen/01_info/08_info_version/00_version_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей проверки версий 2 | 3 | # Модули проверки версий 4 | . "$xinfo_dir/08_info_version/01_version_xkeen.sh" 5 | . "$xinfo_dir/08_info_version/02_version_xray.sh" -------------------------------------------------------------------------------- /_xkeen/01_info/08_info_version/01_version_xkeen.sh: -------------------------------------------------------------------------------- 1 | # Функция для получения версии из xkeen API и сохранения ее в переменной 2 | info_version_xkeen() { 3 | # Используем curl для получения данных с xkeen API, затем используем jq для извлечения версии и удаления префикса "v" 4 | version=$(curl -s "$xkeen_api_url" | jq -r '.name' | sed 's/v//') 5 | 6 | # Присваиваем полученную версию переменной xkeen_github_version 7 | xkeen_github_version="$version" 8 | } -------------------------------------------------------------------------------- /_xkeen/01_info/08_info_version/02_version_xray.sh: -------------------------------------------------------------------------------- 1 | # Функция для получения информации о версии Xray 2 | info_version_xray() { 3 | 4 | # Проверяем, установлен ли Xray 5 | if [ "$xray_installed" = "installed" ]; then 6 | # Если Xray установлен, получаем текущую версию 7 | xray_current_version=$("$install_dir/xray" -version 2>&1 | grep -o -E 'Xray [0-9]+\.[0-9]+\.[0-9]+' | cut -d ' ' -f 2) 8 | fi 9 | 10 | # Получаем версию Xray из удаленного источника (предположительно API) 11 | xray_github_version=$(curl -s "$xray_api_url" | jq -r '.tag_name' | sed 's/v//') 12 | } 13 | -------------------------------------------------------------------------------- /_xkeen/01_info/09_info_compare/00_compare_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей сравнения версий 2 | 3 | # Модули сравнения версий 4 | . "$xinfo_dir/09_info_compare/01_compare_xkeen.sh" 5 | . "$xinfo_dir/09_info_compare/02_compare_xray.sh" -------------------------------------------------------------------------------- /_xkeen/01_info/09_info_compare/01_compare_xkeen.sh: -------------------------------------------------------------------------------- 1 | # Функция для сравнения версий Xkeen и сохранения результата в переменной 2 | info_compare_xkeen() { 3 | # Сравниваем текущую версию Xkeen с версией из GitHub 4 | if [ "$xkeen_current_version" = "$xkeen_github_version" ]; then 5 | info_compare_xkeen="actual" # Если версии совпадают, Xkeen актуален 6 | 7 | elif [ "$xkeen_current_version" \< "$xkeen_github_version" ]; then 8 | info_compare_xkeen="update" # Если текущая версия меньше версии из GitHub, требуется обновление 9 | else 10 | info_compare_xkeen="not_release" # Если версия из GitHub меньше текущей версии (не выпущена), Xkeen не выпущен 11 | fi 12 | } 13 | -------------------------------------------------------------------------------- /_xkeen/01_info/09_info_compare/02_compare_xray.sh: -------------------------------------------------------------------------------- 1 | # Функция для сравнения версий Xray и определения статуса 2 | info_compare_xray() { 3 | # Проверяем, установлен ли Xray 4 | if [ -z "$xray_current_version" ]; then 5 | info_compare_xray="not_installed" # Если Xray не установлен, статус - не установлен 6 | 7 | else 8 | # Сравниваем текущую версию Xray с версией из GitHub 9 | if [ "$xray_current_version" = "$xray_github_version" ]; then 10 | info_compare_xray="actual" # Если версии совпадают, Xray актуален 11 | 12 | elif [ "$xray_current_version" \< "$xray_github_version" ]; then 13 | info_compare_xray="update" # Если текущая версия меньше версии из GitHub, требуется обновление 14 | 15 | else 16 | info_compare_xray="not_release" # Если версия из GitHub меньше текущей версии (не выпущена), Xray не выпущен 17 | fi 18 | fi 19 | } 20 | -------------------------------------------------------------------------------- /_xkeen/01_info/_variable_help.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Определение цветов для вывода в терминал 4 | GREEN="\033[32m" # Зеленый 5 | RED="\033[31m" # Красный 6 | YELLOW="\033[33m" # Желтый 7 | DARK_GRAY="\e[90m" # Темно-серый 8 | RESET="\033[0m" # Сброс цветов 9 | 10 | # Определение директорий 11 | TMP_DIR="/opt/tmp/xkeen" # Временная директория 12 | XKEEN_LOG_DIR="/opt/var/log/xkeen" # Директория логов для xkeen 13 | XRAY_LOG_DIR="/opt/var/log/xray" # Директория логов для xray 14 | INITD_DIR="/opt/etc/init.d" # Директория init.d 15 | PID_DIR="/opt/var/run" # Директория для PID файлов 16 | BACKUPS_DIR="/opt/backups" # Директория для бекапов 17 | INSTALL_DIR="/opt/sbin" # Директория установки 18 | GEO_DIR="/opt/etc/xray/dat" # Директория для Geo баз 19 | CRON_DIR="/opt/vat/spool/cron/crontabs" # Директория для cron файла xkeen 20 | 21 | # Определение URL API 22 | XRAY_API_URL="https://api.github.com/repos/yichya/openwrt-xray/releases/latest" # URL API для Xray 23 | XKEEN_API_URL="https://api.github.com/repos/skrill/xreen/releases/latest" # URL API для Xkeen 24 | 25 | # Переменные для лог файлов 26 | XKEEN_INFO_LOG="$XKEEN_LOG_DIR/info.log" # Лог файл информации 27 | XKEEN_ERROR_LOG="$XKEEN_LOG_DIR/error.log" # Лог файл ошибок 28 | 29 | 30 | #Переменные CPU 31 | generated_keyword #Архитектура и модель через «_» 32 | info_architecture #Архитектур 33 | info_model #Модель 34 | 35 | #Переменные cron 36 | INFO_UPDATE_XRAY_CRON #Проверка установлена ли задача автоматического обновления Xray 37 | INFO_UPDATE_XKEEN_CRON #Проверка установлена ли задача автоматического обновления Xkeen 38 | INFO_UPDATE_GEOIP_CRON #Проверка установки задачи автоматического обновления GeoIP 39 | INFO_UPDATE_GEODATA_CRON #Проверка установки задачи автоматического обновления GeoData 40 | 41 | #Переменные установки Geo 42 | GEO_EXISTS_GEODATA_ANTIZAPRET #Проверка установки базы GeoData AntiZapret 43 | GEO_EXISTS_GEODATA_ANTIFILTER #Проверка установки базы GeoData AntiFilter 44 | GEO_EXISTS_GEODATA_V2RAY #Проверка установки базы GeoData v2ray 45 | GEO_EXISTS_GEOIP_ANTIFILTER #Проверка установки базы GeoData AntiFilter 46 | GEO_EXISTS_GEOIP_V2RAY #Проверка установки базы GeoIP v2ray 47 | 48 | #Переменные установки пакетов 49 | INFO_PACKAGES_LSCPU #Проверка пакета lscpu 50 | INFO_PACKAGES_CURL #Проверка пакета curl 51 | INFO_PACKAGES_JQ #Проверка пакета jq 52 | INFO_PACKAGES_LIBC #Проверка пакета libc 53 | 54 | #Проверка Xray 55 | XRAY_INSTALLED #Проверка установки Xray 56 | XRAY_CURRENT_VERSION #Проверка текущей версии Xray 57 | XRAY_GITHUB_VERSION #Проверка GitHub версии Xray 58 | 59 | #Проверка Xkeen 60 | XKEEN_CURRENT_VERSION #Проверка текущей версии Xkeen 61 | XKEEN_GITHUB_VERSION #Проверка GitHub версии Xkeen 62 | 63 | INFO_COMPARE_XRAY #Проверка нужно ли обновление Xray 64 | INFO_COMPARE_XKEEN #Проверка нужно ли обновление Xkeen 65 | 66 | #Выборы пользователя GeoIP 67 | chose_geodata_v2fly_select #Нужно ли установить GeoData v2fly 68 | chose_geodata_antifilter_select #Нужно ли установить GeoData AntiFilter 69 | chose_geodata_antizapret_select #Нужно ли установить GeoData AntiZapret 70 | 71 | chose_delete_geodata_v2fly_select #Нужно ли удалить GeoData v2fly 72 | chose_delete_geodata_antifilter_select #Нужно ли удалить GeoData AntiFilter 73 | chose_delete_geodata_antizapret_select #Нужно ли удалить GeoData AntiZapret 74 | 75 | #Выборы пользователя GeoData 76 | chose_geoip_antifilter_select #Нужно ли установить GeoData AntiFilter 77 | chose_geoip_v2fly_select #Нужно ли установить GeoData v2fly 78 | 79 | chose_delete_geoip_antifilter_select #Нужно ли удалить GeoData AntiFilter 80 | chose_delete_geoip_v2fly_select #Нужно ли удалить GeoData v2fly 81 | 82 | #Выборы пользователя Cron 83 | chose_xkeen_cron_select #Нужно ли включить автоматическое обновление Xkeen 84 | chose_xray_cron_select #Нужно ли включить автоматическое обновление Xray 85 | chose_geodata_cron_select #Нужно ли включить автоматическое обновление GeoData 86 | chose_geoip_cron_select #Нужно ли включить автоматическое обновление GeoIP 87 | 88 | chose_all_cron_select #Нужно ли удалить все задачи cron 89 | 90 | #Выборы пользователя для времени cron 91 | chose_xkeen_cron_time #Время Xkeen 92 | chose_xray_cron_time #Время Xray 93 | chose_geodata_cron_time #Время GeoData 94 | chose_geoip_cron_time #Время GeoIP 95 | 96 | # -------------------------------------------------------------------------------- /_xkeen/02_install/00_install_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей установки 2 | 3 | # Модули установки 4 | . "$xinstall_dir/01_install_packages.sh" 5 | . "$xinstall_dir/02_install_xray.sh" 6 | . "$xinstall_dir/03_install_xkeen.sh" 7 | . "$xinstall_dir/04_install_geosite.sh" 8 | . "$xinstall_dir/05_install_geoip.sh" 9 | . "$xinstall_dir/06_install_cron.sh" 10 | 11 | . "$xinstall_dir/07_install_register/00_register_import.sh" 12 | . "$xinstall_dir/08_install_configs/00_configs_import.sh" -------------------------------------------------------------------------------- /_xkeen/02_install/01_install_packages.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки необходимых пакетов 2 | install_packages() { 3 | local package_status="$1" 4 | local package_name="$2" 5 | 6 | # Проверяем, нужно ли устанавливать пакет 7 | if [ "$package_status" = "not_installed" ]; then 8 | # Устанавливаем пакет с использованием opkg 9 | opkg install "$package_name" &>/dev/null 10 | 11 | # Проверяем код завершения установки 12 | if [ $? -eq 0 ]; then 13 | # Если установка прошла успешно, обновляем статус 14 | package_status="installed_xkeen" 15 | fi 16 | fi 17 | } 18 | 19 | # Пример использования для конкретных пакетов 20 | install_packages "$info_packages_curl" "curl" 21 | install_packages "$info_packages_jq" "jq" 22 | install_packages "$info_packages_libc" "libc" 23 | install_packages "$info_packages_libssp" "libssp" 24 | install_packages "$info_packages_librt" "librt" 25 | install_packages "$info_packages_libpthread" "libpthread" 26 | 27 | install_packages "$info_packages_cabundle" "ca-bundle" 28 | info_packages_cabundle="$package_status" 29 | install_packages "$info_packages_uname" "coreutils-uname" 30 | info_packages_uname="$package_status" 31 | -------------------------------------------------------------------------------- /_xkeen/02_install/02_install_xray.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки Xray 2 | install_xray() { 3 | xray_archive="$tmp_dir/xray.zip" 4 | info_content="" 5 | error_content="" 6 | 7 | if [ -f "$xray_archive" ]; then 8 | info_content="[info] Архив xray найден\n" 9 | 10 | if [ -f "/opt/sbin/xray" ]; then 11 | backup_xray 12 | fi 13 | 14 | unzip -q "$xray_archive" -d "$tmp_dir/xray" 15 | if [ $? -eq 0 ]; then 16 | info_content="${info_content}[info] Распаковка архива xray выполнена\n" 17 | 18 | mv "$tmp_dir/xray/xray" /opt/sbin/ 19 | if [ $? -eq 0 ]; then 20 | info_content="${info_content}[info] Xray успешно установлен в /opt/sbin/\n" 21 | chmod +x /opt/sbin/xray 22 | if [ $? -eq 0 ]; then 23 | info_content="${info_content}[info] Установлены исполняемые права для Xray\n" 24 | else 25 | error_content="${error_content}[error] Ошибка при установке исполняемых прав для Xray\n" 26 | fi 27 | else 28 | error_content="${error_content}[error] Ошибка при перемещении Xray\n" 29 | fi 30 | else 31 | error_content="${error_content}[error] Ошибка при распаковке архива xray\n" 32 | fi 33 | 34 | rm "$xray_archive" 35 | if [ $? -eq 0 ]; then 36 | info_content="${info_content}[info] Архив xray удален\n" 37 | else 38 | error_content="${error_content}[error] Ошибка при удалении архива xray\n" 39 | fi 40 | 41 | # Удаляем временные файлы 42 | rm -rf "$tmp_dir/xray" 43 | if [ $? -eq 0 ]; then 44 | info_content="${info_content}[info] Временные файлы удалены\n" 45 | else 46 | error_content="${error_content}[error] Ошибка при удалении временных файлов\n" 47 | fi 48 | 49 | else 50 | error_content="[error] Архив xray не найден\n" 51 | fi 52 | 53 | if [ -n "$info_content" ]; then 54 | echo -e "$info_content" >> "$xkeen_info_log" 55 | fi 56 | 57 | if [ -n "$error_content" ]; then 58 | echo -e "$error_content" >> "$xkeen_error_log" 59 | fi 60 | } 61 | -------------------------------------------------------------------------------- /_xkeen/02_install/03_install_xkeen.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки Xkeen 2 | install_xkeen() { 3 | # Путь к архиву с утилитой 4 | xkeen_archive="$tmp_dir/xkeen.tar" 5 | 6 | local info_content="" 7 | local error_content="" 8 | 9 | if [ -f "$xkeen_archive" ]; then 10 | info_content="\t[info] Архив xkeen найден\n" 11 | else 12 | error_content="\t[error] Архив xkeen не найден\n" 13 | fi 14 | 15 | # Временный скрипт для установки 16 | install_script=$(mktemp) 17 | cat < "$install_script" 18 | #!/bin/sh 19 | 20 | # Распаковка архива 21 | tar xf "$xkeen_archive" -C "$install_dir" xkeen _xkeen 22 | 23 | # Проверка наличия _xkeen в install_dir 24 | if [ -d "$install_dir/_xkeen" ]; then 25 | # Удаление текущей .xkeen и переименование _xkeen 26 | rm -rf "$install_dir/.xkeen" 27 | mv "$install_dir/_xkeen" "$install_dir/.xkeen" 28 | echo " Установка xkeen завершена." 29 | else 30 | echo " Ошибка: _xkeen не была правильно перенесена." 31 | fi 32 | 33 | # Удаление архива 34 | rm "$xkeen_archive" 35 | EOF 36 | 37 | chmod +x "$install_script" 38 | "$install_script" 39 | if [ $? -eq 0 ]; then 40 | info_content="${info_content}\t[info] Установка xkeen успешно завершена" 41 | else 42 | error_content="${error_content}\t[error] Ошибка при установке xkeen" 43 | fi 44 | rm "$install_script" 45 | 46 | if [ -n "$error_content" ]; then 47 | echo "" >> "$xkeen_error_log" 48 | echo "[start] Установка xkeen" >> "$xkeen_error_log" 49 | echo -e "$error_content" >> "$xkeen_error_log" 50 | echo "[end] Установка xkeen выполнена" >> "$xkeen_error_log" 51 | echo "" >> "$xkeen_error_log" 52 | fi 53 | 54 | if [ -n "$info_content" ]; then 55 | echo "" >> "$xkeen_info_log" 56 | echo "[start] Установка xkeen" >> "$xkeen_info_log" 57 | echo -e "$info_content" >> "$xkeen_info_log" 58 | echo "[end] Установка xkeen выполнена" >> "$xkeen_info_log" 59 | echo "" >> "$xkeen_info_log" 60 | fi 61 | } 62 | -------------------------------------------------------------------------------- /_xkeen/02_install/04_install_geodata.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки и обновления GeoData 2 | install_geodata() { 3 | # Установка GeoData V2Fly 4 | if [ "$install_v2fly_geodata" = true ]; then 5 | curl -L -o "$geo_dir/geodata_v2fly.dat" "https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat" > /dev/null 2>&1 6 | if [ $? -eq 0 ] && [ -s "$geo_dir/geodata_v2fly.dat" ]; then 7 | echo -e " GeoData V2Fly ${green}успешно установлен${reset}" 8 | else 9 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoData V2Fly" 10 | fi 11 | fi 12 | 13 | # Установка GeoData AntiFilter 14 | if [ "$install_antifilter_geodata" = true ]; then 15 | curl -L -o "$geo_dir/geodata_antifilter.dat" "https://github.com/schebotar/antifilter/releases/latest/download/antifilter.dat" > /dev/null 2>&1 16 | if [ $? -eq 0 ] && [ -s "$geo_dir/geodata_antifilter.dat" ]; then 17 | echo -e " GeoData AntiFilter ${green}успешно установлен${reset}" 18 | else 19 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoData AntiFilter" 20 | fi 21 | fi 22 | 23 | # Установка GeoData AntiZapret 24 | if [ "$install_antizapret_geodata" = true ]; then 25 | curl -L -o "$geo_dir/geodata_antizapret.dat" "https://github.com/warexify/antizapret-xray/releases/latest/download/antizapret.dat" > /dev/null 2>&1 26 | if [ $? -eq 0 ] && [ -s "$geo_dir/geodata_antizapret.dat" ]; then 27 | echo -e " GeoData AntiZapret ${green}успешно установлен${reset}" 28 | else 29 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoData AntiZapret" 30 | fi 31 | fi 32 | 33 | # Обновление GeoData V2Fly, если установлены и требуется обновление 34 | if [ "$update_v2fly_geodata" = true ] && [ -f "$geo_dir/geodata_v2fly.dat" ]; then 35 | curl -L -o "$geo_dir/geodata_v2fly.dat" "https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat" > /dev/null 2>&1 36 | if [ $? -eq 0 ] && [ -s "$geo_dir/geodata_v2fly.dat" ]; then 37 | echo -e " GeoData V2Fly ${green}успешно обновлен${reset}" 38 | else 39 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoData V2Fly" 40 | fi 41 | fi 42 | 43 | # Обновление GeoData AntiFilter, если установлены и требуется обновление 44 | if [ "$update_antifilter_geodata" = true ] && [ -f "$geo_dir/geodata_antifilter.dat" ]; then 45 | curl -L -o "$geo_dir/geodata_antifilter.dat" "https://github.com/schebotar/antifilter/releases/latest/download/antifilter.dat" > /dev/null 2>&1 46 | if [ $? -eq 0 ] && [ -s "$geo_dir/geodata_antifilter.dat" ]; then 47 | echo -e " GeoData AntiFilter ${green}успешно обновлен${reset}" 48 | else 49 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoData AntiFilter" 50 | fi 51 | fi 52 | 53 | # Обновление GeoData AntiZapret, если установлены и требуется обновление 54 | if [ "$update_antizapret_geodata" = true ] && [ -f "$geo_dir/geodata_antizapret.dat" ]; then 55 | curl -L -o "$geo_dir/geodata_antizapret.dat" "https://github.com/warexify/antizapret-xray/releases/latest/download/antizapret.dat" > /dev/null 2>&1 56 | if [ $? -eq 0 ] && [ -s "$geo_dir/geodata_antizapret.dat" ]; then 57 | echo -e " GeoData AntiZapret ${green}успешно обновлены${reset}" 58 | else 59 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoData AntiZapret" 60 | fi 61 | fi 62 | } 63 | -------------------------------------------------------------------------------- /_xkeen/02_install/04_install_geosite.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки и обновления GeoSite 2 | install_geosite() { 3 | mkdir -p "$geo_dir" || { echo "Ошибка: Не удалось создать директорию $geo_dir"; exit 1; } 4 | # Установка GeoSite V2Fly 5 | if [ "$install_v2fly_geosite" = true ]; then 6 | curl -L -o "$geo_dir/geosite_v2fly.dat" "https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat" > /dev/null 2>&1 7 | if [ $? -eq 0 ] && [ -s "$geo_dir/geosite_v2fly.dat" ]; then 8 | echo -e " GeoSite V2Fly ${green}успешно установлен${reset}" 9 | else 10 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoSite V2Fly" 11 | fi 12 | fi 13 | 14 | # Установка GeoSite AntiFilter 15 | if [ "$install_antifilter_geosite" = true ]; then 16 | curl -L -o "$geo_dir/geosite_antifilter.dat" "https://github.com/schebotar/antifilter-domain/releases/latest/download/geosite.dat" > /dev/null 2>&1 17 | if [ $? -eq 0 ] && [ -s "$geo_dir/geosite_antifilter.dat" ]; then 18 | echo -e " GeoSite AntiFilter ${green}успешно установлен${reset}" 19 | else 20 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoSite AntiFilter" 21 | fi 22 | fi 23 | 24 | # Установка GeoSite AntiZapret 25 | if [ "$install_antizapret_geosite" = true ]; then 26 | curl -L -o "$geo_dir/geosite_antizapret.dat" "https://github.com/warexify/antizapret-xray/releases/latest/download/antizapret.dat" > /dev/null 2>&1 27 | if [ $? -eq 0 ] && [ -s "$geo_dir/geosite_antizapret.dat" ]; then 28 | echo -e " GeoSite AntiZapret ${green}успешно установлен${reset}" 29 | else 30 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoSite AntiZapret" 31 | fi 32 | fi 33 | 34 | # Обновление GeoSite V2Fly, если установлены и требуется обновление 35 | if [ "$update_v2fly_geosite" = true ] && [ -f "$geo_dir/geosite_v2fly.dat" ]; then 36 | curl -L -o "$geo_dir/geosite_v2fly.dat" "https://github.com/v2fly/domain-list-community/releases/latest/download/dlc.dat" > /dev/null 2>&1 37 | if [ $? -eq 0 ] && [ -s "$geo_dir/geosite_v2fly.dat" ]; then 38 | echo -e " GeoSite V2Fly ${green}успешно обновлен${reset}" 39 | else 40 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoSite V2Fly" 41 | fi 42 | fi 43 | 44 | # Обновление GeoSite AntiFilter, если установлены и требуется обновление 45 | if [ "$update_antifilter_geosite" = true ] && [ -f "$geo_dir/geosite_antifilter.dat" ]; then 46 | curl -L -o "$geo_dir/geosite_antifilter.dat" "https://github.com/schebotar/antifilter-domain/releases/latest/download/geosite.dat" > /dev/null 2>&1 47 | if [ $? -eq 0 ] && [ -s "$geo_dir/geosite_antifilter.dat" ]; then 48 | echo -e " GeoSite AntiFilter ${green}успешно обновлен${reset}" 49 | else 50 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoSite AntiFilter" 51 | fi 52 | fi 53 | 54 | # Обновление GeoSite AntiZapret, если установлены и требуется обновление 55 | if [ "$update_antizapret_geosite" = true ] && [ -f "$geo_dir/geosite_antizapret.dat" ]; then 56 | curl -L -o "$geo_dir/geosite_antizapret.dat" "https://github.com/warexify/antizapret-xray/releases/latest/download/antizapret.dat" > /dev/null 2>&1 57 | if [ $? -eq 0 ] && [ -s "$geo_dir/geosite_antizapret.dat" ]; then 58 | echo -e " GeoSite AntiZapret ${green}успешно обновлены${reset}" 59 | else 60 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoSite AntiZapret" 61 | fi 62 | fi 63 | } 64 | -------------------------------------------------------------------------------- /_xkeen/02_install/05_install_geoip.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки и обновления GeoIP 2 | install_geoip() { 3 | mkdir -p "$geo_dir" || { echo "Ошибка: Не удалось создать директорию $geo_dir"; exit 1; } 4 | # Установка GeoIP AntiFilter 5 | if [ "$install_antifilter_geoip" = true ]; then 6 | curl -L -o "$geo_dir/geoip_antifilter.dat" "https://github.com/schebotar/antifilter/releases/latest/download/geoip.dat" > /dev/null 2>&1 7 | if [ $? -eq 0 ] && [ -s "$geo_dir/geoip_antifilter.dat" ]; then 8 | echo -e " GeoIP AntiFilter ${green}успешно установлен${reset}" 9 | else 10 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoIP AntiFilter" 11 | fi 12 | fi 13 | 14 | # Установка GeoIP V2Fly 15 | if [ "$install_v2fly_geoip" = true ]; then 16 | curl -L -o "$geo_dir/geoip_v2fly.dat" "https://github.com/loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat" > /dev/null 2>&1 17 | if [ $? -eq 0 ] && [ -s "$geo_dir/geoip_v2fly.dat" ]; then 18 | echo -e " GeoIP V2Fly ${green}успешно установлен${reset}" 19 | else 20 | echo -e " ${red}Неизвестная ошибка${reset} при установке GeoIP V2Fly" 21 | fi 22 | fi 23 | 24 | # Обновление GeoIP AntiFilter, если установлены и требуется обновление 25 | if [ "$update_antifilter_geoip" = true ] && [ -f "$geo_dir/geoip_antifilter.dat" ]; then 26 | curl -L -o "$geo_dir/geoip_antifilter.dat" "https://github.com/schebotar/antifilter/releases/latest/download/geoip.dat" > /dev/null 2>&1 27 | if [ $? -eq 0 ] && [ -s "$geo_dir/geoip_antifilter.dat" ]; then 28 | echo -e " GeoIP AntiFilter ${green}успешно обновлен${reset}" 29 | else 30 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoIP AntiFilter" 31 | fi 32 | fi 33 | 34 | # Обновление GeoIP V2Fly, если установлены и требуется обновление 35 | if [ "$update_v2fly_geoip" = true ] && [ -f "$geo_dir/geoip_v2fly.dat" ]; then 36 | curl -L -o "$geo_dir/geoip_v2fly.dat" "https://github.com/loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat" > /dev/null 2>&1 37 | if [ $? -eq 0 ] && [ -s "$geo_dir/geoip_v2fly.dat" ]; then 38 | echo -e " GeoIP V2Fly ${green}успешно обновлен${reset}" 39 | else 40 | echo -e " ${red}Неизвестная ошибка${reset} при обновлении GeoIP V2Fly" 41 | fi 42 | fi 43 | } 44 | -------------------------------------------------------------------------------- /_xkeen/02_install/06_install_cron.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки задач Cron 2 | install_cron() { 3 | cron_entry="" 4 | 5 | # Создание записей для всех выбранных задач Cron 6 | if [ -n "$chose_all_cron_time" ]; then 7 | cron_entry="$cron_entry\n$chose_all_cron_time $install_dir/xkeen -ugi" 8 | cron_entry="$cron_entry\n$chose_all_cron_time $install_dir/xkeen -ugs" 9 | cron_entry="$cron_entry\n$chose_all_cron_time $install_dir/xkeen -uk" 10 | cron_entry="$cron_entry\n$chose_all_cron_time $install_dir/xkeen -ux" 11 | fi 12 | 13 | # Добавление задачи Cron для обновления GeoIP 14 | if [ -n "$chose_geoip_cron_time" ]; then 15 | cron_entry="$cron_entry\n$chose_geoip_cron_time $install_dir/xkeen -ugi" 16 | fi 17 | 18 | # Добавление задачи Cron для обновления GeoSite 19 | if [ -n "$chose_geosite_cron_time" ]; then 20 | cron_entry="$cron_entry\n$chose_geosite_cron_time $install_dir/xkeen -ugs" 21 | fi 22 | 23 | # Добавление задачи Cron для обновления Xkeen 24 | if [ -n "$chose_xkeen_cron_time" ]; then 25 | cron_entry="$cron_entry\n$chose_xkeen_cron_time $install_dir/xkeen -uk" 26 | fi 27 | 28 | # Добавление задачи Cron для обновления Xray 29 | if [ -n "$chose_xray_cron_time" ]; then 30 | cron_entry="$cron_entry\n$chose_xray_cron_time $install_dir/xkeen -ux" 31 | fi 32 | 33 | # Если есть записи для задач Cron, то сохраняем их 34 | if [ -n "$cron_entry" ]; then 35 | cron_file_path="$cron_dir/$cron_file" 36 | 37 | # Удаляем существующие записи, если выбрано перезаписать или удалить 38 | if [ -n "$chose_all_cron_select" ] || [ -n "$chose_delete_all_cron_select" ]; then 39 | sed -i "/$install_dir\/xkeen.*-ugi/d" "$cron_file_path" 2>/dev/null 40 | sed -i "/$install_dir\/xkeen.*-ugs/d" "$cron_file_path" 2>/dev/null 41 | sed -i "/$install_dir\/xkeen.*-uk/d" "$cron_file_path" 2>/dev/null 42 | sed -i "/$install_dir\/xkeen.*-ux/d" "$cron_file_path" 2>/dev/null 43 | fi 44 | 45 | touch "$cron_file_path" 46 | chmod +x "$cron_file_path" 47 | echo -e "$cron_entry" >> "$cron_file_path" 48 | fi 49 | } 50 | -------------------------------------------------------------------------------- /_xkeen/02_install/07_install_register/00_register_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей регистраций 2 | 3 | # Модули регистрации 4 | . "$xinstall_dir/07_install_register/01_register_xray.sh" 5 | . "$xinstall_dir/07_install_register/02_register_xkeen.sh" 6 | . "$xinstall_dir/07_install_register/03_register_cron.sh" -------------------------------------------------------------------------------- /_xkeen/02_install/07_install_register/01_register_xray.sh: -------------------------------------------------------------------------------- 1 | # Регистрация xray 2 | 3 | register_xray_control() { 4 | 5 | # Создание файла xray.control 6 | cat << EOF > "$register_dir/xray.control" 7 | Package: xray 8 | Version: $xray_current_version 9 | Depends: libc, libssp, librt, libpthread, ca-bundle 10 | Source: XTLS Team 11 | SourceName: xray 12 | Section: net 13 | SourceDateEpoch: $source_date_epoch 14 | Maintainer: Skrill 15 | Architecture: $status_architecture 16 | Installed-Size: $installed_size 17 | Description: A unified platform for anti-censorship. 18 | EOF 19 | } 20 | 21 | # Определение функции register_xray_list 22 | register_xray_list() { 23 | 24 | # Переход в папку REGISTER_DIR 25 | cd "$register_dir/" || exit 26 | 27 | # Создание файла xray.list или перезапись, если файл уже существует 28 | cat > xray.list << EOF 29 | /opt/sbin/xray 30 | /opt/etc/xray/dat/geosite_antifilter.dat 31 | /opt/etc/xray/dat/geosite_antizapret.dat 32 | /opt/etc/xray/dat/geosite_v2fly.dat 33 | /opt/etc/xray/dat/geoip_antifilter.dat 34 | /opt/etc/xray/dat/geoip_v2fly.dat 35 | /opt/etc/xray/dat 36 | /opt/etc/xray/configs/01_log.json 37 | /opt/etc/xray/configs/02_stats.json 38 | /opt/etc/xray/configs/03_dns.json 39 | /opt/etc/xray/configs/04_reverse.json 40 | /opt/etc/xray/configs/05_fake-dns.json 41 | /opt/etc/xray/configs/06_transport.json 42 | /opt/etc/xray/configs/07_inbounds.json 43 | /opt/etc/xray/configs/08_outbounds.json 44 | /opt/etc/xray/configs/09_policy.json 45 | /opt/etc/xray/configs/10_routing.json 46 | /opt/etc/xray/configs/11_fallbacks.json 47 | /opt/etc/xray/configs 48 | /opt/etc/xray 49 | /opt/etc/init.d/S24xray 50 | /opt/var/log/xray/error.log 51 | /opt/var/log/xray/access.log 52 | /opt/var/log/xray 53 | /opt/var/run/xray.pid 54 | EOF 55 | 56 | } 57 | 58 | register_xray_status() { 59 | # Генерация хэш-сумм для .json файлов 60 | HASH_01_log=$(sha256sum "$install_conf_dir/01_log.json" | awk '{print $1}') 61 | HASH_02_stats=$(sha256sum "$install_conf_dir/02_stats.json" | awk '{print $1}') 62 | HASH_03_dns=$(sha256sum "$install_conf_dir/03_dns.json" | awk '{print $1}') 63 | HASH_04_reverse=$(sha256sum "$install_conf_dir/04_reverse.json" | awk '{print $1}') 64 | HASH_05_fake_dns=$(sha256sum "$install_conf_dir/05_fake-dns.json" | awk '{print $1}') 65 | HASH_06_transport=$(sha256sum "$install_conf_dir/06_transport.json" | awk '{print $1}') 66 | HASH_07_inbounds=$(sha256sum "$install_conf_dir/07_inbounds.json" | awk '{print $1}') 67 | HASH_08_outbounds=$(sha256sum "$install_conf_dir/08_outbounds.json" | awk '{print $1}') 68 | HASH_09_policy=$(sha256sum "$install_conf_dir/09_policy.json" | awk '{print $1}') 69 | HASH_10_routing=$(sha256sum "$install_conf_dir/10_routing.json" | awk '{print $1}') 70 | HASH_11_fallbacks=$(sha256sum "$install_conf_dir/11_fallbacks.json" | awk '{print $1}') 71 | 72 | # Генерация новой записи 73 | new_entry=" 74 | 75 | Package: xray 76 | Version: $xray_current_version 77 | Depends: libc, libssp, librt, libpthread, ca-bundle 78 | Status: install user installed 79 | Architecture: $status_architecture 80 | Conffiles: 81 | /opt/etc/xray/configs/01_log.json $HASH_01_log 82 | /opt/etc/xray/configs/02_stats.json $HASH_02_stats 83 | /opt/etc/xray/configs/03_dns.json $HASH_03_dns 84 | /opt/etc/xray/configs/04_reverse.json $HASH_04_reverse 85 | /opt/etc/xray/configs/05_fake-dns.json $HASH_05_fake_dns 86 | /opt/etc/xray/configs/06_transport.json $HASH_06_transport 87 | /opt/etc/xray/configs/07_inbounds.json $HASH_07_inbounds 88 | /opt/etc/xray/configs/08_outbounds.json $HASH_08_outbounds 89 | /opt/etc/xray/configs/09_policy.json $HASH_09_policy 90 | /opt/etc/xray/configs/10_routing.json $HASH_10_routing 91 | /opt/etc/xray/configs/11_fallbacks.json $HASH_11_fallbacks 92 | Installed-Time: $(date +%s)" 93 | 94 | # Чтение существующего содержимого файла "status" 95 | existing_content=$(cat "$status_file") 96 | 97 | # Объединение существующего содержимого и новой записи 98 | new_content="$existing_content$new_entry" 99 | 100 | # Запись измененного содержимого обратно в файл "status" 101 | echo "$new_content" > "$status_file" 102 | } 103 | 104 | # Функция для создания или обновления инициализационного скрипта для Xray 105 | register_xray_initd() { 106 | local initd_file="$initd_dir/S24xray" 107 | local s24xray_filename="${current_datetime}_S24xray" 108 | 109 | # Проверяем наличие файла S24xray 110 | if [ -e "$initd_file" ]; then 111 | local current_content="$(cat "$initd_file")" 112 | local script_version=$(grep 'version=' "$initd_file" | grep -o '[0-9.]\+') 113 | 114 | if [ "$script_version" != "0.5" ]; then 115 | local backup_path="$backups_dir/$s24xray_filename" 116 | 117 | # Перемещаем файл в каталог резервных копий с новым именем 118 | mv "$initd_file" "$backup_path" 119 | 120 | echo -e " Ваш файл «${green}S24xray${reset}» перемещен в каталог резервных копий «${yellow}$backup_path${reset}»" 121 | fi 122 | fi 123 | 124 | local script_content='#!/bin/sh 125 | ### Начало информации о службе 126 | # Краткое-описание: Запуск / Остановка Xray 127 | # version="0.5" # Версия скрипта 128 | ### Конец информации о службе 129 | 130 | green="\033[32m" 131 | red="\033[31m" 132 | yellow="\033[33m" 133 | reset="\033[0m" 134 | 135 | xkeen_info_log="/opt/var/log/xkeen/info.log" 136 | xkeen_error_log="/opt/var/log/xkeen/error.log" 137 | 138 | path=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin 139 | xray_path=xray 140 | xray_config=/opt/etc/xray/configs 141 | app_name=Xkeen 142 | 143 | export XRAY_LOCATION_ASSET=/opt/etc/xray/dat/ 144 | 145 | # Функция для ведения журнала в роутере 146 | log_notice_init(){ 147 | local header=${app_name} 148 | logger -p notice -t "${header}" "${1}" 149 | } 150 | 151 | log_error_init(){ 152 | local header=${app_name} 153 | logger -p error -t "${header}" "${1}" 154 | } 155 | 156 | # Функция для проверки статуса xray 157 | xray_status() 158 | { 159 | if pgrep -f "$xray_path run -confdir $xray_config" > /dev/null; then 160 | return 0 # Процесс существует и работает 161 | else 162 | return 1 # Процесс не существует 163 | fi 164 | } 165 | 166 | # Функция для запуска xray | Особая благодарность jameszero 167 | start() 168 | { 169 | log_notice_init "Инициирован запуск Xray" 170 | 171 | max_retries=3 # Максимальное количество попыток запуска 172 | retries=0 173 | 174 | while [ $retries -lt $max_retries ]; do 175 | if xray_status; then 176 | echo -e " Xray уже ${green}запущен${reset}" 177 | log_notice_init "Не удалось запустить Xray, так как он уже запущен" 178 | 179 | echo "" >> "$xkeen_error_log" 180 | echo "[start] Проверка статуса Xray" >> "$xkeen_error_log" 181 | echo " [error] Xray уже запущен" >> "$xkeen_error_log" 182 | echo "[end] Проверка статуса Xray выполнена" >> "$xkeen_error_log" 183 | echo "" >> "$xkeen_error_log" 184 | return 0 # Прерываем цикл, так как Xray уже запущен 185 | else 186 | $xray_path run -confdir $xray_config & 187 | sleep 10 188 | 189 | if xray_status; then 190 | echo -e " Xray ${green}запущен${reset}" 191 | log_notice_init "Xray запущен" 192 | 193 | echo "" >> "$xkeen_info_log" 194 | echo "[end] Проверка статуса Xray" >> "$xkeen_info_log" 195 | echo " [info] Xray запущен" >> "$xkeen_info_log" 196 | echo "[end] Проверка статуса Xray выполнена" >> "$xkeen_info_log" 197 | echo "" >> "$xkeen_info_log" 198 | return 0 # Прерываем цикл, так как Xray успешно запущен 199 | else 200 | retries=$((retries + 1)) 201 | echo -e " Попытка повторного запуска Xray: $retries из $max_retries" 202 | log_notice_init "Попытка повторного запуска Xray: $retries из $max_retries" 203 | sleep 10 204 | fi 205 | fi 206 | done 207 | 208 | # Если достигнуто максимальное количество попыток и Xray не запущен, выводим ошибку 209 | echo -e " Не удалось запустить Xray после $max_retries попыток" 210 | log_error_init "Не удалось запустить Xray после $max_retries попыток" 211 | 212 | echo "" >> "$xkeen_error_log" 213 | echo "[start] Проверка статуса Xray" >> "$xkeen_error_log" 214 | echo " [error] Не удалось запустить Xray после $max_retries попыток" >> "$xkeen_error_log" 215 | echo "[end] Проверка статуса Xray выполнена" >> "$xkeen_error_log" 216 | echo "" >> "$xkeen_error_log" 217 | } 218 | 219 | # Функция для остановки xray 220 | stop() 221 | { 222 | log_notice_init "Инициирована остановка Xray" 223 | if xray_status; then 224 | killall -q -9 "$xray_path" 225 | echo -e " Xray ${yellow}остановлен${reset}" 226 | log_notice_init "Xray остановлен" 227 | 228 | echo "" >> "$xkeen_info_log" 229 | echo "[start] Проверка статуса Xray" >> "$xkeen_info_log" 230 | echo " [info] Xray остановлен" >> "$xkeen_info_log" 231 | echo "[end] Проверка статуса Xray выполнена" >> "$xkeen_info_log" 232 | echo "" >> "$xkeen_info_log" 233 | else 234 | echo -e " Xray ${red}не запущен${reset}" 235 | log_error_init "Остановка Xray не удалась. Xray не был запущен" 236 | 237 | echo "" >> "$xkeen_error_log" 238 | echo "[start] Проверка статуса Xray" >> "$xkeen_error_log" 239 | echo " [error] Xray не был запущен" >> "$xkeen_error_log" 240 | echo "[end] Проверка статуса Xray выполнена" >> "$xkeen_error_log" 241 | echo "" >> "$xkeen_error_log" 242 | fi 243 | } 244 | 245 | # Обработка аргументов командной строки 246 | case "$1" in 247 | start) 248 | start 249 | ;; 250 | stop) 251 | stop 252 | ;; 253 | status) 254 | if xray_status; then 255 | echo -e " Xray ${green}запущен${reset}" 256 | 257 | echo "" >> "$xkeen_info_log" 258 | echo "[start] Проверка статуса Xray" >> "$xkeen_info_log" 259 | echo " [info] Xray запущен" >> "$xkeen_info_log" 260 | echo "[end] Проверка статуса Xray выполнена" >> "$xkeen_info_log" 261 | echo "" >> "$xkeen_info_log" 262 | else 263 | echo -e " Xray ${red}не запущен${reset}" 264 | 265 | echo "" >> "$xkeen_info_log" 266 | echo "[start] Проверка статуса Xray" >> "$xkeen_info_log" 267 | echo " [info] Xray не запущен" >> "$xkeen_info_log" 268 | echo "[end] Проверка статуса Xray выполнена" >> "$xkeen_info_log" 269 | echo "" >> "$xkeen_info_log" 270 | fi 271 | ;; 272 | restart) 273 | stop > /dev/null 2>&1 274 | start > /dev/null 2>&1 275 | echo -e " Xray ${green}перезапущен${reset}" 276 | ;; 277 | *) 278 | echo -e " Команды: ${green}start${reset} | ${red}stop${reset} | ${yellow}restart${reset} | status" 279 | ;; 280 | esac 281 | 282 | exit 0 283 | ' 284 | 285 | # Создание или замена файла 286 | if [ -e "$initd_file" ]; then 287 | rm "$initd_file" 288 | fi 289 | 290 | echo "$script_content" > "$initd_file" 291 | chmod +x "$initd_file" 292 | } 293 | -------------------------------------------------------------------------------- /_xkeen/02_install/07_install_register/02_register_xkeen.sh: -------------------------------------------------------------------------------- 1 | # Регистрация xkeen 2 | 3 | # Функция для создания файла xkeen.control 4 | register_xkeen_control() { 5 | # Создание файла xkeen.control 6 | cat << EOF > "$register_dir/xkeen.control" 7 | Package: xkeen 8 | Version: $xkeen_current_version 9 | Depends: jq, curl, lscpu, coreutils-uname 10 | Source: Skrill 11 | SourceName: xkeen 12 | Section: net 13 | SourceDateEpoch: $source_date_epoch 14 | Maintainer: Skrill 15 | Architecture: $status_architecture 16 | Installed-Size: $installed_size 17 | Description: The platform that makes Xray work. 18 | EOF 19 | } 20 | 21 | 22 | register_xkeen_list() { 23 | cd "$register_dir/" || exit 24 | 25 | touch xkeen.list 26 | cat >> xkeen.list << EOF 27 | /opt/sbin/xkeen 28 | 29 | /opt/sbin/.xkeen/import.sh 30 | /opt/sbin/.xkeen/author.sh 31 | 32 | /opt/sbin/.xkeen/01_info/00_info_import.sh 33 | /opt/sbin/.xkeen/01_info/01_info_variable.sh 34 | /opt/sbin/.xkeen/01_info/02_info_packages.sh 35 | /opt/sbin/.xkeen/01_info/03_info_cpu.sh 36 | /opt/sbin/.xkeen/01_info/04_info_xray.sh 37 | /opt/sbin/.xkeen/01_info/05_info_geosite.sh 38 | /opt/sbin/.xkeen/01_info/06_info_geoip.sh 39 | /opt/sbin/.xkeen/01_info/07_info_cron.sh 40 | 41 | /opt/sbin/.xkeen/01_info/08_info_version/00_version_import.sh 42 | /opt/sbin/.xkeen/01_info/08_info_version/01_version_xkeen.sh 43 | /opt/sbin/.xkeen/01_info/08_info_version/02_version_xray.sh 44 | /opt/sbin/.xkeen/01_info/08_info_version 45 | 46 | /opt/sbin/.xkeen/01_info/09_info_compare/00_compare_import.sh 47 | /opt/sbin/.xkeen/01_info/09_info_compare/01_compare_xkeen.sh 48 | /opt/sbin/.xkeen/01_info/09_info_compare/02_compare_xray.sh 49 | /opt/sbin/.xkeen/01_info/09_info_compare 50 | 51 | /opt/sbin/.xkeen/01_info 52 | 53 | /opt/sbin/.xkeen/02_install/00_install_import.sh 54 | /opt/sbin/.xkeen/02_install/01_install_packages.sh 55 | /opt/sbin/.xkeen/02_install/02_install_xray.sh 56 | /opt/sbin/.xkeen/02_install/03_install_xkeen.sh 57 | /opt/sbin/.xkeen/02_install/04_install_geosite.sh 58 | /opt/sbin/.xkeen/02_install/05_install_geoip.sh 59 | /opt/sbin/.xkeen/02_install/06_install_cron.sh 60 | 61 | /opt/sbin/.xkeen/02_install/07_install_register/00_register_import.sh 62 | /opt/sbin/.xkeen/02_install/07_install_register/01_register_xray.sh 63 | /opt/sbin/.xkeen/02_install/07_install_register/02_register_xkeen.sh 64 | /opt/sbin/.xkeen/02_install/07_install_register/03_register_cron.sh 65 | 66 | /opt/sbin/.xkeen/02_install/08_install_configs/00_configs_import.sh 67 | /opt/sbin/.xkeen/02_install/08_install_configs/01_configs_install.sh 68 | 69 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/01_log.json 70 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/02_stats.json 71 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/03_dns.json 72 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/04_reverse.json 73 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/05_fake-dns.json 74 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/06_transport.json 75 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/07_inbounds.json 76 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/08_outbounds.json 77 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/09_policy.json 78 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/10_routing.json 79 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir/11_fallbacks.json 80 | 81 | /opt/sbin/.xkeen/02_install/07_install_register 82 | /opt/sbin/.xkeen/02_install/08_install_configs/02_configs_dir 83 | /opt/sbin/.xkeen/02_install/08_install_configs 84 | /opt/sbin/.xkeen/02_install 85 | 86 | /opt/sbin/.xkeen/03_delete/00_delete_import.sh 87 | /opt/sbin/.xkeen/03_delete/01_delete_geosite.sh 88 | /opt/sbin/.xkeen/03_delete/02_delete_geoip.sh 89 | /opt/sbin/.xkeen/03_delete/03_delete_cron.sh 90 | /opt/sbin/.xkeen/03_delete/04_delete_configs.sh 91 | /opt/sbin/.xkeen/03_delete/05_delete_register.sh 92 | /opt/sbin/.xkeen/03_delete/06_delete_tmp.sh 93 | /opt/sbin/.xkeen/03_delete 94 | 95 | /opt/sbin/.xkeen/04_tools/01_tools_logs/00_logs_import.sh 96 | /opt/sbin/.xkeen/04_tools/01_tools_logs/01_logs_clear.sh 97 | /opt/sbin/.xkeen/04_tools/01_tools_logs/02_logs_console.sh 98 | /opt/sbin/.xkeen/04_tools/01_tools_logs/03_logs_xkeen.sh 99 | /opt/sbin/.xkeen/04_tools/01_tools_logs 100 | 101 | /opt/sbin/.xkeen/04_tools/02_tools_choose/00_choose_import.sh 102 | /opt/sbin/.xkeen/04_tools/02_tools_choose/01_choose_input.sh 103 | /opt/sbin/.xkeen/04_tools/02_tools_choose/02_choose_geosite.sh 104 | /opt/sbin/.xkeen/04_tools/02_tools_choose/03_choose_geoip.sh 105 | 106 | /opt/sbin/.xkeen/04_tools/02_tools_choose/04_choose_cron/00_cron_import.sh 107 | /opt/sbin/.xkeen/04_tools/02_tools_choose/04_choose_cron/01_cron_status.sh 108 | /opt/sbin/.xkeen/04_tools/02_tools_choose/04_choose_cron/02_cron_time.sh 109 | /opt/sbin/.xkeen/04_tools/02_tools_choose/04_choose_cron 110 | /opt/sbin/.xkeen/04_tools/02_tools_choose 111 | 112 | /opt/sbin/.xkeen/04_tools/03_tools_backups/00_backups_import.sh 113 | /opt/sbin/.xkeen/04_tools/03_tools_backups/01_backups_xray.sh 114 | /opt/sbin/.xkeen/04_tools/03_tools_backups/02_backups_configs.sh 115 | /opt/sbin/.xkeen/04_tools/03_tools_backups/02_backups_xkeen.sh 116 | /opt/sbin/.xkeen/04_tools/03_tools_backups 117 | 118 | /opt/sbin/.xkeen/04_tools/04_tools_downloaders/00_downloaders_import.sh 119 | /opt/sbin/.xkeen/04_tools/04_tools_downloaders/01_downloaders_xray.sh 120 | /opt/sbin/.xkeen/04_tools/04_tools_downloaders/02_donwloaders_xkeen.sh 121 | /opt/sbin/.xkeen/04_tools/04_tools_downloaders 122 | 123 | /opt/sbin/.xkeen/04_tools/00_tools_import.sh 124 | /opt/sbin/.xkeen/04_tools/05_tools_archive.sh 125 | /opt/sbin/.xkeen/04_tools 126 | 127 | /opt/sbin/.xkeen/05_tests/00_tests_import.sh 128 | /opt/sbin/.xkeen/05_tests/01_tests_connected.sh 129 | /opt/sbin/.xkeen/05_tests/02_tests_xports.sh 130 | /opt/sbin/.xkeen/05_tests 131 | 132 | /opt/sbin/.xkeen 133 | 134 | /opt/var/log/xkeen/error.log 135 | /opt/var/log/xkeen/info.log 136 | /opt/var/log/xkeen 137 | EOF 138 | 139 | } 140 | 141 | register_xkeen_status() { 142 | # Генерация новой записи 143 | new_entry=" 144 | 145 | Package: xkeen 146 | Version: $xkeen_current_version 147 | Depends: jq, curl, lscpu, coreutils-uname 148 | Status: install user installed 149 | Architecture: $status_architecture 150 | Installed-Time: $(date +%s)" 151 | 152 | # Чтение существующего содержимого файла "status" 153 | existing_content=$(cat "$status_file") 154 | 155 | # Объединение существующего содержимого и новой записи 156 | new_content="$existing_content$new_entry" 157 | 158 | # Запись измененного содержимого обратно в файл "status" 159 | echo "$new_content" > "$status_file" 160 | } -------------------------------------------------------------------------------- /_xkeen/02_install/07_install_register/03_register_cron.sh: -------------------------------------------------------------------------------- 1 | register_cron_initd() { 2 | local initd_file="$initd_dir/S05crond" 3 | local s05crond_filename="${current_datetime}_S05crond" 4 | local required_script_version="0.3" 5 | 6 | # Проверяем наличие файла S05crond 7 | if [ -e "$initd_file" ]; then 8 | local current_content="$(cat "$initd_file")" 9 | local script_version=$(grep 'version=' "$initd_file" | grep -o '[0-9.]\+') 10 | 11 | if [ "$script_version" != "$required_script_version" ]; then 12 | local backup_path="$backups_dir/$s05crond_filename" 13 | 14 | # Перемещаем файл в каталог резервных копий с новым именем 15 | mv "$initd_file" "$backup_path" 16 | 17 | echo -e " Ваш файл «${green}S05crond${reset}» перемещен в каталог резервных копий «${yellow}$backup_path${reset}»" 18 | fi 19 | fi 20 | 21 | local script_content='#!/bin/sh 22 | ### Начало информации о службе 23 | # Краткое описание: Запуск / Остановка Cron 24 | # version="0.3" # Версия скрипта 25 | ### Конец информации о службе 26 | 27 | green="\033[32m" 28 | red="\033[31m" 29 | yellow="\033[33m" 30 | reset="\033[0m" 31 | 32 | cron_initd="/opt/sbin/crond" 33 | 34 | # Функция для проверки статуса cron 35 | cron_status() { 36 | if ps | grep -v grep | grep -q "$cron_initd"; then 37 | return 0 # Процесс существует и работает 38 | else 39 | return 1 # Процесс не существует 40 | fi 41 | } 42 | 43 | # Функция для запуска cron 44 | start() { 45 | if cron_status; then 46 | echo -e " Cron ${yellow}уже запущен${reset}" 47 | else 48 | $cron_initd -L /dev/null 49 | echo -e " Cron ${green}запущен${reset}" 50 | fi 51 | } 52 | 53 | # Функция для остановки cron 54 | stop() { 55 | if cron_status; then 56 | killall -9 "crond" 57 | echo -e " Cron ${yellow}остановлен${reset}" 58 | else 59 | echo -e " Cron ${red}не запущен${reset}" 60 | fi 61 | } 62 | 63 | # Функция для перезапуска cron 64 | restart() { 65 | stop > /dev/null 2>&1 66 | start > /dev/null 2>&1 67 | echo -e " Cron ${green}перезапущен${reset}" 68 | } 69 | 70 | # Обработка аргументов командной строки 71 | case "$1" in 72 | start) 73 | start 74 | ;; 75 | stop) 76 | stop 77 | ;; 78 | restart) 79 | restart 80 | ;; 81 | status) 82 | if cron_status; then 83 | echo -e " Cron ${green}запущен${reset}" 84 | else 85 | echo -e " Cron ${red}не запущен${reset}" 86 | fi 87 | ;; 88 | *) 89 | echo -e " Команды: ${green}start${reset} | ${red}stop${reset} | ${yellow}restart${reset} | status" 90 | ;; 91 | esac 92 | 93 | exit 0 94 | ' 95 | 96 | # Создание или замена файла 97 | if [ "$script_version" != "$required_script_version" ]; then 98 | echo -e "$script_content" > "$initd_file" 99 | chmod +x "$initd_file" 100 | fi 101 | } 102 | -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/00_configs_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей конфигураций 2 | 3 | # Модуль конфигурации 4 | . "$xinstall_dir/08_install_configs/01_configs_install.sh" 5 | 6 | # Шаблоны конфигурации 7 | . "$xinstall_dir/08_install_configs/02_configs_dir" -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/01_configs_install.sh: -------------------------------------------------------------------------------- 1 | # Функция для установки файлов конфигурации xray 2 | install_configs() { 3 | if [ ! -d "$install_conf_dir" ]; then 4 | mkdir -p "$install_conf_dir" 5 | fi 6 | 7 | if [ -d "$xkeen_conf_dir" ]; then 8 | xkeen_files="$xkeen_conf_dir"/*.json 9 | files_to_replace="" 10 | 11 | for file in $xkeen_files; do 12 | filename=$(basename "$file" .json) 13 | if [ -f "$install_conf_dir/$filename.json" ]; then 14 | files_to_replace="$files_to_replace $filename" 15 | else 16 | cp "$file" "$install_conf_dir/" 17 | echo -e " Файл ${yellow}$filename${reset} скопирован." 18 | fi 19 | done 20 | 21 | if [ -n "$files_to_replace" ]; then 22 | echo 23 | echo 24 | echo -e " У Вас уже есть конфигурация ${yellow}xray${reset}." 25 | echo -e " Хотите ${yellow}заменить${reset} следующие файлы?" 26 | echo 27 | for filename in $files_to_replace; do 28 | echo -e " $filename" 29 | done 30 | 31 | echo 32 | echo -e " В случае согласия будет выполнено ${yellow}резервное копирование${reset} Ваших файлов." 33 | echo -e " Вы сможете найти их в директории «${yellow}/opt/backups/${reset}»." 34 | if input_concordance_list "Сделайте выбор: "; then 35 | backup_configs 36 | 37 | for filename in $files_to_replace; do 38 | cp "$xkeen_conf_dir/$filename.json" "$install_conf_dir/" 39 | done 40 | fi 41 | fi 42 | else 43 | echo " Директория $xkeen_conf_dir ${red}не найдена${reset}." 44 | fi 45 | } 46 | -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/00_base.json: -------------------------------------------------------------------------------- 1 | { 2 | "log": {}, 3 | "api": {}, 4 | "dns": {}, 5 | "stats": {}, 6 | "policy": {}, 7 | "transport": {}, 8 | "routing": {}, 9 | "inbounds": [] 10 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/01_log.json: -------------------------------------------------------------------------------- 1 | // Настройки журнала — что и куда записывать в журнал. 2 | 3 | { 4 | "log": 5 | { 6 | "access": "/opt/var/log/xray/access.log", // Запись доступа 7 | "error": "/opt/var/log/xray/error.log", // Запись ошибок 8 | "loglevel": "error", // Уровень журнала: от минимального до максимального: "none", "error", "warning", "info", "debug" 9 | "dnsLog": false // Включить / Выключить отслеживание DNS запросов: false, true 10 | } 11 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/02_stats.json: -------------------------------------------------------------------------------- 1 | // Настройка журнала соединений 2 | // * У Stats нет настроек. 3 | // 4 | ############################################################################################### 5 | // 6 | // Популярные сценарии использования: 7 | // 1. Мониторинг соединений конкретных пользователей 8 | // * Если Вы решили предоставлять свой сервис для общего пользования, то позволит определить недобросовестных пользователей. 9 | // 2. Анализ нагрузки на сервера, для оптимизиации ресурсов 10 | // 3. Анализ активности детей и оптимизация родительского контроля 11 | // 12 | ############################################################################################### 13 | // 14 | // Журнал соединений имеет 2 схемы 15 | // 1. Для конкретных пользователей с E-mail 16 | // user > email > traffic > uplink 17 | // user > email > traffic > downlink 18 | // * Если у пользователя не указан Email — в журнале его соединения не будут персонализированы. 19 | // 20 | // 2. Глобальный 21 | // inbound > [tag] > traffic > uplink 22 | // inbound > [tag] > traffic > downlink 23 | // outbound > [tag] > traffic > uplink 24 | // outbound > [tag] > traffic > downlink 25 | // 26 | ############################################################################################### 27 | 28 | { 29 | // "stats": {} 30 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/03_dns.json: -------------------------------------------------------------------------------- 1 | // Настройки DNS 2 | { 3 | // Ваша конфигурация 4 | } 5 | -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/04_reverse.json: -------------------------------------------------------------------------------- 1 | // Настройки обратного проксирования 2 | 3 | // 1. Мост 4 | 5 | { 6 | // "bridges": [ 7 | // { 8 | // "tag": "my_bridge_1", 9 | // "domain": "my.secret.domain" // Должен совпадать с Portal 10 | // } 11 | // ] 12 | } 13 | 14 | // 2. Портал 15 | { 16 | // "portals": [ 17 | // { 18 | // "tag": "my_portal_1", 19 | // "domain": "my.secret.domain" // Должен совпадать с Bridge 20 | // } 21 | // ] 22 | } 23 | -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/05_fake-dns.json: -------------------------------------------------------------------------------- 1 | // Настройка поддельного DNS 2 | 3 | { 4 | // "fakedns": [ 5 | // { 6 | // "ipPool": "198.18.0.0/15", 7 | // "poolSize": 32768 8 | // }, 9 | // { 10 | // "ipPool": "fc00::/18", 11 | // "poolSize": 32768 12 | // } 13 | // ] 14 | } 15 | -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/06_transport.json: -------------------------------------------------------------------------------- 1 | // Настройки транспортного протокола 2 | // Это общие настройки, которые будут использоваться в случае, если нет аналогичных Settings в 08_outbounds.json 3 | // Настройки 08_outbounds.json имеют больший приоритет 4 | 5 | { 6 | "transport": { 7 | "tcpSettings": {}, 8 | "kcpSettings": {}, 9 | "wsSettings": {}, 10 | "httpSettings": {}, 11 | "quicSettings": {}, 12 | "dsSettings": {}, 13 | "grpcSettings": {} 14 | } 15 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/07_inbounds.json: -------------------------------------------------------------------------------- 1 | // Настройка исходящих соединений 2 | 3 | { 4 | // Ваша конфигурация 5 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/08_outbounds.json: -------------------------------------------------------------------------------- 1 | // Настройка входящих соединений 2 | 3 | { 4 | // Ваша конфигурация 5 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/09_policy.json: -------------------------------------------------------------------------------- 1 | // Настройка политик 2 | 3 | { 4 | // Ваша конфигурация 5 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/10_routing.json: -------------------------------------------------------------------------------- 1 | // Настройка маршрутизации 2 | 3 | { 4 | // Ваша конфигурация 5 | } -------------------------------------------------------------------------------- /_xkeen/02_install/08_install_configs/02_configs_dir/11_fallbacks.json: -------------------------------------------------------------------------------- 1 | // Настройка запасных вариантов 2 | 3 | { 4 | // "fallbacks": [ 5 | // { 6 | // "dest": 80 7 | // } 8 | // ] 9 | } -------------------------------------------------------------------------------- /_xkeen/03_delete/00_delete_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей удаления 2 | 3 | # Модули удаления 4 | . "$xdelete_dir/01_delete_geosite.sh" 5 | . "$xdelete_dir/02_delete_geoip.sh" 6 | . "$xdelete_dir/03_delete_cron.sh" 7 | . "$xdelete_dir/04_delete_configs.sh" 8 | . "$xdelete_dir/05_delete_register.sh" 9 | . "$xdelete_dir/06_delete_tmp.sh" 10 | -------------------------------------------------------------------------------- /_xkeen/03_delete/01_delete_geodata.sh: -------------------------------------------------------------------------------- 1 | # Функция для удаления файлов GeoData 2 | delete_geodata() { 3 | if [ "$chose_delete_geodata_antifilter_select" == "true" ]; then 4 | if [ -f "$geo_dir/geodata_antifilter.dat" ]; then 5 | rm "$geo_dir/geodata_antifilter.dat" 6 | fi 7 | fi 8 | 9 | if [ "$chose_delete_geodata_antizapret_select" == "true" ]; then 10 | if [ -f "$geo_dir/geodata_antizapret.dat" ]; then 11 | rm "$geo_dir/geodata_antizapret.dat" 12 | fi 13 | fi 14 | 15 | if [ "$chose_delete_geodata_v2fly_select" == "true" ]; then 16 | if [ -f "$geo_dir/geodata_v2fly.dat" ]; then 17 | rm "$geo_dir/geodata_v2fly.dat" 18 | fi 19 | fi 20 | } 21 | 22 | # Функция для удаления всех файлов GeoData 23 | delete_geodata_key() { 24 | if [ -f "$geo_dir/geodata_antifilter.dat" ]; then 25 | rm "$geo_dir/geodata_antifilter.dat" 26 | fi 27 | 28 | if [ -f "$geo_dir/geodata_antizapret.dat" ]; then 29 | rm "$geo_dir/geodata_antizapret.dat" 30 | fi 31 | 32 | if [ -f "$geo_dir/geodata_v2fly.dat" ]; then 33 | rm "$geo_dir/geodata_v2fly.dat" 34 | fi 35 | } 36 | -------------------------------------------------------------------------------- /_xkeen/03_delete/01_delete_geosite.sh: -------------------------------------------------------------------------------- 1 | # Функция для удаления файлов GeoSite 2 | delete_geosite() { 3 | if [ "$chose_delete_geosite_antifilter_select" == "true" ]; then 4 | if [ -f "$geo_dir/geosite_antifilter.dat" ]; then 5 | rm "$geo_dir/geosite_antifilter.dat" 6 | fi 7 | fi 8 | 9 | if [ "$chose_delete_geosite_antizapret_select" == "true" ]; then 10 | if [ -f "$geo_dir/geosite_antizapret.dat" ]; then 11 | rm "$geo_dir/geosite_antizapret.dat" 12 | fi 13 | fi 14 | 15 | if [ "$chose_delete_geosite_v2fly_select" == "true" ]; then 16 | if [ -f "$geo_dir/geosite_v2fly.dat" ]; then 17 | rm "$geo_dir/geosite_v2fly.dat" 18 | fi 19 | fi 20 | } 21 | 22 | # Функция для удаления всех файлов GeoSite 23 | delete_geosite_key() { 24 | if [ -f "$geo_dir/geosite_antifilter.dat" ]; then 25 | rm "$geo_dir/geosite_antifilter.dat" 26 | fi 27 | 28 | if [ -f "$geo_dir/geosite_antizapret.dat" ]; then 29 | rm "$geo_dir/geosite_antizapret.dat" 30 | fi 31 | 32 | if [ -f "$geo_dir/geosite_v2fly.dat" ]; then 33 | rm "$geo_dir/geosite_v2fly.dat" 34 | fi 35 | } 36 | -------------------------------------------------------------------------------- /_xkeen/03_delete/02_delete_geoip.sh: -------------------------------------------------------------------------------- 1 | # Функция для удаления файлов GeoIP данных 2 | delete_geoip() { 3 | if [ "$chose_delete_geoip_v2fly_select" == "true" ]; then 4 | if [ -f "$geo_dir/geoip_v2fly.dat" ]; then 5 | rm "$geo_dir/geoip_v2fly.dat" 6 | fi 7 | fi 8 | 9 | if [ "$chose_delete_geoip_antifilter_select" == "true" ]; then 10 | if [ -f "$geo_dir/geoip_antifilter.dat" ]; then 11 | rm "$geo_dir/geoip_antifilter.dat" 12 | fi 13 | fi 14 | } 15 | 16 | # Функция для удаления всех файлов GeoIP данных 17 | delete_geoip_key() { 18 | if [ -f "$geo_dir/geoip_antifilter.dat" ]; then 19 | rm "$geo_dir/geoip_antifilter.dat" 20 | fi 21 | 22 | if [ -f "$geo_dir/geoip_v2fly.dat" ]; then 23 | rm "$geo_dir/geoip_v2fly.dat" 24 | fi 25 | } 26 | -------------------------------------------------------------------------------- /_xkeen/03_delete/03_delete_cron.sh: -------------------------------------------------------------------------------- 1 | # Функция для удаления cron задач 2 | delete_cron_task() { 3 | if [ "$chose_cancel_cron_select" != true ]; then 4 | if [ -f "$cron_dir/$cron_file" ]; then 5 | tmp_file="$cron_dir/${cron_file}.tmp" 6 | 7 | cp "$cron_dir/$cron_file" "$tmp_file" 8 | 9 | if [ "$chose_all_cron_select" = true ] || [ "$chose_delete_all_cron_select" = true ]; then 10 | grep -v "ugi" "$tmp_file" | grep -v "ugs" | grep -v "ux" | grep -v "uk" | sed '/^\s*$/d' > "$cron_dir/$cron_file" 11 | else 12 | if [ "$chose_xkeen_cron_select" = true ]; then 13 | delete_cron_xkeen 14 | fi 15 | 16 | if [ "$chose_xray_cron_select" = true ]; then 17 | delete_cron_xray 18 | fi 19 | 20 | if [ "$chose_geosite_cron_select" = true ]; then 21 | delete_cron_geosite 22 | fi 23 | 24 | if [ "$chose_geoip_cron_select" = true ]; then 25 | delete_cron_geoip 26 | fi 27 | fi 28 | fi 29 | fi 30 | } 31 | 32 | # Функция для удаления cron задач для xkeen 33 | delete_cron_xkeen() { 34 | if [ -f "$cron_dir/$cron_file" ]; then 35 | tmp_file="$cron_dir/${cron_file}.tmp" 36 | 37 | cp "$cron_dir/$cron_file" "$tmp_file" 38 | 39 | grep -v "uk" "$tmp_file" | sed '/^\s*$/d' > "$cron_dir/$cron_file" 40 | fi 41 | } 42 | 43 | # Функция для удаления cron задач для xray 44 | delete_cron_xray() { 45 | if [ -f "$cron_dir/$cron_file" ]; then 46 | tmp_file="$cron_dir/${cron_file}.tmp" 47 | 48 | cp "$cron_dir/$cron_file" "$tmp_file" 49 | 50 | grep -v "ux" "$tmp_file" | sed '/^\s*$/d' > "$cron_dir/$cron_file" 51 | fi 52 | } 53 | 54 | # Функция для удаления cron задач для geosite 55 | delete_cron_geosite() { 56 | if [ -f "$cron_dir/$cron_file" ]; then 57 | tmp_file="$cron_dir/${cron_file}.tmp" 58 | 59 | cp "$cron_dir/$cron_file" "$tmp_file" 60 | 61 | grep -v "ugs" "$tmp_file" | sed '/^\s*$/d' > "$cron_dir/$cron_file" 62 | fi 63 | } 64 | 65 | # Функция для удаления cron задач для geoip 66 | delete_cron_geoip() { 67 | if [ -f "$cron_dir/$cron_file" ]; then 68 | tmp_file="$cron_dir/${cron_file}.tmp" 69 | 70 | cp "$cron_dir/$cron_file" "$tmp_file" 71 | 72 | grep -v "ugi" "$tmp_file" | sed '/^\s*$/d' > "$cron_dir/$cron_file" 73 | fi 74 | } 75 | -------------------------------------------------------------------------------- /_xkeen/03_delete/04_delete_configs.sh: -------------------------------------------------------------------------------- 1 | # Удаление всех конфигураций xray 2 | 3 | delete_configs() { 4 | find "$install_conf_dir" -name "*.json" -type f -delete 5 | } 6 | -------------------------------------------------------------------------------- /_xkeen/03_delete/05_delete_register.sh: -------------------------------------------------------------------------------- 1 | # Удаление регистрации xray 2 | delete_register_xray() { 3 | # Удаляем соответствующие записи из файла статуса opkg 4 | sed -i -e '/Package: xray/,/Installed-Time:/d' "/opt/lib/opkg/status" 5 | 6 | # Удаляем файлы регистрации, если они существуют 7 | if [ -f "$register_dir/xray.control" ] || [ -f "$register_dir/xray.list" ]; then 8 | rm -f "$register_dir/xray.control" "$register_dir/xray.list" 9 | fi 10 | } 11 | 12 | # Удаление регистрации xkeen 13 | delete_register_xkeen() { 14 | # Удаляем соответствующие записи из файла статуса opkg 15 | sed -i -e '/Package: xkeen/,/Installed-Time:/d' "/opt/lib/opkg/status" 16 | 17 | # Удаляем файлы регистрации, если они существуют 18 | if [ -f "$register_dir/xkeen.control" ] || [ -f "$register_dir/xkeen.list" ]; then 19 | rm -f "$register_dir/xkeen.control" "$register_dir/xkeen.list" 20 | fi 21 | } 22 | -------------------------------------------------------------------------------- /_xkeen/03_delete/06_delete_tmp.sh: -------------------------------------------------------------------------------- 1 | # Удаление временных файлов и директорий 2 | delete_tmp() { 3 | if [ -d "$tmp_dir_global/xkeen" ]; then 4 | rm -r "$tmp_dir_global/xkeen" 5 | fi 6 | 7 | if [ -f "$cron_dir/root.tmp" ]; then 8 | rm "$cron_dir/root.tmp" 9 | fi 10 | echo -e " Приступаю к ${yellow}очистке временных файлов${reset} после работы Xkeen…" 11 | sleep 1 12 | echo -e " Очистка временных файлов после работы Xkeen ${green}успешно выполнена${reset}" 13 | } 14 | -------------------------------------------------------------------------------- /_xkeen/04_tools/00_tools_import.sh: -------------------------------------------------------------------------------- 1 | 2 | # Модуль логирования 3 | . "$xtools_dir/01_tools_logs/00_logs_import.sh" 4 | 5 | # Модуль выбора 6 | . "$xtools_dir/02_tools_choose/00_choose_import.sh" 7 | 8 | # Модуль резервного копирования 9 | . "$xtools_dir/03_tools_backups/00_backups_import.sh" 10 | 11 | # Модуль загрузок 12 | . "$xtools_dir/04_tools_downloaders/00_downloaders_import.sh" 13 | 14 | # Дополнительные инструменты 15 | . "$xtools_dir/05_tools_archive.sh" 16 | 17 | 18 | -------------------------------------------------------------------------------- /_xkeen/04_tools/01_tools_logs/00_logs_import.sh: -------------------------------------------------------------------------------- 1 | #Блок логирования 2 | 3 | # Модули логирования 4 | . "$xtools_dir/01_tools_logs/01_logs_clear.sh" 5 | . "$xtools_dir/01_tools_logs/02_logs_console.sh" 6 | . "$xtools_dir/01_tools_logs/03_logs_xkeen.sh" 7 | -------------------------------------------------------------------------------- /_xkeen/04_tools/01_tools_logs/01_logs_clear.sh: -------------------------------------------------------------------------------- 1 | # Очистка журнала xkeen перед началом работы 2 | 3 | logs_clear() { 4 | echo "" > "$xkeen_info_log" 5 | echo "" > "$xkeen_error_log" 6 | } -------------------------------------------------------------------------------- /_xkeen/04_tools/01_tools_logs/02_logs_console.sh: -------------------------------------------------------------------------------- 1 | # Обратная связь в консоль 2 | 3 | logs_cpu_info_console() { 4 | echo " Процессор" 5 | echo " Набор инструкций: $architecture" 6 | 7 | if [ -z "$architecture" ]; then 8 | echo -e " Процессор ${red}не поддерживается${reset} xkeen" 9 | else 10 | echo -e " Процессор ${green}поддерживается${reset} xkeen" 11 | fi 12 | } 13 | 14 | logs_delete_configs_info_console() { 15 | local info_content="" 16 | local error_content="" 17 | 18 | local deleted_files=$(find "$install_conf_dir" -name "*.json" -type f) 19 | 20 | if [ -z "$deleted_files" ]; then 21 | echo -e " ${green}Успешно:${reset} Все конфигурационные файлы Xray удалены" 22 | else 23 | echo -e " ${red}Ошибка:${reset} Не удалены следующие конфигурационные файлы:" 24 | for file in $deleted_files; do 25 | echo -e " $file" 26 | done 27 | fi 28 | } 29 | 30 | logs_delete_geoip_info_console() { 31 | local info_content="" 32 | local error_content="" 33 | 34 | if [ -f "$geo_dir/geoip_antifilter.dat" ]; then 35 | error_content=" ${red}Ошибка:${reset} Файл geoip_antifilter.dat не удален\n" 36 | else 37 | info_content=" ${green}Успешно:${reset} Файл geoip_antifilter.dat отсутствует в директории «$geo_dir»\n" 38 | fi 39 | 40 | if [ -f "$geo_dir/geoip_v2fly.dat" ]; then 41 | error_content="${error_content} ${red}Ошибка:${reset} Файл geoip_v2fly.dat не удален" 42 | else 43 | info_content="${info_content} ${green}Успешно:${reset} Файл geoip_v2fly.dat отсутствует в директории «$geo_dir»" 44 | fi 45 | 46 | if [ -n "$error_content" ]; then 47 | echo -e " ${yellow}Проверка${reset} выполнения операции" 48 | echo -e "$error_content" 49 | else 50 | echo "" 51 | echo -e " ${yellow}Проверка${reset} выполнения операции" 52 | echo -e "$info_content" 53 | echo "" 54 | fi 55 | } 56 | 57 | logs_delete_geosite_info_console() { 58 | local info_content="" 59 | local error_content="" 60 | 61 | if [ -f "$geo_dir/geosite_antifilter.dat" ]; then 62 | error_content=" ${red}Ошибка:${reset} Файл geosite_antifilter.dat не удален\n" 63 | else 64 | info_content=" ${green}Успешно:${reset} Файл geosite_antifilter.dat отсутствует в директории «$geo_dir»\n" 65 | fi 66 | 67 | if [ -f "$geo_dir/geosite_antizapret.dat" ]; then 68 | error_content="${error_content} ${red}Ошибка:${reset} Файл geosite_antizapret.dat не удален\n" 69 | else 70 | info_content="${info_content} ${green}Успешно:${reset} Файл geosite_antizapret.dat отсутствует в директории «$geo_dir»\n" 71 | fi 72 | 73 | if [ -f "$geo_dir/geosite_v2fly.dat" ]; then 74 | error_content="${error_content} ${red}Ошибка:${reset} Файл geosite_v2fly.dat не удален\n" 75 | else 76 | info_content="${info_content} ${green}Успешно:${reset} Файл geosite_v2fly.dat отсутствует в директории «$geo_dir»\n" 77 | fi 78 | 79 | if [ -n "$error_content" ]; then 80 | echo -e " ${yellow}Проверка${reset} выполнения операции" 81 | echo -e "$error_content" 82 | else 83 | echo -e " ${yellow}Проверка${reset} выполнения операции" 84 | echo -e "$info_content" 85 | fi 86 | } 87 | 88 | 89 | logs_delete_cron_geoip_info_console() { 90 | local info_content="" 91 | 92 | if [ -f "$cron_dir/$cron_file" ]; then 93 | grep -q "ugi" "$cron_dir/$cron_file" 94 | if [ $? -eq 1 ]; then 95 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для GeoIP удалена из cron" 96 | fi 97 | 98 | if [ -n "$info_content" ]; then 99 | echo -e "$info_content" 100 | fi 101 | fi 102 | } 103 | 104 | logs_delete_cron_geosite_info_console() { 105 | local info_content="" 106 | 107 | if [ -f "$cron_dir/$cron_file" ]; then 108 | grep -q "ugs" "$cron_dir/$cron_file" 109 | if [ $? -eq 1 ]; then 110 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для GeoSite удалена из cron" 111 | fi 112 | 113 | if [ -n "$info_content" ]; then 114 | echo -e "$info_content" 115 | fi 116 | fi 117 | } 118 | 119 | logs_delete_cron_xray_info_console() { 120 | local info_content="" 121 | 122 | if [ -f "$cron_dir/$cron_file" ]; then 123 | grep -q "ux" "$cron_dir/$cron_file" 124 | if [ $? -eq 1 ]; then 125 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для Xray удалена из cron" 126 | fi 127 | 128 | if [ -n "$info_content" ]; then 129 | echo -e "$info_content" 130 | fi 131 | fi 132 | } 133 | 134 | logs_delete_cron_xkeen_info_console() { 135 | local info_content="" 136 | 137 | if [ -f "$cron_dir/$cron_file" ]; then 138 | grep -q "uk" "$cron_dir/$cron_file" 139 | if [ $? -eq 1 ]; then 140 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для Xkeen удалена из cron" 141 | fi 142 | 143 | if [ -n "$info_content" ]; then 144 | echo -e "$info_content" 145 | fi 146 | fi 147 | } 148 | 149 | logs_register_xkeen_status_info_console() { 150 | local info_content="" 151 | local error_content="" 152 | 153 | if grep -q "Package: xkeen" "$status_file"; then 154 | info_content=" ${green}Успешно:${reset} Запись Xkeen найдена в «$status_file»" 155 | else 156 | error_content=" ${red}Ошибка:${reset} Запись Xkeen не найдена в «$status_file»" 157 | fi 158 | 159 | if [ -n "$info_content" ]; then 160 | echo -e "$info_content" 161 | fi 162 | 163 | if [ -n "$error_content" ]; then 164 | echo -e "$error_content" 165 | fi 166 | } 167 | 168 | logs_register_xkeen_control_info_console() { 169 | local info_content="" 170 | local error_content="" 171 | 172 | if [ -f "$register_dir/xkeen.control" ]; then 173 | info_content=" ${green}Успешно:${reset} Файл xkeen.control найден в директории «$register_dir/»" 174 | else 175 | error_content=" ${red}Ошибка:${reset} Файл xkeen.control не найден в директории «$register_dir/»" 176 | fi 177 | 178 | if [ -n "$info_content" ]; then 179 | echo -e "$info_content" 180 | fi 181 | 182 | if [ -n "$error_content" ]; then 183 | echo -e "$error_content" 184 | fi 185 | } 186 | 187 | logs_register_xkeen_list_info_console() { 188 | local info_content="" 189 | local error_content="" 190 | 191 | cd "$register_dir/" || exit 192 | 193 | if [ ! -f "xkeen.list" ]; then 194 | error_content=" ${red}Ошибка:${reset} Файл xkeen.list не найден в директории «$register_dir/»" 195 | else 196 | info_content=" ${green}Успешно:${reset} Файл xkeen.list найден в директории «$register_dir/»" 197 | fi 198 | 199 | if [ -n "$error_content" ]; then 200 | echo -e "$error_content" 201 | fi 202 | 203 | if [ -n "$info_content" ]; then 204 | echo -e "$info_content" 205 | fi 206 | } 207 | 208 | logs_delete_register_xkeen_info_console() { 209 | local info_content="" 210 | local error_content="" 211 | 212 | if [ ! -f "$register_dir/xkeen.list" ]; then 213 | info_content=" ${green}Успешно:${reset} Файл xkeen.list не найден в директории «$register_dir/»" 214 | else 215 | error_content=" ${red}Ошибка:${reset} Файл xkeen.list найден в директории «$register_dir/»" 216 | fi 217 | 218 | if [ ! -f "$register_dir/xkeen.control" ]; then 219 | info_content="${info_content}\n ${green}Успешно:${reset} Файл xkeen.control не найден в директории «$register_dir/»" 220 | else 221 | error_content="${error_content}\n ${red}Ошибка:${reset} Файл xkeen.control найден в директории «$register_dir/»" 222 | fi 223 | 224 | if ! grep -q 'Package: xkeen' "$status_file"; then 225 | info_content="${info_content}\n ${green}Успешно:${reset} Регистрация пакета xkeen не обнаружена в «$status_file»" 226 | else 227 | error_content="${error_content}\n ${red}Ошибка:${reset} Регистрация пакета xkeen обнаружена в «$status_file»" 228 | fi 229 | 230 | if [ -n "$error_content" ]; then 231 | echo -e "$error_content" 232 | fi 233 | 234 | if [ -n "$info_content" ]; then 235 | echo -e "$info_content" 236 | fi 237 | } 238 | 239 | logs_register_xray_initd_info_console() { 240 | local info_content="" 241 | local error_content="" 242 | 243 | initd_file="$initd_dir/S24xray" 244 | 245 | if [ -f "$initd_file" ]; then 246 | info_content=" ${green}Успешно:${reset} init скрипт Xray найден в директории «$initd_dir/»" 247 | else 248 | error_content=" ${red}Ошибка:${reset} init скрипт Xray не найден в директории «$initd_dir/»" 249 | fi 250 | 251 | if [ -n "$info_content" ]; then 252 | echo -e "$info_content" 253 | fi 254 | 255 | if [ -n "$error_content" ]; then 256 | echo -e "$error_content" 257 | fi 258 | } 259 | 260 | logs_register_xray_list_info_console() { 261 | local info_content="" 262 | local error_content="" 263 | 264 | cd "$register_dir/" || exit 265 | 266 | if [ ! -f "xray.list" ]; then 267 | error_content=" ${red}Ошибка:${reset} Файл xray.list не найден в директории «$register_dir/»" 268 | else 269 | info_content=" ${green}Успешно:${reset} Файл xray.list найден в директории «$register_dir/»" 270 | fi 271 | 272 | if [ -n "$error_content" ]; then 273 | echo -e "$error_content" 274 | fi 275 | 276 | if [ -n "$info_content" ]; then 277 | echo -e "$info_content" 278 | fi 279 | } 280 | 281 | logs_register_xray_status_info_console() { 282 | local info_content="" 283 | local error_content="" 284 | 285 | if grep -q "Package: xray" "$status_file"; then 286 | info_content=" ${green}Успешно:${reset} Запись Xray найдена в «$status_file»" 287 | else 288 | error_content=" ${red}Ошибка:${reset} Запись Xray не найдена в «$status_file»" 289 | fi 290 | 291 | if [ -n "$info_content" ]; then 292 | echo -e "$info_content" 293 | fi 294 | 295 | if [ -n "$error_content" ]; then 296 | echo -e "$error_content" 297 | fi 298 | } 299 | 300 | logs_register_xray_control_info_console() { 301 | local info_content="" 302 | local error_content="" 303 | 304 | control_file_path="$register_dir/xray.control" 305 | 306 | if [ -f "$control_file_path" ]; then 307 | info_content=" ${green}Успешно:${reset} Файл xray.control найден в директории «$register_dir/»" 308 | else 309 | error_content=" ${red}Ошибка:${reset} Файл xray.control не найден в директории «$register_dir/»" 310 | fi 311 | 312 | if [ -n "$info_content" ]; then 313 | echo -e "$info_content" 314 | fi 315 | 316 | if [ -n "$error_content" ]; then 317 | echo -e "$error_content" 318 | fi 319 | } 320 | 321 | logs_delete_register_xray_info_console() { 322 | local info_content="" 323 | local error_content="" 324 | 325 | if [ ! -f "$register_dir/xray.list" ]; then 326 | info_content=" ${green}Успешно:${reset} Файл xray.list не найден в директории «$register_dir/»" 327 | else 328 | error_content=" ${red}Ошибка:${reset} Файл xray.list найден в директории «$register_dir/»" 329 | fi 330 | 331 | if [ ! -f "$register_dir/xray.control" ]; then 332 | info_content="${info_content}\n ${green}Успешно:${reset} Файл xray.control не найден в директории «$register_dir/»" 333 | else 334 | error_content="${error_content}\n ${red}Ошибка:${reset} Файл xray.control найден в директории «$register_dir/»" 335 | fi 336 | 337 | if ! grep -q 'Package: xray' "$status_file"; then 338 | info_content="${info_content}\n ${green}Успешно:${reset} Регистрация пакета xray не обнаружена в «$status_file»" 339 | else 340 | error_content="${error_content}\n ${red}Ошибка:${reset} Регистрация пакета xray обнаружена в «$status_file»" 341 | fi 342 | 343 | if [ -n "$info_content" ]; then 344 | echo -e "$info_content" 345 | fi 346 | 347 | if [ -n "$error_content" ]; then 348 | echo -e "$error_content" 349 | fi 350 | } 351 | 352 | logs_install_cron_info_console() { 353 | local info_content="" 354 | local error_content="" 355 | local last_line="" 356 | 357 | cron_file_path="$cron_dir/$cron_file" 358 | 359 | if [ -f "$cron_file_path" ]; then 360 | if [ -n "$chose_all_cron_time" ] || [ -n "$chose_xkeen_cron_time" ] || [ -n "$chose_xray_cron_time" ] || [ -n "$chose_geosite_cron_time" ] || [ -n "$chose_geoip_cron_time" ]; then 361 | if [ -n "$chose_all_cron_time" ] || [ -n "$chose_geoip_cron_time" ]; then 362 | if grep -q "$install_dir/xkeen.*-ugi" "$cron_file_path"; then 363 | task="GeoIP" 364 | cron_entry=$(grep "$install_dir/xkeen.*-ugic" "$cron_file_path") 365 | info_content=" ${green}Успешно:${reset} Запись для задачи автоматического обновления $task существует" 366 | info_content="${info_content}\n ${green}Успешно:${reset} $cron_entry" 367 | last_line="$cron_entry" 368 | else 369 | error_content=" ${red}Ошибка:${reset} Запись для задачи автоматического обновления GeoIP не существует в cron файле" 370 | fi 371 | fi 372 | 373 | if [ -n "$chose_all_cron_time" ] || [ -n "$chose_geosite_cron_time" ]; then 374 | if grep -q "$install_dir/xkeen.*-ugs" "$cron_file_path"; then 375 | task="GeoSite" 376 | cron_entry=$(grep "$install_dir/xkeen.*-ugsc" "$cron_file_path") 377 | info_content="${info_content}\n ${green}Успешно:${reset} Запись для задачи автоматического обновления $task существует" 378 | info_content="${info_content}\n ${green}Успешно:${reset} $cron_entry" 379 | last_line="$cron_entry" 380 | else 381 | error_content="${error_content}\n ${red}Ошибка:${reset} Запись для задачи автоматического обновления GeoSite не существует в cron файле" 382 | fi 383 | fi 384 | 385 | if [ -n "$chose_all_cron_time" ] || [ -n "$chose_xkeen_cron_time" ]; then 386 | if grep -q "$install_dir/xkeen.*-uk" "$cron_file_path"; then 387 | task="Xkeen" 388 | cron_entry=$(grep "$install_dir/xkeen.*-ukc" "$cron_file_path") 389 | info_content="${info_content}\n ${green}Успешно:${reset} Запись для задачи автоматического обновления $task существует" 390 | info_content="${info_content}\n ${green}Успешно:${reset} $cron_entry" 391 | last_line="$cron_entry" 392 | else 393 | error_content="${error_content}\n ${red}Ошибка:${reset} Запись для задачи автоматического обновления Xkeen не существует в cron файле" 394 | fi 395 | fi 396 | 397 | if [ -n "$chose_all_cron_time" ] || [ -n "$chose_xray_cron_time" ]; then 398 | if grep -q "$install_dir/xkeen.*-ux" "$cron_file_path"; then 399 | task="Xray" 400 | cron_entry=$(grep "$install_dir/xkeen.*-uxc" "$cron_file_path") 401 | info_content="${info_content}\n ${green}Успешно:${reset} Запись для задачи автоматического обновления $task существует" 402 | info_content="${info_content}\n ${green}Успешно:${reset} $cron_entry" 403 | last_line="$cron_entry" 404 | else 405 | error_content="${error_content}\n ${red}Ошибка:${reset} Запись для задачи автоматического обновления Xray не существует в cron файле" 406 | fi 407 | fi 408 | fi 409 | else 410 | error_content=" ${red}Ошибка:${reset} Файл cron не найден" 411 | fi 412 | 413 | if [ -n "$error_content" ]; then 414 | echo "" 415 | echo -e "$error_content" 416 | if [ -n "$last_line" ]; then 417 | echo "" 418 | fi 419 | fi 420 | 421 | if [ -n "$info_content" ]; then 422 | echo "" 423 | echo -e "$info_content" 424 | if [ -n "$last_line" ]; then 425 | echo "" 426 | fi 427 | fi 428 | } 429 | 430 | logs_install_geoip_info_console() { 431 | local info_content="" 432 | local error_content="" 433 | 434 | if [ "$install_antifilter_geoip" = true ]; then 435 | if [ -f "$geo_dir/geoip_antifilter.dat" ]; then 436 | info_content=" ${green}Успешно:${reset} GeoIP AntiFilter установлена" 437 | else 438 | error_content=" ${red}Ошибка:${reset} Не удалось установить GeoIP базу AntiFilter" 439 | fi 440 | fi 441 | 442 | if [ "$install_v2fly_geoip" = true ]; then 443 | if [ -f "$geo_dir/geoip_v2fly.dat" ]; then 444 | info_content="${info_content}\n ${green}Успешно:${reset} GeoIP v2fly установлена" 445 | else 446 | error_content="${error_content}\n ${red}Ошибка:${reset} Не удалось установить GeoIP базу v2fly" 447 | fi 448 | fi 449 | 450 | if [ "$update_antifilter_geoip" = true ]; then 451 | if [ -f "$geo_dir/geoip_antifilter.dat" ]; then 452 | info_content="${info_content}\n ${green}Успешно:${reset} GeoIP AntiFilter обновлена" 453 | else 454 | error_content="${error_content}\n ${red}Ошибка:${reset} GeoIP AntiFilter не установлена. Поэтому не может быть обновлена" 455 | fi 456 | fi 457 | 458 | if [ "$update_v2fly_geoip" = true ]; then 459 | if [ -f "$geo_dir/geoip_v2fly.dat" ]; then 460 | info_content="${info_content}\n ${green}Успешно:${reset} GeoIP v2fly обновлена" 461 | else 462 | error_content="${error_content}\n ${red}Ошибка:${reset} GeoIP v2fly не установлена. Поэтому не может быть обновлена" 463 | fi 464 | fi 465 | 466 | if [ -n "$info_content" ] || [ -n "$error_content" ]; then 467 | echo "" 468 | if [ -n "$info_content" ]; then 469 | echo -e "$info_content" 470 | fi 471 | if [ -n "$error_content" ]; then 472 | echo -e "$error_content" 473 | fi 474 | echo "" 475 | fi 476 | } 477 | 478 | logs_install_geosite_info_console() { 479 | local info_content="" 480 | local error_content="" 481 | 482 | if [ "$install_antizapret_geosite" = true ]; then 483 | if [ -f "$geo_dir/geosite_antizapret.dat" ]; then 484 | info_content=" ${green}Успешно:${reset} GeoSite AntiZapret установлена" 485 | else 486 | error_content=" ${red}Ошибка:${reset} Не удалось установить GeoSite базу AntiZapret" 487 | fi 488 | fi 489 | 490 | if [ "$install_antifilter_geosite" = true ]; then 491 | if [ -f "$geo_dir/geosite_antifilter.dat" ]; then 492 | info_content="${info_content}\n ${green}Успешно:${reset} GeoSite AntiFilter установлена" 493 | else 494 | error_content="${error_content}\n ${red}Ошибка:${reset} Не удалось установить GeoSite базу AntiFilter" 495 | fi 496 | fi 497 | 498 | if [ "$install_v2fly_geosite" = true ]; then 499 | if [ -f "$geo_dir/geosite_v2fly.dat" ]; then 500 | info_content="${info_content}\n ${green}Успешно:${reset} GeoSite v2fly установлена" 501 | else 502 | error_content="${error_content}\n ${red}Ошибка:${reset} Не удалось установить GeoSite базу v2fly" 503 | fi 504 | fi 505 | 506 | if [ "$update_antizap_geosite" = true ]; then 507 | if [ -f "$geo_dir/geosite_antifilter.dat" ]; then 508 | info_content="${info_content}\n ${green}Успешно:${reset} GeoSite AntiFilter обновлена" 509 | else 510 | error_content="${error_content}\n ${red}Ошибка:${reset} GeoSite AntiFilter не установлена. Поэтому не может быть обновлена" 511 | fi 512 | fi 513 | 514 | if [ "$update_antifilter_geosite" = true ]; then 515 | if [ -f "$geo_dir/geosite_antifilter.dat" ]; then 516 | info_content="${info_content}\n ${green}Успешно:${reset} GeoSite AntiFilter обновлена" 517 | else 518 | error_content="${error_content}\n ${red}Ошибка:${reset} GeoSite AntiFilter не установлена. Поэтому не может быть обновлена" 519 | fi 520 | fi 521 | 522 | if [ "$update_v2fly_geosite" = true ]; then 523 | if [ -f "$geo_dir/geosite_v2fly.dat" ]; then 524 | info_content="${info_content}\n ${green}Успешно:${reset} GeoSite v2fly обновлена" 525 | else 526 | error_content="${error_content}\n ${red}Ошибка:${reset} GeoSite v2fly не установлена. Поэтому не может быть обновлена" 527 | fi 528 | fi 529 | 530 | if [ -n "$info_content" ] || [ -n "$error_content" ]; then 531 | echo "" 532 | if [ -n "$info_content" ]; then 533 | echo -e "$info_content" 534 | fi 535 | if [ -n "$error_content" ]; then 536 | echo -e "$error_content" 537 | fi 538 | echo "" 539 | fi 540 | } 541 | 542 | logs_install_configs_info_console() { 543 | local info_content="" 544 | local error_content="" 545 | 546 | if [ -d "$xkeen_conf_dir" ]; then 547 | xkeen_files="$xkeen_conf_dir"/*.json 548 | 549 | files_to_replace="" 550 | 551 | for file in $xkeen_files; do 552 | filename=$(basename "$file" .json) 553 | if [ -f "$install_conf_dir/$filename.json" ]; then 554 | files_to_replace="$files_to_replace $filename" 555 | fi 556 | done 557 | 558 | if [ -n "$files_to_replace" ]; then 559 | info_content=" ${green}Успешно:${reset} Файлы находящиеся в директории конфигураций Xray:\n" 560 | for filename in $files_to_replace; do 561 | info_content="${info_content} $filename\n" 562 | done 563 | fi 564 | else 565 | error_content=" ${red}Ошибка:${reset} Директория $xkeen_conf_dir не найдена\n" 566 | fi 567 | 568 | if [ -n "$error_content" ] || [ -n "$info_content" ]; then 569 | if [ -n "$error_content" ]; then 570 | echo -e "$error_content" 571 | fi 572 | if [ -n "$info_content" ]; then 573 | echo -e "$info_content" 574 | fi 575 | fi 576 | } 577 | 578 | logs_delete_cron_geosite_info_console() { 579 | local info_content="" 580 | 581 | if [ -f "$cron_dir/$cron_file" ]; then 582 | if grep -q "ugs" "$cron_dir/$cron_file"; then 583 | error_content=" ${red}Ошибка:${reset} Задача автоматического обновления для GeoSite найдена в Cron\n" 584 | else 585 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для GeoSite не найдена Cron\n" 586 | fi 587 | 588 | if [ -n "$info_content" ]; then 589 | echo -e "$info_content" 590 | elif [ -n "$error_content" ]; then 591 | echo -e "$error_content" 592 | fi 593 | fi 594 | } 595 | logs_delete_cron_xkeen_info_console() { 596 | local info_content="" 597 | 598 | if [ -f "$cron_dir/$cron_file" ]; then 599 | grep -q "uk" "$cron_dir/$cron_file" 600 | if [ $? -eq 0 ]; then 601 | error_content=" ${red}Ошибка:${reset} Задача автоматического обновления для Xkeen найдена в Cron\n" 602 | else 603 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для Xkeen не найдена в Cron\n" 604 | fi 605 | 606 | if [ -n "$info_content" ]; then 607 | echo -e "$info_content" 608 | fi 609 | fi 610 | } 611 | 612 | logs_delete_cron_xray_info_console() { 613 | local info_content="" 614 | 615 | if [ -f "$cron_dir/$cron_file" ]; then 616 | grep -q "ux" "$cron_dir/$cron_file" 617 | if [ $? -eq 0 ]; then 618 | error_content=" ${red}Ошибка:${reset} Задача автоматического обновления для Xray найдена в Cron\n" 619 | else 620 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для Xray не найдена в Cron\n" 621 | fi 622 | 623 | if [ -n "$info_content" ]; then 624 | echo -e "$info_content" 625 | fi 626 | fi 627 | } 628 | 629 | logs_delete_cron_geoip_info_console() { 630 | local info_content="" 631 | 632 | if [ -f "$cron_dir/$cron_file" ]; then 633 | grep -q "ugi" "$cron_dir/$cron_file" 634 | if [ $? -eq 0 ]; then 635 | error_content=" ${red}Ошибка:${reset} Задача автоматического обновления для GeoIP найдена в Cron\n" 636 | else 637 | info_content=" ${green}Успешно:${reset} Задача автоматического обновления для GeoIP не найдена в Cron\n" 638 | fi 639 | 640 | if [ -n "$info_content" ]; then 641 | echo -e "$info_content" 642 | fi 643 | fi 644 | } 645 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/00_choose_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей выбора пользователя 2 | 3 | # Модули выбора 4 | . "$xtools_dir/02_tools_choose/01_choose_input.sh" 5 | . "$xtools_dir/02_tools_choose/02_choose_geosite.sh" 6 | . "$xtools_dir/02_tools_choose/03_choose_geoip.sh" 7 | 8 | . "$xtools_dir/02_tools_choose/04_choose_cron/00_cron_import.sh" 9 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/01_choose_input.sh: -------------------------------------------------------------------------------- 1 | # Функция для подтверждения пользователя с вариантами "yes" и "no" 2 | input_concordance() { 3 | local prompt_message=" $1" 4 | local error_message=" Пожалуйста, введите «yes» или «no»" 5 | 6 | while true; do 7 | echo 8 | read -r -p " $prompt_message" user_input 9 | 10 | case "$user_input" in 11 | [yY]|[yY][eE]|[yY][eE][sS]|[нН]|[нН][уУ]|[нН][уУ][ыЫ]) return 0 ;; 12 | [nN]|[nN][oO]|[тТ]|[тТ][щЩ]) return 1 ;; 13 | *) 14 | echo 15 | echo " $error_message" 16 | continue 17 | ;; 18 | esac 19 | done 20 | } 21 | 22 | # Функция для выбора пользователя между "yes" и "no" с номерами 0 и 1 23 | input_concordance_list() { 24 | local prompt_message=" $1" 25 | local error_message=" ${yellow}Пожалуйста, выберите вариант, введя номер 0 (no) или 1 (yes).${reset}" 26 | 27 | echo 28 | echo -e "$prompt_message" 29 | echo " 0. No" 30 | echo " 1. Yes" 31 | 32 | while true; do 33 | echo 34 | read -r -p " Введите номер: " user_input 35 | 36 | case "$user_input" in 37 | 0) return 1 ;; 38 | 1) return 0 ;; 39 | *) 40 | echo 41 | echo -e " $error_message" 42 | continue 43 | ;; 44 | esac 45 | done 46 | } 47 | 48 | # Функция для ввода только буквенных символов 49 | input_letters() { 50 | local prompt_message=" ${1:-Введите буквы: }" 51 | local error_message=" ${2:-${red}Некорректный ввод.${reset} Цифровые выражения не принимаются, ${yellow}используйте буквы${reset}.}" 52 | 53 | while true; do 54 | read -r -p " $prompt_message" input 55 | if [[ "$input" =~ ^[a-zA-Z]+$ ]]; then 56 | echo 57 | echo " $input" 58 | break 59 | else 60 | echo 61 | echo -e " $error_message" 62 | fi 63 | done 64 | } 65 | 66 | # Функция для ввода только цифровых символов 67 | input_digits() { 68 | local prompt_message="${1:-Введите числа: }" 69 | local error_message="${2:-${red}Некорректный ввод.${reset} Буквенные выражения не принимаются, ${yellow}используйте цифры${reset}.}" 70 | 71 | while true; do 72 | read -r -p " $prompt_message" input 73 | input="${input//,/, }" 74 | if [[ "$input" =~ ^[0-9\ ,]+$ ]]; then 75 | echo 76 | echo "$input" 77 | break 78 | else 79 | echo 80 | echo -e " $error_message" 81 | fi 82 | done 83 | } 84 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/02_choose_geodata.sh: -------------------------------------------------------------------------------- 1 | # Функция для выбора вариантов GeoData 2 | choose_geodata() { 3 | local has_missing_geodata_bases=false 4 | local has_updatable_geodata_bases=false 5 | 6 | # Проверяем наличие и обновляемости GeoData баз 7 | [ "$geo_exists_geodata_v2fly" != "installed" ] && has_missing_geodata_bases=true 8 | [ "$geo_exists_geodata_antifilter" != "installed" ] && has_missing_geodata_bases=true 9 | [ "$geo_exists_geodata_antizapret" != "installed" ] && has_missing_geodata_bases=true 10 | [ "$geo_exists_geodata_v2fly" = "installed" ] || [ "$geo_exists_geodata_antifilter" = "installed" ] || [ "$geo_exists_geodata_antizapret" = "installed" ] && has_updatable_geodata_bases=true 11 | 12 | while true; do 13 | echo 14 | echo 15 | echo -e " Выберите номер или номера действий для ${yellow}GeoData${reset}" 16 | echo 17 | echo " 0. Пропустить" 18 | [ "$has_missing_geodata_bases" = true ] && echo " 1. Установить отсутствующие GeoData" || echo -e " 1. ${dark_gray}Все доступные GeoData установлены${reset}" 19 | [ "$has_updatable_geodata_bases" = true ] && echo " 2. Обновить установленные GeoData" || echo -e " 2. ${dark_gray}Нет доступных GeoData для обновления${reset}" 20 | 21 | [ "$geo_exists_geodata_v2fly" != "installed" ] && v2fly_choice="Установить" || v2fly_choice="Обновить" 22 | [ "$geo_exists_geodata_antifilter" != "installed" ] && antifilter_choice="Установить" || antifilter_choice="Обновить" 23 | [ "$geo_exists_geodata_antizapret" != "installed" ] && antizapret_choice="Установить" || antizapret_choice="Обновить" 24 | 25 | echo " 3. $v2fly_choice v2fly" 26 | echo " 4. $antifilter_choice AntiFilter" 27 | echo " 5. $antizapret_choice AntiZapret" 28 | 29 | [ "$has_updatable_geodata_bases" = true ] && echo " 99. Удалить все GeoData" || echo -e " 99. ${dark_gray}Нет установленных GeoData для удаления${reset}" 30 | echo 31 | 32 | local geodata_choices=$(input_digits "Ваш выбор: " "${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова") 33 | 34 | local invalid_choice=false 35 | for choice in $geodata_choices; do 36 | if ! [[ "$choice" =~ ^[0-9]+$ ]]; then 37 | echo -e " ${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова" 38 | invalid_choice=true 39 | break 40 | fi 41 | done 42 | 43 | for choice in $geodata_choices; do 44 | if [ "$choice" -eq 0 ]; then 45 | echo " Выполнен пропуск установки / обновления GeoData" 46 | return 47 | elif ([ "$choice" -eq 1 ] && [ "$has_missing_geodata_bases" = false ]); then 48 | echo -e " ${green}Все GeoData уже установлены${reset}" 49 | if input_concordance_list " Вы хотите обновить их?"; then 50 | install_v2fly_geodata=false 51 | install_antifilter_geodata=false 52 | install_antizapret_geodata=false 53 | update_v2fly_geodata=true 54 | update_antifilter_geodata=true 55 | update_antizapret_geodata=true 56 | break 57 | else 58 | invalid_choice=true 59 | break 60 | fi 61 | elif [ "$choice" -eq 2 ] && [ "$has_updatable_geodata_bases" = false ]; then 62 | echo -e " ${red}Нет установленных GeoData${reset} для обновления" 63 | if input_concordance_list " Вы хотите установить их?"; then 64 | install_v2fly_geodata=true 65 | install_antifilter_geodata=true 66 | install_antizapret_geodata=true 67 | update_v2fly_geodata=false 68 | update_antifilter_geodata=false 69 | update_antizapret_geodata=false 70 | break 71 | else 72 | invalid_choice=true 73 | break 74 | fi 75 | elif [ "$choice" -eq 99 ] && [ "$has_updatable_geodata_bases" = false ]; then 76 | echo -e " ${red}Нет установленных GeoData для удаления${reset}. Выберите другой пункт" 77 | invalid_choice=true 78 | break 79 | fi 80 | done 81 | 82 | if [ "$invalid_choice" = false ]; then 83 | install_v2fly_geodata=false 84 | install_antifilter_geodata=false 85 | install_antizapret_geodata=false 86 | update_v2fly_geodata=false 87 | update_antifilter_geodata=false 88 | update_antizapret_geodata=false 89 | chose_delete_geodata_v2fly_select=false 90 | chose_delete_geodata_antifilter_select=false 91 | chose_delete_geodata_antizapret_select=false 92 | 93 | for choice in $geodata_choices; do 94 | if [ "$choice" -eq 1 ]; then 95 | if [ "$has_missing_geodata_bases" = true ]; then 96 | install_v2fly_geodata=true 97 | install_antifilter_geodata=true 98 | install_antizapret_geodata=true 99 | else 100 | update_v2fly_geodata=true 101 | update_antifilter_geodata=true 102 | update_antizapret_geodata=true 103 | fi 104 | elif [ "$choice" -eq 2 ]; then 105 | install_v2fly_geodata=false 106 | install_antifilter_geodata=false 107 | install_antizapret_geodata=false 108 | update_v2fly_geodata=true 109 | update_antifilter_geodata=true 110 | update_antizapret_geodata=true 111 | elif [ "$choice" -eq 3 ]; then 112 | [ "$geo_exists_geodata_v2fly" != "installed" ] && install_v2fly_geodata=true || update_v2fly_geodata=true 113 | elif [ "$choice" -eq 4 ]; then 114 | [ "$geo_exists_geodata_antifilter" != "installed" ] && install_antifilter_geodata=true || update_antifilter_geodata=true 115 | elif [ "$choice" -eq 5 ]; then 116 | [ "$geo_exists_geodata_antizapret" != "installed" ] && install_antizapret_geodata=true || update_antizapret_geodata=true 117 | elif [ "$choice" -eq 99 ]; then 118 | chose_delete_geodata_v2fly_select=true 119 | chose_delete_geodata_antifilter_select=true 120 | chose_delete_geodata_antizapret_select=true 121 | fi 122 | done 123 | 124 | install_list="" 125 | update_list="" 126 | delete_list="" 127 | 128 | [ "$install_v2fly_geodata" = true ] && install_list="$install_list ${yellow}v2fly${reset}," 129 | [ "$install_antifilter_geodata" = true ] && install_list="$install_list ${yellow}AntiFilter${reset}," 130 | [ "$install_antizapret_geodata" = true ] && install_list="$install_list ${yellow}AntiZapret${reset}," 131 | [ "$update_v2fly_geodata" = true ] && update_list="$update_list ${yellow}v2fly${reset}," 132 | [ "$update_antifilter_geodata" = true ] && update_list="$update_list ${yellow}AntiFilter${reset}," 133 | [ "$update_antizapret_geodata" = true ] && update_list="$update_list ${yellow}AntiZapret${reset}," 134 | [ "$chose_delete_geodata_v2fly_select" = true ] && delete_list="$delete_list ${yellow}v2fly${reset}," 135 | [ "$chose_delete_geodata_antifilter_select" = true ] && delete_list="$delete_list ${yellow}AntiFilter${reset}," 136 | [ "$chose_delete_geodata_antizapret_select" = true ] && delete_list="$delete_list ${yellow}AntiZapret${reset}," 137 | 138 | if [ -n "$install_list" ]; then 139 | echo -e " Устанавливаются следующие GeoData: ${install_list%,}" 140 | fi 141 | 142 | if [ -n "$update_list" ]; then 143 | echo -e " Обновляются следующие GeoData: ${update_list%,}" 144 | fi 145 | 146 | if [ -n "$delete_list" ]; then 147 | echo -e " Удаляются следующие GeoData: ${delete_list%,}" 148 | fi 149 | 150 | [ "$install_v2fly_geodata" = "$update_v2fly_geodata" ] && chose_geodata_v2fly_select="$install_v2fly_geodata" 151 | [ "$install_antifilter_geodata" = "$update_antifilter_geodata" ] && chose_geodata_antifilter_select="$install_antifilter_geodata" 152 | [ "$install_antizapret_geodata" = "$update_antizapret_geodata" ] && chose_geodata_antizapret_select="$install_antizapret_geodata" 153 | 154 | export chose_delete_geodata_v2fly_select 155 | export chose_delete_geodata_antifilter_select 156 | export chose_delete_geodata_antizapret_select 157 | 158 | break 159 | fi 160 | done 161 | } 162 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/02_choose_geosite.sh: -------------------------------------------------------------------------------- 1 | # Функция для выбора вариантов GeoSite 2 | choose_geosite() { 3 | local has_missing_geosite_bases=false 4 | local has_updatable_geosite_bases=false 5 | 6 | # Проверяем наличие и обновляемость GeoSite баз 7 | [ "$geo_exists_geosite_v2fly" != "installed" ] && has_missing_geosite_bases=true 8 | [ "$geo_exists_geosite_antifilter" != "installed" ] && has_missing_geosite_bases=true 9 | [ "$geo_exists_geosite_antizapret" != "installed" ] && has_missing_geosite_bases=true 10 | ([ "$geo_exists_geosite_v2fly" = "installed" ] || [ "$geo_exists_geosite_antifilter" = "installed" ] || [ "$geo_exists_geosite_antizapret" = "installed" ]) && has_updatable_geosite_bases=true 11 | 12 | while true; do 13 | echo 14 | echo 15 | echo -e " Выберите номер или номера действий для ${yellow}GeoSite${reset}" 16 | echo 17 | echo " 0. Пропустить" 18 | [ "$has_missing_geosite_bases" = true ] && echo " 1. Установить отсутствующие GeoSite" || echo -e " 1. ${dark_gray}Все доступные GeoSite установлены${reset}" 19 | [ "$has_updatable_geosite_bases" = true ] && echo " 2. Обновить установленные GeoSite" || echo -e " 2. ${dark_gray}Нет доступных GeoSite для обновления${reset}" 20 | 21 | [ "$geo_exists_geosite_v2fly" != "installed" ] && v2fly_choice="Установить" || v2fly_choice="Обновить" 22 | [ "$geo_exists_geosite_antifilter" != "installed" ] && antifilter_choice="Установить" || antifilter_choice="Обновить" 23 | [ "$geo_exists_geosite_antizapret" != "installed" ] && antizapret_choice="Установить" || antizapret_choice="Обновить" 24 | 25 | echo " 3. $v2fly_choice v2fly" 26 | echo " 4. $antifilter_choice AntiFilter" 27 | echo " 5. $antizapret_choice AntiZapret" 28 | 29 | [ "$has_updatable_geosite_bases" = true ] && echo " 99. Удалить все GeoSite" || echo -e " 99. ${dark_gray}Нет установленных GeoSite для удаления${reset}" 30 | echo 31 | 32 | local geosite_choices=$(input_digits "Ваш выбор: " "${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова") 33 | 34 | local invalid_choice=false 35 | for choice in $geosite_choices; do 36 | if ! [[ "$choice" =~ ^[0-9]+$ ]]; then 37 | echo -e " ${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова" 38 | invalid_choice=true 39 | break 40 | fi 41 | done 42 | 43 | for choice in $geosite_choices; do 44 | if [ "$choice" -eq 0 ]; then 45 | echo " Выполнен пропуск установки / обновления GeoSite" 46 | return 47 | elif [ "$choice" -eq 1 ]; then 48 | if [ "$has_missing_geosite_bases" = false ]; then 49 | echo -e " Все GeoSite ${green}уже установлены${reset}" 50 | if input_concordance_list "Вы хотите обновить их?"; then 51 | update_v2fly_geosite=true 52 | update_antifilter_geosite=true 53 | update_antizapret_geosite=true 54 | break 55 | else 56 | invalid_choice=true 57 | break 58 | fi 59 | else 60 | if [ "$geo_exists_geosite_v2fly" != "installed" ]; then 61 | install_v2fly_geosite=true 62 | fi 63 | if [ "$geo_exists_geosite_antifilter" != "installed" ]; then 64 | install_antifilter_geosite=true 65 | fi 66 | if [ "$geo_exists_geosite_antizapret" != "installed" ]; then 67 | install_antizapret_geosite=true 68 | fi 69 | fi 70 | elif [ "$choice" -eq 2 ]; then 71 | if [ "$has_updatable_geosite_bases" = false ]; then 72 | echo -e " ${red}Нет установленных GeoSite${reset} для обновления" 73 | if input_concordance_list "Вы хотите установить их?"; then 74 | install_v2fly_geosite=true 75 | install_antifilter_geosite=true 76 | install_antizapret_geosite=true 77 | break 78 | else 79 | invalid_choice=true 80 | break 81 | fi 82 | else 83 | if [ "$geo_exists_geosite_v2fly" = "installed" ]; then 84 | update_v2fly_geosite=true 85 | fi 86 | if [ "$geo_exists_geosite_antifilter" = "installed" ]; then 87 | update_antifilter_geosite=true 88 | fi 89 | if [ "$geo_exists_geosite_antizapret" = "installed" ]; then 90 | update_antizapret_geosite=true 91 | fi 92 | fi 93 | elif [ "$choice" -eq 99 ]; then 94 | if [ "$has_updatable_geosite_bases" = false ]; then 95 | echo -e " ${red}Нет установленных GeoSite для удаления${reset}. Выберите другой пункт" 96 | invalid_choice=true 97 | break 98 | else 99 | chose_delete_geosite_v2fly_select=true 100 | chose_delete_geosite_antifilter_select=true 101 | chose_delete_geosite_antizapret_select=true 102 | fi 103 | elif [ "$choice" -eq 3 ]; then 104 | [ "$geo_exists_geosite_v2fly" != "installed" ] && install_v2fly_geosite=true || update_v2fly_geosite=true 105 | elif [ "$choice" -eq 4 ]; then 106 | [ "$geo_exists_geosite_antifilter" != "installed" ] && install_antifilter_geosite=true || update_antifilter_geosite=true 107 | elif [ "$choice" -eq 5 ]; then 108 | [ "$geo_exists_geosite_antizapret" != "installed" ] && install_antizapret_geosite=true || update_antizapret_geosite=true 109 | fi 110 | done 111 | 112 | install_list="" 113 | update_list="" 114 | delete_list="" 115 | 116 | [ "$install_v2fly_geosite" = true ] && install_list="$install_list ${yellow}v2fly${reset}," 117 | [ "$install_antifilter_geosite" = true ] && install_list="$install_list ${yellow}AntiFilter${reset}," 118 | [ "$install_antizapret_geosite" = true ] && install_list="$install_list ${yellow}AntiZapret${reset}," 119 | [ "$update_v2fly_geosite" = true ] && update_list="$update_list ${yellow}v2fly${reset}," 120 | [ "$update_antifilter_geosite" = true ] && update_list="$update_list ${yellow}AntiFilter${reset}," 121 | [ "$update_antizapret_geosite" = true ] && update_list="$update_list ${yellow}AntiZapret${reset}," 122 | [ "$chose_delete_geosite_v2fly_select" = true ] && delete_list="$delete_list ${yellow}v2fly${reset}," 123 | [ "$chose_delete_geosite_antifilter_select" = true ] && delete_list="$delete_list ${yellow}AntiFilter${reset}," 124 | [ "$chose_delete_geosite_antizapret_select" = true ] && delete_list="$delete_list ${yellow}AntiZapret${reset}," 125 | 126 | if [ -n "$install_list" ]; then 127 | echo -e " Устанавливаются следующие GeoSite: ${install_list%,}" 128 | fi 129 | 130 | if [ -n "$update_list" ]; then 131 | echo -e " Обновляются следующие GeoSite: ${update_list%,}" 132 | fi 133 | 134 | if [ -n "$delete_list" ]; then 135 | echo -e " Удаляются следующие GeoSite: ${delete_list%,}" 136 | fi 137 | break 138 | done 139 | } 140 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/03_choose_geoip.sh: -------------------------------------------------------------------------------- 1 | # Функция для выбора вариантов GeoIP 2 | choose_geoip() { 3 | local has_missing_geoip_bases=false 4 | local has_updatable_geoip_bases=false 5 | 6 | # Проверяем наличие и обновляемость GeoIP баз 7 | [ "$geo_exists_geoip_antifilter" != "installed" ] && has_missing_geoip_bases=true 8 | [ "$geo_exists_geoip_v2fly" != "installed" ] && has_missing_geoip_bases=true 9 | ([ "$geo_exists_geoip_antifilter" = "installed" ] || [ "$geo_exists_geoip_v2fly" = "installed" ]) && has_updatable_geoip_bases=true 10 | 11 | while true; do 12 | echo 13 | echo 14 | echo -e " Выберите номер или номера действий для ${yellow}GeoIP${reset}" 15 | echo 16 | echo " 0. Пропустить" 17 | [ "$has_missing_geoip_bases" = true ] && echo " 1. Установить отсутствующие GeoIP" || echo -e " 1. ${dark_gray}Все доступные GeoIP установлены${reset}" 18 | [ "$has_updatable_geoip_bases" = true ] && echo " 2. Обновить установленные GeoIP" || echo -e " 2. ${dark_gray}Нет доступных GeoIP для обновления${reset}" 19 | 20 | [ "$geo_exists_geoip_antifilter" != "installed" ] && antifilter_choice="Установить" || antifilter_choice="Обновить" 21 | [ "$geo_exists_geoip_v2fly" != "installed" ] && v2fly_choice="Установить" || v2fly_choice="Обновить" 22 | 23 | echo " 3. $antifilter_choice AntiFilter" 24 | echo " 4. $v2fly_choice v2fly" 25 | 26 | [ "$has_updatable_geoip_bases" = true ] && echo " 99. Удалить все GeoIP" || echo -e " 99. ${dark_gray}Нет установленных GeoIP для удаления${reset}" 27 | echo 28 | 29 | local geoip_choices=$(input_digits "Ваш выбор: " "${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова") 30 | 31 | local invalid_choice=false 32 | for choice in $geoip_choices; do 33 | if ! [[ "$choice" =~ ^[0-9]+$ ]]; then 34 | echo -e " ${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова" 35 | invalid_choice=true 36 | break 37 | fi 38 | done 39 | 40 | for choice in $geoip_choices; do 41 | if [ "$choice" -eq 0 ]; then 42 | echo " Выполнен пропуск установки / обновления GeoIP" 43 | return 44 | elif [ "$choice" -eq 1 ]; then 45 | if [ "$has_missing_geoip_bases" = false ]; then 46 | echo -e " Все GeoIP ${green}уже установлены${reset}" 47 | if input_concordance_list "Вы хотите обновить их?"; then 48 | install_antifilter_geoip=true 49 | install_v2fly_geoip=true 50 | break 51 | else 52 | invalid_choice=true 53 | break 54 | fi 55 | else 56 | if [ "$geo_exists_geoip_antifilter" != "installed" ]; then 57 | install_antifilter_geoip=true 58 | fi 59 | if [ "$geo_exists_geoip_v2fly" != "installed" ]; then 60 | install_v2fly_geoip=true 61 | fi 62 | fi 63 | elif [ "$choice" -eq 2 ]; then 64 | if [ "$has_updatable_geoip_bases" = false ]; then 65 | echo -e " ${red}Нет установленных GeoIP${reset} для обновления" 66 | if input_concordance_list "Вы хотите установить их?"; then 67 | install_antifilter_geoip=true 68 | install_v2fly_geoip=true 69 | break 70 | else 71 | invalid_choice=true 72 | break 73 | fi 74 | else 75 | if [ "$geo_exists_geoip_antifilter" = "installed" ]; then 76 | update_antifilter_geoip=true 77 | fi 78 | if [ "$geo_exists_geoip_v2fly" = "installed" ]; then 79 | update_v2fly_geoip=true 80 | fi 81 | fi 82 | elif [ "$choice" -eq 99 ]; then 83 | if [ "$has_updatable_geoip_bases" = false ]; then 84 | echo -e " ${red}Нет установленных GeoIP для удаления${reset}. Выберите другой пункт" 85 | invalid_choice=true 86 | break 87 | else 88 | chose_delete_geoip_antifilter_select=true 89 | chose_delete_geoip_v2fly_select=true 90 | fi 91 | elif [ "$choice" -eq 3 ]; then 92 | [ "$geo_exists_geoip_antifilter" != "installed" ] && install_antifilter_geoip=true || update_antifilter_geoip=true 93 | elif [ "$choice" -eq 4 ]; then 94 | [ "$geo_exists_geoip_v2fly" != "installed" ] && install_v2fly_geoip=true || update_v2fly_geoip=true 95 | fi 96 | done 97 | 98 | install_list="" 99 | update_list="" 100 | delete_list="" 101 | 102 | [ "$install_antifilter_geoip" = true ] && install_list="$install_list ${yellow}AntiFilter${reset}," 103 | [ "$install_v2fly_geoip" = true ] && install_list="$install_list ${yellow}v2fly${reset}," 104 | [ "$update_antifilter_geoip" = true ] && update_list="$update_list ${yellow}AntiFilter${reset}," 105 | [ "$update_v2fly_geoip" = true ] && update_list="$update_list ${yellow}v2fly${reset}," 106 | [ "$chose_delete_geoip_antifilter_select" = true ] && delete_list="$delete_list ${yellow}AntiFilter${reset}," 107 | [ "$chose_delete_geoip_v2fly_select" = true ] && delete_list="$delete_list ${yellow}v2fly${reset}," 108 | 109 | if [ -n "$install_list" ]; then 110 | echo -e " Устанавливаются следующие GeoIP: ${install_list%,}" 111 | fi 112 | 113 | if [ -n "$update_list" ]; then 114 | echo -e " Обновляются следующие GeoIP: ${update_list%,}" 115 | fi 116 | 117 | if [ -n "$delete_list" ]; then 118 | echo -e " Удаляются следующие GeoIP: ${delete_list%,}" 119 | fi 120 | break 121 | done 122 | } 123 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/04_choose_cron/00_cron_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей вопросов cron 2 | 3 | # Модули вопросов cron 4 | . "$xtools_dir/02_tools_choose/04_choose_cron/01_cron_status.sh" 5 | . "$xtools_dir/02_tools_choose/04_choose_cron/02_cron_time.sh" 6 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/04_choose_cron/01_cron_status.sh: -------------------------------------------------------------------------------- 1 | # Определение статуса для задач cron 2 | 3 | choose_update_cron() { 4 | local has_missing_cron_tasks=false 5 | local has_updatable_cron_tasks=false 6 | 7 | [ "$info_update_xkeen_cron" != "installed" ] && has_missing_cron_tasks=true 8 | [ "$info_update_xray_cron" != "installed" ] && has_missing_cron_tasks=true 9 | [ "$info_update_geosite_cron" != "installed" ] && has_missing_cron_tasks=true 10 | [ "$info_update_geoip_cron" != "installed" ] && has_missing_cron_tasks=true 11 | 12 | [ "$info_update_xkeen_cron" = "installed" ] || [ "$info_update_xray_cron" = "installed" ] || [ "$info_update_geosite_cron" = "installed" ] || [ "$info_update_geoip_cron" = "installed" ] && has_updatable_cron_tasks=true 13 | 14 | echo 15 | echo 16 | 17 | echo -e " Выберите номер или номера действий для ${yellow}автоматических обновлений${reset}" 18 | echo 19 | echo " 0. Пропустить" 20 | 21 | if [ "$has_missing_cron_tasks" = true ]; then 22 | echo " 1. Включить отсутствующие задачи автоматического обновления" 23 | else 24 | echo -e " 1. ${dark_gray}Все задачи автоматического обновления включены${reset}" 25 | fi 26 | 27 | if [ "$has_updatable_cron_tasks" = true ]; then 28 | echo " 2. Обновить включенные задачи автоматического обновления" 29 | else 30 | echo -e " 2. ${dark_gray}Нет включенных задач автоматического обновления${reset}" 31 | fi 32 | 33 | [ "$info_update_xkeen_cron" != "installed" ] && xkeen_choice="Включить" || xkeen_choice="Обновить" 34 | [ "$info_update_xray_cron" != "installed" ] && xray_choice="Включить" || xray_choice="Обновить" 35 | [ "$info_update_geosite_cron" != "installed" ] && geosite_choice="Включить" || geosite_choice="Обновить" 36 | [ "$info_update_geoip_cron" != "installed" ] && geoip_choice="Включить" || geoip_choice="Обновить" 37 | 38 | echo " 3. $xkeen_choice Xkeen" 39 | echo " 4. $xray_choice Xray" 40 | echo " 5. $geosite_choice GeoSite" 41 | echo " 6. $geoip_choice GeoIP" 42 | 43 | if [ "$has_updatable_cron_tasks" = true ]; then 44 | echo " 99. Выключить все" 45 | else 46 | echo -e " 99. ${dark_gray}Нет включенных задач для выключения${reset}" 47 | fi 48 | 49 | echo 50 | 51 | local update_choices=$(input_digits "Ваш выбор: " "${red}Некорректный номер действия. ${reset}Пожалуйста, выберите снова") 52 | 53 | local invalid_choice=false 54 | for choice in $update_choices; do 55 | if ! [[ "$choice" =~ ^[0-9]+$ ]]; then 56 | echo -e " ${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова" 57 | invalid_choice=true 58 | break 59 | fi 60 | done 61 | 62 | for choice in $update_choices; do 63 | case "$choice" in 64 | 0) 65 | chose_canel_cron_select=true 66 | ;; 67 | 1) 68 | if [ "$has_missing_cron_tasks" = true ]; then 69 | if [ "$info_update_xkeen_cron" = "not_installed" ]; then 70 | chose_xkeen_cron_select=true 71 | fi 72 | 73 | if [ "$info_update_xray_cron" = "not_installed" ]; then 74 | chose_xray_cron_select=true 75 | fi 76 | 77 | if [ "$info_update_geosite_cron" = "not_installed" ]; then 78 | chose_geosite_cron_select=true 79 | fi 80 | 81 | if [ "$info_update_geoip_cron" = "not_installed" ]; then 82 | chose_geoip_cron_select=true 83 | fi 84 | 85 | if input_concordance_list "Хотите установить единое время для ${yellow}всех${reset} обновлений?"; then 86 | chose_all_cron_select=true 87 | chose_xkeen_cron_select=false 88 | chose_xray_cron_select=false 89 | chose_geosite_cron_select=false 90 | chose_geoip_cron_select=false 91 | else 92 | chose_all_cron_select=false 93 | fi 94 | else 95 | if [ "$has_updatable_cron_tasks" = true ]; then 96 | echo " Все задачи автоматического обновления уже включены" 97 | if input_concordance_list "Хотите обновить задачи?"; then 98 | if input_concordance_list "Хотите установить единое время для ${yellow}всех${reset} обновлений?"; then 99 | chose_all_cron_select=true 100 | chose_xkeen_cron_select=false 101 | chose_xray_cron_select=false 102 | chose_geosite_cron_select=false 103 | chose_geoip_cron_select=false 104 | else 105 | chose_all_cron_select=false 106 | chose_xkeen_cron_select=true 107 | chose_xray_cron_select=true 108 | chose_geosite_cron_select=true 109 | chose_geoip_cron_select=true 110 | fi 111 | else 112 | choose_update_cron 113 | fi 114 | fi 115 | fi 116 | ;; 117 | 2) 118 | if [ "$has_updatable_cron_tasks" = true ]; then 119 | if [ "$info_update_xkeen_cron" = "installed" ]; then 120 | chose_xkeen_cron_select=true 121 | fi 122 | 123 | if [ "$info_update_xray_cron" = "installed" ]; then 124 | chose_xray_cron_select=true 125 | fi 126 | 127 | if [ "$info_update_geosite_cron" = "installed" ]; then 128 | chose_geosite_cron_select=true 129 | fi 130 | 131 | if [ "$info_update_geoip_cron" = "installed" ]; then 132 | chose_geoip_cron_select=true 133 | fi 134 | 135 | if input_concordance_list "Хотите установить единое время для ${yellow}всех${reset} обновлений?"; then 136 | chose_all_cron_select=true 137 | chose_xkeen_cron_select=false 138 | chose_xray_cron_select=false 139 | chose_geosite_cron_select=false 140 | chose_geoip_cron_select=false 141 | else 142 | chose_all_cron_select=false 143 | fi 144 | 145 | echo -e " Будут обновлены ${green}включенные${reset} задачи автоматического обновления" 146 | else 147 | echo -e " У Вас ${yellow}нет включенных${reset} задач автоматического обновления" 148 | if input_concordance_list "Хотите включить все задачи автоматического обновления?"; then 149 | if input_concordance_list "Хотите установить единое время для всех задач?"; then 150 | chose_all_cron_select=true 151 | else 152 | chose_all_cron_select=false 153 | fi 154 | else 155 | choose_update_cron 156 | fi 157 | fi 158 | ;; 159 | 3) 160 | if [ "$info_update_xkeen_cron" = "installed" ]; then 161 | chose_xkeen_cron_select=true 162 | echo -e " Будет выполнено обновление задачи ${yellow}xkeen${reset}" 163 | else 164 | chose_xkeen_cron_select=true 165 | echo -e " Будет выполнено включение задачи ${yellow}xkeen${reset}" 166 | fi 167 | ;; 168 | 4) 169 | if [ "$info_update_xray_cron" = "installed" ]; then 170 | chose_xray_cron_select=true 171 | echo -e " Будет выполнено обновление задачи ${yellow}xray${reset}" 172 | else 173 | chose_xray_cron_select=true 174 | echo -e " Будет выполнено включение задачи ${yellow}xray${reset}" 175 | fi 176 | ;; 177 | 5) 178 | if [ "$info_update_geosite_cron" = "installed" ]; then 179 | chose_geosite_cron_select=true 180 | echo -e " Будет выполнено обновление задачи ${yellow}GeoSite${reset}" 181 | else 182 | chose_geosite_cron_select=true 183 | echo -e " Будет выполнено включение задачи ${yellow}GeoSite${reset}" 184 | fi 185 | ;; 186 | 6) 187 | if [ "$info_update_geoip_cron" = "installed" ]; then 188 | chose_geoip_cron_select=true 189 | echo -e " Будет выполнено обновление задачи ${yellow}GeoIP${reset}" 190 | else 191 | chose_geoip_cron_select=true 192 | echo -e " Будет выполнено включение задачи ${yellow}GeoIP${reset}" 193 | fi 194 | ;; 195 | 99) 196 | if [ "$has_updatable_cron_tasks" = true ]; then 197 | chose_delete_all_cron_select=true 198 | echo " Будут выключены все задачи автоматического обновления" 199 | else 200 | echo -e " У Вас ${yellow}нет включенных задач ${reset} для выключения" 201 | fi 202 | ;; 203 | *) 204 | echo -e " ${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова" 205 | ;; 206 | esac 207 | done 208 | } 209 | -------------------------------------------------------------------------------- /_xkeen/04_tools/02_tools_choose/04_choose_cron/02_cron_time.sh: -------------------------------------------------------------------------------- 1 | # Определение времени для задач cron 2 | 3 | choose_cron_time() { 4 | for task in xkeen xray geosite geoip all; do 5 | task_var="chose_${task}_cron_select" 6 | time_var="chose_${task}_cron_time" 7 | 8 | if [ "$(eval echo \${$task_var})" = true ]; then 9 | echo 10 | if [ "$task" = "all" ]; then 11 | echo -e " Время автоматического обновления для ${yellow}всех${reset} задач:" 12 | else 13 | echo -e " Время автоматического обновления ${yellow}$task${reset}:" 14 | fi 15 | echo 16 | echo " Выберите день" 17 | echo " 0. Отмена" 18 | echo " 1. Понедельник" 19 | echo " 2. Вторник" 20 | echo " 3. Среда" 21 | echo " 4. Четверг" 22 | echo " 5. Пятница" 23 | echo " 6. Суббота" 24 | echo " 7. Воскресенье" 25 | echo " 8. Ежедневно" 26 | echo 27 | 28 | local day_choice 29 | while true; do 30 | read -p " Ваш выбор: " day_choice 31 | if [[ "$day_choice" =~ ^[0-8]$ ]]; then 32 | break 33 | else 34 | echo -e " ${red}Некорректный номер действия.${reset} Пожалуйста, выберите снова" 35 | fi 36 | done 37 | 38 | if [ "$day_choice" -eq 0 ]; then 39 | echo -e " Включение автоматического обновления ${yellow}$task${reset} отменено." 40 | else 41 | if [ "$day_choice" -eq 8 ]; then 42 | echo 43 | read -p " Выберите час (0-23): " hour 44 | while [[ ! "$hour" =~ ^[0-9]+$ || "$hour" -lt 0 || "$hour" -gt 23 ]]; do 45 | echo -e " ${red}Некорректный час.${reset} Пожалуйста, попробуйте снова" 46 | read -p " Введите значение от 0 до 23: " hour 47 | done 48 | 49 | read -p " Выберите минуту (0-59): " minute 50 | while [[ ! "$minute" =~ ^[0-9]+$ || "$minute" -lt 0 || "$minute" -gt 59 ]]; do 51 | echo -e " ${red}Некорректные минуты.${reset} Пожалуйста, попробуйте снова" 52 | read -p " Введите значение от 0 до 59: " minute 53 | done 54 | 55 | cron_expression="$minute $hour * * *" 56 | cron_display="$minute $hour * * *" 57 | else 58 | echo 59 | read -p " Выберите час (0-23): " hour 60 | while [[ ! "$hour" =~ ^[0-9]+$ || "$hour" -lt 0 || "$hour" -gt 23 ]]; do 61 | echo -e " ${red}Некорректный час.${reset} Пожалуйста, попробуйте снова" 62 | read -p " Введите значение от 0 до 23: " hour 63 | done 64 | 65 | read -p " Выберите минуту (0-59): " minute 66 | while [[ ! "$minute" =~ ^[0-9]+$ || "$minute" -lt 0 || "$minute" -gt 59 ]]; do 67 | echo -e " ${red}Некорректные минуты.${reset} Пожалуйста, попробуйте снова" 68 | read -p " Введите значение от 0 до 59: " minute 69 | done 70 | 71 | case "$day_choice" in 72 | 1) day_of_week="1" ;; 73 | 2) day_of_week="2" ;; 74 | 3) day_of_week="3" ;; 75 | 4) day_of_week="4" ;; 76 | 5) day_of_week="5" ;; 77 | 6) day_of_week="6" ;; 78 | 7) day_of_week="0" ;; 79 | esac 80 | 81 | cron_expression="$minute $hour * * $day_of_week" 82 | cron_display="$minute $hour * * $day_of_week" 83 | fi 84 | 85 | formatted_hour=$(printf "%02d" "$hour") 86 | formatted_minute=$(printf "%02d" "$minute") 87 | 88 | day_name="" 89 | case "$day_choice" in 90 | 0) day_name="Отмена" ;; 91 | 1) day_name="Понедельник" ;; 92 | 2) day_name="Вторник" ;; 93 | 3) day_name="Среда" ;; 94 | 4) day_name="Четверг" ;; 95 | 5) day_name="Пятница" ;; 96 | 6) day_name="Суббота" ;; 97 | 7) day_name="Воскресенье" ;; 98 | 8) day_name="Ежедневно" ;; 99 | esac 100 | 101 | if [ "$task" = "all" ]; then 102 | echo 103 | echo -e " Выбранное время автоматического обновления для ${yellow}всех${reset} задач: $day_name в $formatted_hour:$formatted_minute" 104 | else 105 | echo 106 | echo -e " Выбранное время автоматического обновления ${yellow}$task${reset}: $day_name в $formatted_hour:$formatted_minute" 107 | fi 108 | 109 | eval "${time_var}='$cron_expression'" 110 | fi 111 | fi 112 | done 113 | } 114 | -------------------------------------------------------------------------------- /_xkeen/04_tools/03_tools_backups/00_backups_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей резервного копирования 2 | 3 | # Модули резервного копирования 4 | . "$xtools_dir/03_tools_backups/01_backups_xray.sh" 5 | . "$xtools_dir/03_tools_backups/02_backups_xkeen.sh" 6 | . "$xtools_dir/03_tools_backups/02_backups_configs.sh" 7 | 8 | -------------------------------------------------------------------------------- /_xkeen/04_tools/03_tools_backups/01_backups_xray.sh: -------------------------------------------------------------------------------- 1 | # Создание резервной копии Xray 2 | backup_xray() { 3 | if [ "$xray_installed" = "installed" ]; then 4 | local backup_filename="${current_datetime}_xray_v${xray_current_version}" 5 | cp "$install_dir/xray" "$backups_dir/$backup_filename" 6 | 7 | # Проверка успешности создания резервной копии 8 | if [ $? -eq 0 ]; then 9 | echo -e " Резервная копия Xray создана: ${yellow}$backup_filename${reset}" 10 | else 11 | echo -e " ${red}Ошибка${reset} при создании резервной копии Xray" 12 | fi 13 | else 14 | echo -e " ${dark_gray}Xray не установлен.${reset} Создание резервной копии невозможно" 15 | fi 16 | } 17 | 18 | # Восстановление резервной копии Xray 19 | restore_backup_xray() { 20 | local latest_backup=$(ls -t "$backups_dir" | grep "xray" | head -n 1) 21 | 22 | if [ -n "$latest_backup" ]; then 23 | backup_path="$backups_dir/$latest_backup" 24 | cp "$backup_path" "$install_dir/xray" 2>/dev/null 25 | 26 | # Проверка успешности восстановления резервной копии 27 | if [ $? -eq 0 ]; then 28 | echo -e " Xray ${green}успешно восстановлен${reset} из резервной копии" 29 | else 30 | echo -e " ${red}Ошибка${reset} при восстановлении Xray из резервной копии" 31 | fi 32 | else 33 | echo -e " ${dark_gray}Нет доступных резервных копий Xray${reset}" 34 | fi 35 | } 36 | -------------------------------------------------------------------------------- /_xkeen/04_tools/03_tools_backups/02_backups_configs.sh: -------------------------------------------------------------------------------- 1 | # Работа с резервными копиями конфигураций 2 | 3 | # Создание резервной копии конфигураций Xray 4 | backup_configs() { 5 | local backup_filename="${current_datetime}_configs" 6 | local backup_configs_dir="$backups_dir/$backup_filename" 7 | mkdir -p "$backup_configs_dir" 8 | 9 | # Копирование всех файлов конфигураций в резервную копию 10 | cp -r "$install_conf_dir"/* "$backup_configs_dir/" 11 | 12 | if [ $? -eq 0 ]; then 13 | echo -e " Резервная копия конфигураций Xray создана: ${yellow}$backup_filename${reset}" 14 | else 15 | echo -e " ${red}Ошибка при создании резервной копии конфигураций Xray${reset}" 16 | fi 17 | } 18 | 19 | 20 | 21 | restore_backup_configs() { 22 | # Найти самую последнюю резервную копию конфигураций 23 | local latest_backup=$(ls -t "$backups_dir" | grep "configs" | head -n 1) 24 | 25 | if [ -n "$latest_backup" ]; then 26 | backup_path="$backups_dir/$latest_backup" 27 | 28 | # Восстановление конфигураций из резервной копии в текущую директорию конфигураций 29 | cp -r "$backup_path"/* "$install_conf_dir/" 30 | 31 | echo -e " Конфигурации ${green}успешно восстановлены${reset} из резервной копии." 32 | fi 33 | } 34 | -------------------------------------------------------------------------------- /_xkeen/04_tools/03_tools_backups/02_backups_xkeen.sh: -------------------------------------------------------------------------------- 1 | # Работа с резервными копиями Xkeen 2 | 3 | # Создание резервной копии Xkeen 4 | backup_xkeen() { 5 | local backup_dir="${backups_dir}/${current_datetime}_xkeen_v${xkeen_current_version}" 6 | mkdir -p "$backup_dir" 7 | 8 | # Копирование конфигурации и файлов Xkeen в резервную копию 9 | cp -r "$install_dir/.xkeen" "$install_dir/xkeen" "$backup_dir/" 10 | 11 | # Переименование скрытой директории .xkeen в _xkeen в резервной копии 12 | mv "$backup_dir/.xkeen" "$backup_dir/_xkeen" 13 | 14 | if [ $? -eq 0 ]; then 15 | echo -e " Резервная копия Xkeen создана: ${yellow}${current_datetime}_xkeen_v${xkeen_current_version}${reset}" 16 | else 17 | echo -e " ${red}Ошибка при создании резервной копии Xkeen.${reset}" 18 | fi 19 | } 20 | 21 | 22 | 23 | restore_backup_xkeen() { 24 | restore_script=$(mktemp) 25 | cat < "$restore_script" 26 | #!/bin/sh 27 | 28 | latest_backup_dir=\$(ls -t -d "$backups_dir"/*xkeen* | head -n 1) 29 | 30 | if [ -n "\$latest_backup_dir" ]; then 31 | cp -r "\$latest_backup_dir"/_xkeen "$install_dir/" 32 | if [ \$? -eq 0 ]; then 33 | cp -f "\$latest_backup_dir"/xkeen "$install_dir/" 34 | if [ \$? -eq 0 ]; then 35 | if [ -d "$install_dir/_xkeen" ]; then 36 | if [ -d "$install_dir/.xkeen" ]; then 37 | rm -rf "$install_dir/.xkeen" 38 | fi 39 | mv "$install_dir/_xkeen" "$install_dir/.xkeen" 40 | echo " Резервная копия Xkeen успешно восстановлена." 41 | fi 42 | else 43 | echo " Не удалось скопировать xkeen." 44 | fi 45 | else 46 | echo " Не удалось скопировать _xkeen." 47 | fi 48 | else 49 | echo " Подходящая резервная копия Xkeen не найдена." 50 | fi 51 | 52 | # Удаление временного скрипта 53 | rm "\$0" 54 | eof 55 | 56 | chmod +x "$restore_script" 57 | "$restore_script" 58 | } 59 | -------------------------------------------------------------------------------- /_xkeen/04_tools/04_tools_downloaders/00_downloaders_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей загрузки 2 | 3 | # Модули загрузки 4 | . "$xtools_dir/04_tools_downloaders/01_downloaders_xray.sh" 5 | . "$xtools_dir/04_tools_downloaders/02_donwloaders_xkeen.sh" 6 | -------------------------------------------------------------------------------- /_xkeen/04_tools/04_tools_downloaders/01_downloaders_xray.sh: -------------------------------------------------------------------------------- 1 | # Загрузка Xray 2 | 3 | download_xray() { 4 | # Получение URL для загрузки последней версии Xray с помощью cURL и jq 5 | download_url=$(curl -s "$xray_api_url" | jq -r --arg arch "$architecture" '.assets[] | select(.name | endswith("linux-"+$arch + ".zip")) | .browser_download_url') 6 | 7 | # Если URL для загрузки доступен 8 | if [ -n "$download_url" ]; then 9 | filename=$(basename "$download_url") 10 | extension="${filename##*.}" 11 | 12 | # Создание временной директории для загрузки файла 13 | mkdir -p "$tmp_dir" 14 | 15 | echo -e " ${yellow}Выполняется загрузка${reset} последней версии Xray" 16 | 17 | # Загрузка файла с использованием cURL и сохранение его во временной директории 18 | curl -L -o "$tmp_dir/$filename" "$download_url" &> /dev/null 19 | 20 | # Если файл был успешно загружен 21 | if [ -e "$tmp_dir/$filename" ]; then 22 | mv "$tmp_dir/$filename" "$tmp_dir/xray.$extension" 23 | echo -e " Xray ${green}успешно загружен${reset}" 24 | else 25 | echo -e " ${red}Ошибка${reset} при загрузке файла" 26 | fi 27 | else 28 | echo -e " ${red}Ошибка${reset}: Не удалось получить URL для загрузки Xray" 29 | fi 30 | } 31 | -------------------------------------------------------------------------------- /_xkeen/04_tools/04_tools_downloaders/02_donwloaders_xkeen.sh: -------------------------------------------------------------------------------- 1 | # Загрузка xkeen 2 | 3 | download_xkeen() { 4 | # Получение URL для загрузки последней версии xkeen с помощью cURL и grep 5 | download_url=$(curl -s "$xkeen_api_url" | grep -o '"browser_download_url": "[^"]*' | grep -o 'https://[^"]*') 6 | 7 | # Если URL для загрузки доступен 8 | if [ -n "$download_url" ]; then 9 | filename=$(basename "$download_url") 10 | extension="${filename##*.}" 11 | 12 | # Создание временной директории для загрузки файла 13 | mkdir -p "$tmp_dir" 14 | 15 | echo -e " ${yellow}Выполняется загрузка${reset} последней версии xkeen" 16 | 17 | # Загрузка файла с использованием cURL и сохранение его во временной директории 18 | curl -L -o "/tmp/$filename" "$download_url" &> /dev/null 19 | 20 | # Если файл был успешно загружен 21 | if [ -e "/tmp/$filename" ]; then 22 | mv "/tmp/$filename" "$tmp_dir/xkeen.$extension" 23 | echo -e " Xkeen ${green}успешно загружен${reset}" 24 | fi 25 | else 26 | echo -e " ${red}Ошибка${reset}: Не удалось получить URL для загрузки xkeen" 27 | fi 28 | } 29 | -------------------------------------------------------------------------------- /_xkeen/04_tools/05_tools_archive.sh: -------------------------------------------------------------------------------- 1 | # Архивирование xkeen для релиза 2 | archive_xkeen() { 3 | # Создаем временную директорию 4 | cp -r "$install_dir/.xkeen" "$tmp_dir" 5 | cp "$install_dir/xkeen" "$tmp_dir" 6 | mv "$tmp_dir/.xkeen" "$tmp_dir/_xkeen" 7 | 8 | # Создаем директорию релизов 9 | mkdir -p "$releases_dir" || { echo "Ошибка: Не удалось создать директорию $releases_dir"; exit 1; } 10 | 11 | # Создаем архив 12 | tar -cf "$tmp_dir/xkeen_v$xkeen_current_version.tar" -C "$tmp_dir" _xkeen xkeen 13 | 14 | # Перемещаем архив в директорию релизов 15 | mv "$tmp_dir/xkeen_v$xkeen_current_version.tar" "$releases_dir" 16 | 17 | # Удаляем временные файлы 18 | rm -r "$tmp_dir/_xkeen" 19 | rm "$tmp_dir/xkeen" 20 | } -------------------------------------------------------------------------------- /_xkeen/04_tools/05_tools_cpu-keyword.sh: -------------------------------------------------------------------------------- 1 | # Функция для генерации ключевых слов на основе архитектуры 2 | generate_keyword() { 3 | local architecture="$1" 4 | local model_name="$2" 5 | local generated_keyword 6 | 7 | # Сравниваем комбинацию архитектуры и модели процессора 8 | case "$(echo "$architecture$model_name" | tr '[:upper:]' '[:lower:]')" in 9 | *"aarch64"* | *"cortex-a53"*) 10 | generated_keyword="aarch64_cortex-a53" 11 | ;; 12 | *"aarch64"* | *"cortex-a72"*) 13 | generated_keyword="aarch64_cortex-a72" 14 | ;; 15 | *"aarch64"* | *"generic"*) 16 | generated_keyword="aarch64_generic" 17 | ;; 18 | *"arm"* | *"arm1176jzf-s"* | *"vfp"*) 19 | generated_keyword="arm_arm1176jzf-s_vfp" 20 | ;; 21 | *"arm"* | *"cortex-a15"* | *"neon-vfpv4"*) 22 | generated_keyword="arm_cortex-a15_neon-vfpv4" 23 | ;; 24 | *"arm"* | *"cortex-a5"* | *"vfpv4"*) 25 | generated_keyword="arm_cortex-a5_vfpv4" 26 | ;; 27 | *"arm"* | *"cortex-a7"* | *"neon-vfpv4"*) 28 | generated_keyword="arm_cortex-a7_neon-vfpv4" 29 | ;; 30 | *"arm"* | *"cortex-a8"* | *"vfpv3"* | *"cortex-a9"* | *"vfpv3-d16"* | *"mpcore"*) 31 | generated_keyword="arm_generic" 32 | ;; 33 | *"i386"* | *"pentium-mmx"*) 34 | generated_keyword="i386_pentium-mmx" 35 | ;; 36 | *"i386"* | *"pentium4"*) 37 | generated_keyword="i386_pentium4" 38 | ;; 39 | *"mipsel"* | *"24"*) 40 | generated_keyword="mipsel_24kc" 41 | ;; 42 | *"mipsel"* | *"74"*) 43 | generated_keyword="mipsel_74kc" 44 | ;; 45 | *"mipsel"* | *"mips32"*) 46 | generated_keyword="mipsel_mips32" 47 | ;; 48 | *"mips"* | *"24"*) 49 | generated_keyword="mips_24kc" 50 | ;; 51 | *"mips"* | *"mips32"*) 52 | generated_keyword="mips_mips32" 53 | ;; 54 | *) 55 | generated_keyword="" 56 | echo "[error] Не удалось сгенерировать ключевое слово для архитектуры и модели процессора." >> "$xkeen_error_log" 57 | ;; 58 | esac 59 | 60 | echo "$generated_keyword" 61 | } -------------------------------------------------------------------------------- /_xkeen/04_tools/06_tools_archive.sh: -------------------------------------------------------------------------------- 1 | # Архивирование xkeen для релиза 2 | archive_xkeen() { 3 | # Создаем временную директорию 4 | cp -r "$install_dir/.xkeen" "$tmp_dir" 5 | cp "$install_dir/xkeen" "$tmp_dir" 6 | mv "$tmp_dir/.xkeen" "$tmp_dir/_xkeen" 7 | 8 | # Создаем директорию релизов 9 | mkdir -p "$releases_dir" || { echo "Ошибка: Не удалось создать директорию $releases_dir"; exit 1; } 10 | 11 | # Создаем архив 12 | tar -cf "$tmp_dir/xkeen_v$xkeen_current_version.tar" -C "$tmp_dir" _xkeen xkeen 13 | 14 | # Перемещаем архив в директорию релизов 15 | mv "$tmp_dir/xkeen_v$xkeen_current_version.tar" "$releases_dir" 16 | 17 | # Удаляем временные файлы 18 | rm -r "$tmp_dir/_xkeen" 19 | rm "$tmp_dir/xkeen" 20 | } -------------------------------------------------------------------------------- /_xkeen/05_tests/00_tests_import.sh: -------------------------------------------------------------------------------- 1 | # Импорт модулей тестирования 2 | 3 | # Модули тестирования 4 | . "$xtests_dir/01_tests_connected.sh" 5 | . "$xtests_dir/02_tests_xports.sh" 6 | #. "$xtests_dir/03_test_arch-simulate.sh" -------------------------------------------------------------------------------- /_xkeen/05_tests/01_tests_connected.sh: -------------------------------------------------------------------------------- 1 | tests_connection() { 2 | local result=1 3 | 4 | # Проверка соединения с google.com 5 | if ping -c 4 google.com > /dev/null 2>&1; then 6 | result=0 7 | else 8 | echo -e " ${red}Ошибка:${reset} Не удалось пинговать google.com." 9 | fi 10 | 11 | # Проверка соединения с yandex.ru 12 | if ping -c 4 yandex.ru > /dev/null 2>&1; then 13 | result=0 14 | else 15 | echo -e " ${red}Ошибка:${reset} Не удалось пинговать yandex.ru." 16 | fi 17 | 18 | # Проверяем код завершения функции и выводим сообщение 19 | if [ $result -eq 0 ]; then 20 | echo -e " Интернет-соединение ${green}работает${reset} " 21 | else 22 | echo -e " ${red}Отсутствует${reset} интернет-соединение " 23 | fi 24 | 25 | break 26 | } 27 | -------------------------------------------------------------------------------- /_xkeen/05_tests/02_tests_ports.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /_xkeen/05_tests/02_tests_xports.sh: -------------------------------------------------------------------------------- 1 | # Определение на каких портах слушает Xray 2 | tests_ports_xray() { 3 | local app_name="xray" 4 | local listening_ports_tcp 5 | local listening_ports_udp 6 | local output=" Xray ${green}слушает${reset}" 7 | 8 | listening_ports_tcp=$(netstat -ltunp | grep "$app_name" | grep "tcp") 9 | listening_ports_udp=$(netstat -ltunp | grep "$app_name" | grep "udp") 10 | 11 | if [ -n "$listening_ports_tcp" ] || [ -n "$listening_ports_udp" ]; then 12 | local printed=false 13 | IFS=$'\n' 14 | for line in $listening_ports_tcp $listening_ports_udp; do 15 | gateway=$(echo "$line" | awk '{print $4}' | cut -d':' -f1) 16 | port=$(echo "$line" | awk '{print $4}' | cut -d':' -f2) 17 | protocol="" 18 | if [ -n "$(echo "$line" | grep "tcp")" ]; then 19 | protocol="TCP" 20 | fi 21 | if [ -n "$(echo "$line" | grep "udp")" ]; then 22 | if [ -n "$protocol" ]; then 23 | protocol="${protocol} и UDP" 24 | else 25 | protocol="UDP" 26 | fi 27 | fi 28 | if [ "$printed" = false ]; then 29 | echo -e "$output" 30 | printed=true 31 | fi 32 | echo -e "\n ${dark_gray}Шлюз${reset} $gateway\n ${dark_gray}Порт${reset} $port\n ${dark_gray}Протокол${reset} $protocol" 33 | done 34 | else 35 | echo -e " $app_name ${red}не слушает${reset} на каких-либо портах" 36 | fi 37 | 38 | break 39 | } 40 | -------------------------------------------------------------------------------- /_xkeen/05_tests/03_test_arch-simulate.sh: -------------------------------------------------------------------------------- 1 | # Функция для вывода прослушиваемых портов для указанного приложения 2 | tests_arch_aarch64() { 3 | echo "Architecture: aarch64" 4 | echo " CPU op-mode(s): 32-bit, 64-bit" 5 | echo " Byte Order: Little Endian" 6 | echo "CPU(s): 2" 7 | echo " On-line CPU(s) list: 0,1" 8 | echo "Vendor ID: ARM" 9 | echo " Model name: Cortex-A53" 10 | echo " Model: 4" 11 | echo " Thread(s) per core: 1" 12 | echo " Core(s) per cluster: 2" 13 | echo " Socket(s): -" 14 | echo " Cluster(s): 1" 15 | echo " Stepping: r0p4" 16 | echo " CPU(s) scaling MHz: 100%" 17 | echo " CPU max MHz: 1350.0000" 18 | echo " CPU min MHz: 300.0000" 19 | echo " BogoMIPS: 25.00" 20 | echo " Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32" 21 | echo "Caches (sum of all):" 22 | echo " L1d: 64 KiB (2 instances)" 23 | echo " L1i: 64 KiB (2 instances)" 24 | echo " L2: 512 KiB (1 instance)" 25 | } 26 | 27 | tests_arch_mips_1024kc() { 28 | echo "Architecture: mips" 29 | echo " Byte Order: Little Endian" 30 | echo "CPU(s): 4" 31 | echo " On-line CPU(s) list: 0-3" 32 | echo "Model name: -" 33 | echo " Model: MIPS 1004Kc V2.15" 34 | echo " Thread(s) per core: 2" 35 | echo " Core(s) per socket: 2" 36 | echo " Socket(s): 1" 37 | echo " BogoMIPS: 583.68" 38 | echo " Flags: mips16 dsp mt" 39 | } 40 | 41 | tests_arch_mips_24kec() { 42 | echo "Architecture: mips" 43 | echo " Byte Order: Little Endian" 44 | echo "CPU(s): 1" 45 | echo " On-line CPU(s) list: 0" 46 | echo "Model name: -" 47 | echo " Model: MIPS 24KEc V5.5" 48 | echo " Thread(s) per core: 1" 49 | echo " Core(s) per socket: 1" 50 | echo " Socket(s): 1" 51 | echo " BogoMIPS: 385.02" 52 | echo " Flags: mips16 dsp" 53 | } 54 | 55 | # Проверка модели и архитектуры процессора для тестов 56 | info_cpu_test() { 57 | info_model_raw=$(tests_arch_mips_1024kc | awk '/Model name:/ { sub(/^Model name:\s*/, ""); print }' | tr '[:upper:]' '[:lower:]' | tr ' ' '_') # Получаем информацию об архитектуре и модели процессора из тестовых данных и приводим ее к нужному формату 58 | info_model_raw2=$(tests_arch_mips_1024kc | awk '/Model:/ { sub(/^Model:\s*/, ""); print }' | tr '[:upper:]' '[:lower:]' | tr ' ' '_') # Получаем информацию о модели процессора из тестовых данных и приводим ее к нужному формату 59 | 60 | # Проверяем "Model name" на соответствие наборам инструкций 61 | if [[ "$info_model_raw" == *"mips1004"* || "$info_model_raw" == *"mips_1004"* ]]; then 62 | architecture="mipsel_24kc" 63 | elif [[ "$info_model_raw" == *"mips34"* || "$info_model_raw" == *"mips_34"* ]]; then 64 | architecture="mipsel_74kc" 65 | elif [[ "$info_model_raw" == *"mips24"* || "$info_model_raw" == *"mips_24"* ]]; then 66 | architecture="mipsel_74kc" 67 | elif [[ "$info_model_raw" == *"cortex-a53"* || "$info_model_raw" == *"cortex_a53"* ]]; then 68 | architecture="cortex-a53" 69 | else 70 | # Если совпадений в "Model name" нет, проверяем "Model" 71 | if [[ "$info_model_raw2" == *"mips1004"* || "$info_model_raw2" == *"mips_1004"* ]]; then 72 | architecture="mipsel_24kc" 73 | elif [[ "$info_model_raw2" == *"mips34"* || "$info_model_raw2" == *"mips_34"* ]]; then 74 | architecture="mipsel_74kc" 75 | elif [[ "$info_model_raw2" == *"mips24"* || "$info_model_raw2" == *"mips_24"* ]]; then 76 | architecture="mipsel_74kc" 77 | elif [[ "$info_model_raw2" == *"cortex-a53"* || "$info_model_raw2" == *"cortex_a53"* ]]; then 78 | architecture="cortex-a53" 79 | fi 80 | 81 | if [ "$architecture" == "" ]; then 82 | echo "[error] Не удалось сгенерировать ключевое слово для архитектуры и модели процессора." >> "$xkeen_error_log" 83 | fi 84 | fi 85 | 86 | # Получаем существующее содержимое файла статуса 87 | existing_content=$(cat "$status_file") 88 | 89 | # Получаем архитектуру из файла статуса, если она уже существует 90 | status_architecture=$(echo "$existing_content" | grep -e "^Architecture:" | awk '{print $2}' | head -n 1) 91 | } 92 | 93 | -------------------------------------------------------------------------------- /_xkeen/05_tests/03_tests_socks5.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Skrill0/XKeen/1403cb7ab32403f20100c2d4caae06aec28574f2/_xkeen/05_tests/03_tests_socks5.sh -------------------------------------------------------------------------------- /_xkeen/05_tests/03_tests_xports.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /_xkeen/05_tests/04_tests_reality.sh: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Skrill0/XKeen/1403cb7ab32403f20100c2d4caae06aec28574f2/_xkeen/05_tests/04_tests_reality.sh -------------------------------------------------------------------------------- /_xkeen/05_tests/04_tests_users.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /_xkeen/05_tests/05_tests_temperature.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /_xkeen/05_tests/06_tests_speed.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /_xkeen/05_tests/07_tests_socks5.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /_xkeen/05_tests/08_tests_reality.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | -------------------------------------------------------------------------------- /_xkeen/author.sh: -------------------------------------------------------------------------------- 1 | # Информация об авторе 2 | 3 | author_donate() { 4 | echo 5 | echo " Выберите удобный для Вас способ перевода:" 6 | echo " 0. Отмена" 7 | echo " 1. Тинькофф" 8 | echo " 2. qiwi" 9 | echo " 3. Юmoney" 10 | echo " 4. Crypto" 11 | echo 12 | 13 | read -p " Ваш выбор: " choice 14 | 15 | case "$choice" in 16 | 0) 17 | 18 | ;; 19 | 1) 20 | echo 21 | echo -e " ${yellow}Прямая ссылка${reset}" 22 | echo " tinkoff.ru/rm/krasilnikova.alina18/g4z9433893" 23 | echo 24 | echo -e " ${yellow}Номер карты${reset}" 25 | echo " 2200 7008 8716 3128" 26 | echo 27 | ;; 28 | 2) 29 | echo 30 | echo -e " ${yellow}Прямая ссылка${reset}" 31 | echo " qiwi.com/n/21bunny21" 32 | echo 33 | echo -e " ${yellow}Никнейм qiwi-кошелька${reset}" 34 | echo " 21bunny21" 35 | echo 36 | ;; 37 | 3) 38 | echo 39 | echo -e " ${yellow}Прямая ссылка${reset}" 40 | echo "yoomoney.ru/to/410018052017678" 41 | echo 42 | echo -e " ${yellow}Номер Юmoney-кошелька${reset}" 43 | echo " 4100 1805 201 7678" 44 | echo 45 | ;; 46 | 4) 47 | echo 48 | echo -e " ${yellow}usdt${reset}, trc20" 49 | echo " tsc6emx5khk4cpyfkwj7dusybokravxs3m" 50 | echo 51 | echo -e " ${yellow}usdt${reset}, erc20" 52 | echo " 0x4a0369a762e3a23cc08f0bbbf39e169a647a5661" 53 | echo 54 | echo -e " ${yellow}usdt${reset}, bep20" 55 | echo " 0x4a0369a762e3a23cc08f0bbbf39e169a647a5661" 56 | ;; 57 | *) 58 | echo -e " ${red}Некорректный выбор.${reset}" 59 | ;; 60 | esac 61 | } 62 | 63 | author_feedback() { 64 | echo 65 | echo " Контакты" 66 | echo -e " ${yellow}Профиль на форуме keenetic${reset}" 67 | echo " forum.keenetic.com/profile/73583-skrill0" 68 | echo 69 | echo -e " ${yellow}e-mail${reset}" 70 | echo " alinajoeyone@gmail.com" 71 | echo 72 | echo -e " ${yellow}telegram${reset}" 73 | echo " t.me/skkrill" 74 | echo 75 | echo -e " ${yellow}telegram помощника${reset}" 76 | echo " t.me/skride" 77 | echo 78 | echo -e " Автор ${red}не обязуется${reset} предоставлять обратную связь и ${red}не несет никакой ответственности${reset}." 79 | } 80 | -------------------------------------------------------------------------------- /_xkeen/help: -------------------------------------------------------------------------------- 1 | # Файл помощи по функциям 2 | 3 | install_xkeen_rename # Переименование загруженной директории в рабочую 4 | 5 | -------------------------------------------------------------------------------- /_xkeen/import.sh: -------------------------------------------------------------------------------- 1 | # Импорт основных модулей и определение их путей 2 | 3 | script_dir="$(cd "$(dirname "$0")" && pwd)" 4 | xinfo_dir="$script_dir/.xkeen/01_info" 5 | xinstall_dir="$script_dir/.xkeen/02_install" 6 | xdelete_dir="$script_dir/.xkeen/03_delete" 7 | xtools_dir="$script_dir/.xkeen/04_tools" 8 | xtests_dir="$script_dir/.xkeen/05_tests" 9 | main_dir="$script_dir/.xkeen" 10 | 11 | # Модуль информации 12 | . "$xinfo_dir/00_info_import.sh" 13 | 14 | # Модуль установки 15 | . "$xinstall_dir/00_install_import.sh" 16 | 17 | # Модуль удаления 18 | . "$xdelete_dir/00_delete_import.sh" 19 | 20 | # Модуль инструментария 21 | . "$xtools_dir/00_tools_import.sh" 22 | 23 | # Модуль тестирования 24 | . "$xtests_dir/00_tests_import.sh" 25 | 26 | # Модуль тестирования 27 | . "$main_dir/author.sh" -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | opkg install tar 2 | curl -s -L https://github.com/Skrill0/XKeen/releases/latest/download/xkeen.tar --output xkeen.tar && tar -xvf xkeen.tar -C /opt/sbin --overwrite > /dev/null && rm xkeen.tar 3 | xkeen -i -------------------------------------------------------------------------------- /optimise_server.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if ! sysctl net.ipv4.tcp_available_congestion_control | grep -q 'bbr'; then 4 | echo "tcp_bbr" > /etc/modules-load.d/modules.conf 2>/dev/null 5 | clear 6 | echo 7 | echo " Включен модуль bbr" 8 | echo " Перезагрузите сервер и повторите команду «\\033[33m./optimise_server.sh\\033[0m»" 9 | echo 10 | 11 | exit 0 12 | fi 13 | 14 | sed -i '/net.core.rmem_max/d' /etc/sysctl.conf 15 | sed -i '/net.core.wmem_max/d' /etc/sysctl.conf 16 | sed -i '/net.core.wmem_default/d' /etc/sysctl.conf 17 | sed -i '/net.core.netdev_max_backlog/d' /etc/sysctl.conf 18 | sed -i '/net.core.somaxconn/d' /etc/sysctl.conf 19 | sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf 20 | sed -i '/net.ipv4.tcp_tw_reuse/d' /etc/sysctl.conf 21 | sed -i '/net.ipv4.tcp_fin_timeout/d' /etc/sysctl.conf 22 | sed -i '/net.ipv4.tcp_keepalive_time/d' /etc/sysctl.conf 23 | sed -i '/net.ipv4.tcp_keepalive_probes/d' /etc/sysctl.conf 24 | sed -i '/net.ipv4.tcp_keepalive_intvl/d' /etc/sysctl.conf 25 | sed -i '/net.ipv4.tcp_max_syn_backlog/d' /etc/sysctl.conf 26 | sed -i '/net.ipv4.tcp_max_tw_buckets/d' /etc/sysctl.conf 27 | sed -i '/net.ipv4.tcp_fastopen/d' /etc/sysctl.conf 28 | sed -i '/net.ipv4.tcp_mem/d' /etc/sysctl.conf 29 | sed -i '/net.ipv4.udp_mem/d' /etc/sysctl.conf 30 | sed -i '/net.ipv4.tcp_rmem/d' /etc/sysctl.conf 31 | sed -i '/net.ipv4.tcp_wmem/d' /etc/sysctl.conf 32 | sed -i '/net.ipv4.tcp_mtu_probing/d' /etc/sysctl.conf 33 | sed -i '/net.ipv4.tcp_slow_start_after_idle/d' /etc/sysctl.conf 34 | sed -i '/fs.inotify.max_user_instances/d' /etc/sysctl.conf 35 | sed -i '/net.ipv4.ip_local_port_range/d' /etc/sysctl.conf 36 | 37 | echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf 38 | echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf 39 | echo "net.core.rmem_max = 67108864" >> /etc/sysctl.conf 40 | echo "net.core.wmem_max = 67108864" >> /etc/sysctl.conf 41 | echo "net.core.wmem_default = 2097152" >> /etc/sysctl.conf 42 | echo "net.core.netdev_max_backlog = 10240" >> /etc/sysctl.conf 43 | echo "net.core.somaxconn = 8192" >> /etc/sysctl.conf 44 | echo "net.ipv4.tcp_syncookies = 1" >> /etc/sysctl.conf 45 | echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf 46 | echo "net.ipv4.tcp_fin_timeout = 30" >> /etc/sysctl.conf 47 | echo "net.ipv4.tcp_keepalive_time = 1200" >> /etc/sysctl.conf 48 | echo "net.ipv4.tcp_keepalive_probes = 5" >> /etc/sysctl.conf 49 | echo "net.ipv4.tcp_keepalive_intvl = 30" >> /etc/sysctl.conf 50 | echo "net.ipv4.tcp_max_syn_backlog = 10240" >> /etc/sysctl.conf 51 | echo "net.ipv4.tcp_max_tw_buckets = 5000" >> /etc/sysctl.conf 52 | echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf 53 | echo "net.ipv4.tcp_mem = 25600 51200 102400" >> /etc/sysctl.conf 54 | echo "net.ipv4.udp_mem = 25600 51200 102400" >> /etc/sysctl.conf 55 | echo "net.ipv4.tcp_rmem = 16384 262144 8388608" >> /etc/sysctl.conf 56 | echo "net.ipv4.tcp_wmem = 32768 524288 16777216" >> /etc/sysctl.conf 57 | echo "net.ipv4.tcp_mtu_probing = 1" >> /etc/sysctl.conf 58 | echo "net.ipv4.tcp_slow_start_after_idle=0" >> /etc/sysctl.conf 59 | echo "fs.inotify.max_user_instances = 8192" >> /etc/sysctl.conf 60 | echo "net.ipv4.ip_local_port_range = 1024 45000" >> /etc/sysctl.conf 61 | 62 | 63 | sysctl -p 64 | 65 | clear 66 | echo 67 | echo " Оптимизация сервера \\033[32mвыполнена\\033[0m" 68 | echo " Перезагрузите сервер командой «\\033[33mreboot\\033[0m»" 69 | echo 70 | 71 | rm -- "$0" 72 | -------------------------------------------------------------------------------- /xkeen: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Определение директории, где находится xkeen.sh 4 | script_dir="$(cd "$(dirname "$0")" && pwd)" 5 | 6 | # Скрываем основную директорию xkeen 7 | install_xkeen_rename() { 8 | script_dir="$script_dir" 9 | source_dir="_xkeen" 10 | target_dir=".xkeen" 11 | source_path="$script_dir/$source_dir" 12 | target_path="$script_dir/$target_dir" 13 | 14 | if [ -d "$source_path" ]; then 15 | if [ -d "$target_path" ]; then 16 | rm -rf "$target_path" 17 | fi 18 | mv "$source_path" "$target_path" 19 | fi 20 | } 21 | 22 | install_xkeen_rename 23 | 24 | # Импортируем модули 25 | . "$script_dir/.xkeen/import.sh" 26 | 27 | # Очищаем журнал перед работой 28 | logs_clear 29 | 30 | xkeen_info() { 31 | eval "opkg update &>/dev/null" 32 | eval "opkg upgrade &>/dev/null" 33 | # Проверяем установку пакетов 34 | info_packages 35 | logs_packages_info_xkeen 36 | 37 | # Собираем необходимую информацию о процессоре 38 | info_cpu 39 | logs_cpu_info_xkeen 40 | 41 | 42 | # Проверяем установку xray 43 | info_xray 44 | logs_xray_info_xkeen 45 | 46 | # Проверяем установленные базы geosite 47 | info_geosite 48 | logs_geosite_info_xkeen 49 | 50 | # Проверяем установленные базы geoip 51 | info_geoip 52 | logs_geoip_info_xkeen 53 | 54 | # Проверяем статусы автоматических обновлений 55 | info_cron 56 | logs_cron_info_xkeen 57 | 58 | # Проверяем версию xkeen 59 | info_version_xkeen 60 | logs_version_xkeen_info_xkeen 61 | 62 | # Проверяем актуальность xkeen 63 | info_compare_xkeen 64 | logs_compare_xkeen_info_xkeen 65 | 66 | # Проверяем версию xray 67 | info_version_xray 68 | logs_version_xray_info_xkeen 69 | 70 | # Проверяем актуальность xray 71 | info_compare_xray 72 | logs_compare_xray_info_xkeen 73 | 74 | # Устанавливаем недостающие пакеты 75 | install_packages 76 | logs_install_packages_xkeen 77 | } 78 | 79 | 80 | 81 | while [ $# -gt 0 ]; do 82 | case "$1" in 83 | 84 | -i) # Запуск полного цикла установки 85 | # Устанавливаем xray 86 | clear 87 | log_notice "Запуск полного цикла установки" 88 | xkeen_info 89 | logs_cpu_info_console 90 | if [ -z "$architecture" ]; then 91 | exit 1 92 | fi 93 | 94 | if [ "$xray_installed" = "not_installed" ]; then 95 | echo "" 96 | download_xray 97 | logs_download_xray_info_xkeen 98 | 99 | install_xray 100 | 101 | xray_installed="installed" 102 | info_version_xray 103 | fi 104 | 105 | # Обновляем xray 106 | if [ "$info_compare_xray" = "update" ]; then 107 | echo "" 108 | download_xray 109 | logs_download_xray_info_xkeen 110 | 111 | install_xray 112 | 113 | info_compare_xray="actual" 114 | info_version_xray 115 | fi 116 | 117 | # Устанавливаем geoip 118 | sleep 2 119 | clear 120 | choose_geoip 121 | logs_choose_geoip_info_xkeen 122 | 123 | delete_geoip 124 | logs_delete_geoip_info_xkeen 125 | 126 | install_geoip 127 | logs_install_geoip_info_xkeen 128 | sleep 1 129 | 130 | clear 131 | # Устанавливаем geosite 132 | choose_geosite 133 | logs_choose_geosite_info_xkeen 134 | 135 | delete_geosite 136 | logs_delete_geosite_info_xkeen 137 | 138 | install_geosite 139 | logs_install_geosite_info_xkeen 140 | sleep 1 141 | 142 | clear 143 | # Настраиваем автоматические обновления 144 | choose_update_cron 145 | logs_choose_update_cron_info_xkeen 146 | 147 | clear 148 | choose_cron_time 149 | logs_choose_cron_time_info_xkeen 150 | 151 | delete_cron_task 152 | logs_delete_cron_task_info_xkeen 153 | 154 | install_cron 155 | logs_install_cron_info_xkeen 156 | 157 | sleep 1 158 | clear 159 | # Удаляем предыдущие регистрации 160 | delete_register_xkeen 161 | logs_delete_register_xkeen_info_xkeen 162 | 163 | delete_register_xray 164 | logs_delete_register_xray_info_xkeen 165 | 166 | install_configs 167 | logs_install_configs_info_xkeen 168 | 169 | # Регистрируем xray 170 | register_xray_list 171 | logs_register_xray_list_info_xkeen 172 | 173 | register_xray_control 174 | logs_register_xray_control_info_xkeen 175 | 176 | register_xray_status 177 | logs_register_xray_status_info_xkeen 178 | 179 | register_xray_initd 180 | logs_register_xray_initd_info_xkeen 181 | 182 | # Регистрируем xkeen 183 | register_xkeen_list 184 | logs_register_xray_list_info_xkeen 185 | 186 | register_xkeen_control 187 | logs_register_xray_control_info_xkeen 188 | 189 | register_xkeen_status 190 | logs_register_xkeen_status_info_xkeen 191 | 192 | # Создаем init для cron 193 | echo "" 194 | eval "/opt/etc/init.d/S05crond stop" 2>/dev/null 195 | [ -e "$initd_dir/S05crond" ] && rm -f "$initd_dir/S05crond" 196 | 197 | register_cron_initd 198 | 199 | eval "/opt/etc/init.d/S05crond start" 2>/dev/null 200 | 201 | # Удаляем временные файлы 202 | echo "" 203 | delete_tmp 204 | logs_delete_tmp_info_xkeen 205 | 206 | echo "" 207 | echo -e " Перед использованием Xray настройте конфигураций по пути «${yellow}/opt/etc/xray/configs${reset}»" 208 | 209 | log_notice "Установка окончена" 210 | shift 211 | ;; 212 | 213 | -ux) #Запуск обновления Xray 214 | log_notice "Проверка обновления Xray" 215 | xkeen_info 216 | 217 | if [ "$info_compare_xray" = "update" ]; then 218 | log_notice "Запуск обновления Xray" 219 | clear 220 | echo -e " Обновление ${yellow}Xkeen${reset}" 221 | eval "/opt/etc/init.d/S24xray stop" 2>/dev/null 222 | [ -e "$initd_dir/S24Xray" ] && rm -f "$initd_dir/S24Xray" 223 | 224 | backup_xray 225 | 226 | download_xray 227 | logs_download_xray_info_xkeen 228 | 229 | install_xray 230 | 231 | delete_register_xray 232 | logs_delete_register_xray_info_xkeen 233 | logs_delete_register_xray_info_console 234 | 235 | echo -e " ${yellow}Выполняется${reset} регистрация" 236 | sleep 1 237 | echo "" 238 | echo -e " ${yellow}Проверка${reset} регистрации" 239 | 240 | register_xray_list 241 | logs_register_xray_list_info_xkeen 242 | logs_register_xray_list_info_console 243 | 244 | register_xray_control 245 | logs_register_xray_control_info_xkeen 246 | logs_register_xray_control_info_console 247 | 248 | register_xray_status 249 | logs_register_xray_status_info_xkeen 250 | logs_register_xray_status_info_console 251 | 252 | register_xray_initd 253 | logs_register_xray_initd_info_xkeen 254 | logs_register_xray_initd_info_console 255 | 256 | eval "/opt/etc/init.d/S24xray start" 2>/dev/null 257 | 258 | echo "" 259 | echo -e " Проверка регистрации ${green}завершена${reset}" 260 | echo "" 261 | echo -e " Обновление Xray ${green}завершено${reset}" 262 | echo "" 263 | 264 | delete_tmp 265 | logs_delete_tmp_info_xkeen 266 | log_notice "Обновление Xray завершено" 267 | else 268 | log_notice "Нет доступных обновлений Xray" 269 | fi 270 | shift 271 | ;; 272 | 273 | 274 | -uk) #Запуск обновления Xkeen 275 | log_notice "Проверка обновления Xkeen" 276 | xkeen_info 277 | 278 | if [ "$info_compare_xkeen" = "update" ]; then 279 | clear 280 | echo -e " Обновление ${yellow}Xkeen${reset}" 281 | backup_xkeen 282 | 283 | echo "" 284 | download_xkeen 285 | logs_download_xkeen_info_xkeen 286 | 287 | install_xkeen 288 | echo "" 289 | 290 | echo -e " Выполняется ${yellow}проверка удаления${reset} регистрации из Entware" 291 | delete_register_xkeen 292 | logs_delete_register_xkeen_info_xkeen 293 | logs_delete_register_xkeen_info_console 294 | 295 | echo "" 296 | echo -e " ${yellow}Выполняется${reset} регистрация" 297 | sleep 1 298 | echo "" 299 | echo -e " ${yellow}Проверка${reset} регистрации" 300 | 301 | register_xkeen_list 302 | logs_register_xkeen_list_info_xkeen 303 | logs_register_xkeen_list_info_console 304 | 305 | register_xkeen_control 306 | logs_register_xkeen_control_info_xkeen 307 | logs_register_xkeen_control_info_console 308 | 309 | register_xkeen_status 310 | logs_register_xkeen_status_info_xkeen 311 | logs_register_xkeen_status_info_console 312 | 313 | register_cron_initd 314 | register_xray_initd 315 | 316 | echo "" 317 | echo -e " Проверка регистрации ${green}завершена${reset}" 318 | echo "" 319 | echo -e " Обновление Xkeen ${green}завершено${reset}" 320 | echo "" 321 | 322 | delete_tmp 323 | logs_delete_tmp_info_xkeen 324 | log_notice "Обновление Xkeen завершено" 325 | else 326 | log_notice "Нет доступных обновлений Xkeen" 327 | fi 328 | shift 329 | ;; 330 | 331 | -ugs) #Запуск обновления баз GeoSite 332 | log_notice "Обновление установленных GeoSite" 333 | info_geosite 334 | logs_geosite_info_xkeen 335 | 336 | eval "/opt/etc/init.d/S24xray stop" 337 | 338 | if [ "$geo_exists_geosite_v2fly" = "installed" ]; then 339 | install_v2fly_geosite="true" 340 | fi 341 | 342 | if [ "$geo_exists_geosite_antifilter" = "installed" ]; then 343 | install_antifilter_geosite="true" 344 | fi 345 | 346 | if [ "$geo_exists_geosite_antizapret" = "installed" ]; then 347 | install_antizapret_geosite="true" 348 | fi 349 | 350 | install_geosite 351 | logs_install_geosite_info_xkeen 352 | logs_install_geosite_info_console 353 | 354 | eval "/opt/etc/init.d/S24xray start" 355 | 356 | log_notice "Обновление установленных GeoSite завершено" 357 | 358 | shift 359 | ;; 360 | 361 | 362 | -ugi) #Запуск обновления баз GeoIP 363 | log_notice "Обновление установленных GeoIP" 364 | info_geoip 365 | logs_geoip_info_xkeen 366 | 367 | eval "/opt/etc/init.d/S24xray stop" 368 | 369 | if [ "$geo_exists_geoip_v2fly" = "installed" ]; then 370 | install_v2fly_geoip="true" 371 | fi 372 | 373 | if [ "$geo_exists_geoip_antifilter" = "installed" ]; then 374 | install_antifilter_geoip="true" 375 | fi 376 | 377 | install_geoip 378 | logs_install_geoip_info_xkeen 379 | logs_install_geoip_info_console 380 | 381 | 382 | eval "/opt/etc/init.d/S24xray start" 383 | 384 | log_notice "Обновление установленных GeoIP завершено" 385 | shift 386 | ;; 387 | 388 | 389 | -uac) #Создать или изменить существующие правила автоматического обновления Xkeen, Xray, GeoIP, GeoSite 390 | log_notice "Создание или изменение правил автоматического обновления Xkeen, Xray, GeoIP, GeoSite" 391 | info_cron 392 | logs_cron_info_xkeen 393 | 394 | clear 395 | delete_cron_xkeen 2>/dev/null 396 | delete_cron_xray 2>/dev/null 397 | delete_cron_geoip 2>/dev/null 398 | delete_cron_geosite 2>/dev/null 399 | 400 | chose_xkeen_cron_select=true 401 | chose_xray_cron_select=true 402 | chose_geosite_cron_select=true 403 | chose_geoip_cron_select=true 404 | 405 | if input_concordance_list "Хотите установить единое время для ${yellow}всех${reset} обновлений?"; then 406 | chose_all_cron_select=true 407 | chose_xkeen_cron_select=false 408 | chose_xray_cron_select=false 409 | chose_geosite_cron_select=false 410 | chose_geoip_cron_select=false 411 | else 412 | chose_all_cron_select=false 413 | fi 414 | 415 | choose_cron_time 416 | logs_choose_cron_time_info_xkeen 417 | 418 | install_cron 419 | logs_install_cron_info_xkeen 420 | logs_install_cron_info_console 421 | 422 | delete_tmp 423 | logs_delete_tmp_info_xkeen 424 | log_notice "Создание или изменение правил автоматического обновления Xkeen, Xray, GeoIP, GeoSite завершено" 425 | 426 | shift 427 | ;; 428 | 429 | 430 | -ukc) #Создать или изменить существующее правило автоматического обновления Xkeen 431 | log_notice "Создание или изменение правила автоматического обновления Xkeen" 432 | info_cron 433 | logs_cron_info_xkeen 434 | 435 | clear 436 | delete_cron_xkeen 437 | logs_delete_cron_xkeen_info_xkeen 438 | 439 | chose_xkeen_cron_select=true 440 | 441 | choose_cron_time 442 | logs_choose_cron_time_info_xkeen 443 | 444 | install_cron 445 | logs_install_cron_info_xkeen 446 | logs_install_cron_info_console 447 | 448 | delete_tmp 449 | logs_delete_tmp_info_xkeen 450 | log_notice "Создание или изменение правила автоматического обновления Xkeen завершено" 451 | shift 452 | ;; 453 | 454 | 455 | -uxc) #Создать или изменить существующее правило автоматического обновления Xray 456 | log_notice "Создание или изменение правила автоматического обновления Xray" 457 | info_cron 458 | logs_cron_info_xkeen 459 | 460 | clear 461 | delete_cron_xray 462 | logs_delete_cron_xray_info_xkeen 463 | 464 | chose_xray_cron_select=true 465 | 466 | choose_cron_time 467 | logs_choose_cron_time_info_xkeen 468 | 469 | install_cron 470 | logs_install_cron_info_xkeen 471 | logs_install_cron_info_console 472 | 473 | delete_tmp 474 | logs_delete_tmp_info_xkeen 475 | 476 | log_notice "Создание или изменение правила автоматического обновления Xray завершено" 477 | shift 478 | ;; 479 | 480 | 481 | -ugsc) #Создать или изменить существующее правило автоматического обновления GeoSite 482 | log_notice "Создание или изменение правила автоматического обновления GeoSite" 483 | info_cron 484 | logs_cron_info_xkeen 485 | 486 | clear 487 | delete_cron_geosite 488 | logs_delete_cron_geosite_info_xkeen 489 | 490 | chose_geosite_cron_select=true 491 | 492 | choose_cron_time 493 | logs_choose_cron_time_info_xkeen 494 | 495 | install_cron 496 | logs_install_cron_info_xkeen 497 | logs_install_cron_info_console 498 | 499 | delete_tmp 500 | logs_delete_tmp_info_xkeen 501 | 502 | log_notice "Создание или изменение правила автоматического обновления GeoSite завершено" 503 | shift 504 | ;; 505 | 506 | 507 | -ugic) #Создать или изменить существующее правило автоматического обновления GeoIP 508 | log_notice "Создание или изменение правила автоматического обновления GeoIP" 509 | info_cron 510 | logs_cron_info_xkeen 511 | 512 | clear 513 | delete_cron_geoip 514 | logs_delete_cron_geoip_info_xkeen 515 | 516 | chose_geoip_cron_select=true 517 | 518 | choose_cron_time 519 | logs_choose_cron_time_info_xkeen 520 | 521 | install_cron 522 | logs_install_cron_info_xkeen 523 | logs_install_cron_info_console 524 | 525 | delete_tmp 526 | logs_delete_tmp_info_xkeen 527 | 528 | log_notice "Создание или изменение правила автоматического обновления GeoIP завершено" 529 | shift 530 | ;; 531 | 532 | 533 | -rx) #Зарегистрировать Xray 534 | log_notice "Регистрация Xray в системе" 535 | clear 536 | echo -e " Прегистрация ${yellow}Xray${reset}" 537 | delete_register_xray 538 | logs_delete_register_xray_info_xkeen 539 | logs_delete_register_xray_info_console 540 | 541 | echo -e " ${yellow}Выполняется${reset} регистрация" 542 | sleep 1 543 | echo "" 544 | echo -e " ${yellow}Проверка${reset}" 545 | 546 | register_xray_list 547 | logs_register_xray_list_info_xkeen 548 | logs_register_xray_list_info_console 549 | 550 | register_xray_control 551 | logs_register_xray_control_info_xkeen 552 | logs_register_xray_control_info_console 553 | 554 | register_xray_status 555 | logs_register_xray_status_info_xkeen 556 | logs_register_xray_status_info_console 557 | 558 | echo "" 559 | echo -e " Проверка регистрации ${green}завершена${reset}" 560 | 561 | log_notice "Регистрация Xray в системе завершена" 562 | shift 563 | ;; 564 | 565 | 566 | -ri) #Создать правило автоматического запуска Xray 567 | log_notice "Создание правила автоматического запуска Xray" 568 | clear 569 | eval "/opt/etc/init.d/S24xray stop" 2>/dev/null 570 | [ -e "$initd_dir/S24Xray" ] && rm -f "$initd_dir/S24Xray" 571 | 572 | echo -e " Создание файла автоматического запуска ${yellow}Xray${reset}" 573 | sleep 1 574 | 575 | register_xray_initd 576 | logs_register_xray_initd_info_xkeen 577 | 578 | echo "" 579 | echo -e " ${yellow}Проверка${reset} init.d" 580 | logs_register_xray_initd_info_console 581 | 582 | echo "" 583 | echo -e " Если Ваша конфигурация Xray готова, то можете запустить его «${green}xkeen -start${reset}»" 584 | 585 | log_notice "Создание правила автоматического запуска Xray завершено" 586 | shift 587 | ;; 588 | 589 | 590 | -rk) #Зарегистрировать Xkeen 591 | log_notice "Регистрация Xkeen в системе завершена" 592 | 593 | clear 594 | echo -e " Регистрация ${yellow}Xkeen${reset}" 595 | 596 | delete_register_xkeen 597 | logs_delete_register_xkeen_info_xkeen 598 | logs_delete_register_xkeen_info_console 599 | 600 | echo -e " ${yellow}Выполняется${reset} регистрация" 601 | sleep 1 602 | echo "" 603 | echo -e " ${yellow}Проверка${reset} регистрации" 604 | 605 | register_xkeen_list 606 | logs_register_xkeen_list_info_xkeen 607 | logs_register_xkeen_list_info_console 608 | 609 | register_xkeen_control 610 | logs_register_xkeen_control_info_xkeen 611 | logs_register_xkeen_control_info_console 612 | 613 | register_xkeen_status 614 | logs_register_xkeen_status_info_xkeen 615 | logs_register_xkeen_status_info_console 616 | 617 | echo "" 618 | echo -e " Проверка регистрации ${green}завершена${reset}" 619 | 620 | log_notice "Регистрация Xkeen в системе завершена" 621 | shift 622 | ;; 623 | 624 | 625 | 626 | -dac) #Удалить правила автоматического обновления Xkeen, Xray, GeoSite, GeoIP 627 | log_notice "Удаление правил автоматического обновления Xkeen, Xray, GeoSite, GeoIP" 628 | info_cron 629 | logs_cron_info_xkeen 630 | 631 | clear 632 | echo -e " Удаление задач ${yellow}Xkeen${reset}, ${yellow}Xray${reset}, ${yellow}GeoSite${reset}, ${yellow}GeoIP${reset}, автоматического обновления" 633 | echo "" 634 | echo -e " ${yellow}Проверка${reset} удаления задач Cron" 635 | delete_cron_xkeen 636 | logs_delete_cron_xkeen_info_xkeen 637 | logs_delete_cron_xkeen_info_console 638 | 639 | delete_cron_xray 640 | logs_delete_cron_xray_info_xkeen 641 | logs_delete_cron_xray_info_console 642 | 643 | delete_cron_geosite 644 | logs_delete_cron_geosite_info_xkeen 645 | logs_delete_cron_geosite_info_console 646 | 647 | delete_cron_geoip 648 | logs_delete_cron_geoip_info_xkeen 649 | logs_delete_cron_geoip_info_console 650 | 651 | echo -e " Проверка удаления задач Cron ${green}завершена${reset}" 652 | echo "" 653 | 654 | delete_tmp 655 | logs_delete_tmp_info_xkeen 656 | 657 | log_notice "Удаление правил автоматического обновления Xkeen, Xray, GeoSite, GeoIP завершено" 658 | shift 659 | ;; 660 | 661 | 662 | -dkc) #Удалить правило автоматического обновления Xkeen 663 | log_notice "Удаление правила автоматического обновления Xkeen" 664 | info_cron 665 | logs_cron_info_xkeen 666 | 667 | clear 668 | echo -e " Удаление задач ${yellow}Xkeen${reset} автоматического обновления" 669 | echo "" 670 | echo -e " ${yellow}Проверка${reset} удаления задач Cron для Xkeen" 671 | 672 | delete_cron_xkeen 673 | logs_delete_cron_xkeen_info_xkeen 674 | logs_delete_cron_xkeen_info_console 675 | 676 | echo -e " Проверка удаления задачи Cron для Xkeen ${green}завершена${reset}" 677 | echo "" 678 | 679 | delete_tmp 680 | logs_delete_tmp_info_xkeen 681 | 682 | log_notice "Удаление правила автоматического обновления Xkeen завершено" 683 | shift 684 | ;; 685 | 686 | 687 | -dxc) #Удалить правило автоматического обновления Xray 688 | log_notice "Удаление правила автоматического обновления Xray" 689 | info_cron 690 | logs_cron_info_xkeen 691 | 692 | clear 693 | echo -e " Удаление задач ${yellow}Xray${reset} автоматического обновления" 694 | echo "" 695 | echo -e " ${yellow}Проверка${reset} удаления задач Cron для Xray" 696 | 697 | delete_cron_xray 698 | logs_delete_cron_xray_info_xkeen 699 | logs_delete_cron_xray_info_console 700 | 701 | echo -e " Проверка удаления задачи Cron для Xray ${green}завершена${reset}" 702 | echo "" 703 | 704 | delete_tmp 705 | logs_delete_tmp_info_xkeen 706 | 707 | log_notice "Удаление правила автоматического обновления Xray завершено" 708 | shift 709 | ;; 710 | 711 | 712 | -dgsc) #Удалить правило автоматического обновления GeoSite 713 | log_notice "Удаление правила автоматического обновления GeoSite" 714 | info_cron 715 | logs_cron_info_xkeen 716 | 717 | clear 718 | echo -e " Удаление задач ${yellow}GeoSite${reset} автоматического обновления" 719 | echo "" 720 | echo -e " ${yellow}Проверка${reset} удаления задач Cron для GeoSite" 721 | 722 | delete_cron_geosite 723 | logs_delete_cron_geosite_info_xkeen 724 | logs_delete_cron_geosite_info_console 725 | 726 | echo -e " Проверка удаления задачи Cron для GeoSite ${green}завершена${reset}" 727 | echo "" 728 | 729 | delete_tmp 730 | logs_delete_tmp_info_xkeen 731 | 732 | log_notice "Удаление правила автоматического обновления GeoSite завершено" 733 | shift 734 | ;; 735 | 736 | 737 | -dgic) #Удалить правило автоматического обновления GeoIP 738 | log_notice "Удаление правила автоматического обновления GeoIP завершено" 739 | info_cron 740 | logs_cron_info_xkeen 741 | 742 | clear 743 | echo -e " Удаление задач ${yellow}GeoIP${reset} автоматического обновления" 744 | echo "" 745 | echo -e " ${yellow}Проверка${reset} удаления задач Cron для GeoIP" 746 | 747 | delete_cron_geoip 748 | logs_delete_cron_geoip_info_xkeen 749 | logs_delete_cron_geoip_info_console 750 | 751 | echo -e " Проверка удаления задачи Cron для GeoIP ${green}завершена${reset}" 752 | echo "" 753 | 754 | delete_tmp 755 | logs_delete_tmp_info_xkeen 756 | 757 | log_notice "Удаление правила автоматического обновления GeoIP завершено" 758 | shift 759 | ;; 760 | 761 | 762 | -dx) #Удалить Xray 763 | log_notice "Удаление Xray" 764 | 765 | clear 766 | echo -e " ${yellow}Удаление${reset} Xray и его компонентов" 767 | echo "" 768 | 769 | eval "/opt/etc/init.d/S24xray stop" 2>/dev/null 770 | eval "opkg remove xray" 771 | 772 | echo "" 773 | echo -e " Удаление Xray и его компонентов ${green}завершено${reset}" 774 | 775 | log_notice "Удаление Xray завершено" 776 | shift 777 | ;; 778 | 779 | 780 | -dk) #Удалить Xkeen 781 | log_notice "Удаление Xkeen" 782 | 783 | clear 784 | echo -e " Удаление ${yellow}Xkeen${reset} и его компонентов" 785 | echo "" 786 | eval "opkg remove xkeen" 787 | 788 | log_notice "Удаление Xkeen завершено" 789 | shift 790 | ;; 791 | 792 | 793 | -dgs) #Удалить GeoSite 794 | log_notice "Удаление всех GeoSite" 795 | 796 | clear 797 | eval "/opt/etc/init.d/S24xray stop" 798 | 799 | echo -e " Удаление ${yellow}GeoSite${reset}" 800 | echo "" 801 | 802 | delete_geosite_key 803 | logs_delete_geosite_info_xkeen 804 | logs_delete_geosite_info_console 805 | 806 | echo -e " Обновите свою конфигурацию Xray и запустите его повторно «${green}xkeen -start${reset}́»" 807 | 808 | log_notice "Удаление всех GeoSite завершено" 809 | shift 810 | ;; 811 | 812 | 813 | -dgi) #Удалить GeoIP 814 | log_notice "Удаление всех GeoIP" 815 | 816 | clear 817 | eval "/opt/etc/init.d/S24xray stop" 818 | 819 | echo -e " Удаление ${yellow}GeoIP${reset}" 820 | echo "" 821 | delete_geoip_key 822 | logs_delete_geoip_info_xkeen 823 | logs_delete_geoip_info_console 824 | 825 | echo -e " Обновите свою конфигурацию Xray и запустите его повторно «${green}xkeen -start${reset}́»" 826 | 827 | log_notice "Удаление всех GeoIP завершено" 828 | shift 829 | ;; 830 | 831 | 832 | -dt) #Удалить временные файлы Xkeen 833 | delete_tmp 834 | logs_delete_tmp_info_xkeen 835 | shift 836 | ;; 837 | 838 | 839 | -dc) #Удалить все конфиги Xray 840 | log_notice "Удаление всех конфигурационных файлов Xray" 841 | clear 842 | echo -e " Удаление ${yellow}конфигурационных файлов Xray${reset}" 843 | echo "" 844 | sleep 1 845 | echo -e " ${yellow}Проверка${reset} удаления задач конфигурационных файлов" 846 | 847 | delete_configs 848 | logs_delete_configs_info_console 849 | logs_delete_configs_info_xkeen 850 | 851 | echo -e " Проверка удаления ${green}конфигурационных файлов выполнена${reset}" 852 | 853 | log_notice "Удаление всех конфигурационных файлов Xray завершено" 854 | shift 855 | ;; 856 | 857 | 858 | -drx) #Удалить регистрации Xray 859 | log_notice "Удаление регистрации Xray из системы" 860 | 861 | clear 862 | echo -e " Удаление ${yellow}регистрации Xray${reset}" 863 | echo "" 864 | sleep 1 865 | echo -e " ${yellow}Проверка${reset} удаления регистрации Xray" 866 | 867 | delete_register_xray 868 | logs_delete_register_xray_info_xkeen 869 | logs_delete_register_xray_info_console 870 | 871 | echo -e " Проверка удаления регистрации Xray ${green}выполнена${reset}" 872 | 873 | log_notice "Удаление регистрации Xray из системы завершено" 874 | shift 875 | ;; 876 | 877 | 878 | -drk) #Удалить регистрации Xkeen 879 | log_notice "Удаление регистрации Xkeen из системы" 880 | 881 | clear 882 | echo -e " Удаление ${yellow}регистрации Xkeen${reset}" 883 | echo "" 884 | sleep 1 885 | echo -e " ${yellow}Проверка${reset} удаления регистрации Xkeen" 886 | 887 | delete_register_xkeen 888 | logs_delete_register_xkeen_info_xkeen 889 | logs_delete_register_xkeen_info_console 890 | 891 | echo -e " Проверка удаления регистрации Xkeen ${green}выполнена${reset}" 892 | 893 | log_notice "Удаление регистрации Xkeen из системы завершено" 894 | shift 895 | ;; 896 | 897 | 898 | -rrk) #Обновить регистрацию Xkeen 899 | log_notice "Обновление регистрации Xkeen в системе" 900 | 901 | clear 902 | echo -e " Обновление регистрации ${yellow}Xkeen${reset}" 903 | 904 | info_cpu 905 | logs_cpu_info_xkeen 906 | info_version_xkeen 907 | logs_version_xkeen_info_xkeen 908 | 909 | delete_register_xkeen 910 | logs_delete_register_xkeen_info_xkeen 911 | logs_delete_register_xkeen_info_console 912 | 913 | echo -e " ${yellow}Выполняется${reset} обновление регистрации" 914 | sleep 1 915 | echo "" 916 | echo -e " ${yellow}Проверка${reset} регистрации" 917 | 918 | register_xkeen_list 919 | logs_register_xkeen_list_info_xkeen 920 | logs_register_xkeen_list_info_console 921 | 922 | register_xkeen_control 923 | logs_register_xkeen_control_info_xkeen 924 | logs_register_xkeen_control_info_console 925 | 926 | register_xkeen_status 927 | logs_register_xkeen_status_info_xkeen 928 | logs_register_xkeen_status_info_console 929 | 930 | echo "" 931 | echo -e " Проверка регистрации ${green}завершена${reset}" 932 | 933 | log_notice "Обновление регистрации Xkeen в системе завершено" 934 | shift 935 | ;; 936 | 937 | 938 | -rrx) #Обновить регистрацию Xray 939 | log_notice "Обновление регистрации Xray в системе" 940 | 941 | clear 942 | echo -e " Обновление регистрации ${yellow}Xray${reset}" 943 | 944 | info_xray 945 | logs_xray_info_xkeen 946 | info_cpu 947 | logs_cpu_info_xkeen 948 | info_version_xray 949 | logs_version_xray_info_xkeen 950 | 951 | delete_register_xray 952 | logs_delete_register_xray_info_xkeen 953 | logs_delete_register_xray_info_console 954 | 955 | echo -e " ${yellow}Выполняется${reset} обновление регистрации" 956 | sleep 1 957 | echo "" 958 | echo -e " ${yellow}Проверка${reset}" 959 | 960 | register_xray_list 961 | logs_register_xray_list_info_xkeen 962 | logs_register_xray_list_info_console 963 | 964 | register_xray_control 965 | logs_register_xray_control_info_xkeen 966 | logs_register_xray_control_info_console 967 | 968 | register_xray_status 969 | logs_register_xray_status_info_xkeen 970 | logs_register_xray_status_info_console 971 | 972 | echo "" 973 | echo -e " Проверка регистрации ${green}завершена${reset}" 974 | 975 | log_notice "Обновление регистрации Xray в системе завершено" 976 | shift 977 | ;; 978 | 979 | 980 | -rc) #Переустановить конфиги Xray 981 | log_notice "Переустановка конфигураций Xray" 982 | 983 | clear 984 | echo -e " Переустановка конфигураций ${yellow}Xray${reset}" 985 | info_xray 986 | logs_xray_info_xkeen 987 | info_version_xray 988 | logs_version_xray_info_xkeen 989 | 990 | install_configs 991 | logs_install_configs_info_xkeen 992 | 993 | echo "" 994 | echo -e " ${yellow}Проверка${reset} наличия конфигураций" 995 | logs_install_configs_info_console 996 | echo -e " Проверка наличия конфигураций ${green}завершена${reset}" 997 | 998 | echo 999 | echo -e " ${yellow}Выполняется${reset} обновление регистрации" 1000 | sleep 1 1001 | echo "" 1002 | echo -e " ${yellow}Проверка${reset} регистрации" 1003 | 1004 | register_xray_list 1005 | logs_register_xray_list_info_xkeen 1006 | logs_register_xray_list_info_console 1007 | 1008 | register_xray_control 1009 | logs_register_xray_control_info_xkeen 1010 | logs_register_xray_control_info_console 1011 | 1012 | register_xray_status 1013 | logs_register_xray_status_info_xkeen 1014 | logs_register_xray_status_info_console 1015 | 1016 | echo "" 1017 | echo -e " Проверка регистрации ${green}завершена${reset}" 1018 | 1019 | log_notice "Переустановка конфигураций Xray завершена" 1020 | shift 1021 | ;; 1022 | 1023 | 1024 | -x) # Переустановить Xray 1025 | log_notice "Переустановка Xray" 1026 | xkeen_info 1027 | 1028 | clear 1029 | echo -e " ${yellow}Переустановка${reset} Xray" 1030 | opkg remove xray 1031 | xray_installed="not_installed" 1032 | 1033 | echo "" 1034 | download_xray 1035 | logs_download_xray_info_xkeen 1036 | 1037 | install_xray 1038 | xray_installed="installed" 1039 | 1040 | echo "" 1041 | echo -e " ${yellow}Установка${reset} конфигурационных файлов Xray" 1042 | mkdir -p "$install_conf_dir" || { echo "Ошибка: Не удалось создать директорию $install_conf_dir"; exit 1; } 1043 | install_configs 1044 | logs_install_configs_info_xkeen 1045 | 1046 | echo "" 1047 | echo -e " ${yellow}Проверка${reset} установленных конфигурационных файлов Xray" 1048 | logs_install_configs_info_console 1049 | echo -e " Проверка установленных конфигурационных файлов Xray ${green}завершена${reset}" 1050 | 1051 | echo "" 1052 | echo -e " ${yellow}Обновление${reset} регистрации" 1053 | sleep 1 1054 | echo "" 1055 | echo -e " ${yellow}Проверка${reset} регистрации" 1056 | 1057 | register_xray_list 1058 | logs_register_xray_list_info_xkeen 1059 | logs_register_xray_list_info_console 1060 | 1061 | register_xray_control 1062 | logs_register_xray_control_info_xkeen 1063 | logs_register_xray_control_info_console 1064 | 1065 | register_xray_status 1066 | logs_register_xray_status_info_xkeen 1067 | logs_register_xray_status_info_console 1068 | 1069 | register_xray_initd 1070 | logs_register_xray_initd_info_xkeen 1071 | logs_register_xray_initd_info_console 1072 | 1073 | echo "" 1074 | echo -e " Обновление регистрации ${green}завершено${reset}" 1075 | 1076 | if input_concordance_list "Хотите включить автоматическое обновление ${yellow}Xray${reset}?"; then 1077 | chose_xray_cron_select=true 1078 | else 1079 | chose_xray_cron_select=false 1080 | fi 1081 | 1082 | choose_cron_time 1083 | logs_choose_cron_time_info_xkeen 1084 | 1085 | delete_cron_task 1086 | logs_delete_cron_task_info_xkeen 1087 | 1088 | install_cron 1089 | logs_install_cron_info_xkeen 1090 | logs_install_cron_info_console 1091 | 1092 | echo -e " Переустановка Xray ${green}завершена${reset}" 1093 | 1094 | log_notice "Переустановка Xray завершена" 1095 | shift 1096 | ;; 1097 | 1098 | 1099 | -k) #Переустановить Xkeen 1100 | log_notice "Переустановка Xkeen" 1101 | xkeen_info 1102 | 1103 | clear 1104 | echo -e " ${yellow}Переустановка${reset} Xkeen" 1105 | echo "" 1106 | download_xkeen 1107 | logs_download_xkeen_info_xkeen 1108 | 1109 | echo "" 1110 | install_xkeen 1111 | 1112 | echo "" 1113 | echo -e " ${yellow}Обновление${reset} регистрации" 1114 | sleep 1 1115 | echo "" 1116 | echo -e " ${yellow}Проверка${reset} регистрации" 1117 | 1118 | delete_register_xkeen 1119 | logs_delete_register_xkeen_info_xkeen 1120 | 1121 | register_xkeen_list 1122 | logs_register_xkeen_list_info_xkeen 1123 | logs_register_xkeen_list_info_console 1124 | 1125 | register_xkeen_control 1126 | logs_register_xkeen_control_info_xkeen 1127 | logs_register_xkeen_control_info_console 1128 | 1129 | register_xkeen_status 1130 | logs_register_xkeen_status_info_xkeen 1131 | logs_register_xkeen_status_info_console 1132 | 1133 | echo "" 1134 | echo -e " Обновление регистрации ${green}завершено${reset}" 1135 | 1136 | if input_concordance_list "Хотите включить автоматическое обновление ${yellow}Xkeen?${reset}"; then 1137 | chose_xkeen_cron_select=true 1138 | else 1139 | chose_xkeen_cron_select=false 1140 | fi 1141 | 1142 | choose_cron_time 1143 | logs_choose_cron_time_info_xkeen 1144 | 1145 | delete_cron_task 1146 | logs_delete_cron_task_info_xkeen 1147 | 1148 | install_cron 1149 | 1150 | echo -e " ${Yellow}Проверка${reset} Cron файла на наличие правила автоматического обновления" 1151 | logs_install_cron_info_xkeen 1152 | logs_install_cron_info_console 1153 | echo -e " Проверка Cron файла на наличие правила автоматического обновления ${green}завершена${reset}" 1154 | 1155 | echo "" 1156 | echo -e " Переустановка Xkeen ${green}завершена${reset}" 1157 | 1158 | delete_tmp 1159 | logs_delete_tmp_info_xkeen 1160 | 1161 | log_notice "Переустановка Xkeen завершена" 1162 | shift 1163 | ;; 1164 | 1165 | -xb) #Сделать резервную копию Xray 1166 | log_notice "Создание резервной копии Xray" 1167 | 1168 | info_xray 1169 | logs_xray_info_xkeen 1170 | info_version_xray 1171 | logs_version_xray_info_xkeen 1172 | 1173 | backup_xray 1174 | 1175 | log_notice "Создание резервной копии Xray завершено" 1176 | shift 1177 | ;; 1178 | 1179 | -kb) #Резервное копирование Xkeen 1180 | log_notice "Создание резервной копии Xkeen" 1181 | 1182 | info_version_xkeen 1183 | logs_version_xkeen_info_xkeen 1184 | 1185 | backup_xkeen 1186 | 1187 | log_notice "Создание резервной копии Xkeen завершено" 1188 | shift 1189 | ;; 1190 | 1191 | -cb) #Сделать резервную конфигураций Xray 1192 | log_notice "Создание резервной копии конфигураций Xray" 1193 | 1194 | backup_configs 1195 | 1196 | log_notice "Создание резервной копии конфигураций Xray завершено" 1197 | shift 1198 | ;; 1199 | 1200 | -xbr) # Восстановление резервной копировании Xray 1201 | log_notice "Восстановление из резервной копии Xray" 1202 | 1203 | restore_backup_xray 1204 | 1205 | log_notice "Восстановление из резервной копии Xray завершено" 1206 | shift 1207 | ;; 1208 | 1209 | 1210 | -kbr) # Восстановление резервной копировании Xkeen 1211 | log_notice "Восстановление из резервной копии Xkeen" 1212 | 1213 | restore_backup_xkeen 1214 | 1215 | log_notice "Восстановление из резервной копии Xkeen завершено" 1216 | shift 1217 | ;; 1218 | 1219 | -cbr) # Восстановление резервной копировании конфигурационных файлов Xray 1220 | log_notice "Восстановление из резервной копии конфигураций Xray" 1221 | 1222 | restore_backup_configs 1223 | 1224 | log_notice "Восстановление из резервной копии конфигураций Xray завершено" 1225 | shift 1226 | ;; 1227 | 1228 | 1229 | -tc) # Тест соединения 1230 | echo -e " ${yellow}Проверка${reset} интернет-соединения" 1231 | tests_connection 1232 | echo -e " Проверка интернет-соединения ${green}завершена${reset}" 1233 | 1234 | shift 1235 | ;; 1236 | 1237 | -tpx) # Показать прослушиваемые порты 1238 | echo -e " ${yellow}Проверка${reset} портов Xray" 1239 | tests_ports_xray 1240 | echo -e " Проверка интернет-соединения ${green}завершена${reset}" 1241 | ;; 1242 | 1243 | -tfk) # Проверить файлы Xkeen 1244 | echo -e " ${yellow}Проверка${reset} файлов Xkeen" 1245 | logs_file_check_xkeen_xkeen 1246 | echo -e " Проверка файлов Xkeen ${green}завершена${reset}" 1247 | break 1248 | ;; 1249 | 1250 | -tfx) # Проверить файлы Xray 1251 | echo -e " ${yellow}Проверка${reset} файлов Xray" 1252 | logs_file_check_xray_xkeen 1253 | echo -e " Проверка файлов Xray ${green}завершена${reset}" 1254 | break 1255 | ;; 1256 | 1257 | -v) # Показать текущую версию 1258 | info_version_xray 1259 | logs_version_xray_info_xkeen 1260 | echo " Текущая версия Xkeen $xkeen_current_version" 1261 | break 1262 | ;; 1263 | 1264 | -ad) # Можете купить Мне кофе 1265 | author_donate 1266 | shift 1267 | ;; 1268 | 1269 | -af) # Обратная связь 1270 | author_feedback 1271 | shift 1272 | ;; 1273 | 1274 | -start) # Запуск Xray 1275 | eval "/opt/etc/init.d/S24xray start" 1276 | sleep 2 1277 | $SHELL 1278 | 1279 | 1280 | shift 1281 | ;; 1282 | 1283 | -stop) # Остановка Xray 1284 | eval "/opt/etc/init.d/S24xray stop" 1285 | sleep 2 1286 | $SHELL 1287 | 1288 | shift 1289 | ;; 1290 | 1291 | -restart) # Перезапуск Xray 1292 | eval "/opt/etc/init.d/S24xray restart" 1293 | sleep 2 1294 | $SHELL 1295 | 1296 | shift 1297 | ;; 1298 | 1299 | -status) # Проверка Xray 1300 | eval "/opt/etc/init.d/S24xray status" 1301 | 1302 | shift 1303 | ;; 1304 | 1305 | -arch) # Подготавливает текущую сборку для релиза 1306 | archive_xkeen 1307 | 1308 | shift 1309 | ;; 1310 | 1311 | -test) 1312 | 1313 | shift 1314 | ;; 1315 | 1316 | -h) #Помощь 1317 | echo 1318 | echo -e " ${light_blue}Xkeen${reset} — утилита для обеспечения работы Xray на роутерах Keenetic" 1319 | echo 1320 | echo -e " Пример использования ключей запуска: «xkeen ${green}-x${reset}», где ${green}-x${reset} — выбранный Вами ключ." 1321 | echo " Список доступных ключей запуска" 1322 | echo 1323 | echo -e " ${yellow}Полный цикл установки${reset}" 1324 | echo -e " ${green}-i${reset} — Необходимые пакеты, Xray и сервисы Xkeen" 1325 | echo 1326 | echo -e " ${yellow}Обновление${reset}" 1327 | echo -e " ${green}-ux${reset} — Xray" 1328 | echo -e " ${green}-uk${reset} — Xkeen" 1329 | echo -e " ${green}-ugs${reset} — GeoSite" 1330 | echo -e " ${green}-ugi${reset} — GeoIP" 1331 | echo 1332 | echo -e " ${yellow}Включение или изменение правил обновления${reset}" 1333 | echo -e " ${green}-uac${reset} — Xray, Xkeen, GeoSite, GeoIP" 1334 | echo -e " ${green}-uxc${reset} — Xray" 1335 | echo -e " ${green}-ukc${reset} — Xkeen" 1336 | echo -e " ${green}-ugsc${reset} — GeoSite" 1337 | echo -e " ${green}-ugic ${reset}— GeoIP" 1338 | echo 1339 | echo -e " ${yellow}Регистрация${reset}" 1340 | echo -e " ${green}-rx${reset} — Xray" 1341 | echo -e " ${green}-rk${reset} — Xkeen" 1342 | echo -e " ${green}-ri${reset} — Автоматический запуск Xray средствами init.d" 1343 | echo 1344 | echo -e " ${red}Удаление${reset} / Автоматические обновления" 1345 | echo -e " ${green}-dac${reset} — Xray, Xkeen, GeoSite, GeoIP" 1346 | echo -e " ${green}-dxc${reset} — Xray" 1347 | echo -e " ${green}-dkc${reset} — Xkeen" 1348 | echo -e " ${green}-dgsc${reset} — GeoSite" 1349 | echo -e " ${green}-dgic${reset} — GeoIP" 1350 | echo 1351 | echo -e " ${red}Удаление${reset} / Утилиты и компоненты" 1352 | echo -e " ${green}-dx${reset} — Xray" 1353 | echo -e " ${green}-dk${reset} — Xkeen" 1354 | echo -e " ${green}-dgs${reset} — GeoSite" 1355 | echo -e " ${green}-dgi${reset} — GeoIP" 1356 | echo -e " ${green}-dс${reset} — Конфигурации Xray" 1357 | echo -e " ${green}-dt${reset} — Временные файлы" 1358 | echo 1359 | echo -e " ${red}Удаление${reset} / Регистрации" 1360 | echo -e " ${green}-drx${reset} — Xray" 1361 | echo -e " ${green}-drk${reset} — Xkeen" 1362 | echo 1363 | echo -e " ${yellow}Обновление регистрации утилит${reset}" 1364 | echo -e " ${green}-rrx${reset} — Xray" 1365 | echo -e " ${green}-rrk${reset} — Xkeen" 1366 | echo 1367 | echo -e " ${yellow}Переустановка${reset}" 1368 | echo -e " ${green}-x${reset} — Xray" 1369 | echo -e " ${green}-k${reset} — Xkeen" 1370 | echo -e " ${green}-rc${reset} — Конфигурационные файлы Xray" 1371 | echo 1372 | echo -e " ${yellow}Резервные копии${reset} / Создание" 1373 | echo -e " ${green}-xb${reset} — Xray" 1374 | echo -e " ${green}-kb${reset} — Xkeen" 1375 | echo -e " ${green}-cb${reset} — Конфигурационные файлов Xray" 1376 | echo 1377 | echo -e " ${yellow}Резервные копии${reset} / Восстановление последней" 1378 | echo -e " ${green}-xbr${reset} — Xray" 1379 | echo -e " ${green}-kbr${reset} — Xkeen" 1380 | echo -e " ${green}-cbr${reset} — Конфигурационные файлы Xray" 1381 | echo 1382 | echo -e " ${yellow}Проверки${reset}" 1383 | echo -e " ${green}-tc${reset} — Соединение" 1384 | echo -e " ${green}-tpx${reset} — Порты Xray" 1385 | echo -e " ${green}-tfx${reset} — Файлы Xray" 1386 | echo -e " ${green}-tfk${reset} — Файлы Xkeen" 1387 | echo -e " ${green}-v${reset} — Версия Xkeen" 1388 | echo 1389 | echo -e " ${yellow}Управление Xray${reset}" 1390 | echo -e " ${green}-start${reset} — Запуск Xray" 1391 | echo -e " ${green}-stop${reset} — Остановить Xray" 1392 | echo -e " ${green}-restart${reset} — Перезапустить Xray" 1393 | echo -e " ${green}-status${reset} — Показать текущий статус работы Xray" 1394 | echo 1395 | echo -e " ${yellow}Автор${reset}" 1396 | echo -e " ${green}-ad${reset} — Если Вам полезна утилита, можете купить Мне кофе" 1397 | echo -e " ${green}-af${reset} — Обратная связь" 1398 | echo 1399 | shift 1400 | ;; 1401 | 1402 | *) 1403 | echo -e " Неизвестный ключ: ${red}$1${reset}" 1404 | shift 1405 | ;; 1406 | 1407 | esac 1408 | done --------------------------------------------------------------------------------