mirror of
https://github.com/caiwx86/small-packages.git
synced 2026-11-02 14:43:56 +08:00
update 2026-07-28 01:38:11
This commit is contained in:
1 parent
20b786ab77
commit
25d570431d
6243 files changed
+2850542
No files matched your search
Whitespace-only changes.
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ "$ACTION" = "ifup" ] || exit 0
|
||||
[ "$INTERFACE" = "wan" ] || exit 0
|
||||
|
||||
WAN_PROTO="$(uci -q get network.wan.proto 2>/dev/null)"
|
||||
[ "$WAN_PROTO" = "pppoe" ] || exit 0
|
||||
|
||||
LOCK_FILE="/var/run/ssrplus-pppoe-hotplug.lock"
|
||||
|
||||
(
|
||||
if ! mkdir "$LOCK_FILE" 2>/dev/null; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
trap 'rmdir "$LOCK_FILE" 2>/dev/null' EXIT INT TERM
|
||||
|
||||
sleep 10
|
||||
/etc/init.d/shadowsocksr restart >/dev/null 2>&1
|
||||
) >/dev/null 2>&1 &
|
||||
|
||||
exit 0
|
||||
+3139
File diff suppressed because it is too large.
Load diff
Whitespace-only changes.
@@ -0,0 +1,173 @@
|
||||
server=/a1.mzstatic.com/114.114.114.114
|
||||
server=/a2.mzstatic.com/114.114.114.114
|
||||
server=/a3.mzstatic.com/114.114.114.114
|
||||
server=/a4.mzstatic.com/114.114.114.114
|
||||
server=/a5.mzstatic.com/114.114.114.114
|
||||
server=/adcdownload.apple.com.akadns.net/114.114.114.114
|
||||
server=/adcdownload.apple.com/114.114.114.114
|
||||
server=/amp-api-updates.apps.apple.com/114.114.114.114
|
||||
server=/amp-api.media.apple.com/114.114.114.114
|
||||
server=/api-p-ap-c.smoot.apple.com/114.114.114.114
|
||||
server=/api-p-ap-d.smoot.apple.com/114.114.114.114
|
||||
server=/api-p-ap-e.smoot.apple.com/114.114.114.114
|
||||
server=/app-site-association.cdn-apple.com/114.114.114.114
|
||||
server=/appldnld.apple.com/114.114.114.114
|
||||
server=/appldnld.g.aaplimg.com/114.114.114.114
|
||||
server=/appleid.cdn-apple.com/114.114.114.114
|
||||
server=/apps.apple.com/114.114.114.114
|
||||
server=/apps.mzstatic.com/114.114.114.114
|
||||
server=/bag-cdn.itunes-apple.com.akadns.net/114.114.114.114
|
||||
server=/cdn-cn1.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn-cn2.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn-cn3.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn-cn4.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn1.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn2.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn3.apple-mapkit.com/114.114.114.114
|
||||
server=/cdn4.apple-mapkit.com/114.114.114.114
|
||||
server=/cds-cdn.v.aaplimg.com/114.114.114.114
|
||||
server=/cds.apple.com.akadns.net/114.114.114.114
|
||||
server=/cds.apple.com/114.114.114.114
|
||||
server=/cdsassets.apple.com/114.114.114.114
|
||||
server=/cl1-cdn.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/cl1.apple.com/114.114.114.114
|
||||
server=/cl2-cn.apple.com/114.114.114.114
|
||||
server=/cl2.apple.com/114.114.114.114
|
||||
server=/cl3-cdn.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/cl3.apple.com/114.114.114.114
|
||||
server=/cl4-cdn.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/cl4-cn.apple.com/114.114.114.114
|
||||
server=/cl4.apple.com/114.114.114.114
|
||||
server=/cl5-cdn.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/cl5.apple.com/114.114.114.114
|
||||
server=/clientflow.apple.com.akadns.net/114.114.114.114
|
||||
server=/clientflow.apple.com/114.114.114.114
|
||||
server=/cn-smp-paymentservices.apple.com/114.114.114.114
|
||||
server=/configuration.apple.com.akadns.net/114.114.114.114
|
||||
server=/configuration.apple.com/114.114.114.114
|
||||
server=/crl.apple.com/114.114.114.114
|
||||
server=/cstat.apple.com/114.114.114.114
|
||||
server=/cstat.cdn-apple.com/114.114.114.114
|
||||
server=/dd-cdn.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/dejavu.apple.com/114.114.114.114
|
||||
server=/devstreaming-cdn.apple.com/114.114.114.114
|
||||
server=/download.developer.apple.com/114.114.114.114
|
||||
server=/experiments.apple.com/114.114.114.114
|
||||
server=/gs-loc-cn.apple.com/114.114.114.114
|
||||
server=/gs-loc.apple.com/114.114.114.114
|
||||
server=/gsp10-ssl-cn.ls.apple.com/114.114.114.114
|
||||
server=/gsp12-cn.ls.apple.com/114.114.114.114
|
||||
server=/gsp13-cn.ls.apple.com/114.114.114.114
|
||||
server=/gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114
|
||||
server=/gsp4-cn.ls.apple.com.edgekey.net/114.114.114.114
|
||||
server=/gsp4-cn.ls.apple.com/114.114.114.114
|
||||
server=/gsp5-cn.ls.apple.com/114.114.114.114
|
||||
server=/gsp85-cn-ssl.ls.apple.com/114.114.114.114
|
||||
server=/gspe19-2-cn-ssl.ls-apple.com.akadns.net/114.114.114.114
|
||||
server=/gspe19-2-cn-ssl.ls.apple.com/114.114.114.114
|
||||
server=/gspe19-cn-ssl.ls.apple.com/114.114.114.114
|
||||
server=/gspe19-cn.ls-apple.com.akadns.net/114.114.114.114
|
||||
server=/gspe19-cn.ls.apple.com/114.114.114.114
|
||||
server=/gspe21-ssl.ls.apple.com/114.114.114.114
|
||||
server=/gspe21.ls.apple.com/114.114.114.114
|
||||
server=/gspe35-ssl.ls.apple.com/114.114.114.114
|
||||
server=/gspe79-cn-ssl.ls.apple.com/114.114.114.114
|
||||
server=/guzzoni-apple-com.v.aaplimg.com/114.114.114.114
|
||||
server=/guzzoni.apple.com/114.114.114.114
|
||||
server=/guzzoni.smoot.apple.com/114.114.114.114
|
||||
server=/iadsdk.apple.com/114.114.114.114
|
||||
server=/icloud-cdn.icloud.com.akadns.net/114.114.114.114
|
||||
server=/icloud.cdn-apple.com/114.114.114.114
|
||||
server=/images.apple.com.akadns.net/114.114.114.114
|
||||
server=/images.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114
|
||||
server=/images.apple.com/114.114.114.114
|
||||
server=/init-kt.apple.com/114.114.114.114
|
||||
server=/init-p01md-lb.push-apple.com.akadns.net/114.114.114.114
|
||||
server=/init-p01md.apple.com/114.114.114.114
|
||||
server=/init-p01st-lb.push-apple.com.akadns.net/114.114.114.114
|
||||
server=/init-p01st.push.apple.com/114.114.114.114
|
||||
server=/init-s01st-lb.push-apple.com.akadns.net/114.114.114.114
|
||||
server=/init-s01st.push.apple.com/114.114.114.114
|
||||
server=/init.ess.apple.com/114.114.114.114
|
||||
server=/iosapps.itunes.g.aaplimg.com/114.114.114.114
|
||||
server=/ipcdn.apple.com/114.114.114.114
|
||||
server=/iphone-ld.apple.com/114.114.114.114
|
||||
server=/iphone-ld.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/is-ssl.mzstatic.com-cn-lb.itunes-apple.com.akadns.net/114.114.114.114
|
||||
server=/is1-ssl.mzstatic.com/114.114.114.114
|
||||
server=/is1.mzstatic.com/114.114.114.114
|
||||
server=/is2-ssl.mzstatic.com/114.114.114.114
|
||||
server=/is2.mzstatic.com/114.114.114.114
|
||||
server=/is3-ssl.mzstatic.com/114.114.114.114
|
||||
server=/is3.mzstatic.com/114.114.114.114
|
||||
server=/is4-ssl.mzstatic.com/114.114.114.114
|
||||
server=/is4.mzstatic.com/114.114.114.114
|
||||
server=/is5-ssl.mzstatic.com/114.114.114.114
|
||||
server=/is5.mzstatic.com/114.114.114.114
|
||||
server=/itunes-apple.com.akadns.net/114.114.114.114
|
||||
server=/itunes.apple.com/114.114.114.114
|
||||
server=/itunesconnect.apple.com/114.114.114.114
|
||||
server=/mesu-cdn.apple.com.akadns.net/114.114.114.114
|
||||
server=/mesu-china.apple.com.akadns.net/114.114.114.114
|
||||
server=/mesu.apple.com/114.114.114.114
|
||||
server=/ml.cdn-apple.com/114.114.114.114
|
||||
server=/music.apple.com/114.114.114.114
|
||||
server=/ocsp-lb.apple.com.akadns.net/114.114.114.114
|
||||
server=/ocsp.apple.com/114.114.114.114
|
||||
server=/ocsp2-lb.apple.com.akadns.net/114.114.114.114
|
||||
server=/ocsp2.apple.com/114.114.114.114
|
||||
server=/oscdn.apple.com/114.114.114.114
|
||||
server=/oscdn.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/osxapps.itunes.g.aaplimg.com/114.114.114.114
|
||||
server=/pancake.apple.com/114.114.114.114
|
||||
server=/pancake.cdn-apple.com.akadns.net/114.114.114.114
|
||||
server=/pba0.apple.com/114.114.114.114
|
||||
server=/probe.siri.apple.com/114.114.114.114
|
||||
server=/prod-support.apple-support.akadns.net/114.114.114.114
|
||||
server=/publicassets.cdn-apple.com/114.114.114.114
|
||||
server=/reserve-prime.apple.com/114.114.114.114
|
||||
server=/s.mzstatic.com/114.114.114.114
|
||||
server=/seed-sequoia.siri.apple.com/114.114.114.114
|
||||
server=/seed-swallow.siri.apple.com/114.114.114.114
|
||||
server=/seed.siri.apple.com/114.114.114.114
|
||||
server=/sequoia.apple.com/114.114.114.114
|
||||
server=/sh-pod2-smp-device.apple.com/114.114.114.114
|
||||
server=/shazam-insights.cdn-apple.com/114.114.114.114
|
||||
server=/smp-device-content.apple.com/114.114.114.114
|
||||
server=/static.gc.apple.com/114.114.114.114
|
||||
server=/stocks-sparkline-lb.apple.com.akadns.net/114.114.114.114
|
||||
server=/stocks-sparkline.apple.com/114.114.114.114
|
||||
server=/store.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114
|
||||
server=/store.apple.com.edgekey.net/114.114.114.114
|
||||
server=/store.apple.com/114.114.114.114
|
||||
server=/store.storeimages.apple.com.akadns.net/114.114.114.114
|
||||
server=/store.storeimages.cdn-apple.com/114.114.114.114
|
||||
server=/support-china.apple-support.akadns.net/114.114.114.114
|
||||
server=/support.apple.com/114.114.114.114
|
||||
server=/swallow-apple-com.v.aaplimg.com/114.114.114.114
|
||||
server=/swallow.apple.com/114.114.114.114
|
||||
server=/swcatalog-cdn.apple.com.akadns.net/114.114.114.114
|
||||
server=/swcatalog.apple.com/114.114.114.114
|
||||
server=/swcdn.apple.com/114.114.114.114
|
||||
server=/swcdn.g.aaplimg.com/114.114.114.114
|
||||
server=/swdist.apple.com.akadns.net/114.114.114.114
|
||||
server=/swdist.apple.com/114.114.114.114
|
||||
server=/swscan-cdn.apple.com.akadns.net/114.114.114.114
|
||||
server=/swscan.apple.com/114.114.114.114
|
||||
server=/sylvan.apple.com/114.114.114.114
|
||||
server=/tj-pod1-smp-device.apple.com/114.114.114.114
|
||||
server=/updates-http.cdn-apple.com.akadns.net/114.114.114.114
|
||||
server=/updates-http.cdn-apple.com/114.114.114.114
|
||||
server=/updates.cdn-apple.com/114.114.114.114
|
||||
server=/valid.apple.com/114.114.114.114
|
||||
server=/valid.origin-apple.com.akadns.net/114.114.114.114
|
||||
server=/weather-data.apple.com.akadns.net/114.114.114.114
|
||||
server=/weather-data.apple.com/114.114.114.114
|
||||
server=/weather-map.apple.com/114.114.114.114
|
||||
server=/weather-map2.apple.com/114.114.114.114
|
||||
server=/weatherkit.apple.com/114.114.114.114
|
||||
server=/www.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114
|
||||
server=/www.apple.com.edgekey.net/114.114.114.114
|
||||
server=/www.apple.com/114.114.114.114
|
||||
server=/xp.apple.com/114.114.114.114
|
||||
Whitespace-only changes.
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,14 @@
|
||||
gvod.aiseejapp.atianqi.com
|
||||
stat.pandora.xiaomi.com
|
||||
upgrade.mishop.pandora.xiaomi.com
|
||||
logonext.tv.kuyun.com
|
||||
config.kuyun.com
|
||||
mishop.pandora.xiaomi.com
|
||||
dvb.pandora.xiaomi.com
|
||||
api.ad.xiaomi.com
|
||||
de.pandora.xiaomi.com
|
||||
data.mistat.xiaomi.com
|
||||
jellyfish.pandora.xiaomi.com
|
||||
gallery.pandora.xiaomi.com
|
||||
o2o.api.xiaomi.com
|
||||
bss.pandora.xiaomi.com
|
||||
@@ -0,0 +1,17 @@
|
||||
# cloudflare-dns.com
|
||||
sdns://AgcAAAAAAAAADjEwNC4xNi4yNDkuMjQ5ABJjbG91ZGZsYXJlLWRucy5jb20KL2Rucy1xdWVyeQ
|
||||
# Google
|
||||
sdns://AgUAAAAAAAAABzguOC40LjQgsKKKE4EwvtIbNjGjagI2607EdKSVHowYZtyvD9iPrkkHOC44LjQuNAovZG5zLXF1ZXJ5
|
||||
# dns.sb
|
||||
sdns://AgcAAAAAAAAADzE4NS4yMjIuMjIyLjIyMiAOp5Svj-oV-Fz-65-8H2VKHLKJ0egmfEgrdPeAQlUFFA8xODUuMjIyLjIyMi4yMjIKL2Rucy1xdWVyeQ
|
||||
# Quad9
|
||||
sdns://AgMAAAAAAAAADTE0OS4xMTIuMTEyLjkgsBkgdEu7dsmrBT4B4Ht-BQ5HPSD3n3vqQ1-v5DydJC8SZG5zOS5xdWFkOS5uZXQ6NDQzCi9kbnMtcXVlcnk
|
||||
sdns://AQMAAAAAAAAADDkuOS45Ljk6ODQ0MyBnyEe4yHWM0SAkVUO-dWdG3zTfHYTAC4xHA2jfgh2GPhkyLmRuc2NyeXB0LWNlcnQucXVhZDkubmV0
|
||||
# AdGuard
|
||||
sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20
|
||||
# Cloudflare
|
||||
sdns://AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk
|
||||
# TWNIC-101
|
||||
sdns://AgcAAAAAAAAAACC2vD25TAYM7EnyCH8Xw1-0g5OccnTsGH9vQUUH0njRtAxkbnMudHduaWMudHcKL2Rucy1xdWVyeQ
|
||||
# cs-tx
|
||||
sdns://AQYAAAAAAAAADTIwOS41OC4xNDcuMzYgMTNyrVlWMsJBa4cvCY-FG925ZShMbL6aTxkJZDDbqVoeMi5kbnNjcnlwdC1jZXJ0LmNyeXB0b3N0b3JtLmlz
|
||||
@@ -0,0 +1,110 @@
|
||||
server=/91smartyun.pt/127.0.0.1#5335
|
||||
ipset=/91smartyun.pt/gfwlist
|
||||
server=/adobe.com/127.0.0.1#5335
|
||||
ipset=/adobe.com/gfwlist
|
||||
server=/amazonaws.com/127.0.0.1#5335
|
||||
ipset=/amazonaws.com/gfwlist
|
||||
server=/ampproject.org/127.0.0.1#5335
|
||||
ipset=/ampproject.org/gfwlist
|
||||
server=/apple.news/127.0.0.1#5335
|
||||
ipset=/apple.news/gfwlist
|
||||
server=/aws.amazon.com/127.0.0.1#5335
|
||||
ipset=/aws.amazon.com/gfwlist
|
||||
server=/azureedge.net/127.0.0.1#5335
|
||||
ipset=/azureedge.net/gfwlist
|
||||
server=/backpackers.com.tw/127.0.0.1#5335
|
||||
ipset=/backpackers.com.tw/gfwlist
|
||||
server=/bitfinex.com/127.0.0.1#5335
|
||||
ipset=/bitfinex.com/gfwlist
|
||||
server=/buzzfeed.com/127.0.0.1#5335
|
||||
ipset=/buzzfeed.com/gfwlist
|
||||
server=/clockwise.ee/127.0.0.1#5335
|
||||
ipset=/clockwise.ee/gfwlist
|
||||
server=/cloudfront.net/127.0.0.1#5335
|
||||
ipset=/cloudfront.net/gfwlist
|
||||
server=/coindesk.com/127.0.0.1#5335
|
||||
ipset=/coindesk.com/gfwlist
|
||||
server=/coinsquare.io/127.0.0.1#5335
|
||||
ipset=/coinsquare.io/gfwlist
|
||||
server=/cryptocompare.com/127.0.0.1#5335
|
||||
ipset=/cryptocompare.com/gfwlist
|
||||
server=/dropboxstatic.com/127.0.0.1#5335
|
||||
ipset=/dropboxstatic.com/gfwlist
|
||||
server=/eurecom.fr/127.0.0.1#5335
|
||||
ipset=/eurecom.fr/gfwlist
|
||||
server=/gdax.com/127.0.0.1#5335
|
||||
ipset=/gdax.com/gfwlist
|
||||
server=/github.com/127.0.0.1#5335
|
||||
ipset=/github.com/gfwlist
|
||||
server=/kknews.cc/127.0.0.1#5335
|
||||
ipset=/kknews.cc/gfwlist
|
||||
server=/nutaq.com/127.0.0.1#5335
|
||||
ipset=/nutaq.com/gfwlist
|
||||
server=/openairinterface.org/127.0.0.1#5335
|
||||
ipset=/openairinterface.org/gfwlist
|
||||
server=/skype.com/127.0.0.1#5335
|
||||
ipset=/skype.com/gfwlist
|
||||
server=/sublimetext.com/127.0.0.1#5335
|
||||
ipset=/sublimetext.com/gfwlist
|
||||
server=/textnow.com/127.0.0.1#5335
|
||||
ipset=/textnow.com/gfwlist
|
||||
server=/textnow.me/127.0.0.1#5335
|
||||
ipset=/textnow.me/gfwlist
|
||||
server=/trouter.io/127.0.0.1#5335
|
||||
ipset=/trouter.io/gfwlist
|
||||
server=/t66y.com/127.0.0.1#5335
|
||||
ipset=/t66y.com/gfwlist
|
||||
server=/uploaded.net/127.0.0.1#5335
|
||||
ipset=/uploaded.net/gfwlist
|
||||
server=/v2rayssr.com/127.0.0.1#5335
|
||||
ipset=/v2rayssr.com/gfwlist
|
||||
server=/whatsapp.com/127.0.0.1#5335
|
||||
ipset=/whatsapp.com/gfwlist
|
||||
server=/whatsapp.net/127.0.0.1#5335
|
||||
ipset=/whatsapp.net/gfwlist
|
||||
server=/wsj.net/127.0.0.1#5335
|
||||
ipset=/wsj.net/gfwlist
|
||||
server=/google.com/127.0.0.1#5335
|
||||
ipset=/google.com/gfwlist
|
||||
server=/google.com.hk/127.0.0.1#5335
|
||||
ipset=/google.com.hk/gfwlist
|
||||
server=/gstatic.com/127.0.0.1#5335
|
||||
ipset=/gstatic.com/gfwlist
|
||||
server=/googleusercontent.com/127.0.0.1#5335
|
||||
ipset=/googleusercontent.com/gfwlist
|
||||
server=/googlepages.com/127.0.0.1#5335
|
||||
ipset=/googlepages.com/gfwlist
|
||||
server=/googlevideo.com/127.0.0.1#5335
|
||||
ipset=/googlevideo.com/gfwlist
|
||||
server=/googlecode.com/127.0.0.1#5335
|
||||
ipset=/googlecode.com/gfwlist
|
||||
server=/googleapis.com/127.0.0.1#5335
|
||||
ipset=/googleapis.com/gfwlist
|
||||
server=/googlesource.com/127.0.0.1#5335
|
||||
ipset=/googlesource.com/gfwlist
|
||||
server=/googledrive.com/127.0.0.1#5335
|
||||
ipset=/googledrive.com/gfwlist
|
||||
server=/ggpht.com/127.0.0.1#5335
|
||||
ipset=/ggpht.com/gfwlist
|
||||
server=/youtube.com/127.0.0.1#5335
|
||||
ipset=/youtube.com/gfwlist
|
||||
server=/youtu.be/127.0.0.1#5335
|
||||
ipset=/youtu.be/gfwlist
|
||||
server=/ytimg.com/127.0.0.1#5335
|
||||
ipset=/ytimg.com/gfwlist
|
||||
server=/twitter.com/127.0.0.1#5335
|
||||
ipset=/twitter.com/gfwlist
|
||||
server=/facebook.com/127.0.0.1#5335
|
||||
ipset=/facebook.com/gfwlist
|
||||
server=/fastly.net/127.0.0.1#5335
|
||||
ipset=/fastly.net/gfwlist
|
||||
server=/akamai.net/127.0.0.1#5335
|
||||
ipset=/akamai.net/gfwlist
|
||||
server=/akamaiedge.net/127.0.0.1#5335
|
||||
ipset=/akamaiedge.net/gfwlist
|
||||
server=/akamaihd.net/127.0.0.1#5335
|
||||
ipset=/akamaihd.net/gfwlist
|
||||
server=/edgesuite.net/127.0.0.1#5335
|
||||
ipset=/edgesuite.net/gfwlist
|
||||
server=/edgekey.net/127.0.0.1#5335
|
||||
ipset=/edgekey.net/gfwlist
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,43 @@
|
||||
log:
|
||||
level: info
|
||||
plugins:
|
||||
- tag: lazy_cache
|
||||
type: cache
|
||||
args:
|
||||
size: 8000
|
||||
lazy_cache_ttl: 86400
|
||||
|
||||
- tag: forward_google
|
||||
type: forward
|
||||
args:
|
||||
concurrent: 2
|
||||
upstreams:
|
||||
|
||||
- tag: main_sequence_disable_IPv6
|
||||
type: sequence
|
||||
args:
|
||||
- exec: $lazy_cache
|
||||
- exec: prefer_ipv4
|
||||
- exec: $forward_google
|
||||
- matches:
|
||||
- qtype 28 65
|
||||
exec: reject 0
|
||||
|
||||
- tag: main_sequence_with_IPv6
|
||||
type: sequence
|
||||
args:
|
||||
- exec: $lazy_cache
|
||||
- exec: $forward_google
|
||||
|
||||
- tag: udp_server
|
||||
type: udp_server
|
||||
args:
|
||||
entry: DNS_MODE
|
||||
listen: 0.0.0.0:DNS_PORT
|
||||
|
||||
- tag: tcp_server
|
||||
type: tcp_server
|
||||
args:
|
||||
entry: DNS_MODE
|
||||
listen: 0.0.0.0:DNS_PORT
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
8.41.4.0/24
|
||||
23.23.189.144/28
|
||||
23.246.0.0/18
|
||||
34.195.253.0/25
|
||||
34.210.42.111/32
|
||||
37.77.184.0/21
|
||||
38.72.126.0/24
|
||||
45.57.0.0/17
|
||||
52.24.178.0/24
|
||||
52.35.140.0/24
|
||||
52.89.124.203/32
|
||||
54.148.37.5/32
|
||||
54.204.25.0/28
|
||||
54.213.167.0/24
|
||||
64.120.128.0/17
|
||||
66.197.128.0/17
|
||||
69.53.224.0/19
|
||||
103.87.204.0/22
|
||||
108.175.32.0/20
|
||||
185.2.220.0/22
|
||||
185.9.188.0/22
|
||||
192.173.64.0/18
|
||||
198.38.96.0/19
|
||||
198.45.48.0/20
|
||||
203.75.84.0/24
|
||||
203.198.13.0/24
|
||||
203.198.80.0/24
|
||||
207.45.72.0/22
|
||||
208.75.76.0/22
|
||||
210.0.153.0/24
|
||||
@@ -0,0 +1,7 @@
|
||||
bilibili.com
|
||||
bilibili.cn
|
||||
bilivideo.com
|
||||
bilivideo.cn
|
||||
biliapi.com
|
||||
biliapi.net
|
||||
apple.com
|
||||
+144
@@ -0,0 +1,144 @@
|
||||
#!/bin/sh
|
||||
|
||||
if [ -e "/etc/config/ucitrack" ]; then
|
||||
uci -q batch <<-EOF
|
||||
delete ucitrack.@shadowsocksr[-1]
|
||||
add ucitrack shadowsocksr
|
||||
set ucitrack.@shadowsocksr[-1].init=shadowsocksr
|
||||
commit ucitrack
|
||||
EOF
|
||||
fi
|
||||
|
||||
uci -q batch <<-EOF
|
||||
delete firewall.shadowsocksr
|
||||
set firewall.shadowsocksr=include
|
||||
set firewall.shadowsocksr.type=script
|
||||
set firewall.shadowsocksr.path=/var/etc/shadowsocksr.include
|
||||
$(command -v fw4 >/dev/null 2>&1 || echo "set firewall.shadowsocksr.reload=1")
|
||||
commit firewall
|
||||
EOF
|
||||
|
||||
rm -rf /etc/config/shadowsocksr-opkg /etc/ssrplus/*opkg
|
||||
touch /etc/ssrplus/china_ssr.txt
|
||||
touch /etc/ssrplus/deny.list
|
||||
touch /etc/ssrplus/white.list
|
||||
touch /etc/ssrplus/black.list
|
||||
touch /etc/ssrplus/gfw_base.conf
|
||||
touch /etc/ssrplus/gfw_list.conf
|
||||
touch /etc/ssrplus/ad.conf
|
||||
touch /etc/config/shadowsocksr
|
||||
|
||||
if [ -s "/etc/config/shadowsocksr" ]; then
|
||||
if uci -q get shadowsocksr.@server_subscribe[0].auto_update_time > /dev/null; then
|
||||
uci -q delete shadowsocksr.@server_subscribe[0].auto_update_time
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@server_subscribe[0].auto_update_week_time > /dev/null; then
|
||||
uci -q set shadowsocksr.@server_subscribe[0].auto_update_week_time='*'
|
||||
uci -q set shadowsocksr.@server_subscribe[0].auto_update_day_time='2'
|
||||
uci -q set shadowsocksr.@server_subscribe[0].auto_update_min_time='0'
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@server_subscribe[0].config_auto_update_mode > /dev/null; then
|
||||
uci -q set shadowsocksr.@server_subscribe[0].config_auto_update_mode='0'
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@server_subscribe[0].config_update_interval > /dev/null; then
|
||||
uci -q set shadowsocksr.@server_subscribe[0].config_update_interval='60'
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@server_subscribe[0].user_agent > /dev/null; then
|
||||
uci -q set shadowsocksr.@server_subscribe[0].user_agent='v2rayN/9.99'
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@server_subscribe[0].proxy > /dev/null; then
|
||||
uci -q set shadowsocksr.@server_subscribe[0].proxy='1'
|
||||
fi
|
||||
|
||||
current_filter_words="$(uci -q get shadowsocksr.@server_subscribe[0].filter_words)"
|
||||
if [ -z "$current_filter_words" ]; then
|
||||
uci -q set shadowsocksr.@server_subscribe[0].filter_words='过期/重置/套餐/剩余/网址/QQ群/官网/防失联/回国'
|
||||
elif ! printf '%s\n' "$current_filter_words" | grep -q '重置'; then
|
||||
uci -q set shadowsocksr.@server_subscribe[0].filter_words="${current_filter_words}/重置"
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@global_xray_fragment[0] > /dev/null; then
|
||||
uci -q add shadowsocksr global_xray_fragment
|
||||
uci -q set shadowsocksr.@global_xray_fragment[0].fragment='0'
|
||||
uci -q set shadowsocksr.@global_xray_fragment[0].noise='0'
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@global[0].component_mirror > /dev/null; then
|
||||
uci -q set shadowsocksr.@global[0].component_mirror='direct'
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@global[0].filter_aaaa > /dev/null; then
|
||||
legacy_filter_aaaa="$(uci -q get shadowsocksr.@global[0].mosdns_ipv6)"
|
||||
uci -q set shadowsocksr.@global[0].filter_aaaa="${legacy_filter_aaaa:-1}"
|
||||
fi
|
||||
|
||||
legacy_dns_mode="$(uci -q get shadowsocksr.@global[0].pdnsd_enable)"
|
||||
if [ "$legacy_dns_mode" = "2" ] || [ "$legacy_dns_mode" = "3" ]; then
|
||||
uci -q set shadowsocksr.@global[0].pdnsd_enable='1'
|
||||
fi
|
||||
|
||||
if uci -q get shadowsocksr.@global[0].mosdns_ipv6 > /dev/null; then
|
||||
uci -q delete shadowsocksr.@global[0].mosdns_ipv6
|
||||
fi
|
||||
|
||||
if ! uci -q get shadowsocksr.@http_proxy[0] > /dev/null; then
|
||||
uci -q add shadowsocksr http_proxy
|
||||
uci -q set shadowsocksr.@http_proxy[0].server='nil'
|
||||
uci -q set shadowsocksr.@http_proxy[0].local_port='3128'
|
||||
uci -q set shadowsocksr.@http_proxy[0].http_auth='none'
|
||||
fi
|
||||
|
||||
ss_rust_bin="$(command -v ssserver 2>/dev/null)"
|
||||
[ -n "$ss_rust_bin" ] || [ ! -x /usr/libexec/ssserver ] || ss_rust_bin="/usr/libexec/ssserver"
|
||||
mihomo_bin="$(command -v mihomo 2>/dev/null)"
|
||||
[ -n "$mihomo_bin" ] || [ ! -x /usr/libexec/mihomo ] || mihomo_bin="/usr/libexec/mihomo"
|
||||
xray_bin="$(command -v xray 2>/dev/null)"
|
||||
[ -n "$xray_bin" ] || [ ! -x /usr/libexec/xray ] || xray_bin="/usr/libexec/xray"
|
||||
for section in $(uci -q show shadowsocksr | sed -n "s/^shadowsocksr\\.\\([^.=][^.=]*\\)=servers$/\\1/p"); do
|
||||
node_type="$(uci -q get shadowsocksr.${section}.type)"
|
||||
case "$node_type" in
|
||||
ss|ss-libev)
|
||||
if [ -n "$mihomo_bin" ]; then
|
||||
uci -q set shadowsocksr.${section}.type='ss'
|
||||
elif [ -n "$ss_rust_bin" ]; then
|
||||
uci -q set shadowsocksr.${section}.type='ss-rust'
|
||||
elif [ -n "$xray_bin" ]; then
|
||||
uci -q set shadowsocksr.${section}.type='v2ray'
|
||||
uci -q set shadowsocksr.${section}.v2ray_protocol='shadowsocks'
|
||||
fi
|
||||
;;
|
||||
v2ray)
|
||||
if [ "$(uci -q get shadowsocksr.${section}.v2ray_protocol)" = "shadowsocks" ] && [ -n "$mihomo_bin" ]; then
|
||||
uci -q set shadowsocksr.${section}.type='ss'
|
||||
uci -q delete shadowsocksr.${section}.v2ray_protocol
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
uci -q commit shadowsocksr
|
||||
fi
|
||||
|
||||
[ -s "/etc/config/shadowsocksr" ] || /etc/init.d/shadowsocksr reset
|
||||
|
||||
sed -i "s/option type 'vmess'/option type 'v2ray'\n\toption v2ray_protocol 'vmess'/g" /etc/config/shadowsocksr
|
||||
sed -i "s/option type 'vless'/option type 'v2ray'\n\toption v2ray_protocol 'vless'/g" /etc/config/shadowsocksr
|
||||
sed -i "s/option encrypt_method_v2ray_ss/option encrypt_method_ss/g" /etc/config/shadowsocksr
|
||||
sed -i "s/option xtls/option tls/g" /etc/config/shadowsocksr
|
||||
sed -i "/option vless_flow/d" /etc/config/shadowsocksr
|
||||
sed -i "/option fingerprint 'disable'/d" /etc/config/shadowsocksr
|
||||
|
||||
if [ -s "/etc/uwsgi/vassals/luci-webui.ini" ];then
|
||||
limit=$(cat /etc/uwsgi/vassals/luci-webui.ini | grep -Eo "limit-as.*"|grep -Eo "[0-9]+")
|
||||
[ $limit -lt 5000 ] && sed -i '/limit-as/c\limit-as = 5000' /etc/uwsgi/vassals/luci-webui.ini && \
|
||||
/etc/init.d/uwsgi restart
|
||||
fi
|
||||
|
||||
rm -f /tmp/luci-indexcache /tmp/luci-indexcache.*
|
||||
rm -rf /tmp/luci-modulecache/
|
||||
exit 0
|
||||
@@ -0,0 +1,11 @@
|
||||
--- luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus
|
||||
+++ luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus
|
||||
@@ -43,5 +43,8 @@ if [ -s "/etc/uwsgi/vassals/luci-webui.ini" ];then
|
||||
/etc/init.d/uwsgi restart
|
||||
fi
|
||||
|
||||
+grep -q ip-api.com /etc/ssrplus/black.list ||
|
||||
+ sed -i '$a ip-api.com' /etc/ssrplus/black.list
|
||||
+
|
||||
rm -rf /tmp/luci-modulecache /tmp/luci-indexcache
|
||||
exit 0
|
||||
Executable
+227
@@ -0,0 +1,227 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2017 openwrt-ssr
|
||||
# Copyright (C) 2017 yushi studio <ywb94@qq.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v3.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
. $IPKG_INSTROOT/etc/init.d/shadowsocksr
|
||||
LOCK_FILE="/var/lock/ssr-monitor.lock"
|
||||
[ -f "$LOCK_FILE" ] && exit 2
|
||||
touch "$LOCK_FILE"
|
||||
|
||||
ps_list() {
|
||||
if busybox ps -w >/dev/null 2>&1; then
|
||||
busybox ps -w
|
||||
else
|
||||
busybox ps
|
||||
fi
|
||||
}
|
||||
|
||||
match_proc_count() {
|
||||
local pattern="$1"
|
||||
ps_list | grep -E "$pattern" | grep -v grep | wc -l
|
||||
}
|
||||
|
||||
redir_tcp_running() {
|
||||
local ssr_count
|
||||
local ipt_count
|
||||
ssr_count=$(match_proc_count 'ssr-retcp')
|
||||
ipt_count=$(ps_list | grep 'ipt2socks' | grep -v grep | grep -E ' -T( |$)| --tcp-only( |$)' | wc -l)
|
||||
echo $((ssr_count + ipt_count))
|
||||
}
|
||||
|
||||
redir_udp_running() {
|
||||
local ssr_count
|
||||
local ipt_count
|
||||
ssr_count=$(match_proc_count 'ssr-reudp')
|
||||
ipt_count=$(ps_list | grep 'ipt2socks' | grep -v grep | grep -E ' -U( |$)| --udp-only( |$)' | wc -l)
|
||||
echo $((ssr_count + ipt_count))
|
||||
}
|
||||
|
||||
kill_matched_procs() {
|
||||
local pattern="$1"
|
||||
ps_list | grep -E "$pattern" | grep -v grep | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1
|
||||
}
|
||||
|
||||
get_expected_threads() {
|
||||
local threads
|
||||
threads=$(uci_get_by_type global threads 0)
|
||||
if [ "$threads" = "0" ] || [ -z "$threads" ]; then
|
||||
threads=$(grep -c '^processor' /proc/cpuinfo 2>/dev/null)
|
||||
fi
|
||||
|
||||
case "$threads" in
|
||||
''|*[!0-9]*)
|
||||
threads=1
|
||||
;;
|
||||
esac
|
||||
|
||||
[ "$threads" -lt 1 ] && threads=1
|
||||
echo "$threads"
|
||||
}
|
||||
|
||||
server_process_count=$1
|
||||
redir_tcp_process=$2
|
||||
redir_udp_process=$3
|
||||
kcp_process=$4
|
||||
local_process=$5
|
||||
pdnsd_process=$6
|
||||
if [ -z "$pdnsd_process" ]; then
|
||||
pdnsd_process=0
|
||||
fi
|
||||
i=0
|
||||
GLOBAL_SERVER=$(uci_get_by_type global global_server)
|
||||
GLOBAL_TYPE=$(uci_get_by_name $GLOBAL_SERVER type)
|
||||
EXPECTED_THREADS=$(get_expected_threads)
|
||||
server=$(uci_get_by_name $GLOBAL_SERVER server)
|
||||
kcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port)
|
||||
server_port=$(uci_get_by_name $GLOBAL_SERVER server_port)
|
||||
password=$(uci_get_by_name $GLOBAL_SERVER kcp_password)
|
||||
kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param)
|
||||
[ "$password" != "" ] && password="--key "${password}
|
||||
|
||||
while [ "1" == "1" ]; do #死循环
|
||||
sleep 000030s
|
||||
#redir tcp
|
||||
if [ "$redir_tcp_process" -gt 0 ]; then
|
||||
icount=$(redir_tcp_running)
|
||||
local tcp_expected="$redir_tcp_process"
|
||||
if [ "$GLOBAL_TYPE" = "socks5" ]; then
|
||||
tcp_expected="$EXPECTED_THREADS"
|
||||
fi
|
||||
if [ "$icount" -lt "$tcp_expected" ]; then
|
||||
logger -t "$NAME" "ssrplus redir tcp error.restart!"
|
||||
echolog "ssrplus redir tcp error.restart!"
|
||||
/etc/init.d/shadowsocksr restart
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
#redir udp
|
||||
if [ "$redir_udp_process" -gt 0 ]; then
|
||||
icount=$(redir_udp_running)
|
||||
local udp_expected="$redir_udp_process"
|
||||
if [ "$GLOBAL_TYPE" = "socks5" ]; then
|
||||
udp_expected="$EXPECTED_THREADS"
|
||||
fi
|
||||
if [ "$icount" -lt "$udp_expected" ]; then
|
||||
logger -t "$NAME" "ssrplus redir udp error.restart!"
|
||||
echolog "ssrplus redir udp error.restart!"
|
||||
/etc/init.d/shadowsocksr restart
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
#server
|
||||
if [ "$server_process_count" -gt 0 ]; then
|
||||
icount=$(match_proc_count 'ssr-server|ss-server-|xray-server-')
|
||||
if [ "$icount" -lt "$server_process_count" ]; then #如果进程挂掉就重启它
|
||||
logger -t "$NAME" "ssrplus server error.restart!"
|
||||
echolog "ssrplus server error.restart!"
|
||||
kill_matched_procs 'ssr-server|ss-server-'
|
||||
/etc/init.d/shadowsocksr restart
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
#kcptun
|
||||
if [ "$kcp_process" -gt 0 ]; then
|
||||
icount=$(ps_list | grep kcptun-client | grep -v grep | wc -l)
|
||||
if [ "$icount" -lt "$kcp_process" ]; then #如果进程挂掉就重启它
|
||||
logger -t "$NAME" "ssrplus kcptun error.restart!"
|
||||
echolog "ssrplus kcptun error.restart!"
|
||||
killall -q -9 kcptun-client
|
||||
(/usr/bin/kcptun-client -r $server:$kcp_port -l :$server_port $password $kcp_param &)
|
||||
fi
|
||||
fi
|
||||
#localsocks
|
||||
if [ "$local_process" -gt 0 ]; then
|
||||
icount=$(match_proc_count 'ssr-local|ss-local|tuic-local')
|
||||
if [ "$icount" -lt "$local_process" ]; then #如果进程挂掉就重启它
|
||||
logger -t "$NAME" "global socks server error.restart!"
|
||||
echolog "global socks server error.restart!"
|
||||
kill_matched_procs 'ssr-local|ss-local|tuic-local'
|
||||
/etc/init.d/shadowsocksr restart
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
#dns2tcp
|
||||
if [ "$pdnsd_process" -eq 1 ]; then
|
||||
icount=$(ps_list | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | wc -l)
|
||||
if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
|
||||
logger -t "$NAME" "dns2tcp tunnel error.restart!"
|
||||
echolog "dns2tcp tunnel error.restart!"
|
||||
dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)
|
||||
kill -9 $(ps_list | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
start_dns2tcp "$dnsserver"
|
||||
fi
|
||||
#mosdns
|
||||
elif [ "$pdnsd_process" -eq 4 ]; then
|
||||
icount=$(ps_list | grep $TMP_BIN_PATH/mosdns | grep -v grep | wc -l)
|
||||
if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
|
||||
logger -t "$NAME" "mosdns tunnel error.restart!"
|
||||
echolog "mosdns tunnel error.restart!"
|
||||
dnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)
|
||||
kill -9 $(ps_list | grep $TMP_BIN_PATH/mosdns | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
ln_start_bin $(first_type mosdns) mosdns start -c /etc/mosdns/config.yaml
|
||||
fi
|
||||
#chinadns-ng(proxy)
|
||||
elif [ "$pdnsd_process" -eq 6 ]; then
|
||||
icount=$(ps_list | grep -e ssrplus-dns -e "chinadns-ng -b 127.0.0.1 -l $tmp_dns_port" | grep -v grep | wc -l)
|
||||
if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
|
||||
logger -t "$NAME" "chinadns-ng $dnsserver tunnel error.restart!"
|
||||
echolog "chinadns-ng $dnsserver tunnel error.restart!"
|
||||
dnsserver=$(uci_get_by_type global chinadns_ng_tunnel_forward 8.8.4.4:53)
|
||||
kill -9 $(ps_list | grep "chinadns-ng -b 127.0.0.1 -l $tmp_dns_port" | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
local chinadns_ng_proto="$(uci_get_by_type global chinadns_ng_proto)"
|
||||
local chinadns_ng_dns=""
|
||||
IFS=','
|
||||
for chinadns_ng_server in $dnsserver; do
|
||||
local chinadns_ng_ip="${chinadns_ng_server%%:*}"
|
||||
local chinadns_ng_port="${chinadns_ng_server##*:}"
|
||||
[ "$chinadns_ng_ip" = "$chinadns_ng_port" ] && chinadns_ng_port="53"
|
||||
chinadns_ng_tls_port="853"
|
||||
case "$chinadns_ng_proto" in
|
||||
"none")
|
||||
chinadns_ng_server="${chinadns_ng_ip}#${chinadns_ng_port}"
|
||||
;;
|
||||
"tls")
|
||||
chinadns_ng_server="${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_tls_port}"
|
||||
;;
|
||||
*)
|
||||
chinadns_ng_server="${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_port}"
|
||||
;;
|
||||
esac
|
||||
chinadns_ng_dns="${chinadns_ng_dns} -t ${chinadns_ng_server}"
|
||||
done
|
||||
unset IFS
|
||||
dnsserver="$chinadns_ng_dns"
|
||||
ln_start_bin $(first_type chinadns-ng) chinadns-ng -b 127.0.0.1 -l $tmp_dns_port -l $dns_port -p 3 -d gfw $dnsserver -N --filter-qtype 64,65 -f -r --cache 4096 --cache-stale 86400 --cache-refresh 20
|
||||
fi
|
||||
#built-in dns
|
||||
elif [ "$pdnsd_process" -eq 7 ]; then
|
||||
if ! is_builtin_dns_active; then
|
||||
logger -t "$NAME" "builtin dns error.restart!"
|
||||
echolog "builtin dns error.restart!"
|
||||
/etc/init.d/shadowsocksr restart
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
#chinadns-ng(china)
|
||||
if [ "$(uci -q get "dhcp.@dnsmasq[0]._unused_ssrp_changed")" = "1" ]; then
|
||||
chinadns=$(uci_get_by_type global chinadns_forward)
|
||||
if [ -n "$chinadns" ] && [ "$chinadns" != "none" ]; then
|
||||
icount=$(ps_list | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | wc -l)
|
||||
if [ "$icount" -lt 1 ]; then #如果进程挂掉就重启它
|
||||
logger -t "$NAME" "chinadns-ng tunnel error.restart!"
|
||||
echolog "chinadns-ng tunnel error.restart!"
|
||||
wandns="$(ifstatus wan | jsonfilter -e '@["dns-server"][0]' || echo "119.29.29.29")"
|
||||
case "$chinadns" in
|
||||
"wan") chinadns="$wandns" ;;
|
||||
""|"wan_114") chinadns="$wandns,114.114.114.114" ;;
|
||||
esac
|
||||
kill -9 $(ps_list | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | awk '{print $1}') >/dev/null 2>&1
|
||||
ln_start_bin $(first_type chinadns-ng) chinadns-ng -l $china_dns_port -4 china -p 3 -c ${chinadns/:/#} -t 127.0.0.1#$dns_port -N -f -r
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
Executable
+1962
File diff suppressed because it is too large.
Load diff
Executable
+274
@@ -0,0 +1,274 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Copyright (C) 2017 openwrt-ssr
|
||||
# Copyright (C) 2017 yushi studio <ywb94@qq.com>
|
||||
#
|
||||
# This is free software, licensed under the GNU General Public License v3.
|
||||
# See /LICENSE for more information.
|
||||
#
|
||||
|
||||
ORIG_ARG1="${1:-}"
|
||||
ORIG_ARG2="${2:-}"
|
||||
ORIG_ARG3="${3:-}"
|
||||
[ -f /lib/functions.sh ] && . /lib/functions.sh
|
||||
. $IPKG_INSTROOT/etc/init.d/shadowsocksr
|
||||
LOCK_FILE="/var/lock/ssr-switch.lock"
|
||||
PROBE_SID=""
|
||||
|
||||
cycle_time=60
|
||||
switch_time=3
|
||||
probe_socks_port=10800
|
||||
direct_fail_count=0
|
||||
direct_fail_limit=3
|
||||
probe_url="$(uci_get_by_type server_subscribe url_test_url)"
|
||||
[ -n "$probe_url" ] || probe_url="https://www.google.com/generate_204"
|
||||
PROBE_INSTANCE_KEY="ssr-switch-probe-local"
|
||||
|
||||
DEFAULT_SERVER="$(uci_get_by_type global global_server)"
|
||||
CURRENT_SERVER="$DEFAULT_SERVER"
|
||||
ENABLE_SERVER="nil"
|
||||
|
||||
cleanup_probe_socks() {
|
||||
ps_list | grep -v "grep" | grep -E "tcp-http-ssr-switch-local\\.json|ss-${PROBE_INSTANCE_KEY}/config\\.yaml|tuic-${PROBE_INSTANCE_KEY}/config\\.yaml|v2ray-${PROBE_INSTANCE_KEY}/config\\.yaml" | awk '{print $1}' | xargs kill >/dev/null 2>&1
|
||||
sleep 1
|
||||
ps_list | grep -v "grep" | grep -E "tcp-http-ssr-switch-local\\.json|ss-${PROBE_INSTANCE_KEY}/config\\.yaml|tuic-${PROBE_INSTANCE_KEY}/config\\.yaml|v2ray-${PROBE_INSTANCE_KEY}/config\\.yaml" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1
|
||||
rm -f "$TMP_PATH/tcp-http-ssr-switch-local.json" 2>/dev/null
|
||||
rm -rf "$TMP_PATH/ss-${PROBE_INSTANCE_KEY}" "$TMP_PATH/tuic-${PROBE_INSTANCE_KEY}" "$TMP_PATH/v2ray-${PROBE_INSTANCE_KEY}" 2>/dev/null
|
||||
rm -f /tmp/ssr-switch-probe.log 2>/dev/null
|
||||
}
|
||||
|
||||
start_probe_socks() {
|
||||
local sid="$1"
|
||||
local server_type
|
||||
|
||||
server_type="$(uci_get_by_name "$sid" type)"
|
||||
[ "$server_type" = "clash" ] && return 1
|
||||
[ "$server_type" = "tuic" ] && return 1
|
||||
[ "$server_type" = "socks5" ] && return 1
|
||||
|
||||
cleanup_probe_socks
|
||||
LOCAL_SERVER="$sid"
|
||||
local_config_file="$TMP_PATH/tcp-http-ssr-switch-local.json"
|
||||
_local="2"
|
||||
local_enable=0
|
||||
tmp_local_port=
|
||||
mode="tcp,udp"
|
||||
|
||||
export SSR_SWITCH_PROBE=1
|
||||
export SSR_SWITCH_PROBE_INSTANCE_KEY="$PROBE_INSTANCE_KEY"
|
||||
start_local_with_port "$probe_socks_port" >/tmp/ssr-switch-probe.log 2>&1
|
||||
local rc=$?
|
||||
unset SSR_SWITCH_PROBE_INSTANCE_KEY
|
||||
unset SSR_SWITCH_PROBE
|
||||
[ "$rc" = "0" ] || return 1
|
||||
|
||||
sleep 2
|
||||
return 0
|
||||
}
|
||||
|
||||
probe_http_ok() {
|
||||
case "$1" in
|
||||
[1-5][0-9][0-9])
|
||||
return 0
|
||||
;;
|
||||
esac
|
||||
return 1
|
||||
}
|
||||
|
||||
check_direct_probe() {
|
||||
local code
|
||||
|
||||
code="$(curl -k -sS -L -o /dev/null \
|
||||
--connect-timeout "$switch_time" \
|
||||
--max-time "$switch_time" \
|
||||
-w '%{http_code}' \
|
||||
"$probe_url" 2>/dev/null || true)"
|
||||
probe_http_ok "$code"
|
||||
}
|
||||
|
||||
check_proxy_via_socks() {
|
||||
local try_count
|
||||
local code
|
||||
local proxy_host
|
||||
|
||||
try_count="$(uci_get_by_type global switch_try_count 3)"
|
||||
for i in $(seq 1 "$try_count"); do
|
||||
for proxy_host in "127.0.0.1:$probe_socks_port" "[::1]:$probe_socks_port"; do
|
||||
code="$(curl -k -sS -L -o /dev/null \
|
||||
--connect-timeout "$switch_time" \
|
||||
--max-time "$switch_time" \
|
||||
--socks5-hostname "$proxy_host" \
|
||||
-w '%{http_code}' \
|
||||
"$probe_url" 2>/dev/null || true)"
|
||||
probe_http_ok "$code" && return 0
|
||||
done
|
||||
sleep 1
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
test_proxy() {
|
||||
local sid="$1"
|
||||
[ "$(uci_get_by_name "$sid" type)" = "clash" ] && return 1
|
||||
[ "$(uci_get_by_name "$sid" type)" = "tuic" ] && return 1
|
||||
start_probe_socks "$sid" || {
|
||||
cleanup_probe_socks
|
||||
return 1
|
||||
}
|
||||
check_proxy_via_socks
|
||||
local ret=$?
|
||||
cleanup_probe_socks
|
||||
return $ret
|
||||
}
|
||||
|
||||
search_proxy() {
|
||||
local sid="$1"
|
||||
[ "$(uci_get_by_name "$sid" switch_enable 0)" = "1" ] || return 1
|
||||
[ "$(uci_get_by_name "$sid" type)" = "clash" ] && return 1
|
||||
[ "$(uci_get_by_name "$sid" type)" = "tuic" ] && return 1
|
||||
[ "$sid" = "$CURRENT_SERVER" ] && return 1
|
||||
[ "$ENABLE_SERVER" != "nil" ] && return 0
|
||||
|
||||
if test_proxy "$sid"; then
|
||||
ENABLE_SERVER="$sid"
|
||||
return 0
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
|
||||
select_proxy() {
|
||||
config_load "$NAME"
|
||||
ENABLE_SERVER="nil"
|
||||
config_foreach search_proxy servers
|
||||
}
|
||||
|
||||
set_main_server() {
|
||||
local sid="$1"
|
||||
[ -n "$sid" ] || return 1
|
||||
uci set shadowsocksr.@global[0].global_server="$sid"
|
||||
uci commit shadowsocksr
|
||||
return 0
|
||||
}
|
||||
|
||||
switch_proxy() {
|
||||
set_main_server "$1" || return 1
|
||||
/etc/init.d/shadowsocksr restart "$1"
|
||||
return 0
|
||||
}
|
||||
|
||||
start() {
|
||||
while [ "1" = "1" ]; do
|
||||
sleep "0000$cycle_time"
|
||||
run_once
|
||||
done
|
||||
}
|
||||
|
||||
run_once() {
|
||||
DEFAULT_SERVER="$(uci_get_by_type global global_server)"
|
||||
[ "$DEFAULT_SERVER" = "nil" ] && {
|
||||
direct_fail_count=0
|
||||
return 0
|
||||
}
|
||||
[ "$(uci_get_by_name "$DEFAULT_SERVER" type)" = "clash" ] && {
|
||||
direct_fail_count=0
|
||||
cleanup_probe_socks
|
||||
return 0
|
||||
}
|
||||
[ "$(uci_get_by_name "$DEFAULT_SERVER" type)" = "tuic" ] && {
|
||||
direct_fail_count=0
|
||||
cleanup_probe_socks
|
||||
return 0
|
||||
}
|
||||
[ "$(uci_get_by_name "$DEFAULT_SERVER" kcp_enable 0)" = "1" ] && {
|
||||
direct_fail_count=0
|
||||
cleanup_probe_socks
|
||||
return 1
|
||||
}
|
||||
|
||||
CURRENT_SERVER="$DEFAULT_SERVER"
|
||||
|
||||
if check_direct_probe; then
|
||||
direct_fail_count=0
|
||||
return 0
|
||||
fi
|
||||
|
||||
direct_fail_count=$((direct_fail_count + 1))
|
||||
[ "$direct_fail_count" -lt "$direct_fail_limit" ] && return 0
|
||||
direct_fail_count=0
|
||||
|
||||
if test_proxy "$CURRENT_SERVER"; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
echolog "Current server error, try to switch another server."
|
||||
select_proxy
|
||||
if [ "$ENABLE_SERVER" != "nil" ]; then
|
||||
CURRENT_SERVER="$ENABLE_SERVER"
|
||||
switch_proxy "$CURRENT_SERVER"
|
||||
echolog "Switch to $(uci_get_by_name "$CURRENT_SERVER" alias) proxy!"
|
||||
else
|
||||
switch_proxy "$CURRENT_SERVER"
|
||||
echolog "Try restart current server."
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
probe_once() {
|
||||
local sid="$1"
|
||||
[ -n "$sid" ] || {
|
||||
echo "missing_sid"
|
||||
return 1
|
||||
}
|
||||
cleanup_probe_socks
|
||||
if ! start_probe_socks "$sid"; then
|
||||
echo "probe_start:fail"
|
||||
return 1
|
||||
fi
|
||||
echo "probe_start:ok"
|
||||
echo "probe:curl_ipv4"
|
||||
curl -k -sS -L -o /dev/null \
|
||||
--connect-timeout "$switch_time" \
|
||||
--max-time "$switch_time" \
|
||||
--socks5-hostname "127.0.0.1:$probe_socks_port" \
|
||||
-w 'code=%{http_code}\n' \
|
||||
"$probe_url" 2>/dev/null || true
|
||||
echo "probe:curl_ipv6"
|
||||
curl -g -k -sS -L -o /dev/null \
|
||||
--connect-timeout "$switch_time" \
|
||||
--max-time "$switch_time" \
|
||||
--socks5-hostname "[::1]:$probe_socks_port" \
|
||||
-w 'code=%{http_code}\n' \
|
||||
"$probe_url" 2>/dev/null || true
|
||||
cleanup_probe_socks
|
||||
return 0
|
||||
}
|
||||
|
||||
main() {
|
||||
case "${ORIG_ARG1:-}" in
|
||||
probe)
|
||||
PROBE_SID="${ORIG_ARG2:-}"
|
||||
probe_once "$PROBE_SID"
|
||||
;;
|
||||
once)
|
||||
run_once
|
||||
;;
|
||||
start)
|
||||
[ -n "$ORIG_ARG2" ] && cycle_time="$ORIG_ARG2"
|
||||
[ -n "$ORIG_ARG3" ] && switch_time="$ORIG_ARG3"
|
||||
[ -f "$LOCK_FILE" ] && exit 2
|
||||
touch "$LOCK_FILE"
|
||||
start
|
||||
;;
|
||||
*)
|
||||
[ -n "$ORIG_ARG1" ] && cycle_time="$ORIG_ARG1"
|
||||
[ -n "$ORIG_ARG2" ] && switch_time="$ORIG_ARG2"
|
||||
[ -f "$LOCK_FILE" ] && exit 2
|
||||
touch "$LOCK_FILE"
|
||||
start
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
if [ "${0##*/}" = "ssr-switch" ]; then
|
||||
main "$@"
|
||||
fi
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"luci-app-ssr-plus": {
|
||||
"description": "Grant UCI access for luci-app-ssr-plus",
|
||||
"read": {
|
||||
"file": {
|
||||
"/etc/ssrplus/*": [ "read" ]
|
||||
},
|
||||
"uci": ["shadowsocksr"]
|
||||
},
|
||||
"write": {
|
||||
"file": {
|
||||
"/etc/ssrplus/*": [ "write" ]
|
||||
},
|
||||
"uci": ["shadowsocksr"]
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 215 KiB |
@@ -0,0 +1,53 @@
|
||||
#!/bin/sh
|
||||
|
||||
. $IPKG_INSTROOT/etc/init.d/shadowsocksr
|
||||
|
||||
check_run_environment
|
||||
|
||||
# 设置 china_ip 变量并检查文件是否存在
|
||||
china_ip="${1:-${china_ip:-/etc/ssrplus/china_ssr.txt}}"
|
||||
[ -f "$china_ip" ] || exit 1
|
||||
|
||||
case "$USE_TABLES" in
|
||||
nftables)
|
||||
skip_inet="${SKIP_INET:-0}"
|
||||
|
||||
case "$skip_inet" in
|
||||
1)
|
||||
{
|
||||
# ss_spec / inet (仅在表和 set 存在时添加)
|
||||
if nft list set inet ss_spec china >/dev/null 2>&1; then
|
||||
echo "add element inet ss_spec china {"
|
||||
grep -vE '^\s*#|^\s*$' "$china_ip" | sed 's/^/ /;s/$/,/'
|
||||
echo "}"
|
||||
fi
|
||||
} | nft -f - || exit 1
|
||||
;;
|
||||
2)
|
||||
{
|
||||
# ss_spec_mangle / ip (仅在表和 set 存在时添加)
|
||||
if nft list set ip ss_spec_mangle china >/dev/null 2>&1; then
|
||||
echo "add element ip ss_spec_mangle china {"
|
||||
grep -vE '^\s*#|^\s*$' "$china_ip" | sed 's/^/ /;s/$/,/'
|
||||
echo "}"
|
||||
fi
|
||||
} | nft -f - || exit 1
|
||||
;;
|
||||
*)
|
||||
echolog "chinaipset: invalid SKIP_INET=$skip_inet"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
iptables)
|
||||
ipset -! flush china 2>/dev/null
|
||||
ipset -! -R <<-EOF || exit 1
|
||||
create china hash:net
|
||||
$(grep -vE '^\s*#|^\s*$' "$china_ip" | sed 's/^/add china /')
|
||||
EOF
|
||||
;;
|
||||
*)
|
||||
echolog "ERROR: No supported firewall backend detected"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
File diff suppressed because it is too large.
Load diff
+1275
File diff suppressed because it is too large.
Load diff
+138
@@ -0,0 +1,138 @@
|
||||
#!/bin/sh
|
||||
|
||||
. $IPKG_INSTROOT/etc/init.d/shadowsocksr
|
||||
|
||||
check_run_environment
|
||||
|
||||
case "$USE_TABLES" in
|
||||
nftables)
|
||||
nft_support=1
|
||||
echolog "gfw2ipset: Using nftables"
|
||||
;;
|
||||
iptables)
|
||||
nft_support=0
|
||||
echolog "gfw2ipset: Using iptables"
|
||||
;;
|
||||
*)
|
||||
echolog "ERROR: No supported firewall backend detected"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
mkdir -p $TMP_DNSMASQ_PATH
|
||||
|
||||
run_mode=$(normalize_run_mode)
|
||||
|
||||
cp -rf /etc/ssrplus/gfw_list.conf $TMP_DNSMASQ_PATH/
|
||||
cp -rf /etc/ssrplus/gfw_base.conf $TMP_DNSMASQ_PATH/
|
||||
|
||||
for conf_file in gfw_base.conf gfw_list.conf; do
|
||||
conf="$TMP_DNSMASQ_PATH/$conf_file"
|
||||
[ -f "$conf" ] || continue
|
||||
|
||||
if [ "$run_mode" = "gfw" ]; then
|
||||
if [ "$nft_support" = "1" ]; then
|
||||
# gfw + nft:ipset → nftset
|
||||
sed -i 's|ipset=/\([^/]*\)/\([^[:space:]]*\)|nftset=/\1/inet#ss_spec#\2|g' "$conf"
|
||||
fi
|
||||
else
|
||||
# 非 gfw:无条件清理所有分流引用
|
||||
# sed -i '/^[[:space:]]*\(ipset=\|nftset=\)/d' "$conf"
|
||||
sed -i '/^[[:space:]]*ipset=/d' "$conf"
|
||||
fi
|
||||
done
|
||||
|
||||
# 此处使用 for 方式读取 防止 /etc/ssrplus/ 目录下的 black.list white.list deny.list 等2个或多个文件一行中存在空格 比如:# abc.com 而丢失:server
|
||||
# Optimize: Batch filter using grep
|
||||
for list_file in /etc/ssrplus/black.list /etc/ssrplus/white.list /etc/ssrplus/deny.list; do
|
||||
if [ -s "$list_file" ]; then
|
||||
# 清理注释和空行
|
||||
grep -vE '^\s*#|^\s*$' "$list_file" | sed 's/\r//g' > "${list_file}.clean"
|
||||
if [ -s "${list_file}.clean" ]; then
|
||||
for target_file in "$TMP_DNSMASQ_PATH/gfw_list.conf" "$TMP_DNSMASQ_PATH/gfw_base.conf"; do
|
||||
[ -f "$target_file" ] || continue
|
||||
tmp_file="${target_file}.tmp"
|
||||
awk -v list="${list_file}.clean" '
|
||||
BEGIN {
|
||||
while ((getline line < list) > 0) {
|
||||
gsub(/\r/, "", line)
|
||||
if (line != "") {
|
||||
domain[line] = 1
|
||||
# 同时支持 *.domain
|
||||
domain["*." line] = 1
|
||||
}
|
||||
}
|
||||
close(list)
|
||||
}
|
||||
{
|
||||
# 提取 server=/domain/xxx
|
||||
if (match($0, /^server=\/([^\/]+)\//, m)) {
|
||||
if (m[1] in domain) next
|
||||
}
|
||||
# 提取 ipset=/domain/xxx
|
||||
if (match($0, /^ipset=\/([^\/]+)\//, m)) {
|
||||
if (m[1] in domain) next
|
||||
}
|
||||
print
|
||||
}
|
||||
' "$target_file" > "$tmp_file"
|
||||
mv "$tmp_file" "$target_file"
|
||||
done
|
||||
fi
|
||||
rm -f "${list_file}.clean"
|
||||
fi
|
||||
done
|
||||
|
||||
# 此处直接使用 cat 因为有 sed '/#/d' 删除了 数据
|
||||
if [ "$nft_support" = "1" ]; then
|
||||
sed -e 's/[[:space:]]*#.*$//' -e '/^[[:space:]]*$/d' -e "s/.*/server=\/&\/127.0.0.1#$dns_port\nnftset=\/&\/inet#ss_spec#blacklist/" /etc/ssrplus/black.list > "$TMP_DNSMASQ_PATH/blacklist_forward.conf"
|
||||
sed -e 's/[[:space:]]*#.*$//' -e '/^[[:space:]]*$/d' -e "s/.*/server=\/&\/127.0.0.1\nnftset=\/&\/inet#ss_spec#whitelist/" /etc/ssrplus/white.list > "$TMP_DNSMASQ_PATH/whitelist_forward.conf"
|
||||
elif [ "$nft_support" = "0" ]; then
|
||||
sed -e 's/[[:space:]]*#.*$//' -e '/^[[:space:]]*$/d' -e "s/.*/server=\/&\/127.0.0.1#$dns_port\nipset=\/&\/blacklist/" /etc/ssrplus/black.list > "$TMP_DNSMASQ_PATH/blacklist_forward.conf"
|
||||
sed -e 's/[[:space:]]*#.*$//' -e '/^[[:space:]]*$/d' -e "s/.*/server=\/&\/127.0.0.1\nipset=\/&\/whitelist/" /etc/ssrplus/white.list > "$TMP_DNSMASQ_PATH/whitelist_forward.conf"
|
||||
fi
|
||||
|
||||
sed -e 's/[[:space:]]*#.*$//' -e '/^[[:space:]]*$/d' -e "s/.*/address=\/&\//" /etc/ssrplus/deny.list > "$TMP_DNSMASQ_PATH/denylist.conf"
|
||||
|
||||
if [ "$(uci_get_by_type global adblock 0)" == "1" ]; then
|
||||
cp -f /etc/ssrplus/ad.conf "$TMP_DNSMASQ_PATH/"
|
||||
if [ -f "$TMP_DNSMASQ_PATH/ad.conf" ]; then
|
||||
for list_file in /etc/ssrplus/black.list /etc/ssrplus/white.list /etc/ssrplus/deny.list; do
|
||||
if [ -s "$list_file" ]; then
|
||||
# 清理注释 & 空行
|
||||
grep -vE '^\s*#|^\s*$' "$list_file" | sed 's/\r//g' > "${list_file}.clean"
|
||||
if [ -s "${list_file}.clean" ]; then
|
||||
tmp_file="$TMP_DNSMASQ_PATH/ad.conf.tmp"
|
||||
awk -v list="${list_file}.clean" '
|
||||
BEGIN {
|
||||
while ((getline line < list) > 0) {
|
||||
gsub(/\r/, "", line)
|
||||
if (line != "") {
|
||||
domain[line] = 1
|
||||
# 支持泛域名
|
||||
domain["*." line] = 1
|
||||
}
|
||||
}
|
||||
close(list)
|
||||
}
|
||||
{
|
||||
keep = 1
|
||||
# 精确匹配 server=/domain/
|
||||
if (match($0, /^server=\/([^\/]+)\//, m)) {
|
||||
if (m[1] in domain) keep = 0
|
||||
}
|
||||
# 精确匹配 ipset=/domain/
|
||||
if (match($0, /^ipset=\/([^\/]+)\//, m)) {
|
||||
if (m[1] in domain) keep = 0
|
||||
}
|
||||
if (keep) print
|
||||
}
|
||||
' "$TMP_DNSMASQ_PATH/ad.conf" > "$tmp_file"
|
||||
mv "$tmp_file" "$TMP_DNSMASQ_PATH/ad.conf"
|
||||
fi
|
||||
rm -f "${list_file}.clean"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
else
|
||||
rm -f "$TMP_DNSMASQ_PATH/ad.conf"
|
||||
fi
|
||||
@@ -0,0 +1,67 @@
|
||||
|
||||
config global
|
||||
option global_server 'nil'
|
||||
option threads '0'
|
||||
option run_mode 'router'
|
||||
option dports '2'
|
||||
option custom_ports '80,443'
|
||||
option pdnsd_enable '1'
|
||||
option filter_aaaa '1'
|
||||
option tunnel_forward '8.8.4.4:53'
|
||||
option monitor_enable '1'
|
||||
option enable_switch '1'
|
||||
option switch_time '667'
|
||||
option switch_timeout '5'
|
||||
option switch_try_count '3'
|
||||
option default_node_local_port '1234'
|
||||
option component_mirror 'direct'
|
||||
option gfwlist_url 'https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt'
|
||||
option chnroute_url 'https://ispip.clang.cn/all_cn.txt'
|
||||
option adblock_url 'https://anti-ad.net/anti-ad-for-dnsmasq.conf'
|
||||
|
||||
config server_subscribe
|
||||
option proxy '1'
|
||||
option auto_update '1'
|
||||
option config_auto_update_mode '0'
|
||||
option config_update_interval '60'
|
||||
option auto_update_week_time '*'
|
||||
option auto_update_day_time '2'
|
||||
option auto_update_min_time '0'
|
||||
option url_test_url 'https://www.google.com/generate_204'
|
||||
option user_agent 'v2rayN/9.99'
|
||||
option filter_words '过期/重置/套餐/剩余/网址/QQ群/官网/防失联/回国'
|
||||
|
||||
config access_control
|
||||
option lan_ac_mode '0'
|
||||
option router_proxy '1'
|
||||
list wan_fw_ips '149.154.160.0/20'
|
||||
list wan_fw_ips '67.198.55.0/24'
|
||||
list wan_fw_ips '91.108.4.0/22'
|
||||
list wan_fw_ips '91.108.56.0/22'
|
||||
list wan_fw_ips '109.239.140.0/24'
|
||||
list wan_fw_ips '8.8.8.8'
|
||||
list wan_fw_ips '1.1.1.1'
|
||||
list Interface 'lan'
|
||||
|
||||
config socks5_proxy
|
||||
option server 'nil'
|
||||
option local_port '1080'
|
||||
|
||||
config http_proxy
|
||||
option server 'nil'
|
||||
option local_port '3128'
|
||||
option http_auth 'none'
|
||||
|
||||
config server_global
|
||||
option enable_server '0'
|
||||
|
||||
config global_xray_fragment
|
||||
option fragment '0'
|
||||
option noise '0'
|
||||
|
||||
config clash_client_group
|
||||
option enabled '0'
|
||||
option remarks ''
|
||||
option ip_addr ''
|
||||
option client_mac ''
|
||||
option policy_group ''
|
||||
@@ -0,0 +1,43 @@
|
||||
#!/bin/sh
|
||||
LOCK_DIR="/var/run/ssrplusupdate.lock"
|
||||
LOOP_STAMP="/var/run/ssrplusupdate.loop"
|
||||
MODE="$(uci -q get shadowsocksr.@server_subscribe[0].config_auto_update_mode 2>/dev/null || echo 0)"
|
||||
|
||||
mkdir "$LOCK_DIR" 2>/dev/null || exit 0
|
||||
trap 'rmdir "$LOCK_DIR" 2>/dev/null' EXIT INT TERM
|
||||
|
||||
if [ "$1" = "loop" ]; then
|
||||
[ "$(uci -q get shadowsocksr.@server_subscribe[0].auto_update 2>/dev/null || echo 0)" = "1" ] || exit 0
|
||||
[ "$MODE" = "1" ] || exit 0
|
||||
|
||||
INTERVAL="$(uci -q get shadowsocksr.@server_subscribe[0].config_update_interval 2>/dev/null || echo 60)"
|
||||
case "$INTERVAL" in
|
||||
''|*[!0-9]*)
|
||||
INTERVAL=60
|
||||
;;
|
||||
esac
|
||||
[ "$INTERVAL" -gt 0 ] 2>/dev/null || INTERVAL=60
|
||||
|
||||
NOW="$(date +%s)"
|
||||
LAST_RUN=0
|
||||
[ -f "$LOOP_STAMP" ] && LAST_RUN="$(cat "$LOOP_STAMP" 2>/dev/null || echo 0)"
|
||||
case "$LAST_RUN" in
|
||||
''|*[!0-9]*)
|
||||
LAST_RUN=0
|
||||
;;
|
||||
esac
|
||||
|
||||
if [ $((NOW - LAST_RUN)) -lt $((INTERVAL * 60)) ]; then
|
||||
exit 0
|
||||
fi
|
||||
fi
|
||||
|
||||
/usr/bin/lua /usr/share/shadowsocksr/update.lua
|
||||
sleep 2s
|
||||
/usr/share/shadowsocksr/chinaipset.sh /var/etc/ssrplus/china_ssr.txt
|
||||
sleep 2s
|
||||
/usr/bin/lua /usr/share/shadowsocksr/subscribe.lua
|
||||
|
||||
if [ "$1" = "loop" ]; then
|
||||
date +%s > "$LOOP_STAMP"
|
||||
fi
|
||||
+3003
File diff suppressed because it is too large.
Load diff
+266
@@ -0,0 +1,266 @@
|
||||
#!/usr/bin/lua
|
||||
|
||||
------------------------------------------------
|
||||
-- This file is part of the luci-app-ssr-plus update.lua
|
||||
-- By Mattraks
|
||||
------------------------------------------------
|
||||
require "luci.sys"
|
||||
require "luci.model.uci"
|
||||
local icount = 0
|
||||
local args = arg[1]
|
||||
local uci = require "luci.model.uci".cursor()
|
||||
|
||||
-- 以下设置更新数据库至 DNSMASQ 配置路径
|
||||
-- 获取 DNSMASQ 配置 ID
|
||||
local DNSMASQ_UCI_CONFIG = uci:get_first("dhcp", "dnsmasq", ".name")
|
||||
|
||||
-- 获取 DNSMASQ 默认配置文件
|
||||
local DNSMASQ_CONF_PATH = "/tmp/etc/dnsmasq.conf." .. DNSMASQ_UCI_CONFIG
|
||||
|
||||
-- 检查 DNSMASQ 配置文件是否存在,如果存在则提取 conf-dir
|
||||
for line in io.lines(DNSMASQ_CONF_PATH) do
|
||||
local conf_dir = line:match("^conf%-dir=(.+)")
|
||||
if conf_dir then
|
||||
DNSMASQ_CONF_DIR = conf_dir:gsub("%s+", "") -- 去除空白字符
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
-- 设置 dnsmasq-ssrplus.d 目录路径,并去除路径末尾的斜杠
|
||||
local TMP_DNSMASQ_PATH = DNSMASQ_CONF_DIR:match("^(.-)/?$") .. "/dnsmasq-ssrplus.d"
|
||||
|
||||
local TMP_PATH = "/var/etc/ssrplus"
|
||||
-- match comments/title/whitelist/ip address/excluded_domain
|
||||
local comment_pattern = "^[!\\[@]+"
|
||||
local ip_pattern = "^%d+%.%d+%.%d+%.%d+"
|
||||
local domain_pattern = "([%w%-%_]+%.[%w%.%-%_]+)[%/%*]*"
|
||||
local excluded_domain = {
|
||||
"apple.com", "sina.cn", "sina.com.cn", "baidu.com", "byr.cn", "jlike.com",
|
||||
"weibo.com", "zhongsou.com", "youdao.com", "sogou.com", "so.com", "soso.com",
|
||||
"aliyun.com", "taobao.com", "jd.com", "qq.com"
|
||||
}
|
||||
-- gfwlist parameter
|
||||
local mydnsip = '127.0.0.1'
|
||||
local mydnsport = '5335'
|
||||
local ipsetname = 'gfwlist'
|
||||
local new_appledns = uci:get_first("shadowsocksr", "global", "apple_dns", "")
|
||||
local bc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||||
-- base64decoding
|
||||
local function base64_dec(data)
|
||||
data = string.gsub(data, '[^' .. bc .. '=]', '')
|
||||
return (data:gsub('.', function(x)
|
||||
if (x == '=') then
|
||||
return ''
|
||||
end
|
||||
local r, f = '', (bc:find(x) - 1)
|
||||
for i = 6, 1, -1 do
|
||||
r = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0')
|
||||
end
|
||||
return r;
|
||||
end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
|
||||
if (#x ~= 8) then
|
||||
return ''
|
||||
end
|
||||
local c = 0
|
||||
for i = 1, 8 do
|
||||
c = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)
|
||||
end
|
||||
return string.char(c)
|
||||
end))
|
||||
end
|
||||
-- check if domain is excluded
|
||||
local function check_excluded_domain(value)
|
||||
for _, domain in ipairs(excluded_domain) do
|
||||
if value:find(domain) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
-- gfwlist转码至dnsmasq格式
|
||||
local function generate_gfwlist(type)
|
||||
local domains, domains_map = {}, {}
|
||||
local out = io.open("/tmp/ssr-update." .. type, "w")
|
||||
for line in io.lines("/tmp/ssr-update.tmp") do
|
||||
if not (string.find(line, comment_pattern) or string.find(line, ip_pattern) or check_excluded_domain(line)) then
|
||||
local start, finish, match = string.find(line, domain_pattern)
|
||||
if start and not domains_map[match] then
|
||||
domains_map[match] = true
|
||||
table.insert(domains, match)
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, domain in ipairs(domains) do
|
||||
out:write(string.format("server=/%s/%s#%s\n", domain, mydnsip, mydnsport))
|
||||
out:write(string.format("ipset=/%s/%s\n", domain, ipsetname))
|
||||
end
|
||||
out:close()
|
||||
os.remove("/tmp/ssr-update.tmp")
|
||||
end
|
||||
|
||||
-- 更换 Apple dns
|
||||
local function generate_apple(type)
|
||||
local domains, domains_map = {}, {}
|
||||
local out = io.open("/tmp/ssr-update." .. type, "w")
|
||||
for line in io.lines("/tmp/ssr-update.tmp") do
|
||||
if not (string.find(line, comment_pattern)) then
|
||||
local start, finish, match = string.find(line, domain_pattern)
|
||||
if start and not domains_map[match] then
|
||||
domains_map[match] = true
|
||||
match = string.gsub(match, "%s", "") --从域名中去除所有空白字符
|
||||
table.insert(domains, match)
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, domain in ipairs(domains) do
|
||||
out:write(string.format("server=/%s/%s\n", domain, new_appledns))
|
||||
end
|
||||
out:close()
|
||||
os.remove("/tmp/ssr-update.tmp")
|
||||
end
|
||||
|
||||
-- adblock转码至dnsmasq格式
|
||||
local function generate_adblock(type)
|
||||
local domains, domains_map = {}, {}
|
||||
local out = io.open("/tmp/ssr-update." .. type, "w")
|
||||
for line in io.lines("/tmp/ssr-update.tmp") do
|
||||
if not (string.find(line, comment_pattern)) then
|
||||
local start, finish, match = string.find(line, domain_pattern)
|
||||
if start and not domains_map[match] then
|
||||
domains_map[match] = true
|
||||
table.insert(domains, match)
|
||||
end
|
||||
end
|
||||
end
|
||||
for _, domain in ipairs(domains) do
|
||||
out:write(string.format("address=/%s/\n", domain))
|
||||
end
|
||||
out:close()
|
||||
os.remove("/tmp/ssr-update.tmp")
|
||||
end
|
||||
|
||||
local log = function(...)
|
||||
if args then
|
||||
print("{ret=" .. table.concat({...}, ",retcount=") .. "}")
|
||||
else
|
||||
print(os.date("%Y-%m-%d %H:%M:%S ") .. table.concat({...}, " "))
|
||||
end
|
||||
end
|
||||
|
||||
local function update(url, file, type, file2)
|
||||
local Num = 1
|
||||
local refresh_cmd = "curl -sSL --insecure -o /tmp/ssr-update." .. type .. " " .. url
|
||||
local sret = luci.sys.call(refresh_cmd)
|
||||
if sret == 0 then
|
||||
if type == "gfw_data" then
|
||||
local gfwlist = io.open("/tmp/ssr-update." .. type, "r")
|
||||
local decode = gfwlist:read("*a")
|
||||
if not decode:find("google") then
|
||||
decode = base64_dec(decode)
|
||||
end
|
||||
gfwlist:close()
|
||||
-- 写回gfwlist
|
||||
gfwlist = io.open("/tmp/ssr-update.tmp", "w")
|
||||
gfwlist:write(decode)
|
||||
gfwlist:close()
|
||||
generate_gfwlist(type)
|
||||
Num = 2
|
||||
end
|
||||
if type == "apple_data" then
|
||||
local apple = io.open("/tmp/ssr-update." .. type, "r")
|
||||
local decode = apple:read("*a")
|
||||
if not decode:find("apple") then
|
||||
decode = base64_dec(decode)
|
||||
end
|
||||
apple:close()
|
||||
-- 写回applechina
|
||||
apple = io.open("/tmp/ssr-update.tmp", "w")
|
||||
apple:write(decode)
|
||||
apple:close()
|
||||
if new_appledns and new_appledns ~= "" then
|
||||
generate_apple(type)
|
||||
else
|
||||
os.remove("/tmp/ssr-update.tmp")
|
||||
end
|
||||
end
|
||||
if type == "ad_data" then
|
||||
local adblock = io.open("/tmp/ssr-update." .. type, "r")
|
||||
local decode = adblock:read("*a")
|
||||
if decode:find("address=") then
|
||||
adblock:close()
|
||||
else
|
||||
adblock:close()
|
||||
-- 写回adblock
|
||||
adblock = io.open("/tmp/ssr-update.tmp", "w")
|
||||
adblock:write(decode)
|
||||
adblock:close()
|
||||
generate_adblock(type)
|
||||
end
|
||||
end
|
||||
local new_md5 = luci.sys.exec("echo -n $([ -f '/tmp/ssr-update." .. type .. "' ] && md5sum /tmp/ssr-update." .. type .. " | awk '{print $1}')")
|
||||
local old_md5 = luci.sys.exec("echo -n $([ -f '" .. file .. "' ] && md5sum " .. file .. " | awk '{print $1}')")
|
||||
if new_md5 == old_md5 then
|
||||
if args then
|
||||
log(1)
|
||||
else
|
||||
log("你已经是最新数据,无需更新!")
|
||||
end
|
||||
else
|
||||
icount = luci.sys.exec("cat /tmp/ssr-update." .. type .. " | wc -l")
|
||||
luci.sys.exec("cp -f /tmp/ssr-update." .. type .. " " .. file)
|
||||
if file2 then
|
||||
luci.sys.exec("cp -f /tmp/ssr-update." .. type .. " " .. file2)
|
||||
end
|
||||
if type == "gfw_data" or type == "ad_data" then
|
||||
luci.sys.call("/usr/share/shadowsocksr/gfw2ipset.sh")
|
||||
else
|
||||
if luci.sys.call("command -v ipset >/dev/null 2>&1") == 0 then
|
||||
luci.sys.call("/usr/share/shadowsocksr/chinaipset.sh " .. TMP_PATH .. "/china_ssr.txt")
|
||||
end
|
||||
end
|
||||
if args then
|
||||
log(0, tonumber(icount) / Num)
|
||||
else
|
||||
log("更新成功! 新的总记录数:" .. tostring(tonumber(icount) / Num))
|
||||
end
|
||||
end
|
||||
else
|
||||
if args then
|
||||
log(-1)
|
||||
else
|
||||
log("更新失败!")
|
||||
end
|
||||
end
|
||||
os.remove("/tmp/ssr-update." .. type)
|
||||
end
|
||||
|
||||
if args then
|
||||
if args == "gfw_data" then
|
||||
update(uci:get_first("shadowsocksr", "global", "gfwlist_url"), "/etc/ssrplus/gfw_list.conf", args, TMP_DNSMASQ_PATH .. "/gfw_list.conf")
|
||||
os.exit(0)
|
||||
end
|
||||
if args == "ip_data" then
|
||||
update(uci:get_first("shadowsocksr", "global", "chnroute_url"), "/etc/ssrplus/china_ssr.txt", args, TMP_PATH .. "/china_ssr.txt")
|
||||
os.exit(0)
|
||||
end
|
||||
if args == "apple_data" then
|
||||
update(uci:get_first("shadowsocksr", "global", "apple_url"), "/etc/ssrplus/applechina.conf", args, TMP_DNSMASQ_PATH .. "/applechina.conf")
|
||||
os.exit(0)
|
||||
end
|
||||
if args == "ad_data" then
|
||||
update(uci:get_first("shadowsocksr", "global", "adblock_url"), "/etc/ssrplus/ad.conf", args, TMP_DNSMASQ_PATH .. "/ad.conf")
|
||||
os.exit(0)
|
||||
end
|
||||
else
|
||||
log("正在更新【GFW列表】数据库")
|
||||
update(uci:get_first("shadowsocksr", "global", "gfwlist_url"), "/etc/ssrplus/gfw_list.conf", "gfw_data", TMP_DNSMASQ_PATH .. "/gfw_list.conf")
|
||||
log("正在更新【国内IP段】数据库")
|
||||
update(uci:get_first("shadowsocksr", "global", "chnroute_url"), "/etc/ssrplus/china_ssr.txt", "ip_data", TMP_PATH .. "/china_ssr.txt")
|
||||
if uci:get_first("shadowsocksr", "global", "apple_optimization", "0") == "1" then
|
||||
log("正在更新【Apple域名】数据库")
|
||||
update(uci:get_first("shadowsocksr", "global", "apple_url"), "/etc/ssrplus/applechina.conf", "apple_data", TMP_DNSMASQ_PATH .. "/applechina.conf")
|
||||
end
|
||||
if uci:get_first("shadowsocksr", "global", "adblock", "0") == "1" then
|
||||
log("正在更新【广告屏蔽】数据库")
|
||||
update(uci:get_first("shadowsocksr", "global", "adblock_url"), "/etc/ssrplus/ad.conf", "ad_data", TMP_DNSMASQ_PATH .. "/ad.conf")
|
||||
end
|
||||
end
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"config": "shadowsocksr",
|
||||
"init": "shadowsocksr"
|
||||
}
|
||||
Reference in new issue
Block a user