freedombone-app-pihole 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # pi-hole ad blocker
  12. #
  13. # Adapted from instructions at:
  14. # http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0/#manualsetup
  15. #
  16. # License
  17. # =======
  18. #
  19. # Copyright (C) 2016-2018 Bob Mottram <bob@freedombone.net>
  20. #
  21. # This program is free software: you can redistribute it and/or modify
  22. # it under the terms of the GNU Affero General Public License as published by
  23. # the Free Software Foundation, either version 3 of the License, or
  24. # (at your option) any later version.
  25. #
  26. # This program is distributed in the hope that it will be useful,
  27. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  28. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  29. # GNU Affero General Public License for more details.
  30. #
  31. # You should have received a copy of the GNU Affero General Public License
  32. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  33. VARIANTS='full full-vim adblocker'
  34. IN_DEFAULT_INSTALL=0
  35. SHOW_ON_ABOUT=0
  36. PIHOLE_IFACE=eth0
  37. PIHOLE_DNS1='85.214.73.63'
  38. PIHOLE_DNS2='213.73.91.35'
  39. piholeBasename=pihole
  40. piholeDir=/etc/$piholeBasename
  41. PIHOLE_CUSTOM_ADLIST=$piholeDir/adlists.list
  42. PIHOLE_BLACKLIST=$piholeDir/blacklist.txt
  43. PIHOLE_WHITELIST=$piholeDir/whitelist.txt
  44. PIHOLE_REPO="https://github.com/pi-hole/pi-hole"
  45. PIHOLE_COMMIT='e602008459128c233899b1e9d70cca0f38f41670'
  46. pihole_variables=(ONION_ONLY
  47. PIHOLE_IFACE
  48. PIHOLE_DNS1
  49. PIHOLE_DNS2)
  50. function logging_on_pihole {
  51. echo -n ''
  52. }
  53. function logging_off_pihole {
  54. echo -n ''
  55. }
  56. function pihole_copy_files {
  57. if [ ! -d /etc/.pihole ]; then
  58. mkdir /etc/.pihole
  59. fi
  60. cp "$INSTALL_DIR/pihole/adlists.default" /etc/.pihole/adlists.default
  61. cp "$INSTALL_DIR/pihole/adlists.default" $piholeDir/adlists.default
  62. if [ ! -f $PIHOLE_CUSTOM_ADLIST ]; then
  63. cp "$INSTALL_DIR/pihole/adlists.default" $PIHOLE_CUSTOM_ADLIST
  64. fi
  65. cp "$INSTALL_DIR/pihole/advanced/Scripts/*" /opt/$piholeBasename
  66. if [ -f /etc/dnsmasq.d/01-pihole.conf ]; then
  67. rm /etc/dnsmasq.d/01-pihole.conf
  68. fi
  69. cp "$INSTALL_DIR/pihole/advanced/pihole.cron" /etc/cron.d/pihole
  70. cp "$INSTALL_DIR/pihole/gravity.sh" /opt/$piholeBasename
  71. chmod +x /opt/pihole/*.sh
  72. }
  73. function pihole_change_ipv4 {
  74. new_ipv4="$1"
  75. if [ -f /usr/local/bin/pihole ]; then
  76. setupVars=$piholeDir/setupVars.conf
  77. if [ -f $setupVars ]; then
  78. sed -i "s|IPv4_address=.*|IPv4_address=${new_ipv4}|g" $setupVars
  79. fi
  80. fi
  81. }
  82. function pihole_update {
  83. if [ ! -f /usr/local/bin/gravity.sh ]; then
  84. return
  85. fi
  86. if [ ! -f "$HOME/${PROJECT_NAME}-wifi.cfg" ]; then
  87. PIHOLE_IFACE=eth0
  88. else
  89. read_config_param WIFI_INTERFACE
  90. PIHOLE_IFACE=$WIFI_INTERFACE
  91. fi
  92. IPv4_address="$(get_ipv4_address)"
  93. IPv6_address="$(get_ipv6_address)"
  94. setupVars=$piholeDir/setupVars.conf
  95. echo "piholeInterface=${PIHOLE_IFACE}" > ${setupVars}
  96. echo "IPV4_ADDRESS=${IPv4_address}" >> ${setupVars}
  97. if [ ${#IPv6_address} -gt 0 ]; then
  98. echo "IPV6_ADDRESS=${IPv6_address}" >> ${setupVars}
  99. fi
  100. echo "piholeDNS1=${PIHOLE_DNS1}" >> ${setupVars}
  101. echo "piholeDNS2=${PIHOLE_DNS1}" >> ${setupVars}
  102. { echo 'domain-needed';
  103. echo 'bogus-priv';
  104. echo 'no-resolv';
  105. echo "server=${PIHOLE_DNS1}";
  106. echo "server=${PIHOLE_DNS2}";
  107. echo "interface=${PIHOLE_IFACE}";
  108. echo 'listen-address=127.0.0.1'; } > /etc/dnsmasq.conf
  109. pihole -g
  110. systemctl restart dnsmasq
  111. # avoid having the tripwire report pihole updates
  112. if ! grep -q '!/etc/pihole' /etc/tripwire/twpol.txt; then
  113. sed -i '\|/etc\t\t->.*|a\ !/etc/pihole ;' /etc/tripwire/twpol.txt
  114. fi
  115. }
  116. function pihole_change_upstream_dns {
  117. data=$(mktemp 2>/dev/null)
  118. dialog --backtitle $"Ad Blocker Upstream DNS" \
  119. --radiolist $"Pick a domain name service (DNS):" 28 50 19 \
  120. 1 $"Digital Courage" on \
  121. 2 $"German Privacy Foundation 1" off \
  122. 3 $"German Privacy Foundation 2" off \
  123. 4 $"Chaos Computer Club" off \
  124. 5 $"ClaraNet" off \
  125. 6 $"OpenNIC 1" off \
  126. 7 $"OpenNIC 2" off \
  127. 8 $"OpenNIC 3" off \
  128. 9 $"OpenNIC 4" off \
  129. 10 $"OpenNIC 5" off \
  130. 11 $"OpenNIC 6" off \
  131. 12 $"OpenNIC 7" off \
  132. 13 $"PowerNS" off \
  133. 14 $"ValiDOM" off \
  134. 15 $"Freie Unzensierte" off \
  135. 16 $"DNS.Watch" off \
  136. 17 $"uncensoreddns.org" off \
  137. 18 $"Lorraine Data Network" off \
  138. 19 $"Google" off 2> "$data"
  139. sel=$?
  140. case $sel in
  141. 1) rm -f "$data"
  142. exit 1;;
  143. 255) rm -f "$data"
  144. exit 1;;
  145. esac
  146. case $(cat "$data") in
  147. 1) PIHOLE_DNS1='85.214.73.63'
  148. PIHOLE_DNS2='213.73.91.35'
  149. ;;
  150. 2) PIHOLE_DNS1='87.118.100.175'
  151. PIHOLE_DNS2='94.75.228.29'
  152. ;;
  153. 3) PIHOLE_DNS1='85.25.251.254'
  154. PIHOLE_DNS2='2.141.58.13'
  155. ;;
  156. 4) PIHOLE_DNS1='213.73.91.35'
  157. PIHOLE_DNS2='85.214.73.63'
  158. ;;
  159. 5) PIHOLE_DNS1='212.82.225.7'
  160. PIHOLE_DNS2='212.82.226.212'
  161. ;;
  162. 6) PIHOLE_DNS1='58.6.115.42'
  163. PIHOLE_DNS2='58.6.115.43'
  164. ;;
  165. 7) PIHOLE_DNS1='119.31.230.42'
  166. PIHOLE_DNS2='200.252.98.162'
  167. ;;
  168. 8) PIHOLE_DNS1='217.79.186.148'
  169. PIHOLE_DNS2='81.89.98.6'
  170. ;;
  171. 9) PIHOLE_DNS1='78.159.101.37'
  172. PIHOLE_DNS2='203.167.220.153'
  173. ;;
  174. 10) PIHOLE_DNS1='82.229.244.191'
  175. PIHOLE_DNS2='82.229.244.191'
  176. ;;
  177. 11) PIHOLE_DNS1='216.87.84.211'
  178. PIHOLE_DNS2='66.244.95.20'
  179. ;;
  180. 12) PIHOLE_DNS1='207.192.69.155'
  181. PIHOLE_DNS2='72.14.189.120'
  182. ;;
  183. 13) PIHOLE_DNS1='194.145.226.26'
  184. PIHOLE_DNS2='77.220.232.44'
  185. ;;
  186. 14) PIHOLE_DNS1='78.46.89.147'
  187. PIHOLE_DNS2='88.198.75.145'
  188. ;;
  189. 15) PIHOLE_DNS1='85.25.149.144'
  190. PIHOLE_DNS2='87.106.37.196'
  191. ;;
  192. 16) PIHOLE_DNS1='84.200.69.80'
  193. PIHOLE_DNS2='84.200.70.40'
  194. ;;
  195. 17) PIHOLE_DNS1='91.239.100.100'
  196. PIHOLE_DNS2='89.233.43.71'
  197. ;;
  198. 18) PIHOLE_DNS1='80.67.188.188'
  199. PIHOLE_DNS2='89.234.141.66'
  200. ;;
  201. 19) PIHOLE_DNS1='8.8.8.8'
  202. PIHOLE_DNS2='4.4.4.4'
  203. dialog --title $"WARNING" \
  204. --msgbox $"\\nGoogle's main purpose for providing DNS resolvers is to spy upon people and know which sites they are visiting.\\n\\nThis is something to consider, and you should only really be using Google DNS as a last resort if other resolvers are unavailable." 12 60
  205. ;;
  206. 255) rm -f "$data"
  207. exit 1;;
  208. esac
  209. rm -f "$data"
  210. write_config_param "PIHOLE_DNS1" "$PIHOLE_DNS1"
  211. write_config_param "PIHOLE_DNS2" "$PIHOLE_DNS2"
  212. }
  213. function update_pihole_interactive {
  214. clear
  215. echo $'Updating Ad Blocker Lists'
  216. echo ''
  217. pihole_update
  218. }
  219. function configure_firewall_for_pihole {
  220. firewall_add DNS 53
  221. }
  222. function pihole_pause {
  223. pihole disable
  224. dialog --title $"Pause Ad Blocker" \
  225. --msgbox $"Ad blocking is paused" 6 60
  226. }
  227. function pihole_resume {
  228. pihole enable
  229. dialog --title $"Resume Ad Blocker" \
  230. --msgbox $"Ad blocking has resumed" 6 60
  231. }
  232. function configure_interactive_pihole {
  233. while true
  234. do
  235. data=$(mktemp 2>/dev/null)
  236. dialog --backtitle $"Freedombone Control Panel" \
  237. --title $"Ad Blocker" \
  238. --radiolist $"Choose an operation:" 16 70 7 \
  239. 1 $"Edit ads list" off \
  240. 2 $"Edit blacklisted domain names" off \
  241. 3 $"Edit whitelisted domain names" off \
  242. 4 $"Change upstream DNS servers" off \
  243. 5 $"Pause blocker" off \
  244. 6 $"Resume blocker" off \
  245. 7 $"Exit" on 2> "$data"
  246. sel=$?
  247. case $sel in
  248. 1) rm -f "$data"
  249. exit 1;;
  250. 255) rm -f "$data"
  251. exit 1;;
  252. esac
  253. case $(cat "$data") in
  254. 1) editor $PIHOLE_CUSTOM_ADLIST
  255. update_pihole_interactive
  256. ;;
  257. 2) editor $PIHOLE_BLACKLIST
  258. update_pihole_interactive
  259. ;;
  260. 3) editor $PIHOLE_WHITELIST
  261. update_pihole_interactive
  262. ;;
  263. 4) pihole_change_upstream_dns
  264. update_pihole_interactive
  265. ;;
  266. 5) pihole_pause
  267. ;;
  268. 6) pihole_resume
  269. ;;
  270. 7) rm -f "$data"
  271. break;;
  272. esac
  273. rm -f "$data"
  274. done
  275. }
  276. function install_interactive_pihole {
  277. APP_INSTALLED=1
  278. }
  279. function reconfigure_pihole {
  280. echo -n ''
  281. }
  282. function upgrade_pihole {
  283. CURR_PIHOLE_COMMIT=$(get_completion_param "pihole commit")
  284. if [[ "$CURR_PIHOLE_COMMIT" == "$PIHOLE_COMMIT" ]]; then
  285. return
  286. fi
  287. function_check set_repo_commit
  288. set_repo_commit "$INSTALL_DIR/pihole" "pihole commit" "$PIHOLE_COMMIT" $PIHOLE_REPO
  289. pihole_copy_files
  290. pihole_update
  291. }
  292. function backup_local_pihole {
  293. function_check backup_directory_to_usb
  294. backup_directory_to_usb $piholeDir pihole
  295. }
  296. function restore_local_pihole {
  297. function_check restore_directory_from_usb
  298. restore_directory_from_usb / pihole
  299. }
  300. function backup_remote_pihole {
  301. function_check backup_directory_to_friend
  302. backup_directory_to_friend $piholeDir pihole
  303. }
  304. function restore_remote_pihole {
  305. function_check restore_directory_from_friend
  306. restore_directory_from_friend / pihole
  307. }
  308. function remove_pihole {
  309. apt-get -yq remove --purge dnsmasq
  310. if [ ! -d /var/www/pihole ]; then
  311. rm -rf /var/www/pihole
  312. fi
  313. if [ -f /usr/local/bin/gravity.sh ]; then
  314. rm /usr/local/bin/gravity.sh
  315. fi
  316. if [ -f /usr/local/bin/pihole ]; then
  317. rm /usr/local/bin/pihole
  318. fi
  319. if [ -d /opt/pihole ]; then
  320. rm -rf /opt/pihole
  321. fi
  322. if [ -d $piholeDir ]; then
  323. rm -rf $piholeDir
  324. fi
  325. if [ -d /etc/.pihole ]; then
  326. rm -rf /etc/.pihole
  327. fi
  328. if [ -f /var/log/pihole.log ]; then
  329. rm /var/log/pihole.log
  330. fi
  331. if [ -f /etc/cron.d/pihole ]; then
  332. rm /etc/cron.d/pihole
  333. fi
  334. if [ -d "$INSTALL_DIR/pihole" ]; then
  335. rm -rf "$INSTALL_DIR/pihole"
  336. fi
  337. firewall_remove 53
  338. userdel -r pihole
  339. }
  340. function install_pihole {
  341. apt-get -yq install dnsmasq curl
  342. adduser --disabled-login --gecos 'pi-hole' pihole
  343. if [ ! -d /home/pihole ]; then
  344. echo $"/home/pihole directory not created"
  345. exit 538929
  346. fi
  347. chmod 600 /etc/shadow
  348. chmod 600 /etc/gshadow
  349. usermod -a -G www-data pihole
  350. chmod 0000 /etc/shadow
  351. chmod 0000 /etc/gshadow
  352. systemctl enable dnsmasq
  353. if [ ! -d "$INSTALL_DIR" ]; then
  354. mkdir -p "$INSTALL_DIR"
  355. fi
  356. if [ ! -d "$INSTALL_DIR/pihole" ]; then
  357. cd "$INSTALL_DIR" || exit 78245624527
  358. if [ -d /repos/pihole ]; then
  359. mkdir pihole
  360. cp -r -p /repos/pihole/. pihole
  361. cd pihole || exit 24572424684
  362. git pull
  363. else
  364. git_clone $PIHOLE_REPO pihole
  365. fi
  366. if [ ! -d "$INSTALL_DIR/pihole" ]; then
  367. exit 523925
  368. fi
  369. cd "$INSTALL_DIR/pihole" || exit 2682468242
  370. git checkout "$PIHOLE_COMMIT" -b "$PIHOLE_COMMIT"
  371. set_completion_param "pihole commit" "$PIHOLE_COMMIT"
  372. fi
  373. if [ ! -d /var/www/pihole/htdocs ]; then
  374. mkdir -p /var/www/pihole/htdocs
  375. fi
  376. # blank file which takes the place of ads
  377. { echo '<html>';
  378. echo '<body>';
  379. echo '</body>';
  380. echo '</html>'; } > /var/www/pihole/htdocs/index.html
  381. if [ ! -f "$INSTALL_DIR/pihole/gravity.sh" ]; then
  382. exit 26738
  383. fi
  384. cp "$INSTALL_DIR/pihole/gravity.sh" /usr/local/bin/gravity.sh
  385. chmod 755 /usr/local/bin/gravity.sh
  386. if [ ! -f "$INSTALL_DIR/pihole/pihole" ]; then
  387. exit 52935
  388. fi
  389. cp "$INSTALL_DIR/pihole/pihole" /usr/local/bin/pihole
  390. chmod 755 /usr/local/bin/pihole
  391. if [ ! -d $piholeDir ]; then
  392. mkdir $piholeDir
  393. fi
  394. if [ ! -d /opt/pihole ]; then
  395. mkdir -p /opt/pihole
  396. fi
  397. pihole_copy_files
  398. chown -R www-data:www-data /var/www/pihole/htdocs
  399. configure_firewall_for_pihole
  400. pihole_update
  401. APP_INSTALLED=1
  402. }
  403. # NOTE: deliberately no exit 0