Добавить blockcheckw-manager.sh
This commit is contained in:
@@ -0,0 +1,790 @@
|
||||
cat > /root/blockcheckw-manager.sh <<'EOF'
|
||||
#!/bin/sh
|
||||
# BlockCheckW Manager v0.4.1
|
||||
|
||||
# Цвета
|
||||
if [ -t 1 ]; then
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
RED='\033[0;31m'
|
||||
BOLD='\033[1m'
|
||||
NC='\033[0m'
|
||||
else
|
||||
GREEN=''
|
||||
YELLOW=''
|
||||
CYAN=''
|
||||
RED=''
|
||||
BOLD=''
|
||||
NC=''
|
||||
fi
|
||||
|
||||
CFG="/root/.bcw.conf"
|
||||
SELF="/root/blockcheckw-manager.sh"
|
||||
LINK="/usr/bin/bcw"
|
||||
|
||||
# Глобальная переменная для состояния zapret
|
||||
ZAPRET_WAS_RUNNING=0
|
||||
|
||||
pause(){ printf "\n${CYAN}Нажмите Enter...${NC}"; read x; }
|
||||
|
||||
save_cfg() {
|
||||
cat > "$CFG" <<CFGEOF
|
||||
WORKERS=$WORKERS
|
||||
PROTO=$PROTO
|
||||
DOMAINS=$DOMAINS
|
||||
TIMEOUT=$TIMEOUT
|
||||
DNS_MODE=$DNS_MODE
|
||||
CFGEOF
|
||||
}
|
||||
|
||||
init_cfg() {
|
||||
[ -f "$CFG" ] || cat > "$CFG" <<CFGEOF
|
||||
WORKERS=128
|
||||
PROTO=tls12
|
||||
DOMAINS=rutracker.org
|
||||
TIMEOUT=600
|
||||
DNS_MODE=auto
|
||||
CFGEOF
|
||||
|
||||
. "$CFG"
|
||||
|
||||
[ -z "$WORKERS" ] && WORKERS=128
|
||||
[ -z "$PROTO" ] && PROTO=tls12
|
||||
[ -z "$DOMAINS" ] && DOMAINS=rutracker.org
|
||||
[ -z "$TIMEOUT" ] && TIMEOUT=600
|
||||
[ -z "$DNS_MODE" ] && DNS_MODE=auto
|
||||
|
||||
save_cfg
|
||||
}
|
||||
|
||||
status_line() {
|
||||
printf "${CYAN}${BOLD}Домены:${NC} ${GREEN}$DOMAINS${NC} | ${CYAN}${BOLD}Потоки:${NC} ${YELLOW}$WORKERS${NC} | ${CYAN}${BOLD}Протокол:${NC} ${YELLOW}$PROTO${NC} | ${CYAN}${BOLD}Таймаут:${NC} ${YELLOW}$TIMEOUT${NC}\n"
|
||||
}
|
||||
|
||||
install_bcw() {
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} Установка / обновление blockcheckw${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n\n"
|
||||
|
||||
cd /tmp || return
|
||||
|
||||
printf "${YELLOW}→ Получение информации о последней версии...${NC}\n"
|
||||
URL="$(wget -qO- https://api.github.com/repos/rcd27/blockcheckw/releases/latest \
|
||||
| jq -r '.assets[] | select(.name | contains("linux-arm64.tar.gz")) | .browser_download_url')"
|
||||
|
||||
if [ -z "$URL" ]; then
|
||||
printf "${RED}${BOLD}Ошибка: не удалось получить ссылку для загрузки.${NC}\n"
|
||||
pause
|
||||
return
|
||||
fi
|
||||
printf "${GREEN}✓ Ссылка получена:${NC} ${URL##*/}\n\n"
|
||||
|
||||
printf "${YELLOW}→ Подготовка временной директории...${NC}\n"
|
||||
rm -rf /tmp/bcwtmp
|
||||
mkdir -p /tmp/bcwtmp
|
||||
cd /tmp/bcwtmp || return
|
||||
printf "${GREEN}✓ Готово${NC}\n\n"
|
||||
|
||||
printf "${YELLOW}→ Загрузка архива...${NC}\n"
|
||||
wget -O bcw.tar.gz "$URL" 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
printf "\n${RED}${BOLD}Ошибка загрузки.${NC}\n"
|
||||
pause
|
||||
return
|
||||
fi
|
||||
printf "${GREEN}✓ Загрузка завершена${NC}\n\n"
|
||||
|
||||
printf "${YELLOW}→ Распаковка...${NC}\n"
|
||||
tar -xzf bcw.tar.gz
|
||||
if [ $? -ne 0 ]; then
|
||||
printf "${RED}${BOLD}Ошибка распаковки.${NC}\n"
|
||||
pause
|
||||
return
|
||||
fi
|
||||
printf "${GREEN}✓ Распаковано${NC}\n\n"
|
||||
|
||||
printf "${YELLOW}→ Поиск исполняемого файла...${NC}\n"
|
||||
BIN="$(find . -type f -name blockcheckw | head -1)"
|
||||
if [ -z "$BIN" ]; then
|
||||
printf "${RED}${BOLD}Файл blockcheckw не найден.${NC}\n"
|
||||
pause
|
||||
return
|
||||
fi
|
||||
printf "${GREEN}✓ Найден:${NC} $BIN\n\n"
|
||||
|
||||
printf "${YELLOW}→ Установка в /usr/bin/...${NC}\n"
|
||||
cp "$BIN" /usr/bin/blockcheckw
|
||||
chmod +x /usr/bin/blockcheckw
|
||||
printf "${GREEN}✓ Установлено${NC}\n\n"
|
||||
|
||||
printf "${YELLOW}→ Настройка окружения...${NC}\n"
|
||||
mkdir -p /opt/zapret2/binaries/linux-arm64
|
||||
if [ -f /opt/zapret2/nfq2/nfqws2 ]; then
|
||||
ln -sf /opt/zapret2/nfq2/nfqws2 /opt/zapret2/binaries/linux-arm64/nfqws2
|
||||
printf "${GREEN}✓ Симлинк nfqws2 создан${NC}\n"
|
||||
fi
|
||||
|
||||
ln -sf "$SELF" "$LINK"
|
||||
printf "${GREEN}✓ Симлинк менеджера создан (bcw)${NC}\n\n"
|
||||
|
||||
printf "${GREEN}${BOLD}=========================================${NC}\n"
|
||||
printf "${GREEN}${BOLD} Установка завершена${NC}\n"
|
||||
printf "${GREEN}${BOLD}=========================================${NC}\n\n"
|
||||
|
||||
VERSION="$($BIN --version 2>/dev/null | head -1)"
|
||||
if [ -n "$VERSION" ]; then
|
||||
printf "${CYAN}Версия:${NC} ${GREEN}$VERSION${NC}\n"
|
||||
fi
|
||||
|
||||
printf "\n${CYAN}Команда запуска:${NC} ${BOLD}bcw${NC}\n"
|
||||
pause
|
||||
}
|
||||
|
||||
remove_all() {
|
||||
clear
|
||||
printf "${YELLOW}Удаление blockcheckw и настроек...${NC}\n"
|
||||
rm -f /usr/bin/blockcheckw "$LINK" "$CFG"
|
||||
printf "${GREEN}✓ Удалено${NC}\n"
|
||||
pause
|
||||
}
|
||||
|
||||
choose_proto() {
|
||||
clear
|
||||
echo "1. http"
|
||||
echo "2. tls12"
|
||||
echo "3. tls13"
|
||||
echo "4. всё"
|
||||
printf "Выбор: "
|
||||
read A
|
||||
case "$A" in
|
||||
1) PROTO=http ;;
|
||||
2) PROTO=tls12 ;;
|
||||
3) PROTO=tls13 ;;
|
||||
4) PROTO=http,tls12,tls13 ;;
|
||||
*) ;;
|
||||
esac
|
||||
save_cfg
|
||||
}
|
||||
|
||||
choose_dns() {
|
||||
clear
|
||||
echo "Выберите режим DNS (для запросов blockcheckw, не влияет на роутер):"
|
||||
echo ""
|
||||
echo "1. auto (автоопределение, DoH при подмене) - по умолчанию"
|
||||
echo "2. system (системный DNS роутера)"
|
||||
echo "3. doh (DNS over HTTPS, Cloudflare)"
|
||||
echo ""
|
||||
printf "Выбор: "
|
||||
read A
|
||||
case "$A" in
|
||||
1) DNS_MODE=auto ;;
|
||||
2) DNS_MODE=system ;;
|
||||
3) DNS_MODE=doh ;;
|
||||
*) ;;
|
||||
esac
|
||||
save_cfg
|
||||
printf "\n${GREEN}✓ DNS режим установлен: ${YELLOW}%s${NC}\n" "$DNS_MODE"
|
||||
pause
|
||||
}
|
||||
|
||||
settings_menu() {
|
||||
while true
|
||||
do
|
||||
clear
|
||||
printf "${CYAN}${BOLD}==================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} Настройки${NC}\n"
|
||||
printf "${CYAN}${BOLD}==================================${NC}\n"
|
||||
echo "1. Потоки ($WORKERS)"
|
||||
echo "2. Протокол ($PROTO)"
|
||||
echo "3. Таймаут ($TIMEOUT)"
|
||||
echo "4. Ввести / изменить домены"
|
||||
echo "5. Показать домены"
|
||||
echo "6. Очистить домены"
|
||||
echo "7. DNS режим ($DNS_MODE)"
|
||||
echo "0. Назад"
|
||||
printf "${CYAN}${BOLD}==================================${NC}\n"
|
||||
printf "Выбор: "
|
||||
read S
|
||||
|
||||
case "$S" in
|
||||
1) printf "Потоки: "; read WORKERS; [ -z "$WORKERS" ] && WORKERS=128; save_cfg ;;
|
||||
2) choose_proto ;;
|
||||
3) printf "Таймаут: "; read TIMEOUT; [ -z "$TIMEOUT" ] && TIMEOUT=600; save_cfg ;;
|
||||
4) printf "Домены: "; IFS= read -r DOMAINS; [ -z "$DOMAINS" ] && DOMAINS=rutracker.org; save_cfg ;;
|
||||
5) printf "${GREEN}%s${NC}\n" "$DOMAINS"; pause ;;
|
||||
6) DOMAINS=rutracker.org; save_cfg; printf "${GREEN}Домены сброшены.${NC}\n"; pause ;;
|
||||
7) choose_dns ;;
|
||||
0) return ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
zapret_stop() {
|
||||
ZAPRET_WAS_RUNNING=0
|
||||
|
||||
if [ -x /etc/init.d/zapret2 ]; then
|
||||
if /etc/init.d/zapret2 status 2>/dev/null | grep -q "running"; then
|
||||
ZAPRET_WAS_RUNNING=1
|
||||
printf "\n${YELLOW}Останавливаем zapret2...${NC}\n"
|
||||
/etc/init.d/zapret2 stop >/dev/null 2>&1
|
||||
sleep 2
|
||||
printf "${GREEN}zapret2 остановлен${NC}\n"
|
||||
else
|
||||
printf "\n${CYAN}zapret2 не запущен, пропускаем остановку.${NC}\n"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
zapret_start() {
|
||||
if [ "$ZAPRET_WAS_RUNNING" = "1" ]; then
|
||||
if [ -x /etc/init.d/zapret2 ]; then
|
||||
printf "\n${YELLOW}Запускаем zapret2...${NC}\n"
|
||||
/etc/init.d/zapret2 start >/dev/null 2>&1
|
||||
sleep 2
|
||||
printf "${GREEN}zapret2 запущен${NC}\n"
|
||||
fi
|
||||
else
|
||||
printf "\n${CYAN}zapret2 не был остановлен скриптом, пропускаем запуск.${NC}\n"
|
||||
fi
|
||||
}
|
||||
|
||||
cleanup_logs() {
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} Очистка логов и отчётов${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n\n"
|
||||
|
||||
QUICK_COUNT=$(ls -1 /root/*_quick.txt 2>/dev/null | wc -l)
|
||||
WORKING_COUNT=$(ls -1 /root/*_working.txt 2>/dev/null | wc -l)
|
||||
UNIVERSAL_JSON_COUNT=$(ls -1 /root/universal_*.json 2>/dev/null | wc -l)
|
||||
UNIVERSAL_TXT_COUNT=$(ls -1 /root/universal_*.txt 2>/dev/null | wc -l)
|
||||
UNIVERSAL_WORKING_COUNT=$(ls -1 /root/universal_working_*.txt 2>/dev/null | wc -l)
|
||||
JSON_COUNT=$(ls -1 /root/*_report.json 2>/dev/null | wc -l)
|
||||
SCAN_COUNT=$(ls -1 /root/*_scan.json 2>/dev/null | wc -l)
|
||||
CHECK_COUNT=$(ls -1 /root/*_check.json 2>/dev/null | wc -l)
|
||||
REPORT_COUNT=$(ls -1 /root/*_report_vanilla.txt 2>/dev/null | wc -l)
|
||||
|
||||
TOTAL=$((QUICK_COUNT + WORKING_COUNT + UNIVERSAL_JSON_COUNT + UNIVERSAL_TXT_COUNT + UNIVERSAL_WORKING_COUNT + JSON_COUNT + SCAN_COUNT + CHECK_COUNT + REPORT_COUNT))
|
||||
|
||||
if [ "$TOTAL" -eq 0 ]; then
|
||||
printf "${YELLOW}Нет файлов для удаления.${NC}\n"
|
||||
pause
|
||||
return
|
||||
fi
|
||||
|
||||
printf "${YELLOW}Найдено файлов:${NC}\n"
|
||||
printf " Быстрые отчёты (*_quick.txt): ${CYAN}%s${NC}\n" "$QUICK_COUNT"
|
||||
printf " Рабочие стратегии (один домен) (*_working.txt): ${CYAN}%s${NC}\n" "$WORKING_COUNT"
|
||||
printf " Универсальные JSON (universal_*.json): ${CYAN}%s${NC}\n" "$UNIVERSAL_JSON_COUNT"
|
||||
printf " Универсальные TXT (universal_*.txt): ${CYAN}%s${NC}\n" "$UNIVERSAL_TXT_COUNT"
|
||||
printf " Универсальные проверенные (universal_working_*.txt): ${CYAN}%s${NC}\n" "$UNIVERSAL_WORKING_COUNT"
|
||||
printf " JSON отчёты (*_report.json): ${CYAN}%s${NC}\n" "$JSON_COUNT"
|
||||
printf " Scan JSON (*_scan.json): ${CYAN}%s${NC}\n" "$SCAN_COUNT"
|
||||
printf " Check JSON (*_check.json): ${CYAN}%s${NC}\n" "$CHECK_COUNT"
|
||||
printf " Vanilla отчёты (*_report_vanilla.txt): ${CYAN}%s${NC}\n" "$REPORT_COUNT"
|
||||
printf "\n${RED}${BOLD}Всего: ${TOTAL} файлов${NC}\n\n"
|
||||
|
||||
printf "${RED}${BOLD}ВНИМАНИЕ! Все эти файлы будут удалены безвозвратно.${NC}\n"
|
||||
printf "${YELLOW}Продолжить? (y/N): ${NC}"
|
||||
read answer
|
||||
|
||||
case "$answer" in
|
||||
y|Y|yes|Yes|YES)
|
||||
rm -f /root/*_quick.txt 2>/dev/null
|
||||
rm -f /root/*_working.txt 2>/dev/null
|
||||
rm -f /root/universal_*.json 2>/dev/null
|
||||
rm -f /root/universal_*.txt 2>/dev/null
|
||||
rm -f /root/universal_working_*.txt 2>/dev/null
|
||||
rm -f /root/*_report.json 2>/dev/null
|
||||
rm -f /root/*_scan.json 2>/dev/null
|
||||
rm -f /root/*_check.json 2>/dev/null
|
||||
rm -f /root/*_report_vanilla.txt 2>/dev/null
|
||||
printf "\n${GREEN}✓ Удалено ${TOTAL} файлов.${NC}\n"
|
||||
;;
|
||||
*)
|
||||
printf "\n${YELLOW}Очистка отменена.${NC}\n"
|
||||
;;
|
||||
esac
|
||||
pause
|
||||
}
|
||||
|
||||
run_quick_scan() {
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} Быстрый поиск (только сканирование)${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
status_line
|
||||
echo ""
|
||||
|
||||
zapret_stop
|
||||
|
||||
printf "\n${CYAN}Нажмите Enter для запуска...${NC}"
|
||||
read x
|
||||
clear
|
||||
|
||||
printf "${YELLOW}${BOLD}Сканирование...${NC}\n"
|
||||
echo ""
|
||||
|
||||
blockcheckw -w "$WORKERS" scan \
|
||||
-d "$DOMAINS" \
|
||||
-p "$PROTO" \
|
||||
--timeout "$TIMEOUT" \
|
||||
--dns "$DNS_MODE" \
|
||||
--top 20 \
|
||||
--auto
|
||||
|
||||
REPORT="$(ls -t *_report_vanilla.txt 2>/dev/null | head -1)"
|
||||
DATE="$(date +%Y-%m-%d_%H-%M-%S)"
|
||||
SAFE="$(echo "$DOMAINS" | tr ', ' '_')"
|
||||
OUTPUT_FILE="/root/${DATE}_${SAFE}_quick.txt"
|
||||
|
||||
if [ -f "$REPORT" ]; then
|
||||
TOTAL=$(grep "OK vanilla report:" "$REPORT" | head -1 | sed 's/.* \([0-9]\+\) strategies.*/\1/')
|
||||
|
||||
{
|
||||
echo "========================================="
|
||||
echo " БЫСТРЫЙ ПОИСК (НЕПРОВЕРЕННЫЕ СТРАТЕГИИ)"
|
||||
echo "========================================="
|
||||
echo "Дата : $DATE"
|
||||
echo "Домен : $DOMAINS"
|
||||
echo "Протокол: $PROTO"
|
||||
echo "Потоки : $WORKERS"
|
||||
echo "Таймаут : $TIMEOUT"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
} > "$OUTPUT_FILE"
|
||||
|
||||
grep "nfqws2" "$REPORT" | sed 's/^[^:]*: //' | head -20 >> "$OUTPUT_FILE"
|
||||
COUNT=$(grep "nfqws2" "$REPORT" | head -20 | wc -l)
|
||||
|
||||
printf "\n${GREEN}✓ Отчёт сохранён:${NC} $OUTPUT_FILE\n"
|
||||
printf "\n${CYAN}Всего найдено стратегий:${NC} ${YELLOW}%s${NC}\n" "${TOTAL:-$COUNT}"
|
||||
printf "${CYAN}Показано в отчёте:${NC} ${YELLOW}%s${NC}\n" "$COUNT"
|
||||
|
||||
rm -f "$REPORT"
|
||||
else
|
||||
printf "\n${RED}Отчёт не создан.${NC}\n"
|
||||
printf "\n${YELLOW}Возможные причины:${NC}\n"
|
||||
printf " - Домен не резолвится (нет DNS записи)\n"
|
||||
printf " - Домен выдаёт фейковый IP (подмена DNS)\n"
|
||||
printf " - Проблемы с сетью\n"
|
||||
fi
|
||||
|
||||
zapret_start
|
||||
|
||||
printf "\n${GREEN}${BOLD}Быстрый поиск завершён.${NC}\n"
|
||||
pause
|
||||
}
|
||||
|
||||
run_full_scan() {
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} Полный поиск (сканирование + проверка)${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
status_line
|
||||
echo ""
|
||||
|
||||
zapret_stop
|
||||
|
||||
printf "\n${CYAN}Нажмите Enter для запуска...${NC}"
|
||||
read x
|
||||
clear
|
||||
|
||||
printf "${YELLOW}${BOLD}Сканирование...${NC}\n"
|
||||
blockcheckw -w "$WORKERS" scan \
|
||||
-d "$DOMAINS" \
|
||||
-p "$PROTO" \
|
||||
--timeout "$TIMEOUT" \
|
||||
--dns "$DNS_MODE" \
|
||||
--auto
|
||||
|
||||
REPORT="$(ls -t *_report_vanilla.txt 2>/dev/null | head -1)"
|
||||
|
||||
if [ -z "$REPORT" ]; then
|
||||
printf "\n${RED}${BOLD}Домен доступен без обхода или нечего проверять.${NC}\n"
|
||||
zapret_start
|
||||
pause
|
||||
return
|
||||
fi
|
||||
|
||||
printf "\n${YELLOW}${BOLD}Проверка стратегий...${NC}\n"
|
||||
echo ""
|
||||
|
||||
blockcheckw -w "$WORKERS" check \
|
||||
--from-file "$REPORT" \
|
||||
-d "$DOMAINS" \
|
||||
--dns "$DNS_MODE" \
|
||||
--auto
|
||||
|
||||
DATE="$(date +%Y-%m-%d_%H-%M-%S)"
|
||||
SAFE="$(echo "$DOMAINS" | tr ', ' '_')"
|
||||
|
||||
CHECK_JSON="$(ls -t *_check.json 2>/dev/null | head -1)"
|
||||
|
||||
if [ -n "$CHECK_JSON" ]; then
|
||||
WORKING=$(sed -n 's/.*"working": *\([0-9]*\).*/\1/p' "$CHECK_JSON" | head -1)
|
||||
TOTAL=$(sed -n 's/.*"total": *\([0-9]*\).*/\1/p' "$CHECK_JSON" | head -1)
|
||||
|
||||
[ -z "$TOTAL" ] && TOTAL=0
|
||||
[ -z "$WORKING" ] && WORKING=0
|
||||
|
||||
printf "\n${CYAN}Проверено стратегий:${NC} ${YELLOW}%s${NC}\n" "$TOTAL"
|
||||
printf "${CYAN}Рабочих:${NC} ${GREEN}%s${NC}\n" "$WORKING"
|
||||
|
||||
if [ "$WORKING" -gt 0 ] 2>/dev/null; then
|
||||
OUTPUT_FILE="/root/${DATE}_${SAFE}_working.txt"
|
||||
|
||||
echo "=========================================" > "$OUTPUT_FILE"
|
||||
echo " РАБОЧИЕ СТРАТЕГИИ" >> "$OUTPUT_FILE"
|
||||
echo "=========================================" >> "$OUTPUT_FILE"
|
||||
echo "" >> "$OUTPUT_FILE"
|
||||
|
||||
sed -n '/"args": "/{s/.*"args": "//;s/",$//;s/",.*//;p}' "$CHECK_JSON" | while read line; do
|
||||
echo "nfqws2 $line"
|
||||
done >> "$OUTPUT_FILE"
|
||||
|
||||
printf "\n${GREEN}✓ Стратегии сохранены в:${NC} $OUTPUT_FILE\n"
|
||||
else
|
||||
printf "\n${RED}Рабочих стратегий не найдено.${NC}\n"
|
||||
fi
|
||||
|
||||
rm -f "$CHECK_JSON"
|
||||
else
|
||||
printf "\n${RED}JSON отчёт не найден.${NC}\n"
|
||||
fi
|
||||
|
||||
rm -f "$REPORT"
|
||||
|
||||
zapret_start
|
||||
|
||||
printf "\n${GREEN}${BOLD}Полный поиск завершён.${NC}\n"
|
||||
pause
|
||||
}
|
||||
|
||||
run_universal_scan() {
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} Универсальный поиск (несколько доменов)${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
status_line
|
||||
echo ""
|
||||
|
||||
printf "${CYAN}Введите домены через пробел (или нажмите Enter для использования текущих):${NC}\n"
|
||||
printf "Текущие: ${GREEN}$DOMAINS${NC}\n"
|
||||
printf "→ "
|
||||
read -r UNIVERSAL_DOMAINS
|
||||
if [ -z "$UNIVERSAL_DOMAINS" ]; then
|
||||
UNIVERSAL_DOMAINS="$DOMAINS"
|
||||
printf "${CYAN}Используются текущие домены: ${GREEN}$UNIVERSAL_DOMAINS${NC}\n"
|
||||
else
|
||||
printf "${CYAN}Будут использованы домены: ${GREEN}$UNIVERSAL_DOMAINS${NC}\n"
|
||||
fi
|
||||
|
||||
TMP_DOMAIN_FILE="/tmp/universal_domains_$$.txt"
|
||||
echo "$UNIVERSAL_DOMAINS" | tr ' ' '\n' > "$TMP_DOMAIN_FILE"
|
||||
|
||||
DATE="$(date +%Y-%m-%d_%H-%M-%S)"
|
||||
OUTPUT_JSON="/root/universal_${DATE}.json"
|
||||
OUTPUT_TXT="/root/universal_${DATE}.txt"
|
||||
|
||||
printf "\n${YELLOW}→ Запуск универсального поиска...${NC}\n"
|
||||
printf "${DIM}Это может занять длительное время.${NC}\n\n"
|
||||
|
||||
WAS_RUNNING=0
|
||||
if [ -x /etc/init.d/zapret2 ]; then
|
||||
if /etc/init.d/zapret2 status 2>/dev/null | grep -q "running"; then
|
||||
WAS_RUNNING=1
|
||||
printf "${YELLOW}Останавливаем zapret2...${NC}\n"
|
||||
/etc/init.d/zapret2 stop >/dev/null 2>&1
|
||||
sleep 2
|
||||
printf "${GREEN}zapret2 остановлен${NC}\n"
|
||||
else
|
||||
printf "${CYAN}zapret2 не запущен, пропускаем остановку.${NC}\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
blockcheckw universal \
|
||||
--domain-list "$TMP_DOMAIN_FILE" \
|
||||
-p "$PROTO" \
|
||||
--dns "$DNS_MODE" \
|
||||
--auto \
|
||||
-o "$OUTPUT_JSON"
|
||||
|
||||
if [ "$WAS_RUNNING" = "1" ]; then
|
||||
printf "\n${YELLOW}Запускаем zapret2...${NC}\n"
|
||||
/etc/init.d/zapret2 start >/dev/null 2>&1
|
||||
sleep 2
|
||||
printf "${GREEN}zapret2 запущен${NC}\n"
|
||||
else
|
||||
printf "\n${CYAN}zapret2 не был остановлен скриптом, пропускаем запуск.${NC}\n"
|
||||
fi
|
||||
|
||||
if [ ! -f "$OUTPUT_JSON" ]; then
|
||||
printf "\n${RED}Ошибка: файл с результатами не создан.${NC}\n"
|
||||
rm -f "$TMP_DOMAIN_FILE"
|
||||
pause
|
||||
return
|
||||
fi
|
||||
|
||||
# Подсчёт стратегий через jq
|
||||
if command -v jq >/dev/null 2>&1; then
|
||||
STRATEGY_COUNT=$(jq '[.protocols[].strategies[]?] | length' "$OUTPUT_JSON" 2>/dev/null)
|
||||
[ -z "$STRATEGY_COUNT" ] && STRATEGY_COUNT=0
|
||||
else
|
||||
STRATEGY_COUNT=$(grep -c '"args":' "$OUTPUT_JSON" 2>/dev/null)
|
||||
fi
|
||||
|
||||
printf "\n${GREEN}✓ Результат универсального поиска сохранён:${NC}\n"
|
||||
printf " JSON: ${OUTPUT_JSON}\n"
|
||||
if [ "$STRATEGY_COUNT" -gt 0 ]; then
|
||||
# Создание текстового файла с командами
|
||||
if command -v jq >/dev/null 2>&1; then
|
||||
jq -r '.protocols[].strategies[]?.args' "$OUTPUT_JSON" | sed 's/^/nfqws2 /' > "$OUTPUT_TXT"
|
||||
else
|
||||
grep '"args":' "$OUTPUT_JSON" | sed 's/.*"args": "//;s/",$//;s/",.*//;s/^/nfqws2 /' > "$OUTPUT_TXT"
|
||||
fi
|
||||
printf " TXT (команды): ${OUTPUT_TXT}\n"
|
||||
fi
|
||||
printf "${CYAN}Найдено универсальных стратегий: ${GREEN}%s${NC}\n" "$STRATEGY_COUNT"
|
||||
|
||||
if [ "$STRATEGY_COUNT" -gt 0 ]; then
|
||||
printf "${YELLOW}Желаете проверить лучшие стратегии (check) для одного из доменов? (y/N): ${NC}"
|
||||
read -r DO_CHECK
|
||||
case "$DO_CHECK" in
|
||||
y|Y|yes|Yes|YES)
|
||||
CHECK_DOMAIN=$(echo "$UNIVERSAL_DOMAINS" | awk '{print $1}')
|
||||
printf "${CYAN}Домен для проверки: ${GREEN}$CHECK_DOMAIN${NC}\n"
|
||||
printf "${CYAN}Количество проверяемых стратегий (по умолчанию 20, можно задать любое): ${NC}"
|
||||
read -r TAKE_COUNT
|
||||
[ -z "$TAKE_COUNT" ] && TAKE_COUNT=20
|
||||
|
||||
printf "\n${YELLOW}→ Запуск проверки (check) для первых ${TAKE_COUNT} стратегий...${NC}\n"
|
||||
|
||||
# Определяем протокол для подстановки в префикс
|
||||
CHECK_PROTO="tls13"
|
||||
case "$PROTO" in
|
||||
*tls13*) CHECK_PROTO="tls13" ;;
|
||||
*tls12*) CHECK_PROTO="tls12" ;;
|
||||
*http*) CHECK_PROTO="http" ;;
|
||||
esac
|
||||
|
||||
STRAT_FILE="/tmp/universal_strategies_$$.txt"
|
||||
# Создаём файл в формате vanilla-отчёта, который понимает check --from-file
|
||||
if command -v jq >/dev/null 2>&1; then
|
||||
jq -r ".protocols[].strategies[]?.args" "$OUTPUT_JSON" \
|
||||
| head -n "$TAKE_COUNT" \
|
||||
| sed "s/^/curl_test_https_${CHECK_PROTO} ipv4 ${CHECK_DOMAIN} : nfqws2 /" > "$STRAT_FILE"
|
||||
else
|
||||
grep '"args":' "$OUTPUT_JSON" \
|
||||
| head -n "$TAKE_COUNT" \
|
||||
| sed 's/.*"args": "//;s/",$//;s/",.*//' \
|
||||
| sed "s/^/curl_test_https_${CHECK_PROTO} ipv4 ${CHECK_DOMAIN} : nfqws2 /" > "$STRAT_FILE"
|
||||
fi
|
||||
|
||||
STRAT_COUNT=$(wc -l < "$STRAT_FILE")
|
||||
if [ "$STRAT_COUNT" -gt 0 ]; then
|
||||
CHECK_WAS_RUNNING=0
|
||||
if [ -x /etc/init.d/zapret2 ]; then
|
||||
if /etc/init.d/zapret2 status 2>/dev/null | grep -q "running"; then
|
||||
CHECK_WAS_RUNNING=1
|
||||
printf "${YELLOW}Останавливаем zapret2 для проверки...${NC}\n"
|
||||
/etc/init.d/zapret2 stop >/dev/null 2>&1
|
||||
sleep 2
|
||||
printf "${GREEN}zapret2 остановлен${NC}\n"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Запуск check
|
||||
blockcheckw check \
|
||||
--from-file "$STRAT_FILE" \
|
||||
-d "$CHECK_DOMAIN" \
|
||||
--dns "$DNS_MODE" \
|
||||
--auto \
|
||||
--take "$TAKE_COUNT"
|
||||
|
||||
if [ "$CHECK_WAS_RUNNING" = "1" ]; then
|
||||
printf "\n${YELLOW}Запускаем zapret2...${NC}\n"
|
||||
/etc/init.d/zapret2 start >/dev/null 2>&1
|
||||
sleep 2
|
||||
printf "${GREEN}zapret2 запущен${NC}\n"
|
||||
fi
|
||||
rm -f "$STRAT_FILE"
|
||||
|
||||
# Сохраняем успешные стратегии из check результата
|
||||
CHECK_JSON_FILE="$(ls -t *_check.json 2>/dev/null | head -1)"
|
||||
if [ -n "$CHECK_JSON_FILE" ] && command -v jq >/dev/null 2>&1; then
|
||||
# Извлекаем аргументы успешных стратегий (где success_rate == 1.0)
|
||||
WORKING_COUNT=$(jq '[.strategies[]? | select(.success_rate == 1.0) ] | length' "$CHECK_JSON_FILE" 2>/dev/null)
|
||||
if [ -n "$WORKING_COUNT" ] && [ "$WORKING_COUNT" -gt 0 ]; then
|
||||
WORKING_FILE="/root/universal_working_${DATE}.txt"
|
||||
jq -r '.strategies[]? | select(.success_rate == 1.0) | "nfqws2 " + .args' "$CHECK_JSON_FILE" > "$WORKING_FILE"
|
||||
printf "\n${GREEN}✓ Проверенные рабочие стратегии сохранены: ${WORKING_FILE}${NC}\n"
|
||||
printf "${CYAN}Количество проверенных рабочих стратегий: ${GREEN}%s${NC}\n" "$WORKING_COUNT"
|
||||
else
|
||||
printf "\n${RED}Рабочих стратегий не найдено.${NC}\n"
|
||||
fi
|
||||
rm -f "$CHECK_JSON_FILE"
|
||||
else
|
||||
printf "\n${YELLOW}Не удалось сохранить проверенные стратегии (jq не установлен или нет JSON).${NC}\n"
|
||||
fi
|
||||
else
|
||||
printf "${RED}Не удалось извлечь стратегии для проверки.${NC}\n"
|
||||
fi
|
||||
printf "\n${GREEN}✓ Проверка завершена.${NC}\n"
|
||||
;;
|
||||
*)
|
||||
printf "\n${CYAN}Проверка отложена. Вы можете запустить её позже вручную:${NC}\n"
|
||||
printf " jq -r '.protocols[].strategies[]?.args' %s | head -20 | sed 's/^/nfqws2 /' > /tmp/check.txt && blockcheckw check --from-file /tmp/check.txt -d %s\n" "$OUTPUT_JSON" "$CHECK_DOMAIN"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
printf "\n${CYAN}Универсальные стратегии не найдены. Проверка не требуется.${NC}\n"
|
||||
fi
|
||||
|
||||
rm -f "$TMP_DOMAIN_FILE"
|
||||
printf "\n${GREEN}${BOLD}Универсальный поиск завершён.${NC}\n"
|
||||
pause
|
||||
}
|
||||
|
||||
show_results() {
|
||||
while true
|
||||
do
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} Результаты поиска${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
echo ""
|
||||
echo "1. Показать рабочие стратегии (один домен)"
|
||||
echo "2. Показать быстрый отчёт (один домен)"
|
||||
echo "3. Показать универсальные отчёты (несколько доменов)"
|
||||
echo "4. Очистить все логи и отчёты"
|
||||
echo "0. Назад"
|
||||
echo ""
|
||||
printf "Выбор: "
|
||||
read S
|
||||
|
||||
case "$S" in
|
||||
1)
|
||||
FILE="$(ls -t /root/*_working.txt 2>/dev/null | head -1)"
|
||||
if [ -z "$FILE" ]; then
|
||||
printf "${RED}Нет файлов с рабочими стратегиями.${NC}\n"
|
||||
pause
|
||||
else
|
||||
clear
|
||||
cat "$FILE"
|
||||
echo ""
|
||||
printf "${CYAN}Файл:${NC} $FILE\n"
|
||||
pause
|
||||
fi
|
||||
;;
|
||||
2)
|
||||
FILE="$(ls -t /root/*_quick.txt 2>/dev/null | head -1)"
|
||||
if [ -z "$FILE" ]; then
|
||||
printf "${RED}Нет быстрых отчётов.${NC}\n"
|
||||
pause
|
||||
else
|
||||
clear
|
||||
cat "$FILE"
|
||||
echo ""
|
||||
printf "${CYAN}Файл:${NC} $FILE\n"
|
||||
pause
|
||||
fi
|
||||
;;
|
||||
3)
|
||||
# Сначала показываем рабочие проверенные универсальные, если есть
|
||||
WORKING_FILE="$(ls -t /root/universal_working_*.txt 2>/dev/null | head -1)"
|
||||
if [ -n "$WORKING_FILE" ]; then
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} УНИВЕРСАЛЬНЫЕ ПРОВЕРЕННЫЕ СТРАТЕГИИ${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
echo ""
|
||||
cat "$WORKING_FILE"
|
||||
echo ""
|
||||
printf "${CYAN}Файл:${NC} $WORKING_FILE\n"
|
||||
pause
|
||||
else
|
||||
# Иначе показываем обычный универсальный TXT
|
||||
TXT_FILE="$(ls -t /root/universal_*.txt 2>/dev/null | head -1)"
|
||||
JSON_FILE="$(ls -t /root/universal_*.json 2>/dev/null | head -1)"
|
||||
if [ -n "$TXT_FILE" ]; then
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} УНИВЕРСАЛЬНЫЙ ОТЧЁТ (команды)${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
echo ""
|
||||
cat "$TXT_FILE"
|
||||
echo ""
|
||||
printf "${CYAN}Файл:${NC} $TXT_FILE\n"
|
||||
pause
|
||||
elif [ -n "$JSON_FILE" ]; then
|
||||
clear
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} УНИВЕРСАЛЬНЫЙ ОТЧЁТ (JSON)${NC}\n"
|
||||
printf "${CYAN}${BOLD}=========================================${NC}\n"
|
||||
echo ""
|
||||
if command -v jq >/dev/null 2>&1; then
|
||||
jq -r '.protocols[].strategies[]?.args' "$JSON_FILE" | head -50 | sed 's/^/nfqws2 /'
|
||||
echo ""
|
||||
echo "... (первые 50)"
|
||||
else
|
||||
head -50 "$JSON_FILE"
|
||||
fi
|
||||
echo ""
|
||||
printf "${CYAN}Файл:${NC} $JSON_FILE\n"
|
||||
pause
|
||||
else
|
||||
printf "${RED}Нет универсальных отчётов.${NC}\n"
|
||||
pause
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
4)
|
||||
cleanup_logs
|
||||
;;
|
||||
0) return ;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
init_cfg
|
||||
ln -sf "$SELF" "$LINK"
|
||||
|
||||
while true
|
||||
do
|
||||
clear
|
||||
printf "${CYAN}${BOLD}==================================${NC}\n"
|
||||
printf "${CYAN}${BOLD} BlockCheckW Manager v0.4.1${NC}\n"
|
||||
printf "${CYAN}${BOLD}==================================${NC}\n"
|
||||
echo "1. Установить / обновить blockcheckw"
|
||||
echo "2. Удалить blockcheckw + настройки"
|
||||
echo "3. Быстрый поиск (только сканирование, один домен)"
|
||||
echo "4. Полный поиск (сканирование + проверка, один домен)"
|
||||
echo "5. Универсальный поиск (несколько доменов)"
|
||||
echo "6. Настройки"
|
||||
echo "7. Показать результаты"
|
||||
echo "0. Выход"
|
||||
printf "${CYAN}${BOLD}==================================${NC}\n"
|
||||
status_line
|
||||
printf "${CYAN}${BOLD}==================================${NC}\n"
|
||||
printf "Выбор: "
|
||||
read N
|
||||
|
||||
case "$N" in
|
||||
1) install_bcw ;;
|
||||
2) remove_all ;;
|
||||
3) run_quick_scan ;;
|
||||
4) run_full_scan ;;
|
||||
5) run_universal_scan ;;
|
||||
6) settings_menu ;;
|
||||
7) show_results ;;
|
||||
0) exit 0 ;;
|
||||
esac
|
||||
done
|
||||
EOF
|
||||
|
||||
chmod +x /root/blockcheckw-manager.sh
|
||||
ln -sf /root/blockcheckw-manager.sh /usr/bin/bcw
|
||||
bcw
|
||||
Reference in New Issue
Block a user