forked from Sergeydigl3/zapret-discord-youtube-linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain_script.sh
More file actions
executable file
·256 lines (215 loc) · 9.09 KB
/
main_script.sh
File metadata and controls
executable file
·256 lines (215 loc) · 9.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
#!/usr/bin/env bash
# Константы
BASE_DIR="$(realpath "$(dirname "$0")")"
REPO_DIR="$BASE_DIR/zapret-latest"
REPO_URL="https://github.com/Flowseal/zapret-discord-youtube"
NFQWS_PATH="$BASE_DIR/nfqws"
CONF_FILE="$BASE_DIR/conf.env"
STOP_SCRIPT="$BASE_DIR/stop_and_clean_nft.sh"
# Флаг отладки
DEBUG=false
NOINTERACTIVE=false
_term() {
sudo /usr/bin/env bash $STOP_SCRIPT
}
_term
# Функция для логирования
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
# Функция отладочного логирования
debug_log() {
if $DEBUG; then
echo "[DEBUG] $1"
fi
}
# Функция обработки ошибок
handle_error() {
log "Ошибка: $1"
exit 1
}
# Функция для проверки наличия необходимых утилит
check_dependencies() {
local deps=("git" "nft" "grep" "sed")
for dep in "${deps[@]}"; do
if ! command -v "$dep" >/dev/null 2>&1; then
handle_error "Не установлена утилита $dep"
fi
done
}
# Функция чтения конфигурационного файла
load_config() {
if [ ! -f "$CONF_FILE" ]; then
handle_error "Файл конфигурации $CONF_FILE не найден"
fi
# Чтение переменных из конфигурационного файла
source "$CONF_FILE"
# Проверка обязательных переменных
if [ -z "$interface" ] || [ -z "$auto_update" ] || [ -z "$strategy" ]; then
handle_error "Отсутствуют обязательные параметры в конфигурационном файле"
fi
}
# Функция для настройки репозитория
setup_repository() {
if [ -d "$REPO_DIR" ]; then
if $NOINTERACTIVE && [ "$auto_update" != "true" ]; then
log "Использование существующей версии репозитория."
return
fi
read -p "Репозиторий уже существует. Обновить его? (y/n): " choice
if [[ "$choice" =~ ^[Yy]$ ]] || $NOINTERACTIVE && [ "$auto_update" == "true" ]; then
log "Обновление репозитория..."
rm -rf "$REPO_DIR"
git clone "$REPO_URL" "$REPO_DIR" || handle_error "Ошибка при клонировании репозитория"
cd "$REPO_DIR" && git checkout dcdb0a3dce0675e3ac8d226a238865e060f8c6be && cd ..
# rename_bat.sh
chmod +x "$BASE_DIR/rename_bat.sh"
rm -rf "$REPO_DIR/.git"
"$BASE_DIR/rename_bat.sh" || handle_error "Ошибка при переименовании файлов"
else
log "Использование существующей версии репозитория."
fi
else
log "Клонирование репозитория..."
git clone "$REPO_URL" "$REPO_DIR" || handle_error "Ошибка при клонировании репозитория"
cd "$REPO_DIR" && git checkout dcdb0a3dce0675e3ac8d226a238865e060f8c6be && cd ..
# rename_bat.sh
chmod +x "$BASE_DIR/rename_bat.sh"
rm -rf "$REPO_DIR/.git"
"$BASE_DIR/rename_bat.sh" || handle_error "Ошибка при переименовании файлов"
fi
}
# Функция для поиска bat файлов внутри репозитория
find_bat_files() {
local pattern="$1"
find "." -type f -name "$pattern" -print0
}
# Функция для выбора стратегии
select_strategy() {
cd "$REPO_DIR" || handle_error "Не удалось перейти в директорию $REPO_DIR"
if $NOINTERACTIVE; then
if [ ! -f "$strategy" ]; then
handle_error "Указанный .bat файл стратегии $strategy не найден"
fi
parse_bat_file "$strategy"
cd ..
return
fi
# Обычный выбор стратегии для интерактивного режима
local IFS=$'\n'
local bat_files=($(find_bat_files "general*.bat" | xargs -0 -n1 echo) $(find_bat_files "discord.bat" | xargs -0 -n1 echo))
if [ ${#bat_files[@]} -eq 0 ]; then
cd ..
handle_error "Не найдены подходящие .bat файлы"
fi
echo "Доступные стратегии:"
select strategy in "${bat_files[@]}"; do
if [ -n "$strategy" ]; then
log "Выбрана стратегия: $strategy"
cd ..
break
fi
echo "Неверный выбор. Попробуйте еще раз."
done
parse_bat_file "$REPO_DIR/$strategy"
}
# Функция парсинга параметров из bat файла
parse_bat_file() {
local file="$1"
local queue_num=0
local bin_path="bin/"
debug_log "Parsing .bat file: $file"
while IFS= read -r line; do
debug_log "Processing line: $line"
[[ "$line" =~ ^[:space:]*:: || -z "$line" ]] && continue
if [[ "$line" =~ ^set[[:space:]]+BIN=%~dp0bin\\ ]]; then
debug_log "Detected BIN definition. Replacing %BIN% with $bin_path in further processing."
continue
fi
line="${line//%BIN%/$bin_path}"
if [[ "$line" =~ --filter-(tcp|udp)=([0-9,-]+)[[:space:]](.*?)(--new|$) ]]; then
local protocol="${BASH_REMATCH[1]}"
local ports="${BASH_REMATCH[2]}"
local nfqws_args="${BASH_REMATCH[3]}"
# Replace %LISTS% with 'lists/' in nfqws_args
nfqws_args="${nfqws_args//%LISTS%/lists/}"
nft_rules+=("$protocol dport {$ports} counter queue num $queue_num bypass")
nfqws_params+=("$nfqws_args")
debug_log "Matched protocol: $protocol, ports: $ports, queue: $queue_num"
debug_log "NFQWS parameters for queue $queue_num: $nfqws_args"
((queue_num++))
fi
done < <(grep -v "^@echo" "$file" | grep -v "^chcp" | tr -d '\r')
}
# Обновленная функция настройки nftables с метками
setup_nftables() {
local interface="$1"
local table_name="inet zapretunix"
local chain_name="output"
local rule_comment="Added by zapret script"
log "Настройка nftables с очисткой только помеченных правил..."
# Удаляем существующую таблицу, если она была создана этим скриптом
if sudo nft list tables | grep -q "$table_name"; then
sudo nft flush chain $table_name $chain_name
sudo nft delete chain $table_name $chain_name
sudo nft delete table $table_name
fi
# Добавляем таблицу и цепочку
sudo nft add table $table_name
sudo nft add chain $table_name $chain_name { type filter hook output priority 0\; }
# Добавляем правила с пометкой
for queue_num in "${!nft_rules[@]}"; do
sudo nft add rule $table_name $chain_name oifname \"$interface\" ${nft_rules[$queue_num]} comment \"$rule_comment\" ||
handle_error "Ошибка при добавлении правила nftables для очереди $queue_num"
done
}
# Функция запуска nfqws
start_nfqws() {
log "Запуск процессов nfqws..."
sudo pkill -f nfqws
cd "$REPO_DIR" || handle_error "Не удалось перейти в директорию $REPO_DIR"
for queue_num in "${!nfqws_params[@]}"; do
debug_log "Запуск nfqws с параметрами: $NFQWS_PATH --daemon --qnum=$queue_num ${nfqws_params[$queue_num]}"
eval "sudo $NFQWS_PATH --daemon --qnum=$queue_num ${nfqws_params[$queue_num]}" ||
handle_error "Ошибка при запуске nfqws для очереди $queue_num"
done
}
# Основная функция
main() {
if [[ "$1" == "-debug" ]]; then
DEBUG=true
shift
elif [[ "$1" == "-nointeractive" ]]; then
NOINTERACTIVE=true
shift
load_config
fi
check_dependencies
setup_repository
if $NOINTERACTIVE; then
select_strategy
setup_nftables "$interface"
else
select_strategy
local interfaces=($(ls /sys/class/net))
if [ ${#interfaces[@]} -eq 0 ]; then
handle_error "Не найдены сетевые интерфейсы"
fi
echo "Доступные сетевые интерфейсы:"
select interface in "${interfaces[@]}"; do
if [ -n "$interface" ]; then
log "Выбран интерфейс: $interface"
break
fi
echo "Неверный выбор. Попробуйте еще раз."
done
setup_nftables "$interface"
fi
start_nfqws
log "Настройка успешно завершена"
}
# Запуск скрипта
main "$@"
trap _term SIGINT
sleep infinity &
wait