From 810b3b13727a7d9b24a44649a9575572b078abdb Mon Sep 17 00:00:00 2001 From: pyrschtjag Date: Sat, 4 Apr 2026 13:25:49 +0400 Subject: [PATCH] add_archive_project --- .gitignore | 3 + README.md | 184 ++++++++++++++++++++++++ etc/config/xray | 11 ++ etc/init.d/xray | 64 +++++++++ etc/xray/common/check.sh | 25 ++++ etc/xray/common/nft.conf | 36 +++++ etc/xray/common/prepare_domain.sh | 37 +++++ etc/xray/common/prepare_net.sh | 41 ++++++ etc/xray/config/dns.jsonc | 9 ++ etc/xray/config/inbounds.jsonc | 27 ++++ etc/xray/config/log.jsonc | 8 ++ etc/xray/config/outbounds.jsonc-example | 45 ++++++ etc/xray/config/policy.jsonc | 9 ++ etc/xray/config/routing.jsonc | 12 ++ etc/xray/main/revert.sh | 33 +++++ etc/xray/main/startup.sh | 22 +++ etc/xray/main/update.sh | 76 ++++++++++ 17 files changed, 642 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 etc/config/xray create mode 100755 etc/init.d/xray create mode 100755 etc/xray/common/check.sh create mode 100644 etc/xray/common/nft.conf create mode 100755 etc/xray/common/prepare_domain.sh create mode 100755 etc/xray/common/prepare_net.sh create mode 100644 etc/xray/config/dns.jsonc create mode 100644 etc/xray/config/inbounds.jsonc create mode 100644 etc/xray/config/log.jsonc create mode 100644 etc/xray/config/outbounds.jsonc-example create mode 100644 etc/xray/config/policy.jsonc create mode 100644 etc/xray/config/routing.jsonc create mode 100755 etc/xray/main/revert.sh create mode 100755 etc/xray/main/startup.sh create mode 100755 etc/xray/main/update.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..07bc5a0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +etc/xray/ipnet/ +etc/xray/ipset/ +etc/xray/config/outbounds.jsonc diff --git a/README.md b/README.md new file mode 100644 index 0000000..ef01328 --- /dev/null +++ b/README.md @@ -0,0 +1,184 @@ +# Xray-config + +**Xray-config** - это набор скриптов для автоматизации маршрутизации. + +## Зависимости + +Для работы tproxy необходимо установить соответствующие пакеты: + +```sh +opkg update && opkg install kmod-nf-tproxy kmod-nft-tproxy git curl +``` + +Также необходимо установить полную версию dnsmasq: + +```sh +cd /tmp +opkg update +opkg download dnsmasq-full +opkg remove dnsmasq +opkg install ./dnsmasq-full_*.ipk +rm ./dnsmasq-full_*.ipk +``` + +После чего ставим сам xray: + +```sh +opkg update && opkg install xray-core +``` + +## Настройки среды + +Скрипт */etc/xray/common/check.sh*, который запускается с *startup.sh* и *update.sh* сам подготавливает окружение и создаёт директории: +- */var/log/xray* и добавляет в *rc.local* +- */etc/dnsmasq.d* и добавляет *option confdir* в *config/dhcp* + +## Добавление rsa-ключа в Gitea + +1. Подключаемся по ssh к OpenWrt и генерируем rsa-ключ длиной 4096 бит: + +```sh +mkdir ~/.ssh +chmod 600 ~/.ssh +ssh-keygen -f ~/.ssh/id_dropbear -t rsa -s 4096 +``` + +2. Копируем публичную часть ключа, которую можно посмотреть, выполнив следующую команду: + +```sh +cat ~/.ssh/id_dropbear.pub +``` + +3. В Gitea переходим в *Настрйки -> Ключи SSH / GPG* ([Ключи SSH / GPG](https://gitea.oyacoi.ru/user/settings/keys)) +4. Нажимаем **Добавить ключ** и в *Содержимое* добавляем ранее скопированную публичную часть ключа +5. Сохраняем, после чего можно клонировать репозиторий по SSH (посмотреть ссылку SSH для прокета можно нажав на *Код -> SSH* внутри репозитория) + + +## Установка + +- Клонируем проект в */opt*: + +```sh +mkdir /opt +cd /opt +git clone gitea@gitea.lan:pyrschtjag/xray-config.git +``` +- Удяляем дефолтный конфиг и initd-сервис: + +```sh +rm /etc/config/xray +rm /etc/init.d/xray +``` + +- Создаём симлинки: + * */etc/xray/common* -> */opt/xray-config/etc/xray/common* + * */etc/xray/config* -> */opt/xray-config/etc/xray/config* + * */etc/xray/main* -> */opt/xray-config/etc/xray/main* + * */etc/init.d/xray* -> */opt/xray-config/etc/init.d/xray* + * */etc/config/xray* -> */opt/xray-config/etc/config/xray* + +```sh +ln -s /opt/xray-config/etc/init.d/xray /etc/init.d/xray +ln -s /opt/xray-config/etc/config/xray /etc/config/xray +ln -s /opt/xray-config/etc/xray/common /etc/xray/common +ln -s /opt/xray-config/etc/xray/config /etc/xray/config +ln -s /opt/xray-config/etc/xray/main /etc/xray/main +``` + +- Копируем *outbounds.jsonc-example* в *outbounds.jsonc* в */etc/xray/config*: + +```sh +cp /etc/xray/config/outbounds.jsonc-example /etc/xray/config/outbounds.jsonc +``` +- Указываем свой id в конфиге */etc/xray/config/outbounds.jsonc* + * Если используется сервер, **отличный** от vector, тогда пишем **свой** конфиг *outbounds* + +## Использование + +- При первом запуске достаточно запустить обновление списков маршрутов: + +```sh +sh /etc/xray/main/update.sh +``` + +- В дальнейшем пользоваться через основной сервис xray: + +```sh +service xray stop|start|restart +``` + +## Описание + +Скрипт автообновления маршрутов: */etc/xray/main/update.sh* + +По деофлту для маршрутизации используются списки ip-диапазонов: +- [Re:filter](https://github.com/1andrevich/Re-filter-lists/tree/main) +- [cdn_ip_ranges](https://github.com/123jjck/cdn-ip-ranges) +- [domain-list-community](https://github.com/v2fly/domain-list-community) + +При запуске xray будет автоматически создана таблица xray с правилами и маршрутами, а также подготовлены сами маршруты. + +*/etc/xray/ipset* - содержит списки для маршрутизации. + +Пользовательские адреса задаются в файлах: +- */etc/xray/ipset/ip_user.lst* +- */etc/xray/ipset/domain_user.lst* + +Для исключений используются файлы: +- */etc/xray/ipset/xray_ip_user_whitelist.lst* +- */etc/xray/ipset/xray_domain_user_whitelist.lst* + +Каждая запись в списках (как для доменов, так и для подсетей) **должна начинаться с новый строки**. +Синтаксис для *xray_ip_user_whitelist.lst* (и для других списков с подсетями) выглядит следующим образом: +- x.x.x.x +- x.x.x.x/mask + +Скрипт автоматически добавляет: +- Суффикс *xray_domain_* или *xray_ip_* в зависимости от типа списка +- Постфикс *_whitelist* если список находится в *xray_domain_whitelist* или *xray_ip_whitelist* +- Расширение *.lst* + +Если необходимо добавить свои списки доменов или подсетей и разнести их по нескольким файлам, то необходимо придерживаться следующих правил для нейминга файлов: +- *xray_ip_user_LISTNAME.lst* - пользовательский спикок url с подсетями для маршрутизации в прокси +- *xray_ip_user_LISTNAME_whitelist.lst* - пользовательский белый список url с подсетями для маршрутизации в обход прокси +- *xray_domain_user_LISTNAME.lst* - пользовательский спикок url с доменами для маршрутизации в прокси +- *xray_domain_user_LISTNAME_whitelist.lst* - пользовательский белый список url с доменами для маршрутизации в обход прокси + +Каждый запуск обновления **удаляет** предыдущие списки, не относящиеся к *user*. + +Скрипт автообновления списков можно добавить в cron: +```cron +0 5 * * 0 sh /etc/xray/main/update.sh +``` + +## Добавление своих url со списками + +Чтобы добавить готовый список адресов, достаточно добавить ссылки на raw-файл в следующие массивы: +- **xray_ip** - спикок url с подсетями для маршрутизации в прокси +- **xray_ip_whitelist** - белый список url с подсетями для маршрутизации в обход прокси +- **xray_domain** - спикок url с доменами для маршрутизации в прокси +- **xray_domain_whitelist** - белый список url с доменами для маршрутизации в обход прокси + +Пример */etc/xray/main/update.sh*: + +```sh + +xray_ip=" +https://raw.link_ip1.lst +https://raw.link_ip2.txt +" + +xray_ip_whitelist="" + +xray_domain=" +https://raw.link_domain1.lst +https://raw.link_domain2.txt +" + +xray_domain_whitelist=" +https://raw.link_domain3.lst +" + +``` + +После чего при запуске *update.sh*, скрипт сам скачает этот файл, распарсит и будет использовать для маршрутизации. \ No newline at end of file diff --git a/etc/config/xray b/etc/config/xray new file mode 100644 index 0000000..160b254 --- /dev/null +++ b/etc/config/xray @@ -0,0 +1,11 @@ + +config xray 'enabled' + option enabled '1' + +config xray 'config' + option confdir '/etc/xray/config' + #list conffiles '/etc/xray/config.json' + option datadir '/usr/share/xray' + option dialer '' + option format 'json' + diff --git a/etc/init.d/xray b/etc/init.d/xray new file mode 100755 index 0000000..b68cdf8 --- /dev/null +++ b/etc/init.d/xray @@ -0,0 +1,64 @@ +#!/bin/sh /etc/rc.common + +USE_PROCD=1 +START=99 + +CONF="xray" +PROG="/usr/bin/xray" + +start_service() { + config_load "$CONF" + + local enabled + config_get_bool enabled "enabled" "enabled" "0" + [ "$enabled" -eq "1" ] || return 1 + + local confdir + local conffiles + local datadir + local dialer + local format + + config_get confdir "config" "confdir" + config_get conffiles "config" "conffiles" + config_get datadir "config" "datadir" "/usr/share/xray" + config_get dialer "config" "dialer" + config_get format "config" "format" "json" + + /etc/xray/main/startup.sh + + procd_open_instance "$CONF" + procd_set_param command "$PROG" run + [ -n "$confdir" ] && procd_append_param command -confdir "$confdir" + [ -n "$conffiles" ] && { + for i in $conffiles + do + procd_append_param command -config "$i" + done + } + [ -n "$format" ] && procd_append_param command -format "$format" + [ -n "$dialer" ] && procd_set_param env XRAY_BROWSER_DIALER="$dialer" + procd_set_param env XRAY_LOCATION_ASSET="$datadir" + procd_set_param file $conffiles + + procd_set_param limits core="unlimited" + procd_set_param limits nofile="1000000 1000000" + procd_set_param stdout 1 + procd_set_param stderr 1 + procd_set_param respawn + + procd_close_instance +} + +stop_service() { + /etc/xray/main/revert.sh +} + +reload_service() { + stop + start +} + +service_triggers() { + procd_add_reload_trigger "$CONF" +} diff --git a/etc/xray/common/check.sh b/etc/xray/common/check.sh new file mode 100755 index 0000000..ffe3703 --- /dev/null +++ b/etc/xray/common/check.sh @@ -0,0 +1,25 @@ +ipset_dir="/etc/xray/ipset" +ipnet_dir="/etc/xray/ipnet" +dnsmasq_dir="/etc/dnsmasq.d" +user_ipset_file="$ipset_dir/xray_ip_user.lst" +user_ipset_whitelist_file="$ipset_dir/xray_ip_user_whitelist.lst" +user_dnsmasq_file="$ipset_dir/xray_domain_user.lst" +user_dnsmasq_whitelist_file="$ipset_dir/xray_domain_user_whitelist.lst" +log_dir="/var/log/xray" + +mkdir -p "$ipset_dir" "$ipnet_dir" "$dnsmasq_dir" +[ -f "$user_ipset_file" ] || touch "$user_ipset_file" +[ -f "$user_ipset_whitelist_file" ] || touch "$user_ipset_whitelist_file" +[ -f "$user_dnsmasq_file" ] || touch "$user_dnsmasq_file" +[ -f "$user_dnsmasq_whitelist_file" ] || touch "$user_dnsmasq_whitelist_file" + +mkdir -p "$log_dir" +if ! grep -q "mkdir -p $log_dir" /etc/rc.local; then + sed -i "/exit 0/i mkdir -p $log_dir" /etc/rc.local +fi + +current_confdir=$(uci get dhcp.@dnsmasq[0].confdir 2>/dev/null) +if [ "$current_confdir" != "$dnsmasq_dir" ]; then + uci set dhcp.@dnsmasq[0].confdir='/etc/dnsmasq.d' + uci commit dhcp +fi diff --git a/etc/xray/common/nft.conf b/etc/xray/common/nft.conf new file mode 100644 index 0000000..54ffe09 --- /dev/null +++ b/etc/xray/common/nft.conf @@ -0,0 +1,36 @@ +#!/usr/sbin/nft -f + +table ip xray { + set dst_list { + type ipv4_addr + auto-merge + flags interval + } + + set dst_exclude { + type ipv4_addr + flags interval + auto-merge + } + + set src_list { + type ipv4_addr + flags interval + auto-merge + elements = { 10.1.0.0/24, 10.2.0.0/24 } + } + + set src_exclude { + type ipv4_addr + flags interval + auto-merge + elements = { 10.1.0.6/32 } + } + + chain prerouting { + type filter hook prerouting priority mangle; policy accept; + + ip saddr @src_list ip saddr != @src_exclude ip protocol tcp ip daddr @dst_list ip daddr != @dst_exclude tproxy to 127.0.0.1:61219 meta mark set 10 + ip saddr @src_list ip saddr != @src_exclude ip protocol udp ip daddr @dst_list ip daddr != @dst_exclude tproxy to 127.0.0.1:61219 meta mark set 10 + } +} diff --git a/etc/xray/common/prepare_domain.sh b/etc/xray/common/prepare_domain.sh new file mode 100755 index 0000000..ae4864d --- /dev/null +++ b/etc/xray/common/prepare_domain.sh @@ -0,0 +1,37 @@ +#!/bin/sh + +nft_table="xray" +nft_set="dst_list" +nft_set_exclude="dst_exclude" + +ipset_dir="/etc/xray/ipset" +dnsmasq_dir="/etc/dnsmasq.d" + +for ipset_file in "$ipset_dir"/xray_domain*; do + ipset_filename=$(basename "$ipset_file") + ipnet_file="$dnsmasq_dir/$ipset_filename" + + if echo "$ipset_filename" | grep -qiE "exclude|white"; then + target_set="$nft_set_exclude" + else + target_set="$nft_set" + fi + + awk -v t_set="$target_set" -v table="$nft_table" ' + /^[[:space:]]*#/ || /^[[:space:]]*$/ { next } + { + sub(/#.*/, "") + gsub(/[[:space:]]/, "") + if ($0 !~ /\./) next + sub(/^[^:]+:/, "", $0) + if ($0 ~ /@cn$/) next + sub(/@[^@]+$/, "", $0) + print "nftset=/" $0 "/4#ip#" table "#" t_set + } + ' "$ipset_file" > "$ipnet_file" + + + if ! dnsmasq --test -C "$ipnet_file" >/dev/null 2>&1; then + logger -t xray-prepare_domain "$dnsmasq_dir/$ipset_filename: validation failed" + fi +done diff --git a/etc/xray/common/prepare_net.sh b/etc/xray/common/prepare_net.sh new file mode 100755 index 0000000..6d5d0b0 --- /dev/null +++ b/etc/xray/common/prepare_net.sh @@ -0,0 +1,41 @@ +#!/bin/sh + +nft_table="xray" +nft_set="dst_list" +nft_set_exclude="dst_exclude" + +ipset_dir="/etc/xray/ipset" +ipnet_dir="/etc/xray/ipnet" + +for ipset_file in "$ipset_dir"/xray_ip*; do + ipset_filename=$(basename "$ipset_file") + ipnet_file="$ipnet_dir/$ipset_filename" + + if [ ! -s "$ipset_file" ] || ! grep -q "[^[:space:]]" "$ipset_file"; then + logger -t xray-prepare_net "$ipset_dir/$ipset_filename: file is empty" + continue + fi + + if echo "$ipset_filename" | grep -qiE "exclude|white"; then + target_set="$nft_set_exclude" + else + target_set="$nft_set" + fi + + { + echo -n "add element ip $nft_table $target_set { " + awk ' + /^[[:space:]]*#/ || /^[[:space:]]*$/ { next } + { + val = $0 + if (val !~ /\//) val = val "/32" + printf "%s%s", (count++ ? ", " : ""), val + } + ' "$ipset_file" + echo " }" + } > "$ipnet_file" + + if ! nft -c -f "$ipnet_file" >/dev/null 2>&1; then + logger -t xray-prepare_net "$ipnet_dir/$ipset_filename has errors" + fi +done diff --git a/etc/xray/config/dns.jsonc b/etc/xray/config/dns.jsonc new file mode 100644 index 0000000..ac1359d --- /dev/null +++ b/etc/xray/config/dns.jsonc @@ -0,0 +1,9 @@ +{ + "dns": { + "tag": "dns-in", + "servers": [ + "localhost" + ], + "queryStrategy": "UseIPv4" + } +} diff --git a/etc/xray/config/inbounds.jsonc b/etc/xray/config/inbounds.jsonc new file mode 100644 index 0000000..0f79882 --- /dev/null +++ b/etc/xray/config/inbounds.jsonc @@ -0,0 +1,27 @@ +{ + "inbounds": [ + { + "port": 61219, + "protocol": "dokodemo-door", + "settings": { + "followRedirect": true, + "network": "tcp,udp" + }, + "sniffing": { + "destOverride": [ + "http", + "tls", + "quic" + ], + "enabled": true, + "routeOnly": true + }, + "streamSettings": { + "sockopt": { + "tproxy": "tproxy" + } + }, + "tag": "tproxy" + } + ] +} diff --git a/etc/xray/config/log.jsonc b/etc/xray/config/log.jsonc new file mode 100644 index 0000000..b1f1396 --- /dev/null +++ b/etc/xray/config/log.jsonc @@ -0,0 +1,8 @@ +{ + "log": { + "access": "/var/log/xray/xray_access.log", + "error": "/var/log/xray/xray_error.log", + "loglevel": "warning", + "dnsLog": true + } +} diff --git a/etc/xray/config/outbounds.jsonc-example b/etc/xray/config/outbounds.jsonc-example new file mode 100644 index 0000000..1dac446 --- /dev/null +++ b/etc/xray/config/outbounds.jsonc-example @@ -0,0 +1,45 @@ +{ + "outbounds": [ + { + "protocol": "vless", + "settings": { + "vnext": [ + { + "address": "", + "port": 443, + "users": [ + { + "id": "", + "encryption": "none" + } + ] + } + ] + }, + "streamSettings": { + "network": "xhttp", + "xhttpSettings": { + "path": "/L4o9ap851y/", + "mode": "stream-one" + }, + "security": "tls", + "tlsSettings": { + "alpn": [ + "h2", + "h3" + ] + } + } + }, + { + "tag": "direct", + "protocol": "freedom", + "settings": {} + }, + { + "tag": "blocked", + "protocol": "blackhole", + "settings": {} + } + ] +} diff --git a/etc/xray/config/policy.jsonc b/etc/xray/config/policy.jsonc new file mode 100644 index 0000000..d1469e8 --- /dev/null +++ b/etc/xray/config/policy.jsonc @@ -0,0 +1,9 @@ +{ + "policy": { + "levels": { + "0": { + "connIdle": 30 + } + } + } +} \ No newline at end of file diff --git a/etc/xray/config/routing.jsonc b/etc/xray/config/routing.jsonc new file mode 100644 index 0000000..c27ef5b --- /dev/null +++ b/etc/xray/config/routing.jsonc @@ -0,0 +1,12 @@ +{ + "routing": { + "domainStrategy": "IPIfNonMatch", + "rules": [ + { + "type": "field", + "inboundTag": "tproxy", + "outboundTag": "vless-tls" + } + ] + } +} diff --git a/etc/xray/main/revert.sh b/etc/xray/main/revert.sh new file mode 100755 index 0000000..7185c27 --- /dev/null +++ b/etc/xray/main/revert.sh @@ -0,0 +1,33 @@ +#!/bin/sh + +/etc/init.d/xray running 2>/dev/null +if [ $? -ne 0 ]; then + exit 0 +fi + +ipnet_dir="/etc/xray/ipnet" +dnsmasq_dir="/etc/dnsmasq.d" +nft_table="xray" +nft_sets=$( + nft list table ip "$nft_table" \ + | grep 'set ' \ + | grep '{' \ + | awk '{print $2}' +) + +for set in $nft_sets; do + nft list set ip $nft_table $set >/dev/null 2>&1 && nft flush set ip $nft_table $set +done + +nft list table ip $nft_table >/dev/null 2>&1 && nft delete table ip $nft_table +ip rule show | grep -q "fwmark 0xa lookup 110" && ip rule del fwmark 10 table 110 +ip route show table 110 | grep -q "local default" && ip route del local default dev lo table 110 + +for f in "$dnsmasq_dir"/xray_domain*; do + [ -f "$f" ] || continue + rm "$f" +done + +find "$ipnet_dir" -type f -exec rm -f {} \; + +service dnsmasq restart >/dev/null 2>&1 diff --git a/etc/xray/main/startup.sh b/etc/xray/main/startup.sh new file mode 100755 index 0000000..591f8b1 --- /dev/null +++ b/etc/xray/main/startup.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +common_dir="/etc/xray/common" +ipnet_dir="/etc/xray/ipnet" + +sh $common_dir/check.sh + +nft -f $common_dir/nft.conf +sh $common_dir/prepare_domain.sh +sh $common_dir/prepare_net.sh + +for ipnet_file in "$ipnet_dir"/*; do + [ -f "$ipnet_file" ] || continue + if ! nft -f "$ipnet_file"; then + logger -t xray-startup "$ipnet_file: apply failed" + fi +done + +ip route show table 110 | grep -q "local default" || ip route add local default dev lo table 110 +ip rule show | grep -q "fwmark 0xa lookup 110" || ip rule add fwmark 10 table 110 + +service dnsmasq restart >/dev/null 2>&1 diff --git a/etc/xray/main/update.sh b/etc/xray/main/update.sh new file mode 100755 index 0000000..337287d --- /dev/null +++ b/etc/xray/main/update.sh @@ -0,0 +1,76 @@ +#!/bin/sh + +ipset_dir="/etc/xray/ipset" +dnsmasq_dir="/etc/dnsmasq.d" +common_dir="/etc/xray/common" + +sh $common_dir/check.sh + +xray_ip=" +https://raw.githubusercontent.com/1andrevich/Re-filter-lists/refs/heads/main/community_ips.lst +https://raw.githubusercontent.com/1andrevich/Re-filter-lists/refs/heads/main/discord_ips.lst +https://raw.githubusercontent.com/1andrevich/Re-filter-lists/refs/heads/main/ipsum.lst +https://raw.githubusercontent.com/123jjck/cdn-ip-ranges/refs/heads/main/all/all_plain_ipv4.txt +https://raw.githubusercontent.com/fernvenue/telegram-cidr-list/refs/heads/master/CIDRv4.txt +" + +xray_ip_whitelist="" + +xray_domain=" +https://raw.githubusercontent.com/v2ray/domain-list-community/refs/heads/master/data/spotify +https://raw.githubusercontent.com/v2ray/domain-list-community/refs/heads/master/data/microsoft +https://raw.githubusercontent.com/v2ray/domain-list-community/refs/heads/master/data/openai +" + +xray_domain_whitelist="" + +download_lists() { + local urls="$1" + local prefix="$2" + local suffix="$3" + + [ -z "$(echo "$urls" | tr -d '[:space:]')" ] && return + + for url in $urls; do + [ -z "$url" ] && continue + + base_name=$(basename "$url") + clean_name="${base_name%.*}" + filename="${prefix}${clean_name}${suffix}.lst" + target_path="$ipset_dir/$filename" + + curl -L -s -o "$target_path.tmp" "$url" + + if [ $? -eq 0 ]; then + if echo "$prefix" | grep -q "domain"; then + sed -i -E \ + -e '/^regexp:/d' \ + -e '/^include:/d' \ + -e '/^#/d' \ + -e '/^$/d' \ + -e '/@cn$/d' \ + -e '/@ads$/d' \ + -e 's/^full://' \ + -e 's/[[:space:]].*//' \ + -e '/\./!d' \ + "$target_path.tmp" + fi + mv "$target_path.tmp" "$target_path" + else + logger -t xray-updater "$url: failed to download" + fi + done +} + +find "$ipset_dir" -type f ! -name "*user*" -exec rm -f {} \; + +download_lists "$xray_ip" "xray_ip_" "" +download_lists "$xray_ip_whitelist" "xray_ip_" "_whitelist" +download_lists "$xray_domain" "xray_domain_" "" +download_lists "$xray_domain_whitelist" "xray_domain_" "_whitelist" + +if /etc/init.d/xray status >/dev/null 2>&1; then + /etc/init.d/xray restart +else + /etc/init.d/xray start +fi