unblockneteasemusic 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. #!/bin/sh /etc/rc.common
  2. # SPDX-License-Identifier: GPL-3.0-only
  3. #
  4. # Copyright (C) 2019-2023 Tianling Shen <[email protected]>
  5. USE_PROCD=1
  6. START=99
  7. STOP=10
  8. NAME="unblockneteasemusic"
  9. UNM_DIR="/usr/share/$NAME"
  10. RUN_DIR="/var/run/$NAME"
  11. IPT_N="iptables -t nat"
  12. IPT_INPUT_RULE="unblockneteasemusic_input_rule"
  13. is_enabled() {
  14. local enabled
  15. config_get_bool enabled "$1" "$2" "${3:-0}"
  16. if [ "$enabled" -eq "1" ]; then
  17. return 0
  18. else
  19. return 1
  20. fi
  21. }
  22. append_param() {
  23. procd_append_param command "$1" $2
  24. }
  25. append_param_arg() {
  26. local value
  27. config_get value "$1" "$2" $4
  28. [ -n "$value" ] && append_param "$3" "$value"
  29. }
  30. append_param_env() {
  31. local value
  32. config_get value "$1" "$2" $4
  33. [ -n "$value" ] && procd_append_param env "$3"="$value"
  34. }
  35. append_param_boolenv() {
  36. is_enabled "$1" "$2" "$4" && procd_append_param env "$3"="true"
  37. }
  38. append_filter_client() {
  39. local cfg="$1"
  40. is_enabled "$cfg" "enable" || return 1
  41. local ip_addr filter_mode
  42. config_get ip_addr "$cfg" "ip_addr"
  43. config_get filter_mode "$cfg" "filter_mode"
  44. [ -n "$ip_addr" -a -n "$filter_mode" ] || return 1
  45. case "${filter_mode}" in
  46. "disable_http")
  47. ipset -! add "acl_neteasemusic_http" "${ip_addr}"
  48. ;;
  49. "disable_https")
  50. ipset -! add "acl_neteasemusic_https" "${ip_addr}"
  51. ;;
  52. "disable_all")
  53. ipset -! add "acl_neteasemusic_http" "${ip_addr}"
  54. ipset -! add "acl_neteasemusic_https" "${ip_addr}"
  55. ;;
  56. esac
  57. }
  58. start_service() {
  59. config_load "$NAME"
  60. is_enabled "config" "enable" || return 1
  61. local update_time
  62. config_get update_time "config" "update_time" "3"
  63. sed -i "/$NAME/d" /etc/crontabs/root
  64. is_enabled "config" "auto_update" && echo "0 ${update_time} * * * $UNM_DIR/update.sh update_core" >> "/etc/crontabs/root"
  65. /etc/init.d/cron restart
  66. mkdir -p "$RUN_DIR"
  67. [ ! -s "$UNM_DIR/core/app.js" ] && { rm -f "$UNM_DIR/local_ver"; sh "$UNM_DIR/update.sh" "update_core_non_restart"; }
  68. [ ! -s "$UNM_DIR/core/app.js" ] && { echo "Core Not Found, please download it before starting." >> "$RUN_DIR/run.log"; return 1; }
  69. procd_open_instance "$NAME"
  70. procd_set_param command node "$UNM_DIR/core/app.js"
  71. append_param "-a" "0.0.0.0"
  72. local http_port https_port hijack_ways
  73. config_get http_port "config" "http_port" "5200"
  74. config_get https_port "config" "https_port" "5201"
  75. config_get hijack_ways "config" "hijack_ways" "use_ipset"
  76. [ "$hijack_ways" != "use_hosts" ] || { http_port="80"; https_port="443"; }
  77. append_param "-p" "${http_port}":"${https_port}"
  78. if is_enabled "config" "pub_access"; then
  79. iptables -N "$IPT_RULE_NAME"
  80. iptables -t filter -I INPUT -j "$IPT_RULE_NAME"
  81. iptables -t filter -A "$IPT_RULE_NAME" -p tcp --dport "${http_port}" -j ACCEPT
  82. iptables -t filter -A "$IPT_RULE_NAME" -p tcp --dport "${https_port}" -j ACCEPT
  83. echo "/etc/init.d/$NAME restart" > "$RUN_DIR/fw3.include"
  84. fi
  85. local music_source
  86. config_get music_source "config" "music_source" "default"
  87. [ "${music_source}" != "default" ] && append_param -o "${music_source}"
  88. append_param_arg "config" "cnrelay" "-c"
  89. append_param_arg "config" "endpoint_url" "-e" "https://music.163.com"
  90. append_param_arg "config" "netease_server_ip" "-f"
  91. append_param_arg "config" "proxy_server_ip" "-u"
  92. is_enabled "config" "strict_mode" && append_param "-s"
  93. local log_level
  94. config_get log_level "config" "log_level" "info"
  95. procd_set_param env LOG_FILE="$RUN_DIR/run.log"
  96. procd_append_param env LOG_LEVEL="$log_level"
  97. append_param_env "config" "joox_cookie" "JOOX_COOKIE"
  98. append_param_env "config" "migu_cookie" "MIGU_COOKIE"
  99. append_param_env "config" "qq_cookie" "QQ_COOKIE"
  100. append_param_env "config" "youtube_key" "YOUTUBE_KEY"
  101. append_param_env "config" "self_issue_cert_crt" "SIGN_CERT" "$UNM_DIR/core/server.crt"
  102. append_param_env "config" "self_issue_cert_key" "SIGN_KEY" "$UNM_DIR/core/server.key"
  103. append_param_boolenv "config" "follow_source_order" "FOLLOW_SOURCE_ORDER"
  104. append_param_boolenv "config" "search_album" "SEARCH_ALBUM"
  105. append_param_boolenv "config" "enable_flac" "ENABLE_FLAC"
  106. append_param_boolenv "config" "select_max_br" "SELECT_MAX_BR"
  107. append_param_boolenv "config" "disable_upgrade_check" "DISABLE_UPGRADE_CHECK"
  108. append_param_boolenv "config" "block_ads" "BLOCK_ADS"
  109. append_param_boolenv "config" "local_vip" "ENABLE_LOCAL_VIP"
  110. case "$(config_get "config" "replace_music_source")" in
  111. "lower_than_192kbps") procd_append_param env MIN_BR="192000" ;;
  112. "lower_than_320kbps") procd_append_param env MIN_BR="320000" ;;
  113. "lower_than_999kbps") procd_append_param env MIN_BR="600000" ;;
  114. "replace_all") procd_append_param env MIN_BR="9999999" ;;
  115. esac
  116. procd_set_param stdout 1
  117. procd_set_param stderr 1
  118. procd_set_param respawn
  119. local lan_addr="$(uci -q get network.lan.ipaddr)"
  120. if [ "${hijack_ways}" = "use_ipset" ]; then
  121. mkdir -p "/tmp/dnsmasq.d"
  122. rm -f "/tmp/dnsmasq.d/dnsmasq-$NAME.conf"
  123. cat <<-EOF > "/tmp/dnsmasq.d/dnsmasq-$NAME.conf"
  124. dhcp-option=252,http://${lan_addr}:${http_port}/proxy.pac
  125. ipset=/.music.163.com/neteasemusic
  126. ipset=/interface.music.163.com/neteasemusic
  127. ipset=/interface3.music.163.com/neteasemusic
  128. ipset=/apm.music.163.com/neteasemusic
  129. ipset=/apm3.music.163.com/neteasemusic
  130. ipset=/clientlog.music.163.com/neteasemusic
  131. ipset=/clientlog3.music.163.com/neteasemusic
  132. EOF
  133. /etc/init.d/dnsmasq reload 2>"/dev/null"
  134. ipset create "acl_neteasemusic_http" hash:ip
  135. ipset create "acl_neteasemusic_https" hash:ip
  136. ipset create "neteasemusic" hash:ip
  137. config_foreach append_filter_client "acl_rule"
  138. local netease_music_ips="$(uclient-fetch -qO- "http://httpdns.n.netease.com/httpdns/v2/d?domain=music.163.com,interface.music.163.com,interface3.music.163.com,apm.music.163.com,apm3.music.163.com,clientlog.music.163.com,clientlog3.music.163.com" |jsonfilter -e '@.data.*.ip.*')"
  139. local netease_music_ips2="$(uclient-fetch -qO- "https://music.httpdns.c.163.com/d" --post-data="music.163.com,interface.music.163.com,interface3.music.163.com,apm.music.163.com,apm3.music.163.com,clientlog.music.163.com,clientlog3.music.163.com" |jsonfilter -e '@.dns.*["ips"].*')"
  140. echo -e "${netease_music_ips}\n${netease_music_ips2}" | sort -u | awk '{print "ipset add neteasemusic "$1}' | sh
  141. $IPT_N -N "netease_cloud_music"
  142. for local_addr in "0.0.0.0/8" "10.0.0.0/8" "127.0.0.0/8" "169.254.0.0/16" "172.16.0.0/12" "192.168.0.0/16" "224.0.0.0/4" "240.0.0.0/4"; do
  143. $IPT_N -A "netease_cloud_music" -d "${local_addr}" -j "RETURN"
  144. done
  145. $IPT_N -A "netease_cloud_music" -p "tcp" -m "set" ! --match-set "acl_neteasemusic_http" "src" --dport "80" -j "REDIRECT" --to-ports "${http_port}"
  146. $IPT_N -A "netease_cloud_music" -p "tcp" -m "set" ! --match-set "acl_neteasemusic_https" "src" --dport "443" -j "REDIRECT" --to-ports "${https_port}"
  147. $IPT_N -I "PREROUTING" -p "tcp" -m "set" --match-set "neteasemusic" "dst" -j "netease_cloud_music"
  148. echo "/etc/init.d/$NAME restart" > "$RUN_DIR/fw3.include"
  149. elif [ "${hijack_ways}" = "use_hosts" ]; then
  150. mkdir -p "/tmp/dnsmasq.d"
  151. rm -f "/tmp/dnsmasq.d/dnsmasq-$NAME.conf"
  152. cat <<-EOF > "/tmp/dnsmasq.d/dnsmasq-$NAME.conf"
  153. dhcp-option=252,http://${lan_addr}:${http_port}/proxy.pac
  154. address=/music.163.com/${lan_addr}
  155. address=/interface.music.163.com/${lan_addr}
  156. address=/interface3.music.163.com/${lan_addr}
  157. address=/apm.music.163.com/${lan_addr}
  158. address=/apm3.music.163.com/${lan_addr}
  159. address=/clientlog.music.163.com/${lan_addr}
  160. address=/clientlog3.music.163.com/${lan_addr}
  161. address=/music.httpdns.c.163.com/0.0.0.0
  162. EOF
  163. /etc/init.d/dnsmasq reload 2>"/dev/null"
  164. ip route add "223.252.199.10" dev lo
  165. fi
  166. procd_close_instance
  167. procd_open_instance "log-check"
  168. procd_set_param command "$UNM_DIR/log_check.sh"
  169. procd_set_param respawn
  170. procd_close_instance
  171. }
  172. stop_service() {
  173. config_load "$NAME"
  174. sed -i "/$NAME/d" "/etc/crontabs/root"
  175. /etc/init.d/cron restart
  176. local settable
  177. iptables -t filter -D INPUT -j "$IPT_RULE_NAME" 2>"/dev/null"
  178. iptables -F "$IPT_RULE_NAME" 2>"/dev/null"
  179. iptables -X "$IPT_RULE_NAME" 2>"/dev/null"
  180. $IPT_N -D "PREROUTING" -p "tcp" -m set --match-set "neteasemusic" "dst" -j "netease_cloud_music" 2>"/dev/null"
  181. $IPT_N -F "netease_cloud_music" 2>"/dev/null"
  182. $IPT_N -X "netease_cloud_music" 2>"/dev/null"
  183. for settable in "acl_neteasemusic_http" "acl_neteasemusic_https" "neteasemusic"; do
  184. ipset destroy "$settable" 2>"/dev/null"
  185. done
  186. echo > "$RUN_DIR/fw3.include"
  187. rm -f "/tmp/dnsmasq.d/dnsmasq-$NAME.conf"
  188. /etc/init.d/dnsmasq reload 2>"/dev/null"
  189. ip route del "223.252.199.10" 2>"/dev/null"
  190. rm -f "$RUN_DIR/run.log"
  191. }
  192. reload_service() {
  193. stop
  194. start
  195. }
  196. service_triggers() {
  197. procd_add_reload_trigger "$NAME"
  198. }