install-freedombone.sh 78KB

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