install-freedombone.sh 110KB

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