install-freedombone.sh 190KB

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