install-freedombone.sh 100KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114
  1. #!/bin/bash
  2. # Freedombone install script intended for use with Debian Jessie
  3. #
  4. # Note on dynamic dns
  5. # ===================
  6. #
  7. # I'm not particularly trying to promote freedns.afraid.org
  8. # as a service, it just happens to be a dynamic DNS system which
  9. # provides free (as in beer) accounts, and I'm trying to make the
  10. # process of setting up a working server as trivial as possible.
  11. # Other dynamic DNS systems are available, and if you're using
  12. # something different then comment out the section within
  13. # argument_checks and the call to dynamic_dns_freedns.
  14. #
  15. # Prerequisites
  16. # =============
  17. #
  18. # cd ~/
  19. # wget http://freedombone.uk.to/debian-jessie-console-armhf-2014-08-13.tar.xz
  20. #
  21. # Verify it.
  22. #
  23. # sha256sum debian-jessie-console-armhf-2014-08-13.tar.xz
  24. # fc225cfb3c2dfad92cccafa97e92c3cd3db9d94f4771af8da364ef59609f43de
  25. #
  26. # Uncompress it.
  27. #
  28. # tar xJf debian-jessie-console-armhf-2014-08-13.tar.xz
  29. # cd debian-jessie-console-armhf-2014-08-13
  30. #
  31. # sudo apt-get install u-boot-tools dosfstools git-core kpartx wget parted
  32. # sudo ./setup_sdcard.sh --mmc /dev/sdX --dtb beaglebone
  33. #
  34. # When finished eject the micrtoSD then reinsert it
  35. #
  36. # sudo cp /media/$USER/BOOT/bbb-uEnv.txt /media/$USER/BOOT/uEnv.txt
  37. # sync
  38. #
  39. # Eject microSD, insert into BBB, attach USB cable between BBB and laptop.
  40. # On Ubuntu wait until you see the "connected" message.
  41. #
  42. # ssh-keygen -f "/home/$USER/.ssh/known_hosts" -R 192.168.7.2
  43. # ssh debian@192.168.7.2 (password "temppwd")
  44. # su (password "root")
  45. # passwd
  46. # adduser $MY_USERNAME
  47. # sed -i '/iface eth0 inet dhcp/a\iface eth0 inet static' /etc/network/interfaces
  48. # sed -i '/iface eth0 inet static/a\ dns-nameservers 213.73.91.35 85.214.20.141' /etc/network/interfaces
  49. # sed -i "/iface eth0 inet static/a\ gateway $MY_ROUTER_IP" /etc/network/interfaces
  50. # sed -i '/iface eth0 inet static/a\ netmask 255.255.255.0' /etc/network/interfaces
  51. # sed -i "/iface eth0 inet static/a\ address $MY_BBB_STATIC_IP" /etc/network/interfaces
  52. # sed -i '/iface usb0 inet static/,/ gateway 192.168.7.1/ s/^/#/' /etc/network/interfaces
  53. # shutdown now
  54. #
  55. # Connect BBB to router
  56. #
  57. # scp install-freedombone.sh $MY_USERNAME@$MY_BBB_STATIC_IP:/home/$MY_USERNAME
  58. # ssh $MY_USERNAME@$MY_BBB_STATIC_IP
  59. # su
  60. # ./install-freedombone.sh [DOMAIN_NAME] [MY_USERNAME]
  61. DOMAIN_NAME=$1
  62. MY_USERNAME=$2
  63. FREEDNS_SUBDOMAIN_CODE=$3
  64. SYSTEM_TYPE=$4
  65. VARIANT_WRITER="writer"
  66. VARIANT_CLOUD="cloud"
  67. VARIANT_CHAT="chat"
  68. VARIANT_MAILBOX="mailbox"
  69. VARIANT_SOCIAL="social"
  70. SSH_PORT=2222
  71. KERNEL_VERSION="v3.15.10-bone7"
  72. USE_HWRNG="yes"
  73. INSTALLED_WITHIN_DOCKER="no"
  74. # If you want to run an encrypted mailing list specify its name here.
  75. # There should be no spaces in the name
  76. PRIVATE_MAILING_LIST=
  77. # Domain name or freedns subdomain for Owncloud installation
  78. OWNCLOUD_DOMAIN_NAME=
  79. # Freedns dynamic dns code for owncloud
  80. OWNCLOUD_FREEDNS_SUBDOMAIN_CODE=
  81. OWNCLOUD_ARCHIVE="owncloud-7.0.2.tar.bz2"
  82. OWNCLOUD_DOWNLOAD="https://download.owncloud.org/community/$OWNCLOUD_ARCHIVE"
  83. OWNCLOUD_HASH="ea07124a1b9632aa5227240d655e4d84967fb6dd49e4a16d3207d6179d031a3a"
  84. # Domain name or freedns subdomain for your wiki
  85. WIKI_FREEDNS_SUBDOMAIN_CODE=
  86. WIKI_DOMAIN_NAME=
  87. WIKI_ARCHIVE="dokuwiki-stable.tgz"
  88. WIKI_DOWNLOAD="http://download.dokuwiki.org/src/dokuwiki/$WIKI_ARCHIVE"
  89. WIKI_HASH="a0e79986b87b2744421ce3c33b43a21f296deadd81b1789c25fa4bb095e8e470"
  90. # see https://www.dokuwiki.org/template:mnml-blog
  91. WIKI_MNML_BLOG_ADDON_ARCHIVE="mnml-blog.tar.gz"
  92. WIKI_MNML_BLOG_ADDON="https://andreashaerter.com/downloads/dokuwiki-template-mnml-blog/latest"
  93. WIKI_MNML_BLOG_ADDON_HASH="428c280d09ee14326fef5cd6f6772ecfcd532f7b6779cd992ff79a97381cf39f"
  94. GPG_KEYSERVER="hkp://keys.gnupg.net"
  95. # optionally you can provide your exported GPG key pair here
  96. # Note that the private key file will be deleted after use
  97. # If these are unspecified then a new GPG key will be created
  98. MY_GPG_PUBLIC_KEY=
  99. MY_GPG_PRIVATE_KEY=
  100. # If you have existing mail within a Maildir
  101. # you can specify the directory here and the files
  102. # will be imported
  103. IMPORT_MAILDIR=
  104. # The Debian package repository to use.
  105. DEBIAN_REPO="ftp.de.debian.org"
  106. DEBIAN_VERSION="jessie"
  107. # Directory where source code is downloaded and compiled
  108. INSTALL_DIR=$HOME/build
  109. # device name for an attached usb drive
  110. USB_DRIVE=/dev/sda1
  111. # memory limit for php in MB
  112. MAX_PHP_MEMORY="32"
  113. export DEBIAN_FRONTEND=noninteractive
  114. # File which keeps track of what has already been installed
  115. COMPLETION_FILE=$HOME/freedombone-completed.txt
  116. if [ ! -f $COMPLETION_FILE ]; then
  117. touch $COMPLETION_FILE
  118. fi
  119. function show_help {
  120. echo ''
  121. echo './install-freedombone.sh [domain] [username] [subdomain code] [system type]'
  122. echo ''
  123. echo 'domain'
  124. echo '------'
  125. echo 'This is your domain name or freedns subdomain.'
  126. echo ''
  127. echo 'username'
  128. echo '--------'
  129. echo ''
  130. echo 'This will be your username on the system. It should be all'
  131. echo 'lower case and contain no spaces'
  132. echo ''
  133. echo 'subdomain code'
  134. echo '--------------'
  135. echo 'This is the freedns dynamic DNS code for your subdomain.'
  136. echo "To find it from https://freedns.afraid.org select 'Dynamic DNS',"
  137. echo "then 'quick cron example' and copy the code located between "
  138. echo "'?' and '=='."
  139. echo ''
  140. echo 'system type'
  141. echo '-----------'
  142. echo 'This can either be blank if you wish to install the full system,'
  143. echo 'or for more specialised variants you can specify "mailbox", "cloud",'
  144. echo '"chat", "social" or "writer"'
  145. echo ''
  146. }
  147. function argument_checks {
  148. if [ ! -d /home/$MY_USERNAME ]; then
  149. echo "There is no user '$MY_USERNAME' on the system. Use 'adduser $MY_USERNAME' to create the user."
  150. exit 1
  151. fi
  152. if [ ! $DOMAIN_NAME ]; then
  153. show_help
  154. exit 2
  155. fi
  156. if [ ! $MY_USERNAME ]; then
  157. show_help
  158. exit 3
  159. fi
  160. if [ ! $FREEDNS_SUBDOMAIN_CODE ]; then
  161. show_help
  162. exit 4
  163. fi
  164. }
  165. function change_login_message {
  166. if grep -Fxq "change_login_message" $COMPLETION_FILE; then
  167. return
  168. fi
  169. echo '' > /etc/motd
  170. echo ".---. . . " >> /etc/motd
  171. echo "| | | " >> /etc/motd
  172. echo "|--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. " >> /etc/motd
  173. echo "| | (.-' (.-' ( | ( )| | | | )( )| | (.-' " >> /etc/motd
  174. echo "' ' --' --' -' - -' ' ' -' -' -' ' - --'" >> /etc/motd
  175. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  176. echo ' .--.. . ' >> /etc/motd
  177. echo ' : | | ' >> /etc/motd
  178. echo ' | | .-. . . .-.| ' >> /etc/motd
  179. echo ' : |( )| |( | ' >> /etc/motd
  180. echo " --' - -' -- - -' -" >> /etc/motd
  181. fi
  182. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  183. echo ' .--.. . ' >> /etc/motd
  184. echo ' : | _|_ ' >> /etc/motd
  185. echo ' | |--. .-. | ' >> /etc/motd
  186. echo ' : | |( ) | ' >> /etc/motd
  187. echo " --'' - -' - -' " >> /etc/motd
  188. fi
  189. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  190. echo ' .-. . ' >> /etc/motd
  191. echo ' ( ) o | ' >> /etc/motd
  192. echo ' -. .-. .-. . .-. | ' >> /etc/motd
  193. echo ' ( )( )( | ( ) | ' >> /etc/motd
  194. echo " -' -' -'-' - -' - - " >> /etc/motd
  195. fi
  196. if [[ $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  197. echo ' . . . . ' >> /etc/motd
  198. echo ' |\ /| o | | ' >> /etc/motd
  199. echo ' | \/ | .-. . | |.-. .-.-. ,- ' >> /etc/motd
  200. echo ' | |( ) | | | )( ) : ' >> /etc/motd
  201. echo ' ' ' -' --' - -' -' -'-' - ' >> /etc/motd
  202. fi
  203. echo '' >> /etc/motd
  204. echo ' Freedom in the Cloud' >> /etc/motd
  205. echo '' >> /etc/motd
  206. echo 'change_login_message' >> $COMPLETION_FILE
  207. }
  208. function search_for_attached_usb_drive {
  209. # If a USB drive is attached then search for email,
  210. # gpg, ssh keys and emacs configuration
  211. if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
  212. return
  213. fi
  214. if [ -b $USB_DRIVE ]; then
  215. if [ ! -d /media/usb ]; then
  216. echo 'Mounting USB drive'
  217. mkdir /media/usb
  218. mount $USB_DRIVE /media/usb
  219. fi
  220. if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  221. if [ -d /media/usb/Maildir ]; then
  222. echo 'Maildir found on USB drive'
  223. IMPORT_MAILDIR=/media/usb/Maildir
  224. fi
  225. if [ -d /media/usb/.gnupg ]; then
  226. echo 'Importing GPG keyring'
  227. cp -r /media/usb/.gnupg /home/$MY_USERNAME
  228. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  229. if [ -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
  230. shred -zu /media/usb/.gnupg/secring.gpg
  231. shred -zu /media/usb/.gnupg/random_seed
  232. shred -zu /media/usb/.gnupg/trustdb.gpg
  233. rm -rf /media/usb/.gnupg
  234. else
  235. echo 'GPG files did not copy'
  236. exit 7
  237. fi
  238. fi
  239. if [ -f /media/usb/private_key.gpg ]; then
  240. echo 'GPG private key found on USB drive'
  241. MY_GPG_PRIVATE_KEY=/media/usb/private_key.gpg
  242. fi
  243. if [ -f /media/usb/public_key.gpg ]; then
  244. echo 'GPG public key found on USB drive'
  245. MY_GPG_PUBLIC_KEY=/media/usb/public_key.gpg
  246. fi
  247. fi
  248. if [ -d /media/usb/.ssh ]; then
  249. echo 'Importing ssh keys'
  250. cp -r /media/usb/.ssh /home/$MY_USERNAME
  251. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  252. # for security delete the ssh keys from the usb drive
  253. if [ -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
  254. shred -zu /media/usb/.ssh/id_rsa
  255. shred -zu /media/usb/.ssh/id_rsa.pub
  256. shred -zu /media/usb/.ssh/known_hosts
  257. rm -rf /media/usb/.ssh
  258. else
  259. echo 'ssh files did not copy'
  260. exit 8
  261. fi
  262. fi
  263. if [ -f /media/usb/.emacs ]; then
  264. echo 'Importing .emacs file'
  265. cp -f /media/usb/.emacs /home/$MY_USERNAME/.emacs
  266. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  267. fi
  268. if [ -d /media/usb/.emacs.d ]; then
  269. echo 'Importing .emacs.d directory'
  270. cp -r /media/usb/.emacs.d /home/$MY_USERNAME
  271. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
  272. fi
  273. if [ -d /media/usb/personal ]; then
  274. echo 'Importing personal directory'
  275. cp -r /media/usb/personal /home/$MY_USERNAME
  276. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
  277. fi
  278. else
  279. if [ -d /media/usb ]; then
  280. umount /media/usb
  281. rm -rf /media/usb
  282. fi
  283. echo 'No USB drive attached'
  284. fi
  285. echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
  286. }
  287. function remove_proprietary_repos {
  288. if grep -Fxq "remove_proprietary_repos" $COMPLETION_FILE; then
  289. return
  290. fi
  291. sed -i 's/ non-free//g' /etc/apt/sources.list
  292. echo 'remove_proprietary_repos' >> $COMPLETION_FILE
  293. }
  294. function change_debian_repos {
  295. if grep -Fxq "change_debian_repos" $COMPLETION_FILE; then
  296. return
  297. fi
  298. rm -rf /var/lib/apt/lists/*
  299. apt-get clean
  300. sed -i "s/ftp.us.debian.org/$DEBIAN_REPO/g" /etc/apt/sources.list
  301. # ensure that there is a security repo
  302. if ! grep -q "security" /etc/apt/sources.list; then
  303. if grep -q "jessie" /etc/apt/sources.list; then
  304. echo "deb http://security.debian.org/ jessie/updates main contrib" >> /etc/apt/sources.list
  305. echo "#deb-src http://security.debian.org/ jessie/updates main contrib" >> /etc/apt/sources.list
  306. else
  307. if grep -q "wheezy" /etc/apt/sources.list; then
  308. echo "deb http://security.debian.org/ wheezy/updates main contrib" >> /etc/apt/sources.list
  309. echo "#deb-src http://security.debian.org/ wheezy/updates main contrib" >> /etc/apt/sources.list
  310. fi
  311. fi
  312. fi
  313. apt-get update
  314. apt-get -y --force-yes install apt-transport-https
  315. echo 'change_debian_repos' >> $COMPLETION_FILE
  316. }
  317. function initial_setup {
  318. if grep -Fxq "initial_setup" $COMPLETION_FILE; then
  319. return
  320. fi
  321. apt-get -y remove --purge apache*
  322. apt-get -y dist-upgrade
  323. apt-get -y install ca-certificates emacs24
  324. echo 'initial_setup' >> $COMPLETION_FILE
  325. }
  326. function install_editor {
  327. if grep -Fxq "install_editor" $COMPLETION_FILE; then
  328. return
  329. fi
  330. update-alternatives --set editor /usr/bin/emacs24
  331. echo 'install_editor' >> $COMPLETION_FILE
  332. }
  333. function enable_backports {
  334. if grep -Fxq "enable_backports" $COMPLETION_FILE; then
  335. return
  336. fi
  337. if ! grep -Fxq "deb http://$DEBIAN_REPO/debian jessie-backports main" /etc/apt/sources.list; then
  338. echo "deb http://$DEBIAN_REPO/debian jessie-backports main" >> /etc/apt/sources.list
  339. fi
  340. echo 'enable_backports' >> $COMPLETION_FILE
  341. }
  342. function update_the_kernel {
  343. if grep -Fxq "update_the_kernel" $COMPLETION_FILE; then
  344. return
  345. fi
  346. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  347. return
  348. fi
  349. cd /opt/scripts/tools
  350. ./update_kernel.sh --kernel $KERNEL_VERSION
  351. echo 'update_the_kernel' >> $COMPLETION_FILE
  352. }
  353. function enable_zram {
  354. if grep -Fxq "enable_zram" $COMPLETION_FILE; then
  355. return
  356. fi
  357. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  358. return
  359. fi
  360. if ! grep -q "options zram num_devices=1" /etc/modprobe.d/zram.conf; then
  361. echo 'options zram num_devices=1' >> /etc/modprobe.d/zram.conf
  362. fi
  363. echo '#!/bin/bash' > /etc/init.d/zram
  364. echo '### BEGIN INIT INFO' >> /etc/init.d/zram
  365. echo '# Provides: zram' >> /etc/init.d/zram
  366. echo '# Required-Start:' >> /etc/init.d/zram
  367. echo '# Required-Stop:' >> /etc/init.d/zram
  368. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/zram
  369. echo '# Default-Stop: 0 1 6' >> /etc/init.d/zram
  370. echo '# Short-Description: Increased Performance In Linux With zRam (Virtual Swap Compressed in RAM)' >> /etc/init.d/zram
  371. echo '# Description: Adapted from systemd scripts at https://github.com/mystilleef/FedoraZram' >> /etc/init.d/zram
  372. echo '### END INIT INFO' >> /etc/init.d/zram
  373. echo 'start() {' >> /etc/init.d/zram
  374. echo ' # get the number of CPUs' >> /etc/init.d/zram
  375. echo ' num_cpus=$(grep -c processor /proc/cpuinfo)' >> /etc/init.d/zram
  376. echo ' # if something goes wrong, assume we have 1' >> /etc/init.d/zram
  377. echo ' [ "$num_cpus" != 0 ] || num_cpus=1' >> /etc/init.d/zram
  378. echo ' # set decremented number of CPUs' >> /etc/init.d/zram
  379. echo ' decr_num_cpus=$((num_cpus - 1))' >> /etc/init.d/zram
  380. echo ' # get the amount of memory in the machine' >> /etc/init.d/zram
  381. echo ' mem_total_kb=$(grep MemTotal /proc/meminfo | grep -E --only-matching "[[:digit:]]+")' >> /etc/init.d/zram
  382. echo ' mem_total=$((mem_total_kb * 1024))' >> /etc/init.d/zram
  383. echo ' # load dependency modules' >> /etc/init.d/zram
  384. echo ' modprobe zram num_devices=$num_cpus' >> /etc/init.d/zram
  385. echo ' # initialize the devices' >> /etc/init.d/zram
  386. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  387. echo ' echo $((mem_total / num_cpus)) > /sys/block/zram$i/disksize' >> /etc/init.d/zram
  388. echo ' done' >> /etc/init.d/zram
  389. echo ' # Creating swap filesystems' >> /etc/init.d/zram
  390. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  391. echo ' mkswap /dev/zram$i' >> /etc/init.d/zram
  392. echo ' done' >> /etc/init.d/zram
  393. echo ' # Switch the swaps on' >> /etc/init.d/zram
  394. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  395. echo ' swapon -p 100 /dev/zram$i' >> /etc/init.d/zram
  396. echo ' done' >> /etc/init.d/zram
  397. echo '}' >> /etc/init.d/zram
  398. echo 'stop() {' >> /etc/init.d/zram
  399. echo ' # get the number of CPUs' >> /etc/init.d/zram
  400. echo ' num_cpus=$(grep -c processor /proc/cpuinfo)' >> /etc/init.d/zram
  401. echo ' # set decremented number of CPUs' >> /etc/init.d/zram
  402. echo ' decr_num_cpus=$((num_cpus - 1))' >> /etc/init.d/zram
  403. echo ' # Switching off swap' >> /etc/init.d/zram
  404. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  405. echo ' if [ "$(grep /dev/zram$i /proc/swaps)" != "" ]; then' >> /etc/init.d/zram
  406. echo ' swapoff /dev/zram$i' >> /etc/init.d/zram
  407. echo ' sleep 1' >> /etc/init.d/zram
  408. echo ' fi' >> /etc/init.d/zram
  409. echo ' done' >> /etc/init.d/zram
  410. echo ' sleep 1' >> /etc/init.d/zram
  411. echo ' rmmod zram' >> /etc/init.d/zram
  412. echo '}' >> /etc/init.d/zram
  413. echo 'case "$1" in' >> /etc/init.d/zram
  414. echo ' start)' >> /etc/init.d/zram
  415. echo ' start' >> /etc/init.d/zram
  416. echo ' ;;' >> /etc/init.d/zram
  417. echo ' stop)' >> /etc/init.d/zram
  418. echo ' stop' >> /etc/init.d/zram
  419. echo ' ;;' >> /etc/init.d/zram
  420. echo ' restart)' >> /etc/init.d/zram
  421. echo ' stop' >> /etc/init.d/zram
  422. echo ' sleep 3' >> /etc/init.d/zram
  423. echo ' start' >> /etc/init.d/zram
  424. echo ' ;;' >> /etc/init.d/zram
  425. echo ' *)' >> /etc/init.d/zram
  426. echo ' echo "Usage: $0 {start|stop|restart}"' >> /etc/init.d/zram
  427. echo ' RETVAL=1' >> /etc/init.d/zram
  428. echo 'esac' >> /etc/init.d/zram
  429. echo 'exit $RETVAL' >> /etc/init.d/zram
  430. chmod +x /etc/init.d/zram
  431. update-rc.d zram defaults
  432. echo 'enable_zram' >> $COMPLETION_FILE
  433. }
  434. function random_number_generator {
  435. if grep -Fxq "random_number_generator" $COMPLETION_FILE; then
  436. return
  437. fi
  438. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  439. # it is assumed that docker uses the random number
  440. # generator of the host system
  441. return
  442. fi
  443. if [[ $USE_HWRNG == "yes" ]]; then
  444. apt-get -y --force-yes install rng-tools
  445. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' /etc/default/rng-tools
  446. else
  447. apt-get -y --force-yes install haveged
  448. fi
  449. echo 'random_number_generator' >> $COMPLETION_FILE
  450. }
  451. function configure_ssh {
  452. if grep -Fxq "configure_ssh" $COMPLETION_FILE; then
  453. return
  454. fi
  455. sed -i "s/Port 22/Port $SSH_PORT/g" /etc/ssh/sshd_config
  456. sed -i 's/PermitRootLogin without-password/PermitRootLogin no/g' /etc/ssh/sshd_config
  457. sed -i 's/X11Forwarding yes/X11Forwarding no/g' /etc/ssh/sshd_config
  458. sed -i 's/ServerKeyBits 1024/ServerKeyBits 4096/g' /etc/ssh/sshd_config
  459. sed -i 's/TCPKeepAlive yes/TCPKeepAlive no/g' /etc/ssh/sshd_config
  460. sed -i 's|HostKey /etc/ssh/ssh_host_dsa_key|#HostKey /etc/ssh/ssh_host_dsa_key|g' /etc/ssh/sshd_config
  461. sed -i 's|HostKey /etc/ssh/ssh_host_ecdsa_key|#HostKey /etc/ssh/ssh_host_ecdsa_key|g' /etc/ssh/sshd_config
  462. echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
  463. echo 'ClientAliveCountMax 3' >> /etc/ssh/sshd_config
  464. echo 'Ciphers aes256-ctr,aes128-ctr' >> /etc/ssh/sshd_config
  465. echo 'MACs hmac-sha2-512,hmac-sha2-256,hmac-ripemd160
  466. KexAlgorithms diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1' >> /etc/ssh/sshd_config
  467. apt-get -y --force-yes install fail2ban
  468. echo 'configure_ssh' >> $COMPLETION_FILE
  469. # Don't reboot if installing within docker
  470. # random numbers will come from the host system
  471. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  472. return
  473. fi
  474. echo ''
  475. echo ''
  476. echo ' *** Rebooting to initialise ssh settings and random number generator ***'
  477. echo ''
  478. echo " *** Reconnect via ssh on port $SSH_PORT, then run this script again ***"
  479. echo ''
  480. reboot
  481. }
  482. function regenerate_ssh_keys {
  483. if grep -Fxq "regenerate_ssh_keys" $COMPLETION_FILE; then
  484. return
  485. fi
  486. rm -f /etc/ssh/ssh_host_*
  487. dpkg-reconfigure openssh-server
  488. service ssh restart
  489. echo 'regenerate_ssh_keys' >> $COMPLETION_FILE
  490. }
  491. function configure_dns {
  492. if grep -Fxq "configure_dns" $COMPLETION_FILE; then
  493. return
  494. fi
  495. echo 'domain localdomain' > /etc/resolv.conf
  496. echo 'search localdomain' >> /etc/resolv.conf
  497. echo 'nameserver 213.73.91.35' >> /etc/resolv.conf
  498. echo 'nameserver 85.214.20.141' >> /etc/resolv.conf
  499. echo 'configure_dns' >> $COMPLETION_FILE
  500. }
  501. function set_your_domain_name {
  502. if grep -Fxq "set_your_domain_name" $COMPLETION_FILE; then
  503. return
  504. fi
  505. echo "$DOMAIN_NAME" > /etc/hostname
  506. hostname $DOMAIN_NAME
  507. sed -i "s/127.0.1.1 arm/127.0.1.1 $DOMAIN_NAME/g" /etc/hosts
  508. echo "127.0.1.1 $DOMAIN_NAME" >> /etc/hosts
  509. echo 'set_your_domain_name' >> $COMPLETION_FILE
  510. }
  511. function time_synchronisation {
  512. if grep -Fxq "time_synchronisation" $COMPLETION_FILE; then
  513. return
  514. fi
  515. apt-get -y --force-yes install tlsdate
  516. apt-get -y remove ntpdate
  517. echo '#!/bin/bash' > /usr/bin/updatedate
  518. echo 'TIMESOURCE=google.com' >> /usr/bin/updatedate
  519. echo 'TIMESOURCE2=www.ptb.de' >> /usr/bin/updatedate
  520. echo 'LOGFILE=/var/log/tlsdate.log' >> /usr/bin/updatedate
  521. echo 'TIMEOUT=5' >> /usr/bin/updatedate
  522. echo "EMAIL=$MY_USERNAME@$DOMAIN_NAME" >> /usr/bin/updatedate
  523. echo '# File which contains the previous date as a number' >> /usr/bin/updatedate
  524. echo 'BEFORE_DATE_FILE=/var/log/tlsdateprevious.txt' >> /usr/bin/updatedate
  525. echo '# File which contains the previous date as a string' >> /usr/bin/updatedate
  526. echo 'BEFORE_FULLDATE_FILE=/var/log/tlsdate.txt' >> /usr/bin/updatedate
  527. echo 'DATE_BEFORE=$(date)' >> /usr/bin/updatedate
  528. echo 'BEFORE=$(date -d "$Y-$M-$D" "+%s")' >> /usr/bin/updatedate
  529. echo 'BACKWARDS_BETWEEN=0' >> /usr/bin/updatedate
  530. echo '# If the date was previously set' >> /usr/bin/updatedate
  531. echo 'if [[ -f "$BEFORE_DATE_FILE" ]]; then' >> /usr/bin/updatedate
  532. echo ' BEFORE_FILE=$(cat $BEFORE_DATE_FILE)' >> /usr/bin/updatedate
  533. echo ' BEFORE_FULLDATE=$(cat $BEFORE_FULLDATE_FILE)' >> /usr/bin/updatedate
  534. echo ' # is the date going backwards?' >> /usr/bin/updatedate
  535. echo ' if (( BEFORE_FILE > BEFORE )); then' >> /usr/bin/updatedate
  536. echo ' echo -n "Date went backwards between tlsdate updates. " >> $LOGFILE' >> /usr/bin/updatedate
  537. echo ' echo -n "$BEFORE_FILE > $BEFORE, " >> $LOGFILE' >> /usr/bin/updatedate
  538. echo ' echo "$BEFORE_FULLDATE > $DATE_BEFORE" >> $LOGFILE' >> /usr/bin/updatedate
  539. echo ' # Send a warning email' > /usr/bin/updatedate
  540. echo ' echo $(tail $LOGFILE -n 2) | mail -s "tlsdate anomaly" $EMAIL' >> /usr/bin/updatedate
  541. echo ' # Try another time source' >> /usr/bin/updatedate
  542. echo ' TIMESOURCE=$TIMESOURCE2' >> /usr/bin/updatedate
  543. echo ' # try running without any parameters' >> /usr/bin/updatedate
  544. echo ' tlsdate >> $LOGFILE' >> /usr/bin/updatedate
  545. echo ' BACKWARDS_BETWEEN=1' >> /usr/bin/updatedate
  546. echo ' fi' >> /usr/bin/updatedate
  547. echo 'fi' >> /usr/bin/updatedate
  548. echo '# Set the date' >> /usr/bin/updatedate
  549. echo '/usr/bin/timeout $TIMEOUT tlsdate -l -t -H $TIMESOURCE -p 443 >> $LOGFILE' >> /usr/bin/updatedate
  550. echo 'DATE_AFTER=$(date)' >> /usr/bin/updatedate
  551. echo 'AFTER=$(date -d "$Y-$M-$D" '+%s')' >> /usr/bin/updatedate
  552. echo '# After setting the date did it go backwards?' >> /usr/bin/updatedate
  553. echo 'if (( AFTER < BEFORE )); then' >> /usr/bin/updatedate
  554. echo ' echo "Incorrect date: $DATE_BEFORE -> $DATE_AFTER" >> $LOGFILE' >> /usr/bin/updatedate
  555. echo ' # Send a warning email' >> /usr/bin/updatedate
  556. echo ' echo $(tail $LOGFILE -n 2) | mail -s "tlsdate anomaly" $EMAIL' >> /usr/bin/updatedate
  557. echo ' # Try resetting the date from another time source' >> /usr/bin/updatedate
  558. echo ' /usr/bin/timeout $TIMEOUT tlsdate -l -t -H $TIMESOURCE2 -p 443 >> $LOGFILE' >> /usr/bin/updatedate
  559. echo ' DATE_AFTER=$(date)' >> /usr/bin/updatedate
  560. echo ' AFTER=$(date -d "$Y-$M-$D" "+%s")' >> /usr/bin/updatedate
  561. echo 'else' >> /usr/bin/updatedate
  562. echo ' echo -n $TIMESOURCE >> $LOGFILE' >> /usr/bin/updatedate
  563. echo ' if [[ -f "$BEFORE_DATE_FILE" ]]; then' >> /usr/bin/updatedate
  564. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  565. echo ' echo -n $BEFORE_FILE >> $LOGFILE' >> /usr/bin/updatedate
  566. echo ' fi' >> /usr/bin/updatedate
  567. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  568. echo ' echo -n $BEFORE >> $LOGFILE' >> /usr/bin/updatedate
  569. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  570. echo ' echo -n $AFTER >> $LOGFILE' >> /usr/bin/updatedate
  571. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  572. echo ' echo $DATE_AFTER >> $LOGFILE' >> /usr/bin/updatedate
  573. echo 'fi' >> /usr/bin/updatedate
  574. echo '# Log the last date' >> /usr/bin/updatedate
  575. echo 'if [ BACKWARDS_BETWEEN == 0 ]; then' >> /usr/bin/updatedate
  576. echo ' echo "$AFTER" > $BEFORE_DATE_FILE' >> /usr/bin/updatedate
  577. echo ' echo "$DATE_AFTER" > $BEFORE_FULLDATE_FILE' >> /usr/bin/updatedate
  578. echo ' exit 0' >> /usr/bin/updatedate
  579. echo 'else' >> /usr/bin/updatedate
  580. echo ' exit 1' >> /usr/bin/updatedate
  581. echo 'fi' >> /usr/bin/updatedate
  582. chmod +x /usr/bin/updatedate
  583. echo '*/15 * * * * root /usr/bin/updatedate' >> /etc/crontab
  584. service cron restart
  585. echo '#!/bin/bash' > /etc/init.d/tlsdate
  586. echo '# /etc/init.d/tlsdate' >> /etc/init.d/tlsdate
  587. echo '### BEGIN INIT INFO' >> /etc/init.d/tlsdate
  588. echo '# Provides: tlsdate' >> /etc/init.d/tlsdate
  589. echo '# Required-Start: $remote_fs $syslog' >> /etc/init.d/tlsdate
  590. echo '# Required-Stop: $remote_fs $syslog' >> /etc/init.d/tlsdate
  591. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/tlsdate
  592. echo '# Default-Stop: 0 1 6' >> /etc/init.d/tlsdate
  593. echo '# Short-Description: Initially calls tlsdate with the timewarp option' >> /etc/init.d/tlsdate
  594. echo '# Description: Initially calls tlsdate with the timewarp option' >> /etc/init.d/tlsdate
  595. echo '### END INIT INFO' >> /etc/init.d/tlsdate
  596. echo '# Author: Bob Mottram <bob@robotics.uk.to>' >> /etc/init.d/tlsdate
  597. echo 'PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/bin"' >> /etc/init.d/tlsdate
  598. echo 'LOGFILE="/var/log/tlsdate.log"' >> /etc/init.d/tlsdate
  599. echo 'TLSDATECOMMAND="tlsdate --timewarp -l -H www.ptb.de -p 443 >> $LOGFILE"' >> /etc/init.d/tlsdate
  600. echo '#Start-Stop here' >> /etc/init.d/tlsdate
  601. echo 'case "$1" in' >> /etc/init.d/tlsdate
  602. echo ' start)' >> /etc/init.d/tlsdate
  603. echo ' echo "tlsdate started"' >> /etc/init.d/tlsdate
  604. echo ' $TLSDATECOMMAND' >> /etc/init.d/tlsdate
  605. echo ' ;;' >> /etc/init.d/tlsdate
  606. echo ' stop)' >> /etc/init.d/tlsdate
  607. echo ' echo "tlsdate stopped"' >> /etc/init.d/tlsdate
  608. echo ' ;;' >> /etc/init.d/tlsdate
  609. echo ' restart)' >> /etc/init.d/tlsdate
  610. echo ' echo "tlsdate restarted"' >> /etc/init.d/tlsdate
  611. echo ' $TLSDATECOMMAND' >> /etc/init.d/tlsdate
  612. echo ' ;;' >> /etc/init.d/tlsdate
  613. echo ' *)' >> /etc/init.d/tlsdate
  614. echo ' echo "Usage: $0 {start|stop|restart}"' >> /etc/init.d/tlsdate
  615. echo ' exit 1' >> /etc/init.d/tlsdate
  616. echo ' ;;' >> /etc/init.d/tlsdate
  617. echo 'esac' >> /etc/init.d/tlsdate
  618. echo 'exit 0' >> /etc/init.d/tlsdate
  619. chmod +x /etc/init.d/tlsdate
  620. update-rc.d tlsdate defaults
  621. echo 'time_synchronisation' >> $COMPLETION_FILE
  622. }
  623. function configure_firewall {
  624. if grep -Fxq "configure_firewall" $COMPLETION_FILE; then
  625. return
  626. fi
  627. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  628. # docker does its own firewalling
  629. return
  630. fi
  631. iptables -P INPUT ACCEPT
  632. ip6tables -P INPUT ACCEPT
  633. iptables -F
  634. ip6tables -F
  635. iptables -X
  636. ip6tables -X
  637. iptables -P INPUT DROP
  638. ip6tables -P INPUT DROP
  639. iptables -A INPUT -i lo -j ACCEPT
  640. iptables -A INPUT -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  641. echo 'configure_firewall' >> $COMPLETION_FILE
  642. }
  643. function save_firewall_settings {
  644. iptables-save > /etc/firewall.conf
  645. ip6tables-save > /etc/firewall6.conf
  646. printf '#!/bin/sh\n' > /etc/network/if-up.d/iptables
  647. printf 'iptables-restore < /etc/firewall.conf\n' >> /etc/network/if-up.d/iptables
  648. printf 'ip6tables-restore < /etc/firewall6.conf\n' >> /etc/network/if-up.d/iptables
  649. chmod +x /etc/network/if-up.d/iptables
  650. }
  651. function configure_firewall_for_dns {
  652. if grep -Fxq "configure_firewall_for_dns" $COMPLETION_FILE; then
  653. return
  654. fi
  655. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  656. # docker does its own firewalling
  657. return
  658. fi
  659. iptables -A INPUT -i eth0 -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
  660. save_firewall_settings
  661. echo 'configure_firewall_for_dns' >> $COMPLETION_FILE
  662. }
  663. function configure_firewall_for_xmpp {
  664. if [ ! -d /etc/prosody ]; then
  665. return
  666. fi
  667. if grep -Fxq "configure_firewall_for_xmpp" $COMPLETION_FILE; then
  668. return
  669. fi
  670. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  671. # docker does its own firewalling
  672. return
  673. fi
  674. iptables -A INPUT -i eth0 -p tcp --dport 5222:5223 -j ACCEPT
  675. iptables -A INPUT -i eth0 -p tcp --dport 5269 -j ACCEPT
  676. iptables -A INPUT -i eth0 -p tcp --dport 5280:5281 -j ACCEPT
  677. save_firewall_settings
  678. echo 'configure_firewall_for_xmpp' >> $COMPLETION_FILE
  679. }
  680. function configure_firewall_for_irc {
  681. if [ ! -d /etc/ngircd ]; then
  682. return
  683. fi
  684. if grep -Fxq "configure_firewall_for_irc" $COMPLETION_FILE; then
  685. return
  686. fi
  687. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  688. # docker does its own firewalling
  689. return
  690. fi
  691. iptables -A INPUT -i eth0 -p tcp --dport 6697 -j ACCEPT
  692. iptables -A INPUT -i eth0 -p tcp --dport 9999 -j ACCEPT
  693. save_firewall_settings
  694. echo 'configure_firewall_for_irc' >> $COMPLETION_FILE
  695. }
  696. function configure_firewall_for_ftp {
  697. if grep -Fxq "configure_firewall_for_ftp" $COMPLETION_FILE; then
  698. return
  699. fi
  700. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  701. # docker does its own firewalling
  702. return
  703. fi
  704. iptables -I INPUT -i eth0 -p tcp --dport 1024:65535 --sport 20:21 -j ACCEPT
  705. save_firewall_settings
  706. echo 'configure_firewall_for_ftp' >> $COMPLETION_FILE
  707. }
  708. function configure_firewall_for_web_access {
  709. if grep -Fxq "configure_firewall_for_web_access" $COMPLETION_FILE; then
  710. return
  711. fi
  712. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  713. # docker does its own firewalling
  714. return
  715. fi
  716. iptables -A INPUT -i eth0 -p tcp --dport 32768:61000 --sport 80 -j ACCEPT
  717. iptables -A INPUT -i eth0 -p tcp --dport 32768:61000 --sport 443 -j ACCEPT
  718. save_firewall_settings
  719. echo 'configure_firewall_for_web_access' >> $COMPLETION_FILE
  720. }
  721. function configure_firewall_for_web_server {
  722. if grep -Fxq "configure_firewall_for_web_server" $COMPLETION_FILE; then
  723. return
  724. fi
  725. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  726. # docker does its own firewalling
  727. return
  728. fi
  729. iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
  730. iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
  731. save_firewall_settings
  732. echo 'configure_firewall_for_web_server' >> $COMPLETION_FILE
  733. }
  734. function configure_firewall_for_ssh {
  735. if grep -Fxq "configure_firewall_for_ssh" $COMPLETION_FILE; then
  736. return
  737. fi
  738. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  739. # docker does its own firewalling
  740. return
  741. fi
  742. iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
  743. iptables -A INPUT -i eth0 -p tcp --dport $SSH_PORT -j ACCEPT
  744. save_firewall_settings
  745. echo 'configure_firewall_for_ssh' >> $COMPLETION_FILE
  746. }
  747. function configure_firewall_for_git {
  748. if grep -Fxq "configure_firewall_for_git" $COMPLETION_FILE; then
  749. return
  750. fi
  751. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  752. # docker does its own firewalling
  753. return
  754. fi
  755. iptables -A INPUT -i eth0 -p tcp --dport 9418 -j ACCEPT
  756. save_firewall_settings
  757. echo 'configure_firewall_for_git' >> $COMPLETION_FILE
  758. }
  759. function configure_firewall_for_email {
  760. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  761. return
  762. fi
  763. if grep -Fxq "configure_firewall_for_email" $COMPLETION_FILE; then
  764. return
  765. fi
  766. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  767. # docker does its own firewalling
  768. return
  769. fi
  770. iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
  771. iptables -A INPUT -i eth0 -p tcp --dport 587 -j ACCEPT
  772. iptables -A INPUT -i eth0 -p tcp --dport 465 -j ACCEPT
  773. iptables -A INPUT -i eth0 -p tcp --dport 993 -j ACCEPT
  774. save_firewall_settings
  775. echo 'configure_firewall_for_email' >> $COMPLETION_FILE
  776. }
  777. function configure_internet_protocol {
  778. if grep -Fxq "configure_internet_protocol" $COMPLETION_FILE; then
  779. return
  780. fi
  781. sed -i "s/#net.ipv4.tcp_syncookies=1/net.ipv4.tcp_syncookies=1/g" /etc/sysctl.conf
  782. sed -i "s/#net.ipv4.conf.all.accept_redirects = 0/net.ipv4.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  783. sed -i "s/#net.ipv6.conf.all.accept_redirects = 0/net.ipv6.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  784. sed -i "s/#net.ipv4.conf.all.send_redirects = 0/net.ipv4.conf.all.send_redirects = 0/g" /etc/sysctl.conf
  785. sed -i "s/#net.ipv4.conf.all.accept_source_route = 0/net.ipv4.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  786. sed -i "s/#net.ipv6.conf.all.accept_source_route = 0/net.ipv6.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  787. sed -i "s/#net.ipv4.conf.default.rp_filter=1/net.ipv4.conf.default.rp_filter=1/g" /etc/sysctl.conf
  788. sed -i "s/#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/g" /etc/sysctl.conf
  789. sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=0/g" /etc/sysctl.conf
  790. sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=0/g" /etc/sysctl.conf
  791. echo '# ignore pings' >> /etc/sysctl.conf
  792. echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  793. echo 'net.ipv6.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  794. echo '# disable ipv6' >> /etc/sysctl.conf
  795. echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
  796. echo 'net.ipv4.tcp_synack_retries = 2' >> /etc/sysctl.conf
  797. echo 'net.ipv4.tcp_syn_retries = 1' >> /etc/sysctl.conf
  798. echo '# keepalive' >> /etc/sysctl.conf
  799. echo 'net.ipv4.tcp_keepalive_probes = 9' >> /etc/sysctl.conf
  800. echo 'net.ipv4.tcp_keepalive_intvl = 75' >> /etc/sysctl.conf
  801. echo 'net.ipv4.tcp_keepalive_time = 7200' >> /etc/sysctl.conf
  802. echo 'configure_internet_protocol' >> $COMPLETION_FILE
  803. }
  804. function script_to_make_self_signed_certificates {
  805. if grep -Fxq "script_to_make_self_signed_certificates" $COMPLETION_FILE; then
  806. return
  807. fi
  808. echo '#!/bin/bash' > /usr/bin/makecert
  809. echo 'HOSTNAME=$1' >> /usr/bin/makecert
  810. echo 'COUNTRY_CODE="US"' >> /usr/bin/makecert
  811. echo 'AREA="Free Speech Zone"' >> /usr/bin/makecert
  812. echo 'LOCATION="Freedomville"' >> /usr/bin/makecert
  813. echo 'ORGANISATION="Freedombone"' >> /usr/bin/makecert
  814. echo 'UNIT="Freedombone Unit"' >> /usr/bin/makecert
  815. echo 'if ! which openssl > /dev/null ;then' >> /usr/bin/makecert
  816. echo ' echo "$0: openssl is not installed, exiting" 1>&2' >> /usr/bin/makecert
  817. echo ' exit 1' >> /usr/bin/makecert
  818. echo 'fi' >> /usr/bin/makecert
  819. echo 'openssl req -x509 -nodes -days 3650 -sha256 -subj "/O=$ORGANISATION/OU=$UNIT/C=$COUNTRY_CODE/ST=$AREA/L=$LOCATION/CN=$HOSTNAME" -newkey rsa:4096 -keyout /etc/ssl/private/$HOSTNAME.key -out /etc/ssl/certs/$HOSTNAME.crt' >> /usr/bin/makecert
  820. echo 'openssl dhparam -check -text -5 1024 -out /etc/ssl/certs/$HOSTNAME.dhparam' >> /usr/bin/makecert
  821. echo 'chmod 400 /etc/ssl/private/$HOSTNAME.key' >> /usr/bin/makecert
  822. echo 'chmod 640 /etc/ssl/certs/$HOSTNAME.crt' >> /usr/bin/makecert
  823. echo 'chmod 640 /etc/ssl/certs/$HOSTNAME.dhparam' >> /usr/bin/makecert
  824. echo 'if [ -f /etc/init.d/nginx ]; then' >> /usr/bin/makecert
  825. echo ' /etc/init.d/nginx reload' >> /usr/bin/makecert
  826. echo 'fi' >> /usr/bin/makecert
  827. echo '# add the public certificate to a separate directory' >> /usr/bin/makecert
  828. echo '# so that we can redistribute it easily' >> /usr/bin/makecert
  829. echo 'if [ ! -d /etc/ssl/mycerts ]; then' >> /usr/bin/makecert
  830. echo ' mkdir /etc/ssl/mycerts' >> /usr/bin/makecert
  831. echo 'fi' >> /usr/bin/makecert
  832. echo 'cp /etc/ssl/certs/$HOSTNAME.crt /etc/ssl/mycerts' >> /usr/bin/makecert
  833. echo '# Create a bundle of your certificates' >> /usr/bin/makecert
  834. echo 'cat /etc/ssl/mycerts/*.crt > /etc/ssl/freedombone-bundle.crt' >> /usr/bin/makecert
  835. echo 'tar -czvf /etc/ssl/freedombone-certs.tar.gz /etc/ssl/mycerts/*.crt' >> /usr/bin/makecert
  836. chmod +x /usr/bin/makecert
  837. echo 'script_to_make_self_signed_certificates' >> $COMPLETION_FILE
  838. }
  839. function configure_email {
  840. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  841. return
  842. fi
  843. if grep -Fxq "configure_email" $COMPLETION_FILE; then
  844. return
  845. fi
  846. apt-get -y remove postfix
  847. apt-get -y --force-yes install exim4 sasl2-bin swaks libnet-ssleay-perl procmail
  848. echo 'dc_eximconfig_configtype="internet"' > /etc/exim4/update-exim4.conf.conf
  849. echo "dc_other_hostnames='$DOMAIN_NAME'" >> /etc/exim4/update-exim4.conf.conf
  850. echo "dc_local_interfaces=''" >> /etc/exim4/update-exim4.conf.conf
  851. echo "dc_readhost=''" >> /etc/exim4/update-exim4.conf.conf
  852. echo "dc_relay_domains=''" >> /etc/exim4/update-exim4.conf.conf
  853. echo "dc_minimaldns='false'" >> /etc/exim4/update-exim4.conf.conf
  854. echo "dc_relay_nets='192.168.1.0/24'" >> /etc/exim4/update-exim4.conf.conf
  855. echo "dc_smarthost=''" >> /etc/exim4/update-exim4.conf.conf
  856. echo "CFILEMODE='644'" >> /etc/exim4/update-exim4.conf.conf
  857. echo "dc_use_split_config='false'" >> /etc/exim4/update-exim4.conf.conf
  858. echo "dc_hide_mailname=''" >> /etc/exim4/update-exim4.conf.conf
  859. echo "dc_mailname_in_oh='true'" >> /etc/exim4/update-exim4.conf.conf
  860. echo "dc_localdelivery='maildir_home'" >> /etc/exim4/update-exim4.conf.conf
  861. update-exim4.conf
  862. sed -i "s/START=no/START=yes/g" /etc/default/saslauthd
  863. /etc/init.d/saslauthd start
  864. # make a tls certificate for email
  865. makecert exim
  866. mv /etc/ssl/private/exim.key /etc/exim4
  867. mv /etc/ssl/certs/exim.crt /etc/exim4
  868. mv /etc/ssl/certs/exim.dhparam /etc/exim4
  869. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  870. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  871. sed -i '/login_saslauthd_server/,/.endif/ s/# *//' /etc/exim4/exim4.conf.template
  872. sed -i "/.ifdef MAIN_HARDCODE_PRIMARY_HOSTNAME/i\MAIN_HARDCODE_PRIMARY_HOSTNAME = $DOMAIN_NAME\nMAIN_TLS_ENABLE = true" /etc/exim4/exim4.conf.template
  873. sed -i "s|SMTPLISTENEROPTIONS=''|SMTPLISTENEROPTIONS='-oX 465:25:587 -oP /var/run/exim4/exim.pid'|g" /etc/default/exim4
  874. if ! grep -q "tls_on_connect_ports=465" /etc/exim4/exim4.conf.template; then
  875. sed -i '/SSL configuration for exim/i\tls_on_connect_ports=465' /etc/exim4/exim4.conf.template
  876. fi
  877. adduser $MY_USERNAME sasl
  878. addgroup Debian-exim sasl
  879. /etc/init.d/exim4 restart
  880. if [ ! -d /etc/skel/Maildir ]; then
  881. mkdir -m 700 /etc/skel/Maildir
  882. mkdir -m 700 /etc/skel/Maildir/Sent
  883. mkdir -m 700 /etc/skel/Maildir/Sent/tmp
  884. mkdir -m 700 /etc/skel/Maildir/Sent/cur
  885. mkdir -m 700 /etc/skel/Maildir/Sent/new
  886. mkdir -m 700 /etc/skel/Maildir/.learn-spam
  887. mkdir -m 700 /etc/skel/Maildir/.learn-spam/cur
  888. mkdir -m 700 /etc/skel/Maildir/.learn-spam/new
  889. mkdir -m 700 /etc/skel/Maildir/.learn-spam/tmp
  890. mkdir -m 700 /etc/skel/Maildir/.learn-ham
  891. mkdir -m 700 /etc/skel/Maildir/.learn-ham/cur
  892. mkdir -m 700 /etc/skel/Maildir/.learn-ham/new
  893. mkdir -m 700 /etc/skel/Maildir/.learn-ham/tmp
  894. ln -s /etc/skel/Maildir/.learn-spam /etc/skel/Maildir/spam
  895. ln -s /etc/skel/Maildir/.learn-ham /etc/skel/Maildir/ham
  896. fi
  897. if [ ! -d /home/$MY_USERNAME/Maildir ]; then
  898. mkdir -m 700 /home/$MY_USERNAME/Maildir
  899. mkdir -m 700 /home/$MY_USERNAME/Maildir/cur
  900. mkdir -m 700 /home/$MY_USERNAME/Maildir/tmp
  901. mkdir -m 700 /home/$MY_USERNAME/Maildir/new
  902. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent
  903. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/cur
  904. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/tmp
  905. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/new
  906. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam
  907. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/cur
  908. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/new
  909. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/tmp
  910. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham
  911. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/cur
  912. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/new
  913. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/tmp
  914. ln -s /home/$MY_USERNAME/Maildir/.learn-spam /home/$MY_USERNAME/Maildir/spam
  915. ln -s /home/$MY_USERNAME/Maildir/.learn-ham /home/$MY_USERNAME/Maildir/ham
  916. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  917. fi
  918. echo 'configure_email' >> $COMPLETION_FILE
  919. }
  920. function spam_filtering {
  921. # NOTE: spamassassin installation currently doesn't work, sa-compile fails with a make error 23/09/2014
  922. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  923. return
  924. fi
  925. if grep -Fxq "spam_filtering" $COMPLETION_FILE; then
  926. return
  927. fi
  928. apt-get -y --force-yes install exim4-daemon-heavy
  929. apt-get -y --force-yes install spamassassin
  930. sa-update -v
  931. sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/spamassassin
  932. sed -i 's/# spamd_address = 127.0.0.1 783/spamd_address = 127.0.0.1 783/g' /etc/exim4/exim4.conf.template
  933. # This configuration is based on https://wiki.debian.org/DebianSpamAssassin
  934. sed -i 's/local_parts = postmaster/local_parts = postmaster:abuse/g' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  935. sed -i '/domains = +local_domains : +relay_to_domains/a\ set acl_m0 = rfcnames' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  936. sed -i 's/accept/accept condition = ${if eq{$acl_m0}{rfcnames} {1}{0}}/g' /etc/exim4/conf.d/acl/40_exim4-config_check_data
  937. echo 'warn message = X-Spam-Score: $spam_score ($spam_bar)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  938. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  939. echo 'warn message = X-Spam-Flag: YES' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  940. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  941. echo 'warn message = X-Spam-Report: $spam_report' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  942. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  943. echo '# reject spam at high scores (> 12)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  944. echo 'deny message = This message scored $spam_score spam points.' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  945. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  946. echo ' condition = ${if >{$spam_score_int}{120}{1}{0}}' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  947. # procmail configuration
  948. echo 'MAILDIR=$HOME/Maildir' > /home/$MY_USERNAME/.procmailrc
  949. echo 'DEFAULT=$MAILDIR/' >> /home/$MY_USERNAME/.procmailrc
  950. echo 'LOGFILE=$HOME/log/procmail.log' >> /home/$MY_USERNAME/.procmailrc
  951. echo 'LOGABSTRACT=all' >> /home/$MY_USERNAME/.procmailrc
  952. echo '# get spamassassin to check emails' >> /home/$MY_USERNAME/.procmailrc
  953. echo ':0fw: .spamassassin.lock' >> /home/$MY_USERNAME/.procmailrc
  954. echo ' * < 256000' >> /home/$MY_USERNAME/.procmailrc
  955. echo '| spamc' >> /home/$MY_USERNAME/.procmailrc
  956. echo '# strong spam are discarded' >> /home/$MY_USERNAME/.procmailrc
  957. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  958. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  959. echo '/dev/null' >> /home/$MY_USERNAME/.procmailrc
  960. echo '# weak spam are kept just in case - clear this out every now and then' >> /home/$MY_USERNAME/.procmailrc
  961. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  962. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  963. echo '.0-spam/' >> /home/$MY_USERNAME/.procmailrc
  964. echo '# otherwise, marginal spam goes here for revision' >> /home/$MY_USERNAME/.procmailrc
  965. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  966. echo ' * ^X-Spam-Level: \*\*' >> /home/$MY_USERNAME/.procmailrc
  967. echo '.spam/' >> /home/$MY_USERNAME/.procmailrc
  968. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  969. # filtering scripts
  970. echo '#!/bin/bash' > /usr/bin/filterspam
  971. echo 'USERNAME=$1' >> /usr/bin/filterspam
  972. echo 'MAILDIR=/home/$USERNAME/Maildir/.learn-spam' >> /usr/bin/filterspam
  973. echo 'if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterspam
  974. echo ' exit' >> /usr/bin/filterspam
  975. echo 'fi' >> /usr/bin/filterspam
  976. echo 'for f in `ls $MAILDIR/cur`' >> /usr/bin/filterspam
  977. echo 'do' >> /usr/bin/filterspam
  978. echo ' spamc -L spam < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterspam
  979. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterspam
  980. echo 'done' >> /usr/bin/filterspam
  981. echo 'for f in `ls $MAILDIR/new`' >> /usr/bin/filterspam
  982. echo 'do' >> /usr/bin/filterspam
  983. echo ' spamc -L spam < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterspam
  984. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterspam
  985. echo 'done' >> /usr/bin/filterspam
  986. echo '#!/bin/bash' > /usr/bin/filterham
  987. echo 'USERNAME=$1' >> /usr/bin/filterham
  988. echo 'MAILDIR=/home/$USERNAME/Maildir/.learn-ham' >> /usr/bin/filterham
  989. echo 'if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterham
  990. echo ' exit' >> /usr/bin/filterham
  991. echo 'fi' >> /usr/bin/filterham
  992. echo 'for f in `ls $MAILDIR/cur`' >> /usr/bin/filterham
  993. echo 'do' >> /usr/bin/filterham
  994. echo ' spamc -L ham < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterham
  995. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterham
  996. echo 'done' >> /usr/bin/filterham
  997. echo 'for f in `ls $MAILDIR/new`' >> /usr/bin/filterham
  998. echo 'do' >> /usr/bin/filterham
  999. echo ' spamc -L ham < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterham
  1000. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterham
  1001. echo 'done' >> /usr/bin/filterham
  1002. if ! grep -q "filterspam" /etc/crontab; then
  1003. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterspam $MY_USERNAME" >> /etc/crontab
  1004. fi
  1005. if ! grep -q "filterham" /etc/crontab; then
  1006. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterham $MY_USERNAME" >> /etc/crontab
  1007. fi
  1008. chmod 655 /usr/bin/filterspam /usr/bin/filterham
  1009. sed -i 's/# use_bayes 1/use_bayes 1/g' /etc/mail/spamassassin/local.cf
  1010. sed -i 's/# bayes_auto_learn 1/bayes_auto_learn 1/g' /etc/mail/spamassassin/local.cf
  1011. service spamassassin restart
  1012. service exim4 restart
  1013. service cron restart
  1014. echo 'spam_filtering' >> $COMPLETION_FILE
  1015. }
  1016. function configure_imap {
  1017. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1018. return
  1019. fi
  1020. if grep -Fxq "configure_imap" $COMPLETION_FILE; then
  1021. return
  1022. fi
  1023. apt-get -y --force-yes install dovecot-common dovecot-imapd
  1024. makecert dovecot
  1025. chown root:dovecot /etc/ssl/certs/dovecot.crt
  1026. chown root:dovecot /etc/ssl/private/dovecot.key
  1027. chown root:dovecot /etc/ssl/private/dovecot.dhparams
  1028. sed -i 's|#ssl = yes|ssl = yes|g' /etc/dovecot/conf.d/10-ssl.conf
  1029. sed -i 's|ssl_cert = </etc/dovecot/dovecot.pem|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  1030. sed -i 's|ssl_key = </etc/dovecot/private/dovecot.pem|/etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  1031. sed -i 's|#ssl_dh_parameters_length = 1024|ssl_dh_parameters_length = 1024|g' /etc/dovecot/conf.d/10-ssl.conf
  1032. sed -i 's/#ssl_prefer_server_ciphers = no/ssl_prefer_server_ciphers = yes/g' /etc/dovecot/conf.d/10-ssl.conf
  1033. echo "ssl_cipher_list = 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA'" >> /etc/dovecot/conf.d/10-ssl.conf
  1034. sed -i 's/#listen = *, ::/listen = */g' /etc/dovecot/dovecot.conf
  1035. sed -i 's/#disable_plaintext_auth = yes/disable_plaintext_auth = no/g' /etc/dovecot/conf.d/10-auth.conf
  1036. sed -i 's/auth_mechanisms = plain/auth_mechanisms = plain login/g' /etc/dovecot/conf.d/10-auth.conf
  1037. sed -i 's|# mail_location = maildir:~/Maildir| mail_location = maildir:~/Maildir:LAYOUT=fs|g' /etc/dovecot/conf.d/10-mail.conf
  1038. echo 'configure_imap' >> $COMPLETION_FILE
  1039. }
  1040. function configure_gpg {
  1041. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1042. return
  1043. fi
  1044. if grep -Fxq "configure_gpg" $COMPLETION_FILE; then
  1045. return
  1046. fi
  1047. apt-get -y --force-yes install gnupg
  1048. if [ ! -d /home/$MY_USERNAME/.gnupg ]; then
  1049. mkdir /home/$MY_USERNAME/.gnupg
  1050. echo 'keyserver hkp://keys.gnupg.net' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1051. echo 'keyserver-options auto-key-retrieve' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1052. fi
  1053. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" /home/$MY_USERNAME/.gnupg/gpg.conf
  1054. if ! grep -q "# default preferences" /home/$MY_USERNAME/.gnupg/gpg.conf; then
  1055. echo '' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1056. echo '# default preferences' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1057. echo 'personal-digest-preferences SHA256' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1058. echo 'cert-digest-algo SHA256' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1059. echo 'default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1060. fi
  1061. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  1062. if [[ $MY_GPG_PUBLIC_KEY && $MY_GPG_PRIVATE_KEY ]]; then
  1063. # use your existing GPG keys which were exported
  1064. if [ ! -f $MY_GPG_PUBLIC_KEY ]; then
  1065. echo "GPG public key file $MY_GPG_PUBLIC_KEY was not found"
  1066. exit 5
  1067. fi
  1068. if [ ! -f $MY_GPG_PRIVATE_KEY ]; then
  1069. echo "GPG private key file $MY_GPG_PRIVATE_KEY was not found"
  1070. exit 6
  1071. fi
  1072. su -c "gpg --import $MY_GPG_PUBLIC_KEY" - $MY_USERNAME
  1073. su -c "gpg --allow-secret-key-import --import $MY_GPG_PRIVATE_KEY" - $MY_USERNAME
  1074. # for security ensure that the private key file doesn't linger around
  1075. shred -zu $MY_GPG_PRIVATE_KEY
  1076. else
  1077. # Generate a GPG key
  1078. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  1079. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  1080. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  1081. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  1082. echo "Name-Real: $MY_USERNAME@$DOMAIN_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  1083. echo "Name-Email: $MY_USERNAME@$DOMAIN_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  1084. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  1085. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  1086. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  1087. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  1088. MY_GPG_PUBLIC_KEY_ID=$(su -c "gpg --list-keys $DOMAIN_NAME | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}'" - $MY_USERNAME)
  1089. MY_GPG_PUBLIC_KEY=/tmp/public_key.gpg
  1090. su -c "gpg --output $MY_GPG_PUBLIC_KEY --armor --export $MY_GPG_PUBLIC_KEY_ID" - $MY_USERNAME
  1091. fi
  1092. echo 'configure_gpg' >> $COMPLETION_FILE
  1093. }
  1094. function email_client {
  1095. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1096. return
  1097. fi
  1098. if grep -Fxq "email_client" $COMPLETION_FILE; then
  1099. return
  1100. fi
  1101. apt-get -y --force-yes install mutt-patched lynx abook
  1102. if [ ! -d /home/$MY_USERNAME/.mutt ]; then
  1103. mkdir /home/$MY_USERNAME/.mutt
  1104. fi
  1105. echo "text/html; lynx -dump -width=78 -nolist %s | sed ‘s/^ //’; copiousoutput; needsterminal; nametemplate=%s.html" > /home/$MY_USERNAME/.mutt/mailcap
  1106. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt
  1107. echo 'set mbox_type=Maildir' >> /etc/Muttrc
  1108. echo 'set folder="~/Maildir"' >> /etc/Muttrc
  1109. echo 'set mask="!^\\.[^.]"' >> /etc/Muttrc
  1110. echo 'set mbox="~/Maildir"' >> /etc/Muttrc
  1111. echo 'set record="+Sent"' >> /etc/Muttrc
  1112. echo 'set postponed="+Drafts"' >> /etc/Muttrc
  1113. echo 'set trash="+Trash"' >> /etc/Muttrc
  1114. echo 'set spoolfile="~/Maildir"' >> /etc/Muttrc
  1115. echo 'auto_view text/x-vcard text/html text/enriched' >> /etc/Muttrc
  1116. echo 'set editor="emacs"' >> /etc/Muttrc
  1117. echo 'set header_cache="+.cache"' >> /etc/Muttrc
  1118. echo '' >> /etc/Muttrc
  1119. echo 'macro index S "<tag-prefix><save-message>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  1120. echo 'macro pager S "<save-message>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  1121. echo 'macro index H "<tag-prefix><copy-message>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  1122. echo 'macro pager H "<copy-message>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  1123. echo '' >> /etc/Muttrc
  1124. echo '# set up the sidebar' >> /etc/Muttrc
  1125. echo 'set sidebar_width=12' >> /etc/Muttrc
  1126. echo 'set sidebar_visible=yes' >> /etc/Muttrc
  1127. echo "set sidebar_delim='|'" >> /etc/Muttrc
  1128. echo 'set sidebar_sort=yes' >> /etc/Muttrc
  1129. echo '' >> /etc/Muttrc
  1130. echo 'set rfc2047_parameters' >> /etc/Muttrc
  1131. echo '' >> /etc/Muttrc
  1132. echo '# Show inbox and sent items' >> /etc/Muttrc
  1133. echo 'mailboxes = =Sent' >> /etc/Muttrc
  1134. echo '' >> /etc/Muttrc
  1135. echo '# Alter these colours as needed for maximum bling' >> /etc/Muttrc
  1136. echo 'color sidebar_new yellow default' >> /etc/Muttrc
  1137. echo 'color normal white default' >> /etc/Muttrc
  1138. echo 'color hdrdefault brightcyan default' >> /etc/Muttrc
  1139. echo 'color signature green default' >> /etc/Muttrc
  1140. echo 'color attachment brightyellow default' >> /etc/Muttrc
  1141. echo 'color quoted green default' >> /etc/Muttrc
  1142. echo 'color quoted1 white default' >> /etc/Muttrc
  1143. echo 'color tilde blue default' >> /etc/Muttrc
  1144. echo '' >> /etc/Muttrc
  1145. echo '# ctrl-n, ctrl-p to select next, prev folder' >> /etc/Muttrc
  1146. echo '# ctrl-o to open selected folder' >> /etc/Muttrc
  1147. echo 'bind index \Cp sidebar-prev' >> /etc/Muttrc
  1148. echo 'bind index \Cn sidebar-next' >> /etc/Muttrc
  1149. echo 'bind index \Co sidebar-open' >> /etc/Muttrc
  1150. echo 'bind pager \Cp sidebar-prev' >> /etc/Muttrc
  1151. echo 'bind pager \Cn sidebar-next' >> /etc/Muttrc
  1152. echo 'bind pager \Co sidebar-open' >> /etc/Muttrc
  1153. echo '' >> /etc/Muttrc
  1154. echo '# ctrl-b toggles sidebar visibility' >> /etc/Muttrc
  1155. echo "macro index,pager \Cb '<enter-command>toggle sidebar_visible<enter><redraw-screen>' 'toggle sidebar'" >> /etc/Muttrc
  1156. echo '' >> /etc/Muttrc
  1157. echo '# esc-m Mark new messages as read' >> /etc/Muttrc
  1158. echo 'macro index <esc>m "T~N<enter>;WNT~O<enter>;WO\CT~T<enter>" "mark all messages read"' >> /etc/Muttrc
  1159. echo '' >> /etc/Muttrc
  1160. echo '# Collapsing threads' >> /etc/Muttrc
  1161. echo 'macro index [ "<collapse-thread>" "collapse/uncollapse thread"' >> /etc/Muttrc
  1162. echo 'macro index ] "<collapse-all>" "collapse/uncollapse all threads"' >> /etc/Muttrc
  1163. echo '' >> /etc/Muttrc
  1164. echo '# threads containing new messages' >> /etc/Muttrc
  1165. echo 'uncolor index "~(~N)"' >> /etc/Muttrc
  1166. echo 'color index brightblue default "~(~N)"' >> /etc/Muttrc
  1167. echo '' >> /etc/Muttrc
  1168. echo '# new messages themselves' >> /etc/Muttrc
  1169. echo 'uncolor index "~N"' >> /etc/Muttrc
  1170. echo 'color index brightyellow default "~N"' >> /etc/Muttrc
  1171. echo '' >> /etc/Muttrc
  1172. echo '# GPG/PGP integration' >> /etc/Muttrc
  1173. echo '# this set the number of seconds to keep in memory the passphrase used to encrypt/sign' >> /etc/Muttrc
  1174. echo 'set pgp_timeout=60' >> /etc/Muttrc
  1175. echo '' >> /etc/Muttrc
  1176. echo '# automatically sign and encrypt with PGP/MIME' >> /etc/Muttrc
  1177. echo 'set pgp_autosign # autosign all outgoing mails' >> /etc/Muttrc
  1178. echo 'set pgp_autoencrypt # Try to encrypt automatically' >> /etc/Muttrc
  1179. echo 'set pgp_replyencrypt # autocrypt replies to crypted' >> /etc/Muttrc
  1180. echo 'set pgp_replysign # autosign replies to signed' >> /etc/Muttrc
  1181. echo 'set pgp_auto_decode=yes # decode attachments' >> /etc/Muttrc
  1182. echo 'set fcc_clear # Keep cleartext copy of sent encrypted mail' >> /etc/Muttrc
  1183. echo 'unset smime_is_default' >> /etc/Muttrc
  1184. echo '' >> /etc/Muttrc
  1185. echo 'set alias_file=~/.mutt-alias' >> /etc/Muttrc
  1186. echo 'source ~/.mutt-alias' >> /etc/Muttrc
  1187. echo 'set query_command= "abook --mutt-query \"%s\""' >> /etc/Muttrc
  1188. echo 'macro index,pager A "<pipe-message>abook --add-email-quiet<return>" "add the sender address to abook"' >> /etc/Muttrc
  1189. cp -f /etc/Muttrc /home/$MY_USERNAME/.muttrc
  1190. touch /home/$MY_USERNAME/.mutt-alias
  1191. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.muttrc
  1192. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt-alias
  1193. echo 'email_client' >> $COMPLETION_FILE
  1194. }
  1195. function folders_for_mailing_lists {
  1196. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1197. return
  1198. fi
  1199. if grep -Fxq "folders_for_mailing_lists" $COMPLETION_FILE; then
  1200. return
  1201. fi
  1202. echo '#!/bin/bash' > /usr/bin/mailinglistrule
  1203. echo 'MYUSERNAME=$1' >> /usr/bin/mailinglistrule
  1204. echo 'MAILINGLIST=$2' >> /usr/bin/mailinglistrule
  1205. echo 'SUBJECTTAG=$3' >> /usr/bin/mailinglistrule
  1206. echo 'MUTTRC=/home/$MYUSERNAME/.muttrc' >> /usr/bin/mailinglistrule
  1207. echo 'PM=/home/$MYUSERNAME/.procmailrc' >> /usr/bin/mailinglistrule
  1208. echo 'LISTDIR=/home/$MYUSERNAME/Maildir/$MAILINGLIST' >> /usr/bin/mailinglistrule
  1209. echo 'if ! [[ $MYUSERNAME && $MAILINGLIST && $SUBJECTTAG ]]; then' >> /usr/bin/mailinglistrule
  1210. echo ' echo "mailinglistsrule [user name] [mailing list name] [subject tag]"' >> /usr/bin/mailinglistrule
  1211. echo ' exit 1' >> /usr/bin/mailinglistrule
  1212. echo 'fi' >> /usr/bin/mailinglistrule
  1213. echo 'if [ ! -d "$LISTDIR" ]; then' >> /usr/bin/mailinglistrule
  1214. echo ' mkdir -m 700 $LISTDIR' >> /usr/bin/mailinglistrule
  1215. echo ' mkdir -m 700 $LISTDIR/tmp' >> /usr/bin/mailinglistrule
  1216. echo ' mkdir -m 700 $LISTDIR/new' >> /usr/bin/mailinglistrule
  1217. echo ' mkdir -m 700 $LISTDIR/cur' >> /usr/bin/mailinglistrule
  1218. echo 'fi' >> /usr/bin/mailinglistrule
  1219. echo 'chown -R $MYUSERNAME:$MYUSERNAME $LISTDIR' >> /usr/bin/mailinglistrule
  1220. echo 'echo "" >> $PM' >> /usr/bin/mailinglistrule
  1221. echo 'echo ":0" >> $PM' >> /usr/bin/mailinglistrule
  1222. echo 'echo " * ^Subject:.*()\[$SUBJECTTAG\]" >> $PM' >> /usr/bin/mailinglistrule
  1223. echo 'echo "$LISTDIR/new" >> $PM' >> /usr/bin/mailinglistrule
  1224. echo 'chown $MYUSERNAME:$MYUSERNAME $PM' >> /usr/bin/mailinglistrule
  1225. echo 'if [ ! -f "$MUTTRC" ]; then' >> /usr/bin/mailinglistrule
  1226. echo ' cp /etc/Muttrc $MUTTRC' >> /usr/bin/mailinglistrule
  1227. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/mailinglistrule
  1228. echo 'fi' >> /usr/bin/mailinglistrule
  1229. echo 'PROCMAILLOG=/home/$MYUSERNAME/log' >> /usr/bin/mailinglistrule
  1230. echo 'if [ ! -d $PROCMAILLOG ]; then' >> /usr/bin/mailinglistrule
  1231. echo ' mkdir $PROCMAILLOG' >> /usr/bin/mailinglistrule
  1232. echo ' chown -R $MYUSERNAME:$MYUSERNAME $PROCMAILLOG' >> /usr/bin/mailinglistrule
  1233. echo 'fi' >> /usr/bin/mailinglistrule
  1234. echo 'MUTT_MAILBOXES=$(grep "mailboxes =" $MUTTRC)' >> /usr/bin/mailinglistrule
  1235. echo 'if [[ $MUTT_MAILBOXES != *$MAILINGLIST* ]]; then' >> /usr/bin/mailinglistrule
  1236. echo ' sed -i "s|$MUTT_MAILBOXES|$MUTT_MAILBOXES =$MAILINGLIST|g" $MUTTRC' >> /usr/bin/mailinglistrule
  1237. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/mailinglistrule
  1238. echo 'fi' >> /usr/bin/mailinglistrule
  1239. chmod +x /usr/bin/mailinglistrule
  1240. echo 'folders_for_mailing_lists' >> $COMPLETION_FILE
  1241. }
  1242. function folders_for_email_addresses {
  1243. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1244. return
  1245. fi
  1246. if grep -Fxq "folders_for_email_addresses" $COMPLETION_FILE; then
  1247. return
  1248. fi
  1249. echo '#!/bin/bash' > /usr/bin/emailrule
  1250. echo 'MYUSERNAME=$1' >> /usr/bin/emailrule
  1251. echo 'EMAILADDRESS=$2' >> /usr/bin/emailrule
  1252. echo 'MAILINGLIST=$3' >> /usr/bin/emailrule
  1253. echo 'MUTTRC=/home/$MYUSERNAME/.muttrc' >> /usr/bin/emailrule
  1254. echo 'PM=/home/$MYUSERNAME/.procmailrc' >> /usr/bin/emailrule
  1255. echo 'LISTDIR=/home/$MYUSERNAME/Maildir/$MAILINGLIST' >> /usr/bin/emailrule
  1256. echo 'if ! [[ $MYUSERNAME && $EMAILADDRESS && $MAILINGLIST ]]; then' >> /usr/bin/emailrule
  1257. echo ' echo "emailrule [user name] [email address] [mailing list name]"' >> /usr/bin/emailrule
  1258. echo ' exit 1' >> /usr/bin/emailrule
  1259. echo 'fi' >> /usr/bin/emailrule
  1260. echo 'if [ ! -d "$LISTDIR" ]; then' >> /usr/bin/emailrule
  1261. echo ' mkdir -m 700 $LISTDIR' >> /usr/bin/emailrule
  1262. echo ' mkdir -m 700 $LISTDIR/tmp' >> /usr/bin/emailrule
  1263. echo ' mkdir -m 700 $LISTDIR/new' >> /usr/bin/emailrule
  1264. echo ' mkdir -m 700 $LISTDIR/cur' >> /usr/bin/emailrule
  1265. echo 'fi' >> /usr/bin/emailrule
  1266. echo 'chown -R $MYUSERNAME:$MYUSERNAME $LISTDIR' >> /usr/bin/emailrule
  1267. echo 'echo "" >> $PM' >> /usr/bin/emailrule
  1268. echo 'echo ":0" >> $PM' >> /usr/bin/emailrule
  1269. echo 'echo " * ^From: $EMAILADDRESS" >> $PM' >> /usr/bin/emailrule
  1270. echo 'echo "$LISTDIR/new" >> $PM' >> /usr/bin/emailrule
  1271. echo 'chown $MYUSERNAME:$MYUSERNAME $PM' >> /usr/bin/emailrule
  1272. echo 'if [ ! -f "$MUTTRC" ]; then' >> /usr/bin/emailrule
  1273. echo ' cp /etc/Muttrc $MUTTRC' >> /usr/bin/emailrule
  1274. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/emailrule
  1275. echo 'fi' >> /usr/bin/emailrule
  1276. echo 'PROCMAILLOG=/home/$MYUSERNAME/log' >> /usr/bin/emailrule
  1277. echo 'if [ ! -d $PROCMAILLOG ]; then' >> /usr/bin/emailrule
  1278. echo ' mkdir $PROCMAILLOG' >> /usr/bin/emailrule
  1279. echo ' chown -R $MYUSERNAME:$MYUSERNAME $PROCMAILLOG' >> /usr/bin/emailrule
  1280. echo 'fi' >> /usr/bin/emailrule
  1281. echo 'MUTT_MAILBOXES=$(grep "mailboxes =" $MUTTRC)' >> /usr/bin/emailrule
  1282. echo 'if [[ $MUTT_MAILBOXES != *$MAILINGLIST* ]]; then' >> /usr/bin/emailrule
  1283. echo ' sed -i "s|$MUTT_MAILBOXES|$MUTT_MAILBOXES =$MAILINGLIST|g" $MUTTRC' >> /usr/bin/emailrule
  1284. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/emailrule
  1285. echo 'fi' >> /usr/bin/emailrule
  1286. chmod +x /usr/bin/emailrule
  1287. echo 'folders_for_email_addresses' >> $COMPLETION_FILE
  1288. }
  1289. function dynamic_dns_freedns {
  1290. if grep -Fxq "dynamic_dns_freedns" $COMPLETION_FILE; then
  1291. return
  1292. fi
  1293. echo '#!/bin/bash' > /usr/bin/dynamicdns
  1294. echo '# subdomain name 1' >> /usr/bin/dynamicdns
  1295. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  1296. echo '# add any other subdomains below' >> /usr/bin/dynamicdns
  1297. chmod 600 /usr/bin/dynamicdns
  1298. chmod +x /usr/bin/dynamicdns
  1299. if ! grep -q "dynamicdns" /etc/crontab; then
  1300. sed -i '/# m h dom mon dow user command/a\*/5 * * * * root /usr/bin/timeout 240 /usr/bin/dynamicdns' /etc/crontab
  1301. fi
  1302. service cron restart
  1303. echo 'dynamic_dns_freedns' >> $COMPLETION_FILE
  1304. }
  1305. function create_private_mailing_list {
  1306. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1307. return
  1308. fi
  1309. # This installation doesn't work, results in ruby errors
  1310. # There is currently no schleuder package for Debian jessie
  1311. if grep -Fxq "create_private_mailing_list" $COMPLETION_FILE; then
  1312. return
  1313. fi
  1314. if [ ! $PRIVATE_MAILING_LIST ]; then
  1315. return
  1316. fi
  1317. if [ $PRIVATE_MAILING_LIST == $MY_USERNAME ]; then
  1318. echo 'The name of the private mailing list should not be the'
  1319. echo 'same as your username'
  1320. exit 10
  1321. fi
  1322. if [ ! $MY_GPG_PUBLIC_KEY ]; then
  1323. echo 'To create a private mailing list you need to specify a file'
  1324. echo 'containing your exported GPG key within MY_GPG_PUBLIC_KEY at'
  1325. echo 'the top of the script'
  1326. exit 11
  1327. fi
  1328. apt-get -y --force-yes install ruby ruby-dev ruby-gpgme libgpgme11-dev libmagic-dev
  1329. gem install schleuder
  1330. schleuder-fix-gem-dependencies
  1331. schleuder-init-setup --gem
  1332. # NOTE: this is version number sensitive and so might need changing
  1333. ln -s /var/lib/gems/2.1.0/gems/schleuder-2.2.4 /var/lib/schleuder
  1334. sed -i 's/#smtp_port: 25/smtp_port: 465/g' /etc/schleuder/schleuder.conf
  1335. sed -i 's/#superadminaddr: root@localhost/superadminaddr: root@localhost' /etc/schleuder/schleuder.conf
  1336. schleuder-newlist $PRIVATE_MAILING_LIST@$DOMAIN_NAME -realname "$PRIVATE_MAILING_LIST" -adminaddress $MY_USERNAME@$DOMAIN_NAME -initmember $MY_USERNAME@$DOMAIN_NAME -initmemberkey $MY_GPG_PUBLIC_KEY -nointeractive
  1337. emailrule $MY_USERNAME $PRIVATE_MAILING_LIST@$DOMAIN_NAME $PRIVATE_MAILING_LIST
  1338. echo 'schleuder:' > /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1339. echo ' debug_print = "R: schleuder for $local_part@$domain"' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1340. echo ' driver = accept' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1341. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1342. echo ' local_part_suffix = +* : -bounce : -sendkey' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1343. echo ' domains = +local_domains' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1344. echo ' user = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1345. echo ' group = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1346. echo ' require_files = schleuder:+/var/lib/schleuder/$domain/${local_part}' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1347. echo ' transport = schleuder_transport' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1348. echo 'schleuder_transport:' > /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1349. echo ' debug_print = "T: schleuder_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1350. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1351. echo ' home_directory = "/var/lib/schleuder/$domain/$local_part"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1352. echo ' command = "/usr/bin/schleuder $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1353. chown -R schleuder:schleuder /var/lib/schleuder
  1354. update-exim4.conf.template -r
  1355. update-exim4.conf
  1356. service exim4 restart
  1357. useradd -d /var/schleuderlists -s /bin/false schleuder
  1358. adduser Debian-exim schleuder
  1359. usermod -a -G mail schleuder
  1360. #exim -d -bt $PRIVATE_MAILING_LIST@$DOMAIN_NAME
  1361. echo 'create_private_mailing_list' >> $COMPLETION_FILE
  1362. }
  1363. function import_email {
  1364. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1365. return
  1366. fi
  1367. EMAIL_COMPLETE_MSG=' *** Freedombone mailbox installation is complete ***'
  1368. if grep -Fxq "import_email" $COMPLETION_FILE; then
  1369. if [[ $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  1370. echo $EMAIL_COMPLETE_MSG
  1371. if [ -d /media/usb ]; then
  1372. umount /media/usb
  1373. rm -rf /media/usb
  1374. echo ' You can now remove the USB drive'
  1375. fi
  1376. exit 0
  1377. fi
  1378. return
  1379. fi
  1380. if [ $IMPORT_MAILDIR ]; then
  1381. if [ -d $IMPORT_MAILDIR ]; then
  1382. echo 'Transfering email files'
  1383. cp -r $IMPORT_MAILDIR /home/$MY_USERNAME
  1384. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  1385. else
  1386. echo "Email import directory $IMPORT_MAILDIR not found"
  1387. exit 9
  1388. fi
  1389. fi
  1390. echo 'import_email' >> $COMPLETION_FILE
  1391. if [[ $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  1392. apt-get -y --force-yes autoremove
  1393. # unmount any attached usb drive
  1394. echo ''
  1395. echo $EMAIL_COMPLETE_MSG
  1396. echo ''
  1397. if [ -d /media/usb ]; then
  1398. umount /media/usb
  1399. rm -rf /media/usb
  1400. echo ' You can now remove the USB drive'
  1401. fi
  1402. exit 0
  1403. fi
  1404. }
  1405. function install_web_server {
  1406. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  1407. return
  1408. fi
  1409. if grep -Fxq "install_web_server" $COMPLETION_FILE; then
  1410. return
  1411. fi
  1412. # remove apache
  1413. apt-get -y remove --purge apache2
  1414. if [ -d /etc/apache2 ]; then
  1415. rm -rf /etc/apache2
  1416. fi
  1417. # install nginx
  1418. apt-get -y --force-yes install nginx php5-fpm git
  1419. # install a script to easily enable and disable nginx virtual hosts
  1420. if [ ! -d $INSTALL_DIR ]; then
  1421. mkdir $INSTALL_DIR
  1422. fi
  1423. cd $INSTALL_DIR
  1424. git clone https://github.com/perusio/nginx_ensite
  1425. cd $INSTALL_DIR/nginx_ensite
  1426. cp nginx_* /usr/sbin
  1427. nginx_dissite default
  1428. echo 'install_web_server' >> $COMPLETION_FILE
  1429. }
  1430. function configure_php {
  1431. sed -i "s/memory_limit = 128M/memory_limit = $MAX_PHP_MEMORYM/g" /etc/php5/fpm/php.ini
  1432. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  1433. sed -i "s/memory_limit = -1/memory_limit = $MAX_PHP_MEMORYM/g" /etc/php5/cli/php.ini
  1434. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  1435. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  1436. sed -i "s/memory_limit = /memory_limit = $MAX_PHP_MEMORYM/g" /etc/php5/cli/php.ini
  1437. }
  1438. function install_owncloud {
  1439. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1440. return
  1441. fi
  1442. OWNCLOUD_COMPLETION_MSG1=" *** Freedombone $SYSTEM_TYPE is now installed ***"
  1443. OWNCLOUD_COMPLETION_MSG2="Open $OWNCLOUD_DOMAIN_NAME in a web browser to complete the setup"
  1444. if grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  1445. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1446. # unmount any attached usb drive
  1447. if [ -d /media/usb ]; then
  1448. umount /media/usb
  1449. rm -rf /media/usb
  1450. fi
  1451. echo ''
  1452. echo $OWNCLOUD_COMPLETION_MSG1
  1453. echo $OWNCLOUD_COMPLETION_MSG2
  1454. exit 0
  1455. fi
  1456. return
  1457. fi
  1458. # if this is exclusively a cloud setup
  1459. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1460. OWNCLOUD_DOMAIN_NAME=$DOMAIN_NAME
  1461. OWNCLOUD_FREEDNS_SUBDOMAIN_CODE=$FREEDNS_SUBDOMAIN_CODE
  1462. fi
  1463. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  1464. return
  1465. fi
  1466. if ! [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1467. if [ ! $SYSTEM_TYPE ]; then
  1468. return
  1469. fi
  1470. fi
  1471. apt-get -y --force-yes install php5 php5-gd php-xml-parser php5-intl wget
  1472. apt-get -y --force-yes install php5-sqlite php5-mysql smbclient curl libcurl3 php5-curl bzip2
  1473. if [ ! -d /var/www/$OWNCLOUD_DOMAIN_NAME ]; then
  1474. mkdir /var/www/$OWNCLOUD_DOMAIN_NAME
  1475. mkdir /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  1476. fi
  1477. echo 'server {' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1478. echo ' listen 80;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1479. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1480. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1481. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1482. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1483. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1484. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1485. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1486. echo ' ssl on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1487. echo " ssl_certificate /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1488. echo " ssl_certificate_key /etc/ssl/private/$OWNCLOUD_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1489. echo " ssl_dhparam /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1490. echo ' ssl_session_timeout 5m;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1491. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1492. echo ' ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1493. echo " ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA';" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1494. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1495. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1496. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1497. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1498. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1499. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1500. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1501. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1502. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1503. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1504. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1505. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1506. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1507. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1508. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1509. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1510. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1511. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1512. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1513. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1514. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1515. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1516. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1517. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1518. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1519. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1520. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1521. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1522. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1523. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1524. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1525. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1526. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1527. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1528. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1529. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1530. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1531. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1532. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1533. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1534. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1535. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1536. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1537. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1538. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1539. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1540. echo ' fastcgi_param HTTPS on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1541. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1542. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1543. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1544. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1545. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1546. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1547. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1548. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1549. configure_php
  1550. if [ ! -f /etc/ssl/private/$OWNCLOUD_DOMAIN_NAME.key ]; then
  1551. makecert $OWNCLOUD_DOMAIN_NAME
  1552. fi
  1553. # download owncloud
  1554. cd $INSTALL_DIR
  1555. if [ ! -f $INSTALL_DIR/$OWNCLOUD_ARCHIVE ]; then
  1556. wget $OWNCLOUD_DOWNLOAD
  1557. fi
  1558. if [ ! -f $INSTALL_DIR/$OWNCLOUD_ARCHIVE ]; then
  1559. echo 'Owncloud could not be downloaded. Check that it exists at '
  1560. echo $OWNCLOUD_DOWNLOAD
  1561. echo 'And if neccessary update the version number and hash within this script'
  1562. exit 18
  1563. fi
  1564. # Check that the hash is correct
  1565. CHECKSUM=$(sha256sum $OWNCLOUD_ARCHIVE | awk -F ' ' '{print $1}')
  1566. if [[ $CHECKSUM != $OWNCLOUD_HASH ]]; then
  1567. echo 'The sha256 hash of the owncloud download is incorrect. Possibly the file may have been tampered with. Check the hash on the Owncloud web site.'
  1568. exit 19
  1569. fi
  1570. tar -xjf $OWNCLOUD_ARCHIVE
  1571. echo 'Copying files...'
  1572. cp -r owncloud/* /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  1573. chown -R www-data:www-data /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs/apps
  1574. chown -R www-data:www-data /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs/config
  1575. chown www-data:www-data /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  1576. nginx_ensite $OWNCLOUD_DOMAIN_NAME
  1577. service php5-fpm restart
  1578. service nginx restart
  1579. # update the dynamic DNS
  1580. if [[ $OWNCLOUD_FREEDNS_SUBDOMAIN_CODE != $FREEDNS_SUBDOMAIN_CODE ]]; then
  1581. if ! grep -q "$OWNCLOUD_DOMAIN_NAME" /usr/bin/dynamicdns; then
  1582. echo "# $OWNCLOUD_DOMAIN_NAME" >> /usr/bin/dynamicdns
  1583. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$OWNCLOUD_FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  1584. fi
  1585. fi
  1586. echo 'install_owncloud' >> $COMPLETION_FILE
  1587. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1588. # unmount any attached usb drive
  1589. if [ -d /media/usb ]; then
  1590. umount /media/usb
  1591. rm -rf /media/usb
  1592. fi
  1593. echo ''
  1594. echo $OWNCLOUD_COMPLETION_MSG1
  1595. echo $OWNCLOUD_COMPLETION_MSG2
  1596. exit 0
  1597. fi
  1598. }
  1599. function install_xmpp {
  1600. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1601. return
  1602. fi
  1603. if grep -Fxq "install_xmpp" $COMPLETION_FILE; then
  1604. return
  1605. fi
  1606. apt-get -y --force-yes install prosody
  1607. if [ ! -f "/etc/ssl/private/xmpp.key" ]; then
  1608. makecert xmpp
  1609. fi
  1610. chown prosody:prosody /etc/ssl/private/xmpp.key
  1611. chown prosody:prosody /etc/ssl/certs/xmpp.*
  1612. cp -a /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/xmpp.cfg.lua
  1613. sed -i 's|/etc/prosody/certs/example.com.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  1614. sed -i 's|/etc/prosody/certs/example.com.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  1615. if ! grep -q "xmpp.dhparam" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  1616. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/conf.avail/xmpp.cfg.lua
  1617. fi
  1618. sed -i "s/example.com/$DOMAIN_NAME/g" /etc/prosody/conf.avail/xmpp.cfg.lua
  1619. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/conf.avail/xmpp.cfg.lua
  1620. if ! grep -q "modules_enabled" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  1621. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1622. echo 'modules_enabled = {' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1623. echo ' "bosh"; -- Enable mod_bosh' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1624. echo ' "tls"; -- Enable mod_tls' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1625. echo ' "saslauth"; -- Enable mod_saslauth' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1626. echo '}' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1627. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1628. echo 'c2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1629. echo 's2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1630. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1631. fi
  1632. ln -sf /etc/prosody/conf.avail/xmpp.cfg.lua /etc/prosody/conf.d/xmpp.cfg.lua
  1633. sed -i 's|/etc/prosody/certs/localhost.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/prosody.cfg.lua
  1634. sed -i 's|/etc/prosody/certs/localhost.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/prosody.cfg.lua
  1635. if ! grep -q "xmpp.dhparam" /etc/prosody/prosody.cfg.lua; then
  1636. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/prosody.cfg.lua
  1637. fi
  1638. sed -i 's/c2s_require_encryption = false/c2s_require_encryption = true/g' /etc/prosody/prosody.cfg.lua
  1639. if ! grep -q "s2s_require_encryption" /etc/prosody/prosody.cfg.lua; then
  1640. sed -i '/c2s_require_encryption/a\s2s_require_encryption = true' /etc/prosody/prosody.cfg.lua
  1641. fi
  1642. if ! grep -q "allow_unencrypted_plain_auth" /etc/prosody/prosody.cfg.lua; then
  1643. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1644. fi
  1645. sed -i 's/--"bosh";/"bosh";/g' /etc/prosody/prosody.cfg.lua
  1646. sed -i 's/authentication = "internal_plain"/authentication = "internal_hashed"/g' /etc/prosody/prosody.cfg.lua
  1647. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/prosody.cfg.lua
  1648. sed -i 's/example.com/$DOMAIN_NAME/g' /etc/prosody/prosody.cfg.lua
  1649. service prosody restart
  1650. touch /home/$MY_USERNAME/README
  1651. if ! grep -q "Your XMPP password is" /home/$MY_USERNAME/README; then
  1652. XMPP_PASSWORD=$(openssl rand -base64 8)
  1653. prosodyctl register $MY_USERNAME $DOMAIN_NAME $XMPP_PASSWORD
  1654. echo "Your XMPP password is: $XMPP_PASSWORD" >> /home/$MY_USERNAME/README
  1655. echo 'You can change it with: ' >> /home/$MY_USERNAME/README
  1656. echo '' >> /home/$MY_USERNAME/README
  1657. echo " prosodyctl passwd $MY_USERNAME@$DOMAIN_NAME" >> /home/$MY_USERNAME/README
  1658. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  1659. fi
  1660. echo 'install_xmpp' >> $COMPLETION_FILE
  1661. }
  1662. function install_irc_server {
  1663. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1664. return
  1665. fi
  1666. if grep -Fxq "install_irc_server" $COMPLETION_FILE; then
  1667. return
  1668. fi
  1669. apt-get -y --force-yes install ngircd
  1670. if [ ! "/etc/ssl/private/ngircd.key" ]; then
  1671. makecert ngircd
  1672. fi
  1673. echo '**************************************************' > /etc/ngircd/motd
  1674. echo '* F R E E D O M B O N E I R C *' >> /etc/ngircd/motd
  1675. echo '* *' >> /etc/ngircd/motd
  1676. echo '* Freedom in the Cloud *' >> /etc/ngircd/motd
  1677. echo '**************************************************' >> /etc/ngircd/motd
  1678. sed -i 's|MotdFile = /etc/ngircd/ngircd.motd|MotdFile = /etc/ngircd/motd|g' /etc/ngircd/ngircd.conf
  1679. sed -i "s/irc@irc.example.com/$MY_USERNAME@$DOMAIN_NAME/g" /etc/ngircd/ngircd.conf
  1680. sed -i "s/irc.example.net/$DOMAIN_NAME/g" /etc/ngircd/ngircd.conf
  1681. sed -i "s|Yet another IRC Server running on Debian GNU/Linux|IRC Server of $DOMAIN_NAME|g" /etc/ngircd/ngircd.conf
  1682. sed -i 's/;Password = wealllikedebian/Password =/g' /etc/ngircd/ngircd.conf
  1683. sed -i 's|;CertFile = /etc/ssl/certs/server.crt|CertFile = /etc/ssl/certs/ngircd.crt|g' /etc/ngircd/ngircd.conf
  1684. sed -i 's|;DHFile = /etc/ngircd/dhparams.pem|DHFile = /etc/ssl/certs/ngircd.dhparam|g' /etc/ngircd/ngircd.conf
  1685. sed -i 's|;KeyFile = /etc/ssl/private/server.key|KeyFile = /etc/ssl/private/ngircd.key|g' /etc/ngircd/ngircd.conf
  1686. sed -i 's/;Ports = 6697, 9999/Ports = 6697, 9999/g' /etc/ngircd/ngircd.conf
  1687. sed -i 's/;Name = #ngircd/Name = #freedombone/g' /etc/ngircd/ngircd.conf
  1688. sed -i 's/;Topic = Our ngircd testing channel/Topic = Freedombone chat channel/g' /etc/ngircd/ngircd.conf
  1689. sed -i 's/;MaxUsers = 23/MaxUsers = 23/g' /etc/ngircd/ngircd.conf
  1690. sed -i 's|;KeyFile = /etc/ngircd/#chan.key|KeyFile = /etc/ngircd/#freedombone.key|g' /etc/ngircd/ngircd.conf
  1691. sed -i 's/;CloakHost = cloaked.host/CloakHost = cloaked.host/g' /etc/ngircd/ngircd.conf
  1692. IRC_SALT=$(openssl rand -base64 32)
  1693. IRC_OPERATOR_PASSWORD=$(openssl rand -base64 8)
  1694. sed -i "s|;CloakHostSalt = abcdefghijklmnopqrstuvwxyz|CloakHostSalt = $IRC_SALT|g" /etc/ngircd/ngircd.conf
  1695. sed -i 's/;ConnectIPv4 = yes/ConnectIPv4 = yes/g' /etc/ngircd/ngircd.conf
  1696. sed -i 's/;MorePrivacy = no/MorePrivacy = yes/g' /etc/ngircd/ngircd.conf
  1697. sed -i 's/;RequireAuthPing = no/RequireAuthPing = no/g' /etc/ngircd/ngircd.conf
  1698. sed -i "s/;Name = TheOper/Name = $MY_USERNAME/g" /etc/ngircd/ngircd.conf
  1699. sed -i "s/;Password = ThePwd/Password = $IRC_OPERATOR_PASSWORD/g" /etc/ngircd/ngircd.conf
  1700. service ngircd restart
  1701. echo 'install_irc_server' >> $COMPLETION_FILE
  1702. }
  1703. function install_wiki {
  1704. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1705. return
  1706. fi
  1707. if grep -Fxq "install_wiki" $COMPLETION_FILE; then
  1708. return
  1709. fi
  1710. # if this is exclusively a writer setup
  1711. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  1712. WIKI_DOMAIN_NAME=$DOMAIN_NAME
  1713. WIKI_FREEDNS_SUBDOMAIN_CODE=$FREEDNS_SUBDOMAIN_CODE
  1714. fi
  1715. if [ ! $WIKI_DOMAIN_NAME ]; then
  1716. return
  1717. fi
  1718. if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  1719. if [ ! $SYSTEM_TYPE ]; then
  1720. return
  1721. fi
  1722. fi
  1723. apt-get -y --force-yes install php5 php5-gd php-xml-parser php5-intl wget
  1724. apt-get -y --force-yes install php5-sqlite php5-mysql smbclient curl libcurl3 php5-curl bzip2
  1725. if [ ! -d /var/www/$WIKI_DOMAIN_NAME ]; then
  1726. mkdir /var/www/$WIKI_DOMAIN_NAME
  1727. mkdir /var/www/$WIKI_DOMAIN_NAME/htdocs
  1728. fi
  1729. if [ ! -f /etc/ssl/private/$WIKI_DOMAIN_NAME.key ]; then
  1730. makecert $WIKI_DOMAIN_NAME
  1731. fi
  1732. # download the archive
  1733. cd $INSTALL_DIR
  1734. if [ ! -f $INSTALL_DIR/$WIKI_ARCHIVE ]; then
  1735. wget $WIKI_DOWNLOAD
  1736. fi
  1737. if [ ! -f $INSTALL_DIR/$WIKI_ARCHIVE ]; then
  1738. echo 'Dokuwiki could not be downloaded. Check that it exists at '
  1739. echo $WIKI_DOWNLOAD
  1740. echo 'And if neccessary update the version number and hash within this script'
  1741. exit 18
  1742. fi
  1743. # Check that the hash is correct
  1744. CHECKSUM=$(sha256sum $WIKI_ARCHIVE | awk -F ' ' '{print $1}')
  1745. if [[ $CHECKSUM != $WIKI_HASH ]]; then
  1746. echo 'The sha256 hash of the Dokuwiki download is incorrect. Possibly the file may have been tampered with. Check the hash on the Dokuwiki web site.'
  1747. exit 21
  1748. fi
  1749. tar -xzvf $WIKI_ARCHIVE
  1750. rm -rf /var/www/$WIKI_DOMAIN_NAME/htdocs
  1751. mv dokuwiki /var/www/$WIKI_DOMAIN_NAME/htdocs
  1752. chmod -R 755 /var/www/$WIKI_DOMAIN_NAME/htdocs
  1753. chown -R www-data:www-data /var/www/$WIKI_DOMAIN_NAME/htdocs
  1754. if ! grep -q "video/ogg" /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf; then
  1755. echo 'ogv video/ogg' >> /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf
  1756. echo 'mp4 video/mp4' >> /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf
  1757. echo 'webm video/webm' >> /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf
  1758. fi
  1759. configure_php
  1760. echo 'server {' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1761. echo ' listen 80;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1762. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1763. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1764. echo " error_log /var/www/$WIKI_DOMAIN_NAME/error.log;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1765. echo ' index index.html index.htm index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1766. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1767. echo ' # Uncomment this if you need to redirect HTTP to HTTPS' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1768. echo ' #rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1769. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1770. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1771. echo ' try_files $uri $uri/ /index.html;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1772. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1773. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1774. echo ' location ~ \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1775. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1776. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1777. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1778. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1779. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1780. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1781. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1782. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1783. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1784. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1785. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1786. echo " error_log /var/www/$WIKI_DOMAIN_NAME/error_ssl.log;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1787. echo ' index index.html index.htm index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1788. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1789. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1790. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1791. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1792. echo ' ssl on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1793. echo " ssl_certificate /etc/ssl/certs/$WIKI_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1794. echo " ssl_certificate_key /etc/ssl/private/$WIKI_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1795. echo " ssl_dhparam /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1796. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1797. echo ' ssl_session_timeout 5m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1798. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1799. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1800. echo ' ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # not possible to do exclusive' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1801. echo " ssl_ciphers 'EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA';" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1802. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1803. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1804. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1805. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1806. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1807. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1808. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1809. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1810. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1811. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1812. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1813. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1814. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1815. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1816. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1817. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1818. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1819. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1820. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1821. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1822. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1823. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1824. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1825. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1826. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1827. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1828. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1829. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1830. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1831. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1832. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1833. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1834. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1835. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1836. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1837. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1838. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1839. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1840. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1841. echo " try_files $uri =404;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1842. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1843. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1844. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1845. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1846. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1847. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1848. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1849. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1850. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1851. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1852. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1853. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1854. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1855. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1856. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1857. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1858. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1859. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1860. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1861. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1862. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1863. nginx_ensite $WIKI_DOMAIN_NAME
  1864. service php5-fpm restart
  1865. service nginx restart
  1866. # update the dynamic DNS
  1867. if [[ $WIKI_FREEDNS_SUBDOMAIN_CODE != $FREEDNS_SUBDOMAIN_CODE ]]; then
  1868. if ! grep -q "$WIKI_DOMAIN_NAME" /usr/bin/dynamicdns; then
  1869. echo "# $WIKI_DOMAIN_NAME" >> /usr/bin/dynamicdns
  1870. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$WIKI_FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  1871. fi
  1872. fi
  1873. # add some post-install instructions
  1874. if ! grep -q "Once you have set up the wiki" /home/$MY_USERNAME/README; then
  1875. echo '' >> /home/$MY_USERNAME/README
  1876. echo 'Once you have set up the wiki then remove the install file:' >> /home/$MY_USERNAME/README
  1877. echo '' >> /home/$MY_USERNAME/README
  1878. echo " rm /var/www/$WIKI_DOMAIN_NAME/htdocs/install.php" >> /home/$MY_USERNAME/README
  1879. fi
  1880. echo 'install_wiki' >> $COMPLETION_FILE
  1881. }
  1882. function install_blog {
  1883. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "email" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  1884. return
  1885. fi
  1886. if grep -Fxq "install_blog" $COMPLETION_FILE; then
  1887. return
  1888. fi
  1889. cd $INSTALL_DIR
  1890. rm -f latest
  1891. wget $WIKI_MNML_BLOG_ADDON
  1892. if [ ! -f "$INSTALL_DIR/latest" ]; then
  1893. echo 'Dokuwiki mnml-blog addon could not be downloaded. Check the Dokuwiki web site and alter WIKI_MNML_BLOG_ADDON at the top of this script as needed.'
  1894. exit 21
  1895. fi
  1896. mv latest $WIKI_MNML_BLOG_ADDON_ARCHIVE
  1897. # Check that the hash is correct
  1898. CHECKSUM=$(sha256sum $WIKI_MNML_BLOG_ADDON_ARCHIVE | awk -F ' ' '{print $1}')
  1899. if [[ $CHECKSUM != $WIKI_MNML_BLOG_ADDON_HASH ]]; then
  1900. echo 'The sha256 hash of the mnml-blog download is incorrect. Possibly the file may have been tampered with. Check the hash on the Dokuwiki mnmlblog web site and alter WIKI_MNML_BLOG_ADDON_HASH if needed.'
  1901. exit 22
  1902. fi
  1903. tar -xzvf $WIKI_MNML_BLOG_ADDON_ARCHIVE
  1904. cp mnml-blog /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/tpl/
  1905. cp -r /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/tpl/mnml-blog/blogtng-tpl/* /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/plugins/blogtng/tpl/default/
  1906. echo 'install_blog' >> $COMPLETION_FILE
  1907. }
  1908. function install_final {
  1909. if grep -Fxq "install_final" $COMPLETION_FILE; then
  1910. return
  1911. fi
  1912. # unmount any attached usb drive
  1913. if [ -d /media/usb ]; then
  1914. umount /media/usb
  1915. rm -rf /media/usb
  1916. fi
  1917. apt-get -y --force-yes autoremove
  1918. echo 'install_final' >> $COMPLETION_FILE
  1919. echo ''
  1920. echo ' *** Freedombone installation is complete. Rebooting... ***'
  1921. echo ''
  1922. reboot
  1923. }
  1924. argument_checks
  1925. configure_firewall
  1926. configure_firewall_for_ssh
  1927. configure_firewall_for_dns
  1928. configure_firewall_for_ftp
  1929. configure_firewall_for_web_access
  1930. remove_proprietary_repos
  1931. change_debian_repos
  1932. enable_backports
  1933. configure_dns
  1934. initial_setup
  1935. install_editor
  1936. change_login_message
  1937. update_the_kernel
  1938. enable_zram
  1939. random_number_generator
  1940. set_your_domain_name
  1941. time_synchronisation
  1942. configure_internet_protocol
  1943. configure_ssh
  1944. search_for_attached_usb_drive
  1945. regenerate_ssh_keys
  1946. script_to_make_self_signed_certificates
  1947. configure_email
  1948. #spam_filtering
  1949. configure_imap
  1950. configure_gpg
  1951. email_client
  1952. configure_firewall_for_email
  1953. folders_for_mailing_lists
  1954. folders_for_email_addresses
  1955. dynamic_dns_freedns
  1956. #create_private_mailing_list
  1957. import_email
  1958. install_web_server
  1959. configure_firewall_for_web_server
  1960. install_owncloud
  1961. install_xmpp
  1962. configure_firewall_for_xmpp
  1963. install_irc_server
  1964. configure_firewall_for_irc
  1965. install_wiki
  1966. #install_blog
  1967. install_final
  1968. echo 'Freedombone installation is complete'
  1969. exit 0