install-freedombone.sh 106KB

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