update_core.sh 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #!/bin/bash
  2. PATH="/usr/sbin:/usr/bin:/sbin:/bin"
  3. binpath=$(uci get AdGuardHome.AdGuardHome.binpath)
  4. if [ -z "$binpath" ]; then
  5. uci set AdGuardHome.AdGuardHome.binpath="/tmp/AdGuardHome/AdGuardHome"
  6. binpath="/tmp/AdGuardHome/AdGuardHome"
  7. fi
  8. mkdir -p ${binpath%/*}
  9. upxflag=$(uci get AdGuardHome.AdGuardHome.upxflag 2>/dev/null)
  10. check_if_already_running(){
  11. running_tasks="$(ps |grep "AdGuardHome" |grep "update_core" |grep -v "grep" |awk '{print $1}' |wc -l)"
  12. [ "${running_tasks}" -gt "2" ] && echo -e "\nA task is already running." && EXIT 2
  13. }
  14. check_wgetcurl(){
  15. which curl && downloader="curl -L -k --retry 2 --connect-timeout 20 -o" && return
  16. which wget-ssl && downloader="wget-ssl --no-check-certificate -t 2 -T 20 -O" && return
  17. [ -z "$1" ] && opkg update || (echo error opkg && EXIT 1)
  18. #wgetver=$(opkg list wget | awk '{print $3}' | sort -r | head -n 1)
  19. #[ -z "$1" ] && (opkg install wget=$wgetver --force-overwrite ; check_wgetcurl 1 ;return)
  20. [ -z "$1" ] && (opkg remove wget wget-nossl --force-depends ; opkg install wget --force-overwrite; check_wgetcurl 1 ;return)
  21. [ "$1" == "1" ] && (opkg install curl --force-overwrite; check_wgetcurl 2 ; return)
  22. echo error curl and wget && EXIT 1
  23. }
  24. check_latest_version(){
  25. check_wgetcurl
  26. latest_ver="$($downloader - https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E 'v[0-9.]+' -o 2>/dev/null)"
  27. if [ -z "${latest_ver}" ]; then
  28. echo -e "\nFailed to check latest version, please try again later." && EXIT 1
  29. fi
  30. now_ver="$($binpath -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o)"
  31. if [ "${latest_ver}"x != "${now_ver}"x ] || [ "$1" == "force" ]; then
  32. echo -e "Local version: ${now_ver}., cloud version: ${latest_ver}."
  33. doupdate_core
  34. else
  35. echo -e "\nLocal version: ${now_ver}, cloud version: ${latest_ver}."
  36. echo -e "You're already using the latest version."
  37. if [ ! -z "$upxflag" ]; then
  38. filesize=$(ls -l $binpath | awk '{ print $5 }')
  39. if [ $filesize -gt 8000000 ]; then
  40. echo -e "start upx may take a long time"
  41. doupx
  42. mkdir -p "/tmp/AdGuardHomeupdate/AdGuardHome" >/dev/null 2>&1
  43. rm -fr /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}
  44. /tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $binpath -o /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}
  45. rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux
  46. /etc/init.d/AdGuardHome stop nobackup
  47. rm $binpath
  48. mv -f /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} $binpath
  49. /etc/init.d/AdGuardHome start
  50. echo -e "finished"
  51. fi
  52. fi
  53. EXIT 0
  54. fi
  55. }
  56. doupx(){
  57. Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')"
  58. case $Archt in
  59. "i386")
  60. Arch="i386"
  61. ;;
  62. "i686")
  63. Arch="i386"
  64. echo -e "i686 use $Arch may have bug"
  65. ;;
  66. "x86")
  67. Arch="amd64"
  68. ;;
  69. "mipsel")
  70. Arch="mipsel"
  71. ;;
  72. "mips64el")
  73. Arch="mips64el"
  74. Arch="mipsel"
  75. echo -e "mips64el use $Arch may have bug"
  76. ;;
  77. "mips")
  78. Arch="mips"
  79. ;;
  80. "mips64")
  81. Arch="mips64"
  82. Arch="mips"
  83. echo -e "mips64 use $Arch may have bug"
  84. ;;
  85. "arm")
  86. Arch="arm"
  87. ;;
  88. "armeb")
  89. Arch="armeb"
  90. ;;
  91. "aarch64")
  92. Arch="arm64"
  93. ;;
  94. "powerpc")
  95. Arch="powerpc"
  96. ;;
  97. "powerpc64")
  98. Arch="powerpc64"
  99. ;;
  100. *)
  101. echo -e "error not support $Archt if you can use offical release please issue a bug"
  102. EXIT 1
  103. ;;
  104. esac
  105. upx_latest_ver="$($downloader - https://api.github.com/repos/upx/upx/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E '[0-9.]+' -o 2>/dev/null)"
  106. $downloader /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz "https://github.com/upx/upx/releases/download/v${upx_latest_ver}/upx-${upx_latest_ver}-${Arch}_linux.tar.xz" 2>&1
  107. #tar xvJf
  108. which xz || (opkg list | grep ^xz || opkg update && opkg install xz || (opkg update && opkg install xz)) || (echo "xz download fail" && EXIT 1)
  109. mkdir -p /tmp/upx-${upx_latest_ver}-${Arch}_linux
  110. xz -d -c /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz| tar -x -C "/tmp" >/dev/null 2>&1
  111. if [ ! -e "/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx" ]; then
  112. echo -e "Failed to download upx."
  113. EXIT 1
  114. fi
  115. rm /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz
  116. }
  117. doupdate_core(){
  118. echo -e "Updating core..."
  119. mkdir -p "/tmp/AdGuardHomeupdate"
  120. rm -rf /tmp/AdGuardHomeupdate/* >/dev/null 2>&1
  121. Archt="$(opkg info kernel | grep Architecture | awk -F "[ _]" '{print($2)}')"
  122. case $Archt in
  123. "i386")
  124. Arch="386"
  125. ;;
  126. "i686")
  127. Arch="386"
  128. ;;
  129. "x86")
  130. Arch="amd64"
  131. ;;
  132. "mipsel")
  133. Arch="mipsle"
  134. ;;
  135. "mips64el")
  136. Arch="mips64le"
  137. Arch="mipsle"
  138. echo -e "mips64el use $Arch may have bug"
  139. ;;
  140. "mips")
  141. Arch="mips"
  142. ;;
  143. "mips64")
  144. Arch="mips64"
  145. Arch="mips"
  146. echo -e "mips64 use $Arch may have bug"
  147. ;;
  148. "arm")
  149. Arch="arm"
  150. ;;
  151. "aarch64")
  152. Arch="arm64"
  153. ;;
  154. "powerpc")
  155. Arch="ppc"
  156. echo -e "error not support $Archt"
  157. EXIT 1
  158. ;;
  159. "powerpc64")
  160. Arch="ppc64"
  161. echo -e "error not support $Archt"
  162. EXIT 1
  163. ;;
  164. *)
  165. echo -e "error not support $Archt if you can use offical release please issue a bug"
  166. EXIT 1
  167. ;;
  168. esac
  169. echo -e "start download"
  170. grep -v "^#" /usr/share/AdGuardHome/links.txt >/tmp/run/AdHlinks.txt
  171. while read link
  172. do
  173. eval link="$link"
  174. $downloader /tmp/AdGuardHomeupdate/${link##*/} "$link" 2>&1
  175. if [ "$?" != "0" ]; then
  176. echo "download failed try another download"
  177. rm -f /tmp/AdGuardHomeupdate/${link##*/}
  178. else
  179. local success="1"
  180. break
  181. fi
  182. done < "/tmp/run/AdHlinks.txt"
  183. rm /tmp/run/AdHlinks.txt
  184. [ -z "$success" ] && echo "no download success" && EXIT 1
  185. if [ "${link##*.}" == "gz" ]; then
  186. tar -zxf "/tmp/AdGuardHomeupdate/${link##*/}" -C "/tmp/AdGuardHomeupdate/"
  187. if [ ! -e "/tmp/AdGuardHomeupdate/AdGuardHome" ]; then
  188. echo -e "Failed to download core."
  189. rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1
  190. EXIT 1
  191. fi
  192. downloadbin="/tmp/AdGuardHomeupdate/AdGuardHome/AdGuardHome"
  193. else
  194. downloadbin="/tmp/AdGuardHomeupdate/${link##*/}"
  195. fi
  196. chmod 755 $downloadbin
  197. echo -e "download success start copy"
  198. if [ -n "$upxflag" ]; then
  199. echo -e "start upx may take a long time"
  200. doupx
  201. /tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $downloadbin
  202. rm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux
  203. fi
  204. echo -e "start copy"
  205. /etc/init.d/AdGuardHome stop nobackup
  206. rm "$binpath"
  207. mv -f "$downloadbin" "$binpath"
  208. if [ "$?" == "1" ]; then
  209. echo "mv failed maybe not enough space please use upx or change bin to /tmp/AdGuardHome"
  210. EXIT 1
  211. fi
  212. /etc/init.d/AdGuardHome start
  213. rm -rf "/tmp/AdGuardHomeupdate" >/dev/null 2>&1
  214. echo -e "Succeeded in updating core."
  215. echo -e "Local version: ${latest_ver}, cloud version: ${latest_ver}.\n"
  216. EXIT 0
  217. }
  218. EXIT(){
  219. rm /var/run/update_core 2>/dev/null
  220. [ "$1" != "0" ] && touch /var/run/update_core_error
  221. exit $1
  222. }
  223. main(){
  224. check_if_already_running
  225. check_latest_version $1
  226. }
  227. trap "EXIT 1" SIGTERM SIGINT
  228. touch /var/run/update_core
  229. rm /var/run/update_core_error 2>/dev/null
  230. main $1