install-freedombone.sh 154KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038
  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_NONMAILBOX="nonmailbox"
  72. VARIANT_SOCIAL="social"
  73. VARIANT_MEDIA="media"
  74. SSH_PORT=2222
  75. KERNEL_VERSION="v3.15.10-bone7"
  76. USE_HWRNG="yes"
  77. INSTALLED_WITHIN_DOCKER="no"
  78. # If you want to run an encrypted mailing list specify its name here.
  79. # There should be no spaces in the name
  80. PRIVATE_MAILING_LIST=
  81. # Domain name or freedns subdomain for mediagoblin installation
  82. MEDIAGOBLIN_DOMAIN_NAME=
  83. MEDIAGOBLIN_FREEDNS_SUBDOMAIN_CODE=
  84. MEDIAGOBLIN_REPO=""
  85. MEDIAGOBLIN_ADMIN_PASSWORD=
  86. # Domain name or freedns subdomain for microblog installation
  87. MICROBLOG_DOMAIN_NAME=
  88. MICROBLOG_FREEDNS_SUBDOMAIN_CODE=
  89. MICROBLOG_REPO="git://gitorious.org/social/mainline.git"
  90. MICROBLOG_ADMIN_PASSWORD=
  91. # Domain name or redmatrix installation
  92. REDMATRIX_DOMAIN_NAME=
  93. REDMATRIX_FREEDNS_SUBDOMAIN_CODE=
  94. REDMATRIX_REPO="https://github.com/friendica/red.git"
  95. REDMATRIX_ADDONS_REPO="https://github.com/friendica/red-addons.git"
  96. REDMATRIX_ADMIN_PASSWORD=
  97. # Domain name or freedns subdomain for Owncloud installation
  98. OWNCLOUD_DOMAIN_NAME=
  99. # Freedns dynamic dns code for owncloud
  100. OWNCLOUD_FREEDNS_SUBDOMAIN_CODE=
  101. OWNCLOUD_ARCHIVE="owncloud-7.0.2.tar.bz2"
  102. OWNCLOUD_DOWNLOAD="https://download.owncloud.org/community/$OWNCLOUD_ARCHIVE"
  103. OWNCLOUD_HASH="ea07124a1b9632aa5227240d655e4d84967fb6dd49e4a16d3207d6179d031a3a"
  104. # Domain name or freedns subdomain for your wiki
  105. WIKI_FREEDNS_SUBDOMAIN_CODE=
  106. WIKI_DOMAIN_NAME=
  107. WIKI_ARCHIVE="dokuwiki-stable.tgz"
  108. WIKI_DOWNLOAD="http://download.dokuwiki.org/src/dokuwiki/$WIKI_ARCHIVE"
  109. WIKI_HASH="a0e79986b87b2744421ce3c33b43a21f296deadd81b1789c25fa4bb095e8e470"
  110. # see https://www.dokuwiki.org/template:mnml-blog
  111. # https://andreashaerter.com/tmp/downloads/dokuwiki-template-mnml-blog/CHECKSUMS.asc
  112. WIKI_MNML_BLOG_ADDON_ARCHIVE="mnml-blog.tar.gz"
  113. WIKI_MNML_BLOG_ADDON="https://andreashaerter.com/downloads/dokuwiki-template-mnml-blog/latest"
  114. WIKI_MNML_BLOG_ADDON_HASH="428c280d09ee14326fef5cd6f6772ecfcd532f7b6779cd992ff79a97381cf39f"
  115. # see https://www.dokuwiki.org/plugin:blogtng
  116. WIKI_BLOGTNG_ADDON_NAME="dokufreaks-plugin-blogtng-93a3fec"
  117. WIKI_BLOGTNG_ADDON_ARCHIVE="$WIKI_BLOGTNG_ADDON_NAME.zip"
  118. WIKI_BLOGTNG_ADDON="https://github.com/dokufreaks/plugin-blogtng/zipball/master"
  119. WIKI_BLOGTNG_ADDON_HASH="212b3ad918fdc92b2d49ef5d36bc9e086eab27532931ba6b87e05f35fd402a27"
  120. # see https://www.dokuwiki.org/plugin:sqlite
  121. WIKI_SQLITE_ADDON_NAME="cosmocode-sqlite-7be4003"
  122. WIKI_SQLITE_ADDON_ARCHIVE="$WIKI_SQLITE_ADDON_NAME.tar.gz"
  123. WIKI_SQLITE_ADDON="https://github.com/cosmocode/sqlite/tarball/master"
  124. WIKI_SQLITE_ADDON_HASH="930335e647c7e62f3068689c256ee169fad2426b64f8360685d391ecb5eeda0c"
  125. GPG_KEYSERVER="hkp://keys.gnupg.net"
  126. # optionally you can provide your exported GPG key pair here
  127. # Note that the private key file will be deleted after use
  128. # If these are unspecified then a new GPG key will be created
  129. MY_GPG_PUBLIC_KEY=
  130. MY_GPG_PRIVATE_KEY=
  131. # If you have existing mail within a Maildir
  132. # you can specify the directory here and the files
  133. # will be imported
  134. IMPORT_MAILDIR=
  135. # The Debian package repository to use.
  136. DEBIAN_REPO="ftp.de.debian.org"
  137. DEBIAN_VERSION="jessie"
  138. # Directory where source code is downloaded and compiled
  139. INSTALL_DIR=$HOME/build
  140. # device name for an attached usb drive
  141. USB_DRIVE=/dev/sda1
  142. # memory limit for php in MB
  143. MAX_PHP_MEMORY=32
  144. # default MariaDB password
  145. MARIADB_PASSWORD=
  146. #list of encryption protocols
  147. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  148. # list of ciphers to use
  149. 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"
  150. export DEBIAN_FRONTEND=noninteractive
  151. # File which keeps track of what has already been installed
  152. COMPLETION_FILE=$HOME/freedombone-completed.txt
  153. if [ ! -f $COMPLETION_FILE ]; then
  154. touch $COMPLETION_FILE
  155. fi
  156. function show_help {
  157. echo ''
  158. echo './install-freedombone.sh [domain] [username] [subdomain code] [system type]'
  159. echo ''
  160. echo 'domain'
  161. echo '------'
  162. echo 'This is your domain name or freedns subdomain.'
  163. echo ''
  164. echo 'username'
  165. echo '--------'
  166. echo ''
  167. echo 'This will be your username on the system. It should be all'
  168. echo 'lower case and contain no spaces'
  169. echo ''
  170. echo 'subdomain code'
  171. echo '--------------'
  172. echo 'This is the freedns dynamic DNS code for your subdomain.'
  173. echo "To find it from https://freedns.afraid.org select 'Dynamic DNS',"
  174. echo "then 'quick cron example' and copy the code located between "
  175. echo "'?' and '=='."
  176. echo ''
  177. echo 'system type'
  178. echo '-----------'
  179. echo 'This can either be blank if you wish to install the full system,'
  180. echo "or for more specialised variants you can specify '$VARIANT_MAILBOX', '$VARIANT_CLOUD',"
  181. echo "'$VARIANT_CHAT', '$VARIANT_SOCIAL', '$VARIANT_MEDIA' or '$VARIANT_WRITER'."
  182. echo "If you wish to install everything except email then use the '$VARIANT_NONMAILBOX' variaint."
  183. }
  184. function argument_checks {
  185. if [ ! -d /home/$MY_USERNAME ]; then
  186. echo "There is no user '$MY_USERNAME' on the system. Use 'adduser $MY_USERNAME' to create the user."
  187. exit 1
  188. fi
  189. if [ ! $DOMAIN_NAME ]; then
  190. show_help
  191. exit 2
  192. fi
  193. if [ ! $MY_USERNAME ]; then
  194. show_help
  195. exit 3
  196. fi
  197. if [ ! $FREEDNS_SUBDOMAIN_CODE ]; then
  198. show_help
  199. exit 4
  200. fi
  201. if [ $SYSTEM_TYPE ]; then
  202. if [[ $SYSTEM_TYPE != $VARIANT_WRITER && $SYSTEM_TYPE != $VARIANT_CLOUD && $SYSTEM_TYPE != $VARIANT_CHAT && $SYSTEM_TYPE != $VARIANT_MAILBOX && $SYSTEM_TYPE != $VARIANT_NONMAILBOX && $SYSTEM_TYPE != $VARIANT_SOCIAL && $SYSTEM_TYPE != $VARIANT_MEDIA ]]; then
  203. echo "'$SYSTEM_TYPE' is an unrecognised Freedombone variant."
  204. exit 30
  205. fi
  206. fi
  207. }
  208. function change_login_message {
  209. if grep -Fxq "change_login_message" $COMPLETION_FILE; then
  210. return
  211. fi
  212. echo '' > /etc/motd
  213. echo ".---. . . " >> /etc/motd
  214. echo "| | | " >> /etc/motd
  215. echo "|--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. " >> /etc/motd
  216. echo "| | (.-' (.-' ( | ( )| | | | )( )| | (.-' " >> /etc/motd
  217. echo "' ' --' --' -' - -' ' ' -' -' -' ' - --'" >> /etc/motd
  218. if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  219. echo ' . . . ' >> /etc/motd
  220. echo ' |\ /| | o ' >> /etc/motd
  221. echo " | \/ | .-. .-.| . .-. " >> /etc/motd
  222. echo " | |(.-'( | | ( ) " >> /etc/motd
  223. echo " ' ' --' -' --' - -' - " >> /etc/motd
  224. fi
  225. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  226. echo ' . . . . . ' >> /etc/motd
  227. echo ' \ \ / / o _|_ ' >> /etc/motd
  228. echo ' \ \ /.--.. | .-. .--.' >> /etc/motd
  229. echo " \/ \/ | | | (.-' | " >> /etc/motd
  230. echo " ' ' ' -' - -' --'' " >> /etc/motd
  231. fi
  232. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  233. echo ' .--.. . ' >> /etc/motd
  234. echo ' : | | ' >> /etc/motd
  235. echo ' | | .-. . . .-.| ' >> /etc/motd
  236. echo ' : |( )| |( | ' >> /etc/motd
  237. echo " --' - -' -- - -' -" >> /etc/motd
  238. fi
  239. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  240. echo ' .--.. . ' >> /etc/motd
  241. echo ' : | _|_ ' >> /etc/motd
  242. echo ' | |--. .-. | ' >> /etc/motd
  243. echo ' : | |( ) | ' >> /etc/motd
  244. echo " --'' - -' - -' " >> /etc/motd
  245. fi
  246. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  247. echo ' .-. . ' >> /etc/motd
  248. echo ' ( ) o | ' >> /etc/motd
  249. echo ' -. .-. .-. . .-. | ' >> /etc/motd
  250. echo ' ( )( )( | ( ) | ' >> /etc/motd
  251. echo " -' -' -'-' - -' - - " >> /etc/motd
  252. fi
  253. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  254. echo ' . . . . ' >> /etc/motd
  255. echo ' |\ /| o | | ' >> /etc/motd
  256. echo ' | \/ | .-. . | |.-. .-.-. ,- ' >> /etc/motd
  257. echo ' | |( ) | | | )( ) : ' >> /etc/motd
  258. echo ' ' ' -' --' - -' -' -'-' - ' >> /etc/motd
  259. fi
  260. echo '' >> /etc/motd
  261. echo ' Freedom in the Cloud' >> /etc/motd
  262. echo '' >> /etc/motd
  263. echo 'change_login_message' >> $COMPLETION_FILE
  264. }
  265. function search_for_attached_usb_drive {
  266. # If a USB drive is attached then search for email,
  267. # gpg, ssh keys and emacs configuration
  268. if grep -Fxq "search_for_attached_usb_drive" $COMPLETION_FILE; then
  269. return
  270. fi
  271. if [ -b $USB_DRIVE ]; then
  272. if [ ! -d /media/usb ]; then
  273. echo 'Mounting USB drive'
  274. mkdir /media/usb
  275. mount $USB_DRIVE /media/usb
  276. fi
  277. if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  278. if [ -d /media/usb/Maildir ]; then
  279. echo 'Maildir found on USB drive'
  280. IMPORT_MAILDIR=/media/usb/Maildir
  281. fi
  282. if [ -d /media/usb/.gnupg ]; then
  283. echo 'Importing GPG keyring'
  284. cp -r /media/usb/.gnupg /home/$MY_USERNAME
  285. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  286. if [ -f /home/$MY_USERNAME/.gnupg/secring.gpg ]; then
  287. shred -zu /media/usb/.gnupg/secring.gpg
  288. shred -zu /media/usb/.gnupg/random_seed
  289. shred -zu /media/usb/.gnupg/trustdb.gpg
  290. rm -rf /media/usb/.gnupg
  291. else
  292. echo 'GPG files did not copy'
  293. exit 7
  294. fi
  295. fi
  296. if [ -f /media/usb/private_key.gpg ]; then
  297. echo 'GPG private key found on USB drive'
  298. MY_GPG_PRIVATE_KEY=/media/usb/private_key.gpg
  299. fi
  300. if [ -f /media/usb/public_key.gpg ]; then
  301. echo 'GPG public key found on USB drive'
  302. MY_GPG_PUBLIC_KEY=/media/usb/public_key.gpg
  303. fi
  304. fi
  305. if [ -d /media/usb/.ssh ]; then
  306. echo 'Importing ssh keys'
  307. cp -r /media/usb/.ssh /home/$MY_USERNAME
  308. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.ssh
  309. # for security delete the ssh keys from the usb drive
  310. if [ -f /home/$MY_USERNAME/.ssh/id_rsa ]; then
  311. shred -zu /media/usb/.ssh/id_rsa
  312. shred -zu /media/usb/.ssh/id_rsa.pub
  313. shred -zu /media/usb/.ssh/known_hosts
  314. rm -rf /media/usb/.ssh
  315. else
  316. echo 'ssh files did not copy'
  317. exit 8
  318. fi
  319. fi
  320. if [ -f /media/usb/.emacs ]; then
  321. echo 'Importing .emacs file'
  322. cp -f /media/usb/.emacs /home/$MY_USERNAME/.emacs
  323. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs
  324. fi
  325. if [ -d /media/usb/.emacs.d ]; then
  326. echo 'Importing .emacs.d directory'
  327. cp -r /media/usb/.emacs.d /home/$MY_USERNAME
  328. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.emacs.d
  329. fi
  330. if [ -d /media/usb/personal ]; then
  331. echo 'Importing personal directory'
  332. cp -r /media/usb/personal /home/$MY_USERNAME
  333. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/personal
  334. fi
  335. else
  336. if [ -d /media/usb ]; then
  337. umount /media/usb
  338. rm -rf /media/usb
  339. fi
  340. echo 'No USB drive attached'
  341. fi
  342. echo 'search_for_attached_usb_drive' >> $COMPLETION_FILE
  343. }
  344. function remove_proprietary_repos {
  345. if grep -Fxq "remove_proprietary_repos" $COMPLETION_FILE; then
  346. return
  347. fi
  348. sed -i 's/ non-free//g' /etc/apt/sources.list
  349. echo 'remove_proprietary_repos' >> $COMPLETION_FILE
  350. }
  351. function change_debian_repos {
  352. if grep -Fxq "change_debian_repos" $COMPLETION_FILE; then
  353. return
  354. fi
  355. rm -rf /var/lib/apt/lists/*
  356. apt-get clean
  357. sed -i "s/ftp.us.debian.org/$DEBIAN_REPO/g" /etc/apt/sources.list
  358. # ensure that there is a security repo
  359. if ! grep -q "security" /etc/apt/sources.list; then
  360. if grep -q "jessie" /etc/apt/sources.list; then
  361. echo "deb http://security.debian.org/ jessie/updates main contrib" >> /etc/apt/sources.list
  362. echo "#deb-src http://security.debian.org/ jessie/updates main contrib" >> /etc/apt/sources.list
  363. else
  364. if grep -q "wheezy" /etc/apt/sources.list; then
  365. echo "deb http://security.debian.org/ wheezy/updates main contrib" >> /etc/apt/sources.list
  366. echo "#deb-src http://security.debian.org/ wheezy/updates main contrib" >> /etc/apt/sources.list
  367. fi
  368. fi
  369. fi
  370. apt-get update
  371. apt-get -y --force-yes install apt-transport-https
  372. echo 'change_debian_repos' >> $COMPLETION_FILE
  373. }
  374. function initial_setup {
  375. if grep -Fxq "initial_setup" $COMPLETION_FILE; then
  376. return
  377. fi
  378. apt-get -y remove --purge apache*
  379. apt-get -y dist-upgrade
  380. apt-get -y install ca-certificates emacs24
  381. echo 'initial_setup' >> $COMPLETION_FILE
  382. }
  383. function install_editor {
  384. if grep -Fxq "install_editor" $COMPLETION_FILE; then
  385. return
  386. fi
  387. update-alternatives --set editor /usr/bin/emacs24
  388. echo 'install_editor' >> $COMPLETION_FILE
  389. }
  390. function enable_backports {
  391. if grep -Fxq "enable_backports" $COMPLETION_FILE; then
  392. return
  393. fi
  394. if ! grep -Fxq "deb http://$DEBIAN_REPO/debian jessie-backports main" /etc/apt/sources.list; then
  395. echo "deb http://$DEBIAN_REPO/debian jessie-backports main" >> /etc/apt/sources.list
  396. fi
  397. echo 'enable_backports' >> $COMPLETION_FILE
  398. }
  399. function update_the_kernel {
  400. if grep -Fxq "update_the_kernel" $COMPLETION_FILE; then
  401. return
  402. fi
  403. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  404. return
  405. fi
  406. cd /opt/scripts/tools
  407. ./update_kernel.sh --kernel $KERNEL_VERSION
  408. echo 'update_the_kernel' >> $COMPLETION_FILE
  409. }
  410. function enable_zram {
  411. if grep -Fxq "enable_zram" $COMPLETION_FILE; then
  412. return
  413. fi
  414. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  415. return
  416. fi
  417. if ! grep -q "options zram num_devices=1" /etc/modprobe.d/zram.conf; then
  418. echo 'options zram num_devices=1' >> /etc/modprobe.d/zram.conf
  419. fi
  420. echo '#!/bin/bash' > /etc/init.d/zram
  421. echo '### BEGIN INIT INFO' >> /etc/init.d/zram
  422. echo '# Provides: zram' >> /etc/init.d/zram
  423. echo '# Required-Start:' >> /etc/init.d/zram
  424. echo '# Required-Stop:' >> /etc/init.d/zram
  425. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/zram
  426. echo '# Default-Stop: 0 1 6' >> /etc/init.d/zram
  427. echo '# Short-Description: Increased Performance In Linux With zRam (Virtual Swap Compressed in RAM)' >> /etc/init.d/zram
  428. echo '# Description: Adapted from systemd scripts at https://github.com/mystilleef/FedoraZram' >> /etc/init.d/zram
  429. echo '### END INIT INFO' >> /etc/init.d/zram
  430. echo 'start() {' >> /etc/init.d/zram
  431. echo ' # get the number of CPUs' >> /etc/init.d/zram
  432. echo ' num_cpus=$(grep -c processor /proc/cpuinfo)' >> /etc/init.d/zram
  433. echo ' # if something goes wrong, assume we have 1' >> /etc/init.d/zram
  434. echo ' [ "$num_cpus" != 0 ] || num_cpus=1' >> /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 ' # get the amount of memory in the machine' >> /etc/init.d/zram
  438. echo ' mem_total_kb=$(grep MemTotal /proc/meminfo | grep -E --only-matching "[[:digit:]]+")' >> /etc/init.d/zram
  439. echo ' mem_total=$((mem_total_kb * 1024))' >> /etc/init.d/zram
  440. echo ' # load dependency modules' >> /etc/init.d/zram
  441. echo ' modprobe zram num_devices=$num_cpus' >> /etc/init.d/zram
  442. echo ' # initialize the devices' >> /etc/init.d/zram
  443. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  444. echo ' echo $((mem_total / num_cpus)) > /sys/block/zram$i/disksize' >> /etc/init.d/zram
  445. echo ' done' >> /etc/init.d/zram
  446. echo ' # Creating swap filesystems' >> /etc/init.d/zram
  447. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  448. echo ' mkswap /dev/zram$i' >> /etc/init.d/zram
  449. echo ' done' >> /etc/init.d/zram
  450. echo ' # Switch the swaps on' >> /etc/init.d/zram
  451. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  452. echo ' swapon -p 100 /dev/zram$i' >> /etc/init.d/zram
  453. echo ' done' >> /etc/init.d/zram
  454. echo '}' >> /etc/init.d/zram
  455. echo 'stop() {' >> /etc/init.d/zram
  456. echo ' # get the number of CPUs' >> /etc/init.d/zram
  457. echo ' num_cpus=$(grep -c processor /proc/cpuinfo)' >> /etc/init.d/zram
  458. echo ' # set decremented number of CPUs' >> /etc/init.d/zram
  459. echo ' decr_num_cpus=$((num_cpus - 1))' >> /etc/init.d/zram
  460. echo ' # Switching off swap' >> /etc/init.d/zram
  461. echo ' for i in $(seq 0 $decr_num_cpus); do' >> /etc/init.d/zram
  462. echo ' if [ "$(grep /dev/zram$i /proc/swaps)" != "" ]; then' >> /etc/init.d/zram
  463. echo ' swapoff /dev/zram$i' >> /etc/init.d/zram
  464. echo ' sleep 1' >> /etc/init.d/zram
  465. echo ' fi' >> /etc/init.d/zram
  466. echo ' done' >> /etc/init.d/zram
  467. echo ' sleep 1' >> /etc/init.d/zram
  468. echo ' rmmod zram' >> /etc/init.d/zram
  469. echo '}' >> /etc/init.d/zram
  470. echo 'case "$1" in' >> /etc/init.d/zram
  471. echo ' start)' >> /etc/init.d/zram
  472. echo ' start' >> /etc/init.d/zram
  473. echo ' ;;' >> /etc/init.d/zram
  474. echo ' stop)' >> /etc/init.d/zram
  475. echo ' stop' >> /etc/init.d/zram
  476. echo ' ;;' >> /etc/init.d/zram
  477. echo ' restart)' >> /etc/init.d/zram
  478. echo ' stop' >> /etc/init.d/zram
  479. echo ' sleep 3' >> /etc/init.d/zram
  480. echo ' start' >> /etc/init.d/zram
  481. echo ' ;;' >> /etc/init.d/zram
  482. echo ' *)' >> /etc/init.d/zram
  483. echo ' echo "Usage: $0 {start|stop|restart}"' >> /etc/init.d/zram
  484. echo ' RETVAL=1' >> /etc/init.d/zram
  485. echo 'esac' >> /etc/init.d/zram
  486. echo 'exit $RETVAL' >> /etc/init.d/zram
  487. chmod +x /etc/init.d/zram
  488. update-rc.d zram defaults
  489. echo 'enable_zram' >> $COMPLETION_FILE
  490. }
  491. function random_number_generator {
  492. if grep -Fxq "random_number_generator" $COMPLETION_FILE; then
  493. return
  494. fi
  495. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  496. # it is assumed that docker uses the random number
  497. # generator of the host system
  498. return
  499. fi
  500. if [[ $USE_HWRNG == "yes" ]]; then
  501. apt-get -y --force-yes install rng-tools
  502. sed -i 's|#HRNGDEVICE=/dev/hwrng|HRNGDEVICE=/dev/hwrng|g' /etc/default/rng-tools
  503. else
  504. apt-get -y --force-yes install haveged
  505. fi
  506. echo 'random_number_generator' >> $COMPLETION_FILE
  507. }
  508. function configure_ssh {
  509. if grep -Fxq "configure_ssh" $COMPLETION_FILE; then
  510. return
  511. fi
  512. sed -i "s/Port 22/Port $SSH_PORT/g" /etc/ssh/sshd_config
  513. sed -i 's/PermitRootLogin without-password/PermitRootLogin no/g' /etc/ssh/sshd_config
  514. sed -i 's/X11Forwarding yes/X11Forwarding no/g' /etc/ssh/sshd_config
  515. sed -i 's/ServerKeyBits 1024/ServerKeyBits 4096/g' /etc/ssh/sshd_config
  516. sed -i 's/TCPKeepAlive yes/TCPKeepAlive no/g' /etc/ssh/sshd_config
  517. sed -i 's|HostKey /etc/ssh/ssh_host_dsa_key|#HostKey /etc/ssh/ssh_host_dsa_key|g' /etc/ssh/sshd_config
  518. sed -i 's|HostKey /etc/ssh/ssh_host_ecdsa_key|#HostKey /etc/ssh/ssh_host_ecdsa_key|g' /etc/ssh/sshd_config
  519. echo 'ClientAliveInterval 60' >> /etc/ssh/sshd_config
  520. echo 'ClientAliveCountMax 3' >> /etc/ssh/sshd_config
  521. echo 'Ciphers aes256-ctr,aes128-ctr' >> /etc/ssh/sshd_config
  522. echo 'MACs hmac-sha2-512,hmac-sha2-256,hmac-ripemd160
  523. KexAlgorithms diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1' >> /etc/ssh/sshd_config
  524. apt-get -y --force-yes install fail2ban
  525. echo 'configure_ssh' >> $COMPLETION_FILE
  526. # Don't reboot if installing within docker
  527. # random numbers will come from the host system
  528. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  529. return
  530. fi
  531. echo ''
  532. echo ''
  533. echo ' *** Rebooting to initialise ssh settings and random number generator ***'
  534. echo ''
  535. echo " *** Reconnect via ssh on port $SSH_PORT, then run this script again ***"
  536. echo ''
  537. reboot
  538. }
  539. function regenerate_ssh_keys {
  540. if grep -Fxq "regenerate_ssh_keys" $COMPLETION_FILE; then
  541. return
  542. fi
  543. rm -f /etc/ssh/ssh_host_*
  544. dpkg-reconfigure openssh-server
  545. service ssh restart
  546. echo 'regenerate_ssh_keys' >> $COMPLETION_FILE
  547. }
  548. function configure_dns {
  549. if grep -Fxq "configure_dns" $COMPLETION_FILE; then
  550. return
  551. fi
  552. echo 'domain localdomain' > /etc/resolv.conf
  553. echo 'search localdomain' >> /etc/resolv.conf
  554. echo 'nameserver 213.73.91.35' >> /etc/resolv.conf
  555. echo 'nameserver 85.214.20.141' >> /etc/resolv.conf
  556. echo 'configure_dns' >> $COMPLETION_FILE
  557. }
  558. function set_your_domain_name {
  559. if grep -Fxq "set_your_domain_name" $COMPLETION_FILE; then
  560. return
  561. fi
  562. echo "$DOMAIN_NAME" > /etc/hostname
  563. hostname $DOMAIN_NAME
  564. sed -i "s/127.0.1.1 arm/127.0.1.1 $DOMAIN_NAME/g" /etc/hosts
  565. echo "127.0.1.1 $DOMAIN_NAME" >> /etc/hosts
  566. echo 'set_your_domain_name' >> $COMPLETION_FILE
  567. }
  568. function time_synchronisation {
  569. if grep -Fxq "time_synchronisation" $COMPLETION_FILE; then
  570. return
  571. fi
  572. apt-get -y --force-yes install tlsdate
  573. apt-get -y remove ntpdate
  574. echo '#!/bin/bash' > /usr/bin/updatedate
  575. echo 'TIMESOURCE=google.com' >> /usr/bin/updatedate
  576. echo 'TIMESOURCE2=www.ptb.de' >> /usr/bin/updatedate
  577. echo 'LOGFILE=/var/log/tlsdate.log' >> /usr/bin/updatedate
  578. echo 'TIMEOUT=5' >> /usr/bin/updatedate
  579. echo "EMAIL=$MY_USERNAME@$DOMAIN_NAME" >> /usr/bin/updatedate
  580. echo '# File which contains the previous date as a number' >> /usr/bin/updatedate
  581. echo 'BEFORE_DATE_FILE=/var/log/tlsdateprevious.txt' >> /usr/bin/updatedate
  582. echo '# File which contains the previous date as a string' >> /usr/bin/updatedate
  583. echo 'BEFORE_FULLDATE_FILE=/var/log/tlsdate.txt' >> /usr/bin/updatedate
  584. echo 'DATE_BEFORE=$(date)' >> /usr/bin/updatedate
  585. echo 'BEFORE=$(date -d "$Y-$M-$D" "+%s")' >> /usr/bin/updatedate
  586. echo 'BACKWARDS_BETWEEN=0' >> /usr/bin/updatedate
  587. echo '# If the date was previously set' >> /usr/bin/updatedate
  588. echo 'if [[ -f "$BEFORE_DATE_FILE" ]]; then' >> /usr/bin/updatedate
  589. echo ' BEFORE_FILE=$(cat $BEFORE_DATE_FILE)' >> /usr/bin/updatedate
  590. echo ' BEFORE_FULLDATE=$(cat $BEFORE_FULLDATE_FILE)' >> /usr/bin/updatedate
  591. echo ' # is the date going backwards?' >> /usr/bin/updatedate
  592. echo ' if (( BEFORE_FILE > BEFORE )); then' >> /usr/bin/updatedate
  593. echo ' echo -n "Date went backwards between tlsdate updates. " >> $LOGFILE' >> /usr/bin/updatedate
  594. echo ' echo -n "$BEFORE_FILE > $BEFORE, " >> $LOGFILE' >> /usr/bin/updatedate
  595. echo ' echo "$BEFORE_FULLDATE > $DATE_BEFORE" >> $LOGFILE' >> /usr/bin/updatedate
  596. echo ' # Send a warning email' > /usr/bin/updatedate
  597. echo ' echo $(tail $LOGFILE -n 2) | mail -s "tlsdate anomaly" $EMAIL' >> /usr/bin/updatedate
  598. echo ' # Try another time source' >> /usr/bin/updatedate
  599. echo ' TIMESOURCE=$TIMESOURCE2' >> /usr/bin/updatedate
  600. echo ' # try running without any parameters' >> /usr/bin/updatedate
  601. echo ' tlsdate >> $LOGFILE' >> /usr/bin/updatedate
  602. echo ' BACKWARDS_BETWEEN=1' >> /usr/bin/updatedate
  603. echo ' fi' >> /usr/bin/updatedate
  604. echo 'fi' >> /usr/bin/updatedate
  605. echo '# Set the date' >> /usr/bin/updatedate
  606. echo '/usr/bin/timeout $TIMEOUT tlsdate -l -t -H $TIMESOURCE -p 443 >> $LOGFILE' >> /usr/bin/updatedate
  607. echo 'DATE_AFTER=$(date)' >> /usr/bin/updatedate
  608. echo 'AFTER=$(date -d "$Y-$M-$D" '+%s')' >> /usr/bin/updatedate
  609. echo '# After setting the date did it go backwards?' >> /usr/bin/updatedate
  610. echo 'if (( AFTER < BEFORE )); then' >> /usr/bin/updatedate
  611. echo ' echo "Incorrect date: $DATE_BEFORE -> $DATE_AFTER" >> $LOGFILE' >> /usr/bin/updatedate
  612. echo ' # Send a warning email' >> /usr/bin/updatedate
  613. echo ' echo $(tail $LOGFILE -n 2) | mail -s "tlsdate anomaly" $EMAIL' >> /usr/bin/updatedate
  614. echo ' # Try resetting the date from another time source' >> /usr/bin/updatedate
  615. echo ' /usr/bin/timeout $TIMEOUT tlsdate -l -t -H $TIMESOURCE2 -p 443 >> $LOGFILE' >> /usr/bin/updatedate
  616. echo ' DATE_AFTER=$(date)' >> /usr/bin/updatedate
  617. echo ' AFTER=$(date -d "$Y-$M-$D" "+%s")' >> /usr/bin/updatedate
  618. echo 'else' >> /usr/bin/updatedate
  619. echo ' echo -n $TIMESOURCE >> $LOGFILE' >> /usr/bin/updatedate
  620. echo ' if [[ -f "$BEFORE_DATE_FILE" ]]; then' >> /usr/bin/updatedate
  621. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  622. echo ' echo -n $BEFORE_FILE >> $LOGFILE' >> /usr/bin/updatedate
  623. echo ' fi' >> /usr/bin/updatedate
  624. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  625. echo ' echo -n $BEFORE >> $LOGFILE' >> /usr/bin/updatedate
  626. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  627. echo ' echo -n $AFTER >> $LOGFILE' >> /usr/bin/updatedate
  628. echo ' echo -n " " >> $LOGFILE' >> /usr/bin/updatedate
  629. echo ' echo $DATE_AFTER >> $LOGFILE' >> /usr/bin/updatedate
  630. echo 'fi' >> /usr/bin/updatedate
  631. echo '# Log the last date' >> /usr/bin/updatedate
  632. echo 'if [ BACKWARDS_BETWEEN == 0 ]; then' >> /usr/bin/updatedate
  633. echo ' echo "$AFTER" > $BEFORE_DATE_FILE' >> /usr/bin/updatedate
  634. echo ' echo "$DATE_AFTER" > $BEFORE_FULLDATE_FILE' >> /usr/bin/updatedate
  635. echo ' exit 0' >> /usr/bin/updatedate
  636. echo 'else' >> /usr/bin/updatedate
  637. echo ' exit 1' >> /usr/bin/updatedate
  638. echo 'fi' >> /usr/bin/updatedate
  639. chmod +x /usr/bin/updatedate
  640. echo '*/15 * * * * root /usr/bin/updatedate' >> /etc/crontab
  641. service cron restart
  642. echo '#!/bin/bash' > /etc/init.d/tlsdate
  643. echo '# /etc/init.d/tlsdate' >> /etc/init.d/tlsdate
  644. echo '### BEGIN INIT INFO' >> /etc/init.d/tlsdate
  645. echo '# Provides: tlsdate' >> /etc/init.d/tlsdate
  646. echo '# Required-Start: $remote_fs $syslog' >> /etc/init.d/tlsdate
  647. echo '# Required-Stop: $remote_fs $syslog' >> /etc/init.d/tlsdate
  648. echo '# Default-Start: 2 3 4 5' >> /etc/init.d/tlsdate
  649. echo '# Default-Stop: 0 1 6' >> /etc/init.d/tlsdate
  650. echo '# Short-Description: Initially calls tlsdate with the timewarp option' >> /etc/init.d/tlsdate
  651. echo '# Description: Initially calls tlsdate with the timewarp option' >> /etc/init.d/tlsdate
  652. echo '### END INIT INFO' >> /etc/init.d/tlsdate
  653. echo '# Author: Bob Mottram <bob@robotics.uk.to>' >> /etc/init.d/tlsdate
  654. echo 'PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:/sbin:/usr/sbin:/bin"' >> /etc/init.d/tlsdate
  655. echo 'LOGFILE="/var/log/tlsdate.log"' >> /etc/init.d/tlsdate
  656. echo 'TLSDATECOMMAND="tlsdate --timewarp -l -H www.ptb.de -p 443 >> $LOGFILE"' >> /etc/init.d/tlsdate
  657. echo '#Start-Stop here' >> /etc/init.d/tlsdate
  658. echo 'case "$1" in' >> /etc/init.d/tlsdate
  659. echo ' start)' >> /etc/init.d/tlsdate
  660. echo ' echo "tlsdate started"' >> /etc/init.d/tlsdate
  661. echo ' $TLSDATECOMMAND' >> /etc/init.d/tlsdate
  662. echo ' ;;' >> /etc/init.d/tlsdate
  663. echo ' stop)' >> /etc/init.d/tlsdate
  664. echo ' echo "tlsdate stopped"' >> /etc/init.d/tlsdate
  665. echo ' ;;' >> /etc/init.d/tlsdate
  666. echo ' restart)' >> /etc/init.d/tlsdate
  667. echo ' echo "tlsdate restarted"' >> /etc/init.d/tlsdate
  668. echo ' $TLSDATECOMMAND' >> /etc/init.d/tlsdate
  669. echo ' ;;' >> /etc/init.d/tlsdate
  670. echo ' *)' >> /etc/init.d/tlsdate
  671. echo ' echo "Usage: $0 {start|stop|restart}"' >> /etc/init.d/tlsdate
  672. echo ' exit 1' >> /etc/init.d/tlsdate
  673. echo ' ;;' >> /etc/init.d/tlsdate
  674. echo 'esac' >> /etc/init.d/tlsdate
  675. echo 'exit 0' >> /etc/init.d/tlsdate
  676. chmod +x /etc/init.d/tlsdate
  677. update-rc.d tlsdate defaults
  678. echo 'time_synchronisation' >> $COMPLETION_FILE
  679. }
  680. function configure_firewall {
  681. if grep -Fxq "configure_firewall" $COMPLETION_FILE; then
  682. return
  683. fi
  684. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  685. # docker does its own firewalling
  686. return
  687. fi
  688. iptables -P INPUT ACCEPT
  689. ip6tables -P INPUT ACCEPT
  690. iptables -F
  691. ip6tables -F
  692. iptables -X
  693. ip6tables -X
  694. iptables -P INPUT DROP
  695. ip6tables -P INPUT DROP
  696. iptables -A INPUT -i lo -j ACCEPT
  697. iptables -A INPUT -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  698. echo 'configure_firewall' >> $COMPLETION_FILE
  699. }
  700. function save_firewall_settings {
  701. iptables-save > /etc/firewall.conf
  702. ip6tables-save > /etc/firewall6.conf
  703. printf '#!/bin/sh\n' > /etc/network/if-up.d/iptables
  704. printf 'iptables-restore < /etc/firewall.conf\n' >> /etc/network/if-up.d/iptables
  705. printf 'ip6tables-restore < /etc/firewall6.conf\n' >> /etc/network/if-up.d/iptables
  706. chmod +x /etc/network/if-up.d/iptables
  707. }
  708. function configure_firewall_for_dns {
  709. if grep -Fxq "configure_firewall_for_dns" $COMPLETION_FILE; then
  710. return
  711. fi
  712. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  713. # docker does its own firewalling
  714. return
  715. fi
  716. iptables -A INPUT -i eth0 -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
  717. save_firewall_settings
  718. echo 'configure_firewall_for_dns' >> $COMPLETION_FILE
  719. }
  720. function configure_firewall_for_xmpp {
  721. if [ ! -d /etc/prosody ]; then
  722. return
  723. fi
  724. if grep -Fxq "configure_firewall_for_xmpp" $COMPLETION_FILE; then
  725. return
  726. fi
  727. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  728. # docker does its own firewalling
  729. return
  730. fi
  731. iptables -A INPUT -i eth0 -p tcp --dport 5222:5223 -j ACCEPT
  732. iptables -A INPUT -i eth0 -p tcp --dport 5269 -j ACCEPT
  733. iptables -A INPUT -i eth0 -p tcp --dport 5280:5281 -j ACCEPT
  734. save_firewall_settings
  735. echo 'configure_firewall_for_xmpp' >> $COMPLETION_FILE
  736. }
  737. function configure_firewall_for_irc {
  738. if [ ! -d /etc/ngircd ]; then
  739. return
  740. fi
  741. if grep -Fxq "configure_firewall_for_irc" $COMPLETION_FILE; then
  742. return
  743. fi
  744. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  745. # docker does its own firewalling
  746. return
  747. fi
  748. iptables -A INPUT -i eth0 -p tcp --dport 6697 -j ACCEPT
  749. iptables -A INPUT -i eth0 -p tcp --dport 9999 -j ACCEPT
  750. save_firewall_settings
  751. echo 'configure_firewall_for_irc' >> $COMPLETION_FILE
  752. }
  753. function configure_firewall_for_ftp {
  754. if grep -Fxq "configure_firewall_for_ftp" $COMPLETION_FILE; then
  755. return
  756. fi
  757. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  758. # docker does its own firewalling
  759. return
  760. fi
  761. iptables -I INPUT -i eth0 -p tcp --dport 1024:65535 --sport 20:21 -j ACCEPT
  762. save_firewall_settings
  763. echo 'configure_firewall_for_ftp' >> $COMPLETION_FILE
  764. }
  765. function configure_firewall_for_web_access {
  766. if grep -Fxq "configure_firewall_for_web_access" $COMPLETION_FILE; then
  767. return
  768. fi
  769. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  770. # docker does its own firewalling
  771. return
  772. fi
  773. iptables -A INPUT -i eth0 -p tcp --dport 32768:61000 --sport 80 -j ACCEPT
  774. iptables -A INPUT -i eth0 -p tcp --dport 32768:61000 --sport 443 -j ACCEPT
  775. save_firewall_settings
  776. echo 'configure_firewall_for_web_access' >> $COMPLETION_FILE
  777. }
  778. function configure_firewall_for_web_server {
  779. if grep -Fxq "configure_firewall_for_web_server" $COMPLETION_FILE; then
  780. return
  781. fi
  782. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  783. # docker does its own firewalling
  784. return
  785. fi
  786. iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
  787. iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
  788. save_firewall_settings
  789. echo 'configure_firewall_for_web_server' >> $COMPLETION_FILE
  790. }
  791. function configure_firewall_for_ssh {
  792. if grep -Fxq "configure_firewall_for_ssh" $COMPLETION_FILE; then
  793. return
  794. fi
  795. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  796. # docker does its own firewalling
  797. return
  798. fi
  799. iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
  800. iptables -A INPUT -i eth0 -p tcp --dport $SSH_PORT -j ACCEPT
  801. save_firewall_settings
  802. echo 'configure_firewall_for_ssh' >> $COMPLETION_FILE
  803. }
  804. function configure_firewall_for_git {
  805. if grep -Fxq "configure_firewall_for_git" $COMPLETION_FILE; then
  806. return
  807. fi
  808. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  809. # docker does its own firewalling
  810. return
  811. fi
  812. iptables -A INPUT -i eth0 -p tcp --dport 9418 -j ACCEPT
  813. save_firewall_settings
  814. echo 'configure_firewall_for_git' >> $COMPLETION_FILE
  815. }
  816. function configure_firewall_for_email {
  817. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  818. return
  819. fi
  820. if grep -Fxq "configure_firewall_for_email" $COMPLETION_FILE; then
  821. return
  822. fi
  823. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  824. # docker does its own firewalling
  825. return
  826. fi
  827. iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
  828. iptables -A INPUT -i eth0 -p tcp --dport 587 -j ACCEPT
  829. iptables -A INPUT -i eth0 -p tcp --dport 465 -j ACCEPT
  830. iptables -A INPUT -i eth0 -p tcp --dport 993 -j ACCEPT
  831. save_firewall_settings
  832. echo 'configure_firewall_for_email' >> $COMPLETION_FILE
  833. }
  834. function configure_internet_protocol {
  835. if grep -Fxq "configure_internet_protocol" $COMPLETION_FILE; then
  836. return
  837. fi
  838. sed -i "s/#net.ipv4.tcp_syncookies=1/net.ipv4.tcp_syncookies=1/g" /etc/sysctl.conf
  839. sed -i "s/#net.ipv4.conf.all.accept_redirects = 0/net.ipv4.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  840. sed -i "s/#net.ipv6.conf.all.accept_redirects = 0/net.ipv6.conf.all.accept_redirects = 0/g" /etc/sysctl.conf
  841. sed -i "s/#net.ipv4.conf.all.send_redirects = 0/net.ipv4.conf.all.send_redirects = 0/g" /etc/sysctl.conf
  842. sed -i "s/#net.ipv4.conf.all.accept_source_route = 0/net.ipv4.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  843. sed -i "s/#net.ipv6.conf.all.accept_source_route = 0/net.ipv6.conf.all.accept_source_route = 0/g" /etc/sysctl.conf
  844. sed -i "s/#net.ipv4.conf.default.rp_filter=1/net.ipv4.conf.default.rp_filter=1/g" /etc/sysctl.conf
  845. sed -i "s/#net.ipv4.conf.all.rp_filter=1/net.ipv4.conf.all.rp_filter=1/g" /etc/sysctl.conf
  846. sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=0/g" /etc/sysctl.conf
  847. sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=0/g" /etc/sysctl.conf
  848. echo '# ignore pings' >> /etc/sysctl.conf
  849. echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  850. echo 'net.ipv6.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
  851. echo '# disable ipv6' >> /etc/sysctl.conf
  852. echo 'net.ipv6.conf.all.disable_ipv6 = 1' >> /etc/sysctl.conf
  853. echo 'net.ipv4.tcp_synack_retries = 2' >> /etc/sysctl.conf
  854. echo 'net.ipv4.tcp_syn_retries = 1' >> /etc/sysctl.conf
  855. echo '# keepalive' >> /etc/sysctl.conf
  856. echo 'net.ipv4.tcp_keepalive_probes = 9' >> /etc/sysctl.conf
  857. echo 'net.ipv4.tcp_keepalive_intvl = 75' >> /etc/sysctl.conf
  858. echo 'net.ipv4.tcp_keepalive_time = 7200' >> /etc/sysctl.conf
  859. echo 'configure_internet_protocol' >> $COMPLETION_FILE
  860. }
  861. function script_to_make_self_signed_certificates {
  862. if grep -Fxq "script_to_make_self_signed_certificates" $COMPLETION_FILE; then
  863. return
  864. fi
  865. echo '#!/bin/bash' > /usr/bin/makecert
  866. echo 'HOSTNAME=$1' >> /usr/bin/makecert
  867. echo 'COUNTRY_CODE="US"' >> /usr/bin/makecert
  868. echo 'AREA="Free Speech Zone"' >> /usr/bin/makecert
  869. echo 'LOCATION="Freedomville"' >> /usr/bin/makecert
  870. echo 'ORGANISATION="Freedombone"' >> /usr/bin/makecert
  871. echo 'UNIT="Freedombone Unit"' >> /usr/bin/makecert
  872. echo 'if ! which openssl > /dev/null ;then' >> /usr/bin/makecert
  873. echo ' echo "$0: openssl is not installed, exiting" 1>&2' >> /usr/bin/makecert
  874. echo ' exit 1' >> /usr/bin/makecert
  875. echo 'fi' >> /usr/bin/makecert
  876. 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
  877. echo 'openssl dhparam -check -text -5 1024 -out /etc/ssl/certs/$HOSTNAME.dhparam' >> /usr/bin/makecert
  878. echo 'chmod 400 /etc/ssl/private/$HOSTNAME.key' >> /usr/bin/makecert
  879. echo 'chmod 640 /etc/ssl/certs/$HOSTNAME.crt' >> /usr/bin/makecert
  880. echo 'chmod 640 /etc/ssl/certs/$HOSTNAME.dhparam' >> /usr/bin/makecert
  881. echo 'if [ -f /etc/init.d/nginx ]; then' >> /usr/bin/makecert
  882. echo ' /etc/init.d/nginx reload' >> /usr/bin/makecert
  883. echo 'fi' >> /usr/bin/makecert
  884. echo '# add the public certificate to a separate directory' >> /usr/bin/makecert
  885. echo '# so that we can redistribute it easily' >> /usr/bin/makecert
  886. echo 'if [ ! -d /etc/ssl/mycerts ]; then' >> /usr/bin/makecert
  887. echo ' mkdir /etc/ssl/mycerts' >> /usr/bin/makecert
  888. echo 'fi' >> /usr/bin/makecert
  889. echo 'cp /etc/ssl/certs/$HOSTNAME.crt /etc/ssl/mycerts' >> /usr/bin/makecert
  890. echo '# Create a bundle of your certificates' >> /usr/bin/makecert
  891. echo 'cat /etc/ssl/mycerts/*.crt > /etc/ssl/freedombone-bundle.crt' >> /usr/bin/makecert
  892. echo 'tar -czvf /etc/ssl/freedombone-certs.tar.gz /etc/ssl/mycerts/*.crt' >> /usr/bin/makecert
  893. chmod +x /usr/bin/makecert
  894. echo 'script_to_make_self_signed_certificates' >> $COMPLETION_FILE
  895. }
  896. function configure_email {
  897. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  898. return
  899. fi
  900. if grep -Fxq "configure_email" $COMPLETION_FILE; then
  901. return
  902. fi
  903. apt-get -y remove postfix
  904. apt-get -y --force-yes install exim4 sasl2-bin swaks libnet-ssleay-perl procmail
  905. echo 'dc_eximconfig_configtype="internet"' > /etc/exim4/update-exim4.conf.conf
  906. echo "dc_other_hostnames='$DOMAIN_NAME'" >> /etc/exim4/update-exim4.conf.conf
  907. echo "dc_local_interfaces=''" >> /etc/exim4/update-exim4.conf.conf
  908. echo "dc_readhost=''" >> /etc/exim4/update-exim4.conf.conf
  909. echo "dc_relay_domains=''" >> /etc/exim4/update-exim4.conf.conf
  910. echo "dc_minimaldns='false'" >> /etc/exim4/update-exim4.conf.conf
  911. echo "dc_relay_nets='192.168.1.0/24'" >> /etc/exim4/update-exim4.conf.conf
  912. echo "dc_smarthost=''" >> /etc/exim4/update-exim4.conf.conf
  913. echo "CFILEMODE='644'" >> /etc/exim4/update-exim4.conf.conf
  914. echo "dc_use_split_config='false'" >> /etc/exim4/update-exim4.conf.conf
  915. echo "dc_hide_mailname=''" >> /etc/exim4/update-exim4.conf.conf
  916. echo "dc_mailname_in_oh='true'" >> /etc/exim4/update-exim4.conf.conf
  917. echo "dc_localdelivery='maildir_home'" >> /etc/exim4/update-exim4.conf.conf
  918. update-exim4.conf
  919. sed -i "s/START=no/START=yes/g" /etc/default/saslauthd
  920. /etc/init.d/saslauthd start
  921. # make a tls certificate for email
  922. makecert exim
  923. mv /etc/ssl/private/exim.key /etc/exim4
  924. mv /etc/ssl/certs/exim.crt /etc/exim4
  925. mv /etc/ssl/certs/exim.dhparam /etc/exim4
  926. chown root:Debian-exim /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  927. chmod 640 /etc/exim4/exim.key /etc/exim4/exim.crt /etc/exim4/exim.dhparam
  928. sed -i '/login_saslauthd_server/,/.endif/ s/# *//' /etc/exim4/exim4.conf.template
  929. sed -i "/.ifdef MAIN_HARDCODE_PRIMARY_HOSTNAME/i\MAIN_HARDCODE_PRIMARY_HOSTNAME = $DOMAIN_NAME\nMAIN_TLS_ENABLE = true" /etc/exim4/exim4.conf.template
  930. sed -i "s|SMTPLISTENEROPTIONS=''|SMTPLISTENEROPTIONS='-oX 465:25:587 -oP /var/run/exim4/exim.pid'|g" /etc/default/exim4
  931. if ! grep -q "tls_on_connect_ports=465" /etc/exim4/exim4.conf.template; then
  932. sed -i '/SSL configuration for exim/i\tls_on_connect_ports=465' /etc/exim4/exim4.conf.template
  933. fi
  934. adduser $MY_USERNAME sasl
  935. addgroup Debian-exim sasl
  936. /etc/init.d/exim4 restart
  937. if [ ! -d /etc/skel/Maildir ]; then
  938. mkdir -m 700 /etc/skel/Maildir
  939. mkdir -m 700 /etc/skel/Maildir/Sent
  940. mkdir -m 700 /etc/skel/Maildir/Sent/tmp
  941. mkdir -m 700 /etc/skel/Maildir/Sent/cur
  942. mkdir -m 700 /etc/skel/Maildir/Sent/new
  943. mkdir -m 700 /etc/skel/Maildir/.learn-spam
  944. mkdir -m 700 /etc/skel/Maildir/.learn-spam/cur
  945. mkdir -m 700 /etc/skel/Maildir/.learn-spam/new
  946. mkdir -m 700 /etc/skel/Maildir/.learn-spam/tmp
  947. mkdir -m 700 /etc/skel/Maildir/.learn-ham
  948. mkdir -m 700 /etc/skel/Maildir/.learn-ham/cur
  949. mkdir -m 700 /etc/skel/Maildir/.learn-ham/new
  950. mkdir -m 700 /etc/skel/Maildir/.learn-ham/tmp
  951. ln -s /etc/skel/Maildir/.learn-spam /etc/skel/Maildir/spam
  952. ln -s /etc/skel/Maildir/.learn-ham /etc/skel/Maildir/ham
  953. fi
  954. if [ ! -d /home/$MY_USERNAME/Maildir ]; then
  955. mkdir -m 700 /home/$MY_USERNAME/Maildir
  956. mkdir -m 700 /home/$MY_USERNAME/Maildir/cur
  957. mkdir -m 700 /home/$MY_USERNAME/Maildir/tmp
  958. mkdir -m 700 /home/$MY_USERNAME/Maildir/new
  959. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent
  960. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/cur
  961. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/tmp
  962. mkdir -m 700 /home/$MY_USERNAME/Maildir/Sent/new
  963. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam
  964. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/cur
  965. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/new
  966. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-spam/tmp
  967. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham
  968. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/cur
  969. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/new
  970. mkdir -m 700 /home/$MY_USERNAME/Maildir/.learn-ham/tmp
  971. ln -s /home/$MY_USERNAME/Maildir/.learn-spam /home/$MY_USERNAME/Maildir/spam
  972. ln -s /home/$MY_USERNAME/Maildir/.learn-ham /home/$MY_USERNAME/Maildir/ham
  973. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  974. fi
  975. echo 'configure_email' >> $COMPLETION_FILE
  976. }
  977. function spam_filtering {
  978. # NOTE: spamassassin installation currently doesn't work, sa-compile fails with a make error 23/09/2014
  979. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  980. return
  981. fi
  982. if grep -Fxq "spam_filtering" $COMPLETION_FILE; then
  983. return
  984. fi
  985. apt-get -y --force-yes install exim4-daemon-heavy
  986. apt-get -y --force-yes install spamassassin
  987. sa-update -v
  988. sed -i 's/ENABLED=0/ENABLED=1/g' /etc/default/spamassassin
  989. sed -i 's/# spamd_address = 127.0.0.1 783/spamd_address = 127.0.0.1 783/g' /etc/exim4/exim4.conf.template
  990. # This configuration is based on https://wiki.debian.org/DebianSpamAssassin
  991. sed -i 's/local_parts = postmaster/local_parts = postmaster:abuse/g' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  992. sed -i '/domains = +local_domains : +relay_to_domains/a\ set acl_m0 = rfcnames' /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
  993. sed -i 's/accept/accept condition = ${if eq{$acl_m0}{rfcnames} {1}{0}}/g' /etc/exim4/conf.d/acl/40_exim4-config_check_data
  994. echo 'warn message = X-Spam-Score: $spam_score ($spam_bar)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  995. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  996. echo 'warn message = X-Spam-Flag: YES' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  997. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  998. echo 'warn message = X-Spam-Report: $spam_report' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  999. echo ' spam = nobody' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  1000. echo '# reject spam at high scores (> 12)' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  1001. echo 'deny message = This message scored $spam_score spam points.' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  1002. echo ' spam = nobody:true' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  1003. echo ' condition = ${if >{$spam_score_int}{120}{1}{0}}' >> /etc/exim4/conf.d/acl/40_exim4-config_check_data
  1004. # procmail configuration
  1005. echo 'MAILDIR=$HOME/Maildir' > /home/$MY_USERNAME/.procmailrc
  1006. echo 'DEFAULT=$MAILDIR/' >> /home/$MY_USERNAME/.procmailrc
  1007. echo 'LOGFILE=$HOME/log/procmail.log' >> /home/$MY_USERNAME/.procmailrc
  1008. echo 'LOGABSTRACT=all' >> /home/$MY_USERNAME/.procmailrc
  1009. echo '# get spamassassin to check emails' >> /home/$MY_USERNAME/.procmailrc
  1010. echo ':0fw: .spamassassin.lock' >> /home/$MY_USERNAME/.procmailrc
  1011. echo ' * < 256000' >> /home/$MY_USERNAME/.procmailrc
  1012. echo '| spamc' >> /home/$MY_USERNAME/.procmailrc
  1013. echo '# strong spam are discarded' >> /home/$MY_USERNAME/.procmailrc
  1014. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  1015. echo ' * ^X-Spam-Level: \*\*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  1016. echo '/dev/null' >> /home/$MY_USERNAME/.procmailrc
  1017. echo '# weak spam are kept just in case - clear this out every now and then' >> /home/$MY_USERNAME/.procmailrc
  1018. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  1019. echo ' * ^X-Spam-Level: \*\*\*\*\*' >> /home/$MY_USERNAME/.procmailrc
  1020. echo '.0-spam/' >> /home/$MY_USERNAME/.procmailrc
  1021. echo '# otherwise, marginal spam goes here for revision' >> /home/$MY_USERNAME/.procmailrc
  1022. echo ':0' >> /home/$MY_USERNAME/.procmailrc
  1023. echo ' * ^X-Spam-Level: \*\*' >> /home/$MY_USERNAME/.procmailrc
  1024. echo '.spam/' >> /home/$MY_USERNAME/.procmailrc
  1025. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.procmailrc
  1026. # filtering scripts
  1027. echo '#!/bin/bash' > /usr/bin/filterspam
  1028. echo 'USERNAME=$1' >> /usr/bin/filterspam
  1029. echo 'MAILDIR=/home/$USERNAME/Maildir/.learn-spam' >> /usr/bin/filterspam
  1030. echo 'if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterspam
  1031. echo ' exit' >> /usr/bin/filterspam
  1032. echo 'fi' >> /usr/bin/filterspam
  1033. echo 'for f in `ls $MAILDIR/cur`' >> /usr/bin/filterspam
  1034. echo 'do' >> /usr/bin/filterspam
  1035. echo ' spamc -L spam < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterspam
  1036. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterspam
  1037. echo 'done' >> /usr/bin/filterspam
  1038. echo 'for f in `ls $MAILDIR/new`' >> /usr/bin/filterspam
  1039. echo 'do' >> /usr/bin/filterspam
  1040. echo ' spamc -L spam < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterspam
  1041. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterspam
  1042. echo 'done' >> /usr/bin/filterspam
  1043. echo '#!/bin/bash' > /usr/bin/filterham
  1044. echo 'USERNAME=$1' >> /usr/bin/filterham
  1045. echo 'MAILDIR=/home/$USERNAME/Maildir/.learn-ham' >> /usr/bin/filterham
  1046. echo 'if [ ! -d "$MAILDIR" ]; then' >> /usr/bin/filterham
  1047. echo ' exit' >> /usr/bin/filterham
  1048. echo 'fi' >> /usr/bin/filterham
  1049. echo 'for f in `ls $MAILDIR/cur`' >> /usr/bin/filterham
  1050. echo 'do' >> /usr/bin/filterham
  1051. echo ' spamc -L ham < "$MAILDIR/cur/$f" > /dev/null' >> /usr/bin/filterham
  1052. echo ' rm "$MAILDIR/cur/$f"' >> /usr/bin/filterham
  1053. echo 'done' >> /usr/bin/filterham
  1054. echo 'for f in `ls $MAILDIR/new`' >> /usr/bin/filterham
  1055. echo 'do' >> /usr/bin/filterham
  1056. echo ' spamc -L ham < "$MAILDIR/new/$f" > /dev/null' >> /usr/bin/filterham
  1057. echo ' rm "$MAILDIR/new/$f"' >> /usr/bin/filterham
  1058. echo 'done' >> /usr/bin/filterham
  1059. if ! grep -q "filterspam" /etc/crontab; then
  1060. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterspam $MY_USERNAME" >> /etc/crontab
  1061. fi
  1062. if ! grep -q "filterham" /etc/crontab; then
  1063. echo "*/3 * * * * root /usr/bin/timeout 120 /usr/bin/filterham $MY_USERNAME" >> /etc/crontab
  1064. fi
  1065. chmod 655 /usr/bin/filterspam /usr/bin/filterham
  1066. sed -i 's/# use_bayes 1/use_bayes 1/g' /etc/mail/spamassassin/local.cf
  1067. sed -i 's/# bayes_auto_learn 1/bayes_auto_learn 1/g' /etc/mail/spamassassin/local.cf
  1068. service spamassassin restart
  1069. service exim4 restart
  1070. service cron restart
  1071. echo 'spam_filtering' >> $COMPLETION_FILE
  1072. }
  1073. function configure_imap {
  1074. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  1075. return
  1076. fi
  1077. if grep -Fxq "configure_imap" $COMPLETION_FILE; then
  1078. return
  1079. fi
  1080. apt-get -y --force-yes install dovecot-common dovecot-imapd
  1081. makecert dovecot
  1082. chown root:dovecot /etc/ssl/certs/dovecot.crt
  1083. chown root:dovecot /etc/ssl/private/dovecot.key
  1084. chown root:dovecot /etc/ssl/private/dovecot.dhparams
  1085. sed -i 's|#ssl = yes|ssl = yes|g' /etc/dovecot/conf.d/10-ssl.conf
  1086. sed -i 's|ssl_cert = </etc/dovecot/dovecot.pem|ssl_cert = </etc/ssl/certs/dovecot.crt|g' /etc/dovecot/conf.d/10-ssl.conf
  1087. sed -i 's|ssl_key = </etc/dovecot/private/dovecot.pem|/etc/ssl/private/dovecot.key|g' /etc/dovecot/conf.d/10-ssl.conf
  1088. sed -i 's|#ssl_dh_parameters_length = 1024|ssl_dh_parameters_length = 1024|g' /etc/dovecot/conf.d/10-ssl.conf
  1089. sed -i 's/#ssl_prefer_server_ciphers = no/ssl_prefer_server_ciphers = yes/g' /etc/dovecot/conf.d/10-ssl.conf
  1090. echo "ssl_cipher_list = '$SSL_CIPHERS'" >> /etc/dovecot/conf.d/10-ssl.conf
  1091. sed -i 's/#listen = *, ::/listen = */g' /etc/dovecot/dovecot.conf
  1092. sed -i 's/#disable_plaintext_auth = yes/disable_plaintext_auth = no/g' /etc/dovecot/conf.d/10-auth.conf
  1093. sed -i 's/auth_mechanisms = plain/auth_mechanisms = plain login/g' /etc/dovecot/conf.d/10-auth.conf
  1094. sed -i 's|# mail_location = maildir:~/Maildir| mail_location = maildir:~/Maildir:LAYOUT=fs|g' /etc/dovecot/conf.d/10-mail.conf
  1095. echo 'configure_imap' >> $COMPLETION_FILE
  1096. }
  1097. function configure_gpg {
  1098. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  1099. return
  1100. fi
  1101. if grep -Fxq "configure_gpg" $COMPLETION_FILE; then
  1102. return
  1103. fi
  1104. apt-get -y --force-yes install gnupg
  1105. if [ ! -d /home/$MY_USERNAME/.gnupg ]; then
  1106. mkdir /home/$MY_USERNAME/.gnupg
  1107. echo 'keyserver hkp://keys.gnupg.net' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1108. echo 'keyserver-options auto-key-retrieve' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1109. fi
  1110. sed -i "s|keyserver hkp://keys.gnupg.net|keyserver $GPG_KEYSERVER|g" /home/$MY_USERNAME/.gnupg/gpg.conf
  1111. if ! grep -q "# default preferences" /home/$MY_USERNAME/.gnupg/gpg.conf; then
  1112. echo '' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1113. echo '# default preferences' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1114. echo 'personal-digest-preferences SHA256' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1115. echo 'cert-digest-algo SHA256' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1116. echo 'default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed' >> /home/$MY_USERNAME/.gnupg/gpg.conf
  1117. fi
  1118. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg
  1119. if [[ $MY_GPG_PUBLIC_KEY && $MY_GPG_PRIVATE_KEY ]]; then
  1120. # use your existing GPG keys which were exported
  1121. if [ ! -f $MY_GPG_PUBLIC_KEY ]; then
  1122. echo "GPG public key file $MY_GPG_PUBLIC_KEY was not found"
  1123. exit 5
  1124. fi
  1125. if [ ! -f $MY_GPG_PRIVATE_KEY ]; then
  1126. echo "GPG private key file $MY_GPG_PRIVATE_KEY was not found"
  1127. exit 6
  1128. fi
  1129. su -c "gpg --import $MY_GPG_PUBLIC_KEY" - $MY_USERNAME
  1130. su -c "gpg --allow-secret-key-import --import $MY_GPG_PRIVATE_KEY" - $MY_USERNAME
  1131. # for security ensure that the private key file doesn't linger around
  1132. shred -zu $MY_GPG_PRIVATE_KEY
  1133. else
  1134. # Generate a GPG key
  1135. echo 'Key-Type: 1' > /home/$MY_USERNAME/gpg-genkey.conf
  1136. echo 'Key-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  1137. echo 'Subkey-Type: 1' >> /home/$MY_USERNAME/gpg-genkey.conf
  1138. echo 'Subkey-Length: 4096' >> /home/$MY_USERNAME/gpg-genkey.conf
  1139. echo "Name-Real: $MY_USERNAME@$DOMAIN_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  1140. echo "Name-Email: $MY_USERNAME@$DOMAIN_NAME" >> /home/$MY_USERNAME/gpg-genkey.conf
  1141. echo 'Expire-Date: 0' >> /home/$MY_USERNAME/gpg-genkey.conf
  1142. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/gpg-genkey.conf
  1143. su -c "gpg --batch --gen-key /home/$MY_USERNAME/gpg-genkey.conf" - $MY_USERNAME
  1144. shred -zu /home/$MY_USERNAME/gpg-genkey.conf
  1145. MY_GPG_PUBLIC_KEY_ID=$(su -c "gpg --list-keys $DOMAIN_NAME | grep 'pub ' | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}'" - $MY_USERNAME)
  1146. MY_GPG_PUBLIC_KEY=/tmp/public_key.gpg
  1147. su -c "gpg --output $MY_GPG_PUBLIC_KEY --armor --export $MY_GPG_PUBLIC_KEY_ID" - $MY_USERNAME
  1148. fi
  1149. echo 'configure_gpg' >> $COMPLETION_FILE
  1150. }
  1151. function email_client {
  1152. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  1153. return
  1154. fi
  1155. if grep -Fxq "email_client" $COMPLETION_FILE; then
  1156. return
  1157. fi
  1158. apt-get -y --force-yes install mutt-patched lynx abook
  1159. if [ ! -d /home/$MY_USERNAME/.mutt ]; then
  1160. mkdir /home/$MY_USERNAME/.mutt
  1161. fi
  1162. echo "text/html; lynx -dump -width=78 -nolist %s | sed ‘s/^ //’; copiousoutput; needsterminal; nametemplate=%s.html" > /home/$MY_USERNAME/.mutt/mailcap
  1163. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt
  1164. echo 'set mbox_type=Maildir' >> /etc/Muttrc
  1165. echo 'set folder="~/Maildir"' >> /etc/Muttrc
  1166. echo 'set mask="!^\\.[^.]"' >> /etc/Muttrc
  1167. echo 'set mbox="~/Maildir"' >> /etc/Muttrc
  1168. echo 'set record="+Sent"' >> /etc/Muttrc
  1169. echo 'set postponed="+Drafts"' >> /etc/Muttrc
  1170. echo 'set trash="+Trash"' >> /etc/Muttrc
  1171. echo 'set spoolfile="~/Maildir"' >> /etc/Muttrc
  1172. echo 'auto_view text/x-vcard text/html text/enriched' >> /etc/Muttrc
  1173. echo 'set editor="emacs"' >> /etc/Muttrc
  1174. echo 'set header_cache="+.cache"' >> /etc/Muttrc
  1175. echo '' >> /etc/Muttrc
  1176. echo 'macro index S "<tag-prefix><save-message>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  1177. echo 'macro pager S "<save-message>=.learn-spam<enter>" "move to learn-spam"' >> /etc/Muttrc
  1178. echo 'macro index H "<tag-prefix><copy-message>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  1179. echo 'macro pager H "<copy-message>=.learn-ham<enter>" "copy to learn-ham"' >> /etc/Muttrc
  1180. echo '' >> /etc/Muttrc
  1181. echo '# set up the sidebar' >> /etc/Muttrc
  1182. echo 'set sidebar_width=12' >> /etc/Muttrc
  1183. echo 'set sidebar_visible=yes' >> /etc/Muttrc
  1184. echo "set sidebar_delim='|'" >> /etc/Muttrc
  1185. echo 'set sidebar_sort=yes' >> /etc/Muttrc
  1186. echo '' >> /etc/Muttrc
  1187. echo 'set rfc2047_parameters' >> /etc/Muttrc
  1188. echo '' >> /etc/Muttrc
  1189. echo '# Show inbox and sent items' >> /etc/Muttrc
  1190. echo 'mailboxes = =Sent' >> /etc/Muttrc
  1191. echo '' >> /etc/Muttrc
  1192. echo '# Alter these colours as needed for maximum bling' >> /etc/Muttrc
  1193. echo 'color sidebar_new yellow default' >> /etc/Muttrc
  1194. echo 'color normal white default' >> /etc/Muttrc
  1195. echo 'color hdrdefault brightcyan default' >> /etc/Muttrc
  1196. echo 'color signature green default' >> /etc/Muttrc
  1197. echo 'color attachment brightyellow default' >> /etc/Muttrc
  1198. echo 'color quoted green default' >> /etc/Muttrc
  1199. echo 'color quoted1 white default' >> /etc/Muttrc
  1200. echo 'color tilde blue default' >> /etc/Muttrc
  1201. echo '' >> /etc/Muttrc
  1202. echo '# ctrl-n, ctrl-p to select next, prev folder' >> /etc/Muttrc
  1203. echo '# ctrl-o to open selected folder' >> /etc/Muttrc
  1204. echo 'bind index \Cp sidebar-prev' >> /etc/Muttrc
  1205. echo 'bind index \Cn sidebar-next' >> /etc/Muttrc
  1206. echo 'bind index \Co sidebar-open' >> /etc/Muttrc
  1207. echo 'bind pager \Cp sidebar-prev' >> /etc/Muttrc
  1208. echo 'bind pager \Cn sidebar-next' >> /etc/Muttrc
  1209. echo 'bind pager \Co sidebar-open' >> /etc/Muttrc
  1210. echo '' >> /etc/Muttrc
  1211. echo '# ctrl-b toggles sidebar visibility' >> /etc/Muttrc
  1212. echo "macro index,pager \Cb '<enter-command>toggle sidebar_visible<enter><redraw-screen>' 'toggle sidebar'" >> /etc/Muttrc
  1213. echo '' >> /etc/Muttrc
  1214. echo '# esc-m Mark new messages as read' >> /etc/Muttrc
  1215. echo 'macro index <esc>m "T~N<enter>;WNT~O<enter>;WO\CT~T<enter>" "mark all messages read"' >> /etc/Muttrc
  1216. echo '' >> /etc/Muttrc
  1217. echo '# Collapsing threads' >> /etc/Muttrc
  1218. echo 'macro index [ "<collapse-thread>" "collapse/uncollapse thread"' >> /etc/Muttrc
  1219. echo 'macro index ] "<collapse-all>" "collapse/uncollapse all threads"' >> /etc/Muttrc
  1220. echo '' >> /etc/Muttrc
  1221. echo '# threads containing new messages' >> /etc/Muttrc
  1222. echo 'uncolor index "~(~N)"' >> /etc/Muttrc
  1223. echo 'color index brightblue default "~(~N)"' >> /etc/Muttrc
  1224. echo '' >> /etc/Muttrc
  1225. echo '# new messages themselves' >> /etc/Muttrc
  1226. echo 'uncolor index "~N"' >> /etc/Muttrc
  1227. echo 'color index brightyellow default "~N"' >> /etc/Muttrc
  1228. echo '' >> /etc/Muttrc
  1229. echo '# GPG/PGP integration' >> /etc/Muttrc
  1230. echo '# this set the number of seconds to keep in memory the passphrase used to encrypt/sign' >> /etc/Muttrc
  1231. echo 'set pgp_timeout=60' >> /etc/Muttrc
  1232. echo '' >> /etc/Muttrc
  1233. echo '# automatically sign and encrypt with PGP/MIME' >> /etc/Muttrc
  1234. echo 'set pgp_autosign # autosign all outgoing mails' >> /etc/Muttrc
  1235. echo 'set pgp_autoencrypt # Try to encrypt automatically' >> /etc/Muttrc
  1236. echo 'set pgp_replyencrypt # autocrypt replies to crypted' >> /etc/Muttrc
  1237. echo 'set pgp_replysign # autosign replies to signed' >> /etc/Muttrc
  1238. echo 'set pgp_auto_decode=yes # decode attachments' >> /etc/Muttrc
  1239. echo 'set fcc_clear # Keep cleartext copy of sent encrypted mail' >> /etc/Muttrc
  1240. echo 'unset smime_is_default' >> /etc/Muttrc
  1241. echo '' >> /etc/Muttrc
  1242. echo 'set alias_file=~/.mutt-alias' >> /etc/Muttrc
  1243. echo 'source ~/.mutt-alias' >> /etc/Muttrc
  1244. echo 'set query_command= "abook --mutt-query \"%s\""' >> /etc/Muttrc
  1245. echo 'macro index,pager A "<pipe-message>abook --add-email-quiet<return>" "add the sender address to abook"' >> /etc/Muttrc
  1246. cp -f /etc/Muttrc /home/$MY_USERNAME/.muttrc
  1247. touch /home/$MY_USERNAME/.mutt-alias
  1248. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.muttrc
  1249. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.mutt-alias
  1250. echo 'email_client' >> $COMPLETION_FILE
  1251. }
  1252. function folders_for_mailing_lists {
  1253. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  1254. return
  1255. fi
  1256. if grep -Fxq "folders_for_mailing_lists" $COMPLETION_FILE; then
  1257. return
  1258. fi
  1259. echo '#!/bin/bash' > /usr/bin/mailinglistrule
  1260. echo 'MYUSERNAME=$1' >> /usr/bin/mailinglistrule
  1261. echo 'MAILINGLIST=$2' >> /usr/bin/mailinglistrule
  1262. echo 'SUBJECTTAG=$3' >> /usr/bin/mailinglistrule
  1263. echo 'MUTTRC=/home/$MYUSERNAME/.muttrc' >> /usr/bin/mailinglistrule
  1264. echo 'PM=/home/$MYUSERNAME/.procmailrc' >> /usr/bin/mailinglistrule
  1265. echo 'LISTDIR=/home/$MYUSERNAME/Maildir/$MAILINGLIST' >> /usr/bin/mailinglistrule
  1266. echo 'if ! [[ $MYUSERNAME && $MAILINGLIST && $SUBJECTTAG ]]; then' >> /usr/bin/mailinglistrule
  1267. echo ' echo "mailinglistsrule [user name] [mailing list name] [subject tag]"' >> /usr/bin/mailinglistrule
  1268. echo ' exit 1' >> /usr/bin/mailinglistrule
  1269. echo 'fi' >> /usr/bin/mailinglistrule
  1270. echo 'if [ ! -d "$LISTDIR" ]; then' >> /usr/bin/mailinglistrule
  1271. echo ' mkdir -m 700 $LISTDIR' >> /usr/bin/mailinglistrule
  1272. echo ' mkdir -m 700 $LISTDIR/tmp' >> /usr/bin/mailinglistrule
  1273. echo ' mkdir -m 700 $LISTDIR/new' >> /usr/bin/mailinglistrule
  1274. echo ' mkdir -m 700 $LISTDIR/cur' >> /usr/bin/mailinglistrule
  1275. echo 'fi' >> /usr/bin/mailinglistrule
  1276. echo 'chown -R $MYUSERNAME:$MYUSERNAME $LISTDIR' >> /usr/bin/mailinglistrule
  1277. echo 'echo "" >> $PM' >> /usr/bin/mailinglistrule
  1278. echo 'echo ":0" >> $PM' >> /usr/bin/mailinglistrule
  1279. echo 'echo " * ^Subject:.*()\[$SUBJECTTAG\]" >> $PM' >> /usr/bin/mailinglistrule
  1280. echo 'echo "$LISTDIR/new" >> $PM' >> /usr/bin/mailinglistrule
  1281. echo 'chown $MYUSERNAME:$MYUSERNAME $PM' >> /usr/bin/mailinglistrule
  1282. echo 'if [ ! -f "$MUTTRC" ]; then' >> /usr/bin/mailinglistrule
  1283. echo ' cp /etc/Muttrc $MUTTRC' >> /usr/bin/mailinglistrule
  1284. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/mailinglistrule
  1285. echo 'fi' >> /usr/bin/mailinglistrule
  1286. echo 'PROCMAILLOG=/home/$MYUSERNAME/log' >> /usr/bin/mailinglistrule
  1287. echo 'if [ ! -d $PROCMAILLOG ]; then' >> /usr/bin/mailinglistrule
  1288. echo ' mkdir $PROCMAILLOG' >> /usr/bin/mailinglistrule
  1289. echo ' chown -R $MYUSERNAME:$MYUSERNAME $PROCMAILLOG' >> /usr/bin/mailinglistrule
  1290. echo 'fi' >> /usr/bin/mailinglistrule
  1291. echo 'MUTT_MAILBOXES=$(grep "mailboxes =" $MUTTRC)' >> /usr/bin/mailinglistrule
  1292. echo 'if [[ $MUTT_MAILBOXES != *$MAILINGLIST* ]]; then' >> /usr/bin/mailinglistrule
  1293. echo ' sed -i "s|$MUTT_MAILBOXES|$MUTT_MAILBOXES =$MAILINGLIST|g" $MUTTRC' >> /usr/bin/mailinglistrule
  1294. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/mailinglistrule
  1295. echo 'fi' >> /usr/bin/mailinglistrule
  1296. chmod +x /usr/bin/mailinglistrule
  1297. echo 'folders_for_mailing_lists' >> $COMPLETION_FILE
  1298. }
  1299. function folders_for_email_addresses {
  1300. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  1301. return
  1302. fi
  1303. if grep -Fxq "folders_for_email_addresses" $COMPLETION_FILE; then
  1304. return
  1305. fi
  1306. echo '#!/bin/bash' > /usr/bin/emailrule
  1307. echo 'MYUSERNAME=$1' >> /usr/bin/emailrule
  1308. echo 'EMAILADDRESS=$2' >> /usr/bin/emailrule
  1309. echo 'MAILINGLIST=$3' >> /usr/bin/emailrule
  1310. echo 'MUTTRC=/home/$MYUSERNAME/.muttrc' >> /usr/bin/emailrule
  1311. echo 'PM=/home/$MYUSERNAME/.procmailrc' >> /usr/bin/emailrule
  1312. echo 'LISTDIR=/home/$MYUSERNAME/Maildir/$MAILINGLIST' >> /usr/bin/emailrule
  1313. echo 'if ! [[ $MYUSERNAME && $EMAILADDRESS && $MAILINGLIST ]]; then' >> /usr/bin/emailrule
  1314. echo ' echo "emailrule [user name] [email address] [mailing list name]"' >> /usr/bin/emailrule
  1315. echo ' exit 1' >> /usr/bin/emailrule
  1316. echo 'fi' >> /usr/bin/emailrule
  1317. echo 'if [ ! -d "$LISTDIR" ]; then' >> /usr/bin/emailrule
  1318. echo ' mkdir -m 700 $LISTDIR' >> /usr/bin/emailrule
  1319. echo ' mkdir -m 700 $LISTDIR/tmp' >> /usr/bin/emailrule
  1320. echo ' mkdir -m 700 $LISTDIR/new' >> /usr/bin/emailrule
  1321. echo ' mkdir -m 700 $LISTDIR/cur' >> /usr/bin/emailrule
  1322. echo 'fi' >> /usr/bin/emailrule
  1323. echo 'chown -R $MYUSERNAME:$MYUSERNAME $LISTDIR' >> /usr/bin/emailrule
  1324. echo 'echo "" >> $PM' >> /usr/bin/emailrule
  1325. echo 'echo ":0" >> $PM' >> /usr/bin/emailrule
  1326. echo 'echo " * ^From: $EMAILADDRESS" >> $PM' >> /usr/bin/emailrule
  1327. echo 'echo "$LISTDIR/new" >> $PM' >> /usr/bin/emailrule
  1328. echo 'chown $MYUSERNAME:$MYUSERNAME $PM' >> /usr/bin/emailrule
  1329. echo 'if [ ! -f "$MUTTRC" ]; then' >> /usr/bin/emailrule
  1330. echo ' cp /etc/Muttrc $MUTTRC' >> /usr/bin/emailrule
  1331. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/emailrule
  1332. echo 'fi' >> /usr/bin/emailrule
  1333. echo 'PROCMAILLOG=/home/$MYUSERNAME/log' >> /usr/bin/emailrule
  1334. echo 'if [ ! -d $PROCMAILLOG ]; then' >> /usr/bin/emailrule
  1335. echo ' mkdir $PROCMAILLOG' >> /usr/bin/emailrule
  1336. echo ' chown -R $MYUSERNAME:$MYUSERNAME $PROCMAILLOG' >> /usr/bin/emailrule
  1337. echo 'fi' >> /usr/bin/emailrule
  1338. echo 'MUTT_MAILBOXES=$(grep "mailboxes =" $MUTTRC)' >> /usr/bin/emailrule
  1339. echo 'if [[ $MUTT_MAILBOXES != *$MAILINGLIST* ]]; then' >> /usr/bin/emailrule
  1340. echo ' sed -i "s|$MUTT_MAILBOXES|$MUTT_MAILBOXES =$MAILINGLIST|g" $MUTTRC' >> /usr/bin/emailrule
  1341. echo ' chown $MYUSERNAME:$MYUSERNAME $MUTTRC' >> /usr/bin/emailrule
  1342. echo 'fi' >> /usr/bin/emailrule
  1343. chmod +x /usr/bin/emailrule
  1344. echo 'folders_for_email_addresses' >> $COMPLETION_FILE
  1345. }
  1346. function dynamic_dns_freedns {
  1347. if grep -Fxq "dynamic_dns_freedns" $COMPLETION_FILE; then
  1348. return
  1349. fi
  1350. echo '#!/bin/bash' > /usr/bin/dynamicdns
  1351. echo '# subdomain name 1' >> /usr/bin/dynamicdns
  1352. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  1353. echo '# add any other subdomains below' >> /usr/bin/dynamicdns
  1354. chmod 600 /usr/bin/dynamicdns
  1355. chmod +x /usr/bin/dynamicdns
  1356. if ! grep -q "dynamicdns" /etc/crontab; then
  1357. sed -i '/# m h dom mon dow user command/a\*/5 * * * * root /usr/bin/timeout 240 /usr/bin/dynamicdns' /etc/crontab
  1358. fi
  1359. service cron restart
  1360. echo 'dynamic_dns_freedns' >> $COMPLETION_FILE
  1361. }
  1362. function create_private_mailing_list {
  1363. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  1364. return
  1365. fi
  1366. # This installation doesn't work, results in ruby errors
  1367. # There is currently no schleuder package for Debian jessie
  1368. if grep -Fxq "create_private_mailing_list" $COMPLETION_FILE; then
  1369. return
  1370. fi
  1371. if [ ! $PRIVATE_MAILING_LIST ]; then
  1372. return
  1373. fi
  1374. if [ $PRIVATE_MAILING_LIST == $MY_USERNAME ]; then
  1375. echo 'The name of the private mailing list should not be the'
  1376. echo 'same as your username'
  1377. exit 10
  1378. fi
  1379. if [ ! $MY_GPG_PUBLIC_KEY ]; then
  1380. echo 'To create a private mailing list you need to specify a file'
  1381. echo 'containing your exported GPG key within MY_GPG_PUBLIC_KEY at'
  1382. echo 'the top of the script'
  1383. exit 11
  1384. fi
  1385. apt-get -y --force-yes install ruby ruby-dev ruby-gpgme libgpgme11-dev libmagic-dev
  1386. gem install schleuder
  1387. schleuder-fix-gem-dependencies
  1388. schleuder-init-setup --gem
  1389. # NOTE: this is version number sensitive and so might need changing
  1390. ln -s /var/lib/gems/2.1.0/gems/schleuder-2.2.4 /var/lib/schleuder
  1391. sed -i 's/#smtp_port: 25/smtp_port: 465/g' /etc/schleuder/schleuder.conf
  1392. sed -i 's/#superadminaddr: root@localhost/superadminaddr: root@localhost' /etc/schleuder/schleuder.conf
  1393. 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
  1394. emailrule $MY_USERNAME $PRIVATE_MAILING_LIST@$DOMAIN_NAME $PRIVATE_MAILING_LIST
  1395. echo 'schleuder:' > /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1396. echo ' debug_print = "R: schleuder for $local_part@$domain"' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1397. echo ' driver = accept' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1398. echo ' local_part_suffix_optional' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1399. echo ' local_part_suffix = +* : -bounce : -sendkey' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1400. echo ' domains = +local_domains' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1401. echo ' user = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1402. echo ' group = schleuder' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1403. echo ' require_files = schleuder:+/var/lib/schleuder/$domain/${local_part}' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1404. echo ' transport = schleuder_transport' >> /etc/exim4/conf.d/router/550_exim4-config_schleuder
  1405. echo 'schleuder_transport:' > /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1406. echo ' debug_print = "T: schleuder_transport for $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1407. echo ' driver = pipe' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1408. echo ' home_directory = "/var/lib/schleuder/$domain/$local_part"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1409. echo ' command = "/usr/bin/schleuder $local_part@$domain"' >> /etc/exim4/conf.d/transport/30_exim4-config_schleuder
  1410. chown -R schleuder:schleuder /var/lib/schleuder
  1411. update-exim4.conf.template -r
  1412. update-exim4.conf
  1413. service exim4 restart
  1414. useradd -d /var/schleuderlists -s /bin/false schleuder
  1415. adduser Debian-exim schleuder
  1416. usermod -a -G mail schleuder
  1417. #exim -d -bt $PRIVATE_MAILING_LIST@$DOMAIN_NAME
  1418. echo 'create_private_mailing_list' >> $COMPLETION_FILE
  1419. }
  1420. function import_email {
  1421. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" || $SYSTEM_TYPE == "$VARIANT_NONMAILBOX" ]]; then
  1422. return
  1423. fi
  1424. EMAIL_COMPLETE_MSG=' *** Freedombone mailbox installation is complete ***'
  1425. if grep -Fxq "import_email" $COMPLETION_FILE; then
  1426. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  1427. echo $EMAIL_COMPLETE_MSG
  1428. if [ -d /media/usb ]; then
  1429. umount /media/usb
  1430. rm -rf /media/usb
  1431. echo ' You can now remove the USB drive'
  1432. fi
  1433. exit 0
  1434. fi
  1435. return
  1436. fi
  1437. if [ $IMPORT_MAILDIR ]; then
  1438. if [ -d $IMPORT_MAILDIR ]; then
  1439. echo 'Transfering email files'
  1440. cp -r $IMPORT_MAILDIR /home/$MY_USERNAME
  1441. chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/Maildir
  1442. else
  1443. echo "Email import directory $IMPORT_MAILDIR not found"
  1444. exit 9
  1445. fi
  1446. fi
  1447. echo 'import_email' >> $COMPLETION_FILE
  1448. if [[ $SYSTEM_TYPE == "$VARIANT_MAILBOX" ]]; then
  1449. apt-get -y --force-yes autoremove
  1450. # unmount any attached usb drive
  1451. echo ''
  1452. echo $EMAIL_COMPLETE_MSG
  1453. echo ''
  1454. if [ -d /media/usb ]; then
  1455. umount /media/usb
  1456. rm -rf /media/usb
  1457. echo ' You can now remove the USB drive'
  1458. fi
  1459. exit 0
  1460. fi
  1461. }
  1462. function install_web_server {
  1463. if [[ $SYSTEM_TYPE == "$VARIANT_CHAT" ]]; then
  1464. return
  1465. fi
  1466. if grep -Fxq "install_web_server" $COMPLETION_FILE; then
  1467. return
  1468. fi
  1469. # remove apache
  1470. apt-get -y remove --purge apache2
  1471. if [ -d /etc/apache2 ]; then
  1472. rm -rf /etc/apache2
  1473. fi
  1474. # install nginx
  1475. apt-get -y --force-yes install nginx php5-fpm git
  1476. # install a script to easily enable and disable nginx virtual hosts
  1477. if [ ! -d $INSTALL_DIR ]; then
  1478. mkdir $INSTALL_DIR
  1479. fi
  1480. cd $INSTALL_DIR
  1481. git clone https://github.com/perusio/nginx_ensite
  1482. cd $INSTALL_DIR/nginx_ensite
  1483. cp nginx_* /usr/sbin
  1484. nginx_dissite default
  1485. echo 'install_web_server' >> $COMPLETION_FILE
  1486. }
  1487. function configure_php {
  1488. sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
  1489. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  1490. sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
  1491. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  1492. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  1493. }
  1494. function install_owncloud {
  1495. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  1496. return
  1497. fi
  1498. OWNCLOUD_COMPLETION_MSG1=" *** Freedombone $SYSTEM_TYPE is now installed ***"
  1499. OWNCLOUD_COMPLETION_MSG2="Open $OWNCLOUD_DOMAIN_NAME in a web browser to complete the setup"
  1500. if grep -Fxq "install_owncloud" $COMPLETION_FILE; then
  1501. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1502. # unmount any attached usb drive
  1503. if [ -d /media/usb ]; then
  1504. umount /media/usb
  1505. rm -rf /media/usb
  1506. fi
  1507. echo ''
  1508. echo $OWNCLOUD_COMPLETION_MSG1
  1509. echo $OWNCLOUD_COMPLETION_MSG2
  1510. exit 0
  1511. fi
  1512. return
  1513. fi
  1514. # if this is exclusively a cloud setup
  1515. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1516. OWNCLOUD_DOMAIN_NAME=$DOMAIN_NAME
  1517. OWNCLOUD_FREEDNS_SUBDOMAIN_CODE=$FREEDNS_SUBDOMAIN_CODE
  1518. fi
  1519. if [ ! $OWNCLOUD_DOMAIN_NAME ]; then
  1520. return
  1521. fi
  1522. if ! [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1523. if [ ! $SYSTEM_TYPE ]; then
  1524. return
  1525. fi
  1526. fi
  1527. apt-get -y --force-yes install php5 php5-gd php-xml-parser php5-intl wget
  1528. apt-get -y --force-yes install php5-sqlite php5-mysql smbclient curl libcurl3 php5-curl bzip2
  1529. if [ ! -d /var/www/$OWNCLOUD_DOMAIN_NAME ]; then
  1530. mkdir /var/www/$OWNCLOUD_DOMAIN_NAME
  1531. mkdir /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  1532. fi
  1533. echo 'server {' > /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1534. echo ' listen 80;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1535. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1536. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1537. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1538. echo 'server {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1539. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1540. echo " root /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1541. echo " server_name $OWNCLOUD_DOMAIN_NAME;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1542. echo ' ssl on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1543. echo " ssl_certificate /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1544. echo " ssl_certificate_key /etc/ssl/private/$OWNCLOUD_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1545. echo " ssl_dhparam /etc/ssl/certs/$OWNCLOUD_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1546. echo ' ssl_session_timeout 5m;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1547. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1548. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1549. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1550. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1551. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1552. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1553. echo ' # if you want to be able to access the site via HTTP' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1554. echo ' # then replace the above with the following:' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1555. echo ' # add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1556. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1557. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1558. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1559. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1560. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1561. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1562. echo ' client_max_body_size 10G; # set max upload size' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1563. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1564. echo ' fastcgi_buffers 64 4K;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1565. echo ' rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1566. echo ' rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1567. echo ' rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1568. echo ' index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1569. echo ' error_page 403 /core/templates/403.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1570. echo ' error_page 404 /core/templates/404.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1571. echo ' location = /robots.txt {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1572. echo ' allow all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1573. echo ' log_not_found off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1574. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1575. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1576. echo ' location ~ ^/(data|config|\.ht|db_structure\.xml|README) {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1577. echo ' deny all;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1578. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1579. echo ' location / {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1580. echo ' # The following 2 rules are only needed with webfinger' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1581. echo ' rewrite ^/.well-known/host-meta /public.php?service=host-meta last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1582. echo ' rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1583. echo ' rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1584. echo ' rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1585. echo ' rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1586. echo ' try_files $uri $uri/ index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1587. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1588. echo ' location ~ ^(.+?\.php)(/.*)?$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1589. echo ' try_files $1 =404;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1590. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1591. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1592. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1593. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1594. echo ' fastcgi_param SCRIPT_FILENAME $document_root$1;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1595. echo ' fastcgi_param PATH_INFO $2;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1596. echo ' fastcgi_param HTTPS on;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1597. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1598. echo ' # Optional: set long EXPIRES header on static assets' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1599. echo ' location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1600. echo ' expires 30d;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1601. echo " # Optional: Don't log access to assets" >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1602. echo ' access_log off;' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1603. echo ' }' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1604. echo '}' >> /etc/nginx/sites-available/$OWNCLOUD_DOMAIN_NAME
  1605. configure_php
  1606. if [ ! -f /etc/ssl/private/$OWNCLOUD_DOMAIN_NAME.key ]; then
  1607. makecert $OWNCLOUD_DOMAIN_NAME
  1608. fi
  1609. # download owncloud
  1610. cd $INSTALL_DIR
  1611. if [ ! -f $INSTALL_DIR/$OWNCLOUD_ARCHIVE ]; then
  1612. wget $OWNCLOUD_DOWNLOAD
  1613. fi
  1614. if [ ! -f $INSTALL_DIR/$OWNCLOUD_ARCHIVE ]; then
  1615. echo 'Owncloud could not be downloaded. Check that it exists at '
  1616. echo $OWNCLOUD_DOWNLOAD
  1617. echo 'And if neccessary update the version number and hash within this script'
  1618. exit 18
  1619. fi
  1620. # Check that the hash is correct
  1621. CHECKSUM=$(sha256sum $OWNCLOUD_ARCHIVE | awk -F ' ' '{print $1}')
  1622. if [[ $CHECKSUM != $OWNCLOUD_HASH ]]; then
  1623. 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.'
  1624. echo $CHECKSUM
  1625. echo $OWNCLOUD_HASH
  1626. exit 19
  1627. fi
  1628. tar -xjf $OWNCLOUD_ARCHIVE
  1629. echo 'Copying files...'
  1630. cp -r owncloud/* /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  1631. chown -R www-data:www-data /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs/apps
  1632. chown -R www-data:www-data /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs/config
  1633. chown www-data:www-data /var/www/$OWNCLOUD_DOMAIN_NAME/htdocs
  1634. nginx_ensite $OWNCLOUD_DOMAIN_NAME
  1635. service php5-fpm restart
  1636. service nginx restart
  1637. # update the dynamic DNS
  1638. if [ $OWNCLOUD_FREEDNS_SUBDOMAIN_CODE ]; then
  1639. if [[ $OWNCLOUD_FREEDNS_SUBDOMAIN_CODE != $FREEDNS_SUBDOMAIN_CODE ]]; then
  1640. if ! grep -q "$OWNCLOUD_DOMAIN_NAME" /usr/bin/dynamicdns; then
  1641. echo "# $OWNCLOUD_DOMAIN_NAME" >> /usr/bin/dynamicdns
  1642. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$OWNCLOUD_FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  1643. fi
  1644. fi
  1645. else
  1646. echo 'WARNING: No freeDNS subdomain code given for Owncloud. It is assumed that you are using some other dynamic DNS provider.'
  1647. fi
  1648. echo 'install_owncloud' >> $COMPLETION_FILE
  1649. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" ]]; then
  1650. # unmount any attached usb drive
  1651. if [ -d /media/usb ]; then
  1652. umount /media/usb
  1653. rm -rf /media/usb
  1654. fi
  1655. echo ''
  1656. echo $OWNCLOUD_COMPLETION_MSG1
  1657. echo $OWNCLOUD_COMPLETION_MSG2
  1658. exit 0
  1659. fi
  1660. }
  1661. function install_xmpp {
  1662. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  1663. return
  1664. fi
  1665. if grep -Fxq "install_xmpp" $COMPLETION_FILE; then
  1666. return
  1667. fi
  1668. apt-get -y --force-yes install prosody
  1669. if [ ! -f "/etc/ssl/private/xmpp.key" ]; then
  1670. makecert xmpp
  1671. fi
  1672. chown prosody:prosody /etc/ssl/private/xmpp.key
  1673. chown prosody:prosody /etc/ssl/certs/xmpp.*
  1674. cp -a /etc/prosody/conf.avail/example.com.cfg.lua /etc/prosody/conf.avail/xmpp.cfg.lua
  1675. sed -i 's|/etc/prosody/certs/example.com.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  1676. sed -i 's|/etc/prosody/certs/example.com.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/conf.avail/xmpp.cfg.lua
  1677. if ! grep -q "xmpp.dhparam" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  1678. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/conf.avail/xmpp.cfg.lua
  1679. fi
  1680. sed -i "s/example.com/$DOMAIN_NAME/g" /etc/prosody/conf.avail/xmpp.cfg.lua
  1681. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/conf.avail/xmpp.cfg.lua
  1682. if ! grep -q "modules_enabled" /etc/prosody/conf.avail/xmpp.cfg.lua; then
  1683. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1684. echo 'modules_enabled = {' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1685. echo ' "bosh"; -- Enable mod_bosh' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1686. echo ' "tls"; -- Enable mod_tls' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1687. echo ' "saslauth"; -- Enable mod_saslauth' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1688. echo '}' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1689. echo '' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1690. echo 'c2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1691. echo 's2s_require_encryption = true' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1692. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1693. fi
  1694. ln -sf /etc/prosody/conf.avail/xmpp.cfg.lua /etc/prosody/conf.d/xmpp.cfg.lua
  1695. sed -i 's|/etc/prosody/certs/localhost.key|/etc/ssl/private/xmpp.key|g' /etc/prosody/prosody.cfg.lua
  1696. sed -i 's|/etc/prosody/certs/localhost.crt|/etc/ssl/certs/xmpp.crt|g' /etc/prosody/prosody.cfg.lua
  1697. if ! grep -q "xmpp.dhparam" /etc/prosody/prosody.cfg.lua; then
  1698. sed -i '/certificate =/a\ dhparam = "/etc/ssl/certs/xmpp.dhparam";' /etc/prosody/prosody.cfg.lua
  1699. fi
  1700. sed -i 's/c2s_require_encryption = false/c2s_require_encryption = true/g' /etc/prosody/prosody.cfg.lua
  1701. if ! grep -q "s2s_require_encryption" /etc/prosody/prosody.cfg.lua; then
  1702. sed -i '/c2s_require_encryption/a\s2s_require_encryption = true' /etc/prosody/prosody.cfg.lua
  1703. fi
  1704. if ! grep -q "allow_unencrypted_plain_auth" /etc/prosody/prosody.cfg.lua; then
  1705. echo 'allow_unencrypted_plain_auth = false' >> /etc/prosody/conf.avail/xmpp.cfg.lua
  1706. fi
  1707. sed -i 's/--"bosh";/"bosh";/g' /etc/prosody/prosody.cfg.lua
  1708. sed -i 's/authentication = "internal_plain"/authentication = "internal_hashed"/g' /etc/prosody/prosody.cfg.lua
  1709. sed -i 's/enabled = false -- Remove this line to enable this host//g' /etc/prosody/prosody.cfg.lua
  1710. sed -i 's/example.com/$DOMAIN_NAME/g' /etc/prosody/prosody.cfg.lua
  1711. service prosody restart
  1712. touch /home/$MY_USERNAME/README
  1713. if ! grep -q "Your XMPP password is" /home/$MY_USERNAME/README; then
  1714. XMPP_PASSWORD=$(openssl rand -base64 8)
  1715. prosodyctl register $MY_USERNAME $DOMAIN_NAME $XMPP_PASSWORD
  1716. echo "Your XMPP password is: $XMPP_PASSWORD" >> /home/$MY_USERNAME/README
  1717. echo 'You can change it with: ' >> /home/$MY_USERNAME/README
  1718. echo '' >> /home/$MY_USERNAME/README
  1719. echo " prosodyctl passwd $MY_USERNAME@$DOMAIN_NAME" >> /home/$MY_USERNAME/README
  1720. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  1721. fi
  1722. echo 'install_xmpp' >> $COMPLETION_FILE
  1723. }
  1724. function install_irc_server {
  1725. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  1726. return
  1727. fi
  1728. if grep -Fxq "install_irc_server" $COMPLETION_FILE; then
  1729. return
  1730. fi
  1731. apt-get -y --force-yes install ngircd
  1732. if [ ! "/etc/ssl/private/ngircd.key" ]; then
  1733. makecert ngircd
  1734. fi
  1735. echo '**************************************************' > /etc/ngircd/motd
  1736. echo '* F R E E D O M B O N E I R C *' >> /etc/ngircd/motd
  1737. echo '* *' >> /etc/ngircd/motd
  1738. echo '* Freedom in the Cloud *' >> /etc/ngircd/motd
  1739. echo '**************************************************' >> /etc/ngircd/motd
  1740. sed -i 's|MotdFile = /etc/ngircd/ngircd.motd|MotdFile = /etc/ngircd/motd|g' /etc/ngircd/ngircd.conf
  1741. sed -i "s/irc@irc.example.com/$MY_USERNAME@$DOMAIN_NAME/g" /etc/ngircd/ngircd.conf
  1742. sed -i "s/irc.example.net/$DOMAIN_NAME/g" /etc/ngircd/ngircd.conf
  1743. sed -i "s|Yet another IRC Server running on Debian GNU/Linux|IRC Server of $DOMAIN_NAME|g" /etc/ngircd/ngircd.conf
  1744. sed -i 's/;Password = wealllikedebian/Password =/g' /etc/ngircd/ngircd.conf
  1745. sed -i 's|;CertFile = /etc/ssl/certs/server.crt|CertFile = /etc/ssl/certs/ngircd.crt|g' /etc/ngircd/ngircd.conf
  1746. sed -i 's|;DHFile = /etc/ngircd/dhparams.pem|DHFile = /etc/ssl/certs/ngircd.dhparam|g' /etc/ngircd/ngircd.conf
  1747. sed -i 's|;KeyFile = /etc/ssl/private/server.key|KeyFile = /etc/ssl/private/ngircd.key|g' /etc/ngircd/ngircd.conf
  1748. sed -i 's/;Ports = 6697, 9999/Ports = 6697, 9999/g' /etc/ngircd/ngircd.conf
  1749. sed -i 's/;Name = #ngircd/Name = #freedombone/g' /etc/ngircd/ngircd.conf
  1750. sed -i 's/;Topic = Our ngircd testing channel/Topic = Freedombone chat channel/g' /etc/ngircd/ngircd.conf
  1751. sed -i 's/;MaxUsers = 23/MaxUsers = 23/g' /etc/ngircd/ngircd.conf
  1752. sed -i 's|;KeyFile = /etc/ngircd/#chan.key|KeyFile = /etc/ngircd/#freedombone.key|g' /etc/ngircd/ngircd.conf
  1753. sed -i 's/;CloakHost = cloaked.host/CloakHost = cloaked.host/g' /etc/ngircd/ngircd.conf
  1754. IRC_SALT=$(openssl rand -base64 32)
  1755. IRC_OPERATOR_PASSWORD=$(openssl rand -base64 8)
  1756. sed -i "s|;CloakHostSalt = abcdefghijklmnopqrstuvwxyz|CloakHostSalt = $IRC_SALT|g" /etc/ngircd/ngircd.conf
  1757. sed -i 's/;ConnectIPv4 = yes/ConnectIPv4 = yes/g' /etc/ngircd/ngircd.conf
  1758. sed -i 's/;MorePrivacy = no/MorePrivacy = yes/g' /etc/ngircd/ngircd.conf
  1759. sed -i 's/;RequireAuthPing = no/RequireAuthPing = no/g' /etc/ngircd/ngircd.conf
  1760. sed -i "s/;Name = TheOper/Name = $MY_USERNAME/g" /etc/ngircd/ngircd.conf
  1761. sed -i "s/;Password = ThePwd/Password = $IRC_OPERATOR_PASSWORD/g" /etc/ngircd/ngircd.conf
  1762. service ngircd restart
  1763. echo 'install_irc_server' >> $COMPLETION_FILE
  1764. }
  1765. function install_wiki {
  1766. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  1767. return
  1768. fi
  1769. if grep -Fxq "install_wiki" $COMPLETION_FILE; then
  1770. return
  1771. fi
  1772. # if this is exclusively a writer setup
  1773. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  1774. WIKI_DOMAIN_NAME=$DOMAIN_NAME
  1775. WIKI_FREEDNS_SUBDOMAIN_CODE=$FREEDNS_SUBDOMAIN_CODE
  1776. fi
  1777. if [ ! $WIKI_DOMAIN_NAME ]; then
  1778. return
  1779. fi
  1780. if ! [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  1781. if [ ! $SYSTEM_TYPE ]; then
  1782. return
  1783. fi
  1784. fi
  1785. apt-get -y --force-yes install php5 php5-gd php-xml-parser php5-intl wget
  1786. apt-get -y --force-yes install php5-sqlite php5-mysql smbclient curl libcurl3 php5-curl bzip2
  1787. if [ ! -d /var/www/$WIKI_DOMAIN_NAME ]; then
  1788. mkdir /var/www/$WIKI_DOMAIN_NAME
  1789. fi
  1790. if [ ! -d /var/www/$WIKI_DOMAIN_NAME/htdocs ]; then
  1791. mkdir /var/www/$WIKI_DOMAIN_NAME/htdocs
  1792. fi
  1793. if [ ! -f /etc/ssl/private/$WIKI_DOMAIN_NAME.key ]; then
  1794. makecert $WIKI_DOMAIN_NAME
  1795. fi
  1796. # download the archive
  1797. cd $INSTALL_DIR
  1798. if [ ! -f $INSTALL_DIR/$WIKI_ARCHIVE ]; then
  1799. wget $WIKI_DOWNLOAD
  1800. fi
  1801. if [ ! -f $INSTALL_DIR/$WIKI_ARCHIVE ]; then
  1802. echo 'Dokuwiki could not be downloaded. Check that it exists at '
  1803. echo $WIKI_DOWNLOAD
  1804. echo 'And if neccessary update the version number and hash within this script'
  1805. exit 18
  1806. fi
  1807. # Check that the hash is correct
  1808. CHECKSUM=$(sha256sum $WIKI_ARCHIVE | awk -F ' ' '{print $1}')
  1809. if [[ $CHECKSUM != $WIKI_HASH ]]; then
  1810. 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.'
  1811. echo $CHECKSUM
  1812. echo $WIKI_HASH
  1813. exit 21
  1814. fi
  1815. tar -xzvf $WIKI_ARCHIVE
  1816. cd dokuwiki-*
  1817. mv * /var/www/$WIKI_DOMAIN_NAME/htdocs/
  1818. chmod -R 755 /var/www/$WIKI_DOMAIN_NAME/htdocs
  1819. chown -R www-data:www-data /var/www/$WIKI_DOMAIN_NAME/htdocs
  1820. if ! grep -q "video/ogg" /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf; then
  1821. echo 'ogv video/ogg' >> /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf
  1822. echo 'mp4 video/mp4' >> /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf
  1823. echo 'webm video/webm' >> /var/www/$WIKI_DOMAIN_NAME/htdocs/conf/mime.conf
  1824. fi
  1825. echo 'server {' > /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1826. echo ' listen 80;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1827. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1828. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1829. echo " error_log /var/www/$WIKI_DOMAIN_NAME/error.log;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1830. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1831. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1832. echo ' # Uncomment this if you need to redirect HTTP to HTTPS' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1833. echo ' #rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1834. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1835. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1836. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1837. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1838. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1839. echo ' location ~ \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1840. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1841. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1842. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1843. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1844. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1845. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1846. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1847. echo 'server {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1848. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1849. echo " root /var/www/$WIKI_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1850. echo " server_name $WIKI_DOMAIN_NAME;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1851. echo " error_log /var/www/$WIKI_DOMAIN_NAME/error_ssl.log;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1852. echo ' index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1853. echo ' charset utf-8;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1854. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1855. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1856. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1857. echo ' ssl on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1858. echo " ssl_certificate /etc/ssl/certs/$WIKI_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1859. echo " ssl_certificate_key /etc/ssl/private/$WIKI_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1860. echo " ssl_dhparam /etc/ssl/certs/$WIKI_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1861. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1862. echo ' ssl_session_timeout 5m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1863. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1864. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1865. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1866. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1867. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1868. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1869. echo ' add_header Strict-Transport-Security "max-age=0;";' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1870. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1871. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1872. echo ' location / {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1873. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1874. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1875. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1876. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1877. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1878. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1879. echo ' allow all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1880. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1881. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1882. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1883. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1884. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1885. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1886. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1887. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1888. echo ' expires 30d;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1889. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1890. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1891. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1892. echo ' # block these file types' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1893. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1894. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1895. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1896. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1897. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1898. echo ' # or a unix socket' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1899. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1900. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1901. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1902. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1903. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1904. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1905. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1906. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1907. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1908. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1909. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1910. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1911. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1912. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1913. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1914. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1915. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1916. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1917. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1918. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1919. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1920. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1921. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1922. echo '' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1923. echo ' #deny access to store' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1924. echo ' location ~ /store {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1925. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1926. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1927. echo ' location ~ /(data|conf|bin|inc)/ {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1928. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1929. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1930. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1931. echo ' deny all;' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1932. echo ' }' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1933. echo '}' >> /etc/nginx/sites-available/$WIKI_DOMAIN_NAME
  1934. configure_php
  1935. nginx_ensite $WIKI_DOMAIN_NAME
  1936. service php5-fpm restart
  1937. service nginx restart
  1938. # update the dynamic DNS
  1939. if [ $WIKI_FREEDNS_SUBDOMAIN_CODE ]; then
  1940. if [[ $WIKI_FREEDNS_SUBDOMAIN_CODE != $FREEDNS_SUBDOMAIN_CODE ]]; then
  1941. if ! grep -q "$WIKI_DOMAIN_NAME" /usr/bin/dynamicdns; then
  1942. echo "# $WIKI_DOMAIN_NAME" >> /usr/bin/dynamicdns
  1943. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$WIKI_FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  1944. fi
  1945. fi
  1946. else
  1947. echo 'WARNING: No freeDNS subdomain code given for wiki installation. It is assumed that you are using some other dynamic DNS provider.'
  1948. fi
  1949. # add some post-install instructions
  1950. if ! grep -q "Once you have set up the wiki" /home/$MY_USERNAME/README; then
  1951. echo '' >> /home/$MY_USERNAME/README
  1952. echo 'Once you have set up the wiki then remove the install file:' >> /home/$MY_USERNAME/README
  1953. echo '' >> /home/$MY_USERNAME/README
  1954. echo " rm /var/www/$WIKI_DOMAIN_NAME/htdocs/install.php" >> /home/$MY_USERNAME/README
  1955. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  1956. fi
  1957. echo 'install_wiki' >> $COMPLETION_FILE
  1958. }
  1959. function install_blog {
  1960. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" || $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  1961. return
  1962. fi
  1963. if grep -Fxq "install_blog" $COMPLETION_FILE; then
  1964. return
  1965. fi
  1966. # if this is exclusively a writer setup
  1967. if [[ $SYSTEM_TYPE == "$VARIANT_WRITER" ]]; then
  1968. WIKI_DOMAIN_NAME=$DOMAIN_NAME
  1969. WIKI_FREEDNS_SUBDOMAIN_CODE=$FREEDNS_SUBDOMAIN_CODE
  1970. fi
  1971. if [ ! $WIKI_DOMAIN_NAME ]; then
  1972. return
  1973. fi
  1974. apt-get -y --force-yes install unzip
  1975. # download mnml-blog
  1976. cd $INSTALL_DIR
  1977. rm -f latest
  1978. wget $WIKI_MNML_BLOG_ADDON
  1979. if [ ! -f "$INSTALL_DIR/latest" ]; then
  1980. 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.'
  1981. exit 21
  1982. fi
  1983. mv latest $WIKI_MNML_BLOG_ADDON_ARCHIVE
  1984. # Check that the mnml-blog download hash is correct
  1985. CHECKSUM=$(sha256sum $WIKI_MNML_BLOG_ADDON_ARCHIVE | awk -F ' ' '{print $1}')
  1986. if [[ $CHECKSUM != $WIKI_MNML_BLOG_ADDON_HASH ]]; then
  1987. 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.'
  1988. echo $CHECKSUM
  1989. echo $WIKI_MNML_BLOG_ADDON_HASH
  1990. exit 22
  1991. fi
  1992. # download blogTNG
  1993. wget $WIKI_BLOGTNG_ADDON
  1994. if [ ! -f "$INSTALL_DIR/master" ]; then
  1995. 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.'
  1996. exit 23
  1997. fi
  1998. mv master $WIKI_BLOGTNG_ADDON_ARCHIVE
  1999. # Check that the blogTNG hash is correct
  2000. CHECKSUM=$(sha256sum $WIKI_BLOGTNG_ADDON_ARCHIVE | awk -F ' ' '{print $1}')
  2001. if [[ $CHECKSUM != $WIKI_BLOGTNG_ADDON_HASH ]]; then
  2002. 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.'
  2003. echo $CHECKSUM
  2004. echo $WIKI_BLOGTNG_ADDON_HASH
  2005. exit 24
  2006. fi
  2007. # download dokuwiki sqlite plugin
  2008. wget $WIKI_SQLITE_ADDON
  2009. if [ ! -f "$INSTALL_DIR/master" ]; then
  2010. 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.'
  2011. exit 25
  2012. fi
  2013. mv master $WIKI_SQLITE_ADDON_ARCHIVE
  2014. # Check that the sqlite plugin hash is correct
  2015. CHECKSUM=$(sha256sum $WIKI_SQLITE_ADDON_ARCHIVE | awk -F ' ' '{print $1}')
  2016. if [[ $CHECKSUM != $WIKI_SQLITE_ADDON_HASH ]]; then
  2017. 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.'
  2018. echo $CHECKSUM
  2019. echo $WIKI_SQLITE_ADDON_HASH
  2020. exit 26
  2021. fi
  2022. # install dokuwiki sqlite plugin
  2023. tar -xzvf $WIKI_SQLITE_ADDON_ARCHIVE
  2024. if [ -d "$INSTALL_DIR/sqlite" ]; then
  2025. rm -rf $INSTALL_DIR/sqlite
  2026. fi
  2027. mv $WIKI_SQLITE_ADDON_NAME sqlite
  2028. cp -r sqlite /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/plugins/
  2029. # install blogTNG
  2030. if [ -d "$INSTALL_DIR/$WIKI_BLOGTNG_ADDON_NAME" ]; then
  2031. rm -rf $INSTALL_DIR/$WIKI_BLOGTNG_ADDON_NAME
  2032. fi
  2033. unzip $WIKI_BLOGTNG_ADDON_ARCHIVE
  2034. if [ -d "$INSTALL_DIR/blogtng" ]; then
  2035. rm -rf $INSTALL_DIR/blogtng
  2036. fi
  2037. mv $WIKI_BLOGTNG_ADDON_NAME blogtng
  2038. cp -r blogtng /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/plugins/
  2039. # install mnml-blog
  2040. tar -xzvf $WIKI_MNML_BLOG_ADDON_ARCHIVE
  2041. cp -r mnml-blog /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/tpl
  2042. 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/
  2043. # make a "freedombone" template so that if the default template gets
  2044. # changed after an upgrade to blogTNG this doesn't necessarily change the appearance
  2045. cp -r /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/plugins/blogtng/tpl/default /var/www/$WIKI_DOMAIN_NAME/htdocs/lib/plugins/blogtng/tpl/freedombone
  2046. if ! grep -q "To set up your blog" /home/$MY_USERNAME/README; then
  2047. echo '' >> /home/$MY_USERNAME/README
  2048. echo "To set up your blog go to" >> /home/$MY_USERNAME/README
  2049. echo "https://$WIKI_DOMAIN_NAME/doku.php?id=start&do=admin&page=config" >> /home/$MY_USERNAME/README
  2050. echo 'and set the template to mnml-blog' >> /home/$MY_USERNAME/README
  2051. echo '' >> /home/$MY_USERNAME/README
  2052. echo 'To edit things on the right hand sidebar (links, blogroll, etc) go to' >> /home/$MY_USERNAME/README
  2053. echo "https://$WIKI_DOMAIN_NAME/doku.php?id=wiki:navigation_sidebar" >> /home/$MY_USERNAME/README
  2054. echo 'and edit the page' >> /home/$MY_USERNAME/README
  2055. echo '' >> /home/$MY_USERNAME/README
  2056. echo 'To edit things to a header bar (home, contacts, etc) go to' >> /home/$MY_USERNAME/README
  2057. echo "https://$WIKI_DOMAIN_NAME/doku.php?id=wiki:navigation_header" >> /home/$MY_USERNAME/README
  2058. echo 'and select the "create this page" at the bottom.' >> /home/$MY_USERNAME/README
  2059. echo 'You can then add somethething like:' >> /home/$MY_USERNAME/README
  2060. echo ' * [[:start|Home]]' >> /home/$MY_USERNAME/README
  2061. echo ' * [[:wiki|Wiki]]' >> /home/$MY_USERNAME/README
  2062. echo ' * [[:contact|Contact]]' >> /home/$MY_USERNAME/README
  2063. echo "Go to https://$WIKI_DOMAIN_NAME/doku.php?id=start&do=admin&page=config" >> /home/$MY_USERNAME/README
  2064. echo 'and check "Show header navigation" to ensure that the header shows' >> /home/$MY_USERNAME/README
  2065. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2066. fi
  2067. echo 'install_blog' >> $COMPLETION_FILE
  2068. }
  2069. function get_mariadb_password {
  2070. if [ -f /home/$MY_USERNAME/README ]; then
  2071. if grep -q "MariaDB password" /home/$MY_USERNAME/README; then
  2072. MARIADB_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2073. fi
  2074. fi
  2075. }
  2076. function get_mariadb_gnusocial_admin_password {
  2077. if [ -f /home/$MY_USERNAME/README ]; then
  2078. if grep -q "MariaDB gnusocial admin password" /home/$MY_USERNAME/README; then
  2079. MICROBLOG_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB gnusocial admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2080. fi
  2081. fi
  2082. }
  2083. function get_mariadb_redmatrix_admin_password {
  2084. if [ -f /home/$MY_USERNAME/README ]; then
  2085. if grep -q "MariaDB Red Matrix admin password" /home/$MY_USERNAME/README; then
  2086. REDMATRIX_ADMIN_PASSWORD=$(cat /home/$MY_USERNAME/README | grep "MariaDB Red Matrix admin password" | awk -F ':' '{print $2}' | sed 's/^ *//')
  2087. fi
  2088. fi
  2089. }
  2090. function install_mariadb {
  2091. if grep -Fxq "install_mariadb" $COMPLETION_FILE; then
  2092. return
  2093. fi
  2094. apt-get -y --force-yes install python-software-properties debconf-utils
  2095. apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db
  2096. add-apt-repository 'deb http://mariadb.biz.net.id//repo/10.1/debian sid main'
  2097. apt-get -y --force-yes install software-properties-common
  2098. apt-get -y update
  2099. get_mariadb_password
  2100. if [ ! $MARIADB_PASSWORD ]; then
  2101. MARIADB_PASSWORD=$(openssl rand -base64 32)
  2102. echo '' >> /home/$MY_USERNAME/README
  2103. echo "Your MariaDB password is: $MARIADB_PASSWORD" >> /home/$MY_USERNAME/README
  2104. echo '' >> /home/$MY_USERNAME/README
  2105. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2106. fi
  2107. debconf-set-selections <<< "mariadb-server mariadb-server/root_password password $MARIADB_PASSWORD"
  2108. debconf-set-selections <<< "mariadb-server mariadb-server/root_password_again password $MARIADB_PASSWORD"
  2109. apt-get -y --force-yes install mariadb-server
  2110. mysqladmin -u root password "$MARIADB_PASSWORD"
  2111. echo 'install_mariadb' >> $COMPLETION_FILE
  2112. }
  2113. function install_gnu_social {
  2114. if grep -Fxq "install_gnu_social" $COMPLETION_FILE; then
  2115. return
  2116. fi
  2117. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  2118. return
  2119. fi
  2120. if [ ! $MICROBLOG_DOMAIN_NAME ]; then
  2121. return
  2122. fi
  2123. install_mariadb
  2124. get_mariadb_password
  2125. apt-get -y --force-yes install php-gettext php5-curl php5-gd php5-mysql git
  2126. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME ]; then
  2127. mkdir /var/www/$MICROBLOG_DOMAIN_NAME
  2128. fi
  2129. if [ ! -d /var/www/$MICROBLOG_DOMAIN_NAME/htdocs ]; then
  2130. mkdir /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  2131. fi
  2132. if [ ! -f /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/index.php ]; then
  2133. cd $INSTALL_DIR
  2134. git clone $MICROBLOG_REPO gnusocial
  2135. rm -rf /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  2136. mv gnusocial /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  2137. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  2138. chown www-data:www-data /var/www/$MICROBLOG_DOMAIN_NAME/htdocs
  2139. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/avatar
  2140. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/background
  2141. chmod a+w /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/file
  2142. chmod +x /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php
  2143. fi
  2144. get_mariadb_gnusocial_admin_password
  2145. if [ ! $MICROBLOG_ADMIN_PASSWORD ]; then
  2146. MICROBLOG_ADMIN_PASSWORD=$(openssl rand -base64 32)
  2147. echo '' >> /home/$MY_USERNAME/README
  2148. echo "Your MariaDB gnusocial admin password is: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  2149. echo '' >> /home/$MY_USERNAME/README
  2150. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2151. fi
  2152. echo "create database gnusocial;
  2153. CREATE USER 'gnusocialadmin'@'localhost' IDENTIFIED BY '$MICROBLOG_ADMIN_PASSWORD';
  2154. GRANT ALL PRIVILEGES ON gnusocial.* TO 'gnusocialadmin'@'localhost';
  2155. quit" > $INSTALL_DIR/batch.sql
  2156. chmod 600 $INSTALL_DIR/batch.sql
  2157. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  2158. shred -zu $INSTALL_DIR/batch.sql
  2159. if [ ! -f "/etc/aliases" ]; then
  2160. touch /etc/aliases
  2161. fi
  2162. if grep -q "www-data: root" /etc/aliases; then
  2163. echo 'www-data: root' >> /etc/aliases
  2164. fi
  2165. if grep -q "/var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" /etc/aliases; then
  2166. echo "*: /var/www/$MICROBLOG_DOMAIN_NAME/htdocs/scripts/maildaemon.php" >> /etc/aliases
  2167. fi
  2168. newaliases
  2169. # update the dynamic DNS
  2170. if [ $MICROBLOG_FREEDNS_SUBDOMAIN_CODE ]; then
  2171. if [[ $MICROBLOG_FREEDNS_SUBDOMAIN_CODE != $FREEDNS_SUBDOMAIN_CODE ]]; then
  2172. if ! grep -q "$MICROBLOG_DOMAIN_NAME" /usr/bin/dynamicdns; then
  2173. echo "# $MICROBLOG_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2174. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$MICROBLOG_FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  2175. fi
  2176. fi
  2177. else
  2178. echo 'WARNING: No freeDNS subdomain code given for microblog. It is assumed that you are using some other dynamic DNS provider.'
  2179. fi
  2180. echo 'server {' > /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2181. echo ' listen 80;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2182. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2183. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2184. echo " error_log /var/www/$MICROBLOG_DOMAIN_NAME/error.log;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2185. echo ' index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2186. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2187. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2188. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2189. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2190. echo 'server {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2191. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2192. echo " root /var/www/$MICROBLOG_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2193. echo " server_name $MICROBLOG_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2194. echo " error_log /var/www/$MICROBLOG_DOMAIN_NAME/error_ssl.log;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2195. echo ' index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2196. echo ' charset utf-8;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2197. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2198. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2199. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2200. echo ' ssl on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2201. echo " ssl_certificate /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2202. echo " ssl_certificate_key /etc/ssl/private/$MICROBLOG_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2203. echo " ssl_dhparam /etc/ssl/certs/$MICROBLOG_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2204. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2205. echo ' ssl_session_timeout 5m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2206. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2207. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2208. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2209. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2210. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2211. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2212. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2213. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2214. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2215. echo ' location / {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2216. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2217. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2218. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2219. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2220. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2221. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2222. echo ' allow all;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2223. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2224. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2225. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2226. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2227. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2228. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2229. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2230. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2231. echo ' expires 30d;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2232. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2233. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2234. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2235. echo ' # block these file types' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2236. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2237. echo ' deny all;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2238. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2239. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2240. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2241. echo ' # or a unix socket' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2242. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2243. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2244. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2245. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2246. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2247. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2248. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2249. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2250. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2251. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2252. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2253. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2254. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2255. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2256. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2257. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2258. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2259. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2260. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2261. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2262. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2263. echo ' deny all;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2264. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2265. echo '' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2266. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2267. echo ' deny all;' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2268. echo ' }' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2269. echo '}' >> /etc/nginx/sites-available/$MICROBLOG_DOMAIN_NAME
  2270. configure_php
  2271. if [ ! -f /etc/ssl/private/$MICROBLOG_DOMAIN_NAME.key ]; then
  2272. makecert $MICROBLOG_DOMAIN_NAME
  2273. fi
  2274. nginx_ensite $MICROBLOG_DOMAIN_NAME
  2275. service php5-fpm restart
  2276. service nginx restart
  2277. # some post-install instructions for the user
  2278. if ! grep -q "To set up your microblog" /home/$MY_USERNAME/README; then
  2279. echo '' >> /home/$MY_USERNAME/README
  2280. echo "To set up your microblog go to" >> /home/$MY_USERNAME/README
  2281. echo "https://$MICROBLOG_DOMAIN_NAME/install.php" >> /home/$MY_USERNAME/README
  2282. echo 'and enter the following settings:' >> /home/$MY_USERNAME/README
  2283. echo ' - Set a name for the site' >> /home/$MY_USERNAME/README
  2284. echo ' - Server SSL: enable' >> /home/$MY_USERNAME/README
  2285. echo ' - Hostname: localhost' >> /home/$MY_USERNAME/README
  2286. echo ' - Type: MySql/MariaDB' >> /home/$MY_USERNAME/README
  2287. echo ' - Name: gnusocial' >> /home/$MY_USERNAME/README
  2288. echo ' - DB username: gnusocialadmin' >> /home/$MY_USERNAME/README
  2289. echo " - DB Password; $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  2290. echo " - Administrator nickname: $MY_USERNAME" >> /home/$MY_USERNAME/README
  2291. echo " - Administrator password: $MICROBLOG_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  2292. echo ' - Subscribe to announcements: ticked' >> /home/$MY_USERNAME/README
  2293. echo ' - Site profile: Community' >> /home/$MY_USERNAME/README
  2294. echo '' >> /home/$MY_USERNAME/README
  2295. echo "Navigate to https://$MICROBLOG_DOMAIN_NAME and you can then " >> /home/$MY_USERNAME/README
  2296. echo 'complete the configuration via the *Admin* section on the header' >> /home/$MY_USERNAME/README
  2297. echo 'bar. Some recommended admin settings are:' >> /home/$MY_USERNAME/README
  2298. echo '' >> /home/$MY_USERNAME/README
  2299. echo 'Under the *Site* settings:' >> /home/$MY_USERNAME/README
  2300. echo ' Text limit: 140' >> /home/$MY_USERNAME/README
  2301. echo ' Dupe Limit: 60000' >> /home/$MY_USERNAME/README
  2302. echo '' >> /home/$MY_USERNAME/README
  2303. echo 'Under the *User* settings:' >> /home/$MY_USERNAME/README
  2304. echo ' Bio limit: 1000' >> /home/$MY_USERNAME/README
  2305. echo '' >> /home/$MY_USERNAME/README
  2306. echo 'Under the *Access* settings:' >> /home/$MY_USERNAME/README
  2307. echo ' /Invite only/ ticked' >> /home/$MY_USERNAME/README
  2308. echo '' >> /home/$MY_USERNAME/README
  2309. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2310. fi
  2311. echo 'install_gnu_social' >> $COMPLETION_FILE
  2312. }
  2313. function install_redmatrix {
  2314. if grep -Fxq "install_redmatrix" $COMPLETION_FILE; then
  2315. return
  2316. fi
  2317. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  2318. return
  2319. fi
  2320. # if this is exclusively a writer setup
  2321. if [[ $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  2322. REDMATRIX_DOMAIN_NAME=$DOMAIN_NAME
  2323. REDMATRIX_FREEDNS_SUBDOMAIN_CODE=$FREEDNS_SUBDOMAIN_CODE
  2324. fi
  2325. if [ ! $REDMATRIX_DOMAIN_NAME ]; then
  2326. return
  2327. fi
  2328. install_mariadb
  2329. get_mariadb_password
  2330. apt-get -y --force-yes install php5-common php5-cli php5-curl php5-gd php5-mysql php5-mcrypt git git
  2331. if [ ! -d /var/www/$REDMATRIX_DOMAIN_NAME ]; then
  2332. mkdir /var/www/$REDMATRIX_DOMAIN_NAME
  2333. fi
  2334. if [ ! -d /var/www/$REDMATRIX_DOMAIN_NAME/htdocs ]; then
  2335. mkdir /var/www/$REDMATRIX_DOMAIN_NAME/htdocs
  2336. fi
  2337. if [ ! -f /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/index.php ]; then
  2338. cd $INSTALL_DIR
  2339. git clone $REDMATRIX_REPO redmatrix
  2340. rm -rf /var/www/$REDMATRIX_DOMAIN_NAME/htdocs
  2341. mv redmatrix /var/www/$REDMATRIX_DOMAIN_NAME/htdocs
  2342. chown -R www-data:www-data /var/www/$REDMATRIX_DOMAIN_NAME/htdocs
  2343. git clone $REDMATRIX_ADDONS_REPO /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/addon
  2344. fi
  2345. get_mariadb_redmatrix_admin_password
  2346. if [ ! $REDMATRIX_ADMIN_PASSWORD ]; then
  2347. REDMATRIX_ADMIN_PASSWORD=$(openssl rand -base64 32)
  2348. echo '' >> /home/$MY_USERNAME/README
  2349. echo "Your MariaDB Red Matrix admin password is: $REDMATRIX_ADMIN_PASSWORD" >> /home/$MY_USERNAME/README
  2350. echo '' >> /home/$MY_USERNAME/README
  2351. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2352. fi
  2353. echo "create database redmatrix;
  2354. CREATE USER 'redmatrixadmin'@'localhost' IDENTIFIED BY '$REDMATRIX_ADMIN_PASSWORD';
  2355. GRANT ALL PRIVILEGES ON redmatrix.* TO 'redmatrixadmin'@'localhost';
  2356. quit" > $INSTALL_DIR/batch.sql
  2357. chmod 600 $INSTALL_DIR/batch.sql
  2358. mysql -u root --password="$MARIADB_PASSWORD" < $INSTALL_DIR/batch.sql
  2359. shred -zu $INSTALL_DIR/batch.sql
  2360. if ! grep -q "/var/www/$REDMATRIX_DOMAIN_NAME/htdocs" /etc/crontab; then
  2361. echo "12,22,32,42,52 * * * * root cd /var/www/$REDMATRIX_DOMAIN_NAME/htdocs; /usr/bin/timeout 240 /usr/bin/php include/poller.php" >> /etc/crontab
  2362. fi
  2363. # update the dynamic DNS
  2364. if [ $REDMATRIX_FREEDNS_SUBDOMAIN_CODE ]; then
  2365. if [[ $REDMATRIX_FREEDNS_SUBDOMAIN_CODE != $FREEDNS_SUBDOMAIN_CODE ]]; then
  2366. if ! grep -q "$REDMATRIX_DOMAIN_NAME" /usr/bin/dynamicdns; then
  2367. echo "# $REDMATRIX_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2368. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$REDMATRIX_FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  2369. fi
  2370. fi
  2371. else
  2372. echo 'WARNING: No freeDNS code given for Red Matrix. It is assumed that you are using some other dynamic DNS provider.'
  2373. fi
  2374. echo 'server {' > /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2375. echo ' listen 80;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2376. echo " server_name $REDMATRIX_DOMAIN_NAME;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2377. echo " root /var/www/$REDMATRIX_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2378. echo " error_log /var/www/$REDMATRIX_DOMAIN_NAME/error.log;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2379. echo ' index index.php;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2380. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2381. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2382. echo '}' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2383. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2384. echo 'server {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2385. echo ' listen 443 ssl;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2386. echo " root /var/www/$REDMATRIX_DOMAIN_NAME/htdocs;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2387. echo " server_name $REDMATRIX_DOMAIN_NAME;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2388. echo " error_log /var/www/$REDMATRIX_DOMAIN_NAME/error_ssl.log;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2389. echo ' index index.php;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2390. echo ' charset utf-8;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2391. echo ' client_max_body_size 20m;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2392. echo ' client_body_buffer_size 128k;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2393. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2394. echo ' ssl on;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2395. echo " ssl_certificate /etc/ssl/certs/$REDMATRIX_DOMAIN_NAME.crt;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2396. echo " ssl_certificate_key /etc/ssl/private/$REDMATRIX_DOMAIN_NAME.key;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2397. echo " ssl_dhparam /etc/ssl/certs/$REDMATRIX_DOMAIN_NAME.dhparam;" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2398. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2399. echo ' ssl_session_timeout 5m;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2400. echo ' ssl_prefer_server_ciphers on;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2401. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2402. echo " ssl_protocols $SSL_PROTOCOLS; # not possible to do exclusive" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2403. echo " ssl_ciphers '$SSL_CIPHERS';" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2404. echo ' add_header X-Frame-Options DENY;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2405. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2406. echo ' add_header Strict-Transport-Security max-age=15768000;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2407. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2408. echo ' # rewrite to front controller as default rule' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2409. echo ' location / {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2410. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2411. echo ' }' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2412. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2413. echo " # make sure webfinger and other well known services aren't blocked" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2414. echo ' # by denying dot files and rewrite request to the front controller' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2415. echo ' location ^~ /.well-known/ {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2416. echo ' allow all;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2417. echo ' rewrite ^/(.*) /index.php?q=$uri&$args last;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2418. echo ' }' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2419. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2420. echo ' # statically serve these file types when possible' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2421. echo ' # otherwise fall back to front controller' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2422. echo ' # allow browser to cache them' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2423. echo ' # added .htm for advanced source code editor library' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2424. echo ' location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2425. echo ' expires 30d;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2426. echo ' try_files $uri /index.php?q=$uri&$args;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2427. echo ' }' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2428. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2429. echo ' # block these file types' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2430. echo ' location ~* \.(tpl|md|tgz|log|out)$ {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2431. echo ' deny all;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2432. echo ' }' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2433. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2434. echo ' # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2435. echo ' # or a unix socket' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2436. echo ' location ~* \.php$ {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2437. echo ' # Zero-day exploit defense.' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2438. echo ' # http://forum.nginx.org/read.php?2,88845,page=3' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2439. echo " # Won't work properly (404 error) if the file is not stored on this" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2440. echo " # server, which is entirely possible with php-fpm/php-fcgi." >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2441. echo " # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on" >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2442. echo " # another machine. And then cross your fingers that you won't get hacked." >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2443. echo ' try_files $uri $uri/ /index.php;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2444. echo ' # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2445. echo ' fastcgi_split_path_info ^(.+\.php)(/.+)$;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2446. echo ' # With php5-cgi alone:' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2447. echo ' # fastcgi_pass 127.0.0.1:9000;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2448. echo ' # With php5-fpm:' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2449. echo ' fastcgi_pass unix:/var/run/php5-fpm.sock;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2450. echo ' include fastcgi_params;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2451. echo ' fastcgi_index index.php;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2452. echo ' fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2453. echo ' fastcgi_read_timeout 300;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2454. echo ' }' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2455. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2456. echo ' # deny access to all dot files' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2457. echo ' location ~ /\. {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2458. echo ' deny all;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2459. echo ' }' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2460. echo '' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2461. echo ' location ~ /\.ht {' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2462. echo ' deny all;' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2463. echo ' }' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2464. echo '}' >> /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME
  2465. configure_php
  2466. if [ ! -f /etc/ssl/private/$REDMATRIX_DOMAIN_NAME.key ]; then
  2467. makecert $REDMATRIX_DOMAIN_NAME
  2468. fi
  2469. if [ ! -d /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/view/tpl/smarty3 ]; then
  2470. mkdir /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/view/tpl/smarty3
  2471. fi
  2472. if [ ! -d /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/store/[data] ]; then
  2473. mkdir /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/store/[data]
  2474. fi
  2475. if [ ! -d /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/store/[data]/smarty3 ]; then
  2476. mkdir /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/store/[data]/smarty3
  2477. chmod 777 /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/store/[data]/smarty3
  2478. fi
  2479. chmod 777 /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/view/tpl
  2480. chmod 777 /var/www/$REDMATRIX_DOMAIN_NAME/htdocs/view/tpl/smarty3
  2481. nginx_ensite $REDMATRIX_DOMAIN_NAME
  2482. service php5-fpm restart
  2483. service nginx restart
  2484. service cron restart
  2485. # some post-install instructions for the user
  2486. if ! grep -q "To set up your Red Matrix" /home/$MY_USERNAME/README; then
  2487. echo '' >> /home/$MY_USERNAME/README
  2488. echo "To set up your Red Matrix site go to" >> /home/$MY_USERNAME/README
  2489. echo "https://$REDMATRIX_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  2490. echo 'You will need to have a non self-signed SSL certificate in order' >> /home/$MY_USERNAME/README
  2491. echo "to use Red Matrix. Put the public certificate in /etc/ssl/certs/$REDMATRIX_DOMAIN_NAME.crt" >> /home/$MY_USERNAME/README
  2492. echo "and the private certificate in /etc/ssl/private/$REDMATRIX_DOMAIN_NAME.key." >> /home/$MY_USERNAME/README
  2493. echo 'If there is an intermediate certificate needed (such as with StartSSL) then' >> /home/$MY_USERNAME/README
  2494. echo 'this will need to be concatenated onto the end of the crt file, like this:' >> /home/$MY_USERNAME/README
  2495. echo '' >> /home/$MY_USERNAME/README
  2496. echo " cat /etc/ssl/certs/$REDMATRIX_DOMAIN_NAME.crt /etc/ssl/chains/startssl-sub.class1.server.ca.pem > /etc/ssl/certs/$REDMATRIX_DOMAIN_NAME.bundle.crt" >> /home/$MY_USERNAME/README
  2497. echo '' >> /home/$MY_USERNAME/README
  2498. echo "Then change ssl_certificate to /etc/ssl/certs/$REDMATRIX_DOMAIN_NAME.bundle.crt" >> /home/$MY_USERNAME/README
  2499. echo "within /etc/nginx/sites-available/$REDMATRIX_DOMAIN_NAME" >> /home/$MY_USERNAME/README
  2500. echo '' >> /home/$MY_USERNAME/README
  2501. chown $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/README
  2502. fi
  2503. echo 'install_redmatrix' >> $COMPLETION_FILE
  2504. }
  2505. function script_for_attaching_usb_drive {
  2506. if grep -Fxq "script_for_attaching_usb_drive" $COMPLETION_FILE; then
  2507. return
  2508. fi
  2509. echo '#!/bin/bash' > /usr/bin/attach-music
  2510. echo 'if [ -d /var/media ]; then' >> /usr/bin/attach-music
  2511. echo ' umount /var/media' >> /usr/bin/attach-music
  2512. echo 'fi' >> /usr/bin/attach-music
  2513. echo 'if [ ! -d /var/media ]; then' >> /usr/bin/attach-music
  2514. echo ' mkdir /var/media' >> /usr/bin/attach-music
  2515. echo 'fi' >> /usr/bin/attach-music
  2516. echo 'mount /dev/sda1 /var/media' >> /usr/bin/attach-music
  2517. echo 'chown root:root /var/media' >> /usr/bin/attach-music
  2518. echo 'chown -R minidlna:minidlna /var/media/*' >> /usr/bin/attach-music
  2519. echo 'minidlnad -R' >> /usr/bin/attach-music
  2520. chmod +x /usr/bin/attach-music
  2521. ln -s /usr/bin/attach-music /usr/bin/attach-usb
  2522. ln -s /usr/bin/attach-music /usr/bin/attach-videos
  2523. ln -s /usr/bin/attach-music /usr/bin/attach-pictures
  2524. ln -s /usr/bin/attach-music /usr/bin/attach-media
  2525. echo 'script_for_attaching_usb_drive' >> $COMPLETION_FILE
  2526. }
  2527. function install_dlna_server {
  2528. if grep -Fxq "install_dlna_server" $COMPLETION_FILE; then
  2529. return
  2530. fi
  2531. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  2532. return
  2533. fi
  2534. apt-get -y --force-yes install minidlna
  2535. sed -i "s|media_dir=/var/lib/minidlna|media_dir=A,/home/$MY_USERNAME/Music|g" /etc/minidlna.conf
  2536. if ! grep -q "/home/$MY_USERNAME/Pictures" /etc/minidlna.conf; then
  2537. echo "media_dir=P,/home/$MY_USERNAME/Pictures" >> /etc/minidlna.conf
  2538. fi
  2539. if ! grep -q "/home/$MY_USERNAME/Videos" /etc/minidlna.conf; then
  2540. echo "media_dir=V,/home/$MY_USERNAME/Videos" >> /etc/minidlna.conf
  2541. fi
  2542. if ! grep -q "/var/media/Music" /etc/minidlna.conf; then
  2543. echo "media_dir=A,/var/media/Music" >> /etc/minidlna.conf
  2544. fi
  2545. if ! grep -q "/var/media/Pictures" /etc/minidlna.conf; then
  2546. echo "media_dir=P,/var/media/Pictures" >> /etc/minidlna.conf
  2547. fi
  2548. if ! grep -q "/var/media/Videos" /etc/minidlna.conf; then
  2549. echo "media_dir=V,/var/media/Videos" >> /etc/minidlna.conf
  2550. fi
  2551. sed -i 's/#root_container=./root_container=B/g' /etc/minidlna.conf
  2552. sed -i 's/#network_interface=/network_interface=eth0/g' /etc/minidlna.conf
  2553. sed -i 's/#friendly_name=/friendly_name="Freedombone Media"/g' /etc/minidlna.conf
  2554. sed -i 's|#db_dir=/var/cache/minidlna|db_dir=/var/cache/minidlna|g' /etc/minidlna.conf
  2555. sed -i 's/#inotify=yes/inotify=yes/g' /etc/minidlna.conf
  2556. sed -i "s|#presentation_url=/|presentation_url=http://localhost:8200|g" /etc/minidlna.conf
  2557. service minidlna force-reload
  2558. service minidlna reload
  2559. echo 'install_dlna_server' >> $COMPLETION_FILE
  2560. }
  2561. function install_mediagoblin {
  2562. # These instructions don't work and need fixing
  2563. return
  2564. if grep -Fxq "install_mediagoblin" $COMPLETION_FILE; then
  2565. return
  2566. fi
  2567. if [[ $SYSTEM_TYPE == "$VARIANT_CLOUD" || $SYSTEM_TYPE == "$VARIANT_MAILBOX" || $SYSTEM_TYPE == "$VARIANT_CHAT" || $SYSTEM_TYPE == "$VARIANT_WRITER" || $SYSTEM_TYPE == "$VARIANT_SOCIAL" ]]; then
  2568. return
  2569. fi
  2570. # if this is exclusively a writer setup
  2571. if [[ $SYSTEM_TYPE == "$VARIANT_MEDIA" ]]; then
  2572. MEDIAGOBLIN_DOMAIN_NAME=$DOMAIN_NAME
  2573. MEDIAGOBLIN_FREEDNS_SUBDOMAIN_CODE=$FREEDNS_SUBDOMAIN_CODE
  2574. fi
  2575. if [ ! $MEDIAGOBLIN_DOMAIN_NAME ]; then
  2576. return
  2577. fi
  2578. apt-get -y --force-yes install git-core python python-dev python-lxml python-imaging python-virtualenv
  2579. apt-get -y --force-yes install python-gst-1.0 libjpeg8-dev sqlite3 libapache2-mod-fcgid gstreamer1.0-plugins-base gstreamer1.0-plugins-bad gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-libav python-numpy python-scipy libsndfile1-dev
  2580. apt-get -y --force-yes install postgresql postgresql-client python-psycopg2 python-pip autotools-dev automake
  2581. sudo -u postgres createuser -A -D mediagoblin
  2582. sudo -u postgres createdb -E UNICODE -O mediagoblin mediagoblin
  2583. adduser --system mediagoblin
  2584. MEDIAGOBLIN_DOMAIN_ROOT="/srv/$MEDIAGOBLIN_DOMAIN_NAME"
  2585. MEDIAGOBLIN_PATH="$MEDIAGOBLIN_DOMAIN_ROOT/mediagoblin"
  2586. MEDIAGOBLIN_PATH_BIN="$MEDIAGOBLIN_PATH/mediagoblin/bin"
  2587. if [ ! -d $MEDIAGOBLIN_DOMAIN_ROOT ]; then
  2588. mkdir -p $MEDIAGOBLIN_DOMAIN_ROOT
  2589. fi
  2590. cd $MEDIAGOBLIN_DOMAIN_ROOT
  2591. chown -hR mediagoblin: $MEDIAGOBLIN_DOMAIN_ROOT
  2592. su -c "cd $MEDIAGOBLIN_DOMAIN_ROOT; git clone git://gitorious.org/mediagoblin/mediagoblin.git" - mediagoblin
  2593. su -c "cd $MEDIAGOBLIN_PATH; git submodule init" - mediagoblin
  2594. su -c "cd $MEDIAGOBLIN_PATH; git submodule update" - mediagoblin
  2595. #su -c 'cd $MEDIAGOBLIN_PATH; ./experimental-bootstrap.sh' - mediagoblin
  2596. #su -c 'cd $MEDIAGOBLIN_PATH; ./configure' - mediagoblin
  2597. #su -c 'cd $MEDIAGOBLIN_PATH; make' - mediagoblin
  2598. su -c "cd $MEDIAGOBLIN_PATH; virtualenv --system-site-packages ." - mediagoblin
  2599. su -c "cd $MEDIAGOBLIN_PATH_BIN; python setup.py develop" - mediagoblin
  2600. su -c "cp $MEDIAGOBLIN_PATH/mediagoblin.ini $MEDIAGOBLIN_PATH/mediagoblin_local.ini" - mediagoblin
  2601. su -c "cp $MEDIAGOBLIN_PATH/paste.ini $MEDIAGOBLIN_PATH/paste_local.ini" - mediagoblin
  2602. # update the dynamic DNS
  2603. if [ $MEDIAGOBLIN_FREEDNS_SUBDOMAIN_CODE ]; then
  2604. if [[ $MEDIAGOBLIN_FREEDNS_SUBDOMAIN_CODE != $FREEDNS_SUBDOMAIN_CODE ]]; then
  2605. if ! grep -q "$MEDIAGOBLIN_DOMAIN_NAME" /usr/bin/dynamicdns; then
  2606. echo "# $MEDIAGOBLIN_DOMAIN_NAME" >> /usr/bin/dynamicdns
  2607. echo "wget -O - https://freedns.afraid.org/dynamic/update.php?$MEDIAGOBLIN_FREEDNS_SUBDOMAIN_CODE== >> /dev/null 2>&1" >> /usr/bin/dynamicdns
  2608. fi
  2609. fi
  2610. else
  2611. echo 'WARNING: No freeDNS subdomain code given for mediagoblin. It is assumed that you are using some other dynamic DNS provider.'
  2612. fi
  2613. # see https://wiki.mediagoblin.org/Deployment / uwsgi with configs
  2614. apt-get -y --force-yes install uwsgi uwsgi-plugin-python nginx-full supervisor
  2615. echo 'server {' > /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2616. echo ' include /etc/nginx/mime.types;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2617. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2618. echo ' autoindex off;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2619. echo ' default_type application/octet-stream;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2620. echo ' sendfile on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2621. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2622. echo ' # Gzip' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2623. echo ' gzip on;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2624. echo ' gzip_min_length 1024;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2625. echo ' gzip_buffers 4 32k;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2626. echo ' gzip_types text/plain text/html application/x-javascript text/javascript text/xml text/css;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2627. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2628. echo " server_name $MEDIAGOBLIN_DOMAIN_NAME;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2629. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2630. echo ' access_log /var/log/nginx/mg.access.log;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2631. echo ' error_log /var/log/nginx/mg.error.log error;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2632. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2633. echo ' #include global/common.conf;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2634. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2635. echo ' client_max_body_size 100m;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2636. echo ' add_header X-Content-Type-Options nosniff;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2637. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2638. echo " root $MEDIAGOBLIN_PATH/;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2639. echo '' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2640. echo ' location /mgoblin_static/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2641. echo " alias $MEDIAGOBLIN_PATH/static/;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2642. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2643. echo ' location /mgoblin_media/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2644. echo " alias $MEDIAGOBL_PATH/media/public/;" >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2645. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2646. echo ' location /theme_static/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2647. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2648. echo ' location /plugin_static/ {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2649. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2650. echo ' location / {' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2651. echo ' uwsgi_pass unix:///tmp/mg.uwsgi.sock;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2652. echo ' uwsgi_param SCRIPT_NAME "/";' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2653. echo ' include uwsgi_params;' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2654. echo ' }' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2655. echo '}' >> /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME
  2656. echo 'uwsgi:' > /etc/uwsgi/apps-available/mg.yaml
  2657. echo ' uid: mediagoblin' >> /etc/uwsgi/apps-available/mg.yaml
  2658. echo ' gid: mediagoblin' >> /etc/uwsgi/apps-available/mg.yaml
  2659. echo ' socket: /tmp/mg.uwsgi.sock' >> /etc/uwsgi/apps-available/mg.yaml
  2660. echo ' chown-socket: www-data:www-data' >> /etc/uwsgi/apps-available/mg.yaml
  2661. echo ' plugins: python' >> /etc/uwsgi/apps-available/mg.yaml
  2662. echo " home: $MEDIAGOBLIN_PATH/" >> /etc/uwsgi/apps-available/mg.yaml
  2663. echo " chdir: $MEDIAGOBLIN_PATH/" >> /etc/uwsgi/apps-available/mg.yaml
  2664. echo " ini-paste: $MEDIAGOBLIN_PATH/paste_local.ini" >> /etc/uwsgi/apps-available/mg.yaml
  2665. echo '[program:celery]' > /etc/supervisor/conf.d/mediagoblin.conf
  2666. echo "command=$MEDIAGOBLIN_PATH_BIN/celery worker -l debug" >> /etc/supervisor/conf.d/mediagoblin.conf
  2667. echo '' >> /etc/supervisor/conf.d/mediagoblin.conf
  2668. echo '; Set PYTHONPATH to the directory containing celeryconfig.py' >> /etc/supervisor/conf.d/mediagoblin.conf
  2669. echo "environment=PYTHONPATH='$MEDIAGOBLIN_PATH',MEDIAGOBLIN_CONFIG='$MEDIAGOBLIN_PATH/mediagoblin_local.ini',CELERY_CONFIG_MODULE='mediagoblin.init.celery.from_celery'" >> /etc/supervisor/conf.d/mediagoblin.conf
  2670. echo '' >> /etc/supervisor/conf.d/mediagoblin.conf
  2671. echo "directory=$MEDIAGOBLIN_PATH/" >> /etc/supervisor/conf.d/mediagoblin.conf
  2672. echo 'user=mediagoblin' >> /etc/supervisor/conf.d/mediagoblin.conf
  2673. echo 'numprocs=1' >> /etc/supervisor/conf.d/mediagoblin.conf
  2674. echo '; uncomment below to enable logs saving' >> /etc/supervisor/conf.d/mediagoblin.conf
  2675. echo ";stdout_logfile=/var/log/nginx/celeryd_stdout.log" >> /etc/supervisor/conf.d/mediagoblin.conf
  2676. echo ";stderr_logfile=/var/log/nginx/celeryd_stderr.log" >> /etc/supervisor/conf.d/mediagoblin.conf
  2677. echo 'autostart=true' >> /etc/supervisor/conf.d/mediagoblin.conf
  2678. echo 'autorestart=false' >> /etc/supervisor/conf.d/mediagoblin.conf
  2679. echo 'startsecs=10' >> /etc/supervisor/conf.d/mediagoblin.conf
  2680. echo '' >> /etc/supervisor/conf.d/mediagoblin.conf
  2681. echo '; Need to wait for currently executing tasks to finish at shutdown.' >> /etc/supervisor/conf.d/mediagoblin.conf
  2682. echo '; Increase this if you have very long running tasks.' >> /etc/supervisor/conf.d/mediagoblin.conf
  2683. echo 'stopwaitsecs = 600' >> /etc/supervisor/conf.d/mediagoblin.conf
  2684. ln -s /etc/nginx/sites-available/$MEDIAGOBLIN_DOMAIN_NAME /etc/nginx/sites-enabled/
  2685. ln -s /etc/uwsgi/apps-available/mg.yaml /etc/uwsgi/apps-enabled/
  2686. # change settings
  2687. sed -i "s/notice@mediagoblin.example.org/$MY_USERNAME@$DOMAIN_NAME/g" $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  2688. sed -i 's/email_debug_mode = true/email_debug_mode = false/g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  2689. sed -i 's|# sql_engine = postgresql:///mediagoblin|sql_engine = postgresql:///mediagoblin|g' $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  2690. # add extra media types
  2691. if grep -q "media_types.audio" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  2692. echo '[[mediagoblin.media_types.audio]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  2693. fi
  2694. if grep -q "media_types.video" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  2695. echo '[[mediagoblin.media_types.video]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  2696. fi
  2697. if grep -q "media_types.stl" $MEDIAGOBLIN_PATH/mediagoblin_local.ini; then
  2698. echo '[[mediagoblin.media_types.stl]]' >> $MEDIAGOBLIN_PATH/mediagoblin_local.ini
  2699. fi
  2700. su -c "cd $MEDIAGOBLIN_PATH_BIN; pip install scikits.audiolab" - mediagoblin
  2701. su -c "cd $MEDIAGOBLIN_PATH_BIN; gmg dbupdate" - mediagoblin
  2702. # systemd init scripts
  2703. echo '[Unit]' > /etc/systemd/system/gmg.service
  2704. echo 'Description=Mediagoblin' >> /etc/systemd/system/gmg.service
  2705. echo '' >> /etc/systemd/system/gmg.service
  2706. echo '[Service]' >> /etc/systemd/system/gmg.service
  2707. echo 'Type=forking' >> /etc/systemd/system/gmg.service
  2708. echo 'User=mediagoblin' >> /etc/systemd/system/gmg.service
  2709. echo 'Group=mediagoblin' >> /etc/systemd/system/gmg.service
  2710. echo '#Environment=CELERY_ALWAYS_EAGER=true' >> /etc/systemd/system/gmg.service
  2711. echo 'Environment=CELERY_ALWAYS_EAGER=false' >> /etc/systemd/system/gmg.service
  2712. echo "WorkingDirectory=$MEDIAGOBLIN_PATH" >> /etc/systemd/system/gmg.service
  2713. echo "ExecStart=$MEDIAGOBLIN_PATH_BIN/paster serve $MEDIAGOBLIN_PATH/paste_local.ini --pid-file=/var/run/mediagoblin/paster.pid --log-file=/var/log/nginx/mediagoblin_paster.log --daemon --server-name=fcgi fcgi_host=127.0.0.1 fcgi_port=26543" >> /etc/systemd/system/gmg.service
  2714. echo "ExecStop=$MEDIAGOBLIN_PATH_BIN/paster serve --pid-file=/var/run/mediagoblin/paster.pid $MEDIAGOBLIN_PATH/paste_local.ini stop" >> /etc/systemd/system/gmg.service
  2715. echo 'PIDFile=/var/run/mediagoblin/mediagoblin.pid' >> /etc/systemd/system/gmg.service
  2716. echo '' >> /etc/systemd/system/gmg.service
  2717. echo '[Install]' >> /etc/systemd/system/gmg.service
  2718. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/gmg.service
  2719. echo '[Unit]' > /etc/systemd/system/gmg-celeryd.service
  2720. echo 'Description=Mediagoblin Celeryd' >> /etc/systemd/system/gmg-celeryd.service
  2721. echo '' >> /etc/systemd/system/gmg-celeryd.service
  2722. echo '[Service]' >> /etc/systemd/system/gmg-celeryd.service
  2723. echo 'User=mediagoblin' >> /etc/systemd/system/gmg-celeryd.service
  2724. echo 'Group=mediagoblin' >> /etc/systemd/system/gmg-celeryd.service
  2725. echo 'Type=simple' >> /etc/systemd/system/gmg-celeryd.service
  2726. echo "WorkingDirectory=$MEDIAGOBLIN_PATH" >> /etc/systemd/system/gmg-celeryd.service
  2727. echo "Environment='MEDIAGOBLIN_CONFIG=$MEDIAGOBLIN_PATH/mediagoblin_local.ini' CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery" >> /etc/systemd/system/gmg-celeryd.service
  2728. echo "ExecStart=$MEDIAGOBLIN_PATH_BIN/celeryd" >> /etc/systemd/system/gmg-celeryd.service
  2729. echo 'PIDFile=/var/run/mediagoblin/mediagoblin-celeryd.pid' >> /etc/systemd/system/gmg-celeryd.service
  2730. echo '' >> /etc/systemd/system/gmg-celeryd.service
  2731. echo '[Install]' >> /etc/systemd/system/gmg-celeryd.service
  2732. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/gmg-celeryd.service
  2733. systemctl start gmg.service
  2734. systemctl start gmg-celeryd.service
  2735. echo 'install_mediagoblin' >> $COMPLETION_FILE
  2736. }
  2737. function install_final {
  2738. if grep -Fxq "install_final" $COMPLETION_FILE; then
  2739. return
  2740. fi
  2741. # unmount any attached usb drive
  2742. if [ -d /media/usb ]; then
  2743. umount /media/usb
  2744. rm -rf /media/usb
  2745. fi
  2746. apt-get -y --force-yes autoremove
  2747. echo 'install_final' >> $COMPLETION_FILE
  2748. echo ''
  2749. echo ' *** Freedombone installation is complete. Rebooting... ***'
  2750. echo ''
  2751. if [ -f "/home/$MY_USERNAME/README" ]; then
  2752. echo "See /home/$MY_USERNAME/README for post-installation instructions."
  2753. echo ''
  2754. fi
  2755. reboot
  2756. }
  2757. argument_checks
  2758. configure_firewall
  2759. configure_firewall_for_ssh
  2760. configure_firewall_for_dns
  2761. configure_firewall_for_ftp
  2762. configure_firewall_for_web_access
  2763. remove_proprietary_repos
  2764. change_debian_repos
  2765. enable_backports
  2766. configure_dns
  2767. initial_setup
  2768. install_editor
  2769. change_login_message
  2770. update_the_kernel
  2771. enable_zram
  2772. random_number_generator
  2773. set_your_domain_name
  2774. time_synchronisation
  2775. configure_internet_protocol
  2776. configure_ssh
  2777. search_for_attached_usb_drive
  2778. regenerate_ssh_keys
  2779. script_to_make_self_signed_certificates
  2780. configure_email
  2781. #spam_filtering
  2782. configure_imap
  2783. configure_gpg
  2784. email_client
  2785. configure_firewall_for_email
  2786. folders_for_mailing_lists
  2787. folders_for_email_addresses
  2788. dynamic_dns_freedns
  2789. #create_private_mailing_list
  2790. import_email
  2791. script_for_attaching_usb_drive
  2792. install_web_server
  2793. configure_firewall_for_web_server
  2794. install_owncloud
  2795. install_xmpp
  2796. configure_firewall_for_xmpp
  2797. install_irc_server
  2798. configure_firewall_for_irc
  2799. install_wiki
  2800. install_blog
  2801. install_gnu_social
  2802. install_redmatrix
  2803. install_dlna_server
  2804. install_mediagoblin
  2805. install_final
  2806. echo 'Freedombone installation is complete'
  2807. exit 0